linux usb 系统 (8)

来源:互联网 发布:运动摄像机 知乎 编辑:程序博客网 时间:2024/06/06 08:44

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设备,还有许多工作需要我们做。

注:转载请注明出处 datangsoc@hotmail.com

原创粉丝点击