厂商专用 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.c、hid-ft260.c、hid-mcp2221.c 将 HID vendor protocol 暴露为 I2C/GPIO/UART 等内核子系统。启用后远不止 input,权限与移除并发要按总线控制器看待。
8. 绑定判断
1 | readlink /sys/bus/hid/devices/DEVICE/driver |
不要只看 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 或其它专用驱动。
正在加载留言…