sinc_mark 发表于 2013-9-3 19:47:49

关于linux 2.6.38 下扫描键盘驱动请教

最近刚开始学写驱动,在2.6.38下,写9555的驱动,用输入子系统上报按键值,驱动调试通过,在内核下看到了新创建的设备节点,写了一个简单的测试应用,使用open打开设备节点后,打印输出。发现按键按下后都有了反应,但发现每一个键都只有一次上传到节点处,第二次按键后,按键就没有在设备节点处打印了。于是,我在Input_report_key()函数后加入printk()打印输出,发现每一次按下都会有上传的,我现在不知道是不是我的驱动写的有问题还是应用需要修改?请指教,谢谢!

linucos 发表于 2013-9-3 20:17:30

应用代码贴下

sinc_mark 发表于 2013-9-3 20:29:39

linucos 发表于 2013-9-3 20:17 static/image/common/back.gif
应用代码贴下

int main(int argc, char **argv)
{
        int ev_fd;
        int ret;
       
        struct input_event ev;
       
        ev_fd = open(OPEN_DIR, O_RDWR);
        if (ev_fd < 0 )
        {
                perror("failed to open ");
                exit(-1);
        }
        printf("type   code    value   \n");
        while(1)
        {
               
                ret = read(ev_fd, &ev,sizeof(struct input_event));
                if ( ret == sizeof(struct input_event))
                {
                        printf("%d        %d        %d        \n",ev.type, ev.code, ev.value);
                }
                else
                printf("read len %d\n",ret);
       
        }

        return 0;
}

sinc_mark 发表于 2013-9-3 20:32:24

基本上按键第一次按下,都会有打印,但同一个按键第二次按下之后就不会有打印了!

linucos 发表于 2013-9-3 20:45:03

你驱动可能没报抬起。

sinc_mark 发表于 2013-9-3 20:51:20

linucos 发表于 2013-9-3 20:45 static/image/common/back.gif
你驱动可能没报抬起。

是需要在驱动下,将按键的抬起一起上报?哪一次按键的过程不是需要两个上报的过程?

linucos 发表于 2013-9-3 20:54:28

1. 按键状态不变的话,kernel不会上报给用户空间
2. 有个标记__set_bit(EV_REP, input->evbit);,这个是重复上报的标记
具体你找找。

按下就报按下,抬起就报抬起。按下不抬起就是长按。
如果硬件没有抬起中断,只能模拟一个。

sinc_mark 发表于 2013-9-24 10:50:57

linucos 发表于 2013-9-3 20:54 static/image/common/back.gif
1. 按键状态不变的话,kernel不会上报给用户空间
2. 有个标记__set_bit(EV_REP, input->evbit);,这个是重 ...

想请教一下: 在应用开发的时候,有没有办法将input_report_key()的键值通知特定的线程的?或者应该说,在应用开发的时候,怎么去获取这个键值了?谢谢!

luck851 发表于 2013-9-24 12:54:20

矩阵键盘在内核有现成的驱动
页: [1]
查看完整版本: 关于linux 2.6.38 下扫描键盘驱动请教