主题 : 关于input子系统的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 25643
精华: 0
发帖: 7
金钱: 55 两
威望: 11 点
综合积分: 14 分
注册时间: 2010-07-27
最后登录: 2017-09-13
楼主  发表于: 2010-07-27 16:55

 关于input子系统的问题

最近研究了一下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;
        }
    
                
测试的结果是:每一次之显示两个按键的键值,

请高手赐教,小弟感激不尽。