diff --git a/cpu/atmega_common/periph/gpio.c b/cpu/atmega_common/periph/gpio.c index 4316d000aa..fe90d251d6 100644 --- a/cpu/atmega_common/periph/gpio.c +++ b/cpu/atmega_common/periph/gpio.c @@ -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)