USB-CDC-NCM网络控制通讯
+ -

USB NCM实例

2025-08-11 0 0

USB NCM介绍

USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device之间交换以太网帧。NCM主要用于高速网络场景下比如HSPA和LTE数据服务。

​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的框架如下图所示:

113817794539

113836742538

3 数据传输

NCM允许设备和主机使用一个USB传输有效地传输一个或多个以太网帧。USB传输被格式化为NCM传输块(NTB)。

有两种NTB格式:NTB-16和NTB-32。前者用来表示长度小于65536字节的NTB,后者用来表示不超过4GB的NTB。下图是NTB-32的格式。

113859676156

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)

接口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协议规范。

原文转自:https://www.cnblogs.com/bigfish0506/p/14826103.html

0 篇笔记 写笔记

CDC-NCM 简介
USB CDC-NCM(Network Control Model)是 USB CDC(Communication Device Class) 的一个子类协议,专为高效网络数据传输设计,主要用于移动宽带设备(如4G/5G调制解调器、USB网卡等),以提升 USB 总线上的网络吞吐量。1. 核心特......
USB CDC-NCM和USB CDC-ECM的区别与关系
USB CDC-NCM(Network Control Model)和USB CDC-ECM(Ethernet Control Model)是USB规范中定义的两种网络通信协议,均属于USB CDC(Communication Device Class)的子类。它们的主要区别和关系如下:1. 设......
USB-NCM相关术语
术语 (Term)描述 (Description)802.3第二代网络布线与信令标准,通常称为 Ethernet II(参见 [IEEE802.3])。通信接口 (Communications Interface)一种 USB 接口,其 bInterfaceClass 设......
USB-NCM相关规范文档
标准编号标准名称及说明[ECMA368]《ECMA-368:高速超宽带物理层与MAC标准》(2005年)[IEC60027-2]《IEC 60027-2 第2版(2000-11):电工技术用字母符号 - 第2部分:电信与电子学》[IEEE802.11]《IEEE ......
USB-NCM数据传输模型
1. 规范适用范围设备类型:支持 USB连接的外部网络适配器,需模拟 IEEE 802家族的第2层(数据链路层)网络功能(如以太网帧传输)。 合规性要求:设备必须符合以下标准之一: USB 3.0规范 [USB30](有线高速USB) 无线USB规范 [WUSB10] 通信设备类1.2 ......
USB-NCM功能的连接状态与配置管理
虽然 NCM(Network Control Model)功能 可以保持在 “始终连接”(always connected) 状态,但仍需通过 管理请求(management requests) 进行初始化和动态配置调整。1. 初始化要求功能与主机网络栈的初始化: 在设备连接时,主机需通......
USB-NCM数据传输机制NTB
NCM允许设备和主机使用单个USB传输有效地传输一个或多个以太网帧。USB传输被格式化为NCM传输块(NTB)。1. NTB的核心结构每个NTB由三部分组成,按顺序排列:NCM Transfer Header (NTH) 作用:标识NTB的起始,提供元数据(如NTB类型、长度、NDP指......
NCM传输头-NTH16
根据USB2.0和USB3.0,NTC传输头分为NTH16和NTH32.NTH16(NCM Transfer Header for 16-bit NTB)NTH16 结构定义(总长度:12字节)偏移量字段名大小值/格式说明0dwSignature4字节0x484D43......
NCM传输头-NTH32
以下是 NTH32 的完整技术规范解析,采用结构化表格呈现,并与 NTH16 对比关键差异:NTH32 结构定义(总长度:16字节)偏移量字段名大小值/格式说明与NTH16差异0dwSignature4字节0x686D636E (小端序:ncmh)NTB32标识......
NCM数据报文指针-NDP16
NCM数据报指针(NDP)描述了嵌入在NDP中的以太网数据报。与NTH结构一样,定义了两种形式。一种形式(NDP16)用于16位NTB;一种用于32位NTB。这些形式在架构上是等效的,但不同之处在于,许多字段在NDP16中是16位宽,但在NDP32中是32位宽。1. NDP16 核心结构NDP16......
NCM数据报文指针-NDP32
以下是 NDP32 的完整技术规范解析,重点说明其与 NDP16 的差异和设计意图:1. NDP32 核心结构NDP32 由三部分组成,总长度至少为 32字节(且为8的倍数):16字节头部:包含签名、长度和保留字段。 1个或多个数据报指针条目(每条目8字节):记录每个以太网帧的位置和长度(......
NCM 数据报内存对齐机制详解
以下是关于 NCM 规范中数据报内存对齐要求的系统化解析,涵盖对齐原理、参数配置及典型应用场景:1. 对齐机制的核心设计NCM 允许设备通过 NTB Parameter Structure(表6-3) 声明其对数据报载荷(Payload)的内存对齐需求,主机需按此约束构造NTB。 对齐目标......
NCM以太网帧最大尺寸动态调整规则
1. 最大尺寸的动态控制主机控制权:主机可通过 SetMaxDatagramSize 控制请求 动态调整设备支持的最大以太网帧尺寸(不含CRC-32)。 典型值:标准以太网帧为1514字节(14字节头 + 1500字节载荷)。 扩展场景:支持VLAN标签(1522字节)、巨型帧(Jumbo......
NCM数据报指针条目中的 Null 条目处理规则
1. Null 条目的定义任何 NCM 数据报指针条目(NDP16 或 NDP32)满足以下条件之一时,被视为 Null 条目:索引字段为零: wDatagramIndex(NDP16)或 dwDatagramIndex(NDP32)为 0。 长度字段为零: wDatagramLen......
NCM 类特定代码(Class-Specific Codes)
以下是关于 NCM(Network Control Model)在 USB 设备描述符中使用的类特定代码的完整解析,涵盖通信接口和数据接口的关键定义:0. NCM 通信接口Class代码(Communications Interface Subclass Code)代码值:0x02详见:http......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!