This is an automated email from the ASF dual-hosted git repository. linguini pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit a44878134857ff1edca0aaffa8044e4b12351351 Author: raiden00pl <[email protected]> AuthorDate: Sat Apr 11 12:22:05 2026 +0200 boards/nucleo-c0XX: add qencoder support add qencoder support for nucleo-c0 boards Signed-off-by: raiden00pl <[email protected]> --- .../include/board_qencoder.h} | 93 +++++----------------- boards/arm/stm32f0l0g0/common/src/CMakeLists.txt | 4 + boards/arm/stm32f0l0g0/common/src/Make.defs | 4 + .../src/board_qencoder.c} | 82 +++++-------------- .../nucleo-c071rb/configs/jumbo/defconfig | 6 ++ .../arm/stm32f0l0g0/nucleo-c071rb/include/board.h | 8 ++ .../stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c | 17 ++++ .../nucleo-c092rc/configs/jumbo/defconfig | 6 ++ .../arm/stm32f0l0g0/nucleo-c092rc/include/board.h | 8 ++ .../stm32f0l0g0/nucleo-c092rc/src/stm32_bringup.c | 17 ++++ 10 files changed, 109 insertions(+), 136 deletions(-) diff --git a/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c b/boards/arm/stm32f0l0g0/common/include/board_qencoder.h similarity index 52% copy from boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c copy to boards/arm/stm32f0l0g0/common/include/board_qencoder.h index 3f03c3f063e..b16fbb020d0 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c +++ b/boards/arm/stm32f0l0g0/common/include/board_qencoder.h @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c + * boards/arm/stm32f0l0g0/common/include/board_qencoder.h * * SPDX-License-Identifier: Apache-2.0 * @@ -20,95 +20,44 @@ * ****************************************************************************/ +#ifndef __BOARDS_ARM_STM32F0L0G0_COMMON_INCLUDE_BOARD_QENCODER_H +#define __BOARDS_ARM_STM32F0L0G0_COMMON_INCLUDE_BOARD_QENCODER_H + /**************************************************************************** * Included Files ****************************************************************************/ #include <nuttx/config.h> -#include <nuttx/debug.h> - -#include <sys/types.h> - -#ifdef CONFIG_INPUT_BUTTONS -# include <nuttx/input/buttons.h> -#endif - -#ifdef CONFIG_USERLED -# include <nuttx/leds/userled.h> -#endif - -#ifdef CONFIG_STM32F0L0G0_IWDG -# include <stm32_wdg.h> -#endif - -#include <arch/board/board.h> - -#include "nucleo-c071rb.h" - /**************************************************************************** - * Pre-processor Definitions + * Public Data ****************************************************************************/ +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + /**************************************************************************** - * Public Functions + * Public Function Prototypes ****************************************************************************/ /**************************************************************************** - * Name: stm32_bringup + * Name: board_qencoder_initialize * * Description: - * Perform architecture-specific initialization - * - * CONFIG_BOARD_LATE_INITIALIZE=y : - * Called from board_late_initialize(). - * - * CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_BOARDCTL=y : - * Called from the NSH library + * Initialize the quadrature encoder driver for the given timer * ****************************************************************************/ -int stm32_bringup(void) -{ - int ret; - -#ifdef CONFIG_STM32F0L0G0_IWDG - /* Initialize the watchdog timer */ - - stm32_iwdginitialize("/dev/watchdog0", STM32_LSI_FREQUENCY); -#endif - -#if !defined(CONFIG_ARCH_LEDS) && defined(CONFIG_USERLED_LOWER) - /* Register the LED driver */ - - ret = userled_lower_initialize(LED_DRIVER_PATH); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); - return ret; - } -#endif - -#ifdef CONFIG_INPUT_BUTTONS - /* Register the BUTTON driver */ - - ret = btn_lower_initialize("/dev/buttons"); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret); - } -#endif +int board_qencoder_initialize(int devno, int timerno); -#ifdef CONFIG_ADC - /* Initialize ADC and register the ADC driver. */ - - ret = stm32_adc_setup(); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: stm32_adc_setup failed: %d\n", ret); - } +#undef EXTERN +#ifdef __cplusplus +} #endif - UNUSED(ret); - return OK; -} +#endif /* __BOARDS_ARM_STM32F0L0G0_COMMON_INCLUDE_BOARD_QENCODER_H */ diff --git a/boards/arm/stm32f0l0g0/common/src/CMakeLists.txt b/boards/arm/stm32f0l0g0/common/src/CMakeLists.txt index 20eea72417b..45d0130bc75 100644 --- a/boards/arm/stm32f0l0g0/common/src/CMakeLists.txt +++ b/boards/arm/stm32f0l0g0/common/src/CMakeLists.txt @@ -26,5 +26,9 @@ if(CONFIG_ARCH_BOARD_COMMON) list(APPEND SRCS stm32_ssd1306.c) endif() + if(CONFIG_SENSORS_QENCODER) + list(APPEND SRCS stm32_qencoder.c) + endif() + endif() target_sources(board PRIVATE ${SRCS}) diff --git a/boards/arm/stm32f0l0g0/common/src/Make.defs b/boards/arm/stm32f0l0g0/common/src/Make.defs index 815643b9c0b..b3c6f854286 100644 --- a/boards/arm/stm32f0l0g0/common/src/Make.defs +++ b/boards/arm/stm32f0l0g0/common/src/Make.defs @@ -26,6 +26,10 @@ ifeq ($(CONFIG_LCD_SSD1306),y) CSRCS += stm32_ssd1306.c endif +ifeq ($(CONFIG_SENSORS_QENCODER),y) + CSRCS += board_qencoder.c +endif + DEPPATH += --dep-path src VPATH += :src CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)src diff --git a/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c b/boards/arm/stm32f0l0g0/common/src/board_qencoder.c similarity index 50% copy from boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c copy to boards/arm/stm32f0l0g0/common/src/board_qencoder.c index 3f03c3f063e..6f7e6260977 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c +++ b/boards/arm/stm32f0l0g0/common/src/board_qencoder.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c + * boards/arm/stm32f0l0g0/common/src/board_qencoder.c * * SPDX-License-Identifier: Apache-2.0 * @@ -26,89 +26,43 @@ #include <nuttx/config.h> -#include <nuttx/debug.h> - -#include <sys/types.h> - -#ifdef CONFIG_INPUT_BUTTONS -# include <nuttx/input/buttons.h> -#endif - -#ifdef CONFIG_USERLED -# include <nuttx/leds/userled.h> -#endif - -#ifdef CONFIG_STM32F0L0G0_IWDG -# include <stm32_wdg.h> -#endif +#include <errno.h> +#include <debug.h> +#include <stdio.h> +#include <nuttx/sensors/qencoder.h> #include <arch/board/board.h> -#include "nucleo-c071rb.h" - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ +#include "chip.h" +#include "arm_internal.h" +#include "stm32_qencoder.h" /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** - * Name: stm32_bringup + * Name: board_qencoder_initialize * * Description: - * Perform architecture-specific initialization - * - * CONFIG_BOARD_LATE_INITIALIZE=y : - * Called from board_late_initialize(). - * - * CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_BOARDCTL=y : - * Called from the NSH library + * Initialize the quadrature encoder driver for the given timer * ****************************************************************************/ -int stm32_bringup(void) +int board_qencoder_initialize(int devno, int timerno) { int ret; + char devpath[12]; -#ifdef CONFIG_STM32F0L0G0_IWDG - /* Initialize the watchdog timer */ - - stm32_iwdginitialize("/dev/watchdog0", STM32_LSI_FREQUENCY); -#endif - -#if !defined(CONFIG_ARCH_LEDS) && defined(CONFIG_USERLED_LOWER) - /* Register the LED driver */ - - ret = userled_lower_initialize(LED_DRIVER_PATH); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); - return ret; - } -#endif - -#ifdef CONFIG_INPUT_BUTTONS - /* Register the BUTTON driver */ - - ret = btn_lower_initialize("/dev/buttons"); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret); - } -#endif - -#ifdef CONFIG_ADC - /* Initialize ADC and register the ADC driver. */ + /* Initialize a quadrature encoder interface. */ - ret = stm32_adc_setup(); + sninfo("Initializing the quadrature encoder using TIM%d\n", timerno); + snprintf(devpath, sizeof(devpath), "/dev/qe%d", devno); + ret = stm32_qeinitialize(devpath, timerno); if (ret < 0) { - syslog(LOG_ERR, "ERROR: stm32_adc_setup failed: %d\n", ret); + snerr("ERROR: stm32_qeinitialize failed: %d\n", ret); } -#endif - UNUSED(ret); - return OK; + return ret; } diff --git a/boards/arm/stm32f0l0g0/nucleo-c071rb/configs/jumbo/defconfig b/boards/arm/stm32f0l0g0/nucleo-c071rb/configs/jumbo/defconfig index 037d009ebdd..e30d953d4a8 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c071rb/configs/jumbo/defconfig +++ b/boards/arm/stm32f0l0g0/nucleo-c071rb/configs/jumbo/defconfig @@ -12,6 +12,7 @@ CONFIG_ADC=y CONFIG_ANALOG=y CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="nucleo-c071rb" +CONFIG_ARCH_BOARD_COMMON=y CONFIG_ARCH_BOARD_NUCLEO_C071RB=y CONFIG_ARCH_BUTTONS=y CONFIG_ARCH_CHIP="stm32f0l0g0" @@ -38,6 +39,7 @@ CONFIG_EXAMPLES_ADC_GROUPSIZE=2 CONFIG_EXAMPLES_ADC_SWTRIG=y CONFIG_EXAMPLES_BUTTONS=y CONFIG_EXAMPLES_HELLO=y +CONFIG_EXAMPLES_QENCODER=y CONFIG_EXAMPLES_WATCHDOG=y CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INIT_STACKSIZE=1536 @@ -60,6 +62,8 @@ CONFIG_RAM_START=0x20000000 CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 CONFIG_SCHED_WAITPID=y +CONFIG_SENSORS=y +CONFIG_SENSORS_QENCODER=y CONFIG_START_DAY=19 CONFIG_START_MONTH=5 CONFIG_START_YEAR=2013 @@ -68,6 +72,8 @@ CONFIG_STM32F0L0G0_ADC1=y CONFIG_STM32F0L0G0_ADC_MAX_SAMPLES=6 CONFIG_STM32F0L0G0_DMA1=y CONFIG_STM32F0L0G0_IWDG=y +CONFIG_STM32F0L0G0_TIM3=y +CONFIG_STM32F0L0G0_TIM3_QE=y CONFIG_STM32F0L0G0_USART2=y CONFIG_STM32F0L0G0_WWDG=y CONFIG_SYSTEM_NSH=y diff --git a/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h b/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h index e48c7aaefe0..154ae1e8941 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h +++ b/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h @@ -162,6 +162,14 @@ #define GPIO_USART2_RX (GPIO_USART2_RX_1|GPIO_SPEED_HIGH) /* PA3 */ #define GPIO_USART2_TX (GPIO_USART2_TX_1|GPIO_SPEED_HIGH) /* PA2 */ +/* Qencoder on TIM3: + * TIM3_CH1IN - PB4 (D5) + * TIM3_CH2IN - PC7 (D3) + */ + +#define GPIO_TIM3_CH1IN (GPIO_TIM3_CH1IN_2|GPIO_SPEED_HIGH) +#define GPIO_TIM3_CH2IN (GPIO_TIM3_CH2IN_6|GPIO_SPEED_HIGH) + /* DMA channels *************************************************************/ /* ADC */ diff --git a/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c b/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c index 3f03c3f063e..2ca3cf0ec3e 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c +++ b/boards/arm/stm32f0l0g0/nucleo-c071rb/src/stm32_bringup.c @@ -42,6 +42,10 @@ # include <stm32_wdg.h> #endif +#ifdef CONFIG_SENSORS_QENCODER +# include "board_qencoder.h" +#endif + #include <arch/board/board.h> #include "nucleo-c071rb.h" @@ -109,6 +113,19 @@ int stm32_bringup(void) } #endif +#ifdef CONFIG_SENSORS_QENCODER + /* Initialize and register the qencoder driver - TIM3 */ + + ret = board_qencoder_initialize(0, 3); + if (ret != OK) + { + syslog(LOG_ERR, + "ERROR: Failed to register the qencoder: %d\n", + ret); + return ret; + } +#endif + UNUSED(ret); return OK; } diff --git a/boards/arm/stm32f0l0g0/nucleo-c092rc/configs/jumbo/defconfig b/boards/arm/stm32f0l0g0/nucleo-c092rc/configs/jumbo/defconfig index 08a40532ee7..06d19717044 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c092rc/configs/jumbo/defconfig +++ b/boards/arm/stm32f0l0g0/nucleo-c092rc/configs/jumbo/defconfig @@ -12,6 +12,7 @@ CONFIG_ADC=y CONFIG_ANALOG=y CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="nucleo-c092rc" +CONFIG_ARCH_BOARD_COMMON=y CONFIG_ARCH_BOARD_NUCLEO_C092RC=y CONFIG_ARCH_BUTTONS=y CONFIG_ARCH_CHIP="stm32f0l0g0" @@ -38,6 +39,7 @@ CONFIG_EXAMPLES_ADC_GROUPSIZE=2 CONFIG_EXAMPLES_ADC_SWTRIG=y CONFIG_EXAMPLES_BUTTONS=y CONFIG_EXAMPLES_HELLO=y +CONFIG_EXAMPLES_QENCODER=y CONFIG_EXAMPLES_WATCHDOG=y CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INIT_STACKSIZE=1536 @@ -60,6 +62,8 @@ CONFIG_RAM_START=0x20000000 CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 CONFIG_SCHED_WAITPID=y +CONFIG_SENSORS=y +CONFIG_SENSORS_QENCODER=y CONFIG_START_DAY=19 CONFIG_START_MONTH=5 CONFIG_START_YEAR=2013 @@ -68,6 +72,8 @@ CONFIG_STM32F0L0G0_ADC1=y CONFIG_STM32F0L0G0_ADC_MAX_SAMPLES=2 CONFIG_STM32F0L0G0_DMA1=y CONFIG_STM32F0L0G0_IWDG=y +CONFIG_STM32F0L0G0_TIM3=y +CONFIG_STM32F0L0G0_TIM3_QE=y CONFIG_STM32F0L0G0_USART2=y CONFIG_STM32F0L0G0_WWDG=y CONFIG_SYSTEM_NSH=y diff --git a/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h b/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h index 9b4b5d793f9..fe9f5cf786a 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h +++ b/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h @@ -172,6 +172,14 @@ #define GPIO_FDCAN1_RX (GPIO_FDCAN1_RX_8|GPIO_SPEED_HIGH) /* PD0 */ #define GPIO_FDCAN1_TX (GPIO_FDCAN1_TX_9|GPIO_SPEED_HIGH) /* PD1 */ +/* Qencoder on TIM3: + * TIM3_CH1IN - PB4 (D5) + * TIM3_CH2IN - PC7 (D3) + */ + +#define GPIO_TIM3_CH1IN (GPIO_TIM3_CH1IN_2|GPIO_SPEED_HIGH) +#define GPIO_TIM3_CH2IN (GPIO_TIM3_CH2IN_6|GPIO_SPEED_HIGH) + /* DMA channels *************************************************************/ /* ADC */ diff --git a/boards/arm/stm32f0l0g0/nucleo-c092rc/src/stm32_bringup.c b/boards/arm/stm32f0l0g0/nucleo-c092rc/src/stm32_bringup.c index 8cd1d4d7209..b51e3c42f45 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c092rc/src/stm32_bringup.c +++ b/boards/arm/stm32f0l0g0/nucleo-c092rc/src/stm32_bringup.c @@ -42,6 +42,10 @@ # include <stm32_wdg.h> #endif +#ifdef CONFIG_SENSORS_QENCODER +# include "board_qencoder.h" +#endif + #include <arch/board/board.h> #include "nucleo-c092rc.h" @@ -129,6 +133,19 @@ int stm32_bringup(void) } #endif +#ifdef CONFIG_SENSORS_QENCODER + /* Initialize and register the qencoder driver - TIM3 */ + + ret = board_qencoder_initialize(0, 3); + if (ret != OK) + { + syslog(LOG_ERR, + "ERROR: Failed to register the qencoder: %d\n", + ret); + return ret; + } +#endif + UNUSED(ret); return OK; }
