diff --git a/boards/arduino-due/include/periph_conf.h b/boards/arduino-due/include/periph_conf.h index 037f3bec38..b5e594dc33 100644 --- a/boards/arduino-due/include/periph_conf.h +++ b/boards/arduino-due/include/periph_conf.h @@ -113,208 +113,6 @@ static const uart_conf_t uart_config[] = { #define SPI_0_SCK_PORT_CLKEN() (PMC->PMC_PCER0 |= (1 << ID_PIOA)); /** @} */ -/** - * @name GPIO configuration - * @{ - */ -#define GPIO_0_EN 1 -#define GPIO_1_EN 1 -#define GPIO_2_EN 1 -#define GPIO_3_EN 1 -#define GPIO_4_EN 1 -#define GPIO_5_EN 1 -#define GPIO_6_EN 1 -#define GPIO_7_EN 1 -#define GPIO_8_EN 1 -#define GPIO_9_EN 1 -#define GPIO_10_EN 1 -#define GPIO_11_EN 1 -#define GPIO_12_EN 1 -#define GPIO_13_EN 1 -#define GPIO_14_EN 1 -#define GPIO_15_EN 1 -#define GPIO_16_EN 1 -#define GPIO_17_EN 1 -#define GPIO_18_EN 1 -#define GPIO_19_EN 1 -#define GPIO_20_EN 1 -#define GPIO_21_EN 1 -#define GPIO_22_EN 1 -#define GPIO_23_EN 1 -#define GPIO_24_EN 1 -#define GPIO_25_EN 1 -#define GPIO_26_EN 1 -#define GPIO_27_EN 1 -#define GPIO_28_EN 1 -#define GPIO_29_EN 1 -#define GPIO_30_EN 1 -#define GPIO_31_EN 1 - -/* interrupt priority */ -#define GPIO_IRQ_PRIO 1 - -/* GPIO channel 0 config */ -#define GPIO_0_DEV PIOA -#define GPIO_0_PIN PIO_PA14 -#define GPIO_0_IRQ PIOA_IRQn -#define GPIO_A14_MAP 0 -/* GPIO channel 1 config */ -#define GPIO_1_DEV PIOD -#define GPIO_1_PIN PIO_PD0 -#define GPIO_1_IRQ PIOD_IRQn -#define GPIO_D0_MAP 1 -/* GPIO channel 2 config */ -#define GPIO_2_DEV PIOD -#define GPIO_2_PIN PIO_PD2 -#define GPIO_2_IRQ PIOD_IRQn -#define GPIO_D2_MAP 2 -/* GPIO channel 3 config */ -#define GPIO_3_DEV PIOD -#define GPIO_3_PIN PIO_PD6 -#define GPIO_3_IRQ PIOD_IRQn -#define GPIO_D6_MAP 3 -/* GPIO channel 4 config */ -#define GPIO_4_DEV PIOA -#define GPIO_4_PIN PIO_PA7 -#define GPIO_4_IRQ PIOA_IRQn -#define GPIO_A7_MAP 4 -/* GPIO channel 5 config */ -#define GPIO_5_DEV PIOC -#define GPIO_5_PIN PIO_PC1 -#define GPIO_5_IRQ PIOC_IRQn -#define GPIO_C1_MAP 5 -/* GPIO channel 6 config */ -#define GPIO_6_DEV PIOC -#define GPIO_6_PIN PIO_PC3 -#define GPIO_6_IRQ PIOC_IRQn -#define GPIO_C3_MAP 6 -/* GPIO channel 7 config */ -#define GPIO_7_DEV PIOC -#define GPIO_7_PIN PIO_PC5 -#define GPIO_7_IRQ PIOC_IRQn -#define GPIO_C5_MAP 7 -/* GPIO channel 8 config */ -#define GPIO_8_DEV PIOC -#define GPIO_8_PIN PIO_PC7 -#define GPIO_8_IRQ PIOC_IRQn -#define GPIO_C7_MAP 8 -/* GPIO channel 9 config */ -#define GPIO_9_DEV PIOC -#define GPIO_9_PIN PIO_PC9 -#define GPIO_9_IRQ PIOC_IRQn -#define GPIO_C9_MAP 9 -/* GPIO channel 10 config */ -#define GPIO_10_DEV PIOA -#define GPIO_10_PIN PIO_PA20 -#define GPIO_10_IRQ PIOA_IRQn -#define GPIO_A20_MAP 10 -/* GPIO channel 11 config */ -#define GPIO_11_DEV PIOC -#define GPIO_11_PIN PIO_PC18 -#define GPIO_11_IRQ PIOC_IRQn -#define GPIO_C18_MAP 11 -/* GPIO channel 12 config */ -#define GPIO_12_DEV PIOC -#define GPIO_12_PIN PIO_PC16 -#define GPIO_12_IRQ PIOC_IRQn -#define GPIO_C16_MAP 12 -/* GPIO channel 13 config */ -#define GPIO_13_DEV PIOC -#define GPIO_13_PIN PIO_PC14 -#define GPIO_13_IRQ PIOC_IRQn -#define GPIO_C14_MAP 13 -/* GPIO channel 14 config */ -#define GPIO_14_DEV PIOC -#define GPIO_14_PIN PIO_PC12 -#define GPIO_14_IRQ PIOC_IRQn -#define GPIO_C12_MAP 14 -/* GPIO channel 15 config */ -#define GPIO_15_DEV PIOB -#define GPIO_15_PIN PIO_PB14 -#define GPIO_15_IRQ PIOB_IRQn -#define GPIO_B14_MAP 15 -/* GPIO channel 16 config */ -#define GPIO_16_DEV PIOB -#define GPIO_16_PIN PIO_PB26 -#define GPIO_16_IRQ PIOB_IRQn -#define GPIO_B26_MAP 16 -/* GPIO channel 17 config */ -#define GPIO_17_DEV PIOA -#define GPIO_17_PIN PIO_PA15 -#define GPIO_17_IRQ PIOA_IRQn -#define GPIO_A15_MAP 17 -/* GPIO channel 18 config */ -#define GPIO_18_DEV PIOD -#define GPIO_18_PIN PIO_PD1 -#define GPIO_18_IRQ PIOD_IRQn -#define GPIO_D1_MAP 18 -/* GPIO channel 19 config */ -#define GPIO_19_DEV PIOD -#define GPIO_19_PIN PIO_PD3 -#define GPIO_19_IRQ PIOD_IRQn -#define GPIO_D3_MAP 19 -/* GPIO channel 20 config */ -#define GPIO_20_DEV PIOD -#define GPIO_20_PIN PIO_PD9 -#define GPIO_20_IRQ PIOD_IRQn -#define GPIO_D9_MAP 20 -/* GPIO channel 21 config */ -#define GPIO_21_DEV PIOD -#define GPIO_21_PIN PIO_PD10 -#define GPIO_21_IRQ PIOD_IRQn -#define GPIO_D10_MAP 21 -/* GPIO channel 22 config */ -#define GPIO_22_DEV PIOC -#define GPIO_22_PIN PIO_PC2 -#define GPIO_22_IRQ PIOC_IRQn -#define GPIO_C2_MAP 22 -/* GPIO channel 23 config */ -#define GPIO_23_DEV PIOC -#define GPIO_23_PIN PIO_PC4 -#define GPIO_23_IRQ PIOC_IRQn -#define GPIO_C4_MAP 23 -/* GPIO channel 24 config */ -#define GPIO_24_DEV PIOC -#define GPIO_24_PIN PIO_PC6 -#define GPIO_24_IRQ PIOC_IRQn -#define GPIO_C6_MAP 24 -/* GPIO channel 25 config */ -#define GPIO_25_DEV PIOC -#define GPIO_25_PIN PIO_PC8 -#define GPIO_25_IRQ PIOC_IRQn -#define GPIO_C8_MAP 25 -/* GPIO channel 26 config */ -#define GPIO_26_DEV PIOA -#define GPIO_26_PIN PIO_PA19 -#define GPIO_26_IRQ PIOA_IRQn -#define GPIO_A19_MAP 26 -/* GPIO channel 27 config */ -#define GPIO_27_DEV PIOC -#define GPIO_27_PIN PIO_PC19 -#define GPIO_27_IRQ PIOC_IRQn -#define GPIO_C19_MAP 27 -/* GPIO channel 28 config */ -#define GPIO_28_DEV PIOC -#define GPIO_28_PIN PIO_PC17 -#define GPIO_28_IRQ PIOC_IRQn -#define GPIO_C17_MAP 28 -/* GPIO channel 29 config */ -#define GPIO_29_DEV PIOC -#define GPIO_29_PIN PIO_PC15 -#define GPIO_29_IRQ PIOC_IRQn -#define GPIO_C15_MAP 29 -/* GPIO channel 30 config */ -#define GPIO_30_DEV PIOC -#define GPIO_30_PIN PIO_PC13 -#define GPIO_30_IRQ PIOC_IRQn -#define GPIO_C13_MAP 30 -/* GPIO channel 31 config */ -#define GPIO_31_DEV PIOB -#define GPIO_31_PIN PIO_PB21 -#define GPIO_31_IRQ PIOB_IRQn -#define GPIO_B21_MAP 31 -/** @} */ - /** * @name PWM configuration * @{ diff --git a/cpu/sam3/include/periph_cpu.h b/cpu/sam3/include/periph_cpu.h index 7b9cf21ab4..b666f60600 100644 --- a/cpu/sam3/include/periph_cpu.h +++ b/cpu/sam3/include/periph_cpu.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2015 Freie Universität Berlin + * 2015 Hamburg University of Applied Sciences * * 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 @@ -7,26 +8,46 @@ */ /** - * @ingroup cpu_sam3x8e + * @ingroup cpu_sam3x8e * @{ * * @file - * @brief CPU specific definitions for internal peripheral handling + * @brief CPU specific definitions for internal peripheral handling + * + * @author Hauke Petersen + * @author Tobias Fredersdorf * - * @author Hauke Petersen */ -#ifndef PERIPH_CPU_H_ -#define PERIPH_CPU_H_ +#ifndef PERIPH_CPU_H +#define PERIPH_CPU_H #include "cpu.h" + #ifdef __cplusplus extern "C" { #endif /** - * @brief declare needed generic SPI functions + * @brief Overwrite the default gpio_t type definition + */ +#define HAVE_GPIO_T +typedef uint32_t gpio_t; +/** @} */ + +/** + * @brief Definition of a fitting UNDEF value + */ +#define GPIO_UNDEF (0xffffffff) + +/** + * @brief Define a CPU specific GPIO pin generator macro + */ +#define GPIO_PIN(x, y) (((uint32_t)PIOA + (x << 9)) | y) + +/** + * @brief Declare needed generic SPI functions * @{ */ #define PERIPH_SPI_NEEDS_TRANSFER_BYTES @@ -34,6 +55,40 @@ extern "C" { #define PERIPH_SPI_NEEDS_TRANSFER_REGS /** @} */ +/** + * @brief Override values for pull register configuration + * @{ + */ +#define HAVE_GPIO_PP_T +typedef enum { + GPIO_NOPULL = 4, /**< do not use internal pull resistors */ + GPIO_PULLUP = 9, /**< enable internal pull-up resistor */ + GPIO_PULLDOWN = 8 /**< enable internal pull-down resistor */ +} gpio_pp_t; +/** @} */ + +/** + * @brief Override flank configuration values + * @{ + */ +#define HAVE_GPIO_FLANK_T +typedef enum { + GPIO_RISING = 1, /**< emit interrupt on rising flank */ + GPIO_FALLING = 2, /**< emit interrupt on falling flank */ + GPIO_BOTH = 3 /**< emit interrupt on both flanks */ +} gpio_flank_t; +/** @} */ + +/** + * @brief Available ports on the SAM3X8E + */ +enum { + PA = 0, /**< port A */ + PB = 1, /**< port B */ + PC = 2, /**< port C */ + PD = 3, /**< port D */ +}; + /** * @brief GPIO mux configuration */ @@ -60,5 +115,5 @@ typedef struct { } #endif -#endif /* PERIPH_CPU_H_ */ +#endif /* PERIPH_CPU_H */ /** @} */ diff --git a/cpu/sam3/periph/gpio.c b/cpu/sam3/periph/gpio.c index 71a33fd704..6833d9ff4d 100644 --- a/cpu/sam3/periph/gpio.c +++ b/cpu/sam3/periph/gpio.c @@ -1,5 +1,7 @@ /* * Copyright (C) 2014 Hauke Petersen + * 2015 Hamburg University of Applied Sciences + * 2015 Freie Universität Berlin * * 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 @@ -7,13 +9,14 @@ */ /** - * @ingroup driver_periph + * @ingroup cpu_sam3 * @{ * * @file * @brief Low-level GPIO driver implementation * - * @author Hauke Petersen + * @author Hauke Petersen + * @author Tobias Fredersdorf * * @} */ @@ -23,2152 +26,305 @@ #include "thread.h" #include "periph/gpio.h" #include "periph_conf.h" +#include "periph_cpu.h" #define ENABLE_DEBUG (0) #include "debug.h" +/** + * @brief We store 4 bit for each external interrupt line (each pin) that can + * mapped to an entry in the exti_ctx table + */ +#define EXTI_MAP_LENGTH (16U) + +/** + * @brief We allow for 7 (4-bit - 1) concurrent external interrupts to be set + */ +#define CTX_NUMOF (7U) + +/** + * @brief Context information needed for interrupts + */ typedef struct { gpio_cb_t cb; /**< callback called from GPIO interrupt */ void *arg; /**< argument passed to the callback */ -} gpio_state_t; +} exti_ctx_t; -static gpio_state_t gpio_config[GPIO_NUMOF]; +/** + * @brief Allocation of memory for 7 independent interrupt slots + */ +static exti_ctx_t exti_ctx[CTX_NUMOF] = { + {NULL, NULL}, {NULL, NULL}, {NULL, NULL}, {NULL, NULL}, + {NULL, NULL}, {NULL, NULL}, {NULL, NULL} +}; -int gpio_init(gpio_t dev, gpio_dir_t dir, gpio_pp_t pushpull) +/** + * @brief Allocation of 4 bit per pin to map a pin to an interrupt context + */ +static uint32_t exti_map[EXTI_MAP_LENGTH] = { + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff +}; + +/** + * @brief Extract the pin's port base address from the given pin identifier + */ +static inline Pio *_port(gpio_t pin) { - Pio *port = 0; - uint32_t pin = 0; + return (Pio *)(pin & ~(0x1f)); +} - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - port = GPIO_0_DEV; - pin = GPIO_0_PIN; - PMC->PMC_PCER0 = (1 << GPIO_0_IRQ); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - port = GPIO_1_DEV; - pin = GPIO_1_PIN; - PMC->PMC_PCER0 = (1 << GPIO_1_IRQ); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - port = GPIO_2_DEV; - pin = GPIO_2_PIN; - PMC->PMC_PCER0 = (1 << GPIO_2_IRQ); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - port = GPIO_3_DEV; - pin = GPIO_3_PIN; - PMC->PMC_PCER0 = (1 << GPIO_3_IRQ); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - port = GPIO_4_DEV; - pin = GPIO_4_PIN; - PMC->PMC_PCER0 = (1 << GPIO_4_IRQ); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - port = GPIO_5_DEV; - pin = GPIO_5_PIN; - PMC->PMC_PCER0 = (1 << GPIO_5_IRQ); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - port = GPIO_6_DEV; - pin = GPIO_6_PIN; - PMC->PMC_PCER0 = (1 << GPIO_6_IRQ); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - port = GPIO_7_DEV; - pin = GPIO_7_PIN; - PMC->PMC_PCER0 = (1 << GPIO_7_IRQ); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - port = GPIO_8_DEV; - pin = GPIO_8_PIN; - PMC->PMC_PCER0 = (1 << GPIO_8_IRQ); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - port = GPIO_9_DEV; - pin = GPIO_9_PIN; - PMC->PMC_PCER0 = (1 << GPIO_9_IRQ); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - port = GPIO_10_DEV; - pin = GPIO_10_PIN; - PMC->PMC_PCER0 = (1 << GPIO_10_IRQ); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - port = GPIO_11_DEV; - pin = GPIO_11_PIN; - PMC->PMC_PCER0 = (1 << GPIO_11_IRQ); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - port = GPIO_12_DEV; - pin = GPIO_12_PIN; - PMC->PMC_PCER0 = (1 << GPIO_12_IRQ); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - port = GPIO_13_DEV; - pin = GPIO_13_PIN; - PMC->PMC_PCER0 = (1 << GPIO_13_IRQ); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - port = GPIO_14_DEV; - pin = GPIO_14_PIN; - PMC->PMC_PCER0 = (1 << GPIO_14_IRQ); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - port = GPIO_15_DEV; - pin = GPIO_15_PIN; - PMC->PMC_PCER0 = (1 << GPIO_15_IRQ); - break; -#endif -#if GPIO_16_EN - case GPIO_16: - port = GPIO_16_DEV; - pin = GPIO_16_PIN; - PMC->PMC_PCER0 = (1 << GPIO_16_IRQ); - break; -#endif -#if GPIO_17_EN - case GPIO_17: - port = GPIO_17_DEV; - pin = GPIO_17_PIN; - PMC->PMC_PCER0 = (1 << GPIO_17_IRQ); - break; -#endif -#if GPIO_18_EN - case GPIO_18: - port = GPIO_18_DEV; - pin = GPIO_18_PIN; - PMC->PMC_PCER0 = (1 << GPIO_18_IRQ); - break; -#endif -#if GPIO_19_EN - case GPIO_19: - port = GPIO_19_DEV; - pin = GPIO_19_PIN; - PMC->PMC_PCER0 = (1 << GPIO_19_IRQ); - break; -#endif -#if GPIO_20_EN - case GPIO_20: - port = GPIO_20_DEV; - pin = GPIO_20_PIN; - PMC->PMC_PCER0 = (1 << GPIO_20_IRQ); - break; -#endif -#if GPIO_21_EN - case GPIO_21: - port = GPIO_21_DEV; - pin = GPIO_21_PIN; - PMC->PMC_PCER0 = (1 << GPIO_21_IRQ); - break; -#endif -#if GPIO_22_EN - case GPIO_22: - port = GPIO_22_DEV; - pin = GPIO_22_PIN; - PMC->PMC_PCER0 = (1 << GPIO_22_IRQ); - break; -#endif -#if GPIO_23_EN - case GPIO_23: - port = GPIO_23_DEV; - pin = GPIO_23_PIN; - PMC->PMC_PCER0 = (1 << GPIO_23_IRQ); - break; -#endif -#if GPIO_24_EN - case GPIO_24: - port = GPIO_24_DEV; - pin = GPIO_24_PIN; - PMC->PMC_PCER0 = (1 << GPIO_24_IRQ); - break; -#endif -#if GPIO_25_EN - case GPIO_25: - port = GPIO_25_DEV; - pin = GPIO_25_PIN; - PMC->PMC_PCER0 = (1 << GPIO_25_IRQ); - break; -#endif -#if GPIO_26_EN - case GPIO_26: - port = GPIO_26_DEV; - pin = GPIO_26_PIN; - PMC->PMC_PCER0 = (1 << GPIO_26_IRQ); - break; -#endif -#if GPIO_27_EN - case GPIO_27: - port = GPIO_27_DEV; - pin = GPIO_27_PIN; - PMC->PMC_PCER0 = (1 << GPIO_27_IRQ); - break; -#endif -#if GPIO_28_EN - case GPIO_28: - port = GPIO_28_DEV; - pin = GPIO_28_PIN; - PMC->PMC_PCER0 = (1 << GPIO_28_IRQ); - break; -#endif -#if GPIO_29_EN - case GPIO_29: - port = GPIO_29_DEV; - pin = GPIO_29_PIN; - PMC->PMC_PCER0 = (1 << GPIO_29_IRQ); - break; -#endif -#if GPIO_30_EN - case GPIO_30: - port = GPIO_30_DEV; - pin = GPIO_30_PIN; - PMC->PMC_PCER0 = (1 << GPIO_30_IRQ); - break; -#endif -#if GPIO_31_EN - case GPIO_31: - port = GPIO_31_DEV; - pin = GPIO_31_PIN; - PMC->PMC_PCER0 = (1 << GPIO_31_IRQ); - break; -#endif - default: - return -2; +/** + * @brief Extract the port number from the given pin identifier + * + * Isolating bits 9 to 12 of the port base addresses leads to unique port + * numbers. + */ +static inline int _port_num(gpio_t pin) +{ + return (((pin >> 9) & 0x0f) - 7); +} + +/** + * @brief Test if the given port is valid + */ +static bool _port_valid(Pio *port) +{ + if (port == PIOA || port == PIOB || port == PIOC || port == PIOD) { + return true; + } + return false; +} + +/** + * @brief Get the pin number from the pin identifier, encoded in the LSB 5 bit + */ +static inline int _pin_num(gpio_t pin) +{ + return (pin & 0x1f); +} + +/** + * @brief Get context for a specific pin + */ +static inline int _ctx(int port, int pin) +{ + return (exti_map[(port * 4) + (pin >> 3)] >> ((pin & 0x7) * 4)) & 0xf; +} + +/** + * @brief Write an entry to the context map array + */ +static void _write_map(int port, int pin, int ctx) +{ + exti_map[(port * 4) + (pin >> 3)] &= ~(0xf << ((pin & 0x7) * 4)); + exti_map[(port * 4) + (pin >> 3)] |= (ctx << ((pin & 0x7) * 4)); +} + +/** + * @brief Find a free spot in the array containing the interrupt contexts + */ +static int _get_free_ctx(void) +{ + for (int i = 0; i < CTX_NUMOF; i++) { + if (exti_ctx[i].cb == NULL) { + return i; + } + } + return -1; +} + +/** + * @brief Clear the context of the given pin + */ +static void _ctx_clear(int port, int pin) +{ + int ctx = _ctx(port, pin); + if (ctx < CTX_NUMOF) { + exti_ctx[ctx].cb = NULL; + _write_map(port, pin, CTX_NUMOF); + } +} + +int gpio_init(gpio_t pin, gpio_dir_t dir, gpio_pp_t pushpull) +{ + Pio *port = _port(pin); + int pin_num = _pin_num(pin); + int port_num = _port_num(pin); + + /* make sure port is valid */ + if (!_port_valid(port)) { + return -1; } - /* give the PIO module the power over the corresponding pin */ - port->PIO_PER = pin; + /* power on the corresponding port */ + PMC->PMC_PCER0 = (1 << (port_num + 11)); + + /* disable interrupt and clear context (to be safe) */ + port->PIO_IDR = (1 << pin_num); + _ctx_clear(port_num, pin_num); + + /* give the PIO module the power over the corresponding pin */ + port->PIO_PER = (1 << pin_num); /* configure the pin's pull resistor state */ switch (pushpull) { case GPIO_PULLDOWN: return -1; case GPIO_PULLUP: - port->PIO_PUER = pin; + port->PIO_PUER = (1 << pin_num); break; case GPIO_NOPULL: - port->PIO_PUDR = pin; + port->PIO_PUDR = (1 << pin_num); break; } if (dir == GPIO_DIR_OUT) { /* configure pin as output */ - port->PIO_OER = pin; - port->PIO_CODR = pin; + port->PIO_OER = (1 << pin_num); + port->PIO_CODR = (1 << pin_num); } else { /* configure pin as input */ - port->PIO_ODR = pin; + port->PIO_ODR = (1 << pin_num); } return 0; } -int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg) +int gpio_init_int(gpio_t pin, gpio_pp_t pushpull, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - int res; - Pio *port = 0; - uint32_t pin = 0; + Pio *port = _port(pin); + int pin_num = _pin_num(pin); + int port_num = _port_num(pin); - /* initialize port as input */ - res = gpio_init(dev, GPIO_DIR_IN, pullup); - if (res < 0) { - return res; + /* make sure pin is valid */ + if (!_port_valid(port)) { + return -1; } - /* read port and enable port interrupts */ - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - port = GPIO_0_DEV; - pin = GPIO_0_PIN; - NVIC_SetPriority(GPIO_0_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_0_IRQ); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - port = GPIO_1_DEV; - pin = GPIO_1_PIN; - NVIC_SetPriority(GPIO_1_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_1_IRQ); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - port = GPIO_2_DEV; - pin = GPIO_2_PIN; - NVIC_SetPriority(GPIO_2_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_2_IRQ); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - port = GPIO_3_DEV; - pin = GPIO_3_PIN; - NVIC_SetPriority(GPIO_3_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_3_IRQ); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - port = GPIO_4_DEV; - pin = GPIO_4_PIN; - NVIC_SetPriority(GPIO_4_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_4_IRQ); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - port = GPIO_5_DEV; - pin = GPIO_5_PIN; - NVIC_SetPriority(GPIO_5_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_5_IRQ); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - port = GPIO_6_DEV; - pin = GPIO_6_PIN; - NVIC_SetPriority(GPIO_6_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_6_IRQ); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - port = GPIO_7_DEV; - pin = GPIO_7_PIN; - NVIC_SetPriority(GPIO_7_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_7_IRQ); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - port = GPIO_8_DEV; - pin = GPIO_8_PIN; - NVIC_SetPriority(GPIO_8_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_8_IRQ); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - port = GPIO_9_DEV; - pin = GPIO_9_PIN; - NVIC_SetPriority(GPIO_9_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_9_IRQ); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - port = GPIO_10_DEV; - pin = GPIO_10_PIN; - NVIC_SetPriority(GPIO_10_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_10_IRQ); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - port = GPIO_11_DEV; - pin = GPIO_11_PIN; - NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_11_IRQ); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - port = GPIO_12_DEV; - pin = GPIO_12_PIN; - NVIC_SetPriority(GPIO_12_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_12_IRQ); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - port = GPIO_13_DEV; - pin = GPIO_13_PIN; - NVIC_SetPriority(GPIO_13_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_13_IRQ); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - port = GPIO_14_DEV; - pin = GPIO_14_PIN; - NVIC_SetPriority(GPIO_14_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_14_IRQ); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - port = GPIO_15_DEV; - pin = GPIO_15_PIN; - NVIC_SetPriority(GPIO_15_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_15_IRQ); - break; -#endif -#if GPIO_16_EN - case GPIO_16: - port = GPIO_16_DEV; - pin = GPIO_16_PIN; - NVIC_SetPriority(GPIO_16_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_16_IRQ); - break; -#endif -#if GPIO_17_EN - case GPIO_17: - port = GPIO_17_DEV; - pin = GPIO_17_PIN; - NVIC_SetPriority(GPIO_17_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_17_IRQ); - break; -#endif -#if GPIO_18_EN - case GPIO_18: - port = GPIO_18_DEV; - pin = GPIO_18_PIN; - NVIC_SetPriority(GPIO_18_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_18_IRQ); - break; -#endif -#if GPIO_19_EN - case GPIO_19: - port = GPIO_19_DEV; - pin = GPIO_19_PIN; - NVIC_SetPriority(GPIO_19_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_19_IRQ); - break; -#endif -#if GPIO_20_EN - case GPIO_20: - port = GPIO_20_DEV; - pin = GPIO_20_PIN; - NVIC_SetPriority(GPIO_20_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_20_IRQ); - break; -#endif -#if GPIO_21_EN - case GPIO_21: - port = GPIO_21_DEV; - pin = GPIO_21_PIN; - NVIC_SetPriority(GPIO_21_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_21_IRQ); - break; -#endif -#if GPIO_22_EN - case GPIO_22: - port = GPIO_22_DEV; - pin = GPIO_22_PIN; - NVIC_SetPriority(GPIO_22_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_22_IRQ); - break; -#endif -#if GPIO_23_EN - case GPIO_23: - port = GPIO_23_DEV; - pin = GPIO_23_PIN; - NVIC_SetPriority(GPIO_23_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_23_IRQ); - break; -#endif -#if GPIO_24_EN - case GPIO_24: - port = GPIO_24_DEV; - pin = GPIO_24_PIN; - NVIC_SetPriority(GPIO_24_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_24_IRQ); - break; -#endif -#if GPIO_25_EN - case GPIO_25: - port = GPIO_25_DEV; - pin = GPIO_25_PIN; - NVIC_SetPriority(GPIO_25_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_25_IRQ); - break; -#endif -#if GPIO_26_EN - case GPIO_26: - port = GPIO_26_DEV; - pin = GPIO_26_PIN; - NVIC_SetPriority(GPIO_26_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_26_IRQ); - break; -#endif -#if GPIO_27_EN - case GPIO_27: - port = GPIO_27_DEV; - pin = GPIO_27_PIN; - NVIC_SetPriority(GPIO_27_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_27_IRQ); - break; -#endif -#if GPIO_28_EN - case GPIO_28: - port = GPIO_28_DEV; - pin = GPIO_28_PIN; - NVIC_SetPriority(GPIO_28_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_28_IRQ); - break; -#endif -#if GPIO_29_EN - case GPIO_29: - port = GPIO_29_DEV; - pin = GPIO_29_PIN; - NVIC_SetPriority(GPIO_29_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_29_IRQ); - break; -#endif -#if GPIO_30_EN - case GPIO_30: - port = GPIO_30_DEV; - pin = GPIO_30_PIN; - NVIC_SetPriority(GPIO_30_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_30_IRQ); - break; -#endif -#if GPIO_31_EN - case GPIO_31: - port = GPIO_31_DEV; - pin = GPIO_31_PIN; - NVIC_SetPriority(GPIO_31_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_31_IRQ); - break; -#endif - } + /* configure pin as input */ + gpio_init(pin, GPIO_DIR_IN, pushpull); - /* set callback function and parameter */ - gpio_config[dev].cb = cb; - gpio_config[dev].arg = arg; + /* try go grab a free spot in the context array */ + int ctx_num = _get_free_ctx(); + if (ctx_num < 0) { + return -1; + } + /* save context */ + exti_ctx[ctx_num].cb = cb; + exti_ctx[ctx_num].arg = arg; + _write_map(port_num, pin_num, ctx_num); /* set the active flank */ switch (flank) { case GPIO_FALLING: - port->PIO_AIMER = pin; - port->PIO_ESR = pin; - port->PIO_FELLSR = pin; + port->PIO_AIMER = (1 << pin_num); + port->PIO_ESR = (1 << pin_num); + port->PIO_FELLSR =(1 << pin_num); break; case GPIO_RISING: - port->PIO_AIMER = pin; - port->PIO_ESR = pin; - port->PIO_REHLSR = pin; + port->PIO_AIMER = (1 << pin_num); + port->PIO_ESR = (1 << pin_num); + port->PIO_REHLSR = (1 << pin_num); break; case GPIO_BOTH: - port->PIO_AIMDR = pin; + port->PIO_AIMDR = (1 << pin_num); break; } - /* clean interrupt status register */ port->PIO_ISR; - /* enable the interrupt for the given channel */ - port->PIO_IER = pin; + NVIC_EnableIRQ(port_num + PIOA_IRQn); + port->PIO_IER = (1 << pin_num); return 0; } -int gpio_read(gpio_t dev) +void gpio_irq_enable(gpio_t pin) { - Pio *port = 0; - uint32_t pin = 0; - int res; + NVIC_EnableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); +} - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - port = GPIO_0_DEV; - pin = GPIO_0_PIN; - break; -#endif -#if GPIO_1_EN - case GPIO_1: - port = GPIO_1_DEV; - pin = GPIO_1_PIN; - break; -#endif -#if GPIO_2_EN - case GPIO_2: - port = GPIO_2_DEV; - pin = GPIO_2_PIN; - break; -#endif -#if GPIO_3_EN - case GPIO_3: - port = GPIO_3_DEV; - pin = GPIO_3_PIN; - break; -#endif -#if GPIO_4_EN - case GPIO_4: - port = GPIO_4_DEV; - pin = GPIO_4_PIN; - break; -#endif -#if GPIO_5_EN - case GPIO_5: - port = GPIO_5_DEV; - pin = GPIO_5_PIN; - break; -#endif -#if GPIO_6_EN - case GPIO_6: - port = GPIO_6_DEV; - pin = GPIO_6_PIN; - break; -#endif -#if GPIO_7_EN - case GPIO_7: - port = GPIO_7_DEV; - pin = GPIO_7_PIN; - break; -#endif -#if GPIO_8_EN - case GPIO_8: - port = GPIO_8_DEV; - pin = GPIO_8_PIN; - break; -#endif -#if GPIO_9_EN - case GPIO_9: - port = GPIO_9_DEV; - pin = GPIO_9_PIN; - break; -#endif -#if GPIO_10_EN - case GPIO_10: - port = GPIO_10_DEV; - pin = GPIO_10_PIN; - break; -#endif -#if GPIO_11_EN - case GPIO_11: - port = GPIO_11_DEV; - pin = GPIO_11_PIN; - break; -#endif -#if GPIO_12_EN - case GPIO_12: - port = GPIO_12_DEV; - pin = GPIO_12_PIN; - break; -#endif -#if GPIO_13_EN - case GPIO_13: - port = GPIO_13_DEV; - pin = GPIO_13_PIN; - break; -#endif -#if GPIO_14_EN - case GPIO_14: - port = GPIO_14_DEV; - pin = GPIO_14_PIN; - break; -#endif -#if GPIO_15_EN - case GPIO_15: - port = GPIO_15_DEV; - pin = GPIO_15_PIN; - break; -#endif -#if GPIO_16_EN - case GPIO_16: - port = GPIO_16_DEV; - pin = GPIO_16_PIN; - break; -#endif -#if GPIO_17_EN - case GPIO_17: - port = GPIO_17_DEV; - pin = GPIO_17_PIN; - break; -#endif -#if GPIO_18_EN - case GPIO_18: - port = GPIO_18_DEV; - pin = GPIO_18_PIN; - break; -#endif -#if GPIO_19_EN - case GPIO_19: - port = GPIO_19_DEV; - pin = GPIO_19_PIN; - break; -#endif -#if GPIO_20_EN - case GPIO_20: - port = GPIO_20_DEV; - pin = GPIO_20_PIN; - break; -#endif -#if GPIO_21_EN - case GPIO_21: - port = GPIO_21_DEV; - pin = GPIO_21_PIN; - break; -#endif -#if GPIO_22_EN - case GPIO_22: - port = GPIO_22_DEV; - pin = GPIO_22_PIN; - break; -#endif -#if GPIO_23_EN - case GPIO_23: - port = GPIO_23_DEV; - pin = GPIO_23_PIN; - break; -#endif -#if GPIO_24_EN - case GPIO_24: - port = GPIO_24_DEV; - pin = GPIO_24_PIN; - break; -#endif -#if GPIO_25_EN - case GPIO_25: - port = GPIO_25_DEV; - pin = GPIO_25_PIN; - break; -#endif -#if GPIO_26_EN - case GPIO_26: - port = GPIO_26_DEV; - pin = GPIO_26_PIN; - break; -#endif -#if GPIO_27_EN - case GPIO_27: - port = GPIO_27_DEV; - pin = GPIO_27_PIN; - break; -#endif -#if GPIO_28_EN - case GPIO_28: - port = GPIO_28_DEV; - pin = GPIO_28_PIN; - break; -#endif -#if GPIO_29_EN - case GPIO_29: - port = GPIO_29_DEV; - pin = GPIO_29_PIN; - break; -#endif -#if GPIO_30_EN - case GPIO_30: - port = GPIO_30_DEV; - pin = GPIO_30_PIN; - break; -#endif -#if GPIO_31_EN - case GPIO_31: - port = GPIO_31_DEV; - pin = GPIO_31_PIN; - break; -#endif - default: - return -1; - } +void gpio_irq_disable(gpio_t pin) +{ + NVIC_DisableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); +} - if (port->PIO_OSR & pin) { - res = port->PIO_ODSR & pin; +int gpio_read(gpio_t pin) +{ + Pio *port = _port(pin); + int pin_num = _pin_num(pin); + + if (port->PIO_OSR & (1 << pin_num)) { + return (port->PIO_ODSR & (1 << pin_num)) ? 1 : 0; } else { - res = port->PIO_PDSR & pin; - } - - /* make sure we are not returning a negative value if bit 31 is set */ - if (res < -1) { - res = 1; - } - - return res; -} - -void gpio_set(gpio_t dev) -{ - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_DEV->PIO_SODR = GPIO_0_PIN; - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_DEV->PIO_SODR = GPIO_1_PIN; - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_DEV->PIO_SODR = GPIO_2_PIN; - break; -#endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_DEV->PIO_SODR = GPIO_3_PIN; - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_DEV->PIO_SODR = GPIO_4_PIN; - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_DEV->PIO_SODR = GPIO_5_PIN; - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_DEV->PIO_SODR = GPIO_6_PIN; - break; -#endif -#if GPIO_7_EN - case GPIO_7: - GPIO_7_DEV->PIO_SODR = GPIO_7_PIN; - break; -#endif -#if GPIO_8_EN - case GPIO_8: - GPIO_8_DEV->PIO_SODR = GPIO_8_PIN; - break; -#endif -#if GPIO_9_EN - case GPIO_9: - GPIO_9_DEV->PIO_SODR = GPIO_9_PIN; - break; -#endif -#if GPIO_10_EN - case GPIO_10: - GPIO_10_DEV->PIO_SODR = GPIO_10_PIN; - break; -#endif -#if GPIO_11_EN - case GPIO_11: - GPIO_11_DEV->PIO_SODR = GPIO_11_PIN; - break; -#endif -#if GPIO_12_EN - case GPIO_12: - GPIO_12_DEV->PIO_SODR = GPIO_12_PIN; - break; -#endif -#if GPIO_13_EN - case GPIO_13: - GPIO_13_DEV->PIO_SODR = GPIO_13_PIN; - break; -#endif -#if GPIO_14_EN - case GPIO_14: - GPIO_14_DEV->PIO_SODR = GPIO_14_PIN; - break; -#endif -#if GPIO_15_EN - case GPIO_15: - GPIO_15_DEV->PIO_SODR = GPIO_15_PIN; - break; -#endif -#if GPIO_16_EN - case GPIO_16: - GPIO_16_DEV->PIO_SODR = GPIO_16_PIN; - break; -#endif -#if GPIO_17_EN - case GPIO_17: - GPIO_17_DEV->PIO_SODR = GPIO_17_PIN; - break; -#endif -#if GPIO_18_EN - case GPIO_18: - GPIO_18_DEV->PIO_SODR = GPIO_18_PIN; - break; -#endif -#if GPIO_19_EN - case GPIO_19: - GPIO_19_DEV->PIO_SODR = GPIO_19_PIN; - break; -#endif -#if GPIO_20_EN - case GPIO_20: - GPIO_20_DEV->PIO_SODR = GPIO_20_PIN; - break; -#endif -#if GPIO_21_EN - case GPIO_21: - GPIO_21_DEV->PIO_SODR = GPIO_21_PIN; - break; -#endif -#if GPIO_22_EN - case GPIO_22: - GPIO_22_DEV->PIO_SODR = GPIO_22_PIN; - break; -#endif -#if GPIO_23_EN - case GPIO_23: - GPIO_23_DEV->PIO_SODR = GPIO_23_PIN; - break; -#endif -#if GPIO_24_EN - case GPIO_24: - GPIO_24_DEV->PIO_SODR = GPIO_24_PIN; - break; -#endif -#if GPIO_25_EN - case GPIO_25: - GPIO_25_DEV->PIO_SODR = GPIO_25_PIN; - break; -#endif -#if GPIO_26_EN - case GPIO_26: - GPIO_26_DEV->PIO_SODR = GPIO_26_PIN; - break; -#endif -#if GPIO_27_EN - case GPIO_27: - GPIO_27_DEV->PIO_SODR = GPIO_27_PIN; - break; -#endif -#if GPIO_28_EN - case GPIO_28: - GPIO_28_DEV->PIO_SODR = GPIO_28_PIN; - break; -#endif -#if GPIO_29_EN - case GPIO_29: - GPIO_29_DEV->PIO_SODR = GPIO_29_PIN; - break; -#endif -#if GPIO_30_EN - case GPIO_30: - GPIO_30_DEV->PIO_SODR = GPIO_30_PIN; - break; -#endif -#if GPIO_31_EN - case GPIO_31: - GPIO_31_DEV->PIO_SODR = GPIO_31_PIN; - break; -#endif + return (port->PIO_PDSR & (1 << pin_num)) ? 1 : 0; } } -void gpio_clear(gpio_t dev) +void gpio_set(gpio_t pin) { - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_DEV->PIO_CODR = GPIO_0_PIN; - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_DEV->PIO_CODR = GPIO_1_PIN; - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_DEV->PIO_CODR = GPIO_2_PIN; - break; -#endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_DEV->PIO_CODR = GPIO_3_PIN; - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_DEV->PIO_CODR = GPIO_4_PIN; - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_DEV->PIO_CODR = GPIO_5_PIN; - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_DEV->PIO_CODR = GPIO_6_PIN; - break; -#endif -#if GPIO_7_EN - case GPIO_7: - GPIO_7_DEV->PIO_CODR = GPIO_7_PIN; - break; -#endif -#if GPIO_8_EN - case GPIO_8: - GPIO_8_DEV->PIO_CODR = GPIO_8_PIN; - break; -#endif -#if GPIO_9_EN - case GPIO_9: - GPIO_9_DEV->PIO_CODR = GPIO_9_PIN; - break; -#endif -#if GPIO_10_EN - case GPIO_10: - GPIO_10_DEV->PIO_CODR = GPIO_10_PIN; - break; -#endif -#if GPIO_11_EN - case GPIO_11: - GPIO_11_DEV->PIO_CODR = GPIO_11_PIN; - break; -#endif -#if GPIO_12_EN - case GPIO_12: - GPIO_12_DEV->PIO_CODR = GPIO_12_PIN; - break; -#endif -#if GPIO_13_EN - case GPIO_13: - GPIO_13_DEV->PIO_CODR = GPIO_13_PIN; - break; -#endif -#if GPIO_14_EN - case GPIO_14: - GPIO_14_DEV->PIO_CODR = GPIO_14_PIN; - break; -#endif -#if GPIO_15_EN - case GPIO_15: - GPIO_15_DEV->PIO_CODR = GPIO_15_PIN; - break; -#endif -#if GPIO_16_EN - case GPIO_16: - GPIO_16_DEV->PIO_CODR = GPIO_16_PIN; - break; -#endif -#if GPIO_17_EN - case GPIO_17: - GPIO_17_DEV->PIO_CODR = GPIO_17_PIN; - break; -#endif -#if GPIO_18_EN - case GPIO_18: - GPIO_18_DEV->PIO_CODR = GPIO_18_PIN; - break; -#endif -#if GPIO_19_EN - case GPIO_19: - GPIO_19_DEV->PIO_CODR = GPIO_19_PIN; - break; -#endif -#if GPIO_20_EN - case GPIO_20: - GPIO_20_DEV->PIO_CODR = GPIO_20_PIN; - break; -#endif -#if GPIO_21_EN - case GPIO_21: - GPIO_21_DEV->PIO_CODR = GPIO_21_PIN; - break; -#endif -#if GPIO_22_EN - case GPIO_22: - GPIO_22_DEV->PIO_CODR = GPIO_22_PIN; - break; -#endif -#if GPIO_23_EN - case GPIO_23: - GPIO_23_DEV->PIO_CODR = GPIO_23_PIN; - break; -#endif -#if GPIO_24_EN - case GPIO_24: - GPIO_24_DEV->PIO_CODR = GPIO_24_PIN; - break; -#endif -#if GPIO_25_EN - case GPIO_25: - GPIO_25_DEV->PIO_CODR = GPIO_25_PIN; - break; -#endif -#if GPIO_26_EN - case GPIO_26: - GPIO_26_DEV->PIO_CODR = GPIO_26_PIN; - break; -#endif -#if GPIO_27_EN - case GPIO_27: - GPIO_27_DEV->PIO_CODR = GPIO_27_PIN; - break; -#endif -#if GPIO_28_EN - case GPIO_28: - GPIO_28_DEV->PIO_CODR = GPIO_28_PIN; - break; -#endif -#if GPIO_29_EN - case GPIO_29: - GPIO_29_DEV->PIO_CODR = GPIO_29_PIN; - break; -#endif -#if GPIO_30_EN - case GPIO_30: - GPIO_30_DEV->PIO_CODR = GPIO_30_PIN; - break; -#endif -#if GPIO_31_EN - case GPIO_31: - GPIO_31_DEV->PIO_CODR = GPIO_31_PIN; - break; -#endif - } + _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } -void gpio_toggle(gpio_t dev) +void gpio_clear(gpio_t pin) { - if (gpio_read(dev)) { - gpio_clear(dev); + _port(pin)->PIO_CODR = (1 << _pin_num(pin)); +} + +void gpio_toggle(gpio_t pin) +{ + if (gpio_read(pin)) { + _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } else { - gpio_set(dev); + _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } } -void gpio_write(gpio_t dev, int value) +void gpio_write(gpio_t pin, int value) { if (value) { - gpio_set(dev); + _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } else { - gpio_clear(dev); + _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } } - -void gpio_irq_disable(gpio_t dev) +static inline void isr_handler(Pio *port, int port_num) { - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - NVIC_DisableIRQ(GPIO_0_IRQ); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - NVIC_DisableIRQ(GPIO_1_IRQ); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - NVIC_DisableIRQ(GPIO_2_IRQ); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - NVIC_DisableIRQ(GPIO_3_IRQ); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - NVIC_DisableIRQ(GPIO_4_IRQ); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - NVIC_DisableIRQ(GPIO_5_IRQ); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - NVIC_DisableIRQ(GPIO_6_IRQ); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - NVIC_DisableIRQ(GPIO_7_IRQ); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - NVIC_DisableIRQ(GPIO_8_IRQ); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - NVIC_DisableIRQ(GPIO_9_IRQ); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - NVIC_DisableIRQ(GPIO_10_IRQ); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - NVIC_DisableIRQ(GPIO_11_IRQ); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - NVIC_DisableIRQ(GPIO_12_IRQ); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - NVIC_DisableIRQ(GPIO_13_IRQ); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - NVIC_DisableIRQ(GPIO_14_IRQ); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - NVIC_DisableIRQ(GPIO_15_IRQ); - break; -#endif -#if GPIO_16_EN - case GPIO_16: - NVIC_DisableIRQ(GPIO_16_IRQ); - break; -#endif -#if GPIO_17_EN - case GPIO_17: - NVIC_DisableIRQ(GPIO_17_IRQ); - break; -#endif -#if GPIO_18_EN - case GPIO_18: - NVIC_DisableIRQ(GPIO_18_IRQ); - break; -#endif -#if GPIO_19_EN - case GPIO_19: - NVIC_DisableIRQ(GPIO_19_IRQ); - break; -#endif -#if GPIO_20_EN - case GPIO_20: - NVIC_DisableIRQ(GPIO_20_IRQ); - break; -#endif -#if GPIO_21_EN - case GPIO_21: - NVIC_DisableIRQ(GPIO_21_IRQ); - break; -#endif -#if GPIO_22_EN - case GPIO_22: - NVIC_DisableIRQ(GPIO_22_IRQ); - break; -#endif -#if GPIO_23_EN - case GPIO_23: - NVIC_DisableIRQ(GPIO_23_IRQ); - break; -#endif -#if GPIO_24_EN - case GPIO_24: - NVIC_DisableIRQ(GPIO_24_IRQ); - break; -#endif -#if GPIO_25_EN - case GPIO_25: - NVIC_DisableIRQ(GPIO_25_IRQ); - break; -#endif -#if GPIO_26_EN - case GPIO_26: - NVIC_DisableIRQ(GPIO_26_IRQ); - break; -#endif -#if GPIO_27_EN - case GPIO_27: - NVIC_DisableIRQ(GPIO_27_IRQ); - break; -#endif -#if GPIO_28_EN - case GPIO_28: - NVIC_DisableIRQ(GPIO_28_IRQ); - break; -#endif -#if GPIO_29_EN - case GPIO_29: - NVIC_DisableIRQ(GPIO_29_IRQ); - break; -#endif -#if GPIO_30_EN - case GPIO_30: - NVIC_DisableIRQ(GPIO_30_IRQ); - break; -#endif -#if GPIO_31_EN - case GPIO_31: - NVIC_DisableIRQ(GPIO_31_IRQ); - break; -#endif + /* take interrupt flags only from pins which interrupt is enabled */ + uint32_t status = (port->PIO_ISR & port->PIO_IMR); + + for (int i = 0; i < 32; i++) { + if (status & (1 << i)) { + int ctx = _ctx(port_num, i); + exti_ctx[ctx].cb(exti_ctx[ctx].arg); + } } -} - -void gpio_irq_enable(gpio_t dev) -{ - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - NVIC_EnableIRQ(GPIO_0_IRQ); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - NVIC_EnableIRQ(GPIO_1_IRQ); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - NVIC_EnableIRQ(GPIO_2_IRQ); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - NVIC_EnableIRQ(GPIO_3_IRQ); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - NVIC_EnableIRQ(GPIO_4_IRQ); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - NVIC_EnableIRQ(GPIO_5_IRQ); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - NVIC_EnableIRQ(GPIO_6_IRQ); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - NVIC_EnableIRQ(GPIO_7_IRQ); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - NVIC_EnableIRQ(GPIO_8_IRQ); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - NVIC_EnableIRQ(GPIO_9_IRQ); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - NVIC_EnableIRQ(GPIO_10_IRQ); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - NVIC_EnableIRQ(GPIO_11_IRQ); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - NVIC_EnableIRQ(GPIO_12_IRQ); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - NVIC_EnableIRQ(GPIO_13_IRQ); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - NVIC_EnableIRQ(GPIO_14_IRQ); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - NVIC_EnableIRQ(GPIO_15_IRQ); - break; -#endif -#if GPIO_16_EN - case GPIO_16: - NVIC_EnableIRQ(GPIO_16_IRQ); - break; -#endif -#if GPIO_17_EN - case GPIO_17: - NVIC_EnableIRQ(GPIO_17_IRQ); - break; -#endif -#if GPIO_18_EN - case GPIO_18: - NVIC_EnableIRQ(GPIO_18_IRQ); - break; -#endif -#if GPIO_19_EN - case GPIO_19: - NVIC_EnableIRQ(GPIO_19_IRQ); - break; -#endif -#if GPIO_20_EN - case GPIO_20: - NVIC_EnableIRQ(GPIO_20_IRQ); - break; -#endif -#if GPIO_21_EN - case GPIO_21: - NVIC_EnableIRQ(GPIO_21_IRQ); - break; -#endif -#if GPIO_22_EN - case GPIO_22: - NVIC_EnableIRQ(GPIO_22_IRQ); - break; -#endif -#if GPIO_23_EN - case GPIO_23: - NVIC_EnableIRQ(GPIO_23_IRQ); - break; -#endif -#if GPIO_24_EN - case GPIO_24: - NVIC_EnableIRQ(GPIO_24_IRQ); - break; -#endif -#if GPIO_25_EN - case GPIO_25: - NVIC_EnableIRQ(GPIO_25_IRQ); - break; -#endif -#if GPIO_26_EN - case GPIO_26: - NVIC_EnableIRQ(GPIO_26_IRQ); - break; -#endif -#if GPIO_27_EN - case GPIO_27: - NVIC_EnableIRQ(GPIO_27_IRQ); - break; -#endif -#if GPIO_28_EN - case GPIO_28: - NVIC_EnableIRQ(GPIO_28_IRQ); - break; -#endif -#if GPIO_29_EN - case GPIO_29: - NVIC_EnableIRQ(GPIO_29_IRQ); - break; -#endif -#if GPIO_30_EN - case GPIO_30: - NVIC_EnableIRQ(GPIO_30_IRQ); - break; -#endif -#if GPIO_31_EN - case GPIO_31: - NVIC_EnableIRQ(GPIO_31_IRQ); - break; -#endif + if (sched_context_switch_request) { + thread_yield(); } } void isr_pioa(void) { - uint32_t status = PIOA->PIO_ISR; -#ifdef GPIO_A0_MAP - if (status & (1 << 0)) { - gpio_config[GPIO_A0_MAP].cb(gpio_config[GPIO_A0_MAP].arg); - } -#endif -#ifdef GPIO_A1_MAP - if (status & (1 << 1)) { - gpio_config[GPIO_A1_MAP].cb(gpio_config[GPIO_A1_MAP].arg); - } -#endif -#ifdef GPIO_A2_MAP - if (status & (1 << 2)) { - gpio_config[GPIO_A2_MAP].cb(gpio_config[GPIO_A2_MAP].arg); - } -#endif -#ifdef GPIO_A3_MAP - if (status & (1 << 3)) { - gpio_config[GPIO_A3_MAP].cb(gpio_config[GPIO_A3_MAP].arg); - } -#endif -#ifdef GPIO_A4_MAP - if (status & (1 << 4)) { - gpio_config[GPIO_A4_MAP].cb(gpio_config[GPIO_A4_MAP].arg); - } -#endif -#ifdef GPIO_A5_MAP - if (status & (1 << 5)) { - gpio_config[GPIO_A5_MAP].cb(gpio_config[GPIO_A5_MAP].arg); - } -#endif -#ifdef GPIO_A6_MAP - if (status & (1 << 6)) { - gpio_config[GPIO_A6_MAP].cb(gpio_config[GPIO_A6_MAP].arg); - } -#endif -#ifdef GPIO_A7_MAP - if (status & (1 << 7)) { - gpio_config[GPIO_A7_MAP].cb(gpio_config[GPIO_A7_MAP].arg); - } -#endif -#ifdef GPIO_A8_MAP - if (status & (1 << 8)) { - gpio_config[GPIO_A8_MAP].cb(gpio_config[GPIO_A8_MAP].arg); - } -#endif -#ifdef GPIO_A9_MAP - if (status & (1 << 9)) { - gpio_config[GPIO_A9_MAP].cb(gpio_config[GPIO_A9_MAP].arg); - } -#endif -#ifdef GPIO_A10_MAP - if (status & (1 << 10)) { - gpio_config[GPIO_A10_MAP].cb(gpio_config[GPIO_A10_MAP].arg); - } -#endif -#ifdef GPIO_A11_MAP - if (status & (1 << 11)) { - gpio_config[GPIO_A11_MAP].cb(gpio_config[GPIO_A11_MAP].arg); - } -#endif -#ifdef GPIO_A12_MAP - if (status & (1 << 12)) { - gpio_config[GPIO_A12_MAP].cb(gpio_config[GPIO_A12_MAP].arg); - } -#endif -#ifdef GPIO_A13_MAP - if (status & (1 << 13)) { - gpio_config[GPIO_A13_MAP].cb(gpio_config[GPIO_A13_MAP].arg); - } -#endif -#ifdef GPIO_A14_MAP - if (status & (1 << 14)) { - gpio_config[GPIO_A14_MAP].cb(gpio_config[GPIO_A14_MAP].arg); - } -#endif -#ifdef GPIO_A15_MAP - if (status & (1 << 15)) { - gpio_config[GPIO_A15_MAP].cb(gpio_config[GPIO_A15_MAP].arg); - } -#endif -#ifdef GPIO_A16_MAP - if (status & (1 << 16)) { - gpio_config[GPIO_A16_MAP].cb(gpio_config[GPIO_A16_MAP].arg); - } -#endif -#ifdef GPIO_A17_MAP - if (status & (1 << 17)) { - gpio_config[GPIO_A17_MAP].cb(gpio_config[GPIO_A17_MAP].arg); - } -#endif -#ifdef GPIO_A18_MAP - if (status & (1 << 18)) { - gpio_config[GPIO_A18_MAP].cb(gpio_config[GPIO_A18_MAP].arg); - } -#endif -#ifdef GPIO_A19_MAP - if (status & (1 << 19)) { - gpio_config[GPIO_A19_MAP].cb(gpio_config[GPIO_A19_MAP].arg); - } -#endif -#ifdef GPIO_A20_MAP - if (status & (1 << 20)) { - gpio_config[GPIO_A20_MAP].cb(gpio_config[GPIO_A20_MAP].arg); - } -#endif -#ifdef GPIO_A21_MAP - if (status & (1 << 21)) { - gpio_config[GPIO_A21_MAP].cb(gpio_config[GPIO_A21_MAP].arg); - } -#endif -#ifdef GPIO_A22_MAP - if (status & (1 << 22)) { - gpio_config[GPIO_A22_MAP].cb(gpio_config[GPIO_A22_MAP].arg); - } -#endif -#ifdef GPIO_A23_MAP - if (status & (1 << 23)) { - gpio_config[GPIO_A23_MAP].cb(gpio_config[GPIO_A23_MAP].arg); - } -#endif -#ifdef GPIO_A24_MAP - if (status & (1 << 24)) { - gpio_config[GPIO_A24_MAP].cb(gpio_config[GPIO_A24_MAP].arg); - } -#endif -#ifdef GPIO_A25_MAP - if (status & (1 << 25)) { - gpio_config[GPIO_A25_MAP].cb(gpio_config[GPIO_A25_MAP].arg); - } -#endif -#ifdef GPIO_A26_MAP - if (status & (1 << 26)) { - gpio_config[GPIO_A26_MAP].cb(gpio_config[GPIO_A26_MAP].arg); - } -#endif -#ifdef GPIO_A27_MAP - if (status & (1 << 27)) { - gpio_config[GPIO_A27_MAP].cb(gpio_config[GPIO_A27_MAP].arg); - } -#endif -#ifdef GPIO_A28_MAP - if (status & (1 << 28)) { - gpio_config[GPIO_A28_MAP].cb(gpio_config[GPIO_A28_MAP].arg); - } -#endif -#ifdef GPIO_A29_MAP - if (status & (1 << 29)) { - gpio_config[GPIO_A29_MAP].cb(gpio_config[GPIO_A29_MAP].arg); - } -#endif -#ifdef GPIO_A30_MAP - if (status & (1 << 30)) { - gpio_config[GPIO_A30_MAP].cb(gpio_config[GPIO_A30_MAP].arg); - } -#endif -#ifdef GPIO_A31_MAP - if (status & (1 << 31)) { - gpio_config[GPIO_A31_MAP].cb(gpio_config[GPIO_A31_MAP].arg); - } -#endif - (void)status; /* added to suppress cppcheck warnings */ - if (sched_context_switch_request) { - thread_yield(); - } + isr_handler(PIOA, PA); } void isr_piob(void) { - uint32_t status = PIOB->PIO_ISR; -#ifdef GPIO_B0_MAP - if (status & (1 << 0)) { - gpio_config[GPIO_B0_MAP].cb(gpio_config[GPIO_B0_MAP].arg); - } -#endif -#ifdef GPIO_B1_MAP - if (status & (1 << 1)) { - gpio_config[GPIO_B1_MAP].cb(gpio_config[GPIO_B1_MAP].arg); - } -#endif -#ifdef GPIO_B2_MAP - if (status & (1 << 2)) { - gpio_config[GPIO_B2_MAP].cb(gpio_config[GPIO_B2_MAP].arg); - } -#endif -#ifdef GPIO_B3_MAP - if (status & (1 << 3)) { - gpio_config[GPIO_B3_MAP].cb(gpio_config[GPIO_B3_MAP].arg); - } -#endif -#ifdef GPIO_B4_MAP - if (status & (1 << 4)) { - gpio_config[GPIO_B4_MAP].cb(gpio_config[GPIO_B4_MAP].arg); - } -#endif -#ifdef GPIO_B5_MAP - if (status & (1 << 5)) { - gpio_config[GPIO_B5_MAP].cb(gpio_config[GPIO_B5_MAP].arg); - } -#endif -#ifdef GPIO_B6_MAP - if (status & (1 << 6)) { - gpio_config[GPIO_B6_MAP].cb(gpio_config[GPIO_B6_MAP].arg); - } -#endif -#ifdef GPIO_B7_MAP - if (status & (1 << 7)) { - gpio_config[GPIO_B7_MAP].cb(gpio_config[GPIO_B7_MAP].arg); - } -#endif -#ifdef GPIO_B8_MAP - if (status & (1 << 8)) { - gpio_config[GPIO_B8_MAP].cb(gpio_config[GPIO_B8_MAP].arg); - } -#endif -#ifdef GPIO_B9_MAP - if (status & (1 << 9)) { - gpio_config[GPIO_B9_MAP].cb(gpio_config[GPIO_B9_MAP].arg); - } -#endif -#ifdef GPIO_B10_MAP - if (status & (1 << 10)) { - gpio_config[GPIO_B10_MAP].cb(gpio_config[GPIO_B10_MAP].arg); - } -#endif -#ifdef GPIO_B11_MAP - if (status & (1 << 11)) { - gpio_config[GPIO_B11_MAP].cb(gpio_config[GPIO_B11_MAP].arg); - } -#endif -#ifdef GPIO_B12_MAP - if (status & (1 << 12)) { - gpio_config[GPIO_B12_MAP].cb(gpio_config[GPIO_B12_MAP].arg); - } -#endif -#ifdef GPIO_B13_MAP - if (status & (1 << 13)) { - gpio_config[GPIO_B13_MAP].cb(gpio_config[GPIO_B13_MAP].arg); - } -#endif -#ifdef GPIO_B14_MAP - if (status & (1 << 14)) { - gpio_config[GPIO_B14_MAP].cb(gpio_config[GPIO_B14_MAP].arg); - } -#endif -#ifdef GPIO_B15_MAP - if (status & (1 << 15)) { - gpio_config[GPIO_B15_MAP].cb(gpio_config[GPIO_B15_MAP].arg); - } -#endif -#ifdef GPIO_B16_MAP - if (status & (1 << 16)) { - gpio_config[GPIO_B16_MAP].cb(gpio_config[GPIO_B16_MAP].arg); - } -#endif -#ifdef GPIO_B17_MAP - if (status & (1 << 17)) { - gpio_config[GPIO_B17_MAP].cb(gpio_config[GPIO_B17_MAP].arg); - } -#endif -#ifdef GPIO_B18_MAP - if (status & (1 << 18)) { - gpio_config[GPIO_B18_MAP].cb(gpio_config[GPIO_B18_MAP].arg); - } -#endif -#ifdef GPIO_B19_MAP - if (status & (1 << 19)) { - gpio_config[GPIO_B19_MAP].cb(gpio_config[GPIO_B19_MAP].arg); - } -#endif -#ifdef GPIO_B20_MAP - if (status & (1 << 20)) { - gpio_config[GPIO_B20_MAP].cb(gpio_config[GPIO_B20_MAP].arg); - } -#endif -#ifdef GPIO_B21_MAP - if (status & (1 << 21)) { - gpio_config[GPIO_B21_MAP].cb(gpio_config[GPIO_B21_MAP].arg); - } -#endif -#ifdef GPIO_B22_MAP - if (status & (1 << 22)) { - gpio_config[GPIO_B22_MAP].cb(gpio_config[GPIO_B22_MAP].arg); - } -#endif -#ifdef GPIO_B23_MAP - if (status & (1 << 23)) { - gpio_config[GPIO_B23_MAP].cb(gpio_config[GPIO_B23_MAP].arg); - } -#endif -#ifdef GPIO_B24_MAP - if (status & (1 << 24)) { - gpio_config[GPIO_B24_MAP].cb(gpio_config[GPIO_B24_MAP].arg); - } -#endif -#ifdef GPIO_B25_MAP - if (status & (1 << 25)) { - gpio_config[GPIO_B25_MAP].cb(gpio_config[GPIO_B25_MAP].arg); - } -#endif -#ifdef GPIO_B26_MAP - if (status & (1 << 26)) { - gpio_config[GPIO_B26_MAP].cb(gpio_config[GPIO_B26_MAP].arg); - } -#endif -#ifdef GPIO_B27_MAP - if (status & (1 << 27)) { - gpio_config[GPIO_B27_MAP].cb(gpio_config[GPIO_B27_MAP].arg); - } -#endif -#ifdef GPIO_B28_MAP - if (status & (1 << 28)) { - gpio_config[GPIO_B28_MAP].cb(gpio_config[GPIO_B28_MAP].arg); - } -#endif -#ifdef GPIO_B29_MAP - if (status & (1 << 29)) { - gpio_config[GPIO_B29_MAP].cb(gpio_config[GPIO_B29_MAP].arg); - } -#endif -#ifdef GPIO_B30_MAP - if (status & (1 << 30)) { - gpio_config[GPIO_B30_MAP].cb(gpio_config[GPIO_B30_MAP].arg); - } -#endif -#ifdef GPIO_B31_MAP - if (status & (1 << 31)) { - gpio_config[GPIO_B31_MAP].cb(gpio_config[GPIO_B31_MAP].arg); - } -#endif - (void)status; /* added to suppress cppcheck warnings */ - if (sched_context_switch_request) { - thread_yield(); - } + isr_handler(PIOB, PB); } void isr_pioc(void) { - uint32_t status = PIOC->PIO_ISR; -#ifdef GPIO_C0_MAP - if (status & (1 << 0)) { - gpio_config[GPIO_C0_MAP].cb(gpio_config[GPIO_C0_MAP].arg); - } -#endif -#ifdef GPIO_C1_MAP - if (status & (1 << 1)) { - gpio_config[GPIO_C1_MAP].cb(gpio_config[GPIO_C1_MAP].arg); - } -#endif -#ifdef GPIO_C2_MAP - if (status & (1 << 2)) { - gpio_config[GPIO_C2_MAP].cb(gpio_config[GPIO_C2_MAP].arg); - } -#endif -#ifdef GPIO_C3_MAP - if (status & (1 << 3)) { - gpio_config[GPIO_C3_MAP].cb(gpio_config[GPIO_C3_MAP].arg); - } -#endif -#ifdef GPIO_C4_MAP - if (status & (1 << 4)) { - gpio_config[GPIO_C4_MAP].cb(gpio_config[GPIO_C4_MAP].arg); - } -#endif -#ifdef GPIO_C5_MAP - if (status & (1 << 5)) { - gpio_config[GPIO_C5_MAP].cb(gpio_config[GPIO_C5_MAP].arg); - } -#endif -#ifdef GPIO_C6_MAP - if (status & (1 << 6)) { - gpio_config[GPIO_C6_MAP].cb(gpio_config[GPIO_C6_MAP].arg); - } -#endif -#ifdef GPIO_C7_MAP - if (status & (1 << 7)) { - gpio_config[GPIO_C7_MAP].cb(gpio_config[GPIO_C7_MAP].arg); - } -#endif -#ifdef GPIO_C8_MAP - if (status & (1 << 8)) { - gpio_config[GPIO_C8_MAP].cb(gpio_config[GPIO_C8_MAP].arg); - } -#endif -#ifdef GPIO_C9_MAP - if (status & (1 << 9)) { - gpio_config[GPIO_C9_MAP].cb(gpio_config[GPIO_C9_MAP].arg); - } -#endif -#ifdef GPIO_C10_MAP - if (status & (1 << 10)) { - gpio_config[GPIO_C10_MAP].cb(gpio_config[GPIO_C10_MAP].arg); - } -#endif -#ifdef GPIO_C11_MAP - if (status & (1 << 11)) { - gpio_config[GPIO_C11_MAP].cb(gpio_config[GPIO_C11_MAP].arg); - } -#endif -#ifdef GPIO_C12_MAP - if (status & (1 << 12)) { - gpio_config[GPIO_C12_MAP].cb(gpio_config[GPIO_C12_MAP].arg); - } -#endif -#ifdef GPIO_C13_MAP - if (status & (1 << 13)) { - gpio_config[GPIO_C13_MAP].cb(gpio_config[GPIO_C13_MAP].arg); - } -#endif -#ifdef GPIO_C14_MAP - if (status & (1 << 14)) { - gpio_config[GPIO_C14_MAP].cb(gpio_config[GPIO_C14_MAP].arg); - } -#endif -#ifdef GPIO_C15_MAP - if (status & (1 << 15)) { - gpio_config[GPIO_C15_MAP].cb(gpio_config[GPIO_C15_MAP].arg); - } -#endif -#ifdef GPIO_C16_MAP - if (status & (1 << 16)) { - gpio_config[GPIO_C16_MAP].cb(gpio_config[GPIO_C16_MAP].arg); - } -#endif -#ifdef GPIO_C17_MAP - if (status & (1 << 17)) { - gpio_config[GPIO_C17_MAP].cb(gpio_config[GPIO_C17_MAP].arg); - } -#endif -#ifdef GPIO_C18_MAP - if (status & (1 << 18)) { - gpio_config[GPIO_C18_MAP].cb(gpio_config[GPIO_C18_MAP].arg); - } -#endif -#ifdef GPIO_C19_MAP - if (status & (1 << 19)) { - gpio_config[GPIO_C19_MAP].cb(gpio_config[GPIO_C19_MAP].arg); - } -#endif -#ifdef GPIO_C20_MAP - if (status & (1 << 20)) { - gpio_config[GPIO_C20_MAP].cb(gpio_config[GPIO_C20_MAP].arg); - } -#endif -#ifdef GPIO_C21_MAP - if (status & (1 << 21)) { - gpio_config[GPIO_C21_MAP].cb(gpio_config[GPIO_C21_MAP].arg); - } -#endif -#ifdef GPIO_C22_MAP - if (status & (1 << 22)) { - gpio_config[GPIO_C22_MAP].cb(gpio_config[GPIO_C22_MAP].arg); - } -#endif -#ifdef GPIO_C23_MAP - if (status & (1 << 23)) { - gpio_config[GPIO_C23_MAP].cb(gpio_config[GPIO_C23_MAP].arg); - } -#endif -#ifdef GPIO_C24_MAP - if (status & (1 << 24)) { - gpio_config[GPIO_C24_MAP].cb(gpio_config[GPIO_C24_MAP].arg); - } -#endif -#ifdef GPIO_C25_MAP - if (status & (1 << 25)) { - gpio_config[GPIO_C25_MAP].cb(gpio_config[GPIO_C25_MAP].arg); - } -#endif -#ifdef GPIO_C26_MAP - if (status & (1 << 26)) { - gpio_config[GPIO_C26_MAP].cb(gpio_config[GPIO_C26_MAP].arg); - } -#endif -#ifdef GPIO_C27_MAP - if (status & (1 << 27)) { - gpio_config[GPIO_C27_MAP].cb(gpio_config[GPIO_C27_MAP].arg); - } -#endif -#ifdef GPIO_C28_MAP - if (status & (1 << 28)) { - gpio_config[GPIO_C28_MAP].cb(gpio_config[GPIO_C28_MAP].arg); - } -#endif -#ifdef GPIO_C29_MAP - if (status & (1 << 29)) { - gpio_config[GPIO_C29_MAP].cb(gpio_config[GPIO_C29_MAP].arg); - } -#endif -#ifdef GPIO_C30_MAP - if (status & (1 << 30)) { - gpio_config[GPIO_C30_MAP].cb(gpio_config[GPIO_C30_MAP].arg); - } -#endif -#ifdef GPIO_C31_MAP - if (status & (1 << 31)) { - gpio_config[GPIO_C31_MAP].cb(gpio_config[GPIO_C31_MAP].arg); - } -#endif - (void)status; /* added to suppress cppcheck warnings */ - if (sched_context_switch_request) { - thread_yield(); - } + isr_handler(PIOC, PC); } void isr_piod(void) { - uint32_t status = PIOD->PIO_ISR; -#ifdef GPIO_D0_MAP - if (status & (1 << 0)) { - gpio_config[GPIO_D0_MAP].cb(gpio_config[GPIO_D0_MAP].arg); - } -#endif -#ifdef GPIO_D1_MAP - if (status & (1 << 1)) { - gpio_config[GPIO_D1_MAP].cb(gpio_config[GPIO_D1_MAP].arg); - } -#endif -#ifdef GPIO_D2_MAP - if (status & (1 << 2)) { - gpio_config[GPIO_D2_MAP].cb(gpio_config[GPIO_D2_MAP].arg); - } -#endif -#ifdef GPIO_D3_MAP - if (status & (1 << 3)) { - gpio_config[GPIO_D3_MAP].cb(gpio_config[GPIO_D3_MAP].arg); - } -#endif -#ifdef GPIO_D4_MAP - if (status & (1 << 4)) { - gpio_config[GPIO_D4_MAP].cb(gpio_config[GPIO_D4_MAP].arg); - } -#endif -#ifdef GPIO_D5_MAP - if (status & (1 << 5)) { - gpio_config[GPIO_D5_MAP].cb(gpio_config[GPIO_D5_MAP].arg); - } -#endif -#ifdef GPIO_D6_MAP - if (status & (1 << 6)) { - gpio_config[GPIO_D6_MAP].cb(gpio_config[GPIO_D6_MAP].arg); - } -#endif -#ifdef GPIO_D7_MAP - if (status & (1 << 7)) { - gpio_config[GPIO_D7_MAP].cb(gpio_config[GPIO_D7_MAP].arg); - } -#endif -#ifdef GPIO_D8_MAP - if (status & (1 << 8)) { - gpio_config[GPIO_D8_MAP].cb(gpio_config[GPIO_D8_MAP].arg); - } -#endif -#ifdef GPIO_D9_MAP - if (status & (1 << 9)) { - gpio_config[GPIO_D9_MAP].cb(gpio_config[GPIO_D9_MAP].arg); - } -#endif -#ifdef GPIO_D10_MAP - if (status & (1 << 10)) { - gpio_config[GPIO_D10_MAP].cb(gpio_config[GPIO_D10_MAP].arg); - } -#endif -#ifdef GPIO_D11_MAP - if (status & (1 << 11)) { - gpio_config[GPIO_D11_MAP].cb(gpio_config[GPIO_D11_MAP].arg); - } -#endif -#ifdef GPIO_D12_MAP - if (status & (1 << 12)) { - gpio_config[GPIO_D12_MAP].cb(gpio_config[GPIO_D12_MAP].arg); - } -#endif -#ifdef GPIO_D13_MAP - if (status & (1 << 13)) { - gpio_config[GPIO_D13_MAP].cb(gpio_config[GPIO_D13_MAP].arg); - } -#endif -#ifdef GPIO_D14_MAP - if (status & (1 << 14)) { - gpio_config[GPIO_D14_MAP].cb(gpio_config[GPIO_D14_MAP].arg); - } -#endif -#ifdef GPIO_D15_MAP - if (status & (1 << 15)) { - gpio_config[GPIO_D15_MAP].cb(gpio_config[GPIO_D15_MAP].arg); - } -#endif -#ifdef GPIO_D16_MAP - if (status & (1 << 16)) { - gpio_config[GPIO_D16_MAP].cb(gpio_config[GPIO_D16_MAP].arg); - } -#endif -#ifdef GPIO_D17_MAP - if (status & (1 << 17)) { - gpio_config[GPIO_D17_MAP].cb(gpio_config[GPIO_D17_MAP].arg); - } -#endif -#ifdef GPIO_D18_MAP - if (status & (1 << 18)) { - gpio_config[GPIO_D18_MAP].cb(gpio_config[GPIO_D18_MAP].arg); - } -#endif -#ifdef GPIO_D19_MAP - if (status & (1 << 19)) { - gpio_config[GPIO_D19_MAP].cb(gpio_config[GPIO_D19_MAP].arg); - } -#endif -#ifdef GPIO_D20_MAP - if (status & (1 << 20)) { - gpio_config[GPIO_D20_MAP].cb(gpio_config[GPIO_D20_MAP].arg); - } -#endif -#ifdef GPIO_D21_MAP - if (status & (1 << 21)) { - gpio_config[GPIO_D21_MAP].cb(gpio_config[GPIO_D21_MAP].arg); - } -#endif -#ifdef GPIO_D22_MAP - if (status & (1 << 22)) { - gpio_config[GPIO_D22_MAP].cb(gpio_config[GPIO_D22_MAP].arg); - } -#endif -#ifdef GPIO_D23_MAP - if (status & (1 << 23)) { - gpio_config[GPIO_D23_MAP].cb(gpio_config[GPIO_D23_MAP].arg); - } -#endif -#ifdef GPIO_D24_MAP - if (status & (1 << 24)) { - gpio_config[GPIO_D24_MAP].cb(gpio_config[GPIO_D24_MAP].arg); - } -#endif -#ifdef GPIO_D25_MAP - if (status & (1 << 25)) { - gpio_config[GPIO_D25_MAP].cb(gpio_config[GPIO_D25_MAP].arg); - } -#endif -#ifdef GPIO_D26_MAP - if (status & (1 << 26)) { - gpio_config[GPIO_D26_MAP].cb(gpio_config[GPIO_D26_MAP].arg); - } -#endif -#ifdef GPIO_D27_MAP - if (status & (1 << 27)) { - gpio_config[GPIO_D27_MAP].cb(gpio_config[GPIO_D27_MAP].arg); - } -#endif -#ifdef GPIO_D28_MAP - if (status & (1 << 28)) { - gpio_config[GPIO_D28_MAP].cb(gpio_config[GPIO_D28_MAP].arg); - } -#endif -#ifdef GPIO_D29_MAP - if (status & (1 << 29)) { - gpio_config[GPIO_D29_MAP].cb(gpio_config[GPIO_D29_MAP].arg); - } -#endif -#ifdef GPIO_D30_MAP - if (status & (1 << 30)) { - gpio_config[GPIO_D30_MAP].cb(gpio_config[GPIO_D30_MAP].arg); - } -#endif -#ifdef GPIO_D31_MAP - if (status & (1 << 31)) { - gpio_config[GPIO_D31_MAP].cb(gpio_config[GPIO_D31_MAP].arg); - } -#endif - (void)status; /* added to suppress cppcheck warnings */ - if (sched_context_switch_request) { - thread_yield(); - } + isr_handler(PIOD, PD); }