Linux输入子设备框架
/***文章前言篇*****/
第一次在公众号上写文章,心情肯定是比较激动的。开个公众号对于我个人而言的主要的目的并不是为了宣传什么或者是增加人气什么的,主要的原因是我平时关注了很多不错的公众号,他们每天的推文都能够或多或少的给我带来一些收获,所以本人也是想贡献出一点绵薄之力,能够让更多的人在订阅号这块受益,同时也培养自己写文章的一些功底,有不足的地方还请大家多多指正!好了下面来我们今天的一个话题linux的输入子设备:
对于linux这块跟大家坦白,我现在确实也是一个小白,因为我平时一直使用的都是单片机,可以说就是裸板程序吧,今年年中才开始学习linux,也没有参加什么培训机构,自己花点时间摸索着,网上资源非常的丰富,个人觉得知识应该都能学到手,最后可能相比更加专业的工程师项目实战方面应该会不足,对于目前不以这项技能为生的我而言,没什么影响吧,目前纯属兴趣和学习阶段。
/***Linux输入子设备框架*****/
首先Linux的最重要的概念是“一切皆是文件”,那么驱动也是同样的概念,那么重要的Open(),write(),Read()函数就是提供给上层的接口,这三个函数在我们进行window程序设计里面读写文件可能经常用到,简单的来说,如果用户调用这些接口我们只要能够返回或者去配置硬件用户想要的效果就可以了,那么最简单的就是字符设备驱动程序框架:
1)注册一个FileOperations结构体,这个结构体里面就包括了Open、Read、Write等接口函数;
2)我们需要使用入口函数和出口函数来告诉内核;
3)在我们的入口函数中使用registerchildDev函数来告诉内核并注册这个驱动程序。
那么平时我们应用程序调用Open这些函数就会最终调用驱动函数的Open等,来完成驱动外设的效果。
同理对于我们的输入子设备系统其实其核心也是遵循这样的操作原则,但是内核提供了一套更加完整的驱动程序框架, 也便于使用linux内核进行驱动开发时能够更好的扩展不同硬件类似输入的驱动程序。
/***Linux输入子设备框架详述*****/
我使用的是大部分初学者使用的linux2.6.22的内核,输入子设备的入口函数在driver中的input.c中的input_init()函数:
首先同样会去注册一个File_Operation结构体,而这结构体只有Open一个重要的程序函数,那么其主要的工作也就是Open函数里面实现,在该Open函数里面从input_table中找到对应的input_handler,应用程序以后调用的都是input_handler里面的Open/Write/Read,可以说input_handler是纯软件上的实现。
那么怎么与我们的硬件结合形成驱动程序?
我们的输入设备是存在很多种类的,比如说虚拟出键盘,可以是几个按钮,可以是触摸的等等,我们需要把他们统一抽象出来为键盘的功能,唯一的区别只是输入的形式有所不同罢了,那么这个keyboard就可以单独成为一类inputHandler。
同理我么是不是也可以输入device作为不同类来进行注册呢?答案当然是可以的,也就是说同一个设备可以支持多种处理形式即多个inputhandler,同理一个inputhandler可以支持多种device,这样就形成了一种相互注册的关系,同时也需要建立一种联系。
我们在注册一种device的时候需要去索引所有handler是否支持,如果支持就加入到device的记录中(所谓的记录在大部分程序里面都是使用加入到device管理的链表中),同时会通过handle这个结构体建立device和handler的关系。
通过各自注册我们就可以通过关系来进行相互的功能上的调用和消息的传递,最终满足上层用户的需求:
配置外设或者写入流向:input->>inputhander->>inputdevice;
读取上报流向:inputdevice->>inputhander->>input
例如我们硬件上产生中断,然后便会在其中断服务函数里面通过inputdev这个结构体上报给handler的event,然后event进行对应的处理来是的用户调用的read/write来执行响应的动作。
/***Linux输入子设备框架学习感受*****/
个人觉得对应linux的最大的魅力就是把特别多的进行了分层和抽象,我们只需要了解其驱动的结构和框架便可以尽快的加入我们的外设驱动程序来供用户进行响应的开发。
今天有修护最后一个bug吗?我们明天见!