USB設備的調試
USB設備難就難在調試,因爲USB的總線頻率很高,一般的示波器都抓不到這樣的信號,即使高頻的示波器抓到USB信號,想用肉眼把他解析出來也不是件容易的事,所以調試USB設備最好能有USB協議分析器,那怕是個邏輯分析儀也不錯。
作爲一個平民驅動工程師,沒有那麼豪華的裝備,怎麼辦呢?
如果是調試從調備,WINDOWS下有一個很有名的總線調試工具bushound,如下圖。
linux下這樣的軟件就少得多了,想要在linux下調式USB,可以藉助usbmon這個模塊,可以在內核編譯時選中這一項,也可以編譯成模塊然後insmod這個模塊。
1)insmod usbmon.ko
2) mount -t debugfs none_debugs /sys/kernel/debug
3)查看 /sys/kernel/debug
ls /sys/kernel/debug/usbmon/
0s 0u 1s 1t 1u
4)下面這就是總線上的數據
f4146900 2833361214 S Bo:1:004:2 -115 31 = 55534243 29010000 00000000 00000600 00000000 00000000 00000000 000000 f4146900 2833361268 C Bo:1:004:2 0 31 > f4146900 2833361302 S Bi:1:004:1 -115 13 < f4146900 2833361391 C Bi:1:004:1 0 13 = 55534253 29010000 00000000 00 f4146900 2835361212 S Bo:1:004:2 -115 31 = 55534243 2a010000 00000000 00000600 00000000 00000000 00000000 000000 f4146900 2835361274 C Bo:1:004:2 0 31 > f4146900 2835361298 S Bi:1:004:1 -115 13 < f4146900 2835361397 C Bi:1:004:1 0 13 = 55534253 2a010000 00000000 00 f5d38d00 2835764165 C Ii:1:001:1 0:2048 2 = 4000 f5d38d00 2835764175 S Ii:1:001:1 -115:2048 4 < f46a0280 2835764187 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0280 2835764191 C Ci:1:001:0 0 4 = 00010100 f46a0280 2835764194 S Co:1:001:0 s 23 01 0010 0006 0000 0 f46a0280 2835764198 C Co:1:001:0 0 0 f46a0280 2835767349 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0280 2835767355 C Ci:1:001:0 0 4 = 00010000 f46a0300 2835794170 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0300 2835794223 C Ci:1:001:0 0 4 = 00010000 f46a0b80 2835819162 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0b80 2835819207 C Ci:1:001:0 0 4 = 00010000 f46a0280 2835847167 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0280 2835851345 C Ci:1:001:0 0 4 = 00010000 f46a0280 2835878175 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0280 2835878214 C Ci:1:001:0 0 4 = 00010000 f5d38d00 2836628334 C Ii:1:001:1 0:2048 2 = 4000 f5d38d00 2836628344 S Ii:1:001:1 -115:2048 4 < f46a0980 2836628356 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0980 2836628360 C Ci:1:001:0 0 4 = 01050100 f46a0980 2836628363 S Co:1:001:0 s 23 01 0010 0006 0000 0 f46a0980 2836628367 C Co:1:001:0 0 0 f46a0980 2836628370 S Ci:1:001:0 s a3 00 0000 0006 0004 4 < f46a0980 2836628372 C Ci:1:001:0 0 4 = 01050000 |
我們需要解這些數據,才能知道總線上傳送的是什麼,kernel源碼下面的Documentation/usb/目錄中有一個usbmon.txt的文件詳細說明了這些數據的格式,有了說明還不夠,如果能根據各類設備的協議將數據作理進一步的解析就更好了。
我們以下面這段數據爲例來說明一下
f4146900 2835361212 S Bo:1:004:2 -115 31 = 55534243 2a010000 00000000 00000600 00000000 00000000 00000000 000000
f4146900 |
urb內存地址 |
|
f4146900 |
時間戳 |
|
S |
事件類型(S-submission, C-Callback, E-submission error) |
|
B |
端點類型I(中斷),C(控制),B(Bulk)和Z(ISOC) |
|
o |
數據方向(i或者o) |
|
:1 |
bus總線號 |
|
:004 |
該bus總線分配到的設備地址[luther.gliethttp] |
|
:2 |
端點號,對於in端點,爲異或^0x80,即去掉第8位1值的數據,比如0x81,那麼這裏數據爲0x81 ^ 0x80 = 1;[luther.gliethttp] |
|
31 |
數據的長度 |
|
=55534243 29010000 00000000 00000600 00000000 00000000 00000000 000000 |
數據 |
另外,還有一些其它的標識符號:
< -- |
< -- 表示有數據要上傳,後面有需要接收的數據,後面會有IN動作, |
|
> -- |
> -- 表示數據部分已經成功下發 |
僅從USBMON很難得到對調試驅動有幫助的數據,要想在linux下方便的調試USB設備,還有許多工作需要我們做。
注:轉載請註明出處 [email protected]