最近在整个遥控问题,原因是按了遥控上面的按键后没有反应,开始 以为是没有将按键对应起来,查了一下后发现是驱动里面根本没有捕获到相应的键值,所以也就不能够 发送相应的键值到上层来。
这里来看一下红外遥控接收端的驱动实现
首先来看一下驱动的module_init(IR_ModeInit);
static HI_S32 __init IR_ModeInit(HI_VOID)
{
int retval;
CMPI_PROC_ITEM_S *pProcItem;
hiir_dbg("lijj IR_Keypad_Init IR_S2 -->\n");
retval = platform_device_register(&ir_keypad_dev);
if (retval) {
printk("platform_device_register fail\n");
goto fail;
}
retval = platform_driver_register(&irevent_driver);
if (retval) {
printk("platform_driver_register fail\n");
goto fail;
}
sprintf(g_IrRegisterData.devfs_name, UMAP_DEVNAME_IR);
g_IrRegisterData.minor = UMAP_MIN_MINOR_IR;
g_IrRegisterData.owner = THIS_MODULE;
g_IrRegisterData.fops = &IR_FOPS;
g_IrRegisterData.drvops = &ir_baseOps;
if (CMPI_RegisterDevice(&g_IrRegisterData) < 0)
{
HI_FATAL_IR("register IR failed.\n");
return HI_FAILURE;
}
pProcItem = CMPI_PROC_AddModule(HI_MOD_IR, HI_NULL, HI_NULL);
if (!pProcItem)
{
HI_FATAL_IR("add IR proc failed.\n");
CMPI_UnRegisterDevice(&g_IrRegisterData);
return HI_FAILURE;
}
pProcItem->read = IR_ProcRead;
pProcItem->write = IR_ProcWrite;
printk("Load hi_irs2.ko success. \t(%s)\n", VERSION_STRING);
return 0;
fail:
platform_device_unregister(&ir_keypad_dev);
return -1;
}
在IR_ModeInit函数中注册一个设备,它的名字是Hi3716_keypad,还注册了一个设备的驱动,它的名字也是Hi3716_keypad,这样在注册这个驱动的时候就会调用它的probe函数,即IR_Keypad_Events_Probe
static int IR_Keypad_Events_Probe(struct platform_device *pdev)
{
hi_event_dev *edev;
int i;
#ifdef DEBUG_ON
printk("Enter IR_Keypad_Events_Probe.\n");
#endif
/* 1. alloc input device resource*/
edev = kzalloc(sizeof(hi_event_dev), GFP_KERNEL);
if (!edev)
{
printk("events edev or hi_keypad_ input_dev alloc fail!\n");
goto fail;
}
edev->irq = IR_IRQ_NO;
edev->name = NAME;
edev->input = input_allocate_device();
edev->addr = IR_REG_BASE;
/* 2. indicate that we generate key events */
set_bit(EV_KEY, edev->input->evbit);
set_bit(EV_REL, edev->input->evbit);
for (i=1; i<= 0x1ff; i++)
{
set_bit(i, edev->input->keybit);
}
set_bit(EV_SYN, edev->input->relbit);
set_bit(EV_KEY, edev->input->relbit);
/* 3. set input date and register device*/
platform_set_drvdata(pdev, edev);
edev->input->name = edev->name;
edev->input->id.bustype = BUS_HOST;
edev->input->id.vendor = 0x0001;
edev->input->id.product = 0x0001;
edev->input->id.version = 0x0100;
if (input_register_device(edev->input))
{
printk("input_register_device fail!\n");
goto fail;
}
/* 4. install edev */
g_irkeypad_edev = edev;
return 0;
fail:
kfree(edev);
input_free_device(edev->input);
return -EINVAL;
}