Linux-USB百科
+ -

linux系统USB设备硬件完整调试命令

2026-07-04 本文链接为:http://www.usbzh.com/article/detail-1748.html ,欢迎转载,转载请附上本文链接。

一、总线与设备探查命令

1. lsusb — 查看设备与协商速度

# 简洁列出所有USB设备
lsusb

# 树形显示拓扑与当前协商速度(核心命令)
lsusb -t

# 完整描述符(bcdUSB、功耗、驱动)
lsusb -v

# 按VID/PID过滤
lsusb -d 0951:177f

速度标识解析

标识 含义
480M USB2.0 High-Speed(≈50MB/s)
5000M USB3.2 Gen1(≈500MB/s)
10000M USB3.2 Gen2(≈1000MB/s)
20000M/x2 USB3.2 Gen2x2(≈2000MB/s)

2. lspci — 查看主板USB控制器硬件

# 列出所有USB控制器
lspci | grep -i usb

# 查看控制器详情(PCIe链路、供电、中断、驱动)
lspci -vvv -s 00:14.0

# 查看绑定的内核驱动
lspci -k -s 00:14.0

二、实时监控命令

3. dmesg — 监控USB插拔、断连与报错

# 实时滚动监控USB事件
dmesg -w

# 过滤USB相关日志
dmesg | grep -i usb

# 按VID/设备名过滤
dmesg | grep -E "0951|DataTraveler"

# 导出全部日志
dmesg > usb_log.txt

关键报错识别

日志关键字 含义
error -32 高速通信管道断裂
USB disconnect 设备离线
SuperSpeedPlus 10G协商成功
HighSpeed USB2.0协商

三、/sys 虚拟文件系统操作

4. 设备目录结构解读

/sys/bus/usb/devices/
├── usb1/          # 根Hub(2.0)
├── usb2/          # 根Hub(3.0高速)
├── 3-3/           # 根Hub端口3外接一级Hub
│   └── 3-3.3/     # 下级Hub端口3上的U盘
│       └── 3-3.3:1.0/  # U盘存储接口

5. 读取设备实时参数

cd /sys/bus/usb/devices/usb3/3-3/3-3.3

cat speed          # 当前协商速度(4800=2.0,10000=10G)
cat version        # USB协议版本(2.10/3.20)
cat bMaxPower      # 设备功耗(mA)
cat idVendor       # 厂商ID
cat idProduct      # 产品ID
ls -l driver       # 当前驱动(uas/usb-storage)

6. 电源与休眠控制(解决频繁断开)

# 单个设备强制不休眠
echo on > /sys/bus/usb/devices/usb3/3-3/power/control

# 全局所有USB设备强制不休眠
for dev in /sys/bus/usb/devices/*/power/control; do echo on > "$dev" 2>/dev/null; done

# 查看设备功耗
cat /sys/bus/usb/devices/usb3/3-3/3-3.3/bMaxPower

# 查看当前存储驱动
ls -l /sys/bus/usb/devices/usb3/3-3/3-3.3:1.0/driver

# 模拟热拔(强制断开)
echo 1 > /sys/bus/usb/devices/usb3/3-3/3-3.3/remove

power/control 参数

含义
auto 默认自动休眠(导致断开)
on 强制持续供电,永不休眠(修复断开)

四、速度诊断与限速定位

7. 快速定位限速根源

# 查看U盘所在总线
lsusb -t | grep "Mass Storage"

# 确认U盘是否直接挂载在高速根Hub下
# 若显示 Bus03(480M)→ 总线中有2.0 Hub限速
# 若显示 Bus04(10000M)→ 在高速总线,排查线材/驱动

# 对比U盘硬件能力 vs 当前协商速度
lsusb -v -d 0951:177f | grep -E "bcdUSB|SuperSpeed"
# bcdUSB=3.20(硬件支持10G),但speed=4800(当前跑2.0)

8. 完整速度验证流程

# 1. 插拔后监控协商
dmesg -w | grep -E "SuperSpeed|HighSpeed"

# 2. 查看拓扑中的速度
lsusb -t

# 3. 确认U盘设备目录中的实际速度
cat /sys/bus/usb/devices/*/speed | grep -E "4800|10000"

五、常见故障修复命令流程

故障1:U盘跑在USB2.0速度

# 1. 确认拓扑,找到限速设备
lsusb -t

# 2. 移除路径中的USB2.0 Hub,直插主板高速口

# 3. 重新插拔并验证
lsusb -t | grep "Mass Storage"
# 期望输出:10000M 或 5000M

故障2:高速频繁断开(USB disconnect)

# 1. 关闭自动休眠(临时)
echo on > /sys/bus/usb/devices/usb4/4-2/power/control

# 2. 全局禁用
for dev in /sys/bus/usb/devices/*/power/control; do echo on > "$dev" 2>/dev/null; done

# 3. 永久配置(编辑/etc/default/grub)
GRUB_CMDLINE_LINUX="usbcore.autosuspend=-1 usbcore.usb3_hardware_lpm=0"
update-grub && reboot

故障3:慢插只能识别为2.0

  • 原因:USB 3.0 Type-A触点分层,慢插先完成2.0握手
  • 解决:一次性快速插到底
  • 长期方案:换用Type-C接口设备

故障4:有3.0 Hub但仍跑不满10G

# 1. 确认Hub规格
lsusb -t
# 若Hub显示5000M → 仅Gen1,换Gen2 Hub

# 2. 检查线材(必须9芯全屏蔽高速线)

# 3. 安装UASP驱动(OpenWRT)
opkg update && opkg install kmod-usb-storage-uas

六、完整调试命令速查表

目的 命令
查看所有USB设备 lsusb
查看拓扑与速度 lsusb -t
查看设备详细描述 lsusb -v -d VID:PID
查看USB控制器 `lspci \ grep -i usb`
实时监控插拔事件 dmesg -w
过滤USB日志 `dmesg \ grep -i usb`
查看当前协商速度 cat /sys/bus/usb/devices/*/speed
关闭单设备休眠 echo on > /sys/bus/usb/devices/X-Y/power/control
全局关闭休眠 for dev in /sys/bus/usb/devices/*/power/control; do echo on > "$dev"; done
查看设备功耗 cat /sys/bus/usb/devices/X-Y.Z/bMaxPower
查看存储驱动 ls -l /sys/bus/usb/devices/X-Y.Z:1.0/driver
强制热拔 echo 1 > /sys/bus/usb/devices/X-Y.Z/remove

七、关键原理总结

  1. USB速度由路径最低规格设备决定:一个2.0 Hub会使所有下游设备强制降级到480M
  2. Type-A慢插必降2.0:因触点分层设计,先完成2.0握手后不再发起3.0协商
  3. 自动休眠是断连主因:LPM唤醒失败导致USB disconnect,关闭power/control=on可修复
  4. 硬件能力≠当前速度:需用lsusb -tcat speed确认实际协商速率
  5. 所有/sys修改临时生效:重启重置,永久需配置GRUB内核参数
本文链接为:http://www.usbzh.com/article/detail-1748.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

Linux V4L2框架
Linux系统支持多钟多样的Video设备,如通过USB总线连接的相机,通过PCI设备连接的摄像头,通过MIPI总线连接其它Video设备。故Linux系统专门开发了V4L2子设备用来管理此类设备。V4L2子系统向上为虚拟文件系统VFS提供一的接口,这样应用程序就可以通过虚拟文件系统访问视频设备。......
linux下UsbMon-WireShark之USB协议抓取分析
usbmon配置使用usbmon抓包分的,是需要 内核开启CONFIG_USB_MON=m, 重新编译内核, 编译ko :make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- CONFIG_USB_MON=m M=./drivers/usb/ ......
Linux支持的UVC视频格式
Linux支持的UVC视频格式位于linux-5.6.11linux-5.6.11driversmediausbuvcuvc_driver.c文件下:其数组结构定义如下:static struct uvc_format_desc uvc_fmts[] = { { .n......
Linux源码分析UVC摄像头的初始化流程分析
UVC摄像头的初始化发生在硬件被接入USB集线器中,设备初USB驱动识别为摄像头的后续初始化流程。和Windows的AddDevice驱动函数一样,Linux设备的创建和侦测是通过int uvc_probe函数实现的。其函数的调用关系如下://linux/v5.11.11/source/drive......
ubuntu下使用usbmon进行usb抓包
开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包。 在ubuntu下使用步骤如下:1 运行命令 sudo mount -t debugfs none /sys/kernel/debug ,如果提示已经挂载,则下次抓包就可以不运行这个命令了。表示系统默认会挂载。 2 ......
LINUX&UVC输出终端描述符分析
UVC输出终端描述符用于描述UVC视频流的输出端。关于UVC输出终端描述符各字段的分析详见:https://www.usbzh.com/article/detail-10.htmlUVC输出终端描述符比较简单,没有什么特别的字段。惟一要关注的就是bSourceID。bSourceID:此终端所连接......
LINUX&UVC处理单元描述符
不同的UVC版本,其UVC处理单元描述格式稍有不同。关于UVC处理单元描述符各字段的详细说明可详见:https://www.usbzh.com/article/detail-84.html对于UVC1.1/1.5版本,其内容如下: UINT8 bLength; UINT8 bDescr......
Windows 发送UVC XU Set命令卡死的一种处理办法
Windows系统应用层可以通过获取UVC设备的IKsControl对象,然后调用KsProperty来GET/SET XU命令。经过测试发现,如果调用SET命令的时候设备拔出了,有一定的概率会出现卡死现象,KsProperty这个方法卡住了。复现方法很简单,获取IKsControl对象,然后Sle......
Linux源码分析UVC摄像头的打开流程及抓包分析
和关闭摄像头类似,Linux使用uvc_video_start_streaming函数打开摄像头int uvc_video_start_streaming(struct uvc_streaming *stream){ int ret; ret = uvc_video_clock_init......
V4L2访问摄像头扩展单元命令
我们可以通过IOCTL访问扩展单元,调用方法如下:ioctl(fd, UVCIOC_CTRL_QUERY, struct uvc_xu_control_query *);访问不同的扩展命令只需要修改uvc_xu_control_query 结构体里面内容即可。uvc_xu_control_qu......
用XU打造UVC命令行调试工具
在给客户交付UVC固件之后,有时客户会反馈问题,需要客户查看固件的打印信息或者执行一些命令辅助定位问题。如果有一个工具可以通过USB线连接到设备,直接在电脑上查看打印信息,执行命令就好了。有想法就要行动起来,行动才能解决问题。目前该功能已经实现了,说一下实现的方法吧。上位机OS Windows设......
windows上面通过dshow接口访问uvc摄像头扩展单元,只能访问0x01-0x1F命令问题
最近在给客户做一个修改摄像头数据的工具,在通过dshow接口发送扩展命令的时候发现0x01-0x1F命令都可以发送成功,0x20及以上定义的命令都发送失败,并且返回错误码0x80070490。谷歌百度查了很久终于在windows官网文档中找到了答案,原来是USB 视频类驱动程序对UVC扩展单元实现......
Linux对hidraw设备output report大小的限制
做了个自定义HID设备,可以收发数据,用它来作固件升级。主要是host通过output report下发固件数据,所以output report的size设置的比较大,有4kb,这样升级速度会快一些。经过测试在Windows xp、win7,win10上都木有问题,在linux上出现问题了。设......
BOT 命令块包CBW
CBW即Command Block Wrapper,命令块包)是从 USB 主机发送到设备的命令包,它由 31 个字节构成,其中包含的命令遵从接口描述表中的 bInterfaceSubClass 域所指定的命令集,一般采用 SCSI 传输命令集。 USB 设备从 CBW 中取出并执行相应命令,......
BOT 命令状态包CSW
CSW 应从包的边界开始,在传输了 13 个字节以后结束, CSW 的说明如下表:struct CSW{ DWORD dCSWSignature; // CSW的标识,固定值:53425355h (小端模式) DWORD dCSWTag; //主机发送的一个命令块标......
关注公众号
  • HID人机交互
  • Linux&USB
  • Linux-USB百科
  • MIDI V1.0
  • TinyUSB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB3测试
  • USB3硬件及电气信号
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • XHCI 1.2b 规范
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!