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 */

Reply via email to