Input Core:设备、Handler 与生命周期
1. input_dev
包含:
- name/phys/uniq/id;
evbit/keybit/relbit/absbit/...能力;- key/led/snd/sw当前状态;
absinfo;- open/close/flush/event;
- users、going_away、inhibited;
- event_lock、mutex;
- handles list和事件帧缓存。
2. 分配
推荐 devm_input_allocate_device(parent)。填充 parent、能力和 callback 后调用 input_register_device()。注册成功后,非 devm对象由 input_unregister_device()释放,不能再额外 input_free_device()。
3. 注册
input_register_device():
- 校验 repeat;
- 清理不可能的 capability bits;
- 分配
vals; - 设置 device name/minor/type;
device_add();- 加入全局 device list;
- 对所有 handler执行
input_attach_handler(); - 唤醒
/proc/bus/input/devicespoll。
4. 匹配
input_handler.id_table 根据:
- bus/vendor/product/version;
- event type;
- key/rel/abs/msc/led/snd/ff/sw;
- property bits;
- handler自定义 match。
匹配后 handler->connect() 分配私有连接对象和 input_handle。
5. Handle
一个 device可连接多个 handler。handle同时挂在:
input_dev.h_list;input_handler.h_list。
input_register_handle() 建立连接;handler通常随后按用户 open情况调用 input_open_device()。
6. Open/close
input_open_device() 增加 device users,仅第一个 user调用 driver open();最后一个 input_close_device() 调 driver close()。driver可据此启停 IRQ、poll、URB或硬件。
7. Grab
input_grab_device(handle) 将 dev->grab 指向唯一 handle。之后输入只发给该 handle;release后恢复 fan-out。evdev通过 EVIOCGRAB 使用它。
8. 卸载
1 | input_unregister_device() |
going_away 阻止新的 open。disconnect前 driver应停止产生新 IRQ/work。
9. Handler 生命周期
input_register_handler() 遍历现有 devices;input_unregister_handler() 对其所有 handles调用 disconnect并移除。
10. proc/sysfs
Core暴露:
/proc/bus/input/devices/proc/bus/input/handlers/sys/class/input/inputN/{name,phys,uniq,properties}- capabilities和 ID;
- modalias/uevent。
正在加载留言…