HID 子系统架构与源码总览

HID 子系统架构与源码总览

1. 目标

HID 将 USB、Bluetooth、I2C、虚拟用户态等不同传输统一为报告模型,并向上提供:

  • Linux input:键盘、鼠标、触控、游戏手柄;
  • hidraw:不解释的原始报告;
  • hiddev:USB 专用旧接口;
  • 专用 HID driver;
  • LED、力反馈、电池、传感器等功能。

2. 分层

1
2
3
4
5
6
7
8
9
10
11
12
13
Userspace
├─ evdev / input
├─ /dev/hidrawN
├─ /dev/uhid
└─ /dev/usb/hiddevN
|
HID Core: hid-core + hid-input + hid-quirks
|
HID Driver: generic / multitouch / vendor-specific
|
Low-level transport: usbhid / i2c-hid / hidp / uhid / sensor hub
|
USB / I2C / Bluetooth / userspace transport

3. 核心对象

结构 作用
hid_device 一台 HID 逻辑设备
hid_driver HID 总线驱动
hid_ll_driver USB/I2C/UHID 等传输操作
hid_report_enum Input/Output/Feature report 集合
hid_report 一个 report ID 的布局
hid_field 位段及逻辑/物理范围
hid_usage Usage Page + Usage ID 语义
hid_input HID 到 input_dev 的映射

4. 枚举链

1
2
3
4
5
6
7
8
9
10
11
12
13
transport probe
-> hid_allocate_device()
-> fill bus/vendor/product/name/phys/ll_driver
-> hid_add_device()
-> ll_driver->parse(): fetch report descriptor
-> hid_scan_report(): determine group
-> device_add() to hid_bus_type
-> HID driver match/probe
-> report_fixup (optional)
-> hid_parse_report()/hid_open_report()
-> hid_hw_start()
-> ll_driver->start()
-> hid_connect(INPUT/HIDRAW/HIDDEV/DRIVER)

5. 输入链

1
2
3
4
5
6
7
8
9
10
USB URB / I2C IRQ / HIDP packet / UHID write
-> hid_input_report()
-> driver->raw_event()
-> hid_report_raw_event()
-> hidraw_report_event()
-> parse fields and usages
-> driver->event()/report()
-> hidinput_report_event()
-> input_event()/input_sync()
-> evdev userspace

6. 输出链

LED、rumble、Feature 报告通过:

1
2
3
4
input/driver/hidraw
-> hid_hw_request() / hid_hw_raw_request() / hid_hw_output_report()
-> hid_ll_driver
-> USB control/interrupt OUT, I2C command, Bluetooth transaction...

7. 驱动匹配

hid_device_id 可匹配 bus、group、vendor、product。专用驱动可提供:

  • match
  • probe/remove
  • report_fixup
  • input_mapping/input_mapped
  • raw_event/event/report
  • PM 回调。

没有专用驱动时由 hid-generic 处理。

8. RK3588 重点

  • USB 键鼠/手柄:usbhid
  • 蓝牙键鼠/手柄:Bluetooth HIDP;
  • I2C HID 触摸屏/触控板能力:i2c-hid-of(本树 RK3588 DTS 未见标准 hid-over-i2c 实例);
  • 多点触控:hid-multitouch
  • Android/容器代理:UHID;
  • rockchip_linux_defconfig 开启 HIDRAW、UHID、MULTITOUCH、USB HIDDEV、I2C_HID_OF 和 HID 电池。

HID 本身一般不直接绑定 RK3588 SoC compatible;平台相关性主要来自 USB host、I2C controller、GPIO IRQ、电源和板级 DT。

文章互动

阅读 --

留言

0 条留言

正在加载留言…