1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-16 18:13:49 +01:00

cpu/atmega2560: adapted GPIO driver

This commit is contained in:
Hauke Petersen 2016-02-20 13:17:11 +01:00
parent 88483febc0
commit c36efa0f96

View File

@ -86,53 +86,38 @@ static inline uint16_t _pin_addr(gpio_t pin)
return (_port_addr(pin) - 0x02); 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; switch (mode) {
case GPIO_OUT:
if (dir == GPIO_DIR_OUT) { _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin));
_SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin)); break;
res = bit_is_set(_SFR_MEM8(_ddr_addr(pin)), _pin_num(pin)); case GPIO_IN:
} _SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin));
else { _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin));
_SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin)); break;
res = bit_is_clear(_SFR_MEM8(_ddr_addr(pin)), _pin_num(pin)); case GPIO_IN_PU:
_SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin));
if (res == 0) { break;
default:
return -1; 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) gpio_cb_t cb, void *arg)
{ {
uint8_t pin_num = _pin_num(pin); uint8_t pin_num = _pin_num(pin);
if ((_port_num(pin) == PORT_D && pin_num > 3) 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; return -1;
} }
if (gpio_init(pin, GPIO_DIR_IN, pullup) < 0) { gpio_init(pin, mode);
return -1;
}
/* clear global interrupt flag */ /* clear global interrupt flag */
cli(); cli();