使用POLL机制代替linux输入子系统(input subsystem)之按键输入和LED控制中的异步通知,实现同样的效果。

1.代码

只简单修改input_subsys_test.c, input_subsys_drv.c不变

input_subsys_test.c

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <poll.h>
  6. #include <signal.h>
  7. #include <sys/types.h>
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10.  
  11. #include <linux/input.h>
  12.  
  13. int fd;
  14.  
  15. void my_signal_fun(int signum)
  16. {
  17. struct input_event buttons_event, leds_event;
  18.  
  19. /* [cgw]: 异步通知产生时返回的数据 */
  20. read(fd, &buttons_event, sizeof(struct input_event));
  21.  
  22. /* [cgw]: 打印事件类型,事件码,事件值 */
  23. printf("type: 0x%x code: 0x%x value: 0x%x\n",
  24. buttons_event.type,
  25. buttons_event.code,
  26. buttons_event.value);
  27.  
  28. /* [cgw]: 返回的是KEY_L或KEY_S值 */
  29. if (buttons_event.code == KEY_L || buttons_event.code == KEY_S) {
  30. /* [cgw]: 按键弹起 */
  31. if (buttons_event.value == ) {
  32.  
  33. /* [cgw]: 构造一个EV_LED事件 */
  34.  
  35. //leds_event.type = EV_SND;
  36. leds_event.type = EV_LED;
  37. //leds_event.code = SND_BELL;
  38. leds_event.code = LED_MUTE;
  39.  
  40. /* [cgw]: KEY_L和KEY_S控制LED的亮灭 */
  41. if (buttons_event.code == KEY_L) {
  42. leds_event.value = 0xAA;
  43. } else if (buttons_event.code == KEY_S) {
  44. leds_event.value = 0xEE;
  45. }
  46.  
  47. /* [cgw]: 发送LED控制事件 */
  48. write(fd, &leds_event, sizeof(struct input_event));
  49.  
  50. printf("led write!\n");
  51. }
  52. }
  53. }
  54.  
  55. int main(int argc, char **argv)
  56. {
  57. int ret, arg;
  58. struct pollfd fds[];
  59.  
  60. fd = open("/dev/event1", O_RDWR | O_NONBLOCK);
  61.  
  62. //printf("fd = 0x%x\n", fd);
  63.  
  64. if (fd < )
  65. {
  66. printf("can't open!\n");
  67. }
  68.  
  69. /* [cgw]: 设置文件标识符 */
  70. fds[].fd = fd;
  71. /* [cgw]: 设置应用程序要响应的事件 */
  72. fds[].events = POLLIN;
  73.  
  74. while ()
  75. {
  76. /* [cgw]: 休眠5S */
  77. ret = poll(fds, , );
  78.  
  79. /* [cgw]: 唤醒或超时 */
  80. printf("wake up!\n");
  81. if (ret == )
  82. {
  83. printf("time out\n");
  84. }
  85. else
  86. {
  87. my_signal_fun(arg);
  88. }
  89. }
  90.  
  91. return ;
  92. }

2. 实验

2.1

安装驱动程序:

insmod input_subsys_drv.ko

  1. # insmod input_subsys_drv.ko
  2. input: input_subsys_dev as /class/input/input1
  3. input subsys open!
  4. input subsys init!

运行应用程序

./input_subsys_test

  1. # ./input_subsys_test
  2. wake up!
  3. type: 0x1 code: 0x26 value: 0x1
  4. wake up!
  5. type: 0x1 code: 0x26 value: 0x0
  6. led event!
  7. value: 0xaa
  8. led write!
  9. wake up!
  10. type: 0x11 code: 0x7 value: 0xaa
  11. wake up!
  12. type: 0x1 code: 0x1f value: 0x1
  13. wake up!
  14. type: 0x1 code: 0x1f value: 0x0
  15. led event!
  16. value: 0xee
  17. led write!
  18. wake up!
  19. type: 0x11 code: 0x7 value: 0xee
  20. wake up!
  21. type: 0x1 code: 0x1c value: 0x1
  22. wake up!
  23. type: 0x1 code: 0x1c value: 0x0
  24. wake up!
  25. time out
  26. wake up!
  27. time out

3. 现象分析

按一下按键KEY_L,终端输出:

  1. wake up!
  2. type: 0x1 code: 0x26 value: 0x1
  3. wake up!
  4. type: 0x1 code: 0x26 value: 0x0
  5. led event!
  6. value: 0xaa
  7. led write!
  8. wake up!
  9. type: 0x11 code: 0x7 value: 0xaa

poll机制的更多相关文章

  1. 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制

    实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...

  2. Linux学习 :中断处理机制 & poll机制

    中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务 的程序中去,服务完毕后再返回去继续运行被暂时中断的程序 ...

  3. 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

  4. 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制

    linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...

  5. poll机制分析

    更多文档:http://pan.baidu.com/s/1sjzzlDF linux poll/select用法及在字符驱动中的简单实现 1.poll和select 使用非阻塞I/O 的应用程序常常使 ...

  6. poll机制分析[转]

    所有的系统调用,基于都可以在它的名字前加上"sys_"前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的内核函数为:sys_open ...

  7. 8.中断按键驱动程序之poll机制

    本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢.之前的测试程序是这样: ) { read(fd, &key_val, ); printf(" ...

  8. 字符设备驱动(六)按键poll机制

    title: 字符设备驱动(六)按键poll机制 tags: linux date: 2018-11-23 18:57:40 toc: true --- 字符设备驱动(六)按键poll机制 引入 在字 ...

  9. Linux驱动之poll机制的理解与简单使用

    之前在Linux驱动之按键驱动编写(中断方式)中编写的驱动程序,如果没有按键按下.read函数是永远没有返回值的,现在想要做到即使没有按键按下,在一定时间之后也会有返回值.要做到这种功能,可以使用po ...

随机推荐

  1. php修改

    做出一张表,点击登录后进入此表   然后多建立一个<td></td>用来增加一列操作 <h1>英雄联盟英雄表</h1> <table width= ...

  2. js倒计时-倒计输入的时间

    计算指定时间到指定时间之间相差多少天.时.分.秒. 节日.活动.商城常用. 原理: 主要使用到时间戳,也就是从1970 年 1 月 1 日 到指定时间的毫秒数. 1. 求出毫秒差 :当两个时间直接进行 ...

  3. JMeter压力测试

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...

  4. IOC的理解

    转载http://www.cnblogs.com/xdp-gacl/p/4249939.html 很不错的文章,虽说是java的,但是.net也通用,所以复制一分,拿来看看挺不错的. 1.1.IoC是 ...

  5. springmvc环境搭建以及常见问题解决

    1.新建maven工程 a)  打开eclipse,file->new->project->Maven->Maven Project b)  下一步 c)   选择创建的工程为 ...

  6. ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】

    Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实现了IServer接口的所有类型以及对应对象的统称,如下面 ...

  7. Bagging与随机森林算法原理小结

    在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...

  8. 6.JAVA之GUI编程Action事件

    功能:单击一个按钮实现关闭窗口: import java.awt.*; import java.awt.event.*; public class StudyAction { // 定义该图形所需的组 ...

  9. 深入理解CSS过渡transition

    × 目录 [1]定义 [2]过渡属性 [3]持续时间[4]延迟时间[5]时间函数[6]多值[7]阶段[8]触发[9]API 前面的话 通过过渡transition,可以让web前端开发人员不需要jav ...

  10. STemwin汉字显示

    硬件环境: STM32F429,电容屏800X480 5点触控RGB屏幕 ,SPI flash: 软件环境: UCOSIII,STemwin: 汉字显示方法: 1.在SPIflash中装在字库XBF_ ...