linux usb 系統 (8)

USB設備的調試

USB設備難就難在調試,因爲USB的總線頻率很高,一般的示波器都抓不到這樣的信號,即使高頻的示波器抓到USB信號,想用肉眼把他解析出來也不是件容易的事,所以調試USB設備最好能有USB協議分析器,那怕是個邏輯分析儀也不錯。

作爲一個平民驅動工程師,沒有那麼豪華的裝備,怎麼辦呢?

如果是調試從調備,WINDOWS下有一個很有名的總線調試工具bushound,如下圖。

 
 
clip_image002

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動作,
表示in類型,後面還有In讀取操作需要讀取數據,
同時爲S-submission或者E-submission error

 

> --

> -- 表示數據部分已經成功下發
表示out類型,同時爲C-Callback

 

僅從USBMON很難得到對調試驅動有幫助的數據,要想在linux下方便的調試USB設備,還有許多工作需要我們做。

注:轉載請註明出處 [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章