调试工具
usbmon
dynamic_debug
xhci_trace
usbmon
usbmon是一款好用的usb抓包工具,linux已经集成到内核中了。使用时先切换到root权限,查看/sys/kernel/debug/usb/路径下有没有usbmon目录,如果没有,可以使用modprobe usbmon安装。
安装之后的目录
root@100ask:~# modprobe usbmon
root@100ask:~# ls /sys/kernel/debug/usb/usbmon/
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
其中1代表bus1,2代表bus2,0代表所有bus
root@100ask:~# lsusb
Bus 004 Device 002: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 003 Device 004: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 003 Device 007: ID 174f:2426 Syntek Integrated Camera
Bus 003 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
如果不确定是哪个bus,可以使用lsusb确定,例如这个Kingston的U盘在bus4上,cat /sys/kernel/debug/usb/usbmon/4u开始抓包
具体的抓包含义可以参考vxworks usb tcd实现_sunshine_master的博客-CSDN博客的usbmon使用部分
dynamic_debug
这里主要使用的是usbcore和xhci_hcd,其中usbcore是xhci_hcd的上层
dynamic打印的是xhci_dbg/xhci_warn等,底层使用的是dev_dbg
echo 'module usbcore +plft' > /sys/kernel/debug/dynamic_debug/control
p代表动态打印语句;+代表开启,-代表关闭
l代表打印行号
f代表打印函数名
t代表打印线程ID
echo 'module xhci_hcd +plft' > /sys/kernel/debug/dynamic_debug/control
开启后,使用dmesg查看,可以加-c选项删除缓冲
dmesg -c
xhci_trace
xhci_trace是xhci代码中trace的调试手段,主要是xhci_trace.c/xhci_dbg.c/xhci_dbgcap.c这几个文件。
0000:03:00.0代表一个xhci控制器
xhci有三条类型的操作队列,一条是整个HOST的命令队列(command ring),一条是每一个EP对应的传输队列(transfer ring),还有一条是整个HOST的事件队列(event ring)
设备驱动软件将需要传输的内容以TRB(transfer request block)的形式放入transfer ring.xhci host取出这些TRB,进行相应的数据传输操作.
在xhci host执行完相应的操作,向event ring中放入一个TRB, 作为向软件对一笔传输事务的结果报告,软件在相应中断产生后的DPC处理中,从event ring中取出该TRB,进行相应的处理.
command-ring下的enqueue指向当前ring的放入地址,dequeue指向当前ring的取出地址,cycle貌似和ring的用满翻转有关
trbs中存放的是提交到command-ring的trb信息
第一条是trb地址,后面是具体信息,代码位置对应xhci.h中xhci_decode_trb,大写字母代表该位为1,小写为0
event-ring下类似
devices下的目录对应具体的设备
epxx代表使用的endpoint
每个epxx下是类似command-ring的结构
调试过程中要对USB spec有一定的了解,结合使用疗效更好哦。还有一些自己也没用到,现在还不了解。USB真是让人头大,不想写了,先挖个坑,以后再慢慢搞吧。