input_handler 是输入子系统的主要数据结构,一般将其称为handler处理器,表示对输入事件的具体处理。input_handler 为输入设备的功能实现了一个接口,输入事件最终传递到handler 处理器,handler 处理器根据一定的规则,然后对事件进行处理,具体的规则将在下面详细介绍。
关键数据结构
struct input_dev 物理输入设备的基本数据结构,包含设备相关的一些信息
struct input_handler 事件处理结构体,定义怎么处理事件的逻辑
struct input_handle 用来创建 input_dev 和 input_handler 之间关系的结构体
input_handler 结构体
input_handler 是输入设备的事件处理接口,为处理事件提供一个统一的函数模板,程序员应该根据具体的需要实现其中的一些函数,并将其注册到输入子系统中。该结构体的定义如下:
C/C++代码
- struct input_handler {
- void *private;
- void (*event)(struct input_handle *handle, unsigned int type,
- unsigned int code, int value);
- 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);
- const struct file_operations *fops;
- int minor;
- const char *name;
- const struct input_device_id *id_table;
- const struct input_device_id *blacklist;
- struct list_head h_list;
- struct list_head node;
- };
input_handle 结构体
input_register_handle()函数用来注册一个新的 handle 到输入子系统中。input_handle 的主要功能是用来连接 input_dev 和 input_handler。其结构如下:
C/C++代码
- struct input_handle {
- void *private;
- int open;
- const char *name;
- struct input_dev *dev;
- struct input_handler *handler;
- struct list_head d_node;
- struct list_head h_node;
- };
注册input_handler
input_register_handler()函数注册一个新的 input handler 处理器。这个 handler 将为输入设备使用,一个 handler 可以添加到多个支持它的设备中,也就是一个 handler 可以处理多个输入设备的事件。函数的参数传入简要注册的 input_handler 指针,该函数的代码如下:
C/C++代码
- int input_register_handler(struct input_handler *handler)
- {
- struct input_dev *dev;
- int retval;
-
- retval = mutex_lock_interruptible(&input_mutex);
- if (retval)
- return retval;
-
- INIT_LIST_HEAD(&handler->h_list);
-
- if (handler->fops != NULL) {
- if (input_table[handler->minor >> 5]) {
- retval = -EBUSY;
- goto out;
- }
- input_table[handler->minor >> 5] = handler;
- }
-
- list_add_tail(&handler->node, &input_handler_list);
-
- list_for_each_entry(dev, &input_dev_list, node)
- input_attach_handler(dev, handler);
- input_wakeup_procfs_readers();
- out:
- mutex_unlock(&input_mutex);
- return retval;
- }
注册input_handle
input_handle 是用来连接input_dev和input_handler的一个中间结构体。事件通过input_handle 从 input_dev 发送到 input_handler,或者从 input_handler 发送到 input_dev 进行处理。在使用 input_handle 之前,需要对其进行注册,注册函数是 input_register_handle()。
注册函数 input_register_handle()
input_register_handle()函数用来注册一个新的 handle 到输入子系统中。该函数接收一个input_handle 类型的指针,该变量要在注册前对其成员初始化。input_register_handle()函数的代码如下:
C/C++代码
- int input_register_handle(struct input_handle *handle)
- {
- struct input_handler *handler = handle->handler;
- struct input_dev *dev = handle->dev;
- int error;
-
-
-
-
-
- error = mutex_lock_interruptible(&dev->mutex);
- if (error)
- return error;
-
-
-
-
-
- if (handler->filter)
- list_add_rcu(&handle->d_node, &dev->h_list);
- else
- list_add_tail_rcu(&handle->d_node, &dev->h_list);
-
- mutex_unlock(&dev->mutex);
-
-
-
-
-
-
-
- list_add_tail_rcu(&handle->h_node, &handler->h_list);
-
- if (handler->start)
- handler->start(handle);
-
- return 0;
- }
结点 1、2、3 表示input_dev设备,其通过input_dev->node变量连接到全局输入设备链input_dev_list中.结点4、5、6表示input_handler处理器,其通过input_handler->node连接到全局handler处理器链表input_handler_list中。结点7是一个input_handle的结构体,其用来连接input_dev和input_handler。input_handle的dev成员指向了对应的input_dev设备,input_handle的handler成员指向了对应的 input_handler。外结点7的input_handle另设备,通过d_node连接到了结点2的input_dev上的h_list链表上。另一方面,结点7的input_handle通过h_node连接到了结点5的input_handler的h_list链表上。通过这种关系,input_dev将和input_handler联系了起来。