最近研究了一下Linux的设备驱动模型,有顺便了解了一下input子系统,
我把之前的案件驱动程序改写成了platform+input的模式,
但是有一个问题就是,
第一:在测试程序中,一次只能读到2个键值,不知道是什么原因;
第二:移植的触摸屏的驱动程序,在测试程序中读到的xy坐标偶尔会出现x坐标或y坐标丢失的情况。
驱动程序中的关键部分如下:
input设备的初始化:
keyInput->evbit[0]=BIT_MASK(EV_KEY);
set_bit(BTN_0,keyInput->keybit);
set_bit(BTN_1,keyInput->keybit);
set_bit(BTN_2,keyInput->keybit);
set_bit(BTN_3,keyInput->keybit);
ret = input_register_device(keyInput);
在按键中断程序中申报事件:
static irqreturn_t keyHandle(int irq,void *dev_id)
{
printk("\nKey pressed irq = %d\n",irq);
input_report_key(keyInput,BTN_0,irq==IRQ_EINT0);
input_report_key(keyInput,BTN_1,irq==IRQ_EINT2);
input_report_key(keyInput,BTN_2,irq==IRQ_EINT3);
input_report_key(keyInput,BTN_3,irq==IRQ_EINT4);
input_sync(keyInput);
return IRQ_HANDLED;
}
测试程序如下:
#include <linux/input.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <errno.h>
#include<stdlib.h>
#include<string.h>
#include<linux/ioctl.h>
#define LED_MAGIC 'L'
#define LED_ON _IOW(LED_MAGIC,0,int)
#define LED_OFF _IOW(LED_MAGIC,1,int)
#define DEVKEY "/dev/event0"
static struct input_event keyValue;
static struct input_event keyEvent[5];
int main(void)
{
int fbkey,ret;
int i;
fbkey = open(DEVKEY,O_RDWR);
if(fbkey<0)
{
printf("\nOpen error\n");
return fbkey;
}
else
printf("\nKey Open success\n");
while(1)
{
ret = read(fbkey,keyValue,sizeof(struct input_event));
if(ret<=0){
for(i=0;i<5;i++)
{
keyValue=keyEvent;
if(keyValue.type==EV_KEY)
{
switch(keyValue.code)
{
case BTN_0:
printf("\nKey[0]=%d",keyValue.value);
break;
case BTN_1:
printf("\nKey[1]=%d",keyValue.value);
break;
case BTN_2:
printf("\nKey[2]=%d",keyValue.value);
break;
case BTN_3:
printf("\nKey[3]=%d",keyValue.value);
break;
default:
printf("\nNo key has been pressed");
}
}
} else{
printf("\nRead error");
}
}
}
close(fbkey);
return 0;
}
测试的结果是:每一次之显示两个按键的键值,
请高手赐教,小弟感激不尽。