博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6410键盘应用程序的开发
阅读量:7079 次
发布时间:2019-06-28

本文共 2460 字,大约阅读时间需要 8 分钟。

硬件电路分析
1.jpg
22222.jpg
3.jpg
内核配置支持输入子系统及其键盘驱动
5.jpg
查看/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开发板键盘的定义:

2.jpg
其中,键盘上的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不支持。不知道其他人是否有其他的见解。

本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/05/26/1744232.html,如需转载请自行联系原作者

你可能感兴趣的文章
时区问题
查看>>
hue(02)、Hue集成Hadoop集群(HDFS和YARN)
查看>>
百度的cdn公共库
查看>>
vue + webpack项目创建
查看>>
Java--Session与Cookie
查看>>
JS中生成和解析JSON
查看>>
Ubuntu系统下Eclipse的安装及不能启动的解决办法(转载)
查看>>
搭建 GIT 服务器教程
查看>>
tomcat各个组件功能
查看>>
Android/iOS 和js的交互的兼容性写法
查看>>
Laravel之冒泡、快速、选择和插入排序(持续更新)
查看>>
(转载)Hadoop -- MapReduce源码分析总结
查看>>
文档补充实现你的AppServer和AppSession[附加一个小知识]
查看>>
设计模式概述
查看>>
常用Linux系统优化脚本
查看>>
java axis webservice 开发实例
查看>>
OOA/OOP/OOD
查看>>
css-reset
查看>>
Maven镜像
查看>>
响应式Web设计(二):响应式Web设计的概念
查看>>