输入设备框架1—应用层—完整的代码工程
来源:互联网 发布:yymodel 数组转模型 编辑:程序博客网 时间:2024/05/16 19:50
输入设备框架
应用层输入设备框架的头文件在#vi /usr/include/linux/input.h
type:是事件类型,都在这个头文件里有描述
如EV_KEY按键事件类型
type:设备类型。可以设置为:
#defineEV_SYN 0x00 表示设备支持所有的事件 哨兵事件,当驱动层一个事件的所有数据包都发送完了,就会发送一个哨兵事 件表示这次的事件处理完成
#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键盘事件
监测鼠标
滚轮上下方向移动,鼠标移动
- 输入设备框架1—应用层—完整的代码工程
- 输入设备框架—驱动层—完整的代码工程
- 字符设备驱动框架3:深入探讨—完整的驱动代码工程
- 平台总线驱动框架1—完整的代码工程
- mui框架输入代码块激活字符,怎么快速生成代码块的完整代码
- 完整的简单层拖动代码
- 完整的struts2框架应用实例
- Android6.0的phone应用源码分析(6)——RIL层框架分析
- Android6.0的phone应用源码分析(7)——RIL层框架分析2
- Android6.0的phone应用源码分析(7)——RIL层框架分析2
- 工厂模式的应用——SSM框架中DAO层工厂
- linux设备驱动之输入(input)子系统——核心层实现
- 【深度学习框架Caffe学习与应用】第五课 自定义神经层和数据输入层
- Cordova学习——使用jquery框架+device设备插件完整过程
- 创建webx框架的web应用工程
- TrueCrypt代码 之 应用层通过磁盘设备名打开磁盘设备
- MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码
- 应用框架的设计与实现——.NET平台(4.3 SAF代码分析.源码1)
- 一个在线音乐软件的故事(一、故事的由来)
- 【CUGBACM15级BC第26场 A】hdu 5158 Have meal
- CF808B
- 1002.数字分类
- STL中容器操作的迭代器失效-erase()函数陷阱
- 输入设备框架1—应用层—完整的代码工程
- CodeForces 830C 浅谈奇妙题
- 【CUGBACM15级BC第26场 B】hdu 5159 Card
- NOI2017酱油记(伪)
- The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced
- php设计模式--单例模式
- docker初识:运行mysql实例
- NYOJ【113】字符串替换【字符串】
- python 获取股票数据