输入设备框架1—应用层—完整的代码工程
2017-08-26 21:15
375 查看
输入设备框架
应用层输入设备框架的头文件在#vi /usr/include/linux/input.h
type:是事件类型,都在这个头文件里有描述
如EV_KEY按键事件类型
type:设备类型。可以设置为:
#defineEV_SYN 0x00 表示设备支持所有的事件 哨兵事件,当驱动层一个事件的所有数据包都发送完了,就会发
4000
送一个哨兵事 件表示这次的事件处理完成
#defineEV_KEY 0x01 键盘或者按键,表示一个键码
#define EV_REL 0x02 鼠标设备,表示一个相对的光标位置结果
#defineEV_ABS 0x03 手写板产生的值,其是一个绝对整数值
#define EV_MSC 0x04 其他类型
#define EV_LED 0x11 LED灯设备
#defineEV_SND 0x12 蜂鸣器,输入声音
#define EV_REP 0x14 允许重复按键类型
#define EV_PWR 0x16 电源管理事件
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
code:值如按键事件的值是KEY_1,坐标事件的值xy相对坐标(鼠标坐标)REL_X,REL_Y,REL_Z,绝对坐标(手写板,触摸屏)ABX_X,
根据Type的不同而code含义不同。
例如:
Type为EV_KEY时,code表示键盘code或者鼠标Button值。
取值范围:
#define EV_SYN 0x00 哨兵事件
到:
#define KEY_MIN_INTERESTING KEY_MUTE
#define KEY_MAX 0x2ff
#define KEY_CNT (KEY_MAX+1)
Type为EV_REL时,code表示操作的是哪个坐标轴,如:REL_X,REL_Y。(因为鼠标有x,y两个轴向,所以一次鼠标移动,会产生两个input_event)
取值范围:
#define REL_X 0x00
#define REL_Y 0x01
#define REL_Z 0x02
#define REL_RX 0x03
#define REL_RY 0x04
#define REL_RZ 0x05
#define REL_HWHEEL 0x06
#define REL_DIAL 0x07
#define REL_WHEEL 0x08
#define REL_MISC 0x09
#define REL_MAX 0x0f
#define REL_CNT (REL_MAX+1)
Type为EV_ABS时,code表示绝对坐标轴向。
value:根据Type的不同而含义不同。
例如:
Type为EV_KEY时,value:
0表示按键抬起。1表示按键按下。(4表示持续按下等?)。
Type为EV_REL时,value: 表明移动的值和方向(正负值)。
Type为EV_ABS时,code表示绝对位置。
/*通过查看#cat/proc/bus/input/devices得到当前系统所有输入设备的列表,根据这个列表可以获得输入设备驱动的设备节点*/
键盘事件是event3
编译:cc xx.c –o xx
运行程序:监测event3键盘事件
监测鼠标
滚轮上下方向移动,鼠标移动
应用层输入设备框架的头文件在#vi /usr/include/linux/input.h
type:是事件类型,都在这个头文件里有描述
如EV_KEY按键事件类型
type:设备类型。可以设置为:
#defineEV_SYN 0x00 表示设备支持所有的事件 哨兵事件,当驱动层一个事件的所有数据包都发送完了,就会发
4000
送一个哨兵事 件表示这次的事件处理完成
#defineEV_KEY 0x01 键盘或者按键,表示一个键码
#define EV_REL 0x02 鼠标设备,表示一个相对的光标位置结果
#defineEV_ABS 0x03 手写板产生的值,其是一个绝对整数值
#define EV_MSC 0x04 其他类型
#define EV_LED 0x11 LED灯设备
#defineEV_SND 0x12 蜂鸣器,输入声音
#define EV_REP 0x14 允许重复按键类型
#define EV_PWR 0x16 电源管理事件
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
code:值如按键事件的值是KEY_1,坐标事件的值xy相对坐标(鼠标坐标)REL_X,REL_Y,REL_Z,绝对坐标(手写板,触摸屏)ABX_X,
根据Type的不同而code含义不同。
例如:
Type为EV_KEY时,code表示键盘code或者鼠标Button值。
取值范围:
#define EV_SYN 0x00 哨兵事件
到:
#define KEY_MIN_INTERESTING KEY_MUTE
#define KEY_MAX 0x2ff
#define KEY_CNT (KEY_MAX+1)
Type为EV_REL时,code表示操作的是哪个坐标轴,如:REL_X,REL_Y。(因为鼠标有x,y两个轴向,所以一次鼠标移动,会产生两个input_event)
取值范围:
#define REL_X 0x00
#define REL_Y 0x01
#define REL_Z 0x02
#define REL_RX 0x03
#define REL_RY 0x04
#define REL_RZ 0x05
#define REL_HWHEEL 0x06
#define REL_DIAL 0x07
#define REL_WHEEL 0x08
#define REL_MISC 0x09
#define REL_MAX 0x0f
#define REL_CNT (REL_MAX+1)
Type为EV_ABS时,code表示绝对坐标轴向。
value:根据Type的不同而含义不同。
例如:
Type为EV_KEY时,value:
0表示按键抬起。1表示按键按下。(4表示持续按下等?)。
Type为EV_REL时,value: 表明移动的值和方向(正负值)。
Type为EV_ABS时,code表示绝对位置。
/*通过查看#cat/proc/bus/input/devices得到当前系统所有输入设备的列表,根据这个列表可以获得输入设备驱动的设备节点*/
键盘事件是event3
/*******************输入设备框架的:应用测试程序***********************/ //转载请注明博客原文地址: http://blog.csdn.net/oyhb_1992/article/details/77606856 #include <stdio.h> #include <fcntl.h> //ioctl #include <unistd.h> //read write #include <linux/input.h> //应用层输入设备接口 static void key_handler(struct input_event *event) { printf("key: %d 0x%x",event->code,event->code); if(event->value) { printf("down\n"); }else{ printf("up\n"); } } static void rel_handler(struct input_event *event) { printf("rel_"); switch(event->code) { case REL_X: printf("x="); break; case REL_Y: printf("y="); break; case REL_WHEEL: printf("wheel="); break; default: printf("0X%x",event->code); break; } printf("%d\n",event->value); } static void abs_handler(struct input_event *event) { printf("abs_ "); switch(event->code) { case ABS_X: //理解驱动层发送一个坐标是先发送一个x坐标数据包,再发送一个y坐标数据包,所以应用层也要分别接收数据包来处理 printf("x="); break; case ABS_Y: printf("y="); break; default: printf("0X%x",event->code); break; } printf("%d\n",event->value); } int main(int argc , char ** argv) { if(argc<2) { printf("usage : cmd <input_dev node>\n"); return -1; //应用层出错就返回-1,驱动程层错误就返回错误码 } int fd = open(argv[1],O_RDWR); if(fd<0) { perror("open"); goto err_open; } struct input_event event = {0}; /*事件发生时会产生数据包,然后应用层就可以获取这个数据包,并且一个事件可能会发出多个包,如同时发出x,y坐标两个数据包*/ while(1) { read(fd,&event,sizeof(struct input_event));//读入一个事件 switch(event.type) { case EV_SYN://EV_SYN则表示一组完整事件已经完成,需要处理:哨兵事件 printf("ev_syn\n"); break; case EV_KEY://按键 key_handler(&event); break; case EV_REL://按键相对值 rel_handler(&event); break; case EV_ABS://绝对坐标,开发板的屏幕 break; default: break; } } close(fd); return 0; err_open: printf("open error\n"); return -1; }
编译:cc xx.c –o xx
运行程序:监测event3键盘事件
监测鼠标
滚轮上下方向移动,鼠标移动
相关文章推荐
- 输入设备框架—驱动层—完整的代码工程
- 字符设备驱动框架3:深入探讨—完整的驱动代码工程
- mui框架输入代码块激活字符,怎么快速生成代码块的完整代码
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-代码解析
- 移动端焦点轮播图 完整代码 bootstrap框架版本
- C#词法分析器之输入缓冲和代码定位的应用分析(二)
- 键盘由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。 (代码 19)解决方法
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范
- [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码
- 使用php的ci框架,实现微信支付(jsapi方式+完整代码)
- (键盘)代码 19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备 解决方法
- CC2640之第一个工程Simple_peripheral代码框架及学习
- MDA框架生成代码流程和图例(UML 正向工程,支持Java, C#, Ansi C++, Delphi, Perl, Php5, Python, Database,Ruby, Hibern)
- 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2. 输入控件)
- [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码
- Niagara解决设备连接应用的软件框架平台技术。
- 逆波兰计算器的C完整C代码(输入须为后缀表达式)
- 【MyBatis框架】MyBatis的逆向工程生成代码,如何生成逆向工程
- android内核字符驱动设备实战之----------运行时库层jni动态库编程(应该是应用框架层)
- 在Windows Mobile中应用智能设备框架(Smart Device Framework)