1. 程式人生 > >usb常用描述符以及一些資料包

usb常用描述符以及一些資料包

USB1.1協議定義的標準描述符有裝置描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、介面描述符(Interface Descriptor)、端點描述符(Endpoint Descriptor)和字串描述符(String Descriptor)。USB2.0相比於USB1.1新增加的兩個描述符:限定符描述符(Qualifier Descriptor)和其他速度配置描述符(Other Speed Configuration Descriptor)。另外還有一些類描述符,例如HID描述符,音訊介面描述符,以及廠商自定義描述符

一個裝置只有一個裝置描述符,裝置描述符中會有欄位描述有多少種配置描述符,而配置描述符中又有欄位描述有多少種介面(介面描述符),介面描述符中又有欄位描述有多少個端點(endpoint),而endpoint描述符中又描述了一個端點的大小,還有一種是特殊的類描述符,例如hid,cdc,uvc,uac的類描述符,這種描述符是在介面描述符之後描述的。

主機讀取這些描述符的過程是先獲取裝置描述符,然後根據裝置描述符獲取配置描述符,然後根據配置描述符中的總長度一次性將後面的描述符一併讀取。還有一種是字串描述符,是通過單獨的命令獲取的。

裝置描述符:usb協議的版本號,裝置型別,端點0的大小,VID,PID,裝置版本號,廠商字串索引,產品字串,裝置序列號,以及配置數目(配置描述符相關)

配置描述符:配置所含有的介面數量,配置的編號,供電方式,是否支援遠端喚醒,需要的電流數大小

介面描述符:介面的編號,介面的端點數,介面所使用的類,子類,協議等。

端點描述符:端點號,端點的大小方向,最大包的長度等等。

字串描述符:不是必須的,提供可供閱讀的字串。

裝置列舉的簡單過程:

裝置插入主機,主機復位裝置,傳送獲取裝置描述符的指令,正確獲取之後,然後再復位usb裝置,設定usb裝置的地址,設定成功 之後,再獲取剩餘的描述符,最後完成整個列舉過程。需要注意的是有的描述符是單獨獲取的。

usb輸出傳輸過程中,是LSB在前,MSB在後,傳輸的資料以一個包(packet)為單位的,包和包之間不同的地方,但是每個包都是以同步域開始,緊隨包的識別符號(PID,packet id),然後最後以EOP(end of packet)結束包的傳輸。

在低速和全速傳輸中,同步域是00000001開始,而高速中是以32位資料,最後一位是1結束

而且針對包結束符低速和高速裝置也是不同的。

關於PID(包描述符)可以描述整個包的型別,比如說令牌包,資料包,握手包,以及特殊包,PID 0~3 bit是真正描述符,而bit4~7是0~3bit的取反。

USB每次傳輸都是有主機發起,而令牌包是用來啟動一次usb傳輸的。

@1:OUT:傳送給裝置,表明下次資料緊隨而來從主機發送到裝置

@2:IN:傳送給裝置,要求從裝置端回傳資料給主機

@3:SOF:幀起始包每毫秒產生一個幀,而高速裝置每毫秒產生8個幀,這8個幀號相同

@4:SETUP:類似與OUT,但是下次資料包必須是DATA0資料包

以下是各個令牌包的結構:



其中5bit的CRC校驗是對前面11bit的資料進行校驗

資料包:

資料包不同的型別,可以區分資料包是否是因為握手包發生錯誤時導致資料沒有傳輸成功。

握手包:


握手包資料型別有ACK,NAK,STALL,NYET,而ACK主機和裝置都可以發出,其它只能是裝置發出,注意NAK,不是錯誤,而是裝置端沒有能力接收資料或者沒有什麼資料可以返回,而STALL 表明裝置端點掛起,或者無法執行相關的操作,需要主機進行相關的干預解除這種狀態,而NYET是說裝置已經成功接受資料,但是沒有空間儲存下一次資料,告知主機下一次可以使用ping令牌包去試探裝置是否有能力接收資料,保證頻寬。