diff --git a/cpu/atmega2560/periph/gpio.c b/cpu/atmega2560/periph/gpio.c index 3cea0534ad6f9281e176a5ae79ed491ecfe52b5a..7ce2ec76616b4c8b3393853c14712191ced76030 100644 --- a/cpu/atmega2560/periph/gpio.c +++ b/cpu/atmega2560/periph/gpio.c @@ -86,53 +86,38 @@ static inline uint16_t _pin_addr(gpio_t pin) return (_port_addr(pin) - 0x02); } -int gpio_init(gpio_t pin, gpio_dir_t dir, gpio_pp_t pullup) +int gpio_init(gpio_t pin, gpio_mode_t mode) { - int res; - - if (dir == GPIO_DIR_OUT) { - _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin)); - res = bit_is_set(_SFR_MEM8(_ddr_addr(pin)), _pin_num(pin)); - } - else { - _SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin)); - res = bit_is_clear(_SFR_MEM8(_ddr_addr(pin)), _pin_num(pin)); - - if (res == 0) { + switch (mode) { + case GPIO_OUT: + _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin)); + break; + case GPIO_IN: + _SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin)); + _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); + break; + case GPIO_IN_PU: + _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); + break; + default: return -1; - } - - switch (pullup) { - case GPIO_NOPULL: - _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); - res = bit_is_clear(_SFR_MEM8(_port_addr(pin)), _pin_num(pin)); - break; - case GPIO_PULLUP: - _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); - res = bit_is_set(_SFR_MEM8(_port_addr(pin)), _pin_num(pin)); - break; - case GPIO_PULLDOWN: - /* Not supported by atmega2560 */ - return -1; - } } - return (res == 0) ? -1 : 0; + return 0; } -int gpio_init_int(gpio_t pin, gpio_pp_t pullup, gpio_flank_t flank, +int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { uint8_t pin_num = _pin_num(pin); if ((_port_num(pin) == PORT_D && pin_num > 3) - || (_port_num(pin) == PORT_E && pin_num < 4)) { + || (_port_num(pin) == PORT_E && pin_num < 4) + || ((mode != GPIO_IN) && (mode != GPIO_IN_PU))) { return -1; } - if (gpio_init(pin, GPIO_DIR_IN, pullup) < 0) { - return -1; - } + gpio_init(pin, mode); /* clear global interrupt flag */ cli();