linux xhci调试小记

调试工具

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xHCI(Extended Host Controller Interface)事件环(Event Ring)是用于管理和处理USB数据传输的一种机制。 xHCI是一种USB 3.0规范中定义的主机控制器接口,它是一种高速的、低延迟的接口,用于连接USB设备与计算机主机之间的通信。 事件环是xHCI中的一个重要概念,它是一种环形数据结构,用于存储和传递USB数据传输过程中产生的事件消息。xHCI控制器使用事件环来通知主机CPU各种USB相关的事件,如传输完成、错误处理等。 xHCI事件环的工作原理是这样的:当USB设备与计算机进行数据传输时,xHCI控制器会将相应的事件消息存储到事件环的特定位置。主机CPU会定时轮询事件环,获取并处理这些事件消息。 xHCI事件环有多个槽位,每个槽位对应一个事件,事件优先级由槽位的位置决定。当有新的事件发生时,控制器会在事件环中分配一个槽位,并将事件消息写入该槽位中。主机CPU会按照事件优先级顺序依次处理这些事件。 通过使用事件环,xHCI控制器能够及时通知主机CPU各类USB事件,实现了设备与主机之间的高效通信。同时,事件环也提供了一种异步处理的机制,当一个事件正在处理时,控制器仍然可以接收和处理其他事件,提高了系统的并发性。 总之,xHCI事件环是一种用于管理和处理USB数据传输中事件消息的机制,通过事件环,USB设备与主机之间可以高效地进行数据交互,提高了系统的性能和响应速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值