From 4546a87dedac9dee11bd3ee7eb8f99d973c90849 Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Thu, 23 Oct 2014 18:56:13 +0200 Subject: [PATCH] cpu/stm32f4: optimized GPIO driver implementation --- cpu/stm32f4/periph/gpio.c | 919 +++++++++----------------------------- 1 file changed, 217 insertions(+), 702 deletions(-) diff --git a/cpu/stm32f4/periph/gpio.c b/cpu/stm32f4/periph/gpio.c index b797db2eeb..22f33eaf28 100644 --- a/cpu/stm32f4/periph/gpio.c +++ b/cpu/stm32f4/periph/gpio.c @@ -40,6 +40,161 @@ typedef struct { */ static inline void irq_handler(gpio_t dev); +/* static pint and port mappings */ +static GPIO_TypeDef *const gpio_port_map[GPIO_NUMOF] = { +#if GPIO_0_EN + [GPIO_0] = GPIO_0_PORT, +#endif +#if GPIO_1_EN + [GPIO_1] = GPIO_1_PORT, +#endif +#if GPIO_2_EN + [GPIO_2] = GPIO_2_PORT, +#endif +#if GPIO_3_EN + [GPIO_3] = GPIO_3_PORT, +#endif +#if GPIO_4_EN + [GPIO_4] = GPIO_4_PORT, +#endif +#if GPIO_5_EN + [GPIO_5] = GPIO_5_PORT, +#endif +#if GPIO_6_EN + [GPIO_6] = GPIO_6_PORT, +#endif +#if GPIO_7_EN + [GPIO_7] = GPIO_7_PORT, +#endif +#if GPIO_8_EN + [GPIO_8] = GPIO_8_PORT, +#endif +#if GPIO_9_EN + [GPIO_9] = GPIO_9_PORT, +#endif +#if GPIO_10_EN + [GPIO_10] = GPIO_10_PORT, +#endif +#if GPIO_11_EN + [GPIO_11] = GPIO_11_PORT, +#endif +#if GPIO_12_EN + [GPIO_12] = GPIO_12_PORT, +#endif +#if GPIO_13_EN + [GPIO_13] = GPIO_13_PORT, +#endif +#if GPIO_14_EN + [GPIO_14] = GPIO_14_PORT, +#endif +#if GPIO_15_EN + [GPIO_15] = GPIO_15_PORT, +#endif +}; + +/* static pint and port mappings */ +static const uint8_t gpio_pin_map[GPIO_NUMOF] = { +#if GPIO_0_EN + [GPIO_0] = GPIO_0_PIN, +#endif +#if GPIO_1_EN + [GPIO_1] = GPIO_1_PIN, +#endif +#if GPIO_2_EN + [GPIO_2] = GPIO_2_PIN, +#endif +#if GPIO_3_EN + [GPIO_3] = GPIO_3_PIN, +#endif +#if GPIO_4_EN + [GPIO_4] = GPIO_4_PIN, +#endif +#if GPIO_5_EN + [GPIO_5] = GPIO_5_PIN, +#endif +#if GPIO_6_EN + [GPIO_6] = GPIO_6_PIN, +#endif +#if GPIO_7_EN + [GPIO_7] = GPIO_7_PIN, +#endif +#if GPIO_8_EN + [GPIO_8] = GPIO_8_PIN, +#endif +#if GPIO_9_EN + [GPIO_9] = GPIO_9_PIN, +#endif +#if GPIO_10_EN + [GPIO_10] = GPIO_10_PIN, +#endif +#if GPIO_11_EN + [GPIO_11] = GPIO_11_PIN, +#endif +#if GPIO_12_EN + [GPIO_12] = GPIO_12_PIN, +#endif +#if GPIO_13_EN + [GPIO_13] = GPIO_12_PIN, +#endif +#if GPIO_14_EN + [GPIO_14] = GPIO_12_PIN, +#endif +#if GPIO_15_EN + [GPIO_15] = GPIO_12_PIN, +#endif +}; + +static const IRQn_Type gpio_irq_map[GPIO_NUMOF] = { +#if GPIO_0_EN + [GPIO_0] = GPIO_0_IRQ, +#endif +#if GPIO_1_EN + [GPIO_1] = GPIO_1_IRQ, +#endif +#if GPIO_2_EN + [GPIO_2] = GPIO_2_IRQ, +#endif +#if GPIO_3_EN + [GPIO_3] = GPIO_3_IRQ, +#endif +#if GPIO_4_EN + [GPIO_4] = GPIO_4_IRQ, +#endif +#if GPIO_5_EN + [GPIO_5] = GPIO_5_IRQ, +#endif +#if GPIO_6_EN + [GPIO_6] = GPIO_6_IRQ, +#endif +#if GPIO_7_EN + [GPIO_7] = GPIO_7_IRQ, +#endif +#if GPIO_8_EN + [GPIO_8] = GPIO_8_IRQ, +#endif +#if GPIO_9_EN + [GPIO_9] = GPIO_9_IRQ, +#endif +#if GPIO_10_EN + [GPIO_10] = GPIO_10_IRQ, +#endif +#if GPIO_11_EN + [GPIO_11] = GPIO_11_IRQ, +#endif +#if GPIO_12_EN + [GPIO_12] = GPIO_12_IRQ, +#endif +#if GPIO_13_EN + [GPIO_13] = GPIO_12_IRQ, +#endif +#if GPIO_14_EN + [GPIO_14] = GPIO_12_IRQ, +#endif +#if GPIO_15_EN + [GPIO_15] = GPIO_12_IRQ, +#endif +}; + /** * @brief Hold one callback function pointer for each gpio device */ @@ -47,124 +202,16 @@ static gpio_state_t gpio_config[GPIO_NUMOF]; int gpio_init_out(gpio_t dev, gpio_pp_t pullup) { - GPIO_TypeDef *port = 0; - uint32_t pin = 0; + GPIO_TypeDef *port; + uint32_t pin; - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_CLKEN(); - port = GPIO_0_PORT; - pin = GPIO_0_PIN; - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_CLKEN(); - port = GPIO_1_PORT; - pin = GPIO_1_PIN; - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_CLKEN(); - port = GPIO_2_PORT; - pin = GPIO_2_PIN; - break; -#endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_CLKEN(); - port = GPIO_3_PORT; - pin = GPIO_3_PIN; - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_CLKEN(); - port = GPIO_4_PORT; - pin = GPIO_4_PIN; - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_CLKEN(); - port = GPIO_5_PORT; - pin = GPIO_5_PIN; - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_CLKEN(); - port = GPIO_6_PORT; - pin = GPIO_6_PIN; - break; -#endif -#if GPIO_7_EN - case GPIO_7: - GPIO_7_CLKEN(); - port = GPIO_7_PORT; - pin = GPIO_7_PIN; - break; -#endif -#if GPIO_8_EN - case GPIO_8: - GPIO_8_CLKEN(); - port = GPIO_8_PORT; - pin = GPIO_8_PIN; - break; -#endif -#if GPIO_9_EN - case GPIO_9: - GPIO_9_CLKEN(); - port = GPIO_9_PORT; - pin = GPIO_9_PIN; - break; -#endif -#if GPIO_10_EN - case GPIO_10: - GPIO_10_CLKEN(); - port = GPIO_10_PORT; - pin = GPIO_10_PIN; - break; -#endif -#if GPIO_11_EN - case GPIO_11: - GPIO_11_CLKEN(); - port = GPIO_11_PORT; - pin = GPIO_11_PIN; - break; -#endif -#if GPIO_12_EN - case GPIO_12: - GPIO_12_CLKEN(); - port = GPIO_12_PORT; - pin = GPIO_12_PIN; - break; -#endif -#if GPIO_13_EN - case GPIO_13: - GPIO_13_CLKEN(); - port = GPIO_13_PORT; - pin = GPIO_13_PIN; - break; -#endif -#if GPIO_14_EN - case GPIO_14: - GPIO_14_CLKEN(); - port = GPIO_14_PORT; - pin = GPIO_14_PIN; - break; -#endif -#if GPIO_15_EN - case GPIO_15: - GPIO_15_CLKEN(); - port = GPIO_15_PORT; - pin = GPIO_15_PIN; - break; -#endif + if (dev >= GPIO_NUMOF) { + return -1; } + port = gpio_port_map[dev]; + pin = gpio_pin_map[dev]; + port->MODER &= ~(2 << (2 * pin)); /* set pin to output mode */ port->MODER |= (1 << (2 * pin)); port->OTYPER &= ~(1 << pin); /* set to push-pull configuration */ @@ -178,124 +225,16 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pullup) int gpio_init_in(gpio_t dev, gpio_pp_t pullup) { - GPIO_TypeDef *port = 0; - uint32_t pin = 0; + GPIO_TypeDef *port; + uint32_t pin; - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_CLKEN(); - port = GPIO_0_PORT; - pin = GPIO_0_PIN; - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_CLKEN(); - port = GPIO_1_PORT; - pin = GPIO_1_PIN; - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_CLKEN(); - port = GPIO_2_PORT; - pin = GPIO_2_PIN; - break; -#endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_CLKEN(); - port = GPIO_3_PORT; - pin = GPIO_3_PIN; - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_CLKEN(); - port = GPIO_4_PORT; - pin = GPIO_4_PIN; - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_CLKEN(); - port = GPIO_5_PORT; - pin = GPIO_5_PIN; - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_CLKEN(); - port = GPIO_6_PORT; - pin = GPIO_6_PIN; - break; -#endif -#if GPIO_7_EN - case GPIO_7: - GPIO_7_CLKEN(); - port = GPIO_7_PORT; - pin = GPIO_7_PIN; - break; -#endif -#if GPIO_8_EN - case GPIO_8: - GPIO_8_CLKEN(); - port = GPIO_8_PORT; - pin = GPIO_8_PIN; - break; -#endif -#if GPIO_9_EN - case GPIO_9: - GPIO_9_CLKEN(); - port = GPIO_9_PORT; - pin = GPIO_9_PIN; - break; -#endif -#if GPIO_10_EN - case GPIO_10: - GPIO_10_CLKEN(); - port = GPIO_10_PORT; - pin = GPIO_10_PIN; - break; -#endif -#if GPIO_11_EN - case GPIO_11: - GPIO_11_CLKEN(); - port = GPIO_11_PORT; - pin = GPIO_11_PIN; - break; -#endif -#if GPIO_12_EN - case GPIO_12: - GPIO_12_CLKEN(); - port = GPIO_12_PORT; - pin = GPIO_12_PIN; - break; -#endif -#if GPIO_13_EN - case GPIO_13: - GPIO_13_CLKEN(); - port = GPIO_13_PORT; - pin = GPIO_13_PIN; - break; -#endif -#if GPIO_14_EN - case GPIO_14: - GPIO_14_CLKEN(); - port = GPIO_14_PORT; - pin = GPIO_14_PIN; - break; -#endif -#if GPIO_15_EN - case GPIO_15: - GPIO_15_CLKEN(); - port = GPIO_15_PORT; - pin = GPIO_15_PIN; - break; -#endif + if (dev >= GPIO_NUMOF) { + return -1; } + port = gpio_port_map[dev]; + pin = gpio_pin_map[dev]; + port->MODER &= ~(3 << (2 * pin)); /* configure pin as input */ port->PUPDR &= ~(3 << (2 * pin)); /* configure push-pull resistors */ port->PUPDR |= (pullup << (2 * pin)); @@ -306,143 +245,101 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup) int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int res; - uint32_t pin = 0; + uint32_t pin; res = gpio_init_in(dev, pullup); if (res < 0) { return res; } + pin = gpio_pin_map[dev]; + /* enable the SYSCFG clock */ RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; + /* enable IRQ */ + NVIC_SetPriority(gpio_irq_map[dev], GPIO_IRQ_PRIO); + NVIC_EnableIRQ(gpio_irq_map[dev]); + switch (dev) { #if GPIO_0_EN case GPIO_0: - pin = GPIO_0_PIN; GPIO_0_EXTI_CFG(); - NVIC_SetPriority(GPIO_0_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_0_IRQ); break; #endif #if GPIO_1_EN case GPIO_1: - pin = GPIO_1_PIN; GPIO_1_EXTI_CFG(); - NVIC_SetPriority(GPIO_1_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_1_IRQ); break; #endif #if GPIO_2_EN case GPIO_2: - pin = GPIO_2_PIN; GPIO_2_EXTI_CFG(); - NVIC_SetPriority(GPIO_2_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_2_IRQ); break; #endif #if GPIO_3_EN case GPIO_3: - pin = GPIO_3_PIN; GPIO_3_EXTI_CFG(); - NVIC_SetPriority(GPIO_3_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_3_IRQ); break; #endif #if GPIO_4_EN case GPIO_4: - pin = GPIO_4_PIN; GPIO_4_EXTI_CFG(); - NVIC_SetPriority(GPIO_4_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_4_IRQ); break; #endif #if GPIO_5_EN case GPIO_5: - pin = GPIO_5_PIN; GPIO_5_EXTI_CFG(); - NVIC_SetPriority(GPIO_5_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_5_IRQ); break; #endif #if GPIO_6_EN case GPIO_6: - pin = GPIO_6_PIN; GPIO_6_EXTI_CFG(); - NVIC_SetPriority(GPIO_6_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_6_IRQ); break; #endif #if GPIO_7_EN case GPIO_7: - pin = GPIO_7_PIN; GPIO_7_EXTI_CFG(); - NVIC_SetPriority(GPIO_7_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_7_IRQ); break; #endif #if GPIO_8_EN case GPIO_8: - pin = GPIO_8_PIN; GPIO_8_EXTI_CFG(); - NVIC_SetPriority(GPIO_8_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_8_IRQ); break; #endif #if GPIO_9_EN case GPIO_9: - pin = GPIO_9_PIN; GPIO_9_EXTI_CFG(); - NVIC_SetPriority(GPIO_9_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_9_IRQ); break; #endif #if GPIO_10_EN case GPIO_10: - pin = GPIO_10_PIN; GPIO_10_EXTI_CFG(); - NVIC_SetPriority(GPIO_10_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_10_IRQ); break; #endif #if GPIO_11_EN case GPIO_11: - pin = GPIO_11_PIN; GPIO_11_EXTI_CFG(); - NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_11_IRQ); break; #endif #if GPIO_12_EN case GPIO_12: - pin = GPIO_12_PIN; GPIO_12_EXTI_CFG(); - NVIC_SetPriority(GPIO_12_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_12_IRQ); break; #endif #if GPIO_13_EN case GPIO_13: - pin = GPIO_13_PIN; GPIO_13_EXTI_CFG(); - NVIC_SetPriority(GPIO_13_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_13_IRQ); break; #endif #if GPIO_14_EN case GPIO_14: - pin = GPIO_14_PIN; GPIO_14_EXTI_CFG(); - NVIC_SetPriority(GPIO_14_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_14_IRQ); break; #endif #if GPIO_15_EN case GPIO_15: - pin = GPIO_15_PIN; GPIO_15_EXTI_CFG(); - NVIC_SetPriority(GPIO_15_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_15_IRQ); break; #endif } @@ -477,280 +374,40 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb void gpio_irq_enable(gpio_t dev) { - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - EXTI->IMR |= (1 << GPIO_0_PIN); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - EXTI->IMR |= (1 << GPIO_1_PIN); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - EXTI->IMR |= (1 << GPIO_2_PIN); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - EXTI->IMR |= (1 << GPIO_3_PIN); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - EXTI->IMR |= (1 << GPIO_4_PIN); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - EXTI->IMR |= (1 << GPIO_5_PIN); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - EXTI->IMR |= (1 << GPIO_6_PIN); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - EXTI->IMR |= (1 << GPIO_7_PIN); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - EXTI->IMR |= (1 << GPIO_8_PIN); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - EXTI->IMR |= (1 << GPIO_9_PIN); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - EXTI->IMR |= (1 << GPIO_10_PIN); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - EXTI->IMR |= (1 << GPIO_11_PIN); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - EXTI->IMR |= (1 << GPIO_12_PIN); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - EXTI->IMR |= (1 << GPIO_13_PIN); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - EXTI->IMR |= (1 << GPIO_14_PIN); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - EXTI->IMR |= (1 << GPIO_15_PIN); - break; -#endif + uint32_t pin; + + if (dev >= GPIO_NUMOF) { + return; } + + pin = gpio_pin_map[dev]; + EXTI->IMR |= (1 << pin); } void gpio_irq_disable(gpio_t dev) { - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - EXTI->IMR &= ~(1 << GPIO_0_PIN); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - EXTI->IMR &= ~(1 << GPIO_1_PIN); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - EXTI->IMR &= ~(1 << GPIO_2_PIN); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - EXTI->IMR &= ~(1 << GPIO_3_PIN); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - EXTI->IMR &= ~(1 << GPIO_4_PIN); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - EXTI->IMR &= ~(1 << GPIO_5_PIN); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - EXTI->IMR &= ~(1 << GPIO_6_PIN); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - EXTI->IMR &= ~(1 << GPIO_7_PIN); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - EXTI->IMR &= ~(1 << GPIO_8_PIN); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - EXTI->IMR &= ~(1 << GPIO_9_PIN); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - EXTI->IMR &= ~(1 << GPIO_10_PIN); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - EXTI->IMR &= ~(1 << GPIO_11_PIN); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - EXTI->IMR &= ~(1 << GPIO_12_PIN); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - EXTI->IMR &= ~(1 << GPIO_13_PIN); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - EXTI->IMR &= ~(1 << GPIO_14_PIN); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - EXTI->IMR &= ~(1 << GPIO_15_PIN); - break; -#endif + uint32_t pin; + + if (dev >= GPIO_NUMOF) { + return; } + + pin = gpio_pin_map[dev]; + EXTI->IMR &= ~(1 << pin); } int gpio_read(gpio_t dev) { - GPIO_TypeDef *port = 0; - uint32_t pin = 0; + GPIO_TypeDef *port; + uint32_t pin; - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - port = GPIO_0_PORT; - pin = GPIO_0_PIN; - break; -#endif -#if GPIO_1_EN - case GPIO_1: - port = GPIO_1_PORT; - pin = GPIO_1_PIN; - break; -#endif -#if GPIO_2_EN - case GPIO_2: - port = GPIO_2_PORT; - pin = GPIO_2_PIN; - break; -#endif -#if GPIO_3_EN - case GPIO_3: - port = GPIO_3_PORT; - pin = GPIO_3_PIN; - break; -#endif -#if GPIO_4_EN - case GPIO_4: - port = GPIO_4_PORT; - pin = GPIO_4_PIN; - break; -#endif -#if GPIO_5_EN - case GPIO_5: - port = GPIO_5_PORT; - pin = GPIO_5_PIN; - break; -#endif -#if GPIO_6_EN - case GPIO_6: - port = GPIO_6_PORT; - pin = GPIO_6_PIN; - break; -#endif -#if GPIO_7_EN - case GPIO_7: - port = GPIO_7_PORT; - pin = GPIO_7_PIN; - break; -#endif -#if GPIO_8_EN - case GPIO_8: - port = GPIO_8_PORT; - pin = GPIO_8_PIN; - break; -#endif -#if GPIO_9_EN - case GPIO_9: - port = GPIO_9_PORT; - pin = GPIO_9_PIN; - break; -#endif -#if GPIO_10_EN - case GPIO_10: - port = GPIO_10_PORT; - pin = GPIO_10_PIN; - break; -#endif -#if GPIO_11_EN - case GPIO_11: - port = GPIO_11_PORT; - pin = GPIO_11_PIN; - break; -#endif -#if GPIO_12_EN - case GPIO_12: - port = GPIO_12_PORT; - pin = GPIO_12_PIN; - break; -#endif -#if GPIO_13_EN - case GPIO_13: - port = GPIO_13_PORT; - pin = GPIO_13_PIN; - break; -#endif -#if GPIO_14_EN - case GPIO_14: - port = GPIO_14_PORT; - pin = GPIO_14_PIN; - break; -#endif -#if GPIO_15_EN - case GPIO_15: - port = GPIO_15_PORT; - pin = GPIO_15_PIN; - break; -#endif + if (dev >= GPIO_NUMOF) { + return -1; } + port = gpio_port_map[dev]; + pin = gpio_pin_map[dev]; + if (port->MODER & (3 << (pin * 2))) { /* if configured as output */ return port->ODR & (1 << pin); /* read output data register */ } else { @@ -760,174 +417,32 @@ int gpio_read(gpio_t dev) void gpio_set(gpio_t dev) { - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_PORT->ODR |= (1 << GPIO_0_PIN); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_PORT->ODR |= (1 << GPIO_1_PIN); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_PORT->ODR |= (1 << GPIO_2_PIN); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_PORT->ODR |= (1 << GPIO_3_PIN); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_PORT->ODR |= (1 << GPIO_4_PIN); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_PORT->ODR |= (1 << GPIO_5_PIN); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_PORT->ODR |= (1 << GPIO_6_PIN); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - GPIO_7_PORT->ODR |= (1 << GPIO_7_PIN); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - GPIO_8_PORT->ODR |= (1 << GPIO_8_PIN); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - GPIO_9_PORT->ODR |= (1 << GPIO_9_PIN); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - GPIO_10_PORT->ODR |= (1 << GPIO_10_PIN); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - GPIO_11_PORT->ODR |= (1 << GPIO_11_PIN); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - GPIO_12_PORT->ODR |= (1 << GPIO_12_PIN); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - GPIO_13_PORT->ODR |= (1 << GPIO_13_PIN); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - GPIO_14_PORT->ODR |= (1 << GPIO_14_PIN); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - GPIO_15_PORT->ODR |= (1 << GPIO_15_PIN); - break; -#endif + GPIO_TypeDef *port; + uint32_t pin; + + if (dev >= GPIO_NUMOF) { + return; } + + port = gpio_port_map[dev]; + pin = gpio_pin_map[dev]; + + port->BSRRL = (1 << pin); } void gpio_clear(gpio_t dev) { - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_PORT->ODR &= ~(1 << GPIO_0_PIN); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_PORT->ODR &= ~(1 << GPIO_1_PIN); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_PORT->ODR &= ~(1 << GPIO_2_PIN); - break; -#endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_PORT->ODR &= ~(1 << GPIO_3_PIN); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_PORT->ODR &= ~(1 << GPIO_4_PIN); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_PORT->ODR &= ~(1 << GPIO_5_PIN); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_PORT->ODR &= ~(1 << GPIO_6_PIN); - break; -#endif -#if GPIO_7_EN - case GPIO_7: - GPIO_7_PORT->ODR &= ~(1 << GPIO_7_PIN); - break; -#endif -#if GPIO_8_EN - case GPIO_8: - GPIO_8_PORT->ODR &= ~(1 << GPIO_8_PIN); - break; -#endif -#if GPIO_9_EN - case GPIO_9: - GPIO_9_PORT->ODR &= ~(1 << GPIO_9_PIN); - break; -#endif -#if GPIO_10_EN - case GPIO_10: - GPIO_10_PORT->ODR &= ~(1 << GPIO_10_PIN); - break; -#endif -#if GPIO_11_EN - case GPIO_11: - GPIO_11_PORT->ODR &= ~(1 << GPIO_11_PIN); - break; -#endif -#if GPIO_12_EN - case GPIO_12: - GPIO_12_PORT->ODR &= ~(1 << GPIO_12_PIN); - break; -#endif -#if GPIO_13_EN - case GPIO_13: - GPIO_13_PORT->ODR &= ~(1 << GPIO_13_PIN); - break; -#endif -#if GPIO_14_EN - case GPIO_14: - GPIO_14_PORT->ODR &= ~(1 << GPIO_14_PIN); - break; -#endif -#if GPIO_15_EN - case GPIO_15: - GPIO_15_PORT->ODR &= ~(1 << GPIO_15_PIN); - break; -#endif + GPIO_TypeDef *port; + uint32_t pin; + + if (dev >= GPIO_NUMOF) { + return; } + + port = gpio_port_map[dev]; + pin = gpio_pin_map[dev]; + + port->BSRRH = (1 << pin); } void gpio_toggle(gpio_t dev)