This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 15678acf6f6d3e54fda5231e6daa46560fd9d04c
Author: dechao_gong <[email protected]>
AuthorDate: Thu Aug 27 10:40:51 2026 +0800

    arch/arm/rtl8721f: add watchdog driver support
    
    Wire the RTL8721F (amebagreen2) into the shared Ameba watchdog driver
    (arch/arm/src/common/ameba/ameba_wdg.c), registered as /dev/watchdog0.
    Only the per-chip base address and IRQ differ, so this adds a small
    ameba_wdg_chip.h (WDG2 non-secure system watchdog at 0x4080AD80,
    CPU0_NS_WDG IRQ 69, verified against the SoC hal_platform.h and
    ameba_vector_table.h) plus the Make.defs/CMakeLists build hooks, the
    board bring-up registration, and a wdg defconfig.  The shared driver is
    unchanged.
    
    Assisted-by: Claude <[email protected]>
    Signed-off-by: dechao_gong <[email protected]>
---
 .../arm/rtl8721f/boards/rtl8721f_evb/index.rst     | 13 ++++
 arch/arm/src/rtl8721f/CMakeLists.txt               |  4 ++
 arch/arm/src/rtl8721f/Make.defs                    |  4 ++
 arch/arm/src/rtl8721f/ameba_wdg_chip.h             | 75 ++++++++++++++++++++++
 .../rtl8721f/rtl8721f_evb/configs/wdg/defconfig    | 46 +++++++++++++
 .../arm/rtl8721f/rtl8721f_evb/src/CMakeLists.txt   |  7 +-
 boards/arm/rtl8721f/rtl8721f_evb/src/Makefile      |  6 +-
 .../rtl8721f/rtl8721f_evb/src/rtl8721f_bringup.c   | 10 +++
 .../rtl8721f_evb/src/rtl8721f_rtl8721f_evb.h       | 13 ++++
 .../arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.c   | 67 +++++++++++++++++++
 10 files changed, 243 insertions(+), 2 deletions(-)

diff --git a/Documentation/platforms/arm/rtl8721f/boards/rtl8721f_evb/index.rst 
b/Documentation/platforms/arm/rtl8721f/boards/rtl8721f_evb/index.rst
index 6f751f06609..d56b85fa6a6 100644
--- a/Documentation/platforms/arm/rtl8721f/boards/rtl8721f_evb/index.rst
+++ b/Documentation/platforms/arm/rtl8721f/boards/rtl8721f_evb/index.rst
@@ -46,6 +46,8 @@ Supported in this NuttX port:
   on the SDK fwlib register layer
 * On-chip RTC exposed as a ``/dev/rtc0`` date/time character device with
   alarm support, driven directly on the SDK fwlib register layer
+* On-chip watchdog exposed as a ``/dev/watchdog0`` character device, driven
+  directly on the SDK fwlib register layer
 
 Buttons and LEDs
 ================
@@ -180,6 +182,17 @@ NSH ``date`` command, and arm a one-shot wakeup with the 
example::
     nsh> date -s "Jun 16 12:00:00 2026"  # set the RTC
     nsh> alarm 10                        # fire an alarm in 10 seconds
 
+wdg
+---
+
+Minimal NSH with the on-chip watchdog driver and the ``wdog`` example
+enabled (no Wi-Fi). The watchdog is registered at ``/dev/watchdog0`` from the
+board bring-up (``boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.c``); it
+has no board wiring (it is an internal timer). Exercise it with the example,
+which opens the device, sets a timeout, and pings it::
+
+    nsh> wdog                            # run the watchdog example
+
 nsh
 ---
 
diff --git a/arch/arm/src/rtl8721f/CMakeLists.txt 
b/arch/arm/src/rtl8721f/CMakeLists.txt
index 203292656ed..b873cd91c62 100644
--- a/arch/arm/src/rtl8721f/CMakeLists.txt
+++ b/arch/arm/src/rtl8721f/CMakeLists.txt
@@ -74,6 +74,10 @@ if(CONFIG_AMEBA_RTC)
   list(APPEND SRCS ${AMEBA_COMMON}/ameba_rtc.c)
 endif()
 
+if(CONFIG_AMEBA_WDG)
+  list(APPEND SRCS ${AMEBA_COMMON}/ameba_wdg.c)
+endif()
+
 target_include_directories(arch PRIVATE ${AMEBA_COMMON})
 target_sources(arch PRIVATE ${SRCS})
 
diff --git a/arch/arm/src/rtl8721f/Make.defs b/arch/arm/src/rtl8721f/Make.defs
index 7d9aa167e97..55461ca3465 100644
--- a/arch/arm/src/rtl8721f/Make.defs
+++ b/arch/arm/src/rtl8721f/Make.defs
@@ -84,6 +84,10 @@ ifeq ($(CONFIG_AMEBA_RTC),y)
 CHIP_CSRCS += ameba_rtc.c
 endif
 
+ifeq ($(CONFIG_AMEBA_WDG),y)
+CHIP_CSRCS += ameba_wdg.c
+endif
+
 ############################################################################
 # Realtek RTL8721F SDK integration
 #
diff --git a/arch/arm/src/rtl8721f/ameba_wdg_chip.h 
b/arch/arm/src/rtl8721f/ameba_wdg_chip.h
new file mode 100644
index 00000000000..ea2ea58f63f
--- /dev/null
+++ b/arch/arm/src/rtl8721f/ameba_wdg_chip.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * arch/arm/src/rtl8721f/ameba_wdg_chip.h
+ *
+ * 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
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_RTL8721F_AMEBA_WDG_CHIP_H
+#define __ARCH_ARM_SRC_RTL8721F_AMEBA_WDG_CHIP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/irq.h>
+
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Per-chip watchdog wiring for RTL8721F (amebagreen2).  The shared driver
+ * (arch/arm/src/common/ameba/ameba_wdg.c) includes this header to learn
+ * which watchdog instance to drive and its interrupt line.  A port to
+ * another Ameba chip supplies a same-named header on the chip include path;
+ * the shared driver is never edited -- it reads only the two macros below.
+ *
+ * The Ameba SoCs carry several watchdog instances (an always-on IWDG plus
+ * one "system" WDG per CPU, each with a secure and a non-secure alias).
+ * This NuttX port runs on the CPU0 core, and -- matching the vendor HAL
+ * wdt_api.c, which selects the CPU's non-secure system WDG device / IRQ --
+ * we drive that non-secure system watchdog.  As with the I2C/SPI drivers
+ * the non-secure register alias (0x40xxxxxx) is the one actually reachable
+ * from this core, so that is the base used here.
+ *
+ * BOTH the base address and the interrupt vector are chip-specific.  The WDG
+ * register block, structures, magic keys and the ms-based timeout are the
+ * same on every current Ameba chip, so they live in the shared driver; only
+ * the two values below move per chip (verified against each SoC's
+ * hal_platform.h and ameba_vector_table.h):
+ *
+ *   chip         non-secure system WDG base           NuttX IRQ
+ *   -----------  -----------------------------------  ---------------------
+ *   amebadplus   WDG2_REG_BASE            0x41008D80  KM4_NS_WDG_IRQ    = 65
+ *   amebagreen2  WDG2_REG_BASE            0x4080AD80  CPU0_NS_WDG_IRQ   = 69
+ *   RTL8720F     WDG2_REG_BASE            0x40801D80  KM4TZ_NS_WDG_IRQ  = 52
+ *
+ * A new chip only edits this header: AMEBA_WDG_BASE is the register base of
+ * its non-secure system WDG (cast to the fwlib WDG_TypeDef * by the shared
+ * driver) and AMEBA_WDG_IRQ carries the NuttX IRQ number of that WDG's
+ * early-interrupt line -- see the ADC/RTC chip headers for the same
+ * data-driven, never-computed pattern.
+ */
+
+#define AMEBA_WDG_BASE            0x4080ad80ul
+#define AMEBA_WDG_IRQ             RTL8721F_IRQ_CPU0_NS_WDG
+
+#endif /* __ARCH_ARM_SRC_RTL8721F_AMEBA_WDG_CHIP_H */
diff --git a/boards/arm/rtl8721f/rtl8721f_evb/configs/wdg/defconfig 
b/boards/arm/rtl8721f/rtl8721f_evb/configs/wdg/defconfig
new file mode 100644
index 00000000000..34bc781686e
--- /dev/null
+++ b/boards/arm/rtl8721f/rtl8721f_evb/configs/wdg/defconfig
@@ -0,0 +1,46 @@
+#
+# 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_AMEBA_WDG=y
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="rtl8721f_evb"
+CONFIG_ARCH_BOARD_RTL8721F_EVB=y
+CONFIG_ARCH_CHIP="rtl8721f"
+CONFIG_ARCH_CHIP_RTL8721F=y
+CONFIG_ARCH_INTERRUPTSTACK=2048
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV8M_SYSTICK=y
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_ASSERTIONS=y
+CONFIG_DEBUG_FEATURES=y
+CONFIG_DEBUG_FULLOPT=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DEFAULT_TASK_STACKSIZE=4096
+CONFIG_EXAMPLES_HELLO=y
+CONFIG_EXAMPLES_WATCHDOG=y
+CONFIG_FS_PROCFS=y
+CONFIG_FS_TMPFS=y
+CONFIG_IDLETHREAD_STACKSIZE=4096
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_LIBC_MEMFD_ERROR=y
+CONFIG_MM_DEFAULT_ALIGNMENT=32
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_READLINE=y
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=401408
+CONFIG_RAM_START=0x20006000
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_HPWORKPRIORITY=192
+CONFIG_SCHED_LPWORK=y
+CONFIG_STACK_COLORATION=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_SYSTEM_NSH_STACKSIZE=2500
+CONFIG_TIMER=y
+CONFIG_TIMER_ARCH=y
+CONFIG_USEC_PER_TICK=1000
diff --git a/boards/arm/rtl8721f/rtl8721f_evb/src/CMakeLists.txt 
b/boards/arm/rtl8721f/rtl8721f_evb/src/CMakeLists.txt
index db2924e0b0f..3f113535008 100644
--- a/boards/arm/rtl8721f/rtl8721f_evb/src/CMakeLists.txt
+++ b/boards/arm/rtl8721f/rtl8721f_evb/src/CMakeLists.txt
@@ -50,6 +50,10 @@ if(CONFIG_AMEBA_RTC)
   list(APPEND SRCS rtl8721f_rtc.c)
 endif()
 
+if(CONFIG_AMEBA_WDG)
+  list(APPEND SRCS rtl8721f_wdg.c)
+endif()
+
 target_sources(board PRIVATE ${SRCS})
 
 if(CONFIG_AMEBA_GPIO
@@ -58,7 +62,8 @@ if(CONFIG_AMEBA_GPIO
    OR CONFIG_AMEBA_SPI
    OR CONFIG_AMEBA_PWM
    OR CONFIG_AMEBA_ADC
-   OR CONFIG_AMEBA_RTC)
+   OR CONFIG_AMEBA_RTC
+   OR CONFIG_AMEBA_WDG)
   # The board pin tables pull in the shared drivers' public headers from
   # arch/arm/src/common/ameba/, not on the default board include path.
   target_include_directories(board
diff --git a/boards/arm/rtl8721f/rtl8721f_evb/src/Makefile 
b/boards/arm/rtl8721f/rtl8721f_evb/src/Makefile
index e390a40df49..f07897e486b 100644
--- a/boards/arm/rtl8721f/rtl8721f_evb/src/Makefile
+++ b/boards/arm/rtl8721f/rtl8721f_evb/src/Makefile
@@ -52,10 +52,14 @@ ifeq ($(CONFIG_AMEBA_RTC),y)
 CSRCS += rtl8721f_rtc.c
 endif
 
+ifeq ($(CONFIG_AMEBA_WDG),y)
+CSRCS += rtl8721f_wdg.c
+endif
+
 # The board pin tables pull in the shared drivers' public headers from
 # arch/arm/src/common/ameba/, which is not on the default board include path.
 
-ifneq 
($(CONFIG_AMEBA_GPIO)$(CONFIG_AMEBA_UART)$(CONFIG_AMEBA_I2C)$(CONFIG_AMEBA_SPI)$(CONFIG_AMEBA_PWM)$(CONFIG_AMEBA_ADC)$(CONFIG_AMEBA_RTC),)
+ifneq 
($(CONFIG_AMEBA_GPIO)$(CONFIG_AMEBA_UART)$(CONFIG_AMEBA_I2C)$(CONFIG_AMEBA_SPI)$(CONFIG_AMEBA_PWM)$(CONFIG_AMEBA_ADC)$(CONFIG_AMEBA_RTC)$(CONFIG_AMEBA_WDG),)
 CFLAGS += 
${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)arm$(DELIM)src$(DELIM)common$(DELIM)ameba
 endif
 
diff --git a/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_bringup.c 
b/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_bringup.c
index 1ff9419e814..a8506819977 100644
--- a/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_bringup.c
+++ b/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_bringup.c
@@ -204,6 +204,16 @@ int rtl8721f_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_AMEBA_WDG
+  /* Register the board's watchdog at /dev/watchdog0. */
+
+  ret = rtl8721f_wdg_initialize();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: rtl8721f_wdg_initialize failed: %d\n", ret);
+    }
+#endif
+
   IPC_patch_function(rtos_critical_enter, rtos_critical_exit,
                      AMEBA_RTOS_CRITICAL_SEMA);
   IPC_SEMDelayStub(rtos_time_delay_ms);
diff --git a/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_rtl8721f_evb.h 
b/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_rtl8721f_evb.h
index 7cc181db520..01ce0923c4c 100644
--- a/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_rtl8721f_evb.h
+++ b/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_rtl8721f_evb.h
@@ -173,6 +173,19 @@ int rtl8721f_adc_initialize(void);
 int rtl8721f_rtc_initialize(void);
 #endif
 
+#ifdef CONFIG_AMEBA_WDG
+/****************************************************************************
+ * Name: rtl8721f_wdg_initialize
+ *
+ * Description:
+ *   Register the board's watchdog at /dev/watchdog0
+ *   (boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.c).
+ *
+ ****************************************************************************/
+
+int rtl8721f_wdg_initialize(void);
+#endif
+
 #ifdef CONFIG_RTL8721F_FLASH_FS
 /****************************************************************************
  * Name: ameba_flash_fs_initialize
diff --git a/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.c 
b/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.c
new file mode 100644
index 00000000000..9a1523a574e
--- /dev/null
+++ b/boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * boards/arm/rtl8721f/rtl8721f_evb/src/rtl8721f_wdg.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
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <syslog.h>
+#include <errno.h>
+
+#include "ameba_wdg.h"
+#include "rtl8721f_rtl8721f_evb.h"
+
+#ifdef CONFIG_AMEBA_WDG
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rtl8721f_wdg_initialize
+ *
+ * Description:
+ *   Register the on-chip watchdog at /dev/watchdog0.  The WDG has no board
+ *   wiring (it is an internal timer), so this simply defers to the shared
+ *   driver.
+ *
+ ****************************************************************************/
+
+int rtl8721f_wdg_initialize(void)
+{
+  int ret;
+
+  ret = ameba_wdg_initialize();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: ameba_wdg_initialize(/dev/watchdog0) failed: %d\n",
+             ret);
+      return ret;
+    }
+
+  return OK;
+}
+
+#endif /* CONFIG_AMEBA_WDG */

Reply via email to