- input子系统三大主要结构体
![]()
- (一)struct input_handler
struct input_handler {
- /*表示驱动特定的数据*/
- void *private;
- /*event()处理函数,这个函数将被输入子系统调用去处理发送给设备的事件*/
void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
- bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
bool (*match)(struct input_handler *handler, struct input_dev *dev);
- /*connect用来连接handler和input_dev*/
- int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
- /*disconnect用来断开handler和input_dev*/
- void (*disconnect)(struct input_handle *handle);
void (*start)(struct input_handle *handle);
const struct file_operations *fops;
int minor;
const char *name;
- /*id_table表示驱动能够处理的表*/
- const struct input_device_id *id_table;
- /*链表h_list,表示与这个input_handler相联系的下一个handler*/
- struct list_head h_list;
- /*链表node,将其连接到全局的input_handler_list链表中,所有的input_handler都连接在其上*/
- struct list_head node;
};
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); // 放入链表
// 对于每个input_dev,调用input_attach_handler
list_for_each_entry(dev, &input_dev_list, node)
input_attach_handler(dev, handler); // 根据input_handler的id_table判断能否支持这个input_dev
input_wakeup_procfs_readers();
out:
mutex_unlock(&input_mutex);
return retval;
}
(二)
struct input_dev
struct input_dev {
const char *name;
const char *phys;
const char *uniq;
struct input_id id;
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
- unsigned long evbit[NBITS(EV_MAX)]; // 表示能产生哪类事件
unsigned long keybit[NBITS(KEY_MAX)]; // 表示能产生哪些按键 unsigned long relbit[NBITS(REL_MAX)]; // 表示能产生哪些相对位移事件, x,y,滚轮 unsigned long absbit[NBITS(ABS_MAX)]; // 表示能产生哪些绝对位移事件, x,y unsigned long mscbit[NBITS(MSC_MAX)]; unsigned long ledbit[NBITS(LED_MAX)]; unsigned long sndbit[NBITS(SND_MAX)]; unsigned long ffbit[NBITS(FF_MAX)]; unsigned long swbit[NBITS(SW_MAX)];
...........}
(三)struct input_handle
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;
};
三者之间的关系