嵌入式Linux下hidapi无法识别设备的问题排查求助
问题描述
我有一个连接到嵌入式Linux设备的USB实时时钟(RTC),该RTC通过I2C访问,而I2C通过USB暴露。我通过PyMCP2221A模块访问RTC,该模块依赖cython-hidapi模块,后者与hidapi库交互。
在新的Linux构建中,cython-hidapi突然无法识别设备,且我找不到任何可能导致此问题的变更。
旧构建测试结果
执行命令:
root@intel-corei7-64:~# python3 -c "import hid; print(hid.enumerate());"
返回结果:
[ {'path': b'1-5:1.2', 'vendor_id': 1240, 'product_id': 221, 'serial_number': '', 'release_number': 256, 'manufacturer_string': '', 'product_string': '', 'usage_page': 0, 'usage': 0, 'interface_number': 2}, {'path': b'1-2:1.0', 'vendor_id': 1008, 'product_id': 654, 'serial_number': '', 'release_number': 16644, 'manufacturer_string': '', 'product_string': '', 'usage_page': 0, 'usage': 0, 'interface_number': 0}, {'path': b'1-2:1.1', 'vendor_id': 1008, 'product_id': 654, 'serial_number': '', 'release_number': 16644, 'manufacturer_string': '', 'product_string': '', 'usage_page': 0, 'usage': 0, 'interface_number': 1}, {'path': b'1-2:1.2', 'vendor_id': 1008, 'product_id': 654, 'serial_number': '', 'release_number': 16644, 'manufacturer_string': '', 'product_string': '', 'usage_page': 0, 'usage': 0, 'interface_number': 2} ]
新构建测试结果
执行相同命令返回:
[]
系统设备识别情况
两种构建中,系统都能正常识别该设备,执行命令:
root@intel-corei7-64:~# udevadm info /dev/ttyACM0
返回信息:
P: /devices/pci0000:00/0000:00:15.0/usb1/1-5/1-5:1.0/tty/ttyACM0 N: ttyACM0 S: serial/by-id/usb-Microchip_Technology_Inc._MCP2221_USB-I2C_UART_Combo-if00 S: serial/by-path/pci-0000:00:15.0-usb-0:5:1.0 E: DEVLINKS=/dev/serial/by-id/usb-Microchip_Technology_Inc._MCP2221_USB-I2C_UART_Combo-if00 /dev/serial/by-path/pci-0000:00:15.0-usb-0:5:1.0 E: DEVNAME=/dev/ttyACM0 E: DEVPATH=/devices/pci0000:00/0000:00:15.0/usb1/1-5/1-5:1.0/tty/ttyACM0 E: ID_BUS=usb E: ID_MODEL=MCP2221_USB-I2C_UART_Combo E: ID_MODEL_ENC=MCP2221\x20USB-I2C\x2fUART\x20Combo E: ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series USB xHCI E: ID_MODEL_ID=00dd E: ID_PATH=pci-0000:00:15.0-usb-0:5:1.0 E: ID_PATH_TAG=pci-0000_00_15_0-usb-0_5_1_0 E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller E: ID_REVISION=0100 E: ID_SERIAL=Microchip_Technology_Inc._MCP2221_USB-I2C_UART_Combo E: ID_TYPE=generic E: ID_USB_CLASS_FROM_DATABASE=Miscellaneous Device E: ID_USB_DRIVER=cdc_acm E: ID_USB_INTERFACES=:020201:0a0000:030000: E: ID_USB_INTERFACE_NUM=00 E: ID_USB_PROTOCOL_FROM_DATABASE=Interface Association E: ID_VENDOR=Microchip_Technology_Inc. E: ID_VENDOR_ENC=Microchip\x20Technology\x20Inc. E: ID_VENDOR_FROM_DATABASE=Microchip Technology, Inc. E: ID_VENDOR_ID=04d8 E: MAJOR=166 E: MINOR=0 E: SUBSYSTEM=tty E: USEC_INITIALIZED=2305363
已确认PyMCP2221A和cython-hidapi版本未变更,问题似乎出在hidapi本身,但无法确定。
补充:尝试hidapitester工具,执行hidapitester --list在两个Linux构建中都无返回,即使旧构建中hid.enumerate()能识别设备也是如此。
可能原因与调试步骤
1. hidapi后端差异
hidapi在Linux下有多个后端:libusb、hidraw、udev。新构建可能默认使用了不同的后端,导致设备枚举失败:
- 检查旧构建和新构建中hidapi的编译配置,确认是否启用了相同的后端。
- 强制指定后端测试:在Python代码中设置环境变量
os.environ['HIDAPI_BACKEND'] = 'libusb'后再调用hid.enumerate()。
2. Udev规则权限问题
虽然系统能识别设备,但hidapi可能需要访问/dev/hidraw*设备节点,新构建的udev规则可能未正确设置权限:
- 查看新构建中是否存在
/dev/hidraw相关节点:ls /dev/hidraw* - 对比新旧构建的udev规则,手动添加针对MCP2221的hidraw权限规则(如
/etc/udev/rules.d/99-mcp2221.rules):SUBSYSTEM=="hidraw", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00dd", MODE="0666" - 添加后重新加载udev规则:
udevadm control --reload-rules && udevadm trigger
3. USB内核驱动绑定问题
MCP2221的HID接口可能被其他内核驱动占用,导致hidapi无法访问:
- 查看设备的USB接口绑定情况:
lsusb -t,找到MCP2221对应的设备(vendor 04d8, product 00dd),检查各接口的驱动绑定状态。 - 若HID接口被
usbhid驱动占用,尝试解绑(替换路径为实际的HID接口路径,对应旧构建中hid.enumerate()返回的path值):echo -n "1-5:1.2" > /sys/bus/usb/drivers/usbhid/unbind
4. hidapi库版本或编译参数变化
虽然cython-hidapi版本未变,但系统中的hidapi系统库可能在新构建中更新或编译参数不同:
- 对比新旧构建中hidapi库的版本:
ldd $(which python3) | grep hidapi - 检查新构建中hidapi库是否缺失依赖:
ldd /usr/lib/libhidapi.so - 尝试重新编译安装hidapi库,确保编译参数与旧构建一致。
5. 内核配置差异
新构建的Linux内核可能禁用了hidapi所需的功能:
- 检查内核是否启用了
CONFIG_HIDRAW、CONFIG_USB_HID、CONFIG_LIBUSB等相关选项。 - 对比新旧构建的内核配置文件,查找差异项。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

