linux usb 系统 (8)
来源:互联网 发布:运动摄像机 知乎 编辑:程序博客网 时间:2024/06/06 08:44
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动作,
表示in类型,后面还有In读取操作需要读取数据,
同时为S-submission或者E-submission error
> --
> -- 表示数据部分已经成功下发
表示out类型,同时为C-Callback
仅从USBMON很难得到对调试驱动有帮助的数据,要想在linux下方便的调试USB设备,还有许多工作需要我们做。
注:转载请注明出处 datangsoc@hotmail.com
- linux usb 系统 (8)
- linux usb 系统 (5)
- linux usb 系统 (6)
- linux USB 系统 (7)
- linux 系统usb问题。
- LINUX USB 系统(1)
- LINUX USB 系统(2)
- LINUX USB 系统(3)
- usb linux 系统 (4)
- linux中的usb系统
- LINUX USB 系统(1)
- linux usb系统
- linux usb系统
- linux usb系统【全面】
- linux usb ehci 系统
- linux usb系统
- linux usb系统
- Linux USB系统
- Linux原生ZFS文件系统模块将于下月发布
- 构建嵌入式交叉编译工具链
- C语言的9种控制语句
- “开源版Facebook”Diaspora宣布9月上线
- linux USB 系统 (7)
- linux usb 系统 (8)
- mailto语法
- 将CSS样式写成JS格式的用法
- 扎克伯格称Facebook图片使用率远超对手
- POJ1804逆序对
- 整理出来的MD5算法的C++源代码
- 遍历TextBox,HtmlInputText,GridView;定制自己的,操作日志 ASP.NET
- 怎样学好ARM&Linux
- 常用网址