蜕变成蝶:Linux设备驱动之按键设备驱动

在上述的驱动系列博客中,我们已经了解了关于阻塞和非阻塞、异步通知、轮询、内存和I/O口访问、并发控制等知识,按键设备驱动相对来说是比较简单的,本章内容可以加深我们对字符设备驱动架构、阻塞与非阻塞、中断定时器等相关知识的理解。在嵌入式的系统中,按键的硬件原理简单,就是通过一个上拉电阻将处理器的外部中断引脚拉高,电阻的另一端接按钮并接地就可以实现。

1.按键的确认流程如下

2 按键驱动中的有关数据结构

2.1 按键设备结构体以及定时器

2.2 按键硬件资源、键值信息结构体

2.3 按键设备驱动文件操作结构体

3 按键设备的模块加载和卸载函数

3.1 加载函数

3.2 卸载函数

3.3 中断申请函数

3.4 中断释放函数

4 按键设备驱动中断和定时器处理程序

在按键按下之后,将发生中断,在中断处理程序中,应该先关闭中断进去查询模式,延时以消抖如下中断处理过程只有顶半部,没有底半部。

4.1 中断处理程序

4.2 定时器处理流程

按键按下时,该按键将记录字啊缓冲区,同时定时器启动延时,每次记录新的键值时,等待队列被唤醒,其代码如下。

5 打开和释放函数

这里主要是设置keydev.head和keydev.tail还有按键事件函数指针keyEvent的值,按键设备驱动的打开、释放函数如下:

6 读函数

读函数主要是提供对按键设备结构体缓冲区的读并复制到用户空间,当keydev.head != keydev.tail时,说明缓冲区有数据,使用copy_to_user()函数拷贝到用户空间,反之根据用户空间是阻塞还是非阻塞读分为以下两种情况:

  • 非阻塞读:没有按键缓存,直接返回- EAGAIN;
  • 阻塞读:在keydev.wq等待队列上睡眠,直到有按键记录 到缓冲区后被唤醒。

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 1 收藏 评论

关于作者:李辉

湖南省天杰信息技术有限公司创始人之一,主要从事基站智能门禁锁、智能蓝牙锁、智慧商城等等的研发。在2015年1月完成《24小时学通Linux内核》的写作,目前其关于嵌入式Linux 驱动的写作仍在进行中。 个人主页 · 我的文章 · 2 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部