如何在Python中根据USB设备的VID和PID确定sysfs设备路径?
我需要在sysfs树中找到一个USB设备,知道它的VID和PID,想用Python来实现。有什么比较好的方法吗?我想到的唯一办法就是递归地扫描目录树。有没有更好的方法呢?对了,我不能使用libusb的绑定。
2 个回答
两年过去了,从识别一个设备到找到实际的设备,这个过程还是不太简单。你说得对,我们需要扫描 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 更容易操作,可能还需要很长时间才能实现。
你可以试着使用usb设备的sysfs路径,也就是/sys/bus/usb/devices/,然后查找idProduct和idVendor这两个文件。
/sys/bus/usb/devices/*/idProduct
/sys/bus/usb/devices/*/idVendor