HID Core 设备驱动模型与生命周期
1. HID bus
hid_bus_type 定义:
.match = hid_bus_match.probe = hid_device_probe.remove = hid_device_remove.uevent = hid_uevent
sysfs modalias:
1 | hid:bBUSgGROUPvVENDORpPRODUCT |
2. 传输创建设备
1 | hid_allocate_device() |
销毁必须用 hid_destroy_device(),最终由 device release 释放。
3. add_device
hid_lookup_quirk();hid_ignore()过滤;- 检查 transport 必须实现
raw_request; ll_driver->parse()读取原始 report descriptor;hid_scan_report()初步确定 group;- 设置 HID device 名;
- debugfs 注册;
device_add()触发 driver core 匹配。
4. 匹配
hid_match_one_id() 比较:
- bus;
- group;
- vendor;
- product。
专用驱动与 generic 驱动通过 match() 和 reprobe 机制协调。专用驱动后加载时,Core 可重新探测原 generic 设备。
5. Probe
1 | hid_device_probe() |
没有自定义 probe 时:
1 | hid_open_report() |
6. Connect mask
hid_connect() 可建立:
HID_CLAIMED_INPUTHID_CLAIMED_HIDRAWHID_CLAIMED_HIDDEVHID_CLAIMED_DRIVER
非 USB 设备会屏蔽 HIDDEV。只有 raw_event 的专用驱动也可不连接其它 listener。
7. Open/close
多个上层消费者共享底层 open:
1 | hid_hw_open() |
ll_open_count 避免 input 与 hidraw 分别打开时重复启停 transport。
8. Remove
1 | hid_device_remove() |
hid_hw_stop() 先断开 input/hidraw/hiddev,再调用 transport stop()。
9. 并发
| 锁/引用 | 作用 |
|---|---|
driver_input_lock semaphore |
输入上报与 probe/remove 串行 |
ll_open_lock mutex |
底层 open count |
| device refcount | sysfs/driver core 生命周期 |
hid_device::kref |
HID 专用引用 |
driver dyn_lock |
动态 ID 列表 |
| debug list spinlock | debugfs reader |
中断上报若无法获得 driver_input_lock,hid_input_report() 返回 -EBUSY,避免 remove 与 event 并发访问已解绑驱动。
正在加载留言…