设备驱动模型和输入子系统

嵌入式驱动中的驱动编写工作,不用设备驱动模型能不能写,可以,但是比如针对一款USB芯片,如果这款芯片有更新,大部分的驱动工作要推倒重来,代码重用率低,工作量大,所以新版linux2.6.22以后的内核版本中设计出设备驱动模型,也就是将之前单一驱动工作的拆分成三部分,USB控制器的总线控制驱动,中间桥梁作用的核心层驱动,以及设备层的设备驱动。

这样总线驱动和核心层驱动为重复性工作,不需改动,所以工作量主要体现在设备驱动层上。

总线驱动的工作主要是驱动USB控制器实现与USB设备之间的数据传输工作,中间设计USB传输协议中传输时序、规则等的协议算法,但是此时USB控制器并不知道与具体哪一个USB设备传输数据,USB集线器上除了USB控制器外,USB设备也可能不止一个,所以总线驱动在传输之前还需做一个工作,就是识别匹配待传输数据的USB设备,而设备驱动的主要工作简单来说就是自己的地址信息等一系列匹配信息打包,并且写好相关open,read等需要USB设备实现的功能函数,等待时机与总线驱动匹配。这个时机就是热插拔,也就是USB设备在插入嵌入式设备时会给CPU一个中断信号,驱使总线驱动控制的USB控制器来与USB设备之间发送握手信息,至于两方之间信息的如何匹配,就交给了中间核心层驱动来做核心层提供一个mach函数将总线驱动中的id表与USB设备中的设备信息一一核对,成功匹配后,将会调用设备驱动层之前写好的probe函数进行接下来的一一系列初始化USB设备的工作,然后就可以等待USB设备与总线时间交互数据,一旦设备传输数据过来,会发出中断信号,设备驱动中申请的中断函数中就将实现预设的功能。

到这里,驱动工作就可以说完成了,但是现在的驱动只是自娱自乐,自己接受数据自己处理,处理的结果,上层用户程序并不知道,也就无法做出反应,所以就需要一个通知系统来讲数据传达给上层用户,以供调用,这是input输入子系统就发挥了作用,而这个实现通知功能的数据结构input需要在设备驱动的probe函数中提前申请好,并初始化好,等待数据传达给上层用户,其中需要提的一点事,这个input输入子系统已经分门别类的将各类输入事件,比如鼠标发来的数据,键盘,手柄等的常用输入设备的信号封装好了,简单声明就可以轻松实现数据准确传输,为驱动工作节省了大量工作。

盗个图更清楚表达其中的逻辑,附上一些有用的USB驱动的链接
这里写链接内容
这里写链接内容
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值