31.驱动--输入子系统

linux input输入子系统分析《一》:初识input输入子系统_比特人生的专栏-CSDN博客_linux 输入子系统

linux input输入子系统分析《四》:input子系统整体流程全面分析_比特人生的专栏-CSDN博客

12.Linux之输入子系统分析(详解) - 诺谦 - 博客园

大神们的帖子已经把输入子系统的原理过程细节讲得很清楚,俺用自己理解捋一下过程加深印象,具体的代码就请看大神们的帖子。

        一)一个字符设备驱动,需要经历1.构造file_operations结构体,2.使用注册函数注册字符设备,3.对结构体中断open、read、write等函数指针进行填充,编写具体的硬件细节4.在字符设备下创建字符设备节点。输入子系统也是需要进行这些基本的步骤,只不过为了普适性,把上述步骤进行拆分,再通过一系列的操作重现。

        二)子系统把共性的部分提取出来,做成input_hanlder驱动处理,这部分只是单纯的软件处理,提供接口给驱动设备,处理驱动设备传过来的数据,不涉及硬件操作。

        三)差异的部分做成做成不同的驱动设备input_dev,这部分仅对不同的设备进行硬件操作,获取数据,通过handler提供的接口传送数据,不涉及数据的处理问题。

        四)把配对的hanlder和dev联系起来,就完成了一个完成的字符设备驱动的编写。输入子系统通过input.c内的核心部分进行连接。核心里会调用

err = register_chrdev(INPUT_MAJOR, "input", &input_fops); //注册驱动

注册一个名为“input”的字符设备,主设备号INPUT_MAJOR=13,注册了设别就会有file_operations,但此时file_operations内除了open,没有任何东西.

这个open不是用来打开设备的,仅仅是一个中介,它查询是否存在匹配的新挂载的设备子设备号和驱动列表中对应的驱动,如果存在则把中介的file_operatons替换成在驱动列表中找到的驱动的file_operations,该file_operations就是实际驱动使用的file_operations结构体。通过这个新的file_operations,就可以操作设备

        五)新挂载的设备子设备号和驱动列表的内容是怎么给核心input.c?如何知道他们的匹配情况?

驱动列表的内容通过input_register_handler ()函数放入,将驱动处理程序input_handler注册到input_table[]中,然后放在input_handler_list链表中。于是驱动列表的值存在了。

新挂载的设备子设备号通过input_register_device()函数获取,将要注册的input_dev驱动设备放在input_dev_list链表中。于是设备的子设备号存在了。

在input_register_device() 中,会查一遍input_handler_list里面的值,逐个提出来,调用input_attach_handler()函数把驱动表中驱动的值跟设备的子设备号匹配,如果配对成功,则进行连接。

同理input_register_handler ()也会进行同样的操作,查一遍input_dev_list链表中设备的子设别号,逐个提出来,调用input_attach_handler()函数把设备的子设备号和驱动表中驱动的值匹配,如果配对成功,则进行连接。

        六)匹配的过程

input_attach_handler()函数对设备的子设备号和驱动表中驱动的值配对,配对成功,调用connect函数,connect函数中会调用 input_register_handle()函数,根据handler和device传入的类容在“input”字符设备下面创建字符设备节点

        自此,一个字符设备驱动的所有要素都齐全。

 七)程序员要做什么?程序员需要把具体的驱动设备给写出来并注册进内核,让内核拿去跟驱动列表进行配对。仅列出步骤,具体函数以及参数百度就好。

第一步:分配一个input_dev结构体

第二步:设置结构体能做哪类事件,以及这些事件下的什么操作

第三步: 把分配的结构体注册进内核。内核会自行配对

第四步:硬件相关,如初始化、硬件操作获取数据

第五步:上报事件,把获取的数据传上去。具体的操作处理输入子系统会自己做。上报完事件后记得添加input_sync()函数进行同步,否则内核不知道是否上报完毕。

退出时不要忘记在出口把所有注册的资源删掉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值