USB 匯流排上電復位及列舉

2021-07-11 12:30:46 字數 2622 閱讀 6069

關鍵理解usb主機檢測到usb裝置後,會對其發出復位請求。。

在復位之後,usb devcice韌體完成端點等配置及初始化,特別是端點0.。而後才可以進入列舉階段。 1.

當主機用輪詢的方式檢測到usb埠有新的裝置插入時,主機就會給hub傳送匯流排復位命令,要求hub進行匯流排復位。

裝置連線到主機並初始化完成(softconnect 位被設定為 1),主機檢測到d+與d-之間有電壓差,就認為有新的設定接入。主機等待100ms後發出復位請求。

裝置接到復位請求後將產生乙個外部中斷訊號。

2.主機使用預設位址0,來讀取裝置的描述符。

傳送 get_descriptor標準請求。主機向d12傳送乙個八字節請求:80 06 00 01 00 00 40 00    d12接收到請求後產生乙個中斷,我們可以通過讀中斷暫存器知道中斷源,並且可以加讀最後狀態暫存器來確定第乙個接到的包是否為乙個setup包。當控制器處理程式判斷出它是乙個get_descriptor請求是,把裝置描述符的前16個位元組傳送到端點0緩衝區中。剩下的2個位元組描述符第一次請求時不再傳送。

3.主機給裝置分配乙個位址

當主機收到正確的前16位元組描述符後,會給裝置分配乙個位址,我的pc分配的位址為:0x03(這個要看你的機子當時的usb介面裝置數目而定) set_address 請求所傳送的資料為:00 05 03 00 00 00 00 00 ,其中的03就表示主機為裝置分配的位址為0x03,在以後的通訊裡裝置就只對0x03位址作出應答。當d12產生乙個接收中斷後,跟據所分配的位址設定d12的位址暫存器相應位

4.主機以位址0x03 ,重新請求裝置描述符

主機傳送裝置描述符標準請求get_descriptor :80 06 00 01 00 00 12 00  此次將要求把18個位元組全部傳送完。所以主機要分兩次來讀取。第一次傳送16個位元組,第三次傳送兩個位元組,最後主機傳送0表示傳送完畢的應答。

5.主機傳送get_configuration請求

由於事先沒有知道描述符的長度,所以先以0xff的長度進行請求。其資料為:80 06 00 02 00 00 ff 00   我用的是周立功公司賣的d12開發板光碟資料中提供的驅動程式,傳送的應答是乙個描述集合其結構如下:

typedef struct usb_descriptor usb_descriptor, *pusb_descriptor;

6.set_conficuration

當讀取完成描述符之後,需要對裝置進行配置,使得裝置從位址狀態進入配置狀態。這個在寫韌體的時候可以提高執行效率。

7.讀取配置狀態。  

8.當主機能正確地收到這些資料之後,就可以載入d12的驅動程式。這時就可能作應用中的資料傳輸了。

使用usb view 採集到的資料:

device descriptor:

bcdusb:             0x0100

bdeviceclass:         0xdc

bdevicesubclass:      0x00

bdeviceprotocol:      0x00

bmaxpacketsize0:      0x10 (16)

idvendor:           0x0471

idproduct:          0x0666

bcddevice:          0x0100

imanufacturer:        0x00

iproduct:             0x00

iserialnumber:        0x00

bnumconfigurations:   0x01

connectionstatus: deviceconnected

current config value: 0x01

device bus speed:     full

device address:       0x02

open pipes:              4

endpoint descriptor:

bendpointaddress:     0x81

transfer type:   interrupt

wmaxpacketsize:     0x0010 (16)

binterval:            0x0a

endpoint descriptor:

bendpointaddress:     0x01

transfer type:   interrupt

wmaxpacketsize:     0x0010 (16)

binterval:            0x0a

endpoint descriptor:

bendpointaddress:     0x82

transfer type:        bulk

wmaxpacketsize:     0x0040 (64)

binterval:            0x0a

endpoint descriptor:

bendpointaddress:     0x02

transfer type:        bulk

wmaxpacketsize:     0x0040 (64)

binterval:            0x0a

使用 usbmon 抓取 usb 匯流排上的資料

usbmon即 usb monitor,是 linux 內建的 usb 抓包工具。usbmon 本質是乙個核心模組,在我的 ubuntu14.0 4中,模組的位置 lib modules 4.4.0 31 generic kernel drivers usb mon usbmon.ko。linux ...

透徹理解USB匯流排應用之列舉

主機 usb 最常見的主機就是電腦了,現在很多有usbotg on the go 功能的手機也可以做主機,無需過多贅述。usb裝置實在太多了,例如,手機 mp4 u盤 行動硬碟 印表機 掃瞄器等等,當然,作為工程師的你還可能會購買其它一些使用usb介面的儀器,例如邏輯分析儀,示波器等等。無論usb裝...

USB匯流排學習心得及資料

看了一下usb協議資料,對usb原理有了乙個簡單的了解。usb匯流排和pci匯流排一樣,匯流排的作用都是提供通道,各種裝置利用匯流排通道來實現自己的功能。超高速superspeed 5gbps 約500mb s 5000 mbit s usb 2.0 高速hi speed 480mbps 約60mb...