linux xhci调试小记

本文介绍了Linux下的三款USB调试工具。usbmon是集成在内核中的USB抓包工具,使用前需切换到root权限并安装;dynamic_debug主要使用usbcore和xhci_hcd,可动态控制打印信息;xhci_trace是xhci代码中trace的调试手段,涉及多个文件,调试时需结合USB spec。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调试工具

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真是让人头大,不想写了,先挖个坑,以后再慢慢搞吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值