厂商专用 HID 驱动与 Quirk 机制

厂商专用 HID 驱动与 Quirk 机制

1. 为什么需要专用驱动

真实设备经常:

  • report descriptor 错误;
  • 使用 vendor usage page;
  • report 长度/ID 非标准;
  • 需要初始化命令;
  • 有电池、LED、FF、触摸板等扩展;
  • 同一 USB receiver 聚合多个逻辑设备。

2. 两级修正

Core quirk

hid-quirks.c 按 bus/VID/PID 设置 HID_QUIRK_*,例如:

  • NOGET
  • NO_INIT_REPORTS
  • ALWAYS_POLL
  • MULTI_INPUT
  • HIDINPUT_FORCE
  • HIDDEV_FORCE
  • INCREMENT_USAGE_ON_DUPLICATE

专用驱动

通过 hid_driver 回调:

  • report_fixup() 修 descriptor;
  • input_mapping() 改 usage;
  • raw_event() 解私有 report;
  • probe() 执行握手;
  • remove() 清资源;
  • PM 恢复协议状态。

3. 动态 quirk

Core 支持模块参数/动态列表覆盖设备 quirk,适合临时验证。量产应尽量形成明确 VID/PID 修复,并评估是否会影响同 ID 不同硬件版本。

4. 驱动族

驱动 主要能力
hid-logitech-dj Unifying/DJ receiver 多设备
hid-logitech-hidpp HID++、电池、滚轮、功能
hid-playstation 新 PlayStation 控制器
hid-sony 较旧 Sony 设备
hid-nintendo Switch controller、IMU/LED/FF
hid-steam Steam Controller
hid-apple Fn/键盘布局、设备 quirk
hid-microsoft Microsoft 键鼠特殊键
hid-wiimote-* Wii Remote 子模块
hid-roccat-* 游戏外设

5. Receiver

无线 receiver 常在一个物理 USB HID 上复用多个设备。专用驱动可能创建 child HID device,并用 report ID/device index 路由。生命周期必须保证 receiver 断开时先停止 child I/O。

6. 游戏手柄

常见扩展:

  • rumble/force feedback;
  • RGB/player LED;
  • battery;
  • accelerometer/gyro;
  • touchpad;
  • unique MAC/serial;
  • firmware version。

hid-sony 与新 hid-playstation 可能覆盖不同产品,不能仅按厂商名同时强制绑定。

7. 桥接设备

hid-cp2112.chid-ft260.chid-mcp2221.c 将 HID vendor protocol 暴露为 I2C/GPIO/UART 等内核子系统。启用后远不止 input,权限与移除并发要按总线控制器看待。

8. 绑定判断

1
2
3
readlink /sys/bus/hid/devices/DEVICE/driver
cat /sys/bus/hid/devices/DEVICE/modalias
modprobe -c | grep 'hid:b'

不要只看 lsusb 推断实际 driver;同一 USB interface 的 usb driver 是 usbhid,而其上 HID bus driver 可能是 hid-generic 或厂商驱动。

9. 风险

  • fixup 固定 offset 未检查 descriptor size;
  • raw_event 长度未检查;
  • 同步 Feature request 卡死;
  • remove 与 work/timer 并发;
  • battery/LED work 在断开后访问 transport;
  • 过宽 ID table 抢占 generic 或其它专用驱动。

文章互动

阅读 --

留言

0 条留言

正在加载留言…