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

1.代码

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

input_subsys_test.c

 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <poll.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h> #include <linux/input.h> int fd; void my_signal_fun(int signum)
{
struct input_event buttons_event, leds_event; /* [cgw]: 异步通知产生时返回的数据 */
read(fd, &buttons_event, sizeof(struct input_event)); /* [cgw]: 打印事件类型,事件码,事件值 */
printf("type: 0x%x code: 0x%x value: 0x%x\n",
buttons_event.type,
buttons_event.code,
buttons_event.value); /* [cgw]: 返回的是KEY_L或KEY_S值 */
if (buttons_event.code == KEY_L || buttons_event.code == KEY_S) {
/* [cgw]: 按键弹起 */
if (buttons_event.value == ) { /* [cgw]: 构造一个EV_LED事件 */ //leds_event.type = EV_SND;
leds_event.type = EV_LED;
//leds_event.code = SND_BELL;
leds_event.code = LED_MUTE; /* [cgw]: KEY_L和KEY_S控制LED的亮灭 */
if (buttons_event.code == KEY_L) {
leds_event.value = 0xAA;
} else if (buttons_event.code == KEY_S) {
leds_event.value = 0xEE;
} /* [cgw]: 发送LED控制事件 */
write(fd, &leds_event, sizeof(struct input_event)); printf("led write!\n");
}
}
} int main(int argc, char **argv)
{
int ret, arg;
struct pollfd fds[]; fd = open("/dev/event1", O_RDWR | O_NONBLOCK); //printf("fd = 0x%x\n", fd); if (fd < )
{
printf("can't open!\n");
} /* [cgw]: 设置文件标识符 */
fds[].fd = fd;
/* [cgw]: 设置应用程序要响应的事件 */
fds[].events = POLLIN; while ()
{
/* [cgw]: 休眠5S */
ret = poll(fds, , ); /* [cgw]: 唤醒或超时 */
printf("wake up!\n");
if (ret == )
{
printf("time out\n");
}
else
{
my_signal_fun(arg);
}
} return ;
}

2. 实验

2.1

安装驱动程序:

insmod input_subsys_drv.ko

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

运行应用程序

./input_subsys_test

 # ./input_subsys_test
wake up!
type: 0x1 code: 0x26 value: 0x1
wake up!
type: 0x1 code: 0x26 value: 0x0
led event!
value: 0xaa
led write!
wake up!
type: 0x11 code: 0x7 value: 0xaa
wake up!
type: 0x1 code: 0x1f value: 0x1
wake up!
type: 0x1 code: 0x1f value: 0x0
led event!
value: 0xee
led write!
wake up!
type: 0x11 code: 0x7 value: 0xee
wake up!
type: 0x1 code: 0x1c value: 0x1
wake up!
type: 0x1 code: 0x1c value: 0x0
wake up!
time out
wake up!
time out

3. 现象分析

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

 wake up!
type: 0x1 code: 0x26 value: 0x1
wake up!
type: 0x1 code: 0x26 value: 0x0
led event!
value: 0xaa
led write!
wake up!
type: 0x11 code: 0x7 value: 0xaa

最新文章

  1. [MapReduce] Google三驾马车:GFS、MapReduce和Bigtable
  2. Remoting and web services using Spring[摘自官网]
  3. linux-查看系统是32位还是64位
  4. ccc 旋转
  5. oracle冷备份后恢复
  6. Can&#39;t find bundle for base name ClientMessages, locale zh_CN
  7. 数往知来 AJAX Ajax增删改查&lt;十九&gt;
  8. MySQL数据库的安装
  9. js计时器。
  10. Routing(路由) &amp; Multiple Views(多个视图) step 7
  11. C++——带默认参数值的函数
  12. Activtiy完全解析(一、Activity的创建过程)
  13. 基于Servlet+jsp的web计算器
  14. Java(13) 抽象和封装
  15. mongodb突然出现不是内外部命令或可执行
  16. 清除DNS缓存(解决能上QQ但是无法上网页问题)
  17. H+ 关闭menuTab页面
  18. win 10 kms 激活 后 火狐 上 https 网站 报错
  19. 算法笔记——C/C++语言基础篇(已完结)
  20. 读取Apache访问日志,查看每一个独立客户端连接获得的字节数

热门文章

  1. xib文件的加载方法
  2. 解析大型.NET ERP系统 分布式应用模式设计与实现
  3. Android中如何使用命令行查看内嵌数据库SQLite3
  4. Vertica 业务用户指定资源池加载数据
  5. WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略
  6. RabbitMQ原理与相关操作(一)
  7. sqlserver 游标的使用
  8. C# listview 单击列头实现排序 &lt;二&gt;
  9. C#解决界面不响应
  10. Attribute操作的性能优化方式