diff --git a/hal/at90usb646/gpio.c b/hal/at90usb646/gpio.c index bf5dee2..dd6d62a 100644 --- a/hal/at90usb646/gpio.c +++ b/hal/at90usb646/gpio.c @@ -75,6 +75,18 @@ void GPIO_SetPullup(GPIOPin pin, bool pullup) GPIO_Set(pin, pullup); } +/** + * @brief Sets whether an input GPIO pin is pulled down + * @param pin The pin + * @param pulldown True if it should be pulled down, false if not + */ +void GPIO_SetPulldown(GPIOPin pin, bool pulldown) +{ + (void)pin; + (void)pulldown; + // The AVR doesn't support pulldowns +} + /** Turns a GPIO pin on (sets it high) * * @param pin The pin diff --git a/hal/gpio.h b/hal/gpio.h index 660e1c7..5a333a1 100644 --- a/hal/gpio.h +++ b/hal/gpio.h @@ -43,6 +43,7 @@ typedef struct GPIOPin void GPIO_SetDirection(GPIOPin pin, bool output); void GPIO_SetPullup(GPIOPin pin, bool pullup); +void GPIO_SetPulldown(GPIOPin pin, bool pulldown); void GPIO_SetOn(GPIOPin pin); void GPIO_SetOff(GPIOPin pin); void GPIO_Toggle(GPIOPin pin); diff --git a/hal/m258ke/gpio.c b/hal/m258ke/gpio.c index 42b22c1..c8fac93 100644 --- a/hal/m258ke/gpio.c +++ b/hal/m258ke/gpio.c @@ -64,13 +64,31 @@ void GPIO_SetPullup(GPIOPin pin, bool pullup) if (pullup) { uint32_t tmp = gpioRegs[pin.port]->PUSEL; - tmp &= ~(2UL << 2*pin.pin); tmp |= (1UL << 2*pin.pin); gpioRegs[pin.port]->PUSEL = tmp; } else { - gpioRegs[pin.port]->PUSEL &= ~(3UL << 2*pin.pin); + gpioRegs[pin.port]->PUSEL &= ~(1UL << 2*pin.pin); + } +} + +/** Sets whether an input GPIO pin is pulled down + * + * @param pin The pin + * @param pulldown True if it should be pulled down, false if not + */ +void GPIO_SetPulldown(GPIOPin pin, bool pulldown) +{ + if (pulldown) + { + uint32_t tmp = gpioRegs[pin.port]->PUSEL; + tmp |= (2UL << 2*pin.pin); + gpioRegs[pin.port]->PUSEL = tmp; + } + else + { + gpioRegs[pin.port]->PUSEL &= ~(2UL << 2*pin.pin); } }