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/
公眾號:大魚嵌入式