红外遥控相关知识

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值