zoukankan      html  css  js  c++  java
  • 6410键盘应用程序的开发

    硬件电路分析




    内核配置支持输入子系统及其键盘驱动



    查看/dev/input/eventX是什么类型的事件,
    cat /proc/bus/input/devices
    I: Bus=0019 Vendor=0001 Product=0001 Version=0100
    N: Name="gpio-keys"
    P: Phys=gpio-keys/input0
    S: Sysfs=/class/input/input0
    U: Uniq=
    H: Handlers=kbd event0
    B: EV=3
    B: KEY=180 0 0 40000800 1ec0 0 0 0

    I: Bus=0013 Vendor=dead Product=beef Version=0101
    N: Name="S3C TouchScreen"
    P: Phys=input(ts)
    S: Sysfs=/class/input/input1
    U: Uniq=
    H: Handlers=mouse0 event1
    B: EV=b
    B: KEY=400 0 0 0 0 0 0 0 0 0 0
    B: ABS=1000003
    在linux/input.h 中有input_event结构的定义,该结构定义了键盘的模拟数据,这个文件还定义了标准按键的编码等

    struct input_event {
        struct timeval time;  //按键时间
        __u16 type; //类型,在下面有定义
        __u16 code; //要模拟成什么按键
        __s32 value;//是按下还是释放
    };

    code:事件的代码.
    如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件.
    如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代 码为0x00),指示鼠标的Y轴方向REL_Y(代码为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).
    type:
    #define EV_SYN            0x00
    #define EV_KEY            0x01 //键盘
    #define EV_REL            0x02 //相对坐标(轨迹球)
    #define EV_ABS            0x03 //绝对坐标
    #define EV_MSC            0x04 //其他
    #define EV_SW            0x05
    #define EV_LED            0x11 //LED
    #define EV_SND            0x12//声音
    #define EV_REP            0x14//repeat
    #define EV_FF              0x15
    #define EV_PWR            0x16
    #define EV_FF_STATUS  0x17
    #define EV_MAX            0x1f
    #define EV_CNT            (EV_MAX+1)
    value:
    事件的值.如果事件 的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.

    对于键盘设备,也是采用Read方式打开设备文件,进而进行相应的操作。

    6410开发板键盘的定义:

    其中,键盘上的HOME与ESC标记反了,而其他正常,其方向键以此为:KEY_LEFT KEY_RIGHT KEY_UP KEY_DOWN KEY_REPLY,而Menu下的菜单分别为:KEY_MENU KEY_BACK KEY_SEND KEY_HOME KEY_END

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <linux/input.h>

    int
    main ()
    {
      int keys_fd;
      char ret[2];
      struct input_event t;

      keys_fd = open ("/dev/input/event0", O_RDONLY);
      if (keys_fd <= 0)
        {
          printf ("open /dev/input/event0 device error!\n");
          return 0;
        }

      while (1)
        {
          if (read (keys_fd, &t, sizeof (t)) == sizeof (t))
            {
              if (t.type == EV_KEY)
                if (t.value == 0 || t.value == 1)
            {
                  printf ("key %d %s\n", t.code,
                          (t.value) ? "Pressed" : "Released");
              if(t.code==KEY_BACK)
                  break;
            }
            }
        }
      close (keys_fd);

      return 0;
    }


    程序中出现的问题:
    keyboard.c: can't emulate rawmode for keycode 139
    key 139 Released
    keyboard.c: can't emulate rawmode for keycode 158
    key 158 Pressed
    目前还不知道这个问题如何解决,不过估计问题出在驱动程序对QTE的支持上,板载的键盘有几个按键对QT不支持。不知道其他人是否有其他的见解。
  • 相关阅读:
    进程调度算法
    操作系统文件管理
    25 个精美的手机网站模板
    WEB和APP谁是互联网未来
    网站设计趋势
    百度搜索引擎中的快照及快照更新机制
    JS实现信息的显示和隐藏
    虚拟主机单线、双线、多线的区别
    Types of Entity in Entity Framework:
    DBContext
  • 原文地址:https://www.cnblogs.com/feisky/p/1744232.html
Copyright © 2011-2022 走看看