问询:/dev/bus/usb/xxx/yyy代码含义及指定hexdump输出解读
解读USB设备路径与hexdump输出内容
一、先搞懂/dev/bus/usb/xxx/yyy的含义
在Linux系统里,这个路径是直接映射到物理USB设备的特殊文件节点,每个部分都有明确作用:
xxx是USB总线编号:你的电脑上每个USB控制器都会对应一条独立总线,系统会给每条总线分配唯一的数字ID(比如你例子里的003)yyy是设备在总线上的地址:当你把USB设备插上去时,系统会给它分配一个临时的唯一地址(比如这里的014)- 直接读取这个文件,其实就是获取该USB设备的描述符数据——这是设备用来“自我介绍”的核心信息:告诉系统它是什么设备、支持什么功能、怎么和它通信,也就是你用
hexdump -C输出的二进制转码内容。
二、逐段拆解hexdump的输出
hexdump -C的作用是把二进制的USB描述符转成十六进制+ASCII的可读格式,USB描述符都是按固定规则组织的:每个描述符开头都是「1字节长度 + 1字节类型」,咱们按这个规则来拆解:
1. 设备描述符(从00000000开始)
00000000 12 01 00 02 e0 00 00 40 e8 04 63 68 ff ff 02 03 |.......@..ch....|
12:这个描述符的总长度是18字节(十六进制0x12转十进制)01:描述符类型是设备描述符(USB规范里0x01代表设备描述符)00 02:设备支持的USB版本是2.00(小端字节序,转成大端是0x0200)e0:设备类别是无线控制器(0xE0是USB无线设备的类代码)00:设备子类代码(这里为0,说明具体子类由接口描述符定义)00:设备协议代码40:端点0的最大包大小是64字节(USB设备的控制端点,用来和系统交互配置信息)e8 04:厂商ID(VID)是0x04E8(小端转大端)63 68:产品ID(PID)是0x6863,结合VID来看这应该是一款蓝牙无线设备ff ff:设备的硬件版本号02:厂商名称字符串的索引(系统可通过这个索引读取设备内置的厂商名称)03:产品名称字符串的索引
2. 配置描述符及下属接口/端点(从00000012开始)
设备描述符之后就是配置描述符,用来定义设备的工作配置:
00000010 ... 09 02 4b 00 02 01 00 c0 30 ... |.....K.....0....|
09:配置描述符长度是9字节02:描述符类型是配置描述符(0x02)4b 00:该配置的总长度是75字节(小端转大端为0x004B)02:这个配置包含2个接口(蓝牙设备通常会有控制和数据两个接口)01:配置值(系统可以通过这个值选择该配置)00:配置名称字符串的索引(这里没有提供)c0:设备属性是自供电(0xC0对应自供电模式,不需要从USB总线取电)30:设备最大功耗是48mA(USB规范里这个值要乘以2mA,0x30*2=48)
紧接着是第一个接口描述符(属于蓝牙控制接口):
0000001b 08 03 00 00 01 e0 01 03 ... |............|
08:接口描述符长度是8字节03:描述符类型是接口描述符(0x03)00:接口编号为000:备用设置编号为001:该接口包含1个端点e0:接口类别是无线控制器01:接口子类是蓝牙03:接口协议是蓝牙HCI(主机控制器接口)
再后面是该接口的端点描述符(中断端点,用于蓝牙控制命令交互):
00000023 07 05 02 02 40 00 10 ... |.....$..|
07:端点描述符长度是7字节05:描述符类型是端点描述符(0x05)02:端点地址是OUT端点2(低4位是端点号,最高位0代表OUT方向)02:传输类型是中断传输(适合小批量、低延迟的控制数据)40 00:端点最大包大小是64字节10:轮询间隔是16ms(系统每隔16ms会查询这个端点的控制数据)
后面的内容(从00000030到0000005d)是第二个接口(蓝牙数据接口)的描述符和对应的批量端点描述符,用来处理蓝牙的数据传输,格式和上面的逻辑一致,核心是定义了数据传输的端点地址、包大小和传输类型。
整体来看,这个hexdump输出完整展示了一款USB蓝牙设备的所有描述信息,Linux系统就是靠这些数据来识别设备、加载对应的驱动并建立通信的。
内容的提问来源于stack exchange,提问作者Ouahid Lakhal
相关产品推荐
相关产品推荐

