如何在Python中根据USB设备的VID和PID确定sysfs设备路径?

1 投票
2 回答
7005 浏览
提问于 2025-04-17 19:51

我需要在sysfs树中找到一个USB设备,知道它的VID和PID,想用Python来实现。有什么比较好的方法吗?我想到的唯一办法就是递归地扫描目录树。有没有更好的方法呢?对了,我不能使用libusb的绑定。

2 个回答

1

两年过去了,从识别一个设备到找到实际的设备,这个过程还是不太简单。你说得对,我们需要扫描 sysfs 来识别设备。目前还没有从唯一 ID 到设备的索引。

这里有个例子:

我有一个 USB 转 LPT 端口(没有序列号)。

我在 /sys/class 下找到了这个设备。在这个情况下,它在 usbmisc 目录下:

> ls -l /sys/class/usbmisc
lrwxrwxrwx 1 root root 0 Sep 11 12:11 lp0 -> ../../devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3.4/1-1.3.4:1.0/usbmisc/lp0

要获取关于设备的厂商和其他信息,需要沿着目录树走:

先找到真实的路径:

 > cd -P /sys/class/usbmisc/lp0

再往下走一点(到这里:/sys/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3.4):

 > cd ../../../

在这里你会找到一些有用的文件:
idVendor
idProduct
serial
busnum
devnum

我可以用多种方式获取设备名称:

我可以使用上面的 busnum 和 devnum,组合出这个设备名称: /dev/usb/001/008

或者使用 /sys/class/usbmisc/lp0/uevent 中的信息:
MAJOR=180
MINOR=0
DEVNAME=usb/lp0

把 /dev 加到 DEVNAME 的值上,我就得到了 /dev/usb/lp0

我希望能有一个更简单的方法,能用一个唯一的键、一个描述和每个设备的链接。希望将来 sysfs 会有这样的改进。不过,由于使用 C sysfs API 更容易操作,可能还需要很长时间才能实现。

2

你可以试着使用usb设备的sysfs路径,也就是/sys/bus/usb/devices/,然后查找idProduct和idVendor这两个文件。

/sys/bus/usb/devices/*/idProduct
/sys/bus/usb/devices/*/idVendor

撰写回答