linux / libusb 获取usb设备路径

Posted

技术标签:

【中文标题】linux / libusb 获取usb设备路径【英文标题】:linux / libusb get usb device path 【发布时间】:2012-12-26 03:09:27 【问题描述】:

我使用 libusb 来枚举一些 USB 设备。现在我想获得“设备路径”。我认为它不叫usb device-path,因为我在google上没有成功。

如果我将 USB 设备与 linux 连接,我会在 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_busstruct usb_device 尝试了很多东西,但我总是不成功。

我需要这个来识别这些 USB 温度计中的多个,因为它们没有唯一的序列号,有时它们只是在运行时“重新连接”,所以它们得到不同的 USB ID。所以我认为识别它们的唯一方法是通过物理位置。

感谢您的帮助,

最好的问候 凯文 M.

-编辑-

目前我使用以下代码搜索我的 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 不唯一时,设备 ID 始终会更改。不幸的是,温度传感器没有唯一的序列号。

所以我认为物理路径是识别设备的唯一方法。

最好的问候 凯文 M.

【问题讨论】:

【参考方案1】:

从 libusb 1.0.12 开始,他们引入了 libusb_get_port_path(),并在 1.0.16 中将其替换为libusb_get_port_numbers(),它允许您查询总线拓扑。

【讨论】:

libusb_get_device_address 用于/dev/input/eventX libusb.sourceforge.net/api-1.0/…【参考方案2】:

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

【讨论】:

这是 Linux 特定的。 libusb 1.0.16 中实现的 libusb_get_port_numbers() 适用于任何平台,甚至是 Windows。 @mvp:您是指任何版本的 Windows 吗?但它似乎不适用于 XP sp3。这是我的问题github.com/libusb/libusb/issues/113。你能给我一些建议吗?【参考方案3】:

有可能,like here。

只需扫描所有总线上的所有 USB 设备。当您找到所需的 VID/PID 时,这就是您的设备。

或者你可以做更简单的事情:编写一个 udev 规则,当你连接你的设备时,它会创建像 /dev/thermoX 这样的符号链接。之后您只需要打开所需的 /dev/thermoX。

【讨论】:

是的,但我有 2 个或更多设备具有相同的 VIP 和 PID。设备完全相同。所有的id都是一样的。唯一的区别是它们连接的端口。 /dev/bus/usb:目录是集线器和其中的文件——设备。 谢谢。我试过了,但还有另一个问题:文件名是设备ID。重新连接设备时,设备 ID 始终会增加。不幸的是,USB设备一直在重新连接而没有做任何事情。我不知道目录名称到底是什么,因为如果我连接一个 USB 集线器,那么我只会在子目录中获得一个新文件,而不是一个新目录。 很难识别完全相同的设备。 不幸的是:-(我认为使用dmesg 中打印的硬件路径很容易做到这一点,但我找不到为struct usb_device 获取此路径的方法。

以上是关于linux / libusb 获取usb设备路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中获取 Linux 上 USB 驱动器的路径?

USB开发——内核USB驱动+libusb开发方法

如何使用 libusb 在 node.js 中将数据发送到 USB 设备

libusb 未列出的 USB/IP 仿真设备

libusb简介

Linux下使用C语言和libusb开发USB HID