使用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

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安全之Web攻击

    一.SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态 ...

  2. 【转】java.util.Arrays.asList 的用法

    DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(20)-权限管理系统-根据权限获取菜单

    系列目录 不知不觉到20讲,真是漫长的日子,可惜最近工作挺忙,要不可以有更多的时间来更新,多谢大家的一路支持.如果你觉得好,记得帮我点击推荐^-^ 我们在之前已经插入一些真实数据,其中包含了一个用户和 ...

  4. 【目录】本博客其他.NET开源项目文章目录

    本博客所有文章分类的总目录链接:本博客博文总目录-实时更新 1.本博客其他.NET开源项目文章目录 37..NET平台开源项目速览(17)FluentConsole让你的控制台酷起来 36..NET平 ...

  5. MUI APP关于页面之间的传值,plusready和自定义事件

    最近在用MUI开发这个APP,发现有时候这个plusready不起作用,表现在,这个页面如果重复打开,这个plusready就进不去,然后上一个页面传过来的值,就没法接收了.这个经过MUI官方确认,是 ...

  6. TCP四种计时器

    TCP共使用以下四种计时器,即重传计时器.坚持计时器.保活计时器和时间等待计时器 .这几个计时器的主要特点如下:      1.重传计时器      当TCP发送报文段时,就创建该特定报文段的重传计时 ...

  7. Gatekeeper Pattern 把关(守门人)模式

    Protect applications and services by using a dedicated host instance that acts as a broker between c ...

  8. 【QuickHit项目实例】

    关于java面向对象QuickHit项目实例 Game类:用来得到随机出现的字符串(随机打印的字符串,然后玩家进行输入字符串) public class Game { private String s ...

  9. PHP学习笔记:输入一句话,实现单词倒序输出

    约定:句子以空格为词语分割符号,以句号为结束符号. 实现思路: 用函数explode(separator,string,limit)对字符串进行分割,再对得到的数据最后一个成员分割切掉符号.用一个新的 ...

  10. mysql中,sleep进程过多,如何解决?

    睡眠连接过多,会对mysql服务器造成什么影响? 严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃. 造成睡眠连接过多的原因? 1. 使用了太多持久连接(个人觉得,在高并 ...