Hello Cedric, Thank you for your feedback. I agree with you that there are places that could be optimized out. Here is a new patch for that.
Best, Duc Doan --- bsps/arm/stm32f4/gpio/gpio.c | 87 ++++++++++++------------------------ 1 file changed, 29 insertions(+), 58 deletions(-) diff --git a/bsps/arm/stm32f4/gpio/gpio.c b/bsps/arm/stm32f4/gpio/gpio.c index e971f91140..b632236d8d 100644 --- a/bsps/arm/stm32f4/gpio/gpio.c +++ b/bsps/arm/stm32f4/gpio/gpio.c @@ -22,9 +22,18 @@ #include <stdlib.h> /*********** Helpers *****************/ -static stm32f4_gpio *get_gpio_from_base( - rtems_gpio *base -); +/** + * @brief Macro to get stm32f4_gpio object from a base rtems_gpio + * object. + * + * This is a wrapper of RTEMS_CONTAINER_OF macro + * + * @param base The pointer to a rtems_gpio object + * @retval The pointer to the stm32f4_gpio object owning + * the specified rtems_gpio object + */ +#define get_gpio_from_base(base) \ + RTEMS_CONTAINER_OF(base, stm32f4_gpio, base) /*********** GPIO API ***************/ static rtems_status_code stm32f4_gpio_get( @@ -115,44 +124,6 @@ static GPIO_TypeDef *GPIOx[] = { #endif /* STM32F429X */ }; -static uint16_t GPIO_PIN_x[] = { - GPIO_PIN_0, - GPIO_PIN_1, - GPIO_PIN_2, - GPIO_PIN_3, - GPIO_PIN_4, - GPIO_PIN_5, - GPIO_PIN_6, - GPIO_PIN_7, - GPIO_PIN_8, - GPIO_PIN_9, - GPIO_PIN_10, - GPIO_PIN_11, - GPIO_PIN_12, - GPIO_PIN_13, - GPIO_PIN_14, - GPIO_PIN_15 -}; - -static uint32_t LL_EXTI_LINE_x[] = { - LL_EXTI_LINE_0, - LL_EXTI_LINE_1, - LL_EXTI_LINE_2, - LL_EXTI_LINE_3, - LL_EXTI_LINE_4, - LL_EXTI_LINE_5, - LL_EXTI_LINE_6, - LL_EXTI_LINE_7, - LL_EXTI_LINE_8, - LL_EXTI_LINE_9, - LL_EXTI_LINE_10, - LL_EXTI_LINE_11, - LL_EXTI_LINE_12, - LL_EXTI_LINE_13, - LL_EXTI_LINE_14, - LL_EXTI_LINE_15 -}; - static unsigned int EXTIx_IRQn[] = { EXTI0_IRQn, EXTI1_IRQn, @@ -200,13 +171,13 @@ static unsigned int EXTIx_IRQn[] = { * @brief Converts pin number from 0-15 to HAL pin mask. * @param pin is the pin number from 0-15 */ -#define STM32F4_GET_HAL_GPIO_PIN(pin) (GPIO_PIN_x[( pin )]) +#define STM32F4_GET_HAL_GPIO_PIN(pin) ((uint16_t) (1 << ( pin ))) /** * @brief Get EXTI Line from pin number 0-15 * @param pin is the pin number from 0-15 */ -#define STM32F4_GET_LL_EXTI_LINE(pin) (LL_EXTI_LINE_x[( pin )]) +#define STM32F4_GET_LL_EXTI_LINE(pin) (0x1UL << ( pin )) /** * @brief Get EXTI IRQ number from pin 0-15 @@ -229,14 +200,6 @@ static stm32f4_interrupt isr_table[16]; void exti_handler(void *arg); -/************* Helpers implementation ********************/ - -static stm32f4_gpio *get_gpio_from_base( - rtems_gpio *base -) -{ - return RTEMS_CONTAINER_OF(base, stm32f4_gpio, base); -} /********** STM32F4 GPIO API functions ************/ @@ -523,7 +486,8 @@ rtems_status_code stm32f4_gpio_remove_interrupt( rtems_status_code sc = rtems_interrupt_handler_remove( STM32F4_GET_EXTI_IRQn(gpio->pin), exti_handler, - &isr_table[gpio->pin].arg); + &isr_table[gpio->pin].arg + ); if (sc == RTEMS_SUCCESSFUL) { isr_table[gpio->pin] = (stm32f4_interrupt){0}; } @@ -554,9 +518,12 @@ rtems_status_code stm32f4_gpio_write( ) { stm32f4_gpio *gpio = get_gpio_from_base(base); - uint32_t pin_mask = STM32F4_GET_HAL_GPIO_PIN(gpio->pin); - HAL_GPIO_WritePin(gpio->port, pin_mask, value); + if (value) + LL_GPIO_SetOutputPin(gpio->port, STM32F4_GET_HAL_GPIO_PIN(gpio->pin)); + else + LL_GPIO_ResetOutputPin(gpio->port, STM32F4_GET_HAL_GPIO_PIN(gpio->pin)); + return RTEMS_SUCCESSFUL; } @@ -566,9 +533,11 @@ rtems_status_code stm32f4_gpio_read( ) { stm32f4_gpio *gpio = get_gpio_from_base(base); - uint32_t pin_mask = STM32F4_GET_HAL_GPIO_PIN(gpio->pin); - *value = HAL_GPIO_ReadPin(gpio->port, pin_mask); + *value = LL_GPIO_IsInputPinSet( + gpio->port, + STM32F4_GET_HAL_GPIO_PIN(gpio->pin) + ); return RTEMS_SUCCESSFUL; } @@ -577,9 +546,11 @@ rtems_status_code stm32f4_gpio_toggle( ) { stm32f4_gpio *gpio = get_gpio_from_base(base); - uint32_t pin_mask = STM32F4_GET_HAL_GPIO_PIN(gpio->pin); - HAL_GPIO_TogglePin(gpio->port, pin_mask); + LL_GPIO_TogglePin( + gpio->port, + STM32F4_GET_HAL_GPIO_PIN(gpio->pin) + ); return RTEMS_SUCCESSFUL; } -- 2.36.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel