红外遥控相关知识

来源:互联网 发布:知乎精华 mobi 编辑:程序博客网 时间:2024/04/29 10:52

最近在整个遥控问题,原因是按了遥控上面的按键后没有反应,开始 以为是没有将按键对应起来,查了一下后发现是驱动里面根本没有捕获到相应的键值,所以也就不能够 发送相应的键值到上层来。

这里来看一下红外遥控接收端的驱动实现

首先来看一下驱动的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;}


原创粉丝点击