static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;
int down;
down = !s3c2410_gpio_getpin(button_irqs->pin);
if (down != (key_values[button_irqs->number] & 1)) { // Changed
key_values[button_irqs->number] = '0' + down;
ev_press = 1;
wake_up_interruptible(&button_waitq);
}
return IRQ_RETVAL(IRQ_HANDLED);
}
上面是一个中断服务函数,红色的那行,为什么就能在中断服务函数中调用s3c2410_gpio_getpin(button_irqs->pin)就能获取管脚的电平状态了呢?不是只有在管脚的功能配置为输入功能的情况下,才能读取GPXDAT获取当前管脚的电平的嘛?现在的管脚功能应该配置为中断功能了,为啥还能直接读取这个寄存器获取引脚的电平状态呢?求解
------解决方案--------------------
看一下芯片管脚的电路图,看看中断和PIN输入寄存器之间是互斥关系么?一般都不应该互斥。也就是配置成输入是配置引脚中断功能的前提条件,而不是互斥条件。只有配置成了输入,才能有效配置中断,而配置了中断,并不会影响引脚的输入输出功能。
------解决方案--------------------
昨天路上进一步想了下,硬件上外部中断和GPIO输入结构基本相同,只是外部中断多配备了硬件中断处理电路。所以如3楼所说,GPIO输入是外部中断的必要条件。软件上划分成两个独立的模式,让我们感觉硬件是独立的,这种是错觉。外部中断的配置肯定也涉及到了上下拉或者开漏等输入模式需配置的东西。