免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8291 | 回复: 2
打印 上一主题 下一主题

请教关于Android下键盘驱动问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 13:35 |只看该作者 |倒序浏览
我在ARM9平台上移植Android,移植键盘驱动时遇上一些问题,请教一下:
1:进入中断后并且得到了键值,但是用input_report_key函数传递键值后驱动无法进入用户程序;
2:用户程序的read函数是否是这样用的:
        kp = open ("/dev/event0", O_RDONLY);
.............................

        read (kp, &key_value, sizeof (KEY_VALUE));
&key_value是我存放读取出来的键值的结构体指针。
static irqreturn_t vs_kp_interrupt(int irq, void *dev_id)
{
        struct vs_kp_dev *vsKpDev = dev_id;
        unsigned char scancode;
        int tmp = 0;

//        printk("Occured Keyboard Interrupt,irq = %d\n",irq);
        writel(KP_INTCL|KP_INTEN,vsKpDev->kpBase + KEYPAD_INTR);//Clear the Interrupt


        scancode = readl(vsKpDev->kpBase + KEYPAD_REG);        //get and invert scancode
        tmp = scancode;
        scancode = vsKpDev->keycode[scancode];
        input_report_key(vsKpDev->input_dev, scancode, tmp+1);//1:down 2:up
        input_sync(vsKpDev->input_dev);
        printk(KERN_INFO "VS_KeyPad: Pressed the key: 0x%x!\n",scancode);
       
        input_report_key(vsKpDev->input_dev, scancode, 0);//1:down 2:up
        input_sync(vsKpDev->input_dev);
        printk(KERN_INFO "VS_KeyPad: Pressed Realeased!\n");

        return IRQ_HANDLED;
}

Probe函数部分
        input_dev->name = "Verisilicon Keyboard";
        input_dev->phys = "dev/event0";
        input_dev->dev.parent = &pdev->dev;

        input_dev->id.bustype = BUS_HOST;//Need Confirm

        input_dev->id.vendor        = 0x0001;//
        input_dev->id.product = 0x0001;//
        input_dev->id.version = 0x0100;//

        input_dev->keycode = vsKpDev->keycode;
        input_dev->keycodesize = sizeof(unsigned char);
        input_dev->keycodemax = ARRAY_SIZE(vsKbd_keycode);

        memcpy(vsKpDev->keycode, vsKbd_keycode, sizeof(vsKpDev->keycode));
        for (i = 0; i < 0xff; i++)
                set_bit(vsKpDev->keycode, input_dev->keybit);
        clear_bit(0, input_dev->keybit);

        writel(KP_INTCL|KP_INTEN,vsKpDev->kpBase + KEYPAD_INTR);//Interrupt Controller
        writel(KP_MB,vsKpDev->kpBase + KEYPAD_CTL);//KeyPad Mode:Mobile

        err = input_register_device(vsKpDev->input_dev);
        if (err)
        {
                printk(KERN_ERR "Unable to register vs-keypad input device\n");
                goto fail3;
        }

        writel(MB_DBRT,vsKpDev->kpBase + KEYPAD_RAT);

        if (request_irq(vsKpDev->irq, vs_kp_interrupt, IRQF_DISABLED, "vs_kp", vsKpDev) < 0){
                printk(KERN_ERR "Unable to register keypad input device\n");
                goto fail4;
        }

        return 0;

        fail4:        free_irq(vsKpDev->irq, vsKpDev);
        fail3:        iounmap(vsKpDev->kpBase);
                                        input_free_device(input_dev);
                                        kfree(vsKpDev);
        fail2:        release_resource(vsKpDev->mem);
                                        kfree(vsKpDev->mem);
        fail1:        input_free_device(input_dev);
                                        platform_set_drvdata(pdev, NULL);
                return err;


MSN:nion2002@hotmail.com

[ 本帖最后由 nion2002 于 2009-2-27 17:50 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2009-02-27 13:40 |只看该作者

回复 #1 nion2002 的帖子

给你一些思路吧:
1、你移植的这个驱动,是不是完全和你的硬件设备匹配的?
2、跟踪你按键中断,看寄存器读出来的是什么值,和你的键盘的datasheet对照一下;
3、抛开Linux系统,你能理解键盘中断到中断处理是怎么回事的么?如果明白,再结合Linux驱动的特点,彻底把它搞明白。

论坛徽章:
0
3 [报告]
发表于 2009-02-27 14:01 |只看该作者
原帖由 dreamice 于 2009-2-27 13:40 发表
给你一些思路吧:
1、你移植的这个驱动,是不是完全和你的硬件设备匹配的?
2、跟踪你按键中断,看寄存器读出来的是什么值,和你的键盘的datasheet对照一下;
3、抛开Linux系统,你能理解键盘中断到中断处理 ...


中断处理应该没问题的,至于硬件设备匹配方面,裸机程序是我写的,至少寄存器配置那块不会有错。
驱动已经能读出键盘的值,但是中断处理程序打印出读取的键盘值之后,返回到测试程序时出错,返回不了。我对输入子系统那块了解不是很深入。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP