handler用于处理input_event,device是发送input_event事件的设备,首先我们看一下有哪些device及handler(部分)
input_register_handler 对应 input_dev_list
cpu-boost cpu-boost.c
sysrq sysrq.c
leds input-leds.c
evdev evdev.c
kgsl adreno.c
...
input_register_device 对应 input_handler_list
gpio-keys gpio_keys.c
atmle_mxt_ts atmel_maxtouch_ts.c
qpnp_pon qpnp-power-on.c
...
input相关的初始化接口主要有两个input_register_handler/input_register_device 通过input_dev_list和input_handler_list两个链表将dev与handler进行绑定,一个dev对应多个handler,一个handler对应多个dev
list_for_each_entry(handler, &input_handler_list, node)
input_attach_handler(dev, handler);
list_for_each_entry(handler, &input_handler_list, node)
input_attach_handler(dev, handler);
input_register_handler向系统中注册了一下接口 (kernel/msm-4.19/include/linux/input.h)
struct input_handler {
void *private;
void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
void (*events)(struct input_handle *handle,
const struct input_value *vals, unsigned int count);
bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
bool (*match)(struct input_handler *handler, struct input_dev *dev);
int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
void (*disconnect)(struct input_handle *handle);
void (*start)(struct input_handle *handle);
bool legacy_minors;
int minor;
const char *name;
const struct input_device_id *id_table;
struct list_head h_list;
struct list_head node;
};
下面看一下handler中的这些函数都是在哪里被用到的,注册的时候调用handler的id_table/connect/match
input_attach_handler -> input_match_device -> input_match_device_id(通过handler->id_table与dev的id进行匹配)
-> handler->match(match为空或者调用handler的match进行匹配)
-> handler->connect (匹配成功后会再connect中做handler和device的绑定)
-> input_open_device(其中会有标志handle->open++ input_event中会用到)
以下是支持所有设备的id_table,evdev_ids对应evdev,因为match all devices所有基本所有的events都会到这处理
static const struct input_device_id evdev_ids[] = {
{
.driver_info = 1 }, /* Matches all devices */
{
}, /* Terminating zero entry */
};
上报事件中过程中调用handler的filter/events/event
input_event -> input_handle_event -> input_pass_values -> (其中会遍历handler list(h_list))
-> input_to_handler (主要是对应handler的三个api)
(1)handler->filter 过滤event,如果filter成功则会直接return(因此也可以在kernel中去做键值隐射)
(2)handler->events 处理events的函数,同下
(3)handler->event 当events不存在时调用event
handler最终都会通过evdev来处理,通过__pass_event写入缓冲区,以供上层evdev_read读取事件。