内核input子系统之events填充数据过程

从前面可知道如果有events是优先调用的,那么我直接看events好了,其中,我们首先获取到handle,拿到handle后我们就可以拿到client缓冲区了,用于填充要上报的数据,之前是暂存到input device后通过指针传递过来的。最终events是如何填充数据的,实际上是先获取evdev,因为获取了evdev后,我们是可以获取到缓冲区的,拿到client缓冲区,我们通过evdev_pass_values完成数据填充:

填充数据的方式是:

evdev_pass_values (struct evdev_client *client,const struct input_value*vals, unsigned int count,ktime_t mono, ktime_t real)这里直接将数据重新封装成event数据包对象,然后调用__pass_event(client,&event);直接将数据包对象丢到buffer[client->head++],这里是head++,而我们应用程序read的时候是从buffer[client->tail++]读取数据,形成的是一种一个给数据,一个取数据的模式,接下来需要注意的是:我们for循环结束表示数据已经封装完成,且已经填充到了缓冲区那么,此时如果我们调用的input_sync调用的类型是EV_SYN,code是SYN_REPORT的话就会去唤醒队列,最终可以让用户读取数据,具体内核实现:

evdev_pass_values具体实现



输入子系统框架总结:

首先的话是我们核心层的,执行的时候会注册我们的设备号,然后在handler层注册input_handler,也就是evdev_handler会注册到核心层维护的链表中,这些都是内核帮你完成的,然后再device层我们需要做硬件初始化获取数据,而且需要将我们的设备注册到链表中,注册进来就就会遍历input_handler_list链表,找到对应的handler,匹配成功后会调用connect方法,connect就会帮我们分配出evdev,evdev就记录了input_handler和input_device之间的关系,还会帮我们创建设备节点,还会注册cdev从而可以让应用调用,然后当我们应用程序调用open,read等接口的时候就会调用input_handler层实现的xxx_open,那么这个open就会帮你分配好evdev_client,最终在input_dev层上报数据的时候会自动调用input_handler,这个里面就会调用events填充上报的数据到缓冲区client,此时如果没有唤醒队列的话应用read的时候会阻塞,而唤醒队列后最终使用copy_to_user来给应用数据。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值