Linux之解析鼠标input事件数据

来源:互联网 发布:手机淘宝安全中心在哪 编辑:程序博客网 时间:2024/06/04 19:32

Linux中USB鼠标驱动:http://blog.csdn.net/qq_21792169/article/details/48790745

或者直接Linux自带的USB鼠标驱动。


/*  
     * 向输入子系统汇报鼠标事件情况,以便作出反应。  
     * data 数组的第0个字节:bit 0、1、2、3、4分别代表左、右、中、SIDE、EXTRA键的按下情况;  
     * data 数组的第1个字节:表示鼠标的水平位移;  
     * data 数组的第2个字节:表示鼠标的垂直位移;  
     * data 数组的第3个字节:REL_WHEEL位移。  

     * data 数组的第4个字节:中间滚轮事件。  
     */  


    input_report_key(dev, BTN_LEFT,   data[0] & 0x01);   
    input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);   
    input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);   
    input_report_key(dev, BTN_SIDE,   data[0] & 0x08);   
    input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);   
    input_report_rel(dev, REL_X,     data[1]);   
    input_report_rel(dev, REL_Y,     data[2]);   
    input_report_rel(dev, REL_WHEEL, data[3]);   


当我们写好鼠标驱动程序后,我们测试利用的是cat  /dev/event0   或者hexdump    /dev/event0  有些事在/dev/input/event*   /dev/input/mice


这是Input输入事件的上报事件的格式

struct timeval {
__kernel_time_ttv_sec;/* seconds */
__kernel_suseconds_ttv_usec;/* microseconds */
};


/*
 * The event structure itself
 */

struct input_event {
struct timeval time;          /* 固定格式,一定要理解了 */
__u16 type;
__u16 code;
__s32 value;
};

这是hexdump /dev/event0  后的数据:(非常重要的知识点)


                       秒        微秒      类           code    value
0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000            
0000010 0bb2 0000 0e54 000c 0000 0000 0000 0000
0000020 0bb2 0000 5815 000e 0001 0026 0000 0000
0000030 0bb2 0000 581f 000e 0000 0000 0000 0000  

/* 第一个字符串代表系统时间,无影响,第二和第三个字符串代表秒,第四和第五个字符串代表微妙,依次是类,类下面的那种事件,最后32位是具体值,从上面结构体我们是可以看出来的,这里要注意我们读取数据时候第一个字符串是不会读取的,我就犯了第一个错误,第二个错误我们读取数据应该从右往左读数,这满足于小端模式*/


现在开始上代码:

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <linux/input.h>#define DEV_NAME   "/dev/event2"#define DBG_PRINTF printf//#define DBG_PRINTF(...)struct input_event input_mouse;int main(int argc, char **argv){int fd,retval;fd_set readfds;fd = open(DEV_NAME, O_RDONLY);if (fd < 0){printf("can't open %s\n",DEV_NAME);return -1;}while(1){  FD_ZERO( &readfds );  FD_SET( fd, &readfds );    retval = select( fd+1, &readfds, NULL, NULL, NULL);  if(retval==0) {  printf( "Time out!\n" );  }  if(FD_ISSET(fd,&readfds)) {  read(fd, &input_mouse,sizeof(struct input_event)); switch(input_mouse.type){            case EV_KEY:{/* have key is press */switch(input_mouse.code){case BTN_LEFT:{if(input_mouse.value==1)DBG_PRINTF("the left is press!\n");}break;case BTN_RIGHT:{if(input_mouse.value==1)DBG_PRINTF("the right is press!\n");}break;case BTN_MIDDLE:{if(input_mouse.value==1)DBG_PRINTF("the middle is press!\n");}break;}} break;case EV_REL:{switch(input_mouse.code){case REL_X:{if(input_mouse.value>0)DBG_PRINTF("X slip is right!\n");else if(input_mouse.value<0)DBG_PRINTF("X slip is left!\n");}break;case REL_Y:{if(input_mouse.value<0)DBG_PRINTF("Y slip is up!\n");else if(input_mouse.value>0)DBG_PRINTF("Y slip is down!\n");}break;}}break;}}}close(fd);return 0;}




常见的事件类型:



事件类型下常见的值:定义在include/linux/input/h中


1 0