poll机制
使用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机制的更多相关文章
- 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...
- Linux学习 :中断处理机制 & poll机制
中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务 的程序中去,服务完毕后再返回去继续运行被暂时中断的程序 ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...
- 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制
linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...
- poll机制分析
更多文档:http://pan.baidu.com/s/1sjzzlDF linux poll/select用法及在字符驱动中的简单实现 1.poll和select 使用非阻塞I/O 的应用程序常常使 ...
- poll机制分析[转]
所有的系统调用,基于都可以在它的名字前加上"sys_"前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的内核函数为:sys_open ...
- 8.中断按键驱动程序之poll机制
本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢.之前的测试程序是这样: ) { read(fd, &key_val, ); printf(" ...
- 字符设备驱动(六)按键poll机制
title: 字符设备驱动(六)按键poll机制 tags: linux date: 2018-11-23 18:57:40 toc: true --- 字符设备驱动(六)按键poll机制 引入 在字 ...
- Linux驱动之poll机制的理解与简单使用
之前在Linux驱动之按键驱动编写(中断方式)中编写的驱动程序,如果没有按键按下.read函数是永远没有返回值的,现在想要做到即使没有按键按下,在一定时间之后也会有返回值.要做到这种功能,可以使用po ...
随机推荐
- JavaScript高级编程 (1) - javscript是什么
<重温javascript>这是一系列 javascript 的学习笔记,部分内容摘自书本或者网络,我这里只是基于自己的理解进行了梳理整理. 一个完整的 javscript 实现是由以下3 ...
- Android浮层点击穿透问题
最近做微信公众号开发的时候遇到一个问题,上线后发现此问题后检查代码没有发现问题,无奈只能回滚到上一个版本. 问题是这样的:页面一个选择的浮层,在浮层点击确定后,下面的页面会自动提交 在测试环境上无法重 ...
- C# windows服务制作(包括安装及卸载)
开篇语 因工作内容需要做一个windows服务,此前并没有相关经验,所以做了一个demo来跑跑这个梗(高手跳过,需要的来踩)- 效果如下:打开服务,可以找到我们新增的一个windows服务,这个dem ...
- 窥探Vue.js 2.0
title: 窥探Vue.js2.0 date: 2016-09-27 10:22:34 tags: vue category: 技术总结 --- 窥探Vue.js2.0 令人兴奋的Vue.js 2. ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户
系列目录 由于之前做了将权限赋给角色,还需要做将角色组赋给用户,和将用户赋给角色组,一个用户可以拥有多个角色组,一个角色组包含多个用户,打开模块管理,添加一个分配的操作码 并在 角色权限设置授权给他 ...
- chrome控制台模拟hover、focus、active等状态,方便调试
有时候需要调试一个网页,需要某些元素在hover.focus.active等状态. 比如hover,鼠标放到hover上,然后去控制台中找DOM,鼠标移开的时候元素就不是hover状态了. 此时可以使 ...
- Set容器--HashSet集合
Set容器特点: ① Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ② 最常用的两个Set接口的实 ...
- 总结个关于MySQL数据库的问题
问题概括:MySQL Server has gone away? 遇到这个问题还得追溯到这次前往南通软件园出差.当天下午下班之前,主管说可能明天出差,把项目和最新的数据库备份一下,备份完成之后,也没在 ...
- 关于png、jpg、gif切图时的使用感悟
关于png.jpg.gif切图时的使用感悟 曾经切图时都是一股脑所有图全切成jpg格式,最近突然心血来潮简单的研究了下其他图片格式的具体属性,才突然发现走了不少弯路,并没有做到使图片用最小体积展现出最 ...
- iOS 编辑UITableView(根据iOS编程编写)
上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为 e ...