输入设备框架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含义不同。
例如:
TypeEV_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_XREL_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的不同而含义不同。
例如:
TypeEV_KEY时,value: 0表示按键抬起。1表示按键按下。(4表示持续按下等?)。
TypeEV_REL时,value: 表明移动的值和方向(正负值)。
TypeEV_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 0
原创粉丝点击