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:
parent
88483febc0
commit
c36efa0f96
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user