1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-15 09:33:50 +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);
}
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();