cpu/atmega_common: fix gpio interrupt for atmega328p

This commit is contained in:
Victor Arino 2017-09-09 17:21:39 +02:00
parent 23f4f9be73
commit 650cf81e8a

View File

@ -138,6 +138,8 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
if ((_port_num(pin) == PORT_D && pin_num > 3)
#if defined (PORTE)
|| (_port_num(pin) == PORT_E && pin_num < 4)
#elif defined(CPU_ATMEGA328P)
|| (pin_num < 2) || (_port_num(pin) != PORT_D)
#endif
|| ((mode != GPIO_IN) && (mode != GPIO_IN_PU))) {
return -1;
@ -148,6 +150,11 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
/* clear global interrupt flag */
cli();
#if defined(CPU_ATMEGA328P)
/* INT pins start at PD2 instead of at PD0 */
pin_num -= 2;
#endif
EIMSK |= (1 << pin_num);
/* configure the flank */
@ -198,12 +205,22 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
void gpio_irq_enable(gpio_t pin)
{
#if defined(CPU_ATMEGA328P)
/* INT pins start at PD2 instead of at PD0 */
EIMSK |= (1 << (_pin_num(pin) - 2));
#else
EIMSK |= (1 << _pin_num(pin));
#endif
}
void gpio_irq_disable(gpio_t pin)
{
#if defined(CPU_ATMEGA328P)
/* INT pins start at PD2 instead of at PD0 */
EIMSK &= ~(1 << (_pin_num(pin) - 2));
#else
EIMSK &= ~(1 << _pin_num(pin));
#endif
}
int gpio_read(gpio_t pin)