Linux下测试键盘鼠标触摸屏触摸板


  在Linux或者Android-x86系统下,会用到测试键盘、鼠标、触摸屏、触摸板等各种输入设备的功能,那么下面的这段代码是个好的选择。首先编写了个Linux输入设备的测试小程序来检测问题所在,测试结果发现没有校正,总算也小有成就。接下来应该再dig触摸屏的校正问题。

  现在把写的测试程序放上来供大家参考:代码中宏定义KEY_DEV、MOU_DEV、TOUS_DEV、TOUP_DEV是Linux下键盘,鼠标,触摸屏和触摸板的设备文件路径,对于不同的系统和机器可能有所不同,大家可以用cat /proc/bus/input/devices查看自己机器的设备文件。

   用gcc -o outfilename filename编译生成可执行文件。如你将代码保存为test.c,那么你可以用gcc -o test test.c来编译连接。然后在目录下使用./test运行文件,www.bkjia.com注意修改生成的可执行文件权限,不想修改权限的用sudo ./test。目前还没加入测试过程中切换测试设备的功能,只能用CTRL+Z结束程序,再重新执行文件。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/input.h>
#define KEY_DEV "/dev/input/event5"
#define MOU_DEV "/dev/input/event6″
#define TOUS_DEV "/dev/input/event7″
#define TOUP_DEV "/dev/input/event11″

static int ts_fd = -1;
static struct input_event data;

static int init_device(char *TS_DEV)
{
      if((ts_fd = open(TS_DEV, O_RDONLY)) < 0)
      {
            printf("Error open %s\n\n", TS_DEV);
            return -1;
       }
       return ts_fd;
}

static int test_key()
{
       if(init_device(KEY_DEV) < 0)
             return -1;
       while(1)
       {
             read(ts_fd, &data, sizeof(data));
             if (data.type == EV_KEY)
                   printf(" type: EV_KEY, event = %d, value = %d\n",data.code, data.value);
        }
        return 0;
}

static int test_mouse()
{
        if(init_device(MOU_DEV) < 0)
              return -1;
        while(1)
        {
              read(ts_fd, &data, sizeof(data));
              if (data.type == EV_KEY)
              {
                     printf(" type = EV_KEY, code = %s, value = %d\n",
                         data.code == BTN_LEFT ? "MOUSE_LEFT" :
                         data.code == BTN_RIGHT ? "MOUSE_RIGHT" :
                         data.code == BTN_MIDDLE ? "MOUSE_MIDDLE" :
                         data.code == BTN_SIDE ? "MOUSE_SIDE" :
                       "Unkonw", data.value);
               }
               else if(data.type == EV_REL)
               {
                      printf(" type = EV_ABS, code = %s, value = %d\n",
                          data.code == REL_X ? "ABS_X" :
                          data.code == REL_Y ? "ABS_Y" :
                          data.code == ABS_WHEEL ? "MOUSE_WHEEL" :
                          data.code == ABS_PRESSURE ? "ABS_PRESSURE" :
                        "Unkown", data.value);
                }
         }
         return 0;
}

static int test_touch_screen()
{
        if(init_device(TOUS_DEV) < 0)
               return -1;
        while(1)
        {
               read(ts_fd, &data, sizeof(data));
               if (data.type == EV_KEY)
               {
                       printf(" type: EV_KEY, event = %s, value = %d\n\n",
                         data.code == BTN_TOUCH ? "BTN_TOUCH" : "Unkown", data.value);
                }
                else if(data.type == EV_ABS)
                {
                        printf(" type: EV_ABS, event = %s, value = %d\n\n",
                          data.code == ABS_X ? "ABS_X" :
                          data.code == ABS_Y ? "ABS_Y" :
                          data.code == ABS_PRESSURE ? "ABS_PRESSURE" :"Unkown", data.value);
                 }
         }
         return 0;
}

static int test_touch_pancel()
{
         if(init_device(TOUP_DEV) < 0)
               return -1;
         while(1)
         {
                read(ts_fd, &data, sizeof(data));
                if (data.type == EV_KEY)
                {
                       printf(" type = EV_KEY, code = %s, value = %d\n",
                         data.code == BTN_LEFT ? "MOUSE_LEFT" :
                         data.code == BTN_RIGHT ? "MOUSE_RIGHT" :
                         data.code == BTN_MIDDLE ? "MOUSE_MIDDLE" :
                         data.code == BTN_SIDE ? "MOUSE_SIDE" :
                          "Unkonw", data.value);
                 }
                 else if(data.type == EV_REL)
                 {
                        printf(" type = EV_ABS, code = %s, value = %d\n",
                           data.code == REL_X ? "ABS_X" :
                           data.code == REL_Y ? "ABS_Y" :
                           data.code == ABS_WHEEL ? "MOUSE_WHEEL" :
                           data.code == ABS_PRESSURE ? "ABS_PRESSURE" :
                             "Unkown", data.value);
                  }
         }
         return 0;
}

int main()
{
         static int i;
select:  

         printf("Please select device:\n0.KeyBoard\n1.Mouse\n2.TouchScreen\n3.TouchPanel\n\Your choice is:");
         scanf("%d",&i);
         switch(i){
        case 0:
               test_key();
               break;
        case 1:
               test_mouse();
               break;
        case 2:
               test_touch_screen();
               break;
        case 3:
               test_touch_pancel();
               break;
        default:
               printf("Wrong device, Please select again!\n\n");
               break;      
          }
          goto select;
          return 0;
}

关于Input设备,说明:

(1)ls -l /dev/input,得到设备名称和属性,注意此处没有input号这种Input层分配的内容,以event为主。如:

# ls -l /dev/input
crw-rw---- root     input     13, 66 1970-01-01 00:00 event2
crw-rw---- root     input     13, 33 1970-01-01 00:00 mouse1
crwxrwxrwx root input     13, 65 1970-01-01 00:00 event1
crw-rw---- root     input     13, 32 1970-01-01 00:00 mouse0
crw-rw---- root     input     13, 64 1970-01-01 00:00 event0
crw-rw---- root     input     13, 63 1970-01-01 00:00 mice

如果这么些设备中无法确认哪个是目前在用的设备?可以采用这种方式:cat他们,然后操作鼠标或者键盘,哪个输出乱码就是用的哪个。

(2)cat /proc/bus/input/devices,主要信息是:

N: Name="s3c-keypad-rev0000"
P: Phys=s3c-keypad/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0

N: Name="S3C TouchScreen"
P: Phys=input(ts)
S: Sysfs=/class/input/input1
U: Uniq=
H: Handlers=kbd mouse0 event1

N: Name="ADXL34x accelerometer"
P: Phys=1-0053/input0
S: Sysfs=/class/input/input2
U: Uniq=
H: Handlers=mouse1 event2

分配的Input节点全在Sysfs上,真正的设备dev在Handlers上。

(3)ls -l /sys/class/input,类设备信息:

drwxr-xr-x root     root              1970-01-01 00:00 mice
drwxr-xr-x root     root              1970-01-01 00:00 input0
lrwxrwxrwx root     root            1970-01-01 00:04 event0 -> input0/event0
drwxr-xr-x root     root              1970-01-01 00:00 input1
lrwxrwxrwx root     root            1970-01-01 00:04 mouse0 -> input1/mouse0
lrwxrwxrwx root     root             1970-01-01 00:04 event1 -> input1/event1
drwxr-xr-x root     root              1970-01-01 00:00 input2
lrwxrwxrwx root     root             1970-01-01 00:04 mouse1 -> input2/mouse1
lrwxrwxrwx root     root             1970-01-01 00:04 event2 -> input2/event2

相关内容