最近在整个遥控问题,原因是按了遥控上面的按键后没有反应,开始 以为是没有将按键对应起来,查了一下后发现是驱动里面根本没有捕获到相应的键值,所以也就不能够 发送相应的键值到上层来。
这里来看一下红外遥控接收端的驱动实现
首先来看一下驱动的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; }
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; }