This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 80b9fc30deab25eeec9ad54cb0c873bded4b4d7e Author: leocafonso <[email protected]> AuthorDate: Sun Nov 16 12:22:59 2025 -0800 boards/arduino-r4-minima: Add PWM support using GPT timer - Added PWM support on Arduino R4 Minima board. This board has 5 PWM channels available using the GPT timer from the RA4M1 microcontroller. - Added a pwm config file to enable PWM supporting GTP2 GTIOCB on P102. Signed-off-by: leocafonso <[email protected]> --- boards/arm/ra4/arduino-r4-minima/Kconfig | 16 ++++ .../ra4/arduino-r4-minima/configs/pwm/defconfig | 41 ++++++++++ boards/arm/ra4/arduino-r4-minima/include/board.h | 17 +++++ .../arm/ra4/arduino-r4-minima/src/CMakeLists.txt | 4 + boards/arm/ra4/arduino-r4-minima/src/Makefile | 4 + .../arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c | 14 ++++ .../src/{ra4m1_bringup.c => ra4m1_pwm.c} | 87 +++++++++++++++------- 7 files changed, 158 insertions(+), 25 deletions(-) diff --git a/boards/arm/ra4/arduino-r4-minima/Kconfig b/boards/arm/ra4/arduino-r4-minima/Kconfig index 5d94625c18c..31ad272eb46 100644 --- a/boards/arm/ra4/arduino-r4-minima/Kconfig +++ b/boards/arm/ra4/arduino-r4-minima/Kconfig @@ -5,4 +5,20 @@ if ARCH_BOARD_ARDUINO_R4_MINIMA +config ARDUINO_R4_MINIMA_PWM_CHANNEL + int "PWM channel number" + default 0 if RA_GPT0_PWM + default 1 if RA_GPT1_PWM + default 2 if RA_GPT2_PWM + default 3 if RA_GPT3_PWM + default 4 if RA_GPT4_PWM + default 5 if RA_GPT5_PWM + default 6 if RA_GPT6_PWM + default 7 if RA_GPT7_PWM + range 0 7 + depends on PWM && RA_PWM + ---help--- + Selects the PWM channel number that will be used to perform the PWM + test. See apps/examples/pwm. + endif diff --git a/boards/arm/ra4/arduino-r4-minima/configs/pwm/defconfig b/boards/arm/ra4/arduino-r4-minima/configs/pwm/defconfig new file mode 100644 index 00000000000..e229e0f15ef --- /dev/null +++ b/boards/arm/ra4/arduino-r4-minima/configs/pwm/defconfig @@ -0,0 +1,41 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="arduino-r4-minima" +CONFIG_ARCH_BOARD_ARDUINO_R4_MINIMA=y +CONFIG_ARCH_CHIP="ra4" +CONFIG_ARCH_CHIP_R7FA4M1ABxxFM=y +CONFIG_ARCH_CHIP_RA4=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=6965 +CONFIG_BUILTIN=y +CONFIG_EXAMPLES_PWM=y +CONFIG_FS_PROCFS=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=32768 +CONFIG_RAM_START=0x20000000 +CONFIG_RA_GPT2=y +CONFIG_RA_GPT2_OUTPUTB=y +CONFIG_RA_GPT2_PWM=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_WAITPID=y +CONFIG_SCI2_SERIAL_CONSOLE=y +CONFIG_START_DAY=28 +CONFIG_START_MONTH=6 +CONFIG_START_YEAR=2013 +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=32 diff --git a/boards/arm/ra4/arduino-r4-minima/include/board.h b/boards/arm/ra4/arduino-r4-minima/include/board.h index ca4ecdb06d2..ca6291055e2 100644 --- a/boards/arm/ra4/arduino-r4-minima/include/board.h +++ b/boards/arm/ra4/arduino-r4-minima/include/board.h @@ -77,6 +77,23 @@ #define GPIO_SCI9_RX GPIO_RXD9_MISO9_SCL9_1 /* P110 */ #define GPIO_SCI9_TX GPIO_TXD9_MOSI9_SDA9_1 /* P109 */ +/* PWM Pins *****************************************************************/ + +/* PWM output pins: + * D3 - P104 + * D5 - P102 + * D6 - P106 + * D9 - P303 + * D10 - P112 + * D11 - P109 + */ +#define GPIO_GPT1_GTIOCB GPIO_GPT_GTIOC1B_P104 +#define GPIO_GPT2_GTIOCB GPIO_GPT_GTIOC2B_P102 +#define GPIO_GPT0_GTIOCB GPIO_GPT_GTIOC0B_P106 +#define GPIO_GPT7_GTIOCB GPIO_GPT_GTIOC7B_P303 +#define GPIO_GPT3_GTIOCB GPIO_GPT_GTIOC3B_P112 +#define GPIO_GPT1_GTIOCA GPIO_GPT_GTIOC1A_P109 + /* LED pin selections */ #define GPIO_L_LED (gpio_pinset_t){ PORT1,PIN11, (GPIO_OUPUT | GPIO_LOW_DRIVE | GPIO_OUTPUT_LOW)} /* P111 */ diff --git a/boards/arm/ra4/arduino-r4-minima/src/CMakeLists.txt b/boards/arm/ra4/arduino-r4-minima/src/CMakeLists.txt index 0c0d602d26b..bf7885da011 100644 --- a/boards/arm/ra4/arduino-r4-minima/src/CMakeLists.txt +++ b/boards/arm/ra4/arduino-r4-minima/src/CMakeLists.txt @@ -26,6 +26,10 @@ else() list(APPEND SRCS ra4m1_userleds.c) endif() +if(CONFIG_PWM) + list(APPEND SRCS ra4m1_pwm.c) +endif() + target_sources(board PRIVATE ${SRCS}) set_property(GLOBAL PROPERTY LD_SCRIPT diff --git a/boards/arm/ra4/arduino-r4-minima/src/Makefile b/boards/arm/ra4/arduino-r4-minima/src/Makefile index e7585e8d2b5..2f1ed2581f2 100644 --- a/boards/arm/ra4/arduino-r4-minima/src/Makefile +++ b/boards/arm/ra4/arduino-r4-minima/src/Makefile @@ -32,4 +32,8 @@ ifeq ($(CONFIG_BOARDCTL),y) CSRCS += ra4m1_appinit.c endif +ifeq ($(CONFIG_PWM),y) +CSRCS += ra4m1_pwm.c +endif + include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c b/boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c index 84f80e70571..ca3dbbd5e7c 100644 --- a/boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c +++ b/boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c @@ -45,6 +45,10 @@ # define HAVE_LEDS 1 #endif +#ifdef CONFIG_PWM +extern int ra4m1_pwm_setup(void); +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -75,6 +79,16 @@ int ra4m1_bringup(void) } #endif +#ifdef CONFIG_PWM + /* Initialize PWM and register the PWM device. */ + + ret = ra4m1_pwm_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: ra4m1_pwm_setup() failed: %d\n", ret); + } +#endif + UNUSED(ret); return OK; } diff --git a/boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c b/boards/arm/ra4/arduino-r4-minima/src/ra4m1_pwm.c similarity index 50% copy from boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c copy to boards/arm/ra4/arduino-r4-minima/src/ra4m1_pwm.c index 84f80e70571..40a7e0c08fa 100644 --- a/boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c +++ b/boards/arm/ra4/arduino-r4-minima/src/ra4m1_pwm.c @@ -1,5 +1,7 @@ /**************************************************************************** - * boards/arm/ra4/arduino-r4-minima/src/ra4m1_bringup.c + * boards/arm/ra4/arduino-r4-minima/src/ra4m1_pwm.c + * + * SPDX-License-Identifier: Apache-2.0 * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -24,57 +26,92 @@ #include <nuttx/config.h> -#include <stdio.h> -#include <syslog.h> +#include <sys/types.h> +#include <errno.h> +#include <debug.h> #include <nuttx/board.h> -#include <nuttx/fs/fs.h> -#include <nuttx/leds/userled.h> -#include <nuttx/spi/spi_transfer.h> - -#include "arduino-r4-minima.h" +#include <nuttx/timers/pwm.h> #include <arch/board/board.h> +#include "ra_pwm.h" + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -#undef HAVE_LEDS -#if !defined(CONFIG_ARCH_LEDS) && defined(CONFIG_USERLED_LOWER) -# define HAVE_LEDS 1 +/* Configuration ************************************************************/ + +/* PWM. + * There are no dedicated PWM output pins available to the user for PWM + * testing. + */ + +#ifndef CONFIG_ARDUINO_R4_MINIMA_PWM_CHANNEL +# if defined(CONFIG_RA4M1_PWM_CHAN0) +# warning Assuming PWM channel 0 +# define CONFIG_ARDUINO_R4_MINIMA_PWM_CHANNEL 0 +# elif defined(CONFIG_RA4M1_PWM_CHAN1) +# warning Assuming PWM channel 1 +# define CONFIG_ARDUINO_R4_MINIMA_PWM_CHANNEL 1 +# elif defined(CONFIG_RA4M1_PWM_CHAN2) +# warning Assuming PWM channel 2 +# define CONFIG_ARDUINO_R4_MINIMA_PWM_CHANNEL 2 +# elif defined(CONFIG_RA4M1_PWM_CHAN3) +# warning Assuming PWM channel 3 +# define CONFIG_ARDUINO_R4_MINIMA_PWM_CHANNEL 3 +# endif #endif +#if defined(CONFIG_PWM) && defined(CONFIG_RA_PWM) + /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** - * Name: ra4m1_bringup + * Name: ra4m1_pwm_setup * * Description: - * Perform architecture-specific initialization - * + * Initialize PWM and register the PWM device. * ****************************************************************************/ -int ra4m1_bringup(void) +int ra4m1_pwm_setup(void) { + static bool initialized = false; + struct pwm_lowerhalf_s *pwm; int ret; -#ifdef HAVE_LEDS - board_userled_initialize(); - - /* Register the LED driver */ + /* Have we already initialized? */ - ret = userled_lower_initialize(LED_DRIVER_PATH); - if (ret < 0) + if (!initialized) { - syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); - return ret; + /* Call ra_pwminitialize() to get an instance of the PWM interface */ + + pwm = ra_pwminitialize(CONFIG_ARDUINO_R4_MINIMA_PWM_CHANNEL); + if (!pwm) + { + _err("ERROR: Failed to get the RA4M1 PWM lower half\n"); + return -ENODEV; + } + + /* Register the PWM driver at "/dev/pwm0" */ + + ret = pwm_register("/dev/pwm0", pwm); + if (ret < 0) + { + aerr("ERROR: pwm_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; } -#endif - UNUSED(ret); return OK; } + +#endif /* CONFIG_PWM */
