You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:18:13