From b2b18b37fc928e21a1ec92a253c5f31b69ed4ef3 Mon Sep 17 00:00:00 2001 From: Mariano Alvira Date: Fri, 11 Mar 2011 16:17:06 -0500 Subject: [PATCH] add gpio-utils --- lib/gpio-util.c | 63 +++++++++++++++++++++++++++++++++++++++++ lib/include/gpio-util.h | 28 ++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 lib/gpio-util.c create mode 100644 lib/include/gpio-util.h diff --git a/lib/gpio-util.c b/lib/gpio-util.c new file mode 100644 index 000000000..e1f55d426 --- /dev/null +++ b/lib/gpio-util.c @@ -0,0 +1,63 @@ + +#include +#include + +#include "gpio-util.h" + +void gpio_select_function(uint8_t gpio, uint8_t func) { + uint32_t mask = 3; + uint8_t major, minor, shift; + volatile uint32_t *base = GPIO_FUNC_SEL0; + uint32_t value; + major = gpio >> 4; + minor = gpio & 0xF; + shift = 2 * minor; + + value = base[major]; + value &= ~(mask << shift); + value |= (func << shift); + base[major] = value; +} + +void gpio_reg_set(volatile uint32_t* reg, uint8_t bit) { + uint8_t major, minor; + major = bit / 32; + minor = bit % 32; + *(reg + major) |= (1UL << minor); +} + +void gpio_reg_clear(volatile uint32_t* reg, uint8_t bit) { + uint8_t major, minor; + major = bit / 32; + minor = bit % 32; + *(reg + major) &= ~(1UL << minor); +} + +void gpio_set_pad_dir(uint8_t gpio, uint8_t dir) { + uint8_t major, minor; + major = gpio / 32; + minor = gpio % 32; + if (dir) gpio_reg_set(GPIO_PAD_DIR0 + major, minor); + else gpio_reg_clear(GPIO_PAD_DIR0 + major, minor); +} + +void gpio_set(uint8_t gpio) { + uint8_t major, minor; + major = gpio / 32; + minor = gpio % 32; + *(GPIO_DATA_SET0 + major) = (1UL << minor); +} + +void gpio_reset(uint8_t gpio) { + uint8_t major, minor; + major = gpio / 32; + minor = gpio % 32; + *(GPIO_DATA_RESET0 + major) = (1UL << minor); +} + +bool gpio_read(uint8_t gpio) { + uint8_t major, minor; + major = gpio / 32; + minor = gpio % 32; + return (*(GPIO_DATA0 + major) >> minor) & 1; +} diff --git a/lib/include/gpio-util.h b/lib/include/gpio-util.h new file mode 100644 index 000000000..258ecf097 --- /dev/null +++ b/lib/include/gpio-util.h @@ -0,0 +1,28 @@ + +#ifndef GPIO_UTIL_H +#define GPIO_UTIL_H + +#include +#include + +void gpio_select_function(uint8_t gpio, uint8_t func); +void gpio_reg_set(volatile uint32_t* reg, uint8_t bit); +void gpio_reg_clear(volatile uint32_t* reg, uint8_t bit); + +#define PAD_DIR_INPUT 0 +#define PAD_DIR_OUTPUT 1 +void gpio_set_pad_dir(uint8_t gpio, uint8_t dir); + +#undef gpio_set +#undef gpio_reset +#undef gpio_read + +//#define gpio_set gpio_set_ian +//#define gpio_reset gpio_reset_ian +//#define gpio_read gpio_read_ian + +void gpio_set(uint8_t gpio); +void gpio_reset(uint8_t gpio); +bool gpio_read(uint8_t gpio); + +#endif