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 7e34d1c6b403c95b0c400d53e10304bb287f182d
Author: dechao_gong <[email protected]>
AuthorDate: Tue Sep 22 10:15:20 2026 +0800

    arch/arm/ameba: add GPIO driver for RTL8730E (AmebaSmart CA32)
    
    Wire the shared ameba_gpio driver to the RTL8730E CA32 core.
    
    The CA32 replaces the vendor CA32 OS as BL33; the SDK startup that
    normally initialises GPIO_PORTx[] never runs under NuttX.  The three
    GPIO port base addresses are patched at runtime inside
    rtl8730e_gpio_initialize() before any ROM GPIO function is called.
    GPIO_INTStatusGet and GPIO_INTStatusClearEdge are absent from the
    RTL8730E ROM and are provided as static inline helpers in the new
    ameba_gpio_chip.h.
    
    Key changes:
    - ameba_gpio_chip.h (new): chip parameters, split AMEBA_APBPERIPH_GPIO
      / AMEBA_APBPERIPH_GPIO_CLK bits, inline INTStatus helpers
    - ameba_gpio.c: add AMEBA_APBPERIPH_GPIO_CLK fallback macro so chips
      with separate periph/clock enable bits work without driver changes
    - Make.defs: enable ameba_gpio.c + rtl8730e_flash_stubs.c + lib_rom.a
      under CONFIG_AMEBA_GPIO; consolidate flash_stubs into GPIO||FLASH_FS
    - ameba_board.mk: remove duplicate lib_rom.a (Make.defs is authoritative)
    - rtl8730e_flash_stubs.c: make _strcmp weak; delegate Pinmux_Config to
      lib_rom.a's _Pinmux_Config so GPIO pad mux is configured correctly
    - Kconfig: source common/ameba/Kconfig to expose CONFIG_AMEBA_GPIO
    - dramboot.ld: include .sramdram.only.data in .data so GPIO_PORTx[] is
      copied to RAM by the normal arm_data_initialize() path
    - scripts/Make.defs: extend --no-warn-mismatch to GPIO and WiFi configs
    - rtl8730e_gpio.c (new): pin table (PB19 output /dev/gpio0, PB20 input
      /dev/gpio1, PB11 falling-edge interrupt /dev/gpio2) + GPIO_PORTx patch
    - configs/gpio/ (new): defconfig for GPIO example verification
    - nxstyle.c: add _Pinmux_ to mixed-case whitelist (ROM symbol)
    
    Hardware verified on RTL8730E CA32:
    - PB19 output write 0/1, readback matches
    - PB20 input reads PB19-driven level
    - PB11 falling-edge interrupt triggers correctly
    
    Signed-off-by: dechao_gong <[email protected]>
    Assisted-by: Claude <[email protected]>
---
 arch/arm/src/common/ameba/ameba_gpio.c             |  11 ++-
 arch/arm/src/rtl8730e/Kconfig                      |   2 +
 arch/arm/src/rtl8730e/Make.defs                    |  16 +++-
 arch/arm/src/rtl8730e/ameba_board.mk               |   5 +-
 arch/arm/src/rtl8730e/ameba_gpio_chip.h            | 101 +++++++++++++++++++++
 arch/arm/src/rtl8730e/rtl8730e_flash_stubs.c       |  12 ++-
 .../rtl8730e/rtl8730e_evb/configs/gpio/defconfig   |  63 +++++++++++++
 boards/arm/rtl8730e/rtl8730e_evb/scripts/Make.defs |   7 +-
 .../arm/rtl8730e/rtl8730e_evb/scripts/dramboot.ld  |   7 ++
 boards/arm/rtl8730e/rtl8730e_evb/src/Makefile      |   6 +-
 .../rtl8730e/rtl8730e_evb/src/rtl8730e_bringup.c   |   9 ++
 .../arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h   |   4 +
 .../src/{rtl8730e_evb.h => rtl8730e_gpio.c}        |  76 ++++++++++++----
 tools/nxstyle.c                                    |   1 +
 14 files changed, 290 insertions(+), 30 deletions(-)

diff --git a/arch/arm/src/common/ameba/ameba_gpio.c 
b/arch/arm/src/common/ameba/ameba_gpio.c
index 6451d21b552..319926d0f50 100644
--- a/arch/arm/src/common/ameba/ameba_gpio.c
+++ b/arch/arm/src/common/ameba/ameba_gpio.c
@@ -109,8 +109,17 @@
  * AMEBA_GPIO_PORT_IRQS vector table come from <ameba_gpio_chip.h>.  The
  * fwlib GPIO_Init() leaves the peripheral clock to the caller, so the driver
  * gates AMEBA_APBPERIPH_GPIO on before use (RCC touches the LSYS block).
+ *
+ * On most Ameba chips the peripheral-enable and clock-enable bits are the
+ * same value, so a single macro suffices for both RCC_PeriphClockCmd args.
+ * On chips where they differ (e.g. RTL8730E), <ameba_gpio_chip.h> may also
+ * define AMEBA_APBPERIPH_GPIO_CLK for the clock-enable argument.
  */
 
+#ifndef AMEBA_APBPERIPH_GPIO_CLK
+#  define AMEBA_APBPERIPH_GPIO_CLK AMEBA_APBPERIPH_GPIO
+#endif
+
 /****************************************************************************
  * Private Types
  ****************************************************************************/
@@ -256,7 +265,7 @@ static void ameba_gpio_configure(struct ameba_gpio_dev_s 
*priv,
 
   /* Gate on the GPIO peripheral clock (idempotent). */
 
-  RCC_PeriphClockCmd(AMEBA_APBPERIPH_GPIO, AMEBA_APBPERIPH_GPIO,
+  RCC_PeriphClockCmd(AMEBA_APBPERIPH_GPIO, AMEBA_APBPERIPH_GPIO_CLK,
                      AMEBA_ENABLE);
 
   switch (pintype)
diff --git a/arch/arm/src/rtl8730e/Kconfig b/arch/arm/src/rtl8730e/Kconfig
index c75c9983584..57638dbc8cd 100644
--- a/arch/arm/src/rtl8730e/Kconfig
+++ b/arch/arm/src/rtl8730e/Kconfig
@@ -30,4 +30,6 @@ config ARCH_CHIP_RTL8730E_CA32
 
 endmenu # "Realtek AmebaSmart (RTL8730E) Chip Selection"
 
+source "arch/arm/src/common/ameba/Kconfig"
+
 endif # ARCH_CHIP_RTL8730E
diff --git a/arch/arm/src/rtl8730e/Make.defs b/arch/arm/src/rtl8730e/Make.defs
index e298042919e..5e724f56b14 100644
--- a/arch/arm/src/rtl8730e/Make.defs
+++ b/arch/arm/src/rtl8730e/Make.defs
@@ -59,6 +59,21 @@ ifeq ($(CONFIG_BUILD_PROTECTED),y)
   CHIP_CSRCS += rtl8730e_userspace.c rtl8730e_allocateheap.c
 endif
 
+AMEBA_AP_SOC_LIB = 
$(TOPDIR)/arch/arm/src/common/ameba/ameba-rtos/component/soc/amebasmart/project/project_ap/lib/soc
+
+# lib_rom.a provides ROM stubs (GPIO, UART, flash, Pinmux, etc.).
+# rtl8730e_flash_stubs.c supplies the RAM-side symbols that lib_rom.a objects
+# expect (DiagPrintfNano, irq_enable, Pinmux_Config, etc.).  Compile them once
+# whenever any driver needing ROM is enabled.
+ifneq ($(filter y,$(CONFIG_AMEBA_GPIO) $(CONFIG_RTL8730E_FLASH_FS)),)
+CHIP_CSRCS += rtl8730e_flash_stubs.c
+EXTRA_LIBS += $(AMEBA_AP_SOC_LIB)$(DELIM)lib_rom.a
+endif
+
+ifeq ($(CONFIG_AMEBA_GPIO),y)
+CHIP_CSRCS += ameba_gpio.c
+endif
+
 # WiFi (WHC host, CA32 side).
 ifeq ($(CONFIG_RTL8730E_WIFI),y)
 CHIP_CSRCS += rtl8730e_wifi_init.c
@@ -80,7 +95,6 @@ endif
 
 # On-chip SPI NOR flash MTD (littlefs data partition).
 ifeq ($(CONFIG_RTL8730E_FLASH_FS),y)
-CHIP_CSRCS += rtl8730e_flash_stubs.c
 
 # ameba_flash_mtd.c lives in the common Ameba driver directory (already on
 # VPATH + INCLUDES at the top of this file).
diff --git a/arch/arm/src/rtl8730e/ameba_board.mk 
b/arch/arm/src/rtl8730e/ameba_board.mk
index 8c227677257..dff8117a407 100644
--- a/arch/arm/src/rtl8730e/ameba_board.mk
+++ b/arch/arm/src/rtl8730e/ameba_board.mk
@@ -61,12 +61,9 @@ AMEBA_FWLIB_SRCS += 
$(AMEBA_SOC)/fwlib/ram_common/ameba_ipc_api.c \
                     $(AMEBA_SOC)/fwlib/ram_common/ameba_ipc_ram.c
 endif
 
+
 ifeq ($(CONFIG_RTL8730E_FLASH_FS),y)
 AMEBA_FWLIB_SRCS += $(AMEBA_SOC)/fwlib/ram_common/ameba_flash_ram.c
-
-# lib_rom.a: prebuilt SDK AP library that provides FLASH_TxData/RxCmd/Erase/
-# SetStatus and RSIP_MMU_* called by ameba_flash_ram.c at link time.
-EXTRA_LIBS += $(AMEBA_SOC)/project/project_ap/lib/soc/lib_rom.a
 endif
 
 # Include paths scoped to the fwlib compile only (never leaked to NuttX core).
diff --git a/arch/arm/src/rtl8730e/ameba_gpio_chip.h 
b/arch/arm/src/rtl8730e/ameba_gpio_chip.h
new file mode 100644
index 00000000000..e4d8c9b4213
--- /dev/null
+++ b/arch/arm/src/rtl8730e/ameba_gpio_chip.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * arch/arm/src/rtl8730e/ameba_gpio_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_RTL8730E_AMEBA_GPIO_CHIP_H
+#define __ARCH_ARM_SRC_RTL8730E_AMEBA_GPIO_CHIP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+
+#include <nuttx/irq.h>
+
+/****************************************************************************
+ * Pre-processor Definitions (register map for local helpers)
+ ****************************************************************************/
+
+#define RTL8730E_GPIO_BASE   UINT32_C(0x4200D000)
+#define RTL8730E_GPIO_STRIDE UINT32_C(0x400)
+#define RTL8730E_GPIO_INT_STATUS UINT32_C(0x40)
+#define RTL8730E_GPIO_INT_EOI    UINT32_C(0x4C)
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Per-chip GPIO parameters for the shared driver
+ * (arch/arm/src/common/ameba/ameba_gpio.c).
+ *
+ * RTL8730E (CA32) exposes three GPIO ports: A, B, and C, each a 32-pin
+ * bank with its own GIC SPI interrupt.  The CA32 IRQ numbers are the GIC
+ * SPI numbers (9/10/11) plus RTL8730E_SPI_IRQ_BASE (32).
+ */
+
+/* Number of GPIO ports (banks) this chip exposes. */
+
+#define AMEBA_GPIO_NPORTS      3
+
+/* GIC SPI vectors for GPIOA/B/C on CA32, indexed by port number. */
+
+#define AMEBA_GPIO_PORT_IRQS   { 41, 42, 43 }
+
+/* RCC_PeriphClockCmd(periph, clock, state) takes two separate bit masks:
+ *   periph - APBPeriph_GPIO:       bit 23, enables the GPIO function
+ *   clock  - APBPeriph_GPIO_CLOCK: bit  8, enables the GPIO bus clock
+ * On RTL8730E these are distinct; on the KM4-based Ameba parts they
+ * happen to be the same value, so the shared driver passes one macro
+ * for both.  Define AMEBA_APBPERIPH_GPIO_CLK to override the clock arg.
+ */
+
+#define AMEBA_APBPERIPH_GPIO     ((uint32_t)1 << 23)
+#define AMEBA_APBPERIPH_GPIO_CLK ((uint32_t)1 <<  8)
+
+/****************************************************************************
+ * Inline Functions
+ ****************************************************************************/
+
+/* GPIO_INTStatusGet / GPIO_INTStatusClearEdge are absent from the RTL8730E
+ * ROM and fwlib; provide them here as inlines so no separate .c file is
+ * needed (unlike the KM4-based parts where these symbols are in the ROM).
+ */
+
+static inline uint32_t GPIO_INTStatusGet(uint32_t port)
+{
+  volatile uint32_t *r =
+    (volatile uint32_t *)(RTL8730E_GPIO_BASE + port * RTL8730E_GPIO_STRIDE +
+                          RTL8730E_GPIO_INT_STATUS);
+  return *r;
+}
+
+static inline void GPIO_INTStatusClearEdge(uint32_t port)
+{
+  volatile uint32_t *r =
+    (volatile uint32_t *)(RTL8730E_GPIO_BASE + port * RTL8730E_GPIO_STRIDE +
+                          RTL8730E_GPIO_INT_EOI);
+  *r = UINT32_C(0xffffffff);
+}
+
+#endif /* __ARCH_ARM_SRC_RTL8730E_AMEBA_GPIO_CHIP_H */
diff --git a/arch/arm/src/rtl8730e/rtl8730e_flash_stubs.c 
b/arch/arm/src/rtl8730e/rtl8730e_flash_stubs.c
index 80c15caf633..e8338122e54 100644
--- a/arch/arm/src/rtl8730e/rtl8730e_flash_stubs.c
+++ b/arch/arm/src/rtl8730e/rtl8730e_flash_stubs.c
@@ -173,7 +173,7 @@ void *_memset(void *s, int c, size_t n)
   return memset(s, c, n);
 }
 
-int _strcmp(const char *s1, const char *s2)
+int __attribute__((weak)) _strcmp(const char *s1, const char *s2)
 {
   return strcmp(s1, s2);
 }
@@ -325,12 +325,16 @@ void System_Reset(void)
   __asm__ volatile("b .");
 }
 
-/* Pinmux_Config: flash/LOGUART pinmux is handled by KM4; stub for CA32. */
+/* Pinmux_Config: lib_rom.a declares this as an external reference and
+ * provides _Pinmux_Config as the actual register-writing implementation.
+ * Delegate to it so GPIO_Init can configure pad mux for user GPIO pins.
+ */
+
+extern void _Pinmux_Config(uint32_t pinname, uint32_t pinfunc);
 
 void Pinmux_Config(uint32_t pinname, uint32_t pinfunc)
 {
-  (void)pinname;
-  (void)pinfunc;
+  _Pinmux_Config(pinname, pinfunc);
 }
 
 /****************************************************************************
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/configs/gpio/defconfig 
b/boards/arm/rtl8730e/rtl8730e_evb/configs/gpio/defconfig
new file mode 100644
index 00000000000..f16d551247d
--- /dev/null
+++ b/boards/arm/rtl8730e/rtl8730e_evb/configs/gpio/defconfig
@@ -0,0 +1,63 @@
+#
+# 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_NSH_DISABLE_MB is not set
+# CONFIG_NSH_DISABLE_MH is not set
+# CONFIG_NSH_DISABLE_MW is not set
+CONFIG_ALARM_ARCH=y
+CONFIG_AMEBA_GPIO=y
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="rtl8730e_evb"
+CONFIG_ARCH_BOARD_RTL8730E_EVB=y
+CONFIG_ARCH_CHIP="rtl8730e"
+CONFIG_ARCH_CHIP_RTL8730E=y
+CONFIG_ARCH_CHIP_RTL8730E_CA32=y
+CONFIG_ARCH_INTERRUPTSTACK=2048
+CONFIG_ARCH_LOWVECTORS=y
+CONFIG_ARM_PSCI=y
+CONFIG_BOARD_LOOPSPERMSEC=393693
+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_GPIO=y
+CONFIG_EXAMPLES_HELLO=y
+CONFIG_EXPERIMENTAL=y
+CONFIG_FLASH_SIZE=1048576
+CONFIG_FLASH_START=0x60300000
+CONFIG_FLASH_VSTART=0x60300000
+CONFIG_FS_PROCFS=y
+CONFIG_FS_TMPFS=y
+CONFIG_HAVE_CXX=y
+CONFIG_HAVE_CXXINITIALIZE=y
+CONFIG_IDLETHREAD_STACKSIZE=4096
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_LIBC_MEMFD_ERROR=y
+CONFIG_MM_DEFAULT_ALIGNMENT=64
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_READLINE=y
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_PRIORITY_INHERITANCE=y
+CONFIG_RAM_SIZE=3145728
+CONFIG_RAM_START=0x60400000
+CONFIG_RAM_VSTART=0x60400000
+CONFIG_RAW_BINARY=y
+CONFIG_READLINE_CMD_HISTORY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_HPWORKPRIORITY=192
+CONFIG_SMP=y
+CONFIG_SMP_NCPUS=2
+CONFIG_STACK_COLORATION=y
+CONFIG_START_DAY=25
+CONFIG_START_MONTH=4
+CONFIG_START_YEAR=2023
+CONFIG_SYSTEM_NSH=y
+CONFIG_USEC_PER_TICK=1000
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/scripts/Make.defs 
b/boards/arm/rtl8730e/rtl8730e_evb/scripts/Make.defs
index f162001f511..f5d182d3f3f 100644
--- a/boards/arm/rtl8730e/rtl8730e_evb/scripts/Make.defs
+++ b/boards/arm/rtl8730e/rtl8730e_evb/scripts/Make.defs
@@ -59,9 +59,10 @@ AMEBA_BAUD ?= 1500000
 include 
$(TOPDIR)$(DELIM)arch$(DELIM)arm$(DELIM)src$(DELIM)common$(DELIM)ameba$(DELIM)ameba_sdk.mk
 include 
$(TOPDIR)$(DELIM)arch$(DELIM)arm$(DELIM)src$(DELIM)rtl8730e$(DELIM)ameba_board.mk
 
-# lib_rom.a is compiled without VFP ABI flags; suppress the harmless mismatch
-# warning so the linker does not abort on it.
-ifeq ($(CONFIG_RTL8730E_FLASH_FS),y)
+# lib_rom.a and the RTK toolchain's libgcc.a are compiled without VFP ABI
+# flags; suppress the harmless mismatch so the linker does not abort on it
+# whenever libameba_fwlib.a is in the link (GPIO, WiFi, or flash-FS config).
+ifneq ($(filter y,$(CONFIG_AMEBA_GPIO) $(CONFIG_RTL8730E_WIFI) 
$(CONFIG_RTL8730E_FLASH_FS)),)
 LDFLAGS += --no-warn-mismatch
 endif
 
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/scripts/dramboot.ld 
b/boards/arm/rtl8730e/rtl8730e_evb/scripts/dramboot.ld
index 961b9f68754..5aabce46aa0 100644
--- a/boards/arm/rtl8730e/rtl8730e_evb/scripts/dramboot.ld
+++ b/boards/arm/rtl8730e/rtl8730e_evb/scripts/dramboot.ld
@@ -105,6 +105,13 @@ SECTIONS
   .data : {                    /* Data */
       _sdata = .;
       *(.data*)
+      /* lib_rom.a places GPIO port-base tables and other init data in
+       * .sramdram.only.data.  These must be copied from flash to RAM
+       * before any ROM GPIO (or other sramdram) functions are called.
+       * Including them here causes the normal _eronly..._edata copy in
+       * arm_data_initialize() to handle them automatically.
+       */
+      *(.sramdram.only.data)
       . = ALIGN(8);
       __start_impls = .;
       *(.impls)
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/src/Makefile 
b/boards/arm/rtl8730e/rtl8730e_evb/src/Makefile
index 4bc37eab26b..045cf28e21a 100644
--- a/boards/arm/rtl8730e/rtl8730e_evb/src/Makefile
+++ b/boards/arm/rtl8730e/rtl8730e_evb/src/Makefile
@@ -34,8 +34,12 @@ ifeq ($(CONFIG_LIBC_FDT),y)
 CFLAGS += 
${INCDIR_PREFIX}$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)fdt$(DELIM)dtc$(DELIM)libfdt
 endif
 
-ifeq ($(CONFIG_RTL8730E_FLASH_FS),y)
+ifneq ($(CONFIG_RTL8730E_FLASH_FS)$(CONFIG_AMEBA_GPIO),)
 CFLAGS += 
${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)arm$(DELIM)src$(DELIM)common$(DELIM)ameba
 endif
 
+ifeq ($(CONFIG_AMEBA_GPIO),y)
+CSRCS += rtl8730e_gpio.c
+endif
+
 include $(TOPDIR)/boards/Board.mk
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_bringup.c 
b/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_bringup.c
index f31d68db987..bcfa303dcba 100644
--- a/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_bringup.c
+++ b/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_bringup.c
@@ -242,6 +242,15 @@ int rtl8730e_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_AMEBA_GPIO
+  ret = rtl8730e_gpio_initialize();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to initialize GPIO: %d\n", ret);
+    }
+#endif
+
   UNUSED(ret);
   return OK;
 }
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h 
b/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h
index 879fcf96704..ee06613d01f 100644
--- a/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h
+++ b/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h
@@ -57,5 +57,9 @@
 int rtl8730e_bringup(void);
 #endif
 
+#ifdef CONFIG_AMEBA_GPIO
+int rtl8730e_gpio_initialize(void);
+#endif
+
 #endif /* __ASSEMBLY__ */
 #endif /* __BOARDS_ARM_RTL8730E_RTL8730E_EVB_SRC_RTL8730E_EVB_H */
diff --git a/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h 
b/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_gpio.c
similarity index 52%
copy from boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h
copy to boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_gpio.c
index 879fcf96704..9dcfa6b2266 100644
--- a/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h
+++ b/boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_gpio.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_evb.h
+ * boards/arm/rtl8730e/rtl8730e_evb/src/rtl8730e_gpio.c
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -20,42 +20,86 @@
  *
  ****************************************************************************/
 
-#ifndef __BOARDS_ARM_RTL8730E_RTL8730E_EVB_SRC_RTL8730E_EVB_H
-#define __BOARDS_ARM_RTL8730E_RTL8730E_EVB_SRC_RTL8730E_EVB_H
-
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
 
-#include <stdint.h>
+#include <sys/param.h>
+#include <syslog.h>
+
+#include <nuttx/ioexpander/gpio.h>
+
+#include "ameba_gpio.h"
+#include "rtl8730e_evb.h"
+
+#ifdef CONFIG_AMEBA_GPIO
 
 /****************************************************************************
- * Public Types
+ * Private Types
  ****************************************************************************/
 
+struct rtl8730e_gpio_s
+{
+  uint8_t pin;                  /* AMEBA_PA()/AMEBA_PB() pin encoding */
+  enum gpio_pintype_e pintype;  /* Input, output or interrupt */
+};
+
 /****************************************************************************
- * Public Data
+ * Private Data
  ****************************************************************************/
 
-#ifndef __ASSEMBLY__
+static const struct rtl8730e_gpio_s g_gpio_pins[] =
+{
+  { AMEBA_PB(19), GPIO_OUTPUT_PIN    },  /* /dev/gpio0: output    */
+  { AMEBA_PB(20), GPIO_INPUT_PIN     },  /* /dev/gpio1: input     */
+  { AMEBA_PB(11), GPIO_INTERRUPT_PIN },  /* /dev/gpio2: interrupt */
+};
 
 /****************************************************************************
- * Public Functions Definitions
+ * Public Functions
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rtl8730e_bringup
+ * Name: rtl8730e_gpio_initialize
  *
  * Description:
- *   Bring up board features
+ *   Register the board's GPIO pins with the NuttX GPIO upper half.
  *
  ****************************************************************************/
 
-#if defined(CONFIG_BOARDCTL) || defined(CONFIG_BOARD_LATE_INITIALIZE)
-int rtl8730e_bringup(void);
-#endif
+int rtl8730e_gpio_initialize(void)
+{
+  int ret;
+  size_t i;
+
+  /* Initialise the ROM GPIO port-base lookup table.  lib_rom.a places
+   * GPIO_PORTx in .sramdram.only.data which NuttX's linker script does not
+   * copy, so the array is zero at boot.  Write the three port bases before
+   * any ROM GPIO function is called.
+   */
+
+  extern void *GPIO_PORTx[3];
+
+  GPIO_PORTx[0] = (void *)0x4200d000u;  /* GPIOA */
+  GPIO_PORTx[1] = (void *)0x4200d400u;  /* GPIOB */
+  GPIO_PORTx[2] = (void *)0x4200d800u;  /* GPIOC */
+
+  for (i = 0; i < nitems(g_gpio_pins); i++)
+    {
+      ret = ameba_gpio_register(i, g_gpio_pins[i].pin,
+                                g_gpio_pins[i].pintype);
+      if (ret < 0)
+        {
+          syslog(LOG_ERR,
+                 "ERROR: ameba_gpio_register(/dev/gpio%zu) failed: %d\n",
+                 i, ret);
+          return ret;
+        }
+    }
+
+  return OK;
+}
 
-#endif /* __ASSEMBLY__ */
-#endif /* __BOARDS_ARM_RTL8730E_RTL8730E_EVB_SRC_RTL8730E_EVB_H */
+#endif /* CONFIG_AMEBA_GPIO */
diff --git a/tools/nxstyle.c b/tools/nxstyle.c
index ea08034c8a6..4d0fa00b33b 100644
--- a/tools/nxstyle.c
+++ b/tools/nxstyle.c
@@ -301,6 +301,7 @@ static const char *g_white_prefix[] =
   "PAD_",
   "PLL_",             /* PLL_ClkGet — amebadplus SPI ip_clk query */
   "Pinmux_",
+  "_Pinmux_",           /* _Pinmux_Config — ROM symbol for RTL8730E pad mux */
   "RCC_",
   "RTC_",             /* RTC_InitTypeDef, RTC_Enable, RTC_SetTime, etc. */
   "RTCIO_",

Reply via email to