如何读取“usb-devices”命令的输出?

如何读取“usb-devices”命令的输出?

我正在尝试调试 Ubuntu 22.04 上的 USB 问题。我遇到过这个usb-devices命令。但是我不明白输出。我读过手册页,它说:

该脚本的输出类似于 /proc/bus(如果安装了 usbfs)或 /sys/kernel/debug(如果安装了 debugfs)下的 usb/devices 文件。该脚本主要供文件不可用时使用。与 usb/devices 文件相反,此脚本仅列出活动接口(在 usb/devices 文件中标有“*”的接口)及其端点。请注意,信息的排序方式以及输出的格式可能存在差异。

但是,我也无法找到有关如何读取这些文件的输出的明确指南。以下是不同机器的示例输出:

T:  Bus=01 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#=  3 Spd=1.5 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=045e ProdID=082c Rev=01.00
S:  Manufacturer=Microsoft
S:  Product=Microsoft Ergonomic Keyboard
S:  SerialNumber=601135501321
C:  #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=01 Driver=usbhid
E:  Ad=81(I) Atr=03(Int.) MxPS=   8 Ivl=10ms
I:  If#= 1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=82(I) Atr=03(Int.) MxPS=   8 Ivl=10ms

我怎么读这个?缩写是什么意思?我可以从 阅读脚本本身vim $(which usb-devices),这有一点帮助。例如,在第一行中,它输出:

T: Bus=01 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0

在代码中我可以看到它引用来自以下行:

printf "\nT: Bus=%02i Lev=%02i Prnt=%02i Port=%02i Cnt=%02i Dev#=%3i Spd=%-3s MxCh=%2i\n" \ $busnum $level $parent $port $count $devnum $speed $maxchild

因此,从中我可以看到从哪里来$busnum,但即便如此,我也看不出“T一开始”代表什么。

答案1

经过一番挖掘后,找到了答案这里。有趣的部分引用如下:

以 T: 开头的行是拓扑。Bus 表示设备位于哪条总线上。 Lev 表示设备的级别,从根集线器的级别 00 开始,连接到根集线器的任何设备的级别 01,连接到级别 01 集线器的设备的级别 02,依此类推。 Prnt 是该设备的父设备(对于根集线器始终为 00,对于连接到根集线器的设备始终为 01)。端口是父设备上的端口,每个设备上的第一个端口从 00 开始。 Prnt/Port 每条总线都是唯一的。 Cnt 根据该拓扑级别内的枚举顺序指示此级别的设备编号,第一个设备从 01 开始。 Dev# 根据总线枚举顺序指示这是什么设备号,无论级别如何。每辆巴士都是独一无二的。 Spd 指示该设备的运行速度,以 Mbps 为单位(当前版本的 USB 为 1.5 或 12)。 MxCh 表示有多少个设备可以连接到该设备,对于除集线器之外的任何设备都为 00。驱动程序指示该设备正在使用哪个设备驱动程序 - (无) 条目指示未使用任何驱动程序。

以 D: 开头的行是来自设备描述符的信息。 Ver 表示设备声称符合哪个 USB 规范版本。 Cls 以十六进制和字符串形式指示设备声称符合哪个设备类别。 Cls 条目为 00(>ifc) 表示设备类规范合规性与接口相关,并且应读取接口描述符以获取设备类信息。 Sub 指示设备符合哪个子类(在 Cls 条目内)。 Prot 指示设备声称满足类或子类中的哪个协议。 MxPS 指示来自端点 0 的数据包有多大。 #Cfgs 表示该设备有多少个配置。

与 D: 非常相似,以 P: 开头的行是来自设备描述符的信息,之所以分开主要是因为它不能全部放在一行上。供应商表示设备的供应商标识代码,ProdID 表示设备的产品标识代码。 Rev 表示产品修订号。

以 S: 开头的行(如果有)是设备返回的供应商和产品字符串。

以 C: 开头的行是来自配置描述符的信息 - 每个设备的 C: 行数由 #Cfgs 给出,后面跟有星号的条目是当前配置。 #If表示设备有多少个接口。 Cfg# 指示正在描述哪个配置。 Atr 是设备属性的十六进制指示(0x80 表示总线供电,0x40 表示自供电,0x20 表示具有远程唤醒功能)。 MxPwr 是此设备配置的最大功耗(以毫安为单位)。有关配置描述符的更多信息,请参阅 USB 规范第 9.7.2 节。

以 I: 开头的行是来自接口描述符的信息 - 每个 C: 行的 I: 行数由 #Ifs 条目给出。 If# 指示在给定设备配置中描述哪个接口。 Alt 指示正在描述该接口的哪个替代设置。 #EPs 指示此端点的备用设置中有多少个端点。 Cls 以十六进制和字符串形式指示接口的备用设置对应于哪个类。 Sub 表示该接口的备用设置属于哪个子类。 Prot 指示接口的备用设置符合哪个接口协议(在类和子类元组内)。驱动程序指示哪个 USB 驱动程序已声明此接口。有关详细信息,请参阅 USB 规范第 9.7.3 条。

以 E: 开头的行是来自端点描述符的信息 - 每个 I: 行的 E: 行数由 #EPs 条目给出。不显示端点 0。 Ad表示端点地址,用字母表示该端点是In端点还是Out端点。 Atr 指示与端点关联的属性(传输类型),后跟转换传输类型的字符串。 MxPS 指示该端点能够发送或接收的最大数据包大小(视情况而定)。 Ivl 表示轮询中断端点之间的时间间隔,以毫秒为单位。对于批量传输和控制传输,Ivl 被忽略,对于同步传输,Ivl 设置为 1。有关端点描述符的更多信息,请参阅 USB 规范第 9.7.4 节。

相关内容