9调试指南和技术
了解USB的结构体能够帮助我们高效的调试一个问题并且发现潜在的需要修复的bug。这章介绍了基本的用于USB相关问题的调试方法和所能获得的调试机制。
9.1 USB LeCroy logs
LeCroy USB分析仪是一个很好的工具,它允许我们搜集发生在总线上的详细的传输包。这个在观察总线级别的问题的时候是很有帮助的额,例如,协议相关的,电源管理,吞吐量,等。
和分析仪同等重要的是USB包的解析,这个也是由LeCroy提供的。这允许用户很容易就能理解USB总线上出现的数据。
9.1.1 USB协议组件
USB协议组件是一个解析应用,它被用来和LeCroy分析仪进行交流。LeCroy分析仪能够执行一些有用的功能,例如:
不同的触发模式
Snapshot ---最简单的捕获模式,这能够被用户停止或者当buffer被填充了的时候被停止。
人工触发 ---- 用户触发 开始或者停止;直到用户停止捕获为止才停止运行。
事件触发 --- 基于事件的触发,例如,总线reset,总线挂载,总线恢复,等,当一个定义的事件出现的时候就会引起触发。
9.2 USB驱动日志
在USB软件驱动里,一些日志可能被使能了来帮助调试问题。
9.2.1 DWC3调试日志
这部分只与拥有USB3.0控制器的平台相关
9.2.1.1使用动态的调试
如果在你的内核配置中动态调试被使能了(默认是使能的),用户通过debugfs命令能够轻松的使能日志。
使能USB调试日志
echo ‘file dwc3-msm.c +p’ > /d/dynamic_debug/control
echo ‘file dwc3_otg.c +p’ > /d/dynamic_debug/control
使能USB 冗余的调试log
echo ‘file gadget.c +p’ > /d/dynamic_debug/control
注意:“/d”被认为是调试文件系统的挂载点。如果这个这个与系统中的挂载点不同,那么就用正确的路径代替它。
9.2.1.2 使用USB设备模式事件追踪
在DWC3 UDC驱动中,具有记录明确的事件到一个静态的buffer中的你能力。采用将log保存在一个静态buffer中的方式是因为事件一般预计都是“嘈杂的”,因此使用内核log打印可能会有一个很高的延时。
输出buffer内容
DWC3驱动创建了一个debugfs文件来读出静态buffer中的内容。这个静态buffer也可以从RAM dump中被访问
cat /sys/kernel/debug/8a00000.dwc3/events
使能端点的掩码
默认的,驱动只对下面的情况使能日志:
总线事件(挂载,reset,断开,等)
USB控制器相关的操作(挂载,状态机事件等)
端点0日志(追踪端点0的IN/OUT包)
额外的每个端点的日志的使能取决于端点使用的掩码
配置接收端点的掩码
模块参数--- /sys/module/dwc3/parameters/ep_addr_rxdbg_mask
值 --- 写入到参数的值被当做是一个位映射的值到各自的端点号;例如:
如果我们写一个“2”(10b),我们就使能了EP0的打印日志(一直是默认的)和EP 1 OUT打印日志
echo 2 > /sys/module/dwc3/parameters/ep_addr_rxdbg_mask
如果我们写一个“14”(1110b),我们就使能了EP0的打印日志(一直是默认的)和EP 1/2/3 OUT的打印日志
echo 14 > /sys/module/dwc3/parameters/ep_addr_rxdbg_mask
配置发送EP掩码
模块参数 --- /sys/module/dwc3/parameters/ep_addr_txdbg_mask
值 --- 写入到参数的值被当做是一个位映射的值到各自的端点号;例如:
如果我们写一个“2”(10b),我们就使能了EP0的打印日志(一直是默认的)和EP 1 IN的打印日志
echo 2 > /sys/module/dwc3/parameters/ep_addr_txdbg_mask
如果我们写一个“14”(1110b),我们就使能了EP0的打印日志(一直是默认的)和EP 1/2/3 IN的打印日志
echo 14 > /sys/module/dwc3/parameters/ep_addr_txdbg_mask
9.2.2 phy-msm-usb 调试logs
如果你的内核配置中动态调试被使能了(默认是使能的),用户能够通过一个debugfs命令轻易的使能logging
echo ‘file phy-msm-usb.c +p’ > /d/dynamic_debug/control
使能USB冗余调试logs
echo ‘file gadget.c +p’ > /d/dynamic_debug/control
“/d”被认为是调试文件系统的挂载点。如果这个这个与系统中的挂载点不同,那么就用正确的路径代替它。