From 24c11c280eccbc1c7979e43b7e40a81c2f7b719b Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Tue, 22 May 2018 19:46:15 -0400 Subject: [PATCH 01/18] drivers/gpio_exp: initial support --- drivers/gpio_exp/Makefile | 1 + drivers/gpio_exp/gpio_exp.c | 115 +++++++++ drivers/gpio_exp/include/gpio_exp_reg.h | 60 +++++ drivers/include/gpio_exp.h | 320 ++++++++++++++++++++++++ 4 files changed, 496 insertions(+) create mode 100644 drivers/gpio_exp/Makefile create mode 100644 drivers/gpio_exp/gpio_exp.c create mode 100644 drivers/gpio_exp/include/gpio_exp_reg.h create mode 100644 drivers/include/gpio_exp.h diff --git a/drivers/gpio_exp/Makefile b/drivers/gpio_exp/Makefile new file mode 100644 index 000000000000..48422e909a47 --- /dev/null +++ b/drivers/gpio_exp/Makefile @@ -0,0 +1 @@ +include $(RIOTBASE)/Makefile.base diff --git a/drivers/gpio_exp/gpio_exp.c b/drivers/gpio_exp/gpio_exp.c new file mode 100644 index 000000000000..172747c552b7 --- /dev/null +++ b/drivers/gpio_exp/gpio_exp.c @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup drivers_gpio_exp + * + * @{ + * + * @file + * @brief GPIO expansion functions + * + * @author Matthew Blue + * + * @} + */ + +#include + +#include "gpio_exp.h" +#include "gpio_exp_reg.h" +#include "periph/gpio.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +int gpio_exp_init_notsup(void *dev, gpio_t pin, gpio_mode_t mode) +{ + (void)dev; + (void)pin; + (void)mode; + + DEBUG("[gpio_exp] notsup init called for dev %p, pin %u\n", + dev, (unsigned int)pin); + + return -ENOTSUP; +} + +int gpio_exp_init_int_notsup(void *dev, gpio_t pin, + gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) +{ + (void)dev; + (void)pin; + (void)mode; + (void)flank; + (void)cb; + (void)arg; + + DEBUG("[gpio_exp] notsup init_int called for dev %p, pin %u\n", + dev, (unsigned int)pin); + + return -ENOTSUP; +} + +void gpio_exp_irq_notsup(void *dev, gpio_t pin, int state) +{ + (void)dev; + (void)pin; + (void)state; + + DEBUG("[gpio_exp] notsup irq called for dev %p, pin %u\n", + dev, (unsigned int)pin); +} + +int gpio_exp_read_notsup(void *dev, gpio_t pin) +{ + (void)dev; + (void)pin; + + DEBUG("[gpio_exp] notsup read called for dev %p, pin %u\n", + dev, (unsigned int)pin); + + return -ENOTSUP; +} + +void gpio_exp_write_notsup(void *dev, gpio_t pin, int value) +{ + (void)dev; + (void)pin; + (void)value; + + DEBUG("[gpio_exp] notsup write called for dev %p, pin %u\n", + dev, (unsigned int)pin); +} + +gpio_exp_t *gpio_exp_entry(gpio_t gpio) +{ + uint8_t num; + + if (gpio == GPIO_UNDEF) { + return NULL; + } + + num = (uint8_t)((gpio >> GPIO_EXP_DEV_LOC) & GPIO_EXP_MAXDEVMASK); + + /* device is greater than number of registry entries */ + if (num > (sizeof(gpio_exp_reg) / sizeof(gpio_exp_reg[0]))) { + return NULL; + } + + DEBUG("[gpio_exp] returning reg entry %u\n", num); + + /* Cast to discard const */ + return (gpio_exp_t *)&(gpio_exp_reg[num]); +} + +gpio_t gpio_exp_pin(gpio_t gpio) +{ + return (gpio & GPIO_EXP_MAXPINMASK); +} diff --git a/drivers/gpio_exp/include/gpio_exp_reg.h b/drivers/gpio_exp/include/gpio_exp_reg.h new file mode 100644 index 000000000000..3c4e8d8926a4 --- /dev/null +++ b/drivers/gpio_exp/include/gpio_exp_reg.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup drivers_gpio_exp + * + * @{ + * + * @file + * @brief GPIO expansion default registry + * + * @author Matthew Blue + * + * @} + */ + +#ifndef GPIO_EXP_REG_H +#define GPIO_EXP_REG_H + +#include + +#include "gpio_exp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief GPIO expansion default notsup driver + */ +static const gpio_exp_driver_t gpio_exp_def_driver = { + .init = &gpio_exp_init_notsup, + .init_int = &gpio_exp_init_int_notsup, + .irq = &gpio_exp_irq_notsup, + .read = &gpio_exp_read_notsup, + .write = &gpio_exp_write_notsup +}; + +/** + * @brief GPIO expansion registry default if not defined + */ +static const gpio_exp_t gpio_exp_reg[] = +{ + { + .driver = &gpio_exp_def_driver, + .dev = NULL + } +}; + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_EXP_REG_H */ +/** @} */ diff --git a/drivers/include/gpio_exp.h b/drivers/include/gpio_exp.h new file mode 100644 index 000000000000..dd5a7f695471 --- /dev/null +++ b/drivers/include/gpio_exp.h @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup drivers_gpio_exp GPIO expansion driver + * @ingroup drivers + * @brief Global GPIO driver for pin-mapped GPIO expanders + * + * The GPIO expansion interface makes handling of GPIO expanders invisible to + * code using the GPIO pin API (periph/gpio.h). This is accomplished by + * reserving part of the range of values of gpio_t. When a call to the GPIO API + * uses a pin that falls within this range, it is parsed into a device ID that + * is looked up in the GPIO expansion registery and the call is redirected to + * the corresponding device. + * + * @{ + * + * @file + * @brief GPIO expansion interface definition + * + * @author Matthew Blue + */ + +#ifndef GPIO_EXP_H +#define GPIO_EXP_H + +#include + +#include "periph_cpu.h" +#include "periph/gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GPIO_EXP_DEV_LOC +/** + * @brief Set device ID location in gpio_t + */ +#define GPIO_EXP_DEV_LOC (8*sizeof(gpio_t) - 8) +#endif + +#ifndef GPIO_EXP_MAXDEVMASK +/** + * @brief Maximum device number mask for gpio_exp + */ +#define GPIO_EXP_MAXDEVMASK (0x7f) +#endif + +#ifndef GPIO_EXP_MAXPINMASK +/** + * @brief Maximum pin number mask for gpio_exp + */ +#define GPIO_EXP_MAXPINMASK (0xff) +#endif + +#ifndef GPIO_EXP_THRESH +/** + * @brief Pin numbers greater than GPIO_EXP_THRESH are on GPIO expanders + */ +#define GPIO_EXP_THRESH ((gpio_t)(-1) >> 1) +#endif + +#ifndef GPIO_EXP_PIN +/** + * @brief Convert (device, pin) tuple to @c gpio_t value + * + * @note Device number is determined by its position in gpio_exp_reg, + * defined in gpio_exp_params.h + */ +#define GPIO_EXP_PIN(x, y) \ + (gpio_t)(~GPIO_EXP_THRESH | (x << GPIO_EXP_DEV_LOC) | GPIO_PIN(0,y)) +#endif + +/** + * @brief Callback typedef for gpio_init + * + * @see @ref drivers_periph_gpio + */ +typedef int (*gpio_exp_init_t)(void *dev, gpio_t pin, gpio_mode_t mode); + +/** + * @brief Callback typedef for gpio_init_int + * + * @see @ref drivers_periph_gpio + */ +typedef int (*gpio_exp_init_int_t)(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); + +/** + * @brief Callback typedef for gpio_irq (merged enable and disable) + * + * @see @ref drivers_periph_gpio + */ +typedef void (*gpio_exp_irq_t)(void *dev, gpio_t pin, int state); + +/** + * @brief Callback typedef for gpio_read + * + * @see @ref drivers_periph_gpio + */ +typedef int (*gpio_exp_read_t)(void *dev, gpio_t pin); + +/** + * @brief Callback typedef for gpio_write + * + * @see @ref drivers_periph_gpio + */ +typedef void (*gpio_exp_write_t)(void *dev, gpio_t pin, int value); + +/** + * @brief Default not supported functions + * @{ + */ +int gpio_exp_init_notsup(void *dev, gpio_t pin, gpio_mode_t mode); +int gpio_exp_init_int_notsup(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); +void gpio_exp_irq_notsup(void *dev, gpio_t pin, int state); +int gpio_exp_read_notsup(void *dev, gpio_t pin); +void gpio_exp_write_notsup(void *dev, gpio_t pin, int value); +/** @} */ + +/** + * @brief GPIO expansion driver entry + */ +typedef struct gpio_exp_driver { + gpio_exp_init_t const init; /**< callback for gpio_init */ + gpio_exp_init_int_t const init_int; /**< callback for gpio_init_int */ + gpio_exp_irq_t const irq; /**< callback for gpio_irq */ + gpio_exp_read_t const read; /**< callback for read */ + gpio_exp_write_t const write; /**< callback for write */ +} gpio_exp_driver_t; + +/** + * @brief GPIO expansion registry entry + */ +typedef struct gpio_exp { + gpio_exp_driver_t const *driver; /**< pointer to driver */ + void *dev; /**< pointer to device descriptor */ +} gpio_exp_t; + +/** + * @brief Find an entry in the registry by GPIO pin number + * + * @param[in] gpio GPIO to look up + * + * @return pointer to the registry entry + * @return NULL if no device is registered + */ +gpio_exp_t *gpio_exp_entry(gpio_t gpio); + +/** + * @brief Strip encoding from a GPIO and return pin number + * + * @param[in] gpio GPIO to strip + * + * @return pin number + */ +gpio_t gpio_exp_pin(gpio_t gpio); + +#ifdef MODULE_GPIO_EXP + +/** + * @brief Macro for intercepting and redirecting gpio_init calls + */ +#define GPIO_INTERCEPT_INIT(pin, mode) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return -1; \ + } \ + return exp_entry->driver->init(exp_entry->dev, gpio_exp_pin(pin), mode); \ + } \ + } \ + while (0) + +/** + * @brief Macro for intercepting and redirecting gpio_init_int calls + */ +#define GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return -1; \ + } \ + return exp_entry->driver->init_int(exp_entry->dev, \ + gpio_exp_pin(pin), mode, flank, cb, arg); \ + } \ + } \ + while (0) + +/** + * @brief Macro for intercepting and redirecting gpio_irq_enable calls + */ +#define GPIO_INTERCEPT_IRQ_ENABLE(pin) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return; \ + } \ + exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 1); \ + return; \ + } \ + } \ + while (0) + +/** + * @brief Macro for intercepting and redirecting gpio_irq_disable calls + */ +#define GPIO_INTERCEPT_IRQ_DISABLE(pin) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return; \ + } \ + exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 0); \ + return; \ + } \ + } \ + while (0) + +/** + * @brief Macro for intercepting and redirecting gpio_read calls + */ +#define GPIO_INTERCEPT_READ(pin) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return -1; \ + } \ + return exp_entry->driver->read(exp_entry->dev, gpio_exp_pin(pin)); \ + } \ + } \ + while (0) + +/** + * @brief Macro for intercepting and redirecting gpio_set calls + */ +#define GPIO_INTERCEPT_SET(pin) GPIO_INTERCEPT_WRITE(pin, 1) + +/** + * @brief Macro for intercepting and redirecting gpio_clear calls + */ +#define GPIO_INTERCEPT_CLEAR(pin) GPIO_INTERCEPT_WRITE(pin, 0) + +/** + * @brief Macro for intercepting and redirecting gpio_toggle calls + */ +#define GPIO_INTERCEPT_TOGGLE(pin) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return; \ + } \ + if (exp_entry->driver->read(exp_entry->dev, gpio_exp_pin(pin))) { \ + exp_entry->driver->write(exp_entry->dev, \ + gpio_exp_pin(pin), 0); \ + } \ + else { \ + exp_entry->driver->write(exp_entry->dev, \ + gpio_exp_pin(pin), 1); \ + } \ + } \ + } \ + while (0) + +/** + * @brief Macro for intercepting and redirecting gpio_write calls + */ +#define GPIO_INTERCEPT_WRITE(pin, value) \ + do { \ + if (pin > GPIO_EXP_THRESH) { \ + gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ + if (exp_entry == NULL) { \ + return; \ + } \ + exp_entry->driver->write(exp_entry->dev, \ + gpio_exp_pin(pin), value); \ + } \ + } \ + while (0) + +#else /* MODULE_GPIO_EXP */ + +/** + * @brief No-ops for when no GPIO expander intercepts are performed + * @{ + */ +#define GPIO_INTERCEPT_NOOP do {} while (0) +#define GPIO_INTERCEPT_INIT(pin, mode) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_INIT_INT(pin, mode, \ + flank, cb, arg) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_IRQ_ENABLE(pin) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_IRQ_DISABLE(pin) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_READ(pin) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_SET(pin) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_CLEAR(pin) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_TOGGLE(pin) GPIO_INTERCEPT_NOOP +#define GPIO_INTERCEPT_WRITE(pin, value) GPIO_INTERCEPT_NOOP +/** @} */ + +#endif /* MODULE_GPIO_EXP */ + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_EXP_H */ +/** @} */ From 9d53f206b896b1b0520c1431bac1e75f1c03d8ed Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Thu, 24 May 2018 20:31:52 -0400 Subject: [PATCH 02/18] drivers/gpio_exp: auto_init support --- sys/auto_init/Makefile | 4 ++++ sys/auto_init/gpio_exp/Makefile | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 sys/auto_init/gpio_exp/Makefile diff --git a/sys/auto_init/Makefile b/sys/auto_init/Makefile index 1c2c0816d40f..9ce9085b2f24 100644 --- a/sys/auto_init/Makefile +++ b/sys/auto_init/Makefile @@ -14,4 +14,8 @@ ifneq (,$(filter auto_init_can,$(USEMODULE))) DIRS += can endif +ifneq (,$(filter auto_init_gpio_exp,$(USEMODULE))) + DIRS += gpio_exp +endif + include $(RIOTBASE)/Makefile.base diff --git a/sys/auto_init/gpio_exp/Makefile b/sys/auto_init/gpio_exp/Makefile new file mode 100644 index 000000000000..d0edbeadb59d --- /dev/null +++ b/sys/auto_init/gpio_exp/Makefile @@ -0,0 +1,3 @@ +MODULE = auto_init_gpio_exp + +include $(RIOTBASE)/Makefile.base From 22aa53fddecff543e3c27268eb502929708b6b2c Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Thu, 24 May 2018 20:39:16 -0400 Subject: [PATCH 03/18] drivers/gpio_exp: Makefile support --- drivers/Makefile.dep | 4 ++++ drivers/Makefile.include | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep index 776b16540929..fd22f09f5195 100644 --- a/drivers/Makefile.dep +++ b/drivers/Makefile.dep @@ -146,6 +146,10 @@ ifneq (,$(filter grove_ledbar,$(USEMODULE))) USEMODULE += my9221 endif +ifneq (,$(filter gpio_exp,$(USEMODULE))) + FEATURES_REQUIRED += periph_gpio +endif + ifneq (,$(filter hd44780,$(USEMODULE))) FEATURES_REQUIRED += periph_gpio USEMODULE += xtimer diff --git a/drivers/Makefile.include b/drivers/Makefile.include index e37c2b67522e..ee768200df19 100644 --- a/drivers/Makefile.include +++ b/drivers/Makefile.include @@ -82,6 +82,10 @@ ifneq (,$(filter fxos8700,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/drivers/fxos8700/include endif +ifneq (,$(filter gpio_exp,$(USEMODULE))) + USEMODULE_INCLUDES += $(RIOTBASE)/drivers/gpio_exp/include +endif + ifneq (,$(filter grove_ledbar,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/drivers/grove_ledbar/include endif From 35fde90318ee8ca4c5a17fc740690093582ef828 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 26 May 2018 14:32:26 -0400 Subject: [PATCH 04/18] tests/driver_gpio_exp_coll: test for collisions --- tests/driver_gpio_exp_coll/Makefile | 11 + tests/driver_gpio_exp_coll/main.c | 350 ++++++++++++++++++++++++++++ 2 files changed, 361 insertions(+) create mode 100644 tests/driver_gpio_exp_coll/Makefile create mode 100644 tests/driver_gpio_exp_coll/main.c diff --git a/tests/driver_gpio_exp_coll/Makefile b/tests/driver_gpio_exp_coll/Makefile new file mode 100644 index 000000000000..6c34580e39c5 --- /dev/null +++ b/tests/driver_gpio_exp_coll/Makefile @@ -0,0 +1,11 @@ +include ../Makefile.tests_common + +# The CPUs of these boards do not provide a gpio.c API. +# CPUs: cc430, mips32r2_generic, native +BOARD_BLACKLIST := chronos \ + mips-malta \ + native + +USEMODULE += gpio_exp + +include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_gpio_exp_coll/main.c b/tests/driver_gpio_exp_coll/main.c new file mode 100644 index 000000000000..75610ffaecaa --- /dev/null +++ b/tests/driver_gpio_exp_coll/main.c @@ -0,0 +1,350 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief GPIO expander compile time gpio_t collision test + * + * @author Matthew Blue + * @} + */ + +#include "assert.h" +#include "gpio_exp.h" +#include "periph/gpio.h" + +#if defined(CPU_MSP430FXYZ) +#define COLL_PINMASK (0x07) +#else +#define COLL_PINMASK (0x0f) +#endif + +#define COLL_TEST(port) \ + (GPIO_PIN(port, COLL_PINMASK) > GPIO_EXP_THRESH) + +#if defined(CPU_ATMEGA1281) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_ATMEGA1284P) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) + +#elif defined(CPU_ATMEGA2560) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_J) \ + || COLL_TEST(PORT_K) \ + || COLL_TEST(PORT_L) + +#elif defined(CPU_ATMEGA256RFR2) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_ATMEGA328P) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) + +#elif defined(CPU_CC2538) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) + +#elif defined(CPU_CC26X0) +/* CPU does have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_EFM32) +/* PORT_A */ +#if (_GPIO_PORT_A_PIN_COUNT > 0) +#define COLL_TEST_PORTA (COLL_TEST(PA)) +#else +#define COLL_TEST_PORTA (0) +#endif +/* PORT_B */ +#if (_GPIO_PORT_B_PIN_COUNT > 0) +#define COLL_TEST_PORTB (COLL_TEST_PORTA || COLL_TEST(PB)) +#else +#define COLL_TEST_PORTB (COLL_TEST_PORTA) +#endif +/* PORT_C */ +#if (_GPIO_PORT_C_PIN_COUNT > 0) +#define COLL_TEST_PORTC (COLL_TEST_PORTB || COLL_TEST(PC)) +#else +#define COLL_TEST_PORTC (COLL_TEST_PORTB) +#endif +/* PORT_D */ +#if (_GPIO_PORT_D_PIN_COUNT > 0) +#define COLL_TEST_PORTD (COLL_TEST_PORTC || COLL_TEST(PD)) +#else +#define COLL_TEST_PORTD (COLL_TEST_PORTC) +#endif +/* PORT_E */ +#if (_GPIO_PORT_E_PIN_COUNT > 0) +#define COLL_TEST_PORTE (COLL_TEST_PORTD || COLL_TEST(PE)) +#else +#define COLL_TEST_PORTE (COLL_TEST_PORTD) +#endif +/* PORT_F */ +#if (_GPIO_PORT_F_PIN_COUNT > 0) +#define COLL_TEST_PORTF (COLL_TEST_PORTE || COLL_TEST(PF)) +#else +#define COLL_TEST_PORTF (COLL_TEST_PORTE) +#endif +/* PORT_G */ +#if (_GPIO_PORT_G_PIN_COUNT > 0) +#define COLL_TEST_PORTG (COLL_TEST_PORTF || COLL_TEST(PG)) +#else +#define COLL_TEST_PORTG (COLL_TEST_PORTF) +#endif +/* PORT_H */ +#if (_GPIO_PORT_H_PIN_COUNT > 0) +#define COLL_TEST_PORTH (COLL_TEST_PORTG || COLL_TEST(PH)) +#else +#define COLL_TEST_PORTH (COLL_TEST_PORTG) +#endif +/* PORT_I */ +#if (_GPIO_PORT_I_PIN_COUNT > 0) +#define COLL_TEST_PORTI (COLL_TEST_PORTH || COLL_TEST(PI)) +#else +#define COLL_TEST_PORTI (COLL_TEST_PORTH) +#endif +/* PORT_J */ +#if (_GPIO_PORT_J_PIN_COUNT > 0) +#define COLL_TEST_PORTJ (COLL_TEST_PORTI || COLL_TEST(PJ)) +#else +#define COLL_TEST_PORTJ (COLL_TEST_PORTI) +#endif +/* PORT_K */ +#if (_GPIO_PORT_K_PIN_COUNT > 0) +#define COLL_TEST_PORTK (COLL_TEST_PORTJ || COLL_TEST(PK)) +#else +#define COLL_TEST_PORTK (COLL_TEST_PORTJ) +#endif +/* Combination of all existent ports */ +#define COLL_TEST_PORTS (COLL_TEST_PORTK) + +#elif defined(CPU_EZR32WG) +#define COLL_TEST_PORTS \ + COLL_TEST(PA) \ + || COLL_TEST(PB) \ + || COLL_TEST(PC) \ + || COLL_TEST(PD) \ + || COLL_TEST(PE) \ + || COLL_TEST(PF) + +#elif defined(CPU_FE310) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_KINETIS) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_LM4F120) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) + +#elif defined(CPU_LPC1768) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_LPC2387) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_MIPS_PIC32MX) || defined(CPU_MIPS_PIC32MZ) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_MSP430FXYZ) +#define COLL_TEST_PORTS \ + COLL_TEST(P1) \ + || COLL_TEST(P2) \ + || COLL_TEST(P3) \ + || COLL_TEST(P4) \ + || COLL_TEST(P5) \ + || COLL_TEST(P6) + +#elif defined(CPU_NRF51) || defined(CPU_NRF52) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_SAM3) +#define COLL_TEST_PORTS \ + COLL_TEST(PA) \ + || COLL_TEST(PB) \ + || COLL_TEST(PC) \ + || COLL_TEST(PD) + +#elif defined(CPU_SAMD21) || defined(CPU_SAML21) +#define COLL_TEST_PORTS \ + COLL_TEST(PA) \ + || COLL_TEST(PB) \ + || COLL_TEST(PC) + +#elif defined(CPU_STM32F0) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) + +#elif defined(CPU_STM32F1) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_STM32F2) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_I) + +#elif defined(CPU_STM32F3) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) + +#elif defined(CPU_STM32F4) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_I) + +#elif defined(CPU_STM32F7) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_I) \ + || COLL_TEST(PORT_J) \ + || COLL_TEST(PORT_K) + +#elif defined(CPU_STM32L0) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_H) + +#elif defined(CPU_STM32L1) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) + +#elif defined(CPU_STM32L4) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) + +#else +#error "[driver_gpio_exp_coll] CPU model number not recognized" +#endif /* defined(CPU) */ + +#define COLL_RES (!(COLL_TEST_PORTS)) + +static_assert(COLL_RES, "[driver_gpio_exp_coll] Collision in GPIO_EXP_PIN"); + +int main(void) +{ + return 0; +} From 2bd69284cb2ca6ae89669ec9e2d00b694af99e66 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sun, 27 May 2018 00:15:03 -0400 Subject: [PATCH 05/18] tests/driver_gpio_exp: initial test routine --- tests/driver_gpio_exp/Makefile | 17 +++ tests/driver_gpio_exp/Makefile.include | 2 + tests/driver_gpio_exp/include/gpio_exp_reg.h | 81 ++++++++++++ tests/driver_gpio_exp/main.c | 127 +++++++++++++++++++ tests/driver_gpio_exp/tests/01-run.py | 39 ++++++ 5 files changed, 266 insertions(+) create mode 100644 tests/driver_gpio_exp/Makefile create mode 100644 tests/driver_gpio_exp/Makefile.include create mode 100644 tests/driver_gpio_exp/include/gpio_exp_reg.h create mode 100644 tests/driver_gpio_exp/main.c create mode 100755 tests/driver_gpio_exp/tests/01-run.py diff --git a/tests/driver_gpio_exp/Makefile b/tests/driver_gpio_exp/Makefile new file mode 100644 index 000000000000..6e5a41d15a5c --- /dev/null +++ b/tests/driver_gpio_exp/Makefile @@ -0,0 +1,17 @@ +include ../Makefile.tests_common + +# The CPUs of these boards do not provide a gpio.c API. +# CPUs: cc430, mips32r2_generic, native +BOARD_BLACKLIST := chronos \ + mips-malta \ + native + +USEMODULE += gpio_exp + +TEST_ON_CI_WHITELIST += all + +include ./Makefile.include +include $(RIOTBASE)/Makefile.include + +test: + ./tests/01-run.py diff --git a/tests/driver_gpio_exp/Makefile.include b/tests/driver_gpio_exp/Makefile.include new file mode 100644 index 000000000000..83e8b3dcf40d --- /dev/null +++ b/tests/driver_gpio_exp/Makefile.include @@ -0,0 +1,2 @@ +# include test specific includes +export INCLUDES += -I$(CURDIR)/include diff --git a/tests/driver_gpio_exp/include/gpio_exp_reg.h b/tests/driver_gpio_exp/include/gpio_exp_reg.h new file mode 100644 index 000000000000..6c4a5736169a --- /dev/null +++ b/tests/driver_gpio_exp/include/gpio_exp_reg.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * + * @{ + * + * @file + * @brief GPIO expansion test registry + * + * @author Matthew Blue + * + * @} + */ + +#ifndef GPIO_EXP_REG_H +#define GPIO_EXP_REG_H + +#include + +#include "gpio_exp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief GPIO expansion test functions + */ +int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode); +int test_gpio_exp_init_int(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); +void test_gpio_exp_irq(void *dev, gpio_t pin, int state); +int test_gpio_exp_read(void *dev, gpio_t pin); +void test_gpio_exp_write(void *dev, gpio_t pin, int value); + +/** + * @brief GPIO expansion test drivers + */ +static const gpio_exp_driver_t test_gpio_exp_driver0 = { + .init = &test_gpio_exp_init, + .init_int = &test_gpio_exp_init_int, + .irq = &test_gpio_exp_irq, + .read = &test_gpio_exp_read, + .write = &test_gpio_exp_write +}; +static const gpio_exp_driver_t test_gpio_exp_driver1 = { + .init = &gpio_exp_init_notsup, + .init_int = &gpio_exp_init_int_notsup, + .irq = &gpio_exp_irq_notsup, + .read = &gpio_exp_read_notsup, + .write = &gpio_exp_write_notsup +}; + +/** + * @brief GPIO expansion test registry + */ +static const gpio_exp_t gpio_exp_reg[] = +{ + { + .driver = &test_gpio_exp_driver0, + .dev = (void *)0xbeef + }, + { + .driver = &test_gpio_exp_driver1, + .dev = NULL + } +}; + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_EXP_REG_H */ +/** @} */ diff --git a/tests/driver_gpio_exp/main.c b/tests/driver_gpio_exp/main.c new file mode 100644 index 000000000000..e201f8e70696 --- /dev/null +++ b/tests/driver_gpio_exp/main.c @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief GPIO expander test routine + * + * @author Matthew Blue + * @} + */ + +#include + +#include "gpio_exp.h" + +int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode) +{ + (void)mode; + + printf("init on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); + + return 0; +} + +int test_gpio_exp_init_int(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg) +{ + (void)mode; + (void)flank; + (void)cb; + (void)arg; + + printf("init_int on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); + + return 0; +} + +void test_gpio_exp_irq(void *dev, gpio_t pin, int state) +{ + (void)state; + + printf("irq on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); +} + +int test_gpio_exp_read(void *dev, gpio_t pin) +{ + printf("read on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); + + return 0; +} + +void test_gpio_exp_write(void *dev, gpio_t pin, int value) +{ + (void)value; + + printf("write on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); +} + +int main(void) +{ + uint16_t num; + gpio_t pin; + + puts("gpio_exp test routine"); + + for (num = 0; num < 4; num++) { + pin = (1 << num); + printf("Running gpio.h functions on pin %u\n", (unsigned int)pin); + + gpio_init(GPIO_EXP_PIN(0, pin), 0x0); + gpio_init_int(GPIO_EXP_PIN(0, pin), 0x0, 0x0, NULL, NULL); + gpio_irq_enable(GPIO_EXP_PIN(0, pin)); + gpio_irq_disable(GPIO_EXP_PIN(0, pin)); + gpio_read(GPIO_EXP_PIN(0, pin)); + gpio_set(GPIO_EXP_PIN(0, pin)); + gpio_clear(GPIO_EXP_PIN(0, pin)); + gpio_toggle(GPIO_EXP_PIN(0, pin)); + gpio_write(GPIO_EXP_PIN(0, pin), 0); + } + + puts("Running notsup functions"); + puts("(they should not print output)"); + + for (num = 0; num < 4; num++) { + pin = (1 << num); + printf("Running notsup gpio.h functions on pin %u\n", + (unsigned int)pin); + + gpio_init(GPIO_EXP_PIN(1, pin), 0x0); + gpio_init_int(GPIO_EXP_PIN(1, pin), 0x0, 0x0, NULL, NULL); + gpio_irq_enable(GPIO_EXP_PIN(1, pin)); + gpio_irq_disable(GPIO_EXP_PIN(1, pin)); + gpio_read(GPIO_EXP_PIN(1, pin)); + gpio_set(GPIO_EXP_PIN(1, pin)); + gpio_clear(GPIO_EXP_PIN(1, pin)); + gpio_toggle(GPIO_EXP_PIN(1, pin)); + gpio_write(GPIO_EXP_PIN(1, pin), 0); + } + + puts("Checking that all pins in range have init error using notsup"); + puts("(lack of init error implies improper redirection)"); + + for (num = 0; num <= GPIO_EXP_MAXPINMASK; num++) { + if (gpio_init(GPIO_EXP_PIN(1, num), 0x0) >= 0) { + printf("init succeeded on pin %u\n", num); + puts("[FAILED]"); + return 1; + } + } + + puts("[SUCCESS]"); + + return 0; +} diff --git a/tests/driver_gpio_exp/tests/01-run.py b/tests/driver_gpio_exp/tests/01-run.py new file mode 100755 index 000000000000..add0fb6a5320 --- /dev/null +++ b/tests/driver_gpio_exp/tests/01-run.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2018 Acutam Automation, LLC +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. + +import os +import sys + + +def testfunc(child): + child.expect_exact("gpio_exp test routine") + for i in range(4): + child.expect('Running gpio.h functions on pin \d+') + child.expect('init on dev 0xbeef with pin \d+') + child.expect('init_int on dev 0xbeef with pin \d+') + child.expect('irq on dev 0xbeef with pin \d+') + child.expect('irq on dev 0xbeef with pin \d+') + child.expect('read on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect('read on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect_exact("Running notsup functions") + child.expect_exact("(they should not print output)") + for i in range(4): + child.expect('Running notsup gpio.h functions on pin \d+') + child.expect_exact("Checking that all pins in range have init error using notsup") + child.expect_exact("(lack of init error implies improper redirection)") + child.expect_exact("[SUCCESS]") + + +if __name__ == "__main__": + sys.path.append(os.path.join(os.environ['RIOTBASE'], 'dist/tools/testrunner')) + from testrunner import run + sys.exit(run(testfunc)) From 3a8eefbdd37911559922c1fa280f4b43b930d799 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Thu, 24 May 2018 22:52:02 -0400 Subject: [PATCH 06/18] cpu/*: support for drivers/gpio_exp --- cpu/atmega_common/periph/gpio.c | 22 ++++++++++++++++++- cpu/cc2538/periph/gpio.c | 19 +++++++++++++++++ cpu/cc26x0/periph/gpio.c | 19 +++++++++++++++++ cpu/efm32/periph/gpio.c | 21 ++++++++++++++++-- cpu/ezr32wg/periph/gpio.c | 19 +++++++++++++++++ cpu/fe310/periph/gpio.c | 19 +++++++++++++++++ cpu/kinetis/periph/gpio.c | 19 +++++++++++++++++ cpu/lm4f120/periph/gpio.c | 19 +++++++++++++++++ cpu/lpc1768/include/periph_cpu.h | 15 +++++++++++++ cpu/lpc1768/periph/gpio.c | 19 +++++++++++++++++ cpu/lpc2387/periph/gpio.c | 19 +++++++++++++++++ cpu/mips_pic32_common/periph/gpio.c | 33 +++++++++++++++++++++++++++++ cpu/msp430fxyz/periph/gpio.c | 19 +++++++++++++++++ cpu/nrf5x_common/periph/gpio.c | 19 +++++++++++++++++ cpu/sam0_common/periph/gpio.c | 19 +++++++++++++++++ cpu/sam3/periph/gpio.c | 19 +++++++++++++++++ cpu/stm32_common/periph/gpio.c | 19 +++++++++++++++++ cpu/stm32f1/periph/gpio.c | 19 +++++++++++++++++ 18 files changed, 354 insertions(+), 3 deletions(-) diff --git a/cpu/atmega_common/periph/gpio.c b/cpu/atmega_common/periph/gpio.c index 52f1b9431a16..adebf6f12d70 100644 --- a/cpu/atmega_common/periph/gpio.c +++ b/cpu/atmega_common/periph/gpio.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2015 HAW Hamburg * 2016 INRIA - + * 2018 Acutam Automation, LLC * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level @@ -19,6 +19,7 @@ * @author René Herthel * @author Francisco Acosta * @author Laurent Navet + * @author Matthew Blue * * @} */ @@ -28,6 +29,7 @@ #include #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" #include "periph_cpu.h" @@ -127,6 +129,8 @@ static inline int8_t _int_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + switch (mode) { case GPIO_OUT: _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin)); @@ -148,6 +152,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + int8_t int_num = _int_num(pin); /* mode not supported */ @@ -198,32 +204,44 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + EIFR |= (1 << _int_num(pin)); EIMSK |= (1 << _int_num(pin)); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + EIMSK &= ~(1 << _int_num(pin)); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + return (_SFR_MEM8(_pin_addr(pin)) & (1 << _pin_num(pin))); } void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + if (gpio_read(pin)) { gpio_clear(pin); } @@ -234,6 +252,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { gpio_set(pin); } diff --git a/cpu/cc2538/periph/gpio.c b/cpu/cc2538/periph/gpio.c index 83a33c86c45d..bf6f6beab566 100644 --- a/cpu/cc2538/periph/gpio.c +++ b/cpu/cc2538/periph/gpio.c @@ -24,6 +24,7 @@ #include #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #define ENABLE_DEBUG (0) @@ -95,6 +96,8 @@ static inline uint8_t _pp_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + /* check if mode is valid */ if (mode == MODE_NOTSUP) { return -1; @@ -121,6 +124,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + if (gpio_init(pin, mode) != 0) { return -1; } @@ -165,36 +170,50 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + gpio(pin)->IE |= _pin_mask(pin); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + gpio(pin)->IE &= ~_pin_mask(pin); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + return (int)(gpio(pin)->DATA & _pin_mask(pin)); } void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + gpio(pin)->DATA |= _pin_mask(pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + gpio(pin)->DATA &= ~_pin_mask(pin); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + gpio(pin)->DATA ^= _pin_mask(pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { gpio(pin)->DATA |= _pin_mask(pin); } diff --git a/cpu/cc26x0/periph/gpio.c b/cpu/cc26x0/periph/gpio.c index 7ca9090594b4..ccfad2856fa0 100644 --- a/cpu/cc26x0/periph/gpio.c +++ b/cpu/cc26x0/periph/gpio.c @@ -20,6 +20,7 @@ */ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #define GPIO_ISR_CHAN_NUMOF (32) @@ -33,6 +34,8 @@ static gpio_isr_ctx_t gpio_chan[GPIO_ISR_CHAN_NUMOF]; int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + if ((unsigned int)pin > 31) return -1; @@ -54,6 +57,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + int init = gpio_init(pin, mode); if (init != 0) return init; @@ -75,16 +80,22 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + IOC->CFG[pin] |= IOCFG_EDGEIRQ_ENABLE; } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + IOC->CFG[pin] &= ~IOCFG_EDGEIRQ_ENABLE; } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + if (GPIO->DOE & (1 << pin)) { return (GPIO->DOUT >> pin) & 1; } @@ -95,21 +106,29 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + GPIO->DOUTSET = (1 << pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + GPIO->DOUTCLR = (1 << pin); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + GPIO->DOUTTGL = (1 << pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { GPIO->DOUTSET = (1 << pin); } else { diff --git a/cpu/efm32/periph/gpio.c b/cpu/efm32/periph/gpio.c index 0746bbb522af..0431bdf82b77 100644 --- a/cpu/efm32/periph/gpio.c +++ b/cpu/efm32/periph/gpio.c @@ -22,9 +22,8 @@ */ #include "cpu.h" - +#include "gpio_exp.h" #include "periph/gpio.h" - #include "em_gpio.h" /** @@ -54,6 +53,8 @@ static inline uint32_t _pin_mask(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + /* check for valid pin */ if (pin == GPIO_UNDEF) { return -1; @@ -75,6 +76,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + int result = gpio_init(pin, mode); if (result != 0) { @@ -103,36 +106,50 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + GPIO_IntEnable(_pin_mask(pin)); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + GPIO_IntDisable(_pin_mask(pin)); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + return GPIO_PinInGet(_port_num(pin), _pin_num(pin)); } void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + GPIO_PinOutClear(_port_num(pin), _pin_num(pin)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + GPIO_PinOutToggle(_port_num(pin), _pin_num(pin)); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); } diff --git a/cpu/ezr32wg/periph/gpio.c b/cpu/ezr32wg/periph/gpio.c index 2cabdb85f866..bbdf24f77d31 100644 --- a/cpu/ezr32wg/periph/gpio.c +++ b/cpu/ezr32wg/periph/gpio.c @@ -20,6 +20,7 @@ */ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -57,6 +58,8 @@ static inline int _pin_mask(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + GPIO_P_TypeDef *port = _port(pin); uint32_t pin_pos = _pin_pos(pin); @@ -83,6 +86,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + uint32_t pin_pos = _pin_pos(pin); /* configure as input */ @@ -109,36 +114,50 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + GPIO->IEN |= _pin_mask(pin); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + GPIO->IEN &= ~(_pin_mask(pin)); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + return _port(pin)->DIN & _pin_mask(pin); } void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _port(pin)->DOUTSET = _pin_mask(pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _port(pin)->DOUTCLR = _pin_mask(pin); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + _port(pin)->DOUTTGL = _pin_mask(pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { _port(pin)->DOUTSET = _pin_mask(pin); } else { diff --git a/cpu/fe310/periph/gpio.c b/cpu/fe310/periph/gpio.c index 85e19349956a..04f8c28bde01 100644 --- a/cpu/fe310/periph/gpio.c +++ b/cpu/fe310/periph/gpio.c @@ -22,6 +22,7 @@ #include "irq.h" #include "cpu.h" +#include "gpio_exp.h" #include "periph_cpu.h" #include "periph_conf.h" #include "periph/gpio.h" @@ -63,6 +64,8 @@ void gpio_isr(int num) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + /* Check for valid pin */ if (pin >= GPIO_NUMOF) { return -1; @@ -102,6 +105,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + /* Configure pin */ if (gpio_init(pin, mode) != 0) { return -1; @@ -131,6 +136,8 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + /* Check for valid pin */ if (pin >= GPIO_NUMOF) { return; @@ -158,6 +165,8 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + /* Check for valid pin */ if (pin >= GPIO_NUMOF) { return; @@ -185,26 +194,36 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + return (GPIO_REG(GPIO_INPUT_VAL) & (1 << pin)) ? 1 : 0; } void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + GPIO_REG(GPIO_OUTPUT_VAL) ^= (1 << pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); } diff --git a/cpu/kinetis/periph/gpio.c b/cpu/kinetis/periph/gpio.c index ec0155dfdc2b..83b75c0fd21d 100644 --- a/cpu/kinetis/periph/gpio.c +++ b/cpu/kinetis/periph/gpio.c @@ -29,6 +29,7 @@ #include #include "cpu.h" #include "bit.h" +#include "gpio_exp.h" #include "periph/gpio.h" #ifndef PORT_PCR_ODE_MASK @@ -181,6 +182,8 @@ static void ctx_clear(int port, int pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + /* set pin to analog mode while configuring it */ gpio_init_port(pin, GPIO_AF_ANALOG); @@ -200,6 +203,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + if (gpio_init(pin, mode) < 0) { return -1; } @@ -246,12 +251,16 @@ void gpio_init_port(gpio_t pin, uint32_t pcr) void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + int ctx = get_ctx(port_num(pin), pin_num(pin)); port(pin)->PCR[pin_num(pin)] |= isr_ctx[ctx].state; } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + int ctx = get_ctx(port_num(pin), pin_num(pin)); isr_ctx[ctx].state = port(pin)->PCR[pin_num(pin)] & PORT_PCR_IRQC_MASK; port(pin)->PCR[pin_num(pin)] &= ~(PORT_PCR_IRQC_MASK); @@ -259,6 +268,8 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + if (gpio(pin)->PDDR & (1 << pin_num(pin))) { return (gpio(pin)->PDOR & (1 << pin_num(pin))) ? 1 : 0; } @@ -269,21 +280,29 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + gpio(pin)->PSOR = (1 << pin_num(pin)); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + gpio(pin)->PCOR = (1 << pin_num(pin)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + gpio(pin)->PTOR = (1 << pin_num(pin)); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { gpio(pin)->PSOR = (1 << pin_num(pin)); } diff --git a/cpu/lm4f120/periph/gpio.c b/cpu/lm4f120/periph/gpio.c index 0cb0bbd90d70..c9deb97ea7bf 100644 --- a/cpu/lm4f120/periph/gpio.c +++ b/cpu/lm4f120/periph/gpio.c @@ -24,6 +24,7 @@ #include "cpu.h" #include "cpu_conf.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -95,6 +96,8 @@ static gpio_state_t gpio_config[NUM_OF_PORT][NUM_OF_PINS]; int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -164,6 +167,8 @@ void isr_gpio_portf(void){ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint32_t icr_reg_addr = port_addr + GPIO_ICR_R_OFF; @@ -204,6 +209,8 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint32_t im_reg_addr = port_addr + GPIO_IM_R_OFF; @@ -215,6 +222,8 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint32_t im_reg_addr = port_addr + GPIO_IM_R_OFF; @@ -227,6 +236,8 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -236,6 +247,8 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -246,6 +259,8 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -255,6 +270,8 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + if (gpio_read(pin)) { gpio_clear(pin); } @@ -265,6 +282,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { gpio_set(pin); } diff --git a/cpu/lpc1768/include/periph_cpu.h b/cpu/lpc1768/include/periph_cpu.h index 4e3d33846d13..93fee4b46d62 100644 --- a/cpu/lpc1768/include/periph_cpu.h +++ b/cpu/lpc1768/include/periph_cpu.h @@ -41,6 +41,21 @@ typedef uint8_t gpio_t; */ #define GPIO_PIN(port, pin) (gpio_t)((port << 5) | pin) +/** + * @brief Custom device ID location in gpio_t + */ +#define GPIO_EXP_DEV_LOC (4U) + +/** + * @brief Custom maximum device mask for gpio_exp + */ +#define GPIO_EXP_MAXDEVMASK (0x07) + +/** + * @brief Custom maximum pin mask for gpio_exp + */ +#define GPIO_EXP_MAXPINMASK (0x0f) + /** * @name Override the default GPIO mode values * @{ diff --git a/cpu/lpc1768/periph/gpio.c b/cpu/lpc1768/periph/gpio.c index 495e8027d317..86a7e568a396 100644 --- a/cpu/lpc1768/periph/gpio.c +++ b/cpu/lpc1768/periph/gpio.c @@ -19,6 +19,7 @@ */ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" /** @@ -92,6 +93,8 @@ static inline void _configure_flank(gpio_t pin, gpio_flank_t flank) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + /* check for valid pin */ if (pin == GPIO_UNDEF) { return -1; @@ -130,6 +133,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + /* only certain pins can be used as interrupt pins */ if (_port(pin) != 0 && _port(pin) != 2) { return -1; @@ -161,6 +166,8 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + assert(_port(pin) == 0 || _port(pin) == 2); _configure_flank(pin, isr_state[_port(pin) >> 1][_pin(pin)]); @@ -168,6 +175,8 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + assert(_port(pin) == 0 || _port(pin) == 2); if (_port(pin) == 0) { @@ -182,6 +191,8 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + LPC_GPIO_TypeDef *base = _base(pin); return (base->FIOPIN & (1 << _pin(pin))) ? 1 : 0; @@ -189,6 +200,8 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + LPC_GPIO_TypeDef *base = _base(pin); base->FIOSET = (1 << _pin(pin)); @@ -196,6 +209,8 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + LPC_GPIO_TypeDef *base = _base(pin); base->FIOCLR = (1 << _pin(pin)); @@ -203,6 +218,8 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + LPC_GPIO_TypeDef *base = _base(pin); base->FIOPIN ^= (1 << _pin(pin)); @@ -210,6 +227,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + LPC_GPIO_TypeDef *base = _base(pin); if (value) { diff --git a/cpu/lpc2387/periph/gpio.c b/cpu/lpc2387/periph/gpio.c index 3891c50b7f61..1439d13c9c3a 100644 --- a/cpu/lpc2387/periph/gpio.c +++ b/cpu/lpc2387/periph/gpio.c @@ -25,6 +25,7 @@ #include #include "irq.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "bitfield.h" @@ -65,6 +66,8 @@ static int _isr_map_entry(gpio_t pin) { int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -97,6 +100,8 @@ int gpio_init_mux(unsigned pin, unsigned mux) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + (void)mode; DEBUG("gpio_init_int(): pin %u\n", pin); @@ -200,6 +205,8 @@ static void _gpio_configure(gpio_t pin, unsigned rising, unsigned falling) void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + int isr_map_entry =_isr_map_entry(pin); int _state_index = _gpio_isr_map[isr_map_entry]; @@ -215,11 +222,15 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t dev) { + GPIO_INTERCEPT_IRQ_DISABLE(dev); + _gpio_configure(dev, 0, 0); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -228,6 +239,8 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -236,6 +249,8 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -244,6 +259,8 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t dev) { + GPIO_INTERCEPT_TOGGLE(dev); + if (gpio_read(dev)) { gpio_clear(dev); } @@ -254,6 +271,8 @@ void gpio_toggle(gpio_t dev) void gpio_write(gpio_t dev, int value) { + GPIO_INTERCEPT_WRITE(dev, value); + if (value) { gpio_set(dev); } diff --git a/cpu/mips_pic32_common/periph/gpio.c b/cpu/mips_pic32_common/periph/gpio.c index 396d0d574be5..bd9ac5e5f800 100644 --- a/cpu/mips_pic32_common/periph/gpio.c +++ b/cpu/mips_pic32_common/periph/gpio.c @@ -21,6 +21,7 @@ #include #include +#include "gpio_exp.h" #include "periph/gpio.h" #include "board.h" @@ -122,6 +123,8 @@ static inline int check_valid_port(uint8_t port) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + uint8_t port = GPIO_PORT(pin); uint32_t pin_no = GPIO_PIN_NO(pin); uint8_t output = 0, pu = 0, pd = 0, od = 0; @@ -175,6 +178,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + (void)pin; (void)mode; (void)flank; @@ -186,8 +191,28 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } +void gpio_irq_enable(gpio_t pin) +{ + GPIO_INTERCEPT_IRQ_ENABLE(pin); + + (void)pin; + + /* TODO: Not implemented yet */ +} + +void gpio_irq_disable(gpio_t pin) +{ + GPIO_INTERCEPT_IRQ_DISABLE(pin); + + (void)pin; + + /* TODO: Not implemented yet */ +} + int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + assert(check_valid_port(GPIO_PORT(pin))); return PORTx(GPIO_PORT(pin)) & GPIO_PIN_NO(pin); @@ -195,6 +220,8 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + assert(check_valid_port(GPIO_PORT(pin))); LATxSET(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); @@ -202,6 +229,8 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + assert(check_valid_port(GPIO_PORT(pin))); LATxCLR(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); @@ -209,6 +238,8 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + assert(check_valid_port(GPIO_PORT(pin))); LATxINV(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); @@ -216,6 +247,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) gpio_set(pin); else diff --git a/cpu/msp430fxyz/periph/gpio.c b/cpu/msp430fxyz/periph/gpio.c index e6682eb950a9..a4f201e48d4c 100644 --- a/cpu/msp430fxyz/periph/gpio.c +++ b/cpu/msp430fxyz/periph/gpio.c @@ -21,6 +21,7 @@ #include "cpu.h" #include "bitarithm.h" +#include "gpio_exp.h" #include "periph/gpio.h" /** @@ -81,6 +82,8 @@ static int _ctx(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + msp_port_t *port = _port(pin); /* check if port is valid and mode applicable */ @@ -102,6 +105,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + msp_port_isr_t *port = _isr_port(pin); /* check if port, pull resistor and flank configuration are valid */ @@ -153,6 +158,8 @@ void gpio_periph_mode(gpio_t pin, bool enable) void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + msp_port_isr_t *port = _isr_port(pin); if (port) { port->IE |= _pin(pin); @@ -161,6 +168,8 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + msp_port_isr_t *port = _isr_port(pin); if (port) { port->IE &= ~(_pin(pin)); @@ -169,6 +178,8 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + msp_port_t *port = _port(pin); if (port->DIR & _pin(pin)) { return (int)(port->OD & _pin(pin)); @@ -180,21 +191,29 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _port(pin)->OD |= _pin(pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _port(pin)->OD &= ~(_pin(pin)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + _port(pin)->OD ^= _pin(pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { _port(pin)->OD |= _pin(pin); } diff --git a/cpu/nrf5x_common/periph/gpio.c b/cpu/nrf5x_common/periph/gpio.c index cacd1d9e8e4d..34334190088f 100644 --- a/cpu/nrf5x_common/periph/gpio.c +++ b/cpu/nrf5x_common/periph/gpio.c @@ -27,6 +27,7 @@ */ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_cpu.h" #include "periph_conf.h" @@ -69,6 +70,8 @@ static inline int pin_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + switch (mode) { case GPIO_IN: case GPIO_IN_PD: @@ -87,6 +90,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + /* disable external interrupt in case one is active */ NRF_GPIOTE->INTENSET &= ~(GPIOTE_INTENSET_IN0_Msk); /* save callback */ @@ -110,18 +115,24 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + (void) pin; NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk; } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + (void) pin; NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk; } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + if (port(pin)->DIR & (1 << pin)) { return (port(pin)->OUT & (1 << pin)) ? 1 : 0; } @@ -132,21 +143,29 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + port(pin)->OUTSET = (1 << pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + port(pin)->OUTCLR = (1 << pin); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + port(pin)->OUT ^= (1 << pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { port(pin)->OUTSET = (1 << pin); } else { diff --git a/cpu/sam0_common/periph/gpio.c b/cpu/sam0_common/periph/gpio.c index 62be9b8e4a2c..95f2b9cb46fd 100644 --- a/cpu/sam0_common/periph/gpio.c +++ b/cpu/sam0_common/periph/gpio.c @@ -25,6 +25,7 @@ */ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -80,6 +81,8 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + PortGroup* port = _port(pin); int pin_pos = _pin_pos(pin); int pin_mask = _pin_mask(pin); @@ -114,6 +117,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + int exti = _exti(pin); /* make sure EIC channel is valid */ @@ -167,6 +172,8 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + int exti = _exti(pin); if (exti == -1) { return; @@ -176,6 +183,8 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + int exti = _exti(pin); if (exti == -1) { return; @@ -185,6 +194,8 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + PortGroup *port = _port(pin); int mask = _pin_mask(pin); @@ -198,21 +209,29 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _port(pin)->OUTSET.reg = _pin_mask(pin); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _port(pin)->OUTCLR.reg = _pin_mask(pin); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + _port(pin)->OUTTGL.reg = _pin_mask(pin); } void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { _port(pin)->OUTSET.reg = _pin_mask(pin); } else { diff --git a/cpu/sam3/periph/gpio.c b/cpu/sam3/periph/gpio.c index ebe7d73a244c..0ffddb57936f 100644 --- a/cpu/sam3/periph/gpio.c +++ b/cpu/sam3/periph/gpio.c @@ -23,6 +23,7 @@ */ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" #include "periph_cpu.h" @@ -147,6 +148,8 @@ static void _ctx_clear(int port, int pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + Pio *port = _port(pin); int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -194,6 +197,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + Pio *port = _port(pin); int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -254,16 +259,22 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + NVIC_EnableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + NVIC_DisableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -277,16 +288,22 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + if (gpio_read(pin)) { _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } else { @@ -296,6 +313,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } else { diff --git a/cpu/stm32_common/periph/gpio.c b/cpu/stm32_common/periph/gpio.c index 7aa0eaba3b1c..e555fe9990ae 100644 --- a/cpu/stm32_common/periph/gpio.c +++ b/cpu/stm32_common/periph/gpio.c @@ -28,6 +28,7 @@ #include "cpu.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -73,6 +74,8 @@ static inline int _pin_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -105,6 +108,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -193,31 +198,43 @@ void gpio_init_analog(gpio_t pin) void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + EXTI->IMR |= (1 << _pin_num(pin)); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + EXTI->IMR &= ~(1 << _pin_num(pin)); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + return (_port(pin)->IDR & (1 << _pin_num(pin))); } void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _port(pin)->BSRR = (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _port(pin)->BSRR = (1 << (_pin_num(pin) + 16)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + if (gpio_read(pin)) { gpio_clear(pin); } else { @@ -227,6 +244,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { gpio_set(pin); } else { diff --git a/cpu/stm32f1/periph/gpio.c b/cpu/stm32f1/periph/gpio.c index 448791dc6223..d58c69c023ae 100644 --- a/cpu/stm32f1/periph/gpio.c +++ b/cpu/stm32f1/periph/gpio.c @@ -22,6 +22,7 @@ #include "cpu.h" #include "board.h" +#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_cpu.h" #include "periph_conf.h" @@ -75,6 +76,8 @@ static inline int _pin_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { + GPIO_INTERCEPT_INIT(pin, mode); + GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -102,6 +105,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { + GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); + int pin_num = _pin_num(pin); /* disable interrupts on the channel we want to edit (just in case) */ @@ -162,16 +167,22 @@ void gpio_init_analog(gpio_t pin) void gpio_irq_enable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_ENABLE(pin); + EXTI->IMR |= (1 << _pin_num(pin)); } void gpio_irq_disable(gpio_t pin) { + GPIO_INTERCEPT_IRQ_DISABLE(pin); + EXTI->IMR &= ~(1 << _pin_num(pin)); } int gpio_read(gpio_t pin) { + GPIO_INTERCEPT_READ(pin); + GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -187,16 +198,22 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { + GPIO_INTERCEPT_SET(pin); + _port(pin)->BSRR = (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { + GPIO_INTERCEPT_CLEAR(pin); + _port(pin)->BRR = (1 << _pin_num(pin)); } void gpio_toggle(gpio_t pin) { + GPIO_INTERCEPT_TOGGLE(pin); + if (gpio_read(pin)) { gpio_clear(pin); } @@ -207,6 +224,8 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { + GPIO_INTERCEPT_WRITE(pin, value); + if (value) { _port(pin)->BSRR = (1 << _pin_num(pin)); } From fabd6c43aa4007c55b6bf8614a79a3da478437df Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 01:45:08 -0400 Subject: [PATCH 07/18] fixup! tests/driver_gpio_exp_coll: test for collisions --- tests/driver_gpio_exp_coll/main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/driver_gpio_exp_coll/main.c b/tests/driver_gpio_exp_coll/main.c index 75610ffaecaa..4a491e358162 100644 --- a/tests/driver_gpio_exp_coll/main.c +++ b/tests/driver_gpio_exp_coll/main.c @@ -337,7 +337,11 @@ || COLL_TEST(PORT_H) #else -#error "[driver_gpio_exp_coll] CPU model number not recognized" + +/* unknown CPU (default to simpler, less thorough test) */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + #endif /* defined(CPU) */ #define COLL_RES (!(COLL_TEST_PORTS)) From 9a35c7b237169e2480fd36dcbe0821539250a57a Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 15:14:53 -0400 Subject: [PATCH 08/18] fixup! drivers/gpio_exp: initial support --- drivers/gpio_exp/gpio_exp.c | 10 +++++----- .../include/{gpio_exp_reg.h => gpio_exp_conf.h} | 12 ++++++------ drivers/include/gpio_exp.h | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) rename drivers/gpio_exp/include/{gpio_exp_reg.h => gpio_exp_conf.h} (79%) diff --git a/drivers/gpio_exp/gpio_exp.c b/drivers/gpio_exp/gpio_exp.c index 172747c552b7..c42b09c3764e 100644 --- a/drivers/gpio_exp/gpio_exp.c +++ b/drivers/gpio_exp/gpio_exp.c @@ -22,7 +22,7 @@ #include #include "gpio_exp.h" -#include "gpio_exp_reg.h" +#include "gpio_exp_conf.h" #include "periph/gpio.h" #define ENABLE_DEBUG (0) @@ -98,15 +98,15 @@ gpio_exp_t *gpio_exp_entry(gpio_t gpio) num = (uint8_t)((gpio >> GPIO_EXP_DEV_LOC) & GPIO_EXP_MAXDEVMASK); - /* device is greater than number of registry entries */ - if (num > (sizeof(gpio_exp_reg) / sizeof(gpio_exp_reg[0]))) { + /* device is greater than number of listed entries */ + if (num > (sizeof(gpio_exp_list) / sizeof(gpio_exp_list[0]))) { return NULL; } - DEBUG("[gpio_exp] returning reg entry %u\n", num); + DEBUG("[gpio_exp] returning list entry %u\n", num); /* Cast to discard const */ - return (gpio_exp_t *)&(gpio_exp_reg[num]); + return (gpio_exp_t *)&(gpio_exp_list[num]); } gpio_t gpio_exp_pin(gpio_t gpio) diff --git a/drivers/gpio_exp/include/gpio_exp_reg.h b/drivers/gpio_exp/include/gpio_exp_conf.h similarity index 79% rename from drivers/gpio_exp/include/gpio_exp_reg.h rename to drivers/gpio_exp/include/gpio_exp_conf.h index 3c4e8d8926a4..4f9cec17dc6f 100644 --- a/drivers/gpio_exp/include/gpio_exp_reg.h +++ b/drivers/gpio_exp/include/gpio_exp_conf.h @@ -12,15 +12,15 @@ * @{ * * @file - * @brief GPIO expansion default registry + * @brief GPIO expansion default list of expanders * * @author Matthew Blue * * @} */ -#ifndef GPIO_EXP_REG_H -#define GPIO_EXP_REG_H +#ifndef GPIO_EXP_CONF_H +#define GPIO_EXP_CONF_H #include @@ -42,9 +42,9 @@ static const gpio_exp_driver_t gpio_exp_def_driver = { }; /** - * @brief GPIO expansion registry default if not defined + * @brief GPIO expansion default list if not defined */ -static const gpio_exp_t gpio_exp_reg[] = +static const gpio_exp_t gpio_exp_list[] = { { .driver = &gpio_exp_def_driver, @@ -56,5 +56,5 @@ static const gpio_exp_t gpio_exp_reg[] = } #endif -#endif /* GPIO_EXP_REG_H */ +#endif /* GPIO_EXP_CONF_H */ /** @} */ diff --git a/drivers/include/gpio_exp.h b/drivers/include/gpio_exp.h index dd5a7f695471..b212b83d0b09 100644 --- a/drivers/include/gpio_exp.h +++ b/drivers/include/gpio_exp.h @@ -15,7 +15,7 @@ * code using the GPIO pin API (periph/gpio.h). This is accomplished by * reserving part of the range of values of gpio_t. When a call to the GPIO API * uses a pin that falls within this range, it is parsed into a device ID that - * is looked up in the GPIO expansion registery and the call is redirected to + * is looked up in the list of GPIO expanders and the call is redirected to * the corresponding device. * * @{ @@ -70,7 +70,7 @@ extern "C" { /** * @brief Convert (device, pin) tuple to @c gpio_t value * - * @note Device number is determined by its position in gpio_exp_reg, + * @note Device number is determined by its position in gpio_exp_list, * defined in gpio_exp_params.h */ #define GPIO_EXP_PIN(x, y) \ @@ -137,7 +137,7 @@ typedef struct gpio_exp_driver { } gpio_exp_driver_t; /** - * @brief GPIO expansion registry entry + * @brief GPIO expansion list entry */ typedef struct gpio_exp { gpio_exp_driver_t const *driver; /**< pointer to driver */ @@ -145,12 +145,12 @@ typedef struct gpio_exp { } gpio_exp_t; /** - * @brief Find an entry in the registry by GPIO pin number + * @brief Find an entry in the list of expanders by GPIO pin number * * @param[in] gpio GPIO to look up * - * @return pointer to the registry entry - * @return NULL if no device is registered + * @return pointer to the list entry + * @return NULL if no device is listed */ gpio_exp_t *gpio_exp_entry(gpio_t gpio); From faee0c681a5b372ae84b137b8e6e4bdca373c576 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 15:15:19 -0400 Subject: [PATCH 09/18] fixup! tests/driver_gpio_exp: initial test routine --- .../include/{gpio_exp_reg.h => gpio_exp_conf.h} | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename tests/driver_gpio_exp/include/{gpio_exp_reg.h => gpio_exp_conf.h} (88%) diff --git a/tests/driver_gpio_exp/include/gpio_exp_reg.h b/tests/driver_gpio_exp/include/gpio_exp_conf.h similarity index 88% rename from tests/driver_gpio_exp/include/gpio_exp_reg.h rename to tests/driver_gpio_exp/include/gpio_exp_conf.h index 6c4a5736169a..a8b5922369cd 100644 --- a/tests/driver_gpio_exp/include/gpio_exp_reg.h +++ b/tests/driver_gpio_exp/include/gpio_exp_conf.h @@ -12,15 +12,15 @@ * @{ * * @file - * @brief GPIO expansion test registry + * @brief GPIO expansion test list of expanders * * @author Matthew Blue * * @} */ -#ifndef GPIO_EXP_REG_H -#define GPIO_EXP_REG_H +#ifndef GPIO_EXP_CONF_H +#define GPIO_EXP_CONF_H #include @@ -59,9 +59,9 @@ static const gpio_exp_driver_t test_gpio_exp_driver1 = { }; /** - * @brief GPIO expansion test registry + * @brief GPIO expansion test list */ -static const gpio_exp_t gpio_exp_reg[] = +static const gpio_exp_t gpio_exp_list[] = { { .driver = &test_gpio_exp_driver0, @@ -77,5 +77,5 @@ static const gpio_exp_t gpio_exp_reg[] = } #endif -#endif /* GPIO_EXP_REG_H */ +#endif /* GPIO_EXP_CONF_H */ /** @} */ From dad718e4568b1960ee802260cc1b1907cb058ecc Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 15:37:57 -0400 Subject: [PATCH 10/18] fixup! drivers/gpio_exp: initial support --- drivers/gpio_exp/include/gpio_exp_conf.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/gpio_exp/include/gpio_exp_conf.h b/drivers/gpio_exp/include/gpio_exp_conf.h index 4f9cec17dc6f..a82f1637ba9d 100644 --- a/drivers/gpio_exp/include/gpio_exp_conf.h +++ b/drivers/gpio_exp/include/gpio_exp_conf.h @@ -32,8 +32,10 @@ extern "C" { /** * @brief GPIO expansion default notsup driver + * + * Normally this would be provided with the driver implementation */ -static const gpio_exp_driver_t gpio_exp_def_driver = { +static const gpio_exp_driver_t gpio_exp_notsup_driver = { .init = &gpio_exp_init_notsup, .init_int = &gpio_exp_init_int_notsup, .irq = &gpio_exp_irq_notsup, @@ -47,7 +49,7 @@ static const gpio_exp_driver_t gpio_exp_def_driver = { static const gpio_exp_t gpio_exp_list[] = { { - .driver = &gpio_exp_def_driver, + .driver = &gpio_exp_notsup_driver, .dev = NULL } }; From 76c603df342effc32b0600adff8e1ebd392acedf Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 15:38:20 -0400 Subject: [PATCH 11/18] fixup! tests/driver_gpio_exp: initial test routine --- tests/driver_gpio_exp/include/gpio_exp_conf.h | 35 +++++-------------- tests/driver_gpio_exp/main.c | 24 +++++++++++++ 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/tests/driver_gpio_exp/include/gpio_exp_conf.h b/tests/driver_gpio_exp/include/gpio_exp_conf.h index a8b5922369cd..0ad272e28f81 100644 --- a/tests/driver_gpio_exp/include/gpio_exp_conf.h +++ b/tests/driver_gpio_exp/include/gpio_exp_conf.h @@ -31,32 +31,13 @@ extern "C" { #endif /** - * @brief GPIO expansion test functions - */ -int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode); -int test_gpio_exp_init_int(void *dev, gpio_t pin, gpio_mode_t mode, - gpio_flank_t flank, gpio_cb_t cb, void *arg); -void test_gpio_exp_irq(void *dev, gpio_t pin, int state); -int test_gpio_exp_read(void *dev, gpio_t pin); -void test_gpio_exp_write(void *dev, gpio_t pin, int value); - -/** - * @brief GPIO expansion test drivers + * @brief Reference the driver structs + * + * @{ */ -static const gpio_exp_driver_t test_gpio_exp_driver0 = { - .init = &test_gpio_exp_init, - .init_int = &test_gpio_exp_init_int, - .irq = &test_gpio_exp_irq, - .read = &test_gpio_exp_read, - .write = &test_gpio_exp_write -}; -static const gpio_exp_driver_t test_gpio_exp_driver1 = { - .init = &gpio_exp_init_notsup, - .init_int = &gpio_exp_init_int_notsup, - .irq = &gpio_exp_irq_notsup, - .read = &gpio_exp_read_notsup, - .write = &gpio_exp_write_notsup -}; +extern gpio_exp_driver_t test_gpio_exp_test_driver; +extern gpio_exp_driver_t test_gpio_exp_notsup_driver; +/** @} */ /** * @brief GPIO expansion test list @@ -64,11 +45,11 @@ static const gpio_exp_driver_t test_gpio_exp_driver1 = { static const gpio_exp_t gpio_exp_list[] = { { - .driver = &test_gpio_exp_driver0, + .driver = &test_gpio_exp_test_driver, .dev = (void *)0xbeef }, { - .driver = &test_gpio_exp_driver1, + .driver = &test_gpio_exp_notsup_driver, .dev = NULL } }; diff --git a/tests/driver_gpio_exp/main.c b/tests/driver_gpio_exp/main.c index e201f8e70696..ac7ca5cb757c 100644 --- a/tests/driver_gpio_exp/main.c +++ b/tests/driver_gpio_exp/main.c @@ -21,6 +21,30 @@ #include "gpio_exp.h" +/* GPIO expansion test functions */ +int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode); +int test_gpio_exp_init_int(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); +void test_gpio_exp_irq(void *dev, gpio_t pin, int state); +int test_gpio_exp_read(void *dev, gpio_t pin); +void test_gpio_exp_write(void *dev, gpio_t pin, int value); + +/* GPIO expansion test drivers */ +const gpio_exp_driver_t test_gpio_exp_test_driver = { + .init = &test_gpio_exp_init, + .init_int = &test_gpio_exp_init_int, + .irq = &test_gpio_exp_irq, + .read = &test_gpio_exp_read, + .write = &test_gpio_exp_write +}; +const gpio_exp_driver_t test_gpio_exp_notsup_driver = { + .init = &gpio_exp_init_notsup, + .init_int = &gpio_exp_init_int_notsup, + .irq = &gpio_exp_irq_notsup, + .read = &gpio_exp_read_notsup, + .write = &gpio_exp_write_notsup +}; + int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode) { (void)mode; From 01a51211798423e3fc2bdb6d9b9b60dae6a9b34d Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 15:42:03 -0400 Subject: [PATCH 12/18] Revert "drivers/gpio_exp: auto_init support" This reverts commit 9d53f206b896b1b0520c1431bac1e75f1c03d8ed. --- sys/auto_init/Makefile | 4 ---- sys/auto_init/gpio_exp/Makefile | 3 --- 2 files changed, 7 deletions(-) delete mode 100644 sys/auto_init/gpio_exp/Makefile diff --git a/sys/auto_init/Makefile b/sys/auto_init/Makefile index 9ce9085b2f24..1c2c0816d40f 100644 --- a/sys/auto_init/Makefile +++ b/sys/auto_init/Makefile @@ -14,8 +14,4 @@ ifneq (,$(filter auto_init_can,$(USEMODULE))) DIRS += can endif -ifneq (,$(filter auto_init_gpio_exp,$(USEMODULE))) - DIRS += gpio_exp -endif - include $(RIOTBASE)/Makefile.base diff --git a/sys/auto_init/gpio_exp/Makefile b/sys/auto_init/gpio_exp/Makefile deleted file mode 100644 index d0edbeadb59d..000000000000 --- a/sys/auto_init/gpio_exp/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -MODULE = auto_init_gpio_exp - -include $(RIOTBASE)/Makefile.base From 5295142cdf28e7231fdda4df80982eefa9d11138 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 16:03:23 -0400 Subject: [PATCH 13/18] fixup! cpu/*: support for drivers/gpio_exp --- cpu/atmega_common/periph/gpio.c | 19 ------------------- cpu/cc2538/periph/gpio.c | 19 ------------------- cpu/cc26x0/periph/gpio.c | 19 ------------------- cpu/efm32/periph/gpio.c | 19 ------------------- cpu/ezr32wg/periph/gpio.c | 19 ------------------- cpu/fe310/periph/gpio.c | 19 ------------------- cpu/kinetis/periph/gpio.c | 19 ------------------- cpu/lm4f120/periph/gpio.c | 19 ------------------- cpu/lpc1768/periph/gpio.c | 19 ------------------- cpu/lpc2387/periph/gpio.c | 19 ------------------- cpu/mips_pic32_common/periph/gpio.c | 19 ------------------- cpu/msp430fxyz/periph/gpio.c | 19 ------------------- cpu/nrf5x_common/periph/gpio.c | 19 ------------------- cpu/sam0_common/periph/gpio.c | 19 ------------------- cpu/sam3/periph/gpio.c | 19 ------------------- cpu/stm32_common/periph/gpio.c | 19 ------------------- cpu/stm32f1/periph/gpio.c | 19 ------------------- 17 files changed, 323 deletions(-) diff --git a/cpu/atmega_common/periph/gpio.c b/cpu/atmega_common/periph/gpio.c index adebf6f12d70..a40ff5fecea1 100644 --- a/cpu/atmega_common/periph/gpio.c +++ b/cpu/atmega_common/periph/gpio.c @@ -29,7 +29,6 @@ #include #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" #include "periph_cpu.h" @@ -129,8 +128,6 @@ static inline int8_t _int_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - switch (mode) { case GPIO_OUT: _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin)); @@ -152,8 +149,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - int8_t int_num = _int_num(pin); /* mode not supported */ @@ -204,44 +199,32 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - EIFR |= (1 << _int_num(pin)); EIMSK |= (1 << _int_num(pin)); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - EIMSK &= ~(1 << _int_num(pin)); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - return (_SFR_MEM8(_pin_addr(pin)) & (1 << _pin_num(pin))); } void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - if (gpio_read(pin)) { gpio_clear(pin); } @@ -252,8 +235,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { gpio_set(pin); } diff --git a/cpu/cc2538/periph/gpio.c b/cpu/cc2538/periph/gpio.c index bf6f6beab566..83a33c86c45d 100644 --- a/cpu/cc2538/periph/gpio.c +++ b/cpu/cc2538/periph/gpio.c @@ -24,7 +24,6 @@ #include #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #define ENABLE_DEBUG (0) @@ -96,8 +95,6 @@ static inline uint8_t _pp_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - /* check if mode is valid */ if (mode == MODE_NOTSUP) { return -1; @@ -124,8 +121,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - if (gpio_init(pin, mode) != 0) { return -1; } @@ -170,50 +165,36 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - gpio(pin)->IE |= _pin_mask(pin); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - gpio(pin)->IE &= ~_pin_mask(pin); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - return (int)(gpio(pin)->DATA & _pin_mask(pin)); } void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - gpio(pin)->DATA |= _pin_mask(pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - gpio(pin)->DATA &= ~_pin_mask(pin); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - gpio(pin)->DATA ^= _pin_mask(pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { gpio(pin)->DATA |= _pin_mask(pin); } diff --git a/cpu/cc26x0/periph/gpio.c b/cpu/cc26x0/periph/gpio.c index ccfad2856fa0..7ca9090594b4 100644 --- a/cpu/cc26x0/periph/gpio.c +++ b/cpu/cc26x0/periph/gpio.c @@ -20,7 +20,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #define GPIO_ISR_CHAN_NUMOF (32) @@ -34,8 +33,6 @@ static gpio_isr_ctx_t gpio_chan[GPIO_ISR_CHAN_NUMOF]; int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - if ((unsigned int)pin > 31) return -1; @@ -57,8 +54,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - int init = gpio_init(pin, mode); if (init != 0) return init; @@ -80,22 +75,16 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - IOC->CFG[pin] |= IOCFG_EDGEIRQ_ENABLE; } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - IOC->CFG[pin] &= ~IOCFG_EDGEIRQ_ENABLE; } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - if (GPIO->DOE & (1 << pin)) { return (GPIO->DOUT >> pin) & 1; } @@ -106,29 +95,21 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - GPIO->DOUTSET = (1 << pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - GPIO->DOUTCLR = (1 << pin); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - GPIO->DOUTTGL = (1 << pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { GPIO->DOUTSET = (1 << pin); } else { diff --git a/cpu/efm32/periph/gpio.c b/cpu/efm32/periph/gpio.c index 0431bdf82b77..e98dcc3b8531 100644 --- a/cpu/efm32/periph/gpio.c +++ b/cpu/efm32/periph/gpio.c @@ -22,7 +22,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "em_gpio.h" @@ -53,8 +52,6 @@ static inline uint32_t _pin_mask(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - /* check for valid pin */ if (pin == GPIO_UNDEF) { return -1; @@ -76,8 +73,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - int result = gpio_init(pin, mode); if (result != 0) { @@ -106,50 +101,36 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - GPIO_IntEnable(_pin_mask(pin)); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - GPIO_IntDisable(_pin_mask(pin)); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - return GPIO_PinInGet(_port_num(pin), _pin_num(pin)); } void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - GPIO_PinOutClear(_port_num(pin), _pin_num(pin)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - GPIO_PinOutToggle(_port_num(pin), _pin_num(pin)); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); } diff --git a/cpu/ezr32wg/periph/gpio.c b/cpu/ezr32wg/periph/gpio.c index bbdf24f77d31..2cabdb85f866 100644 --- a/cpu/ezr32wg/periph/gpio.c +++ b/cpu/ezr32wg/periph/gpio.c @@ -20,7 +20,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -58,8 +57,6 @@ static inline int _pin_mask(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - GPIO_P_TypeDef *port = _port(pin); uint32_t pin_pos = _pin_pos(pin); @@ -86,8 +83,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - uint32_t pin_pos = _pin_pos(pin); /* configure as input */ @@ -114,50 +109,36 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - GPIO->IEN |= _pin_mask(pin); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - GPIO->IEN &= ~(_pin_mask(pin)); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - return _port(pin)->DIN & _pin_mask(pin); } void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _port(pin)->DOUTSET = _pin_mask(pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _port(pin)->DOUTCLR = _pin_mask(pin); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - _port(pin)->DOUTTGL = _pin_mask(pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { _port(pin)->DOUTSET = _pin_mask(pin); } else { diff --git a/cpu/fe310/periph/gpio.c b/cpu/fe310/periph/gpio.c index 04f8c28bde01..85e19349956a 100644 --- a/cpu/fe310/periph/gpio.c +++ b/cpu/fe310/periph/gpio.c @@ -22,7 +22,6 @@ #include "irq.h" #include "cpu.h" -#include "gpio_exp.h" #include "periph_cpu.h" #include "periph_conf.h" #include "periph/gpio.h" @@ -64,8 +63,6 @@ void gpio_isr(int num) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - /* Check for valid pin */ if (pin >= GPIO_NUMOF) { return -1; @@ -105,8 +102,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - /* Configure pin */ if (gpio_init(pin, mode) != 0) { return -1; @@ -136,8 +131,6 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - /* Check for valid pin */ if (pin >= GPIO_NUMOF) { return; @@ -165,8 +158,6 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - /* Check for valid pin */ if (pin >= GPIO_NUMOF) { return; @@ -194,36 +185,26 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - return (GPIO_REG(GPIO_INPUT_VAL) & (1 << pin)) ? 1 : 0; } void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - GPIO_REG(GPIO_OUTPUT_VAL) ^= (1 << pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); } diff --git a/cpu/kinetis/periph/gpio.c b/cpu/kinetis/periph/gpio.c index 83b75c0fd21d..ec0155dfdc2b 100644 --- a/cpu/kinetis/periph/gpio.c +++ b/cpu/kinetis/periph/gpio.c @@ -29,7 +29,6 @@ #include #include "cpu.h" #include "bit.h" -#include "gpio_exp.h" #include "periph/gpio.h" #ifndef PORT_PCR_ODE_MASK @@ -182,8 +181,6 @@ static void ctx_clear(int port, int pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - /* set pin to analog mode while configuring it */ gpio_init_port(pin, GPIO_AF_ANALOG); @@ -203,8 +200,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - if (gpio_init(pin, mode) < 0) { return -1; } @@ -251,16 +246,12 @@ void gpio_init_port(gpio_t pin, uint32_t pcr) void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - int ctx = get_ctx(port_num(pin), pin_num(pin)); port(pin)->PCR[pin_num(pin)] |= isr_ctx[ctx].state; } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - int ctx = get_ctx(port_num(pin), pin_num(pin)); isr_ctx[ctx].state = port(pin)->PCR[pin_num(pin)] & PORT_PCR_IRQC_MASK; port(pin)->PCR[pin_num(pin)] &= ~(PORT_PCR_IRQC_MASK); @@ -268,8 +259,6 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - if (gpio(pin)->PDDR & (1 << pin_num(pin))) { return (gpio(pin)->PDOR & (1 << pin_num(pin))) ? 1 : 0; } @@ -280,29 +269,21 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - gpio(pin)->PSOR = (1 << pin_num(pin)); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - gpio(pin)->PCOR = (1 << pin_num(pin)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - gpio(pin)->PTOR = (1 << pin_num(pin)); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { gpio(pin)->PSOR = (1 << pin_num(pin)); } diff --git a/cpu/lm4f120/periph/gpio.c b/cpu/lm4f120/periph/gpio.c index c9deb97ea7bf..0cb0bbd90d70 100644 --- a/cpu/lm4f120/periph/gpio.c +++ b/cpu/lm4f120/periph/gpio.c @@ -24,7 +24,6 @@ #include "cpu.h" #include "cpu_conf.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -96,8 +95,6 @@ static gpio_state_t gpio_config[NUM_OF_PORT][NUM_OF_PINS]; int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -167,8 +164,6 @@ void isr_gpio_portf(void){ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint32_t icr_reg_addr = port_addr + GPIO_ICR_R_OFF; @@ -209,8 +204,6 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint32_t im_reg_addr = port_addr + GPIO_IM_R_OFF; @@ -222,8 +215,6 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint32_t im_reg_addr = port_addr + GPIO_IM_R_OFF; @@ -236,8 +227,6 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -247,8 +236,6 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -259,8 +246,6 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; const uint8_t pin_num = _pin_num(pin); @@ -270,8 +255,6 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - if (gpio_read(pin)) { gpio_clear(pin); } @@ -282,8 +265,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { gpio_set(pin); } diff --git a/cpu/lpc1768/periph/gpio.c b/cpu/lpc1768/periph/gpio.c index 86a7e568a396..495e8027d317 100644 --- a/cpu/lpc1768/periph/gpio.c +++ b/cpu/lpc1768/periph/gpio.c @@ -19,7 +19,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" /** @@ -93,8 +92,6 @@ static inline void _configure_flank(gpio_t pin, gpio_flank_t flank) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - /* check for valid pin */ if (pin == GPIO_UNDEF) { return -1; @@ -133,8 +130,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - /* only certain pins can be used as interrupt pins */ if (_port(pin) != 0 && _port(pin) != 2) { return -1; @@ -166,8 +161,6 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - assert(_port(pin) == 0 || _port(pin) == 2); _configure_flank(pin, isr_state[_port(pin) >> 1][_pin(pin)]); @@ -175,8 +168,6 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - assert(_port(pin) == 0 || _port(pin) == 2); if (_port(pin) == 0) { @@ -191,8 +182,6 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - LPC_GPIO_TypeDef *base = _base(pin); return (base->FIOPIN & (1 << _pin(pin))) ? 1 : 0; @@ -200,8 +189,6 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - LPC_GPIO_TypeDef *base = _base(pin); base->FIOSET = (1 << _pin(pin)); @@ -209,8 +196,6 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - LPC_GPIO_TypeDef *base = _base(pin); base->FIOCLR = (1 << _pin(pin)); @@ -218,8 +203,6 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - LPC_GPIO_TypeDef *base = _base(pin); base->FIOPIN ^= (1 << _pin(pin)); @@ -227,8 +210,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - LPC_GPIO_TypeDef *base = _base(pin); if (value) { diff --git a/cpu/lpc2387/periph/gpio.c b/cpu/lpc2387/periph/gpio.c index 1439d13c9c3a..3891c50b7f61 100644 --- a/cpu/lpc2387/periph/gpio.c +++ b/cpu/lpc2387/periph/gpio.c @@ -25,7 +25,6 @@ #include #include "irq.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "bitfield.h" @@ -66,8 +65,6 @@ static int _isr_map_entry(gpio_t pin) { int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -100,8 +97,6 @@ int gpio_init_mux(unsigned pin, unsigned mux) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - (void)mode; DEBUG("gpio_init_int(): pin %u\n", pin); @@ -205,8 +200,6 @@ static void _gpio_configure(gpio_t pin, unsigned rising, unsigned falling) void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - int isr_map_entry =_isr_map_entry(pin); int _state_index = _gpio_isr_map[isr_map_entry]; @@ -222,15 +215,11 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t dev) { - GPIO_INTERCEPT_IRQ_DISABLE(dev); - _gpio_configure(dev, 0, 0); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -239,8 +228,6 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -249,8 +236,6 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - unsigned _pin = pin & 31; unsigned port = pin >> 5; FIO_PORT_t *_port = &FIO_PORTS[port]; @@ -259,8 +244,6 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t dev) { - GPIO_INTERCEPT_TOGGLE(dev); - if (gpio_read(dev)) { gpio_clear(dev); } @@ -271,8 +254,6 @@ void gpio_toggle(gpio_t dev) void gpio_write(gpio_t dev, int value) { - GPIO_INTERCEPT_WRITE(dev, value); - if (value) { gpio_set(dev); } diff --git a/cpu/mips_pic32_common/periph/gpio.c b/cpu/mips_pic32_common/periph/gpio.c index bd9ac5e5f800..b2b4a8f90304 100644 --- a/cpu/mips_pic32_common/periph/gpio.c +++ b/cpu/mips_pic32_common/periph/gpio.c @@ -21,7 +21,6 @@ #include #include -#include "gpio_exp.h" #include "periph/gpio.h" #include "board.h" @@ -123,8 +122,6 @@ static inline int check_valid_port(uint8_t port) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - uint8_t port = GPIO_PORT(pin); uint32_t pin_no = GPIO_PIN_NO(pin); uint8_t output = 0, pu = 0, pd = 0, od = 0; @@ -178,8 +175,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - (void)pin; (void)mode; (void)flank; @@ -193,8 +188,6 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - (void)pin; /* TODO: Not implemented yet */ @@ -202,8 +195,6 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - (void)pin; /* TODO: Not implemented yet */ @@ -211,8 +202,6 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - assert(check_valid_port(GPIO_PORT(pin))); return PORTx(GPIO_PORT(pin)) & GPIO_PIN_NO(pin); @@ -220,8 +209,6 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - assert(check_valid_port(GPIO_PORT(pin))); LATxSET(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); @@ -229,8 +216,6 @@ void gpio_set(gpio_t pin) void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - assert(check_valid_port(GPIO_PORT(pin))); LATxCLR(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); @@ -238,8 +223,6 @@ void gpio_clear(gpio_t pin) void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - assert(check_valid_port(GPIO_PORT(pin))); LATxINV(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); @@ -247,8 +230,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) gpio_set(pin); else diff --git a/cpu/msp430fxyz/periph/gpio.c b/cpu/msp430fxyz/periph/gpio.c index a4f201e48d4c..e6682eb950a9 100644 --- a/cpu/msp430fxyz/periph/gpio.c +++ b/cpu/msp430fxyz/periph/gpio.c @@ -21,7 +21,6 @@ #include "cpu.h" #include "bitarithm.h" -#include "gpio_exp.h" #include "periph/gpio.h" /** @@ -82,8 +81,6 @@ static int _ctx(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - msp_port_t *port = _port(pin); /* check if port is valid and mode applicable */ @@ -105,8 +102,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - msp_port_isr_t *port = _isr_port(pin); /* check if port, pull resistor and flank configuration are valid */ @@ -158,8 +153,6 @@ void gpio_periph_mode(gpio_t pin, bool enable) void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - msp_port_isr_t *port = _isr_port(pin); if (port) { port->IE |= _pin(pin); @@ -168,8 +161,6 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - msp_port_isr_t *port = _isr_port(pin); if (port) { port->IE &= ~(_pin(pin)); @@ -178,8 +169,6 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - msp_port_t *port = _port(pin); if (port->DIR & _pin(pin)) { return (int)(port->OD & _pin(pin)); @@ -191,29 +180,21 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _port(pin)->OD |= _pin(pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _port(pin)->OD &= ~(_pin(pin)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - _port(pin)->OD ^= _pin(pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { _port(pin)->OD |= _pin(pin); } diff --git a/cpu/nrf5x_common/periph/gpio.c b/cpu/nrf5x_common/periph/gpio.c index 34334190088f..cacd1d9e8e4d 100644 --- a/cpu/nrf5x_common/periph/gpio.c +++ b/cpu/nrf5x_common/periph/gpio.c @@ -27,7 +27,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_cpu.h" #include "periph_conf.h" @@ -70,8 +69,6 @@ static inline int pin_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - switch (mode) { case GPIO_IN: case GPIO_IN_PD: @@ -90,8 +87,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - /* disable external interrupt in case one is active */ NRF_GPIOTE->INTENSET &= ~(GPIOTE_INTENSET_IN0_Msk); /* save callback */ @@ -115,24 +110,18 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - (void) pin; NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk; } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - (void) pin; NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk; } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - if (port(pin)->DIR & (1 << pin)) { return (port(pin)->OUT & (1 << pin)) ? 1 : 0; } @@ -143,29 +132,21 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - port(pin)->OUTSET = (1 << pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - port(pin)->OUTCLR = (1 << pin); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - port(pin)->OUT ^= (1 << pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { port(pin)->OUTSET = (1 << pin); } else { diff --git a/cpu/sam0_common/periph/gpio.c b/cpu/sam0_common/periph/gpio.c index 95f2b9cb46fd..62be9b8e4a2c 100644 --- a/cpu/sam0_common/periph/gpio.c +++ b/cpu/sam0_common/periph/gpio.c @@ -25,7 +25,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -81,8 +80,6 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - PortGroup* port = _port(pin); int pin_pos = _pin_pos(pin); int pin_mask = _pin_mask(pin); @@ -117,8 +114,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - int exti = _exti(pin); /* make sure EIC channel is valid */ @@ -172,8 +167,6 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - int exti = _exti(pin); if (exti == -1) { return; @@ -183,8 +176,6 @@ void gpio_irq_enable(gpio_t pin) void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - int exti = _exti(pin); if (exti == -1) { return; @@ -194,8 +185,6 @@ void gpio_irq_disable(gpio_t pin) int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - PortGroup *port = _port(pin); int mask = _pin_mask(pin); @@ -209,29 +198,21 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _port(pin)->OUTSET.reg = _pin_mask(pin); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _port(pin)->OUTCLR.reg = _pin_mask(pin); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - _port(pin)->OUTTGL.reg = _pin_mask(pin); } void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { _port(pin)->OUTSET.reg = _pin_mask(pin); } else { diff --git a/cpu/sam3/periph/gpio.c b/cpu/sam3/periph/gpio.c index 0ffddb57936f..ebe7d73a244c 100644 --- a/cpu/sam3/periph/gpio.c +++ b/cpu/sam3/periph/gpio.c @@ -23,7 +23,6 @@ */ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" #include "periph_cpu.h" @@ -148,8 +147,6 @@ static void _ctx_clear(int port, int pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - Pio *port = _port(pin); int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -197,8 +194,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - Pio *port = _port(pin); int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -259,22 +254,16 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - NVIC_EnableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - NVIC_DisableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -288,22 +277,16 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - if (gpio_read(pin)) { _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } else { @@ -313,8 +296,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } else { diff --git a/cpu/stm32_common/periph/gpio.c b/cpu/stm32_common/periph/gpio.c index e555fe9990ae..7aa0eaba3b1c 100644 --- a/cpu/stm32_common/periph/gpio.c +++ b/cpu/stm32_common/periph/gpio.c @@ -28,7 +28,6 @@ #include "cpu.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -74,8 +73,6 @@ static inline int _pin_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -108,8 +105,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -198,43 +193,31 @@ void gpio_init_analog(gpio_t pin) void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - EXTI->IMR |= (1 << _pin_num(pin)); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - EXTI->IMR &= ~(1 << _pin_num(pin)); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - return (_port(pin)->IDR & (1 << _pin_num(pin))); } void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _port(pin)->BSRR = (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _port(pin)->BSRR = (1 << (_pin_num(pin) + 16)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - if (gpio_read(pin)) { gpio_clear(pin); } else { @@ -244,8 +227,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { gpio_set(pin); } else { diff --git a/cpu/stm32f1/periph/gpio.c b/cpu/stm32f1/periph/gpio.c index d58c69c023ae..448791dc6223 100644 --- a/cpu/stm32f1/periph/gpio.c +++ b/cpu/stm32f1/periph/gpio.c @@ -22,7 +22,6 @@ #include "cpu.h" #include "board.h" -#include "gpio_exp.h" #include "periph/gpio.h" #include "periph_cpu.h" #include "periph_conf.h" @@ -76,8 +75,6 @@ static inline int _pin_num(gpio_t pin) int gpio_init(gpio_t pin, gpio_mode_t mode) { - GPIO_INTERCEPT_INIT(pin, mode); - GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -105,8 +102,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { - GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg); - int pin_num = _pin_num(pin); /* disable interrupts on the channel we want to edit (just in case) */ @@ -167,22 +162,16 @@ void gpio_init_analog(gpio_t pin) void gpio_irq_enable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_ENABLE(pin); - EXTI->IMR |= (1 << _pin_num(pin)); } void gpio_irq_disable(gpio_t pin) { - GPIO_INTERCEPT_IRQ_DISABLE(pin); - EXTI->IMR &= ~(1 << _pin_num(pin)); } int gpio_read(gpio_t pin) { - GPIO_INTERCEPT_READ(pin); - GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -198,22 +187,16 @@ int gpio_read(gpio_t pin) void gpio_set(gpio_t pin) { - GPIO_INTERCEPT_SET(pin); - _port(pin)->BSRR = (1 << _pin_num(pin)); } void gpio_clear(gpio_t pin) { - GPIO_INTERCEPT_CLEAR(pin); - _port(pin)->BRR = (1 << _pin_num(pin)); } void gpio_toggle(gpio_t pin) { - GPIO_INTERCEPT_TOGGLE(pin); - if (gpio_read(pin)) { gpio_clear(pin); } @@ -224,8 +207,6 @@ void gpio_toggle(gpio_t pin) void gpio_write(gpio_t pin, int value) { - GPIO_INTERCEPT_WRITE(pin, value); - if (value) { _port(pin)->BSRR = (1 << _pin_num(pin)); } From 4db7bdcc2d893b2baf59a329bf218112b07a359f Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 16:43:58 -0400 Subject: [PATCH 14/18] cpu/*: support for periph/gpio API change --- cpu/atmega_common/periph/gpio.c | 30 +++++++++++++-------------- cpu/cc2538/periph/gpio.c | 22 ++++++++++---------- cpu/cc26x0/periph/gpio.c | 24 +++++++++++----------- cpu/efm32/periph/gpio.c | 22 ++++++++++---------- cpu/ezr32wg/periph/gpio.c | 22 ++++++++++---------- cpu/fe310/periph/gpio.c | 24 +++++++++++----------- cpu/kinetis/periph/gpio.c | 22 ++++++++++---------- cpu/lm4f120/periph/gpio.c | 32 ++++++++++++++--------------- cpu/lpc1768/periph/gpio.c | 22 ++++++++++---------- cpu/lpc2387/periph/gpio.c | 30 +++++++++++++-------------- cpu/mips_pic32_common/periph/gpio.c | 24 +++++++++++----------- cpu/msp430fxyz/periph/gpio.c | 24 +++++++++++----------- cpu/native/periph/gpio.c | 20 +++++++++--------- cpu/nrf5x_common/periph/gpio.c | 22 ++++++++++---------- cpu/sam0_common/periph/gpio.c | 22 ++++++++++---------- cpu/sam3/periph/gpio.c | 24 +++++++++++----------- cpu/stm32_common/periph/gpio.c | 32 ++++++++++++++--------------- cpu/stm32f1/periph/gpio.c | 28 ++++++++++++------------- 18 files changed, 223 insertions(+), 223 deletions(-) diff --git a/cpu/atmega_common/periph/gpio.c b/cpu/atmega_common/periph/gpio.c index a40ff5fecea1..994645ad79d0 100644 --- a/cpu/atmega_common/periph/gpio.c +++ b/cpu/atmega_common/periph/gpio.c @@ -126,7 +126,7 @@ static inline int8_t _int_num(gpio_t pin) return -1; } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { switch (mode) { case GPIO_OUT: @@ -146,7 +146,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int8_t int_num = _int_num(pin); @@ -166,7 +166,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* clear global interrupt flag */ cli(); @@ -197,49 +197,49 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { EIFR |= (1 << _int_num(pin)); EIMSK |= (1 << _int_num(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { EIMSK &= ~(1 << _int_num(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (_SFR_MEM8(_pin_addr(pin)) & (1 << _pin_num(pin))); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { - gpio_clear(pin); + if (gpio_read_ll(pin)) { + gpio_clear_ll(pin); } else { - gpio_set(pin); + gpio_set_ll(pin); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { - gpio_set(pin); + gpio_set_ll(pin); } else { - gpio_clear(pin); + gpio_clear_ll(pin); } } diff --git a/cpu/cc2538/periph/gpio.c b/cpu/cc2538/periph/gpio.c index 83a33c86c45d..734fe305e78a 100644 --- a/cpu/cc2538/periph/gpio.c +++ b/cpu/cc2538/periph/gpio.c @@ -93,7 +93,7 @@ static inline uint8_t _pp_num(gpio_t pin) return (uint8_t)((_port_num(pin) * GPIO_BITS_PER_PORT) + _pin_num(pin)); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* check if mode is valid */ if (mode == MODE_NOTSUP) { @@ -118,10 +118,10 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - if (gpio_init(pin, mode) != 0) { + if (gpio_init_ll(pin, mode) != 0) { return -1; } @@ -163,37 +163,37 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { gpio(pin)->IE |= _pin_mask(pin); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { gpio(pin)->IE &= ~_pin_mask(pin); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (int)(gpio(pin)->DATA & _pin_mask(pin)); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { gpio(pin)->DATA |= _pin_mask(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { gpio(pin)->DATA &= ~_pin_mask(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { gpio(pin)->DATA ^= _pin_mask(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { gpio(pin)->DATA |= _pin_mask(pin); diff --git a/cpu/cc26x0/periph/gpio.c b/cpu/cc26x0/periph/gpio.c index 7ca9090594b4..3b9f9ee88e9d 100644 --- a/cpu/cc26x0/periph/gpio.c +++ b/cpu/cc26x0/periph/gpio.c @@ -31,7 +31,7 @@ */ static gpio_isr_ctx_t gpio_chan[GPIO_ISR_CHAN_NUMOF]; -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { if ((unsigned int)pin > 31) return -1; @@ -51,10 +51,10 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - int init = gpio_init(pin, mode); + int init = gpio_init_ll(pin, mode); if (init != 0) return init; @@ -68,22 +68,22 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, /* clears the interrupt flag */ GPIO->EVFLAGS |= (1 << pin); - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { IOC->CFG[pin] |= IOCFG_EDGEIRQ_ENABLE; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { IOC->CFG[pin] &= ~IOCFG_EDGEIRQ_ENABLE; } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { if (GPIO->DOE & (1 << pin)) { return (GPIO->DOUT >> pin) & 1; @@ -93,22 +93,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { GPIO->DOUTSET = (1 << pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { GPIO->DOUTCLR = (1 << pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { GPIO->DOUTTGL = (1 << pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { GPIO->DOUTSET = (1 << pin); diff --git a/cpu/efm32/periph/gpio.c b/cpu/efm32/periph/gpio.c index e98dcc3b8531..2dba4700d51c 100644 --- a/cpu/efm32/periph/gpio.c +++ b/cpu/efm32/periph/gpio.c @@ -50,7 +50,7 @@ static inline uint32_t _pin_mask(gpio_t pin) return (1 << _pin_num(pin)); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* check for valid pin */ if (pin == GPIO_UNDEF) { @@ -70,10 +70,10 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - int result = gpio_init(pin, mode); + int result = gpio_init_ll(pin, mode); if (result != 0) { return result; @@ -99,37 +99,37 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { GPIO_IntEnable(_pin_mask(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { GPIO_IntDisable(_pin_mask(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return GPIO_PinInGet(_port_num(pin), _pin_num(pin)); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { GPIO_PinOutClear(_port_num(pin), _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { GPIO_PinOutToggle(_port_num(pin), _pin_num(pin)); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); diff --git a/cpu/ezr32wg/periph/gpio.c b/cpu/ezr32wg/periph/gpio.c index 2cabdb85f866..2ba9b2d408ef 100644 --- a/cpu/ezr32wg/periph/gpio.c +++ b/cpu/ezr32wg/periph/gpio.c @@ -55,7 +55,7 @@ static inline int _pin_mask(gpio_t pin) return (1 << _pin_pos(pin)); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { GPIO_P_TypeDef *port = _port(pin); uint32_t pin_pos = _pin_pos(pin); @@ -80,13 +80,13 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { uint32_t pin_pos = _pin_pos(pin); /* configure as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* just in case, disable interrupt for this channel */ GPIO->IEN &= ~(1 << pin_pos); @@ -107,37 +107,37 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { GPIO->IEN |= _pin_mask(pin); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { GPIO->IEN &= ~(_pin_mask(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return _port(pin)->DIN & _pin_mask(pin); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->DOUTSET = _pin_mask(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->DOUTCLR = _pin_mask(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { _port(pin)->DOUTTGL = _pin_mask(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->DOUTSET = _pin_mask(pin); diff --git a/cpu/fe310/periph/gpio.c b/cpu/fe310/periph/gpio.c index 85e19349956a..356356f8bac2 100644 --- a/cpu/fe310/periph/gpio.c +++ b/cpu/fe310/periph/gpio.c @@ -61,7 +61,7 @@ void gpio_isr(int num) } } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* Check for valid pin */ if (pin >= GPIO_NUMOF) { @@ -99,11 +99,11 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { /* Configure pin */ - if (gpio_init(pin, mode) != 0) { + if (gpio_init_ll(pin, mode) != 0) { return -1; } @@ -116,7 +116,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, PLIC_set_priority(INT_GPIO_BASE + pin, GPIO_INTR_PRIORITY); /* Configure the active flank(s) */ - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); /* Save callback */ isr_ctx[pin].cb = cb; @@ -129,7 +129,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { /* Check for valid pin */ if (pin >= GPIO_NUMOF) { @@ -156,7 +156,7 @@ void gpio_irq_enable(gpio_t pin) } } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { /* Check for valid pin */ if (pin >= GPIO_NUMOF) { @@ -183,27 +183,27 @@ void gpio_irq_disable(gpio_t pin) } } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (GPIO_REG(GPIO_INPUT_VAL) & (1 << pin)) ? 1 : 0; } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { GPIO_REG(GPIO_OUTPUT_VAL) ^= (1 << pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); diff --git a/cpu/kinetis/periph/gpio.c b/cpu/kinetis/periph/gpio.c index ec0155dfdc2b..f283c489b12c 100644 --- a/cpu/kinetis/periph/gpio.c +++ b/cpu/kinetis/periph/gpio.c @@ -179,7 +179,7 @@ static void ctx_clear(int port, int pin) write_map(port, pin, ctx); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* set pin to analog mode while configuring it */ gpio_init_port(pin, GPIO_AF_ANALOG); @@ -197,10 +197,10 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - if (gpio_init(pin, mode) < 0) { + if (gpio_init_ll(pin, mode) < 0) { return -1; } @@ -244,20 +244,20 @@ void gpio_init_port(gpio_t pin, uint32_t pcr) } } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { int ctx = get_ctx(port_num(pin), pin_num(pin)); port(pin)->PCR[pin_num(pin)] |= isr_ctx[ctx].state; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { int ctx = get_ctx(port_num(pin), pin_num(pin)); isr_ctx[ctx].state = port(pin)->PCR[pin_num(pin)] & PORT_PCR_IRQC_MASK; port(pin)->PCR[pin_num(pin)] &= ~(PORT_PCR_IRQC_MASK); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { if (gpio(pin)->PDDR & (1 << pin_num(pin))) { return (gpio(pin)->PDOR & (1 << pin_num(pin))) ? 1 : 0; @@ -267,22 +267,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { gpio(pin)->PSOR = (1 << pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { gpio(pin)->PCOR = (1 << pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { gpio(pin)->PTOR = (1 << pin_num(pin)); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { gpio(pin)->PSOR = (1 << pin_num(pin)); diff --git a/cpu/lm4f120/periph/gpio.c b/cpu/lm4f120/periph/gpio.c index 0cb0bbd90d70..488805c92acf 100644 --- a/cpu/lm4f120/periph/gpio.c +++ b/cpu/lm4f120/periph/gpio.c @@ -93,7 +93,7 @@ typedef struct { static gpio_state_t gpio_config[NUM_OF_PORT][NUM_OF_PINS]; -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -161,8 +161,8 @@ void isr_gpio_portf(void){ _isr_gpio(5); } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -194,7 +194,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, HWREG(port_addr+GPIO_DEN_R_OFF) |= pin_bit; HWREG(port_addr+GPIO_LOCK_R_OFF) = 0; - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); ROM_IntEnable(int_num); ROM_IntMasterEnable(); @@ -202,7 +202,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -213,7 +213,7 @@ void gpio_irq_enable(gpio_t pin) HWREG(im_reg_addr) |= pin_bit; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -225,7 +225,7 @@ void gpio_irq_disable(gpio_t pin) } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -234,7 +234,7 @@ int gpio_read(gpio_t pin) return HWREG(port_addr + ((1<> 1][_pin(pin)]); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { assert(_port(pin) == 0 || _port(pin) == 2); @@ -180,35 +180,35 @@ void gpio_irq_disable(gpio_t pin) } } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); return (base->FIOPIN & (1 << _pin(pin))) ? 1 : 0; } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); base->FIOSET = (1 << _pin(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); base->FIOCLR = (1 << _pin(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); base->FIOPIN ^= (1 << _pin(pin)); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { LPC_GPIO_TypeDef *base = _base(pin); diff --git a/cpu/lpc2387/periph/gpio.c b/cpu/lpc2387/periph/gpio.c index 3891c50b7f61..bd5f80e92401 100644 --- a/cpu/lpc2387/periph/gpio.c +++ b/cpu/lpc2387/periph/gpio.c @@ -63,7 +63,7 @@ static int _isr_map_entry(gpio_t pin) { return _pin; } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -94,8 +94,8 @@ int gpio_init_mux(unsigned pin, unsigned mux) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { (void)mode; @@ -198,7 +198,7 @@ static void _gpio_configure(gpio_t pin, unsigned rising, unsigned falling) irq_restore(state); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { int isr_map_entry =_isr_map_entry(pin); int _state_index = _gpio_isr_map[isr_map_entry]; @@ -213,12 +213,12 @@ void gpio_irq_enable(gpio_t pin) bf_isset(_gpio_falling, _state_index)); } -void gpio_irq_disable(gpio_t dev) +void gpio_irq_disable_ll(gpio_t dev) { _gpio_configure(dev, 0, 0); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -226,7 +226,7 @@ int gpio_read(gpio_t pin) return (_port->PIN & (1 << _pin)) != 0; } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -234,7 +234,7 @@ void gpio_set(gpio_t pin) _port->SET = 1 << _pin; } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -242,23 +242,23 @@ void gpio_clear(gpio_t pin) _port->CLR = 1 << _pin; } -void gpio_toggle(gpio_t dev) +void gpio_toggle_ll(gpio_t dev) { - if (gpio_read(dev)) { - gpio_clear(dev); + if (gpio_read_ll(dev)) { + gpio_clear_ll(dev); } else { - gpio_set(dev); + gpio_set_ll(dev); } } -void gpio_write(gpio_t dev, int value) +void gpio_write_ll(gpio_t dev, int value) { if (value) { - gpio_set(dev); + gpio_set_ll(dev); } else { - gpio_clear(dev); + gpio_clear_ll(dev); } } diff --git a/cpu/mips_pic32_common/periph/gpio.c b/cpu/mips_pic32_common/periph/gpio.c index b2b4a8f90304..eec130d0a2db 100644 --- a/cpu/mips_pic32_common/periph/gpio.c +++ b/cpu/mips_pic32_common/periph/gpio.c @@ -120,7 +120,7 @@ static inline int check_valid_port(uint8_t port) && base_address[port].gpio != NULL; } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { uint8_t port = GPIO_PORT(pin); uint32_t pin_no = GPIO_PIN_NO(pin); @@ -172,8 +172,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { (void)pin; (void)mode; @@ -186,52 +186,52 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { (void)pin; /* TODO: Not implemented yet */ } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { (void)pin; /* TODO: Not implemented yet */ } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); return PORTx(GPIO_PORT(pin)) & GPIO_PIN_NO(pin); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); LATxSET(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); LATxCLR(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); LATxINV(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) - gpio_set(pin); + gpio_set_ll(pin); else - gpio_clear(pin); + gpio_clear_ll(pin); } diff --git a/cpu/msp430fxyz/periph/gpio.c b/cpu/msp430fxyz/periph/gpio.c index e6682eb950a9..e776adaaf5b1 100644 --- a/cpu/msp430fxyz/periph/gpio.c +++ b/cpu/msp430fxyz/periph/gpio.c @@ -79,7 +79,7 @@ static int _ctx(gpio_t pin) return (_port(pin) == PORT_1) ? i : (i + 8); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { msp_port_t *port = _port(pin); @@ -99,8 +99,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { msp_port_isr_t *port = _isr_port(pin); @@ -112,7 +112,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, /* disable any activated interrupt */ port->IE &= ~(_pin(pin)); /* configure as input */ - if (gpio_init(pin, mode) < 0) { + if (gpio_init_ll(pin, mode) < 0) { return -1; } /* save ISR context */ @@ -123,7 +123,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, port->IES |= (flank & _pin(pin)); /* clear pending interrupts and enable the IRQ */ port->IFG &= ~(_pin(pin)); - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); return 0; } @@ -151,7 +151,7 @@ void gpio_periph_mode(gpio_t pin, bool enable) } } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { msp_port_isr_t *port = _isr_port(pin); if (port) { @@ -159,7 +159,7 @@ void gpio_irq_enable(gpio_t pin) } } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { msp_port_isr_t *port = _isr_port(pin); if (port) { @@ -167,7 +167,7 @@ void gpio_irq_disable(gpio_t pin) } } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { msp_port_t *port = _port(pin); if (port->DIR & _pin(pin)) { @@ -178,22 +178,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->OD |= _pin(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->OD &= ~(_pin(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { _port(pin)->OD ^= _pin(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->OD |= _pin(pin); diff --git a/cpu/native/periph/gpio.c b/cpu/native/periph/gpio.c index 156b2f42011b..3664529120cd 100644 --- a/cpu/native/periph/gpio.c +++ b/cpu/native/periph/gpio.c @@ -19,15 +19,15 @@ #include "periph/gpio.h" -int gpio_init(gpio_t pin, gpio_mode_t mode) { +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { (void) pin; (void) mode; return -1; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg){ +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg){ (void) pin; (void) mode; (void) flank; @@ -37,33 +37,33 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } -void gpio_irq_enable(gpio_t pin) { +void gpio_irq_enable_ll(gpio_t pin) { (void) pin; } -void gpio_irq_disable(gpio_t pin) { +void gpio_irq_disable_ll(gpio_t pin) { (void) pin; } -int gpio_read(gpio_t pin) { +int gpio_read_ll(gpio_t pin) { (void) pin; return 0; } -void gpio_set(gpio_t pin) { +void gpio_set_ll(gpio_t pin) { (void) pin; } -void gpio_clear(gpio_t pin) { +void gpio_clear_ll(gpio_t pin) { (void) pin; } -void gpio_toggle(gpio_t pin) { +void gpio_toggle_ll(gpio_t pin) { (void) pin; } -void gpio_write(gpio_t pin, int value) { +void gpio_write_ll(gpio_t pin, int value) { (void) pin; (void) value; } diff --git a/cpu/nrf5x_common/periph/gpio.c b/cpu/nrf5x_common/periph/gpio.c index cacd1d9e8e4d..1d86569c5729 100644 --- a/cpu/nrf5x_common/periph/gpio.c +++ b/cpu/nrf5x_common/periph/gpio.c @@ -67,7 +67,7 @@ static inline int pin_num(gpio_t pin) #endif } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { switch (mode) { case GPIO_IN: @@ -84,8 +84,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { /* disable external interrupt in case one is active */ NRF_GPIOTE->INTENSET &= ~(GPIOTE_INTENSET_IN0_Msk); @@ -93,7 +93,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, exti_chan.cb = cb; exti_chan.arg = arg; /* configure pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* set interrupt priority and enable global GPIOTE interrupt */ NVIC_EnableIRQ(GPIOTE_IRQn); /* configure the GPIOTE channel: set even mode, pin and active flank */ @@ -108,19 +108,19 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { (void) pin; NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { (void) pin; NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk; } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { if (port(pin)->DIR & (1 << pin)) { return (port(pin)->OUT & (1 << pin)) ? 1 : 0; @@ -130,22 +130,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { port(pin)->OUTSET = (1 << pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { port(pin)->OUTCLR = (1 << pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { port(pin)->OUT ^= (1 << pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { port(pin)->OUTSET = (1 << pin); diff --git a/cpu/sam0_common/periph/gpio.c b/cpu/sam0_common/periph/gpio.c index 62be9b8e4a2c..6d6acbe4d5d6 100644 --- a/cpu/sam0_common/periph/gpio.c +++ b/cpu/sam0_common/periph/gpio.c @@ -78,7 +78,7 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) port->PMUX[pin_pos >> 1].reg |= (mux << (4 * (pin_pos & 0x1))); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { PortGroup* port = _port(pin); int pin_pos = _pin_pos(pin); @@ -111,8 +111,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { int exti = _exti(pin); @@ -125,7 +125,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_config[exti].cb = cb; gpio_config[exti].arg = arg; /* configure pin as input and set MUX to peripheral function A */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); gpio_init_mux(pin, GPIO_MUX_A); #ifdef CPU_FAM_SAMD21 /* enable clocks for the EIC module */ @@ -165,7 +165,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { int exti = _exti(pin); if (exti == -1) { @@ -174,7 +174,7 @@ void gpio_irq_enable(gpio_t pin) EIC->INTENSET.reg = (1 << exti); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { int exti = _exti(pin); if (exti == -1) { @@ -183,7 +183,7 @@ void gpio_irq_disable(gpio_t pin) EIC->INTENCLR.reg = (1 << exti); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { PortGroup *port = _port(pin); int mask = _pin_mask(pin); @@ -196,22 +196,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->OUTSET.reg = _pin_mask(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->OUTCLR.reg = _pin_mask(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { _port(pin)->OUTTGL.reg = _pin_mask(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->OUTSET.reg = _pin_mask(pin); diff --git a/cpu/sam3/periph/gpio.c b/cpu/sam3/periph/gpio.c index ebe7d73a244c..564a30706a79 100644 --- a/cpu/sam3/periph/gpio.c +++ b/cpu/sam3/periph/gpio.c @@ -145,7 +145,7 @@ static void _ctx_clear(int port, int pin) } } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -191,8 +191,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -204,7 +204,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, } /* configure pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* try go grab a free spot in the context array */ int ctx_num = _get_free_ctx(); @@ -252,17 +252,17 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) _port(pin)->PIO_ABSR |= (mux << _pin_num(pin)); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { NVIC_EnableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { NVIC_DisableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -275,26 +275,26 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { + if (gpio_read_ll(pin)) { _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } else { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); diff --git a/cpu/stm32_common/periph/gpio.c b/cpu/stm32_common/periph/gpio.c index 7aa0eaba3b1c..d81f129db934 100644 --- a/cpu/stm32_common/periph/gpio.c +++ b/cpu/stm32_common/periph/gpio.c @@ -71,7 +71,7 @@ static inline int _pin_num(gpio_t pin) return (pin & 0x0f); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -102,8 +102,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -120,7 +120,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, #endif /* initialize pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* enable global pin interrupt */ #if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32L0) @@ -191,46 +191,46 @@ void gpio_init_analog(gpio_t pin) _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin))); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { EXTI->IMR |= (1 << _pin_num(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { EXTI->IMR &= ~(1 << _pin_num(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (_port(pin)->IDR & (1 << _pin_num(pin))); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->BSRR = (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->BSRR = (1 << (_pin_num(pin) + 16)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { - gpio_clear(pin); + if (gpio_read_ll(pin)) { + gpio_clear_ll(pin); } else { - gpio_set(pin); + gpio_set_ll(pin); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { - gpio_set(pin); + gpio_set_ll(pin); } else { - gpio_clear(pin); + gpio_clear_ll(pin); } } diff --git a/cpu/stm32f1/periph/gpio.c b/cpu/stm32f1/periph/gpio.c index 448791dc6223..5f8750242698 100644 --- a/cpu/stm32f1/periph/gpio.c +++ b/cpu/stm32f1/periph/gpio.c @@ -73,7 +73,7 @@ static inline int _pin_num(gpio_t pin) } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -99,15 +99,15 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; /* all OK */ } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { int pin_num = _pin_num(pin); /* disable interrupts on the channel we want to edit (just in case) */ EXTI->IMR &= ~(1 << pin_num); /* configure pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* set callback */ exti_ctx[pin_num].cb = cb; exti_ctx[pin_num].arg = arg; @@ -160,17 +160,17 @@ void gpio_init_analog(gpio_t pin) _port(pin)->CR[pin_num >= 8] &= ~(0xfl << (4 * (pin_num - ((pin_num >= 8) * 8)))); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { EXTI->IMR |= (1 << _pin_num(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { EXTI->IMR &= ~(1 << _pin_num(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -185,27 +185,27 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->BSRR = (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->BRR = (1 << _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { - gpio_clear(pin); + if (gpio_read_ll(pin)) { + gpio_clear_ll(pin); } else { - gpio_set(pin); + gpio_set_ll(pin); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->BSRR = (1 << _pin_num(pin)); From 8635ee2c7b4c704be912c3702b50ae3dffd91020 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 16:55:22 -0400 Subject: [PATCH 15/18] periph/gpio: split functions to create low-level versions --- drivers/include/periph/gpio.h | 67 +++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/drivers/include/periph/gpio.h b/drivers/include/periph/gpio.h index 46c03ebc8f2a..8ba1d65ef728 100644 --- a/drivers/include/periph/gpio.h +++ b/drivers/include/periph/gpio.h @@ -133,6 +133,26 @@ typedef struct { } gpio_isr_ctx_t; #endif +/** + * @brief Low-level versions of the GPIO functions + * + * These are for implementation in cpu/*/periph/gpio.c and should not be + * called directly. + * + * @{ + */ +int gpio_init_ll(gpio_t pin, gpio_mode_t mode); +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg); +void gpio_irq_enable_ll(gpio_t pin); +void gpio_irq_disable_ll(gpio_t pin); +int gpio_read_ll(gpio_t pin); +void gpio_set_ll(gpio_t pin); +void gpio_clear_ll(gpio_t pin); +void gpio_toggle_ll(gpio_t pin); +void gpio_write_ll(gpio_t pin, int value); +/** @} */ + /** * @brief Initialize the given pin as general purpose input or output * @@ -146,7 +166,10 @@ typedef struct { * @return 0 on success * @return -1 on error */ -int gpio_init(gpio_t pin, gpio_mode_t mode); +inline int gpio_init(gpio_t pin, gpio_mode_t mode) +{ + return gpio_init_ll(pin, mode); +} /** * @brief Initialize a GPIO pin for external interrupt usage @@ -165,22 +188,31 @@ int gpio_init(gpio_t pin, gpio_mode_t mode); * @return 0 on success * @return -1 on error */ -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg); +inline int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) +{ + return gpio_init_int_ll(pin, mode, flank, cb, arg); +} /** * @brief Enable pin interrupt if configured as interrupt source * * @param[in] pin the pin to enable the interrupt for */ -void gpio_irq_enable(gpio_t pin); +inline void gpio_irq_enable(gpio_t pin) +{ + gpio_irq_enable_ll(pin); +} /** * @brief Disable the pin interrupt if configured as interrupt source * * @param[in] pin the pin to disable the interrupt for */ -void gpio_irq_disable(gpio_t pin); +inline void gpio_irq_disable(gpio_t pin) +{ + gpio_irq_disable_ll(pin); +} /** * @brief Get the current value of the given pin @@ -190,28 +222,40 @@ void gpio_irq_disable(gpio_t pin); * @return 0 when pin is LOW * @return >0 for HIGH */ -int gpio_read(gpio_t pin); +inline int gpio_read(gpio_t pin) +{ + return gpio_read_ll(pin); +} /** * @brief Set the given pin to HIGH * * @param[in] pin the pin to set */ -void gpio_set(gpio_t pin); +inline void gpio_set(gpio_t pin) +{ + gpio_set_ll(pin); +} /** * @brief Set the given pin to LOW * * @param[in] pin the pin to clear */ -void gpio_clear(gpio_t pin); +inline void gpio_clear(gpio_t pin) +{ + gpio_clear_ll(pin); +} /** * @brief Toggle the value of the given pin * * @param[in] pin the pin to toggle */ -void gpio_toggle(gpio_t pin); +inline void gpio_toggle(gpio_t pin) +{ + gpio_toggle_ll(pin); +} /** * @brief Set the given pin to the given value @@ -219,7 +263,10 @@ void gpio_toggle(gpio_t pin); * @param[in] pin the pin to set * @param[in] value value to set the pin to, 0 for LOW, HIGH otherwise */ -void gpio_write(gpio_t pin, int value); +inline void gpio_write(gpio_t pin, int value) +{ + gpio_write_ll(pin, value); +} #ifdef __cplusplus } From 7e20c741aa261506b8b81ae5942f1f6e5f6e96da Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 17:22:56 -0400 Subject: [PATCH 16/18] periph/gpio: support for drivers/gpio_exp --- drivers/include/periph/gpio.h | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/drivers/include/periph/gpio.h b/drivers/include/periph/gpio.h index 8ba1d65ef728..7be0ac1ecbd7 100644 --- a/drivers/include/periph/gpio.h +++ b/drivers/include/periph/gpio.h @@ -58,6 +58,10 @@ #include "periph_cpu.h" #include "periph_conf.h" +#ifdef MODULE_GPIO_EXP +#include "gpio_exp.h" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -168,6 +172,18 @@ void gpio_write_ll(gpio_t pin, int value); */ inline int gpio_init(gpio_t pin, gpio_mode_t mode) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return -1; + } + return exp_entry->driver->init(exp_entry->dev, + gpio_exp_pin(pin), mode); + } +#endif + return gpio_init_ll(pin, mode); } @@ -191,6 +207,18 @@ inline int gpio_init(gpio_t pin, gpio_mode_t mode) inline int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return -1; + } + return exp_entry->driver->init_int(exp_entry->dev, + gpio_exp_pin(pin), mode, flank, cb, arg); + } +#endif + return gpio_init_int_ll(pin, mode, flank, cb, arg); } @@ -201,6 +229,18 @@ inline int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, */ inline void gpio_irq_enable(gpio_t pin) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return; + } + exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 1); + return; + } +#endif + gpio_irq_enable_ll(pin); } @@ -211,6 +251,18 @@ inline void gpio_irq_enable(gpio_t pin) */ inline void gpio_irq_disable(gpio_t pin) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return; + } + exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 0); + return; + } +#endif + gpio_irq_disable_ll(pin); } @@ -224,6 +276,17 @@ inline void gpio_irq_disable(gpio_t pin) */ inline int gpio_read(gpio_t pin) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return 0; + } + return exp_entry->driver->read(exp_entry->dev, gpio_exp_pin(pin)); + } +#endif + return gpio_read_ll(pin); } @@ -234,6 +297,14 @@ inline int gpio_read(gpio_t pin) */ inline void gpio_set(gpio_t pin) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_write(pin, 1); + return; + } +#endif + gpio_set_ll(pin); } @@ -244,6 +315,14 @@ inline void gpio_set(gpio_t pin) */ inline void gpio_clear(gpio_t pin) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_write(pin, 0); + return; + } +#endif + gpio_clear_ll(pin); } @@ -254,6 +333,19 @@ inline void gpio_clear(gpio_t pin) */ inline void gpio_toggle(gpio_t pin) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + if (gpio_read(pin)) { + gpio_write(pin, 1); + } + else { + gpio_write(pin, 0); + } + return; + } +#endif + gpio_toggle_ll(pin); } @@ -265,6 +357,18 @@ inline void gpio_toggle(gpio_t pin) */ inline void gpio_write(gpio_t pin, int value) { +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return; + } + exp_entry->driver->write(exp_entry->dev, gpio_exp_pin(pin), value); + return; + } +#endif + gpio_write_ll(pin, value); } From dc969e18a350c600c8d3cf0ac9ffbd0f7fdd26d5 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 17:24:35 -0400 Subject: [PATCH 17/18] fixup! drivers/gpio_exp: initial support --- drivers/include/gpio_exp.h | 149 ------------------------------------- 1 file changed, 149 deletions(-) diff --git a/drivers/include/gpio_exp.h b/drivers/include/gpio_exp.h index b212b83d0b09..0091b8b86004 100644 --- a/drivers/include/gpio_exp.h +++ b/drivers/include/gpio_exp.h @@ -163,155 +163,6 @@ gpio_exp_t *gpio_exp_entry(gpio_t gpio); */ gpio_t gpio_exp_pin(gpio_t gpio); -#ifdef MODULE_GPIO_EXP - -/** - * @brief Macro for intercepting and redirecting gpio_init calls - */ -#define GPIO_INTERCEPT_INIT(pin, mode) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return -1; \ - } \ - return exp_entry->driver->init(exp_entry->dev, gpio_exp_pin(pin), mode); \ - } \ - } \ - while (0) - -/** - * @brief Macro for intercepting and redirecting gpio_init_int calls - */ -#define GPIO_INTERCEPT_INIT_INT(pin, mode, flank, cb, arg) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return -1; \ - } \ - return exp_entry->driver->init_int(exp_entry->dev, \ - gpio_exp_pin(pin), mode, flank, cb, arg); \ - } \ - } \ - while (0) - -/** - * @brief Macro for intercepting and redirecting gpio_irq_enable calls - */ -#define GPIO_INTERCEPT_IRQ_ENABLE(pin) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return; \ - } \ - exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 1); \ - return; \ - } \ - } \ - while (0) - -/** - * @brief Macro for intercepting and redirecting gpio_irq_disable calls - */ -#define GPIO_INTERCEPT_IRQ_DISABLE(pin) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return; \ - } \ - exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 0); \ - return; \ - } \ - } \ - while (0) - -/** - * @brief Macro for intercepting and redirecting gpio_read calls - */ -#define GPIO_INTERCEPT_READ(pin) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return -1; \ - } \ - return exp_entry->driver->read(exp_entry->dev, gpio_exp_pin(pin)); \ - } \ - } \ - while (0) - -/** - * @brief Macro for intercepting and redirecting gpio_set calls - */ -#define GPIO_INTERCEPT_SET(pin) GPIO_INTERCEPT_WRITE(pin, 1) - -/** - * @brief Macro for intercepting and redirecting gpio_clear calls - */ -#define GPIO_INTERCEPT_CLEAR(pin) GPIO_INTERCEPT_WRITE(pin, 0) - -/** - * @brief Macro for intercepting and redirecting gpio_toggle calls - */ -#define GPIO_INTERCEPT_TOGGLE(pin) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return; \ - } \ - if (exp_entry->driver->read(exp_entry->dev, gpio_exp_pin(pin))) { \ - exp_entry->driver->write(exp_entry->dev, \ - gpio_exp_pin(pin), 0); \ - } \ - else { \ - exp_entry->driver->write(exp_entry->dev, \ - gpio_exp_pin(pin), 1); \ - } \ - } \ - } \ - while (0) - -/** - * @brief Macro for intercepting and redirecting gpio_write calls - */ -#define GPIO_INTERCEPT_WRITE(pin, value) \ - do { \ - if (pin > GPIO_EXP_THRESH) { \ - gpio_exp_t *exp_entry = gpio_exp_entry(pin); \ - if (exp_entry == NULL) { \ - return; \ - } \ - exp_entry->driver->write(exp_entry->dev, \ - gpio_exp_pin(pin), value); \ - } \ - } \ - while (0) - -#else /* MODULE_GPIO_EXP */ - -/** - * @brief No-ops for when no GPIO expander intercepts are performed - * @{ - */ -#define GPIO_INTERCEPT_NOOP do {} while (0) -#define GPIO_INTERCEPT_INIT(pin, mode) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_INIT_INT(pin, mode, \ - flank, cb, arg) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_IRQ_ENABLE(pin) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_IRQ_DISABLE(pin) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_READ(pin) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_SET(pin) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_CLEAR(pin) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_TOGGLE(pin) GPIO_INTERCEPT_NOOP -#define GPIO_INTERCEPT_WRITE(pin, value) GPIO_INTERCEPT_NOOP -/** @} */ - -#endif /* MODULE_GPIO_EXP */ - #ifdef __cplusplus } #endif From 4ec68f613541c2e3ad128cfed2010b67e323c227 Mon Sep 17 00:00:00 2001 From: Matthew Blue Date: Sat, 14 Jul 2018 17:30:52 -0400 Subject: [PATCH 18/18] fixup! periph/gpio: split functions to create low-level versions --- drivers/include/periph/gpio.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/include/periph/gpio.h b/drivers/include/periph/gpio.h index 7be0ac1ecbd7..57a0f0aeba5a 100644 --- a/drivers/include/periph/gpio.h +++ b/drivers/include/periph/gpio.h @@ -140,9 +140,7 @@ typedef struct { /** * @brief Low-level versions of the GPIO functions * - * These are for implementation in cpu/*/periph/gpio.c and should not be - * called directly. - * + * These are for cpu gpio.c implementation and should not be called directly. * @{ */ int gpio_init_ll(gpio_t pin, gpio_mode_t mode);