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设备,还有许多工作需要我们做。
注:转载请注明出处 datangsoc@hotmail.com