一.Input子系统组成
输入子系统由驱动层(Drivers),输入子系统核心层(Input Core),和事件处理层(Event Handler)三部分组成。一个输入事件,如鼠标移动,键盘按下等都是通过Driver -> Input Core -> Eventhandler ->userspace的顺序到达用户空间传个应用程序。
二.Input设备驱动编写
三.Input子系统核心
Input设备注册的接口:input_register_device()
int input_register_device(struct input_dev *dev)
{
___set_bit(EV_SYN, dev->evbit);
list_add_tail(&dev->node, &input_dev_list);
list_for_each_entry(handler, &input_handler_list, node)
input_attach_handler(dev, handler);
这里是重点,将input device挂到input_dev_list链表上,然后对每一个挂在input_handler_list链表上的handler调用input_attach_handler()。这里就好比设备模型中device和driver的匹配。所有的input device都挂在input_dev_list上,所有的handler都挂在input_handler_list上。
}
看一下这个匹配过程,是在input_attach_handler()中进行的:
static int input_attach_handler(input_dev *dev, struct input_handler *handler)
{
id = input_match_device(handler, dev);
if (!id)
return -ENODEV;
error = handler->connect(handler, dev, id);
}
调用input_match_device()匹配,如果匹配成功,则调用handler->connect().具体看看匹配过程:
static const struct input_device_id *input_match_device(struct input_handler *handler, struct input_dev *dev)
{
}