使用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. JavaScript高级编程 (1) - javscript是什么

    <重温javascript>这是一系列 javascript 的学习笔记,部分内容摘自书本或者网络,我这里只是基于自己的理解进行了梳理整理. 一个完整的 javscript 实现是由以下3 ...

  2. Android浮层点击穿透问题

    最近做微信公众号开发的时候遇到一个问题,上线后发现此问题后检查代码没有发现问题,无奈只能回滚到上一个版本. 问题是这样的:页面一个选择的浮层,在浮层点击确定后,下面的页面会自动提交 在测试环境上无法重 ...

  3. C# windows服务制作(包括安装及卸载)

    开篇语 因工作内容需要做一个windows服务,此前并没有相关经验,所以做了一个demo来跑跑这个梗(高手跳过,需要的来踩)- 效果如下:打开服务,可以找到我们新增的一个windows服务,这个dem ...

  4. 窥探Vue.js 2.0

    title: 窥探Vue.js2.0 date: 2016-09-27 10:22:34 tags: vue category: 技术总结 --- 窥探Vue.js2.0 令人兴奋的Vue.js 2. ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户

    系列目录 由于之前做了将权限赋给角色,还需要做将角色组赋给用户,和将用户赋给角色组,一个用户可以拥有多个角色组,一个角色组包含多个用户,打开模块管理,添加一个分配的操作码 并在 角色权限设置授权给他 ...

  6. chrome控制台模拟hover、focus、active等状态,方便调试

    有时候需要调试一个网页,需要某些元素在hover.focus.active等状态. 比如hover,鼠标放到hover上,然后去控制台中找DOM,鼠标移开的时候元素就不是hover状态了. 此时可以使 ...

  7. Set容器--HashSet集合

    Set容器特点: ①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ②   最常用的两个Set接口的实 ...

  8. 总结个关于MySQL数据库的问题

    问题概括:MySQL Server has gone away? 遇到这个问题还得追溯到这次前往南通软件园出差.当天下午下班之前,主管说可能明天出差,把项目和最新的数据库备份一下,备份完成之后,也没在 ...

  9. 关于png、jpg、gif切图时的使用感悟

    关于png.jpg.gif切图时的使用感悟 曾经切图时都是一股脑所有图全切成jpg格式,最近突然心血来潮简单的研究了下其他图片格式的具体属性,才突然发现走了不少弯路,并没有做到使图片用最小体积展现出最 ...

  10. iOS 编辑UITableView(根据iOS编程编写)

    上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为  e ...