input输入子系统实际上实现了普通的驱动中的注册设备register_chrdev,和struct file_operations
这些都是由evdev.c tsdev.c joydev.c mousedev.c keyboard.c等实现的
/* 1. 分配一个input_dev结构体 */
dev = input_allocate_device();;
/* 2. 设置 */
/* 2.1 能产生哪类事件 */
set_bit(EV_xxx, dev->evbit);
/* 2.2 能产生这类操作里的哪些事件: L,S,ENTER,LEFTSHIT */
set_bit(KEY_xxx, dev->keybit);
/* 3. 注册 */
input_register_device(buttons_dev);// 这里实际上就是register_chrdev和分配了struct file_operations
// 1. INIT_LIST_HEAD(&handler->h_list) 让input_handler的h_list指向自己,也就是一个空的循环链表
// 2. list_add_tail(&dev->node, &input_dev_list);
// 3. list_for_each_entry(handler, &input_handler_list, node)
//搜寻input_handler_list的链表的成员node,node是input_dev的node
//但是input_handler里也有这个成员,实际上就是用作input_dev搜寻用过的,并把struct input_dev *dev返回
// 4. input_attach_handler(dev, handler)
// 通过id_table,调用input_match_device函数,把input_handler与input_dev做匹配
// 建立handler dev id三者之间的联系
// input_match_device(handler->id_table, dev);
// handler->connect(handler, dev, id)
// input_handle指向对应的input_handler和input_dev
// input_register_handle(&evdev->handle)
// 比如说handler指向evdev_handler,在evdev_handler这个函数里会实现evdev_handler->fops
// 这样就不用register_chrdev( major, name, struct file_operations *fops)
// 5. connect之后
// 硬件触发 → 上报事件input_event 对于buttons.c是其中断函数 → input core层【/drivers/input/input.c】 →
// event_handlers层 input_handler()【比如buttons.c是evdev.c】 → /dev/input/xxx
/* 4. 硬件相关的操作 */
//对于buttons是注册中断函数,并在中断函数中上报事件
这些都是由evdev.c tsdev.c joydev.c mousedev.c keyboard.c等实现的
/* 1. 分配一个input_dev结构体 */
dev = input_allocate_device();;
/* 2. 设置 */
/* 2.1 能产生哪类事件 */
set_bit(EV_xxx, dev->evbit);
/* 2.2 能产生这类操作里的哪些事件: L,S,ENTER,LEFTSHIT */
set_bit(KEY_xxx, dev->keybit);
/* 3. 注册 */
input_register_device(buttons_dev);// 这里实际上就是register_chrdev和分配了struct file_operations
// 1. INIT_LIST_HEAD(&handler->h_list) 让input_handler的h_list指向自己,也就是一个空的循环链表
// 2. list_add_tail(&dev->node, &input_dev_list);
// 3. list_for_each_entry(handler, &input_handler_list, node)
//搜寻input_handler_list的链表的成员node,node是input_dev的node
//但是input_handler里也有这个成员,实际上就是用作input_dev搜寻用过的,并把struct input_dev *dev返回
// 4. input_attach_handler(dev, handler)
// 通过id_table,调用input_match_device函数,把input_handler与input_dev做匹配
// 建立handler dev id三者之间的联系
// input_match_device(handler->id_table, dev);
// handler->connect(handler, dev, id)
// input_handle指向对应的input_handler和input_dev
// input_register_handle(&evdev->handle)
// 比如说handler指向evdev_handler,在evdev_handler这个函数里会实现evdev_handler->fops
// 这样就不用register_chrdev( major, name, struct file_operations *fops)
// 5. connect之后
// 硬件触发 → 上报事件input_event 对于buttons.c是其中断函数 → input core层【/drivers/input/input.c】 →
// event_handlers层 input_handler()【比如buttons.c是evdev.c】 → /dev/input/xxx
/* 4. 硬件相关的操作 */
//对于buttons是注册中断函数,并在中断函数中上报事件