transfer5
,transfer6
,transfer7
是獲得字串描述符的傳輸過程。transfer5
是為了獲得0
號字串描述符,transfer6
是為了獲得2
號字串描述符,transfer7
是為了獲得1
號字串描述符。
transfer5:
現在來分析transfer5
的setup transaction
的data
包的data
域,80
表示傳輸方向從device
到host
,06表示請求為get_descriptor
,03表示描述符的型別為string
,由於不知道描述符的長度是多少所以用了長度256
位元組。transaction24
的data
包中0x04
表示0號描述符的長度為4
個位元組,0x03
表示的是描述符的型別,即string
,0x0409
表示的是language id
,transaction25
乙個狀態階段結束了對0
號描述符的獲取。
transfer6:
transfer6
作用是獲取2
號描述符,80
表示傳輸方向從device
到host
,06表示請求為get_descriptor
,usb spec table 9-2 format of setup data
中,wvalue
由兩部分組成,wvalue
的高位位元組表示描述符的型別,低位位元組表示描述符的序號。所以03
表示string
,02表示index
為2的字串描述符。windex
對應字串描述符應該設定使用的語言id
,所以這裡為0x0409
,就是在transfer5
中獲得的那個。然後是0xff
,因為不知道描述符的長度所以用256
位元組。transaction27
,28,29
,30,31
的作用就是device
向host
傳送字串描述符。如下兩張圖,0
號字串描述符和其他非0
號的字串描述符的格式是不一樣的。0
號描述符包括了裝置所支援的所有語言的id。
號的字串描述符的第乙個位元組和第二個位元組分別表示這個描述符的長度和描述符的型別。transaction27
的data
包的data
域的第乙個位元組為0x24
,十進位制36
,所以index
為2的描述符長度是36
個位元組,大家可以數一下,從transaction27
~transaction31
中一共有36
個位元組的。
transfer7:
同理,transfer7
獲得了index
為1的字串描述符。
transfer8:
transfer8
主要的作用是設定配置,使usb
從address
狀態進入configured
狀態。00
表示從host
到device
,09表示set_configuration
,在address
時bconfigurationvalue
的值為0
,所以這裡設為大於0
,則usb
進入configured
狀態,如果set_configuration
傳得引數是0
則仍然是address
狀態。這裡為01。
transfer9:
transfer9
好像也沒乾成什麼事,這個廢物,哈哈。
transfer10
是獲得hid
描述符。
transfer11,12
是列舉成功後,兩次host
與device
之間傳輸資料。這裡只截了部分圖。host
每個binterval
這麼多時間就對device
查詢一下,看有沒有資料要傳,比如有沒有鍵子被按下。每次都是,host
向device
傳送乙個in
令牌包,如果沒有資料,device
就回乙個nak。
transfer11:
transfer12:
USB列舉過程詳述
本系統中所謂usb裝置與主機是通過檢測vcc上拉電阻的變化來確定是否有裝置連線的。在d12內部整合了1.5k 的上拉電阻,預設狀態下不與vcc相連,程式執行時可以向d12傳送連線命令使1.5k 電阻連線到vcc,這樣主機便檢測到有裝置連線。它的列舉過程分析如下。裝置連線到匯流排後,裝置從匯流排獲得5...
USB裝置列舉過程
當裝置連線到主機時,按照以下順序進行列舉 1.連線了裝置的hub 在host 查詢其狀態改變端點時返回對應的bitmap,告知host 某個port 狀態發生了改變。2.主機向hub 查詢該port 的狀態,得知有裝置連線,並知道了該裝置的基本特性。3.主機等待 至少100ms 裝置上電穩定,然後向...
USB列舉過程(1)
總的過程 host檢測到device,reset 獲取裝置描述符 host發獲取裝置描述符請求 setup data0 divice返回裝置描述符 in ack host說明已獲取裝置描述符 out data0空資料 lsb先發 對裝置reset,開始設定新位址 新位址 out data0 new ...