【Linux】输入子系统通俗讲解

      在字符设备驱动程序里,当我们要调用某个设备驱动的时候需要在应用层做open(“dev/buttons”,O_RDWR)类似的打开操作,这时候需要明确知道“dev/buttons”。但是在实际的开发过程中,应用层不会这么明确的写,比如Qt程序,那么应该如何处理?就要使用Linux现成的驱动:输入子系统

       在字符设备里,我们需要自己指定major主设备号、file_operation结构体、在入口出口函数中注册和注销这个结构体。而在输入子系统中,这些都是现成的系统写好的。

       分析一下系统是如何在输入子系统中实现上面那些操作的:input.c里input_init函数中注册一个file_operation结构体register_chrdev(MAJOR,”input”,&input_fops);而在input_fops中却只有一个open函数。所有的工作就在这个open函数中实现:在open函数里input_open_file里根据打开的次设备号得到一个input_handler的结构体,新的file_operation结构体new_fops = handler.fops,最后file就可以使用这新的结构体……

       这么描述太过于复杂。总结来说,输入子系统是一个人字形的结构。左边是硬件操作,右边是软件操作(或者说驱动),先说右边:例如keyboard.c,mousedev.c这些文件都有一个input_handler结构体,结构体内有一个id_table参数,用于匹配硬件的,后面会用到。设置完成后通过input_register_handler向上注册到输入子系统,最后放入一个链表中ist_add_tail(&handler->node, &input_handler_list)。左边的硬件操作也大致同样的操作:注册一个input_device结构体,向上注册input_register_device,最后放入链表中list_add_tail(&dev->node, &input_dev_list);当硬件插入的时候,回去比较id_table,匹配成功时会调用.connect函数将两边进行链接。

       这一过程像极了相亲,首先双方都不认识,男方假设是硬件,女方是软件。

      第一:他们要分别实现自己的人生硬性指标:比如说男方要有房有车,女方要文武双全。 =>分配一个input_handler结构体,实现功能函数。

      第二:有了这些自己的指标之后就要提自己的择偶标准 => 设置id_table

      第三:这些条件和标准不能只跟自己说,不然谁会帮你找到合适的对象?你得告诉红娘 =>向上注册input_register_handler

      第四:红娘肯定手里不止一个业务,你只是她匹配库里的一个数据 =>放入链表list_add_tail

      第五:当红娘找到适合你的对象时,会把双方的微信联系方式告诉对方 => 建立连接.connect

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林零七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值