From 7a3079bbeabf6f5bd93ee246f6a2f4cf779e6433 Mon Sep 17 00:00:00 2001 From: Thomas Klaehn Date: Fri, 27 Mar 2020 11:21:26 +0100 Subject: [PATCH] Add nrf52 gpio driver abstraction --- include/gpio.h | 34 +++++++++++++++++++++ src/platform/nrf52/gpio.c | 63 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 include/gpio.h create mode 100644 src/platform/nrf52/gpio.c diff --git a/include/gpio.h b/include/gpio.h new file mode 100644 index 0000000..a96e143 --- /dev/null +++ b/include/gpio.h @@ -0,0 +1,34 @@ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#include + +#include "driver.h" + +#define IOCTL_CMD_SET_DIRECTION 0 + +int gpio_open(const struct driver *drv); +int gpio_close(const struct driver *drv); + +int gpio_read(const struct driver *drv, char *buffer, unsigned int len); +int gpio_write(const struct driver *drv, const char *buffer, unsigned int len); + +enum direction { + IN = 0, + OUT +}; + +struct gpio { + int pin; + enum direction dir; +}; + +static const struct driver_fp gpio_fp = { + .open = gpio_open, + .close = gpio_close, + .read = gpio_read, + .write = gpio_write, + .ioctl = NULL +}; + +#endif diff --git a/src/platform/nrf52/gpio.c b/src/platform/nrf52/gpio.c new file mode 100644 index 0000000..328a58e --- /dev/null +++ b/src/platform/nrf52/gpio.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "gpio.h" + +#include "nrf_gpio.h" + +int gpio_open(const struct driver *drv) +{ + assert(NULL != drv); + + struct gpio *this = (struct gpio *)(drv->dev); + + if(this->dir == OUT) { + nrf_gpio_cfg_output((uint32_t)(this->pin)); + nrf_gpio_pin_clear(this->pin); + } + // FIXME: implement input configuration + + return 0; +} + +int gpio_close(const struct driver *drv) +{ + assert(NULL != drv); + + struct gpio *this = (struct gpio *)(drv->dev); + nrf_gpio_pin_clear(this->pin); + + return 0; +} + +int gpio_read(const struct driver *drv, char *buffer, unsigned int len) +{ + assert(NULL != drv); + + if(len == 0) { + return 0; + } + + struct gpio *this = (struct gpio *)(drv->dev); + + uint32_t value = nrf_gpio_pin_read(this->pin); + buffer[0] = value + 0x30; // ascii convert + + return 1; +} + +int gpio_write(const struct driver *drv, const char *buffer, unsigned int len) +{ + assert((NULL != drv) && (NULL != buffer)); + + if(len == 0) { + return 0; + } + + struct gpio *this = (struct gpio *)(drv->dev); + + nrf_gpio_pin_write(this->pin, buffer[0] - 0x30); + + return 1; +}