您的位置:首页 > 编程语言

输入设备框架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



 

 
 
/*******************输入设备框架的:应用测试程序***********************/
//转载请注明博客原文地址: 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键盘事件





 

监测鼠标



 

滚轮上下方向移动,鼠标移动

 





 

 




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐