我在C / C ++中使用libudev与hidraw子系统枚举并与自定义HID设备通信 - 运行良好。我的设备被分配了特定的USB插头,并且它们可以热插拔" - 我需要知道哪个插头连接到每个hidraw设备。 usb和hidraw子系统之间是否存在对应关系以及如何获取详细说明接口路由的usb路径(如:/ dev / bus / usb / 002/001 而不是hidraw路径)每个设备来自其hidraw设备指针?
答案 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/DDD
(BBB
和DDD
)从设备节点获取总线地址(sudo udevadm info -a -p $(sudo udevadm info -q path -n /dev/hidraw0)
和ATTRS{busnum}=="BBB"
)有点难看
是使用ATTRS{devnum}=="DDD"
获取libudev
中特定设备节点的总线编号BBB和设备编号DDD的代码,即/dev/
它使用/dev/hidraw0
在udev_device_get_sysattr_value(dev, "devnum"));
和DDD
获取/dev/bus/usb/BBB/DDD
以获取udev_device_get_sysattr_value(dev, busnum"));
你也可以从BBB
(sysfs
)获得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_00quirks 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集线器上的实际端口号不会传递到上游,即使这样做,也不会在上游传递它。在同一集线器端口中的插入/电源重置。