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



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

我认为Hidraw设备指针是指设备节点,如/dev/hidraw0或类似

Hidraw使用动态主数,这意味着应该依赖udev 以创建 Hidraw 设备节点。 Udev 通常会创建设备节点直接位于/dev 下(例如:/dev/hidraw0)。 作为这个位置 是否依赖于分布和 UDEV 规则,应用程序应使用 利布代夫定位连接到系统的HIDRAW设备。 有一个 关于利布代夫的教程,带有工作示例: http://www.signal11.us/oss/udev/

Linux有两种设备节点,一种由设备驱动程序创建,即/dev/sdb大容量存储设备和原始设备节点(如/dev/bus/usb/BBB/DDD其中BBB是总线号,DDD是设备号,由内核直接创建:

USB 设备问题

USB 设备通常有两种他们。

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

第二种设备节点(/dev/bus/usb/BBB/DDD,其中 BBB 是 总线编号和 DDD 是设备编号)创建,即使 设备没有内核驱动程序。通过使用这些"原始"USB 设备 节点,则应用程序可以与 设备,即绕过可能存在的内核驱动程序。

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

您希望在内核模块设备节点(即/dev/hidraw0)和相应的原始设备节点(即/dev/bus/usb/BBB/DDD)

您可以使用sudo udevadm info -a -p $(sudo udevadm info -q path -n /dev/hidraw0)(输出中的ATTRS{busnum}=="BBB"ATTRS{devnum}=="DDD")从设备节点获取总线地址(BBBDDD),但这有点丑陋

在 使用设备文件查找总线号和设备号 符号链接是使用libudev获取总线号 BBB 和设备号 DDD 的代码,用于/dev/中特定设备节点,即/dev/hidraw0它使用udev_device_get_sysattr_value(dev, "devnum"));来获得DDD/dev/bus/usb/BBB/DDDudev_device_get_sysattr_value(dev, busnum"));获得BBB

您也可以从sysfs(/sys/devices/ ...)获得BBB和DDD:

/sys/devices/pci0000:00/0000:00:12.2/usb2/2-5/2-5.4$ ls 2-5.4:1.0
bDevice子类配置 id产品删除授权
的 bmAttributes 描述符 id供应商序列号 avoid_reset_quirk bMaxPacketSize0 dev 制造商
速度 bcdDevice bMaxPower devnum maxchild 子系统 bConfigurationValue bNumConfigurationsdevpath
power uevent bDeviceClass bNumInterfaces 驱动程序
产品 urbnum bDeviceProtocolbusnum

ep_00

怪癖版本

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

要获取设备的 sysfs 路径(上面的/sys/devices/pci0000:00/0000:00:12.2/usb2/2-5/2-5.4),请使用sudo udevadm info -q path -n /dev/hidraw0

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

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

我相信当设备插入直接连接到 USB 控制器的 USB 端口时,您可以可靠地获得与它连接的完全相同的端口#。但是,当从上游连接到 USB 控制器的 USB 端口的下游多端口 USB 集线器执行此操作时,USB 集线器上的实际端口 # 不会传递上游,或者即使传递,它也不是同一集线器端口中插入/电源重置之间的可预测端口#。

最新更新