Linux USB 设备检测


Linux 下查看 USB 设备

最常用的命令就是 lsusb ,但是 lsusb 仅能查看当前的简单 USB 设备信息,要查看详细的 USB 设备信息,最好还是借助 Linux 下的 debugfs 机制。

  • debugfs 挂载:
mount -t debugfs none /sys/kernel/debug/
  • 通过 debugfs 查看 USB 设备信息
cat /sys/kernel/debug/usb/devices

设备信息解释

通过 /sys/kernel/debug/usb/devices 设备节点可以看到当前 USB 设备的详细信息,具体如下:

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh=16
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 4.18
S:  Manufacturer=Linux 4.18.0-240.el8.x86_64 xhci-hcd
S:  Product=xHCI Host Controller
S:  SerialNumber=0000:00:14.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=480  MxCh= 4
D:  Ver= 2.10 Cls=09(hub  ) Sub=00 Prot=02 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0610 Rev=93.07
S:  Manufacturer=GenesysLogic
S:  Product=USB2.1 Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=01 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms
I:* If#= 0 Alt= 1 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=02 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=07 Cnt=02 Dev#=  3 Spd=480  MxCh= 5
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=046b ProdID=ff01 Rev= 1.00
S:  Manufacturer=American Megatrends Inc.
S:  Product=Virtual Hub
S:  SerialNumber=serial
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms

T:  Bus=01 Lev=02 Prnt=03 Port=03 Cnt=01 Dev#=  4 Spd=1.5  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=046b ProdID=ff10 Rev= 1.00
S:  Manufacturer=American Megatrends Inc.
S:  Product=Virtual Keyboard and Mouse
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=  0mA
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=01 Prot=02 Driver=usbhid
E:  Ad=82(I) Atr=03(Int.) MxPS=   8 Ivl=10ms

针对上面的输出信息,具体解释如下:

  • T = 总线拓扑(Topology)结构(Lev, Prnt, Port, Cnt, 等),是指USB设备和主机之间的连接⽅式。
    针对 T 后的数据信息解释如下:
    ⼀般表示格式:(具体使用见下文)
    d = ⼗进制数
    x = ⼗六进制数
    s = 字符串
    拓扑信息(Topology)
T:   Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd
|      |     |      |       |       |      |        |        |__最⼤⼦设备
|      |     |      |       |       |      |        |__设备速度(Mbps)
|      |     |      |       |       |      |__设备编号
|      |     |      |       |       |__这层的设备数
|      |     |      |       |__此设备的⽗连接器/端⼝
|      |     |      |__⽗设备号
|      |     |__此总线在拓扑结构中的层次
|      |__总线编号
|__拓扑信息标志
  • B = 带宽(Bandwidth)(仅⽤于USB主控制器)。

带宽信息(Bandwidth)

B:   Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd
|       |                      |         |__同步请求编号
|       |                      |__中断请求号
|       |__分配给此总线的总带宽
|__带宽信息标志
  • D = 设备(Device)描述信息。
    设备描述信息(Device)
D:   Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
|       |      |             |      |       |        |__配置编号
|       |      |             |      |       |______缺省终端点的最⼤包尺⼨
|       |      |             |      |__设备协议
|       |      |             |__设备⼦类型
|       |      |__设备类型
|       |__设备USB版本
|__设备信息标志编号#1
  • P = 产品(Product)标识信息。
    产品标识信息(Product)
P:   Vendor=xxxx ProdID=xxxx Rev=xx.xx
|       |          |          |__产品修订号
|       |          |__产品标识编码
|       |__制造商标识编码
|__设备信息标志编号#2
  • S = 字符串(String)描述符。
    串描述信息(String)
S:   Manufacturer=ssss
|       |__设备上读出的制造商信息
|__串描述信息
S:   Product=ssss
|      |__设备上读出的产品描述信息,对于USB主控制器此字段为"USB *HCI Root Hub"
|__串描述信息
S:   SerialNumber=ssss
|       |__设备上读出的序列号,对于USB主控制器它是⼀个⽣成的字符串,表⽰设备标识
|__串描述信息
  • C = 配置(Config)描述信息 (* 表⽰活动配置)。
    配置描述信息(Config)
C:   #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA
|     |      |       |      |__最⼤电流(mA)
|     |      |       |__属性
|     |      |__配置编号
|     |__接⼝数
|__配置信息标志
  • I = 接⼝(Interface)描述信息。
    接⼝描述信息(可为多个)(Interface)
I:   If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss
|    |      |       |       |             |     |        |__驱动名
|    |      |       |       |             |     |__接⼝协议
|    |      |       |       |             |__接⼝⼦类
|    |      |       |       |__接⼝类
|    |      |       |__端点数
|    |      |__可变设置编号
|    |__接⼝编号
|__接⼝信息标志
  • E = 端点(Endpoint)描述信息。
    端点描述信息(Endpoint)
E:   Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
|    |        |             |         |__间隔
|    |        |             |__终端点最⼤包尺⼨
|    |        |__属性(终端点类型)
|    |__终端点地址(I=In,O=Out)
|__终端点信息标志
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux是一个开源的操作系统,拥有广泛的支持和使用,同时Python是一种高级编程语言,也是Linux下广泛使用的编程语言之一。检测USB设备的过程在Linux下可以通过Python脚本实现。 检测USB设备的过程分为两部分:首先是检测USB设备的插拔事件,其次是识别这些设备的信息。 在Linux检测USB设备的插拔事件可以使用UDEV模块,该模块是Linux系统中的一个重要模块,可以用于监控和管理系统事件。我们可以使用Python来编写UDEV事件处理器,来获取USB设备插拔时的事件信息。如下所示: ```python import pyudev # 创建一个UDEV事件监听器 context = pyudev.Context() # 监听UDEV事件 monitor = pyudev.Monitor.from_netlink(context) monitor.filter_by(subsystem='usb') # 处理UDEV事件 for device in iter(monitor.poll, None): print(device) ``` 在上面的代码中,我们使用pyudev模块中的Monitor类来创建一个UDEV事件监听器,同时指定其关心的USB设备的子系统。然后使用iter()函数来监控UDEV事件,并打印出设备信息。 识别USB设备的信息,可以使用标准的Linux命令来获取设备的信息,如lsusb等。我们同样可以使用Python来执行这些命令,并解析命令的输出来获取设备的信息。如下所示: ```python import subprocess # 执行lsusb命令 proc = subprocess.Popen(['lsusb', '-v'], stdout=subprocess.PIPE) out, err = proc.communicate() # 解析命令输出 for line in out.splitlines(): if b"iProduct" in line: product = line.split(b":")[1].strip() print(product) ``` 在上面的代码中,我们使用subprocess模块中的Popen类来执行lsusb命令,并获取命令的输出。然后使用split()方法和strip()方法来解析命令输出,并获取设备的信息。 以上代码仅仅是一个简单的示例,实际上可以根据需求进行更多的操作。需要注意的是,在使用UDEV模块时,需要在Linux系统中安装该模块;同时在执行Linux命令时,需要确保系统中已经安装了相应的命令并添加到系统的环境变量中。 总之,Python脚本可以方便地监控和识别USB设备,并实现相应的操作。这对于需要实现USB设备自动检测和管理的应用场景非常有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值