From 01bae1264436a5e810d3cfe734dc07256275dc56 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 29 Sep 2019 21:47:37 -0600 Subject: [PATCH] Add AVR GPIO --- src/arch/avr/gpio.c | 33 ++++++++++++++++++++++++++++++++ src/arch/avr/include/arch/gpio.h | 27 ++++++++++++++++++++++++++ src/board/arduino/uno/main.c | 5 +++++ 3 files changed, 65 insertions(+) create mode 100644 src/arch/avr/gpio.c create mode 100644 src/arch/avr/include/arch/gpio.h diff --git a/src/arch/avr/gpio.c b/src/arch/avr/gpio.c new file mode 100644 index 0000000..95e036d --- /dev/null +++ b/src/arch/avr/gpio.c @@ -0,0 +1,33 @@ +#include + +bool gpio_get_dir(struct Gpio * gpio) { + if (*gpio->ddr & gpio->value) { + return true; + } else { + return false; + } +} + +void gpio_set_dir(struct Gpio * gpio, bool value) { + if (value) { + *gpio->ddr |= gpio->value; + } else { + *gpio->ddr &= ~gpio->value; + } +} + +bool gpio_get(struct Gpio * gpio) { + if (*gpio->pin & gpio->value) { + return true; + } else { + return false; + } +} + +void gpio_set(struct Gpio * gpio, bool value) { + if (value) { + *gpio->port |= gpio->value; + } else { + *gpio->port &= ~gpio->value; + } +} diff --git a/src/arch/avr/include/arch/gpio.h b/src/arch/avr/include/arch/gpio.h new file mode 100644 index 0000000..f7484f1 --- /dev/null +++ b/src/arch/avr/include/arch/gpio.h @@ -0,0 +1,27 @@ +#ifndef _ARCH_GPIO_H +#define _ARCH_GPIO_H + +#include +#include +#include + +struct Gpio { + volatile uint8_t * pin; + volatile uint8_t * ddr; + volatile uint8_t * port; + uint8_t value; +}; + +#define GPIO(BLOCK, NUMBER) { \ + .pin = &PIN ## BLOCK, \ + .ddr = &DDR ## BLOCK, \ + .port = &PORT ## BLOCK, \ + .value = (1 << NUMBER), \ +} + +bool gpio_get(struct Gpio * gpio); +void gpio_set(struct Gpio * gpio, bool value); +bool gpio_get_dir(struct Gpio * gpio); +void gpio_set_dir(struct Gpio * gpio, bool value); + +#endif // _ARCH_GPIO_H diff --git a/src/board/arduino/uno/main.c b/src/board/arduino/uno/main.c index 0bb752b..434b81d 100644 --- a/src/board/arduino/uno/main.c +++ b/src/board/arduino/uno/main.c @@ -1,14 +1,19 @@ #include +#include #include void init(void) { uart_stdio_init(0, 9600); } +struct Gpio LED = GPIO(B, 5); + int main(void) { init(); + gpio_set_dir(&LED, true); + gpio_set(&LED, false); printf("Hello from System76 EC for the Arduino Uno!\n"); for (;;) { int c = getchar();