- 论坛徽章:
- 0
|
我在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 编辑 ] |
|