Android input device/handler的处理

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_listinput_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读取事件。

猜你喜欢

转载自blog.csdn.net/qq_40405527/article/details/130830500