input输入子系统分析1

input_register_handler(struct input_handler *handler)

/* 1:
* 在开始的时候让input_handler的h_list指向自己,也就是一个空的循环链表,在后来注册input_handle的时候
* 让input_handle的hnode与匹配的input_handler的h_list组成一个循环链表
*/
INIT_LIST_HEAD(&handler->h_list);//INIT_LIST_HEAD(struct list_head *list)
list->next = list;
list->prev = list;

/* 2:
* 把handler->node挂到input_handler_list链表的尾部,这是个全局链表 
*/
list_add_tail(&handler->node, &input_handler_list);

/* 3:
* 搜寻input_dev_list的链表的成员node,node是input_handler的node,
* 但是input_dev里也有这个成员,实际上就是用作input_handler搜寻用过的,并把struct input_dev *dev返回 
*/
list_for_each_entry(dev, &input_dev_list, node)   // #define list_for_each_entry(pos, head, member)
for (pos = list_entry((head)->next, typeof(*pos), member),prefetch(pos->member.next);
    &pos->member != (head);
    pos = list_entry(pos->member.next, typeof(*pos), member),prefetch(pos->member.next))
for(初始;条件;更新)
/* 4: 
* 匹配并建立链接
*/
input_attach_handler(dev, handler);
const struct input_device_id *id

/* 通过id_table,调用input_match_device函数,把input_handler与input_dev做匹配 */
if (handler->blacklist && input_match_device(handler->blacklist, dev))
input_match_device(handler->id_table, dev);

/* 建立handler dev id三者之间的联系 */
handler->connect(handler, dev, id);

/* 5:
* 如果handler对应具体的evdev_handler 
*/
evdev_handler->evdev_connect(struct input_handler *handler, struct input_dev *dev,const struct input_device_id *id)
struct evdev *evdev;

 evdev->handle.dev = input_get_device(dev);//这里的handle就是input_handle,它的dev成员指向input_dev
evdev->handle.name = dev_name(&evdev->dev);
evdev->handle.handler = handler;//它的handler成员指向input_handler

input_register_handle(&evdev->handle);

/* 这个函数与input_register_handler几乎一致,而且最后结尾调用的附加函数是一样的 */    
input_register_device(struct input_dev *dev)
list_add_tail(&dev->node, &input_dev_list);
list_for_each_entry(handler, &input_handler_list, node)

/* 与input_register_device中一样调用这个函数,匹配并建立建立 */
input_attach_handler(dev, handler)

struct input_handle 
struct input_dev *dev;
    struct input_handler *handler;
    struct list_head    d_node;//链入input_dev的h_list代表的链表
    struct list_head    h_node;//链入input_handler的h_list代表的链表
    
input_register_handle(struct input_handle *handle)
    /* 把handle->d_node挂到dev->h_list的尾端 */
    list_add_tail_rcu(&handle->d_node, &dev->h_list);
    /* 把handle->h_node挂到handler->h_list的尾端 */
    list_add_tail_rcu(&handle->h_node, &handler->h_list);//上段代码的第6行的注释
  

总结:
  注册input_dev或input_handler时,会两两比较左边的input_dev和右边的input_handler,
根据input_handler的id_table判断这个input_handler能否支持这个input_dev,
如果能支持,则调用input_handler的connect函数建立"连接"
  input_register_device  → list_for_each_entry(handler, &input_handler_list, node), input_attach_handler(dev, handler) → input_register_handle
  input_register_handler → list_for_each_entry(dev, &input_dev_list, node),         input_attach_handler(dev, handler) → input_register_handle

通过input_dev,可以遍历所有与它有关的input_handler;
通过input_handler,也可以遍历所有与它有关的input_dev。
 
 可以看出,从任何一个双向箭头出发,通过handle的过度,完全实现了我们的最终目标。

  dev想要report数据的时候无非是调用了handler的event函数指针指向的函数,我们可以在这个函数里定义任何想让系统去做的任务
    
input_dev与input_handler是多对多的关系,一个dev可以对应多个handler,一个handler也可以对应多个dev
list_add_tail_rcu(&handle->d_node, &dev->h_list);
list_add_tail_rcu(&handle->h_node, &handler->h_list);
这里可以理解:比方说evdev_handler与gpio_keys建立链接,生成handle,
handle->dev,    handle->d_node←---→input_dev->hlist,
handle->handler,handle->h_node←---→input_handler->hlist
但是同时evdev_handler还可以ts等驱动建立联系,在我们的驱动中不需要关注一对多和多对多的关系,只需要关注一对一的关系

input_register_handler这个函数一般不需要我们来实现,内核里已经提供了常用的类型,如下:
如:evdev.c tsdev.c joydev.c mousedev.c keyboard.c

每一个input_dev里面都有evbit这个参数,指明是什么类型的事件,
在注册这个设备的时候,回去匹配handler,调用相应的handelr,
比如我们buttons,对于EV_EKY这样的事件,内核中的输入子系统input.c中的会调用evdev.c上报事件
这个文件里面的evdev_handler这个函数来处理EV_KEY这个事件
set_bit(EV_KEY, buttons_dev->evbit); 
set_bit(EV_REP, buttons_dev->evbit);
input_register_device(buttons_dev);
struct input_dev {
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)];


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值