這兩天在看USB轉(zhuǎn)串口的驅(qū)動(dòng),并在想辦法解決一個(gè)4G設(shè)備通過(guò)USB插入openwrt后枚舉的串口無(wú)法收發(fā)的問(wèn)題。看了大概有一個(gè)星期了,大概把USB是什么搞清楚了。但是USB的世界實(shí)在是太復(fù)雜了,除了USB協(xié)議本身,枚舉出來(lái)的設(shè)備和系統(tǒng)中的其他總線總是有一腿,才剛接觸linux內(nèi)核的東西,感覺(jué)頭大,實(shí)在不是短時(shí)間能啃下來(lái)的。好了廢話不多說(shuō),先看看我處理tcpdump是怎么抓取usb總線數(shù)據(jù)的吧。
相關(guān)軟件
- openwrt(我用的是bb版本,linux內(nèi)核3.10.49)
- wireshark(我用的最新版本2.2.6)
- tcpdump(抓包神器)
- libpcap (tcpdump以來(lái)的庫(kù))
- usbmonitor (usb數(shù)據(jù)包,就靠它了)
一,編譯openwrt支持tcpdump和libpcap
1.1, 在 menuconfig中選擇tcpdump和libpacap中的usb
Network-->
[*] tcpdump
Libraries-->
-*- libpcap-->
Configuration--->
[*] Include USB support (注意這個(gè)一定要選上,否則你別想通過(guò)tcpdump抓usb包)
下面還有一個(gè) tcpdump mini,我沒(méi)有用,也沒(méi)管。
1.2, 在menuconfig 中選擇usbmointor
Kernel modules--->
USB support-->
[*] kmod-usbmon
1.3, 在kernel_menuconig 內(nèi)核配置中選擇usb monitor
Device Drivers -->
[*] USB support --->
<*> USB Monitor
二,執(zhí)行make編譯
三,下載到目標(biāo)板
具體的板子不一樣,我這里就不寫了
四,抓包
終于到了抓包了。
4.1,確認(rèn)一下你的設(shè)備在USB哪個(gè)總線上
$ cat /sys/kernel/debug/usb/devices
T: Bus=01 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=80ee ProdID=0021 Rev= 1.00
S: Manufacturer=VirtualBox
S: Product=USB Tablet
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=(none)
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms
上面這個(gè)bus就表示總線號(hào),Dev#表示設(shè)備號(hào)。不同的總線對(duì)應(yīng)的usbmonx不一樣。例如BUS=1就對(duì)應(yīng)usbmon1,BUS=2對(duì)應(yīng)usbmon2。
4.2,查看tcpdump是否可以檢測(cè)到usbmonx設(shè)備
$ tcpdump -D
1.eth0
2.br-lan
3.usbmon1 (USB bus number 1)
4.any (Pseudo-device that captures on all interfaces)
5.lo
可以看到我這里有usbmon1設(shè)備可用了。
4.3,抓取usb數(shù)據(jù)
$ tcpdump -i usbmon1 -w usb.pcap
4.4,好了可以插入你想要抓取的USB設(shè)備了,抓取完成后,導(dǎo)出usb.pcap
4.5,用wireshark查看usb數(shù)據(jù)包
將導(dǎo)出的usb.pcap文件,用wireshark打開,就可以看看usb交互的數(shù)據(jù)流程了,看起來(lái)已經(jīng)比較直觀了。比起原始的usbmon數(shù)據(jù)直觀很多。
show一下效果

usb.png