C / C ++如何获取USB libudev hidraw设备的usb子系统路径?

时间:2018-03-06 23:30:05

标签: c++ linux usb

我在C / C ++中使用libudev与hidraw子系统枚举并与自定义HID设备通信 - 运行良好。我的设备被分配了特定的USB插头,并且它们可以热插拔" - 我需要知道哪个插头连接到每个hidraw设备。 usb和hidraw子系统之间是否存在对应关系以及如何获取详细说明接口路由的usb路径(如:/ dev / bus / usb / 002/001 而不是hidraw路径)每个设备来自其hidraw设备指针?

2 个答案:

答案 0 :(得分:1)

我认为使用hidraw设备指针意味着设备节点,如/dev/hidraw0或类似的

  

Hidraw使用动态主编号,这意味着应该依赖udev   在on上创建hidraw设备节点。 Udev通常会创建   设备节点直接位于/ dev下(例如:/ dev / hidraw0)。作为这个位置   是分布式和udev规则相关的,应用程序应该使用   libudev找到连接到系统的hidraw设备。有一个   有关libudev的教程,其中有一个工作示例:     http://www.signal11.us/oss/udev/

linux有两种设备节点,一种由设备驱动程序创建,即/dev/sdb用于大容量存储设备,而原始设备节点如/dev/bus/usb/BBB/DDD,其中BBB是总线编号,{{} 1}}是设备编号,由内核直接创建:

  

USB设备问题

     

USB设备通常有两种设备节点   它们。

     

第一种由设备专用驱动程序创建(例如,   内核中的usb_storage / sd_mod或usblp)。例如,USB质量   存储设备将是/ dev / sdb,USB打印机将是   的/ dev / USB / LP0。这些设备节点仅在特定于设备时存在   驱动程序已加载。

     

第二种设备节点(/ dev / bus / usb / BBB / DDD,其中BBB是   即使是,也会创建总线编号和DDD(设备编号)   设备没有内核驱动程序。通过使用这些“原始”USB设备   节点,一个应用程序可以与之交换任意USB数据包   设备,即绕过可能存在的内核驱动程序。

来源:http://www.linuxfromscratch.org/blfs/view/7.10/postlfs/devices.html

您希望在内核模块设备节点(即DDD)与相应的原始设备节点(即/dev/hidraw0)之间建立链接

您可以使用输出中的/dev/bus/usb/BBB/DDDBBBDDD)从设备节点获取总线地址(sudo udevadm info -a -p $(sudo udevadm info -q path -n /dev/hidraw0)ATTRS{busnum}=="BBB")有点难看

Find bus number and device number with device file symlink中的

是使用ATTRS{devnum}=="DDD"获取libudev中特定设备节点的总线编号BBB和设备编号DDD的代码,即/dev/它使用/dev/hidraw0udev_device_get_sysattr_value(dev, "devnum"));DDD获取/dev/bus/usb/BBB/DDD以获取udev_device_get_sysattr_value(dev, busnum"));

你也可以从BBBsysfs)获得BBB和DDD:

  

/sys/devices/ ...
  bDeviceSubClass配置idProduct删除授权
  bmAttributes描述符idVendor serial   avoid_reset_quirk bMaxPacketSize0 dev制造商
  速度bcdDevice bMaxPower devnum
  maxchild subsystem bConfigurationValue bNumConfigurations devpath
  power uevent bDeviceClass bNumInterfaces driver
  产品urbnum bDeviceProtocol busnum
  ep_00

     

quirks version

来源:http://www.signal11.us/oss/udev/

获取设备的sysfs路径(上面的/sys/devices/pci0000:00/0000:00:12.2/usb2/2-5/2-5.4$ ls 2-5.4:1.0)使用/sys/devices/pci0000:00/0000:00:12.2/usb2/2-5/2-5.4

https://unix.stackexchange.com/questions/344784/how-to-map-sys-bus-usb-devices-to-dev-video

答案 1 :(得分:0)

希望这很有用,但是IIRC,您无法可靠地(插入事件之间的端口号相同)枚举从主USB控制器点向下游连接的集线器上的各个端口。我认为这是USB推出后,我们开始在MB上看到大量USB控制器的原因之一;因为在将所有内容链接到下游集线器时,除了对带宽造成负面影响外,还会导致持续的软件编号问题。

我相信,当将设备插入直接连接到USB控制器的USB端口时,您可以可靠地获得与其连接的相同端口号。但是,当从下游连接到USB控制器的USB端口的下游多端口USB集线器执行此操作时,USB集线器上的实际端口号不会传递到上游,即使这样做,也不会在上游传递它。在同一集线器端口中的插入/电源重置。