內容原創,未經本人同意請勿轉載。聯系本人:jianshu_kevin@126.com
初次接觸USB的同學,可能會被里面各種名詞給搞暈,沒關系我們下面就來梳理一下這些知識,希望能幫助大家理解USB。
一,從最常見的名詞說起
1.1 什么是USB
這個我就不多解釋了,直譯就是通用串行總線。再不明白的就百度。
1.2 USB協議版本
- USB 1.0/1.1(low/full speed),傳輸速率最大為12Mbps
- USB 2.0(high speed),傳輸速率最大480Mbps
- USB 3.0(super speed),傳輸速率最大5Gbps
協議版本向下兼容
1.3 USB接口分類
- Type A,即使我們電腦上的那種接口。
- Type B,不太常見,比較方正的T型接口,有的嵌入式開發板會用。
- Type C,現在開始流行起來了,最大的好處就是可以盲插,而不用區分正反。
- Micro/mini,手機上比較常見。
不管哪種接口,用的線都是4根,只是形狀不同而已。
二. 協議相關的名詞解析
2.1 描述符(description)
談到USB描述符,不得不說USB最強悍的地方就在這里。一個口可以插很多的設備,可以插U盤、上網卡、音頻設備、還有的是復合設備,一個設備插上后可以虛擬出多個設備出來,太強了。
主設備之所以能區分不同的從設備,靠的就是描述符。 于是USB協議里就規定了各種不同的USB描述符。讓我們先看一下USB協議里四大描述符之間的關系
+------設備描述符
+----------配置描述符1
+----------接口描述符1
+----------端點描述符1
+----------端點描述符2
+....
+----------接口描述符2
+----------端點描述符1
+....
+....
+----------配置描述符2
+----------接口描述符1
+----------端點描述符1
+----------端點描述符2
+....
+....
+....
2.1.1 設備描述(device description)
故名思意用來描述USB設備的,一個設備只有一個設備描述符,包含了設備類型、設備遵循的協議、廠商ID、產品id、序列號等,一個完整的設備描述符如下:
DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Vendor Specific (0xff)
bDeviceSubClass: 255
bDeviceProtocol: 255
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x812a)
bcdDevice: 0x0000
iManufacturer: 3
iProduct: 2
iSerialNumber: 0
bNumConfigurations: 1
2.1.2 配置描述符(configrue description)
配置描述就是用來配置設備的,沒錯,就是這么簡單。但是要記住一點:一個設備同一時刻只能有一種配置生效,而且要區分配置和設置的區別。還是來看一下配置描述符的內容
CONFIGURATION DESCRIPTOR
bLength: 9
bDescriptorType: 0x02 (CONFIGURATION)
wTotalLength: 121
bNumInterfaces: 4
bConfigurationValue: 1
iConfiguration: 0
Configuration bmAttributes: 0xc0 SELF-POWERED NO REMOTE-WAKEUP
1... .... = Must be 1: Must be 1 for USB 1.1 and higher
.1.. .... = Self-Powered: This device is SELF-POWERED
..0. .... = Remote Wakeup: This device does NOT support remote wakeup
bMaxPower: 250 (500mA)
設置是什么,暫時不多解釋,后面再談。
2.1.3 接口描述符(interface description)
一個interface就代表一個設備。USB interface用來處理一類 USB 邏輯連接, 例如一個鼠標, 一個鍵盤, 或者一個音頻流. 一些 USB 設備有多個接口。也就是復合設備,例如一個 USB 揚聲器可能有 2 個接口: 一個 USB 鍵盤給按鈕和一個 USB 音頻流。
INTERFACE DESCRIPTOR (2.0): class Vendor Specific
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 2
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: Vendor Specific (0xff)
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x00
iInterface: 8
**一個interface包含多個endpoint
2.1.4 端點描述符(endpoint description)
USB通信的基本物理單位,一個endpiont只能承載一個方向的數據。endpiont分為如下幾種:
- CONTROL
控制端點被用來允許對 USB 設備的不同部分存取. 通常用作配置設備, 獲取關于設備的信息, 發送命令到設備, 或者獲取關于設備的狀態報告. 這些端點在尺寸上常常較小. 每個 USB 設備有一個控制端點稱為"端點 0", 被 USB 核用來在插入時配置設備. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備.
- INTERRUPT
中斷端點傳送小量的數據, 以固定的速率在每次 USB 主請求設備數據時. 這些端點對 USB 鍵盤和鼠標來說是主要的傳送方法. 它們還用來傳送數據到 USB 設備來控制設備, 但通常不用來傳送大量數據. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備.
- BULK
塊端點傳送大量的數據. 這些端點常常比中斷端點大(它們一次可持有更多的字符). 它們是普遍的, 對于需要傳送不能有任何數據丟失的數據. 這些傳送不被 USB 協議保證來一直使它在特定時間范圍內完成. 如果總線上沒有足夠的空間來發送整個 BULK 報文, 它被分為多次傳送到或者從設備. 這些端點普遍在打印機, 存儲器, 和網絡設備上.
- ISOCHRONOUS
同步端點也傳送大量數據, 但是這個數據常常不被保證它完成. 這些端點用在可以處理數據丟失的設備中, 并且更多依賴于保持持續的數據流. 實時數據收集, 例如音頻和視頻設備, 一直都使用這些端點.
BULK端點描述符數據內容如下:
ENDPOINT DESCRIPTOR
bLength: 7
bDescriptorType: 0x05 (ENDPOINT)
bEndpointAddress: 0x86 IN Endpoint:6
1... .... = Direction: IN Endpoint
.... 0110 = Endpoint Number: 0x6
bmAttributes: 0x02
.... ..10 = Transfertype: Bulk-Transfer (0x2)
wMaxPacketSize: 512
.... ..10 0000 0000 = Maximum Packet Size: 512
bInterval: 0
2.2 class
class用來描述設備屬于哪種設備,例如音頻、鍵盤、U盤等。設備通過class來確認和加載相應的驅動。class分為device class 和interface class。具體的class值以及含義,參考define class。
- class 包含
- class
- subclass
- protocol
組合在一起,用來指出設備具體功能。
device class舉例
DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Miscellaneous (0xef)
bDeviceSubClass: 2
bDeviceProtocol: 1 (Interface Association Descriptor)
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x4e31)
bcdDevice: 0x0100
iManufacturer: 1
iProduct: 2
iSerialNumber: 3
bNumConfigurations: 1
interface class舉例
INTERFACE DESCRIPTOR (1.0): class CDC-Data
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 1
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: CDC-Data (0x0a)
bInterfaceSubClass: 0x00
bInterfaceProtocol: No class specific protocol required (0x00)
iInterface: 5