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函数设置触发下次中断的条件是上升沿还是下降沿。