我使用libusb来枚举几个usb设备。现在我想获得“设备路径”。我认为这不是usb device-path,因为我没有成功使用谷歌。
如果我使用linux连接usb设备,我会在dmesg
中收到一条消息,这里有一些带有usb温度传感器的“设备路径”的例子(如this ):
直接到usb端口:
[68448.099682] generic-usb 0003:0C45:7401.0056: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.0-1/input0
=>的 12.0-1
直接到另一个港口:
[68560.853108] generic-usb 0003:0C45:7401.0058: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:13.0-1/input0
=>的 13.0-1
到第一个使用端口的USB集线器:
[68600.245809] generic-usb 0003:0C45:7401.005A: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4/input0
=>的 12.2-1.4
到同一个USB集线器上的另一个端口:
[68647.925092] generic-usb 0003:0C45:7401.005C: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3/input0
=>的 12.2-1.3
现在使用以前使用的usb集线器上的usb集线器:
[68740.715518] generic-usb 0003:0C45:7401.005E: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4/input0
=>的 12.2-1.4.4
长话短说:
内核消息始终包含物理USB设备位置的唯一路径(请参阅之前的粗体文本)。是否有可能通过libusb在用户空间中获得这条“路径”?我用struct usb_bus
和struct usb_device
尝试了很多东西,但我总是没有成功。
我需要这个来识别这些usb温度计中的多个,因为它们没有唯一的序列号,有时它们只是在运行时“重新连接”,因此它们会得到不同的usb id。所以我认为识别它们的唯一方法是通过物理位置。
感谢您的帮助,
最诚挚的问候 凯文M。
-edit -
目前我使用以下代码搜索我的USB设备:
usb_dev_handle *find_lvr_winusb() {
struct usb_bus *bus;
struct usb_device *dev;
for (bus = usb_busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (dev->descriptor.idVendor == VENDOR_ID &&
dev->descriptor.idProduct == PRODUCT_ID ) {
usb_dev_handle *handle;
if(debug) {
printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n", VENDOR_ID, PRODUCT_ID);
printf("INFO: %d\n", dev->bus->location);
printf("INFO: %d %s\n", bus->location, bus->dirname);
}
if (!(handle = usb_open(dev))) {
printf("Could not open USB device\n");
return NULL;
}
return handle;
}
}
}
return NULL;
}
但是使用此代码我无法获得唯一的物理位置ID。 bus->location
返回一个整数(bus-> dirname包含相同的字符串),这不是唯一的。我知道usb有一个层次结构,在dmesg
我可以看到这个层次结构路径。
使用libusb我只能得到总线ID(?)和一些设备ID。但他们没有帮助我,因为我需要识别这些温度传感器中的两个或更多个。当温度传感器复位连接(每5到60秒)并且总线ID不唯一时,device-id总是会改变。不幸的是,温度传感器没有唯一的序列号。
所以我认为物理路径是识别设备的唯一方法。
祝你好运 凯文M。
答案 0 :(得分:6)
自libusb 1.0.12以来,他们引入了libusb_get_port_path(),并在1.0.16中将其替换为libusb_get_port_numbers(),允许您查询总线拓扑。
答案 1 :(得分:3)
sysfs结构路径的总体概述:
1-1.3:1.0
|_usb root hub - bus number - 1
|_ port number - 1 of root hub
|_port number - 3 of intermediate hub
|_current configuration number - 1
|_ current interface number - 0
更多信息here
答案 2 :(得分:0)
有可能,like here。
只扫描所有总线上的所有USB设备。当你找到所需的VID / PID时 - 这就是你的设备。
或者你可以做得更简单:编写一个udev规则,当你附加设备时,它会创建像/ dev / thermoX这样的符号链接。您需要的只是打开/ dev / thermoX。