USB NCM介绍
1 功能概述
USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device之间交换以太网帧。NCM主要用于高速网络场景下比如HSPA和LTE数据服务。NCM协议规范基于ECM改进而来,支持了更高的数据率。
ECM和NCM都适用于IEEE 802.3类型的以太网功能,可以将IP流量传输到外部网络。ECM是为USB全速设备设计的,特别是支持docsis 1.0电缆调制解调器。尽管ECM功能完备,但它在吞吐量或效率上不能很好地扩展到更高的USB速度和更高的网络速度。NCM借鉴了从ECM实现中获得的经验,调整了数据传输协议,使其实质上更加高效。
使用NCM的主要优点在于它在单个USB批量传输中传输多个数据报。
NCM功能由一个NCM控制接口和一个NCM数据接口来实现,NCM控制接口用于配置和管理网络功能,NCM数据接口用于传输数据。
2 功能框架
NCM的框架如下图所示:
3 数据传输
NCM允许设备和主机使用一个USB传输有效地传输一个或多个以太网帧。USB传输被格式化为NCM传输块(NTB)。
有两种NTB格式:NTB-16和NTB-32。前者用来表示长度小于65536字节的NTB,后者用来表示不超过4GB的NTB。下图是NTB-32的格式。
3.1. NTH(NCM传输头)
NTH用来标识NTB,并向接收方提供有关NTB内容的基本信息。以NTB-32为例,NTH结构的字段如下:
Signature – ncmh
HeaderLength – NTH长度(字节)
SequenceNumber – NTB序列号,主要用来debug,function rest后清零。
BlockLength – NTB长度(字节)
NDPIndex – 首个NDP(NCM数据报指针)在NTB中的偏移位置
3.2. NDP(NCM数据报指针)
NCM数据报指针(NDPs)描述嵌入在NDP中的以太网数据报。与第NTH结构一样,定义了两种形式:NDP16和NDP32。以NDP32为例,NDP结构主要字段如下:
Signature – ncm0/ncm1
Length – NDP长度(字节)
NextNdpIndex – 下一个NDP的偏移位置
DatagramIndex[0] – 数据报偏移
DatagramLength[0] – 数据报长度(字节)
…
一个NDP中可以有多个Datagram,最后的DatagramIndex和DatagramLength的值为0。
4 关键描述符
---------------- IAD Descriptor --------------------
bLength : 0x08 (8 bytes)
bDescriptorType : 0x0B
bFirstInterface : 0x00
bInterfaceCount : 0x02
bFunctionClass : 0x02 (Communications and CDC Control)
bFunctionSubClass : 0x0D
bFunctionProtocol : 0x00
iFunction : 0x08 (String Descriptor 8)
Language 0x0409 : "CDC NCM"
Data (HexDump) : 08 0B 00 02 02 0D 00 08
IAD Descriptor: Interface AssociationDescriptor,接口关联描述符,将多个接口组合在一起。
bDescriptorType : 0x0B 表示描述符类型是IAD描述符。
bInterfaceCount : 0x02表示组合的接口数目是2个。
bFunctionClass : 0x02表示CDCclass。
bFunctionSubClass : 0x0D表示NCM subclass.
---------------- Interface Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x00
bAlternateSetting : 0x00
bNumEndpoints : 0x01 (1 Endpoint)
bInterfaceClass : 0x02 (Communications and CDC Control)
bInterfaceSubClass : 0x0D (Network Control Model)
bInterfaceProtocol : 0x00 (No class specific protocol required)
iInterface : 0x05 (String Descriptor 5)
Language 0x0409 : "CDC Network Control Model (NCM)"
Data (HexDump) : 09 04 00 00 01 02 0D 00 05
Interface Descriptor : 接口描述符
bInterfaceNumber : 0x00 标识该接口为接口0
bAlternateSetting : 0x00 如果同一个接口有多个描述符设置,那该值就用来区分是哪个
bNumEndpoints : 0x01表示该接口使用1个端点
bInterfaceClass : 0x02 表示CDC class
bInterfaceSubClass : 0x0D 表示NCM subclass
bInterfaceProtocol : 0x00 表示使用标准协议
接口0用作NCM的control接口。
以下4个CDC InterfaceDescriptor属于functional descriptor,functional descriptor用来描述class-specific的信息,从属于某个标准接口描述符下。
-------------- CDC Interface Descriptor ---------------
bFunctionLength : 0x05 (5 bytes)
bDescriptorType : 0x24 (Interface)
bDescriptorSubType : 0x00 (Header Functional Descriptor)
bcdCDC : 0x110 (CDC Version 1.10)
Data (HexDump) : 05 24 00 10 01
HeaderFunctional Descriptor,CDC class-specific的描述符必须以这个描述符作为起始。
-------------- CDC Interface Descriptor ---------------
bFunctionLength : 0x05 (5 bytes)
bDescriptorType : 0x24 (Interface)
bDescriptorSubType : 0x06 (Union Functional Descriptor)
bControlInterface : 0x00
bSubordinateInterface[0] : 0x01
Data (HexDump) : 05 24 06 00 01
Union Functional Descriptor,包含控制接口信息。
-------------- CDC Interface Descriptor ---------------
bFunctionLength : 0x0D (13 bytes)
bDescriptorType : 0x24 (Interface)
bDescriptorSubType : 0x0F (Ethernet Networking Functional Descriptor)
Data (HexDump) : 0D 24 0F 06 00 00 00 00 EA 05 00 00 00
Ethernet Networking Functional Descriptor,包含网卡的信息,比如MAC地址、统计能力等等。其中MAC地址是通过字符串index来间接表示的,位于该描述符第4个字节,这里是06,表示StringDescriptor 6中存放了MAC地址。
-------------- CDC Interface Descriptor ---------------
bFunctionLength : 0x06 (6 bytes)
bDescriptorType : 0x24 (Interface)
bDescriptorSubType : 0x1A (Unknown)
Data (HexDump) : 06 24 1A 00 01 11
NCM Functional Descriptor,0x1A表示NCM Functional Descriptor subtype。
----------------- Endpoint Descriptor -----------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x82 (Direction=IN EndpointID=2)
bmAttributes : 0x03 (TransferType=InterruptPeriodic)
wMaxPacketSize : 0x0010
bInterval : 0x09 (9 ms)
Data (HexDump) : 07 05 82 03 10 00 09
接口0的端点描述符,使用IN-2端点,端点方向为IN(Device->Host),中断传输方式。
---------------- Interface Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x01
bAlternateSetting : 0x00
bNumEndpoints : 0x00 (Default Control Pipe only)
bInterfaceClass : 0x0A (CDC-Data)
bInterfaceSubClass : 0x00
bInterfaceProtocol : 0x01
iInterface : 0x07 (String Descriptor 7)
Language 0x0409 : "CDC Network Data"
Data (HexDump) : 09 04 01 00 00 0A 00 01 07
接口1的第一种设置(bAlternateSetting: 0x00),没有分配端点,那么就没有实际传输功能,暂不清楚其作用。
---------------- Interface Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x01
bAlternateSetting : 0x01
bNumEndpoints : 0x02 (2 Endpoints)
bInterfaceClass : 0x0A (CDC-Data)
bInterfaceSubClass : 0x00
bInterfaceProtocol : 0x01
iInterface : 0x07 (String Descriptor 7)
Language 0x0409 : "CDC Network Data"
Data (HexDump) : 09 04 01 01 02 0A 00 01 07
接口1第二种设置(bAlternateSetting: 0x01),用做NCM的data接口。分配了两个端点。
----------------- Endpoint Descriptor -----------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x81 (Direction=IN EndpointID=1)
bmAttributes : 0x02 (TransferType=Bulk)
wMaxPacketSize : 0x0400 (max 1024 bytes)
bInterval : 0x00 (never NAKs)
Data (HexDump) : 07 05 81 02 00 04 00
接口1的端点描述符,使用了IN-1端点,传输类型为Bulk。
----------------- Endpoint Descriptor -----------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x01 (Direction=OUT EndpointID=1)
bmAttributes : 0x02 (TransferType=Bulk)
wMaxPacketSize : 0x0400 (max 1024 bytes)
bInterval : 0x00 (never NAKs)
Data (HexDump) : 07 05 01 02 00 04 00
接口1的另一个端点描述符,使用了OUT-1端点,传输类型为Bulk。
5 NCM 相关的 Requests 与 Notifications
除了USB标准Requests外,NCM有自己特定的Requests和Notifications。
下表所列的 Requests,GetNtbParameters / GetNtbFormat / GetNtbInputSzie / SetNtbInputSize是必需的,其他是可选的,这几个必需的 Requests 是与 NCM 传输块(NTB)相关。
NCM Notifications如下表,主要是通知网络连接状态和速率变化。
关于以上Requests与Notifications的详细定义,比较琐碎,不在此一一列出,实际使用时可以查阅NCM协议规范。
以上就是对USB NCM的简要介绍。更为详细的信息,可以查阅USB-IF发布的规范:
https://www.usb.org/document-library/network-control-model-devices-specification-v10-and-errata-and-adopters-agreement
作者:bigfish99
博客:https://www.cnblogs.com/bigfish0506/
公众号:大鱼嵌入式

USB NCM介绍的更多相关文章
- 第四章 USB库介绍
4.1 USB库函数简介 Luminary Micro公司提供USB处理器的USB库函数,应用在Stellaris处理器上,为USB设备.USB主机.OTG开发提供USB协议框架和API函数,适用于多 ...
- USB HID介绍
HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容. USB设备描述符-概述 当插入USB设备后,主机会向设备请求各种描述符来识别设备.那什么是设 ...
- USB HID介绍【转】
本文转载自:http://blog.csdn.net/leo_wonty/article/details/6721214 HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复 ...
- USB总线介绍
•USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为USB 1.1,速度也提升到12Mb/s,称之为”full speed” •USB2.0规范是由USB1.1规范演变而来的.它 ...
- USB接口介绍
USB设备系统分为两个部分,USB Host端和USB Device端,以USB接口的U盘为例子,U盘自身是一个USB Device,PC机的USB接口以及相关的控制电路为USB Host部分 ...
- cypress的EZ-USB对于USB的介绍
Host is MasterThis is a fundamental USB concept. There is exactly onemaster in a USB system: the hos ...
- USB OTG介绍(转载)
1. 概要 OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,为连接时候的USB Host,A-Device始终为总线提供电力,ID悬空被称作为B-Devic ...
- [国嵌攻略][161][USB总线介绍]
USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft ...
- USB协议介绍
这里有必要先说清楚一下USB2.0规范的由来.USB2.0技术规范是有由Compaq.Hewlett Packard.Intel.Lucent.Microsoft.NEC.Philips共同制定.发布 ...
随机推荐
- 八戒转世投胎竟然是Java设计模式:桥接模式
目录 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比如有 ...
- 横趟!面试中遇到的 ZooKeeper 问题
本文作者:HelloGitHub-老荀 本文是 HelloZooKeeper 系列的最后一篇文章,接下来主要聊聊面试中如果被问到 ZooKeeper 的问题如何回答,也可以当作学完本系列的测试. 准备 ...
- Typora+PicGo+阿里云写博客笔记
Typora+PicGo+阿里云写博客笔记 选择这三个工具的理由 我一直有在使用typora使用mardown写作,毕竟typora很香,可以实时预览,非常丝滑. 配合上PicGo这个图床工具简直绝了 ...
- EhCache缓存使用教程
文章发表在我的博客上:https://blog.ysboke.cn/archives/124.html 什么是ehcache 纯Java的进程内缓存,直接在JVM虚拟机中缓存,速度非常快.缓存有两级, ...
- springboot 配置将info、error、debug 分别输出到不同文件
在resource下创建名为 logback-spring.xml 的配置文件,内容如下: <?xml version="1.0" encoding="UTF-8& ...
- POJ3762 时间段用k次
题意: 有n个任务,每个任务有自己的开始时间和结束时间,还有完成这个任务能获得的价值,然后每一天的同一个时刻只能执行一个任务,每个任务必须连续执行完成,最多可以工作m天,问这m天能获得的最 ...
- Windows PE导出表编程4(重构导出表实现私有函数导出)
本次是尝试调用DLL里面的私有函数. 一: 之前先探索一下,首先可以考虑用偏移量来调用,就是如果知道了某个私有函数和某个导出的公共函数的相对便宜的话,直接加载dll获取公共函数地址,然后自己手动去偏移 ...
- Windows 驱动加载程序代码
#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h&g ...
- Java前后端分离的认识
1.原由 在网上查了关于前后端分离的资料,有所粗浅认识.记录下来,方便以后使用.以下均是个人看法,仅做参考.如有错误请指教,共同进步. 2.为什么前后端分离? ①.一个后台,可以让多种前台系统使用.后 ...
- Spring Cloud 升级之路 - 2020.0.x - 4. 使用 Eureka 作为注册中心
Eureka 目前的状态:Eureka 目前 1.x 版本还在更新,但是应该不会更新新的功能了,只是对现有功能进行维护,升级并兼容所需的依赖. Eureka 2.x 已经胎死腹中了.但是,这也不代表 ...