1.USB設備邏輯結構
- 在USB設備的邏輯組織中,包含設備、配置、接口和端點4個層次。設備通常有一個或多個配置,配置通常有一個或多個接口,接口有零或多個 端點。
- 每個USB設備都可以包含一個或多個配置,不同的配置使設備表現出不同的功能組合,配置由多個接口組成。在USB協議中,接口代表一個基本的功能,一個功能複雜的USB設備可以具有多個接口,而接口是端點的彙集。
- 一個USB播放器帶有音頻,視頻功能,還有旋鈕和按鈕。
- 配置1:音頻(接口)+旋鈕(接口)
- 配置2:視頻(接口)+旋鈕(接口)
- 配置3:音頻(接口)+視頻(接口)+按鈕(接口)
- 音頻接口、視頻接口、按鈕接口、旋鈕接口均需要一個驅動程序。
- USB設備中的唯一可尋址的部分是設備端點,端點的作用類似於寄存器。每個端點在設備內部有唯一的端點號,這個端點號是在設備設計時給定的。主機和設備的通信最終都作用於設備上的各個端點。每個端點所支持的操作都是單向的,要麼只讀,要麼只寫。
2.USB描述符
- 當我們把USB設備(如:USB鼠標)插到我們的PC時,主機能夠自動識別出我們的USB設備類型?why?
- 在每一個USB設備內部,包含了固定格式的數據,通過這些數據,USB主機就可以獲取USB設備的類型、生產廠商等信息。這些固定格式的數據,我們就稱之爲USB描述符。標準的USB設備有5種USB描述符:設備描述符,配置描述符,接口描述符,端點描述符,字符串描述符。
2.1 設備描述符(18字節)
- bLength:描述符長度,固定爲0x12。
- bDescriptorType:設備描述符類型,固定爲0x01。
- bcdUSB : USB 規範發佈號。表示了本設備能適用於那種協議,如2.0=0200
- bDeviceClass:類型代碼。
- bDeviceSubClass:子類型代碼。
- bDeviceProtocol:協議代碼。
- bMaxPacketSize0:端點0最大分組大小。
- bMaxPacketSize0:端點0最大分組大小。
- idVendor:供應商ID。
- idProduct:產品ID(由廠商分配)。
- bcdDevice:設備出產編碼,由廠家自行設置。
- iManufacturer:廠商描述符字符串索引.索引到對應的字符串描述符。
- iProduct:產品描述符字符串索引。
- iSerialNumber:設備序列號字符串索引。
- bNumConfigurations:可能的配置數。
2.2 配置描述符(8字節)
- bLength : 描述符長度,固定爲0x09。
- bDescriptorType : 配置描述符類型,固定爲0x02。
- wTotalLength : 返回整個數據的長度,指此配置返回的配置描述符,接口描述符以及端點描述符的全部大小。
- bNumInterfaces : 配置所支持的接口數,指該配置配備的接口數量,也表 示該配置下接口描述符數量。
- bConfigurationValue : 作爲Set Configuration的一個參數選擇配置值。
- iConfiguration : 用於描述該配置字符串描述符的索引。
- bmAttributes : 供電模式選擇。Bit4-0保留,D7:總線供電,D6:自供電, D5:遠程喚醒.
- MaxPower : 總線供電的USB設備的最大消耗電流,以2mA爲單位。
2.3 接口描述符(8字節)
- bLength : 描述符長度,固定爲0x09。
- bDescriptorType : 接口描述符類型,固定爲0x04。
- bInterfaceNumber: 該接口的編號。
- bAlternateSetting : 用於爲上一個字段選擇可供替換的設置。
- bNumEndpoint : 使用的端點數目,端點0除外。
- bNumEndpoint : 使用的端點數目,端點0除外。
- bInterfaceClass : 類型代碼(由USB組織分配)。
- bInterfaceSunClass : 子類型代碼(由USB組織分配)。
- bInterfaceProtocol : 協議代碼(由USB組織分配)。
- iInterface : 字符串描述符的索引。
2.4 端點描述符(7字節)
- bLength : 描述符大小,固定爲0x07。
- bDescriptorType : 接口描述符類型,固定爲0x05。
- bEndpointType : USB設備的端點地址。Bit7,方向,對於控制端點可以忽略,1/0:IN/OUT。Bit6-4,保留。BIt3-0:端點號.
- bmAttributes : 端點屬性,Bit7-2,保留。BIt1-0:00控制,01 同步,02批量,03中斷。
- wMaxPacketSize : 本端點接收或發送的最大信息包大小。
- bInterval : 輪訓數據傳送端點的時間間隔.對於批量傳送和控制傳 送的端點忽略.對於同步傳送的端點,必須爲1,對於中斷傳送的端 點,範圍爲1-255
3.USB數據通訊
- 對於USB協議的分析最好能從現有的一個“包”入手,比如說下面這一副圖:
- 根據這幅圖我們也可以已大概看出這個“包”的層次關係。
- 一個USB的包稱爲一個傳輸
- 一個傳輸下分爲好幾個事務,比如說圖中的事務0,1,2,3,4
- 一個事務又分爲好幾個包,比如說Packet136、137、138等等
- 一個包又分爲好幾個域或者說字段
3.1 傳輸
- USB的數據通訊首先是基於傳輸(Transfer)的,傳輸的類型有:中斷傳輸、批量傳輸、同步傳輸、控制傳輸
- 中斷傳輸用於一些小數據量的、實時的傳輸,比如說鼠標、鍵盤。
- 批量傳輸用於大數據量的傳輸,比如說U盤,硬盤等等。
- 同步傳輸是不可靠傳輸,它容忍一定的錯誤,比如所麥克風,喇叭等。
- 控制傳輸用於對設備的控制。
- 根據傳輸的第一個字節就可以判斷出這個傳輸是屬於哪個傳輸。比如上面這幅圖是控制傳輸
3.2 事務
- 一次傳輸由一個或多個事務(transaction)構成,事務可分爲:In(輸入)事務,Out(輸出)事務,Setup(設置)事務。同樣由第一個字節來區分出是屬於哪個事務。上面的包依次是:Setup、IN、IN、IN、OUT
3.3 包
- 一個事務由一個或多個包(packet)構成,包可分爲:令牌包(setup)、數據包(data)、握手包(ACK)和特殊包。由包的第二個字節來區分是屬於哪種包。比如說事務0由3個包構成:Setup、DATA、ACK。
3.4 域
- 一個包由多個域構成,域可分爲:同步域(SYNC),標識域(PID),地址域(ADDR),端點域(ENDP),幀號域(FRAM),數據域(DATA),校驗域(CRC)。
4.USB設備枚舉
- USB設備在正常工作以前, 第一件要做的事就是枚舉。枚舉是讓主機認得這個USB設備, 並且爲該設備準備資源,建立好主機和設備之間的數據傳遞通道。
- 設備枚舉包括以下幾個過程:
- 1. 獲取設備描述符
- 2. 復位
- 3. 設置地址
- 4. 再次獲取設備描述符(需要查看地址有沒有設置成功)
- 5. 獲取配置描述符
- 6. 獲取接口、端點描述符
- 7. 獲取字符串描述符
- 8. 選擇設備配置
- USB鼠標枚舉
- 傳輸0:獲取鼠標設備描述符(控制傳輸)
- 首先這是pc機發起一個控制傳輸,它需要獲取一個描述符,具體到設備描述符。
- 它(傳輸0)的事務0的功能就是請求設備描述符。它由3個包構成,包後面的箭頭代表數據的流向,分別是流向設備、流向設備、流向主機。
- 接下來的3個事務都是IN事務,他們就是負責接收設備描述符的,可以發現,3個事務的Data傳輸量就是18(8+8+2)個字節。
- pc機獲取鼠標的設備描述符之後,會後鼠標發送一個reset包重置。
- 傳輸1:設置鼠標地址(控制傳輸)
- 每一個設備在usb系統中都有一個獨立的地址,這個地址是主機分配給usb設備的。
- 傳輸2:再次獲取鼠標設備描述符(控制傳輸)
- 傳輸3:獲取鼠標配置描述符(控制傳輸)...