mtk 按键中断驱动

static irqreturn_t kpd_irq_handler(int irq, void *dev_id)
{
    int value;

    value = mt_get_gpio_in(BUTTONT_VRC_KEY);
    if(value)
    {
        //中断方式设置为下降沿
        mt_eint_set_polarity(BUTTONT_VRC_KEY,MT_EINT_POL_NEG);
        if(test_bit(KEY_VCR,buttons_dev->keybit))
        {
            input_report_key(buttons_dev,KEY_VCR,0);
            input_sync(buttons_dev);
        }
        else
        {
            printk(KERN_CRIT"[AUTOTEST] Not Support KEY_N KEY!!\n");
        }
    }
    else
    {
        //中断方式设置为上升沿
        mt_eint_set_polarity(BUTTONT_VRC_KEY,MT_EINT_POL_POS);
        if(test_bit(KEY_VCR,buttons_dev->keybit))
        {
            input_report_key(buttons_dev,KEY_VCR,1);
            input_sync(buttons_dev);
        }
        else
        {
            printk(KERN_CRIT"[AUTOTEST] Not Support KEY_N KEY!!\n");
        }
    }
    printk(KERN_CRIT"irq value=%d\n",value);

    return IRQ_HANDLED;
}


static int __init buttons_ctl_init(void)
{
    int value;
    int i=10;

    buttons_dev = input_allocate_device();
    buttons_dev->name="VCR";
    buttons_dev->id.vendor=0x1234;
    buttons_dev->id.bustype = BUS_HOST;
    buttons_dev->id.product=0x3456;
    buttons_dev->id.version=0x0001;


    __set_bit(EV_KEY,buttons_dev->evbit);

    __set_bit(KEY_VCR,buttons_dev->keybit);


    input_register_device(buttons_dev);

//  init_timer(&buttons_timer);
    //buttons_timer.function = buttons_timer_function;
    //buttons_timer.expires = jiffies + (HZ/100);
    //add_timer(&buttons_timer);

    mt_gpio_set_debounce(BUTTONT_VRC_KEY,36*1000);


    request_irq(mt_gpio_to_irq(BUTTONT_VRC_KEY), kpd_irq_handler,IRQF_TRIGGER_NONE, "button_vrc", NULL);
}

static void __exit buttons_ctl_exit(void) 
{
    free_irq(mt_gpio_to_irq(BUTTONT_VRC_KEY), NULL);
    input_unregister_device(buttons_dev);
    input_free_device(buttons_dev); 
}

//mtk的request_irq框架不知道怎么去做的,设置里面的上下边沿的触发flag感觉没什么用,中断函数完全不是按照上下边沿的触发中断的逻辑进入,当时也没什么时间去研究,最后解决办法是进入中断后强制用mt_eint_set_polarity函数设置触发下次中断的条件是上升沿还是下降沿。

你可能感兴趣的:(android,Linux)