linux下類似Bus Hound的工具
http://blog.csdn.net/liuqz2009/article/details/7886461
0
推薦在linux大家有時候需要調試usb接口的串口消息,但是沒有類似於windows下的bus hound工具,感覺比較痛苦,其實linux內核提供了usbmon這個工具,可以收集串口信息。
1.准備:
掛接debugfs (這個可以在內核配置中使能),加載usbmon模塊(如果usbmon編譯成模塊). 如果usbmon編譯到內核中的話,第二步可以省略
# mount -t debugfs none_debugs /sys/kernel/debug
# modprobe usbmon
#
確定bus數據已經准備就緒
# ls /sys/kernel/debug/usb/usbmon
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
#
現在你就可以選擇要么使用'0u'(抓bus上的所有包),並且直接跳到第三步,或者進行第二步找到你設備所在的bus,這樣就過濾掉很多煩人的信息
2. 查找設備所在的bus
運行"cat /proc/bus/usb/devices", 就會發現設備T開頭的行.T行有一個bus口,如下所示
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0557 ProdID=2004 Rev= 1.00
S: Manufacturer=ATEN
S: Product=UC100KM V2.00
Bus=03 說明它在bus3口上
3. 開始查看信息
# cat /sys/kernel/debug/usb/usbmon/3u > /tmp/1.mon.out
命令用來監聽某個bus口,要么你可以監聽所有的bus口
# cat /sys/kernel/debug/usb/usbmon/0u > /tmp/1.mon.out
* 數據格式
現在支持兩種數據格式: '1t'格式和'1u'格式. '1t' 在內核 2.6.21上不支持. '1u'數據格式增加了一些數據項,如:ISO框架信息,間隔時間等.它產生了稍微多余的行,但是確實是'1t'格式的有效補充.
數據內容的詳細說明(從左到右)
- URB Tag. URB地址
- Timestamp, 間隔時間
- Event Type. 時間類型.
支持的類型是: S - submission, C - callback, E - submission error.
- "Address" (通常是一個"管道").它包括4項內容,用冒號分割: URB type ,direction, Bus number, Device address, Endpoint number.
Type和direction被封裝成如下數據格式:
Ci Co Control input and output
Zi Zo Isochronous input and output
Ii Io Interrupt input and output
Bi Bo Bulk input and output
Bus number, Device address, 和Endpoint是十進制數字, 但是他們可能因為閱讀便利而設置成為0.
- URB Status word. 這個要么是字母或者是一些由分號隔開的數字
- Setup packet, 如果出現的話,包括5個字串: 他們是bmRequestType,bRequest, wValue, wIndex, wLength, (USB Specification 2.0.協議中有詳細介紹)
- 同步號
- Data Length. 數據長度
- Data tag. 即使數據長度不為0,usbmon也不一定總能捕捉到數據,數據包內容只有在此tag為'='才有效
- Data words 大頭十六進制數.
舉例:
輸入控制得到端口狀態的示例
d5ea89a0 3575914555 S Ci:1:001:0 s a3 00 0000 0003 0004 4 <
d5ea89a0 3575914560 C Ci:1:001:0 0 4 = 01050000
通過bus5口發送一個31字節長度的塊包(其中保存一個SCSI命令 0x5E )到存儲設備
dd65f0e8 4128379752 S Bo:1:005:2 -115 31 = 55534243 5e000000 00000000 00000600 00000000 00000000 00000000 000000
dd65f0e8 4128379808 C Bo:1:005:2 0 31 >
詳細信息請參閱: http://www.mjmwired.net/kernel/Documentation/usb/usbmon.txt
推薦在linux大家有時候需要調試usb接口的串口消息,但是沒有類似於windows下的bus hound工具,感覺比較痛苦,其實linux內核提供了usbmon這個工具,可以收集串口信息。
1.准備:
掛接debugfs (這個可以在內核配置中使能),加載usbmon模塊(如果usbmon編譯成模塊). 如果usbmon編譯到內核中的話,第二步可以省略
# mount -t debugfs none_debugs /sys/kernel/debug
# modprobe usbmon
#
確定bus數據已經准備就緒
# ls /sys/kernel/debug/usb/usbmon
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
#
現在你就可以選擇要么使用'0u'(抓bus上的所有包),並且直接跳到第三步,或者進行第二步找到你設備所在的bus,這樣就過濾掉很多煩人的信息
2. 查找設備所在的bus
運行"cat /proc/bus/usb/devices", 就會發現設備T開頭的行.T行有一個bus口,如下所示
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0557 ProdID=2004 Rev= 1.00
S: Manufacturer=ATEN
S: Product=UC100KM V2.00
Bus=03 說明它在bus3口上
3. 開始查看信息
# cat /sys/kernel/debug/usb/usbmon/3u > /tmp/1.mon.out
命令用來監聽某個bus口,要么你可以監聽所有的bus口
# cat /sys/kernel/debug/usb/usbmon/0u > /tmp/1.mon.out
* 數據格式
現在支持兩種數據格式: '1t'格式和'1u'格式. '1t' 在內核 2.6.21上不支持. '1u'數據格式增加了一些數據項,如:ISO框架信息,間隔時間等.它產生了稍微多余的行,但是確實是'1t'格式的有效補充.
數據內容的詳細說明(從左到右)
- URB Tag. URB地址
- Timestamp, 間隔時間
- Event Type. 時間類型.
支持的類型是: S - submission, C - callback, E - submission error.
- "Address" (通常是一個"管道").它包括4項內容,用冒號分割: URB type ,direction, Bus number, Device address, Endpoint number.
Type和direction被封裝成如下數據格式:
Ci Co Control input and output
Zi Zo Isochronous input and output
Ii Io Interrupt input and output
Bi Bo Bulk input and output
Bus number, Device address, 和Endpoint是十進制數字, 但是他們可能因為閱讀便利而設置成為0.
- URB Status word. 這個要么是字母或者是一些由分號隔開的數字
- Setup packet, 如果出現的話,包括5個字串: 他們是bmRequestType,bRequest, wValue, wIndex, wLength, (USB Specification 2.0.協議中有詳細介紹)
- 同步號
- Data Length. 數據長度
- Data tag. 即使數據長度不為0,usbmon也不一定總能捕捉到數據,數據包內容只有在此tag為'='才有效
- Data words 大頭十六進制數.
舉例:
輸入控制得到端口狀態的示例
d5ea89a0 3575914555 S Ci:1:001:0 s a3 00 0000 0003 0004 4 <
d5ea89a0 3575914560 C Ci:1:001:0 0 4 = 01050000
通過bus5口發送一個31字節長度的塊包(其中保存一個SCSI命令 0x5E )到存儲設備
dd65f0e8 4128379752 S Bo:1:005:2 -115 31 = 55534243 5e000000 00000000 00000600 00000000 00000000 00000000 000000
dd65f0e8 4128379808 C Bo:1:005:2 0 31 >
詳細信息請參閱: http://www.mjmwired.net/kernel/Documentation/usb/usbmon.txt
======================================================================================================================================================
LinuxUSB驅動程序調試
:這是LinuxUSB驅動程序調試--003:Ubuntu下的准備工作的詳細頁面,介紹了和linux,有關的知識、技巧、經驗,和一些linux源碼等。
Ubuntu下的准備工作:
(1)如何查看內核中的printk輸出: dmesg
再配合管道命令, dmesg |head , dmesg |tail
再配合管道命令, dmesg |head , dmesg |tail
通過這個命令,我們可以看到內中的printk輸出的內容,這是很有用的一個
工具。
(2)的USB抓包工具:usb_mon
其實,Ubuntu下已經內置了USB抓包工具---USB_MON
【其實 make menuconfig 時候會讓我們選擇的】
使用方法如下:
# mount -t debugfs none /sys/kernel/debug
# modprobe usbmon
查看當前的USB device:
# cat /sys/kernel/debug/usb/devices
下面的輸出:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 12 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=601a ProdID=4740 Rev= 1.00
S: Manufacturer=Ingenic
S: Product=JZ4740 USB Boot Device
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=50 Driver=skeleton
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
如何看懂上面的輸出? Documentation/usb/usbmon.txt
Bus=01 means it's bus 1.
# modprobe usbmon
查看當前的USB device:
# cat /sys/kernel/debug/usb/devices
下面的輸出:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 12 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=601a ProdID=4740 Rev= 1.00
S: Manufacturer=Ingenic
S: Product=JZ4740 USB Boot Device
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=50 Driver=skeleton
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
如何看懂上面的輸出? Documentation/usb/usbmon.txt
Bus=01 means it's bus 1.
通過上面的 Vendor=601a ProdID 可以找到我們設備的Bus號。
上面Bus=01。
使用下面的名利,就開始監聽 Bus01上的全部USB數據包。
# cat /sys/kernel/debug/usb/usbmon/1u
# cat /sys/kernel/debug/usb/usbmon/1u
要想開始監聽 全部 Bus 上的全部USB數據包:
# cat /sys/kernel/debug/usb/usbmon/0u
一旦有數據包,就會打印出來:
# cat /sys/kernel/debug/usb/usbmon/1u
f07dbb80 3233986312 S Co:1:012:0 s 40 01 80c0 0000 0000 0
f07dbb80 3234327703 C Co:1:012:0 0 0
f07dbb80 3234327880 S Co:1:012:0 s 40 02 0000 0200 0000 0
f07dbb80 3234329561 C Co:1:012:0 0 0
f07dbb80 3234329625 S Bi:1:012:1 -115 32 <
f07dbb80 3234331550 C Bi:1:012:1 -75 32 = 00000000 00000000 。。。
# cat /sys/kernel/debug/usb/usbmon/0u
一旦有數據包,就會打印出來:
# cat /sys/kernel/debug/usb/usbmon/1u
f07dbb80 3233986312 S Co:1:012:0 s 40 01 80c0 0000 0000 0
f07dbb80 3234327703 C Co:1:012:0 0 0
f07dbb80 3234327880 S Co:1:012:0 s 40 02 0000 0200 0000 0
f07dbb80 3234329561 C Co:1:012:0 0 0
f07dbb80 3234329625 S Bi:1:012:1 -115 32 <
f07dbb80 3234331550 C Bi:1:012:1 -75 32 = 00000000 00000000 。。。
讀懂上面的數據,還是要看usbmon.txt
URB tag :標志
TimeStamp:毫秒數
Event Type: S - submission,
TimeStamp:毫秒數
Event Type: S - submission,
C - callback,
E - submission error.
URBType:BusNo:DeviceAddr:EndPointNum
Ci Co Control input and output
Zi Zo Isochronous input and output
Ii Io Interrupt input and output
Bi Bo Bulk input and output
URB Status: 0為沒有錯誤。-XXX是錯誤碼。
