Input Core:设备、Handler 与生命周期

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()

  1. 校验 repeat;
  2. 清理不可能的 capability bits;
  3. 分配 vals
  4. 设置 device name/minor/type;
  5. device_add()
  6. 加入全局 device list;
  7. 对所有 handler执行 input_attach_handler()
  8. 唤醒 /proc/bus/input/devices poll。

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
2
3
4
5
6
input_unregister_device()
-> mark going_away
-> disconnect/release pressed keys
-> handler->disconnect() for every handle
-> remove global list/device model
-> put_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。

文章互动

阅读 --

留言

0 条留言

正在加载留言…