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

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


The following commit(s) were added to refs/heads/master by this push:
     new 9a2569882e fix bug in gd32f4xx_serial.c, add romfsimg.h, 
gd32f4xx_reset and improve gd32f4xx_gpio.c for f470z board, add board 
decription for f470
9a2569882e is described below

commit 9a2569882e9ac7b4bcd2dfa219eb55935ba0c168
Author: GD32-MCU <jie...@gigadevice.com>
AuthorDate: Tue Dec 12 19:54:17 2023 +0800

    fix bug in gd32f4xx_serial.c, add romfsimg.h, gd32f4xx_reset and improve 
gd32f4xx_gpio.c for f470z board, add board decription for f470
    
    add gd32f470 picture
---
 .../boards/gd32f470zk-eval/gd32f470z_eval.png      | Bin 0 -> 178918 bytes
 .../arm/gd32f4/boards/gd32f470zk-eval/index.rst    |  11 ++
 Documentation/platforms/arm/gd32f4/index.rst       |  53 ++++++++++
 arch/arm/src/gd32f4/gd32f4xx_serial.c              |  14 +--
 boards/arm/gd32f4/gd32f470zk-eval/include/board.h  |   2 +-
 .../gd32f4/gd32f470zk-eval/include/nsh_romfsimg.h  | 111 ++++++++++++++++++++
 .../gd32f4/gd32f470zk-eval/scripts/kernel-space.ld |   3 +-
 .../arm/gd32f4/gd32f470zk-eval/scripts/ld.script   |   3 +-
 .../gd32f4/gd32f470zk-eval/scripts/user-space.ld   |   3 +-
 boards/arm/gd32f4/gd32f470zk-eval/src/Makefile     |   4 +
 .../arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_gpio.c | 115 +++++++++++++++++++--
 .../gd32f4/gd32f470zk-eval/src/gd32f4xx_reset.c    |  62 +++++++++++
 12 files changed, 358 insertions(+), 23 deletions(-)

diff --git 
a/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/gd32f470z_eval.png 
b/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/gd32f470z_eval.png
new file mode 100755
index 0000000000..b39f7598e7
Binary files /dev/null and 
b/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/gd32f470z_eval.png 
differ
diff --git 
a/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/index.rst 
b/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/index.rst
index 661ee86359..ededb89ac3 100644
--- a/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/index.rst
+++ b/Documentation/platforms/arm/gd32f4/boards/gd32f470zk-eval/index.rst
@@ -2,3 +2,14 @@
 gd32f470zk-eval
 ===============
 
+The GD32F470Z-EVAL board is a hardware platform that enables prototyping
+on GD32F470ZK Cortex-M4F Stretch Performance MCU.
+
+The GD32F470ZK features a single-core ARM Cortex-M4F MCU which can run up
+to 240 MHz with flash accesses zero wait states, 3072kiB of Flash, 256kiB
+of SRAM and 114 GPIOs.
+
+.. figure:: gd32f470z_eval.png
+    :align: center
+    :alt: gd32f470z_eval
+
diff --git a/Documentation/platforms/arm/gd32f4/index.rst 
b/Documentation/platforms/arm/gd32f4/index.rst
index 0363bd8a6f..e3215a67c8 100644
--- a/Documentation/platforms/arm/gd32f4/index.rst
+++ b/Documentation/platforms/arm/gd32f4/index.rst
@@ -2,6 +2,59 @@
 GD32F4
 ======
 
+The devices of GD32F4xx series are 32-bit general-purpose microcontrollers
+based on the Cortex-M4 processor. The Cortex-M4 processor includes three
+AHB buses known as I-Code, D-Code and System buses. All memory accesses of
+the Cortex-M4 processor are executed on the three buses according to the
+different purposes and the target memory spaces. The memory organization
+uses a Harvard architecture, pre-defined memory map and up to 4 GB of
+memory space, making the system flexible and extendable.
+
+Supported MCUs
+==============
+
+TODO
+
+Peripheral Support
+==================
+
+The following list indicates peripherals now supported
+in NuttX:
+
+==========  =======  =====
+Peripheral  Support  Notes
+==========  =======  =====
+SYSCFG      Yes
+FMC         Yes
+PMU         yes
+RCU         Yes      
+GPIO        Yes
+DMA         Yes
+IPA         no
+EXTI        Yes
+SPI         Yes
+TLI         no
+I2C         Yes
+USART       Yes
+I2S         no
+SDIO        yes
+ENET        Yes
+==========  =======  =====
+
+Memory
+------
+
+- CONFIG_RAM_SIZE - Describes the installed DRAM (SRAM in this case)
+
+- CONFIG_RAM_START - The start address of installed DRAM
+
+- CONFIG_GD32_TCMEXCLUDE - Exclude TCM SRAM from the HEAP
+
+- CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt
+  stack. If defined, this symbol is the size of the interrupt
+  stack in bytes.  If not defined, the user task stacks will be
+  used during interrupt handling.
+
 Supported Boards
 ================
 
diff --git a/arch/arm/src/gd32f4/gd32f4xx_serial.c 
b/arch/arm/src/gd32f4/gd32f4xx_serial.c
index a5ad8a5cb7..b401ffc729 100644
--- a/arch/arm/src/gd32f4/gd32f4xx_serial.c
+++ b/arch/arm/src/gd32f4/gd32f4xx_serial.c
@@ -118,7 +118,7 @@ struct up_dev_s
   bool            oflow;         /* output flow control (CTS) enabled */
 #  endif
 
-  uint16_t        oversamp       /* USART oversample mode */
+  uint16_t        oversamp;      /* USART oversample mode */
   uintptr_t       usartbase;     /* Base address of UART registers */
   uint32_t        baud;          /* Configured baud */
   uint32_t        clock;         /* Frequency of the UART */
@@ -1214,14 +1214,6 @@ static void gd32_usart_configure(struct uart_dev_s *dev)
   uint32_t fradiv;
   uint32_t regval;
 
-  /* Reset USART */
-
-  gd32_usart_reset(priv->usartbase);
-
-  /* Enable USART clock */
-
-  gd32_usart_clock_enable(priv->usartbase);
-
   /* Configure the USART oversample mode. */
 
   regval = up_serialin(priv, GD32_USART_CTL0_OFFSET);
@@ -1335,6 +1327,10 @@ static int up_setup(struct uart_dev_s *dev)
 #ifndef CONFIG_SUPPRESS_UART_CONFIG
   uint32_t regval;
 
+  /* Enable USART clock */
+
+  gd32_usart_clock_enable(priv->usartbase);
+
   /* Configure pins for USART use */
 
   gd32_gpio_config(priv->tx_gpio);
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/include/board.h 
b/boards/arm/gd32f4/gd32f470zk-eval/include/board.h
index 023325cdf1..3b9d556b63 100644
--- a/boards/arm/gd32f4/gd32f470zk-eval/include/board.h
+++ b/boards/arm/gd32f4/gd32f470zk-eval/include/board.h
@@ -134,7 +134,7 @@
  */
 
 #define GD32_PLL_PLLPSC            RCU_PLL_PLLPSC(25)
-#define GD32_PLL_PLLN              RCU_PLL_PLLN(336)
+#define GD32_PLL_PLLN              RCU_PLL_PLLN(480)
 #define GD32_PLL_PLLP              RCU_PLL_PLLP(2)
 #define GD32_PLL_PLLQ              RCU_PLL_PLLQ(7)
 
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/include/nsh_romfsimg.h 
b/boards/arm/gd32f4/gd32f470zk-eval/include/nsh_romfsimg.h
new file mode 100644
index 0000000000..080de1625b
--- /dev/null
+++ b/boards/arm/gd32f4/gd32f470zk-eval/include/nsh_romfsimg.h
@@ -0,0 +1,111 @@
+/***************************************************************************
+ * boards/arm/gd32f4/gd32f470zk-eval/include/nsh_romfsimg.h
+ *
+ * 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.
+ *
+ ***************************************************************************/
+
+const unsigned char romfs_img[] =
+{
+  0x2d, 0x72, 0x6f, 0x6d, 0x31, 0x66, 0x73, 0x2d, 0x00, 0x00, 0x01, 0x50,
+  0x9f, 0x13, 0x82, 0x87, 0x4e, 0x53, 0x48, 0x49, 0x6e, 0x69, 0x74, 0x56,
+  0x6f, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49,
+  0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xff, 0x97,
+  0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20,
+  0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0x80, 0x2e, 0x2e, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+  0x68, 0x2d, 0x96, 0x03, 0x69, 0x6e, 0x69, 0x74, 0x2e, 0x64, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0,
+  0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xff, 0x00,
+  0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x6e, 0x8d, 0x9c, 0xab, 0x58, 0x72, 0x63, 0x53, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x23, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x52,
+  0x41, 0x4d, 0x44, 0x49, 0x53, 0x4b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d,
+  0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x74, 0x20, 0x61, 0x74, 0x20, 0x2f,
+  0x74, 0x6d, 0x70, 0x0a, 0x0a, 0x6d, 0x6b, 0x72, 0x64, 0x20, 0x2d, 0x6d,
+  0x20, 0x32, 0x20, 0x2d, 0x73, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, 0x30,
+  0x32, 0x34, 0x0a, 0x6d, 0x6b, 0x66, 0x61, 0x74, 0x66, 0x73, 0x20, 0x2f,
+  0x64, 0x65, 0x76, 0x2f, 0x72, 0x61, 0x6d, 0x32, 0x0a, 0x6d, 0x6f, 0x75,
+  0x6e, 0x74, 0x20, 0x2d, 0x74, 0x20, 0x76, 0x66, 0x61, 0x74, 0x20, 0x2f,
+  0x64, 0x65, 0x76, 0x2f, 0x72, 0x61, 0x6d, 0x32, 0x20, 0x2f, 0x74, 0x6d,
+  0x70, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
+  0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0xe0, 0x2e, 0x2e, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00
+};
+
+const unsigned int romfs_img_len = 1024;
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/scripts/kernel-space.ld 
b/boards/arm/gd32f4/gd32f470zk-eval/scripts/kernel-space.ld
index 8c9933a865..8377a8e028 100644
--- a/boards/arm/gd32f4/gd32f470zk-eval/scripts/kernel-space.ld
+++ b/boards/arm/gd32f4/gd32f470zk-eval/scripts/kernel-space.ld
@@ -45,7 +45,8 @@ SECTIONS
 
     .init_section : {
         _sinit = ABSOLUTE(.);
-        *(.init_array .init_array.*)
+        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
+        KEEP(*(.init_array .ctors))
         _einit = ABSOLUTE(.);
     } > kflash
 
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/scripts/ld.script 
b/boards/arm/gd32f4/gd32f470zk-eval/scripts/ld.script
index 158e8ef82c..5061f61d2b 100644
--- a/boards/arm/gd32f4/gd32f470zk-eval/scripts/ld.script
+++ b/boards/arm/gd32f4/gd32f470zk-eval/scripts/ld.script
@@ -61,7 +61,8 @@ SECTIONS
 
     .init_section : ALIGN(4) {
         _sinit = ABSOLUTE(.);
-        *(.init_array .init_array.*)
+        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
+        KEEP(*(.init_array .ctors))
         _einit = ABSOLUTE(.);
     } > flash
 
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/scripts/user-space.ld 
b/boards/arm/gd32f4/gd32f470zk-eval/scripts/user-space.ld
index 0eea6e3323..5005e08f18 100644
--- a/boards/arm/gd32f4/gd32f470zk-eval/scripts/user-space.ld
+++ b/boards/arm/gd32f4/gd32f470zk-eval/scripts/user-space.ld
@@ -59,7 +59,8 @@ SECTIONS
 
     .init_section : {
         _sinit = ABSOLUTE(.);
-        *(.init_array .init_array.*)
+        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
+        KEEP(*(.init_array .ctors))
         _einit = ABSOLUTE(.);
     } > uflash
 
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/src/Makefile 
b/boards/arm/gd32f4/gd32f470zk-eval/src/Makefile
index 0d28f25545..1ff2508870 100644
--- a/boards/arm/gd32f4/gd32f470zk-eval/src/Makefile
+++ b/boards/arm/gd32f4/gd32f470zk-eval/src/Makefile
@@ -61,4 +61,8 @@ ifeq ($(CONFIG_MTD_AT24XX), y)
 CSRCS += gd32f4xx_at24.c
 endif
 
+ifeq ($(CONFIG_BOARDCTL_RESET), y)
+CSRCS += gd32f4xx_reset.c
+endif
+
 include $(TOPDIR)/boards/Board.mk
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_gpio.c 
b/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_gpio.c
index 25430c628d..0591148ba5 100644
--- a/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_gpio.c
+++ b/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_gpio.c
@@ -48,6 +48,7 @@
 struct gd32gpio_dev_s
 {
   struct gpio_dev_s gpio;
+  uint32_t pinconfig;
   uint8_t id;
 };
 
@@ -163,12 +164,102 @@ static struct gd32gpint_dev_s g_gpint[BOARD_NGPIOINT];
 static int gpio_setpintype(struct gpio_dev_s *dev,
                            enum gpio_pintype_e gpio_pintype)
 {
+  int ret = OK;
+  uint32_t pinconfig;
+  const struct gpio_operations_s *gpio_ops;
   struct gd32gpint_dev_s *gd32gpint = (struct gd32gpint_dev_s *)dev;
 
-  UNUSED(gd32gpint);
-  UNUSED(gpio_pintype);
+  DEBUGASSERT(gd32gpint != NULL);
+  gpioinfo("Setpintype...\n");
 
-  gpioinfo("setpintype is not supported. \n");
+  /* Check if the new pintype is actually different from the old pintype */
+
+  if (gd32gpint->gd32gpio.gpio.gp_pintype == gpio_pintype)
+    {
+      /* Pintype has not changed. We're done already. */
+
+      return ret;
+    }
+
+  if (gd32gpint->gd32gpio.gpio.gp_pintype >= GPIO_NPINTYPES)
+    {
+      gpioerr("pintype error\n");
+      return -1;
+    }
+
+  pinconfig = (gd32gpint->gd32gpio.pinconfig &
+              (GPIO_CFG_PIN_MASK | GPIO_CFG_PORT_MASK));
+
+  switch (gpio_pintype)
+    {
+    case GPIO_INPUT_PIN:
+      gd32_gpio_config(GPIO_CFG_MODE_INPUT | GPIO_CFG_PUPD_NONE |
+                       pinconfig);
+      gpio_ops = &gpin_ops;
+      break;
+    case GPIO_INPUT_PIN_PULLUP:
+      gd32_gpio_config(GPIO_CFG_MODE_INPUT | GPIO_CFG_PUPD_PULLUP |
+                       pinconfig);
+      gpio_ops = &gpin_ops;
+      break;
+    case GPIO_INPUT_PIN_PULLDOWN:
+      gd32_gpio_config(GPIO_CFG_MODE_INPUT | GPIO_CFG_PUPD_PULLDOWN |
+                       pinconfig);
+      gpio_ops = &gpin_ops;
+      break;
+    case GPIO_OUTPUT_PIN:
+      gd32_gpio_config(GPIO_CFG_MODE_OUTPUT | GPIO_CFG_PP |
+                      GPIO_CFG_SPEED_50MHZ | pinconfig);
+      gpio_ops = &gpout_ops;
+      break;
+    case GPIO_OUTPUT_PIN_OPENDRAIN:
+      gd32_gpio_config(GPIO_CFG_MODE_OUTPUT | GPIO_CFG_OD |
+                      GPIO_CFG_SPEED_50MHZ | pinconfig);
+      gpio_ops = &gpout_ops;
+      break;
+    case GPIO_INTERRUPT_PIN:
+    case GPIO_INTERRUPT_RISING_PIN:
+    case GPIO_INTERRUPT_FALLING_PIN:
+    case GPIO_INTERRUPT_BOTH_PIN:
+      gd32_gpio_config(GPIO_CFG_MODE_INPUT | GPIO_PUPD_NONE |
+                       pinconfig);
+      gpio_ops = &gpint_ops;
+      break;
+    default:
+
+          /* Not support! */
+
+          return -EINVAL;
+      break;
+    }
+
+  /* If the pin previously had an interrupt pintype... */
+
+  if ((gd32gpint->gd32gpio.gpio.gp_pintype >= GPIO_INTERRUPT_PIN) &&
+      (gd32gpint->gd32gpio.gpio.gp_pintype < GPIO_NPINTYPES))
+    {
+      /* ...disable the interrupt... */
+
+      ret = gpint_enable(dev, false);
+      if (ret < 0)
+        {
+          return ret;
+        }
+
+      /* ...and detach the old callback. */
+
+      ret = gpint_attach(dev, NULL);
+      if (ret < 0)
+        {
+          return ret;
+        }
+    }
+
+  /* Change the pintype and set of operations */
+
+  gd32gpint->gd32gpio.gpio.gp_pintype = gpio_pintype;
+  gd32gpint->gd32gpio.gpio.gp_ops = gpio_ops;
+  gd32gpint->gd32gpio.pinconfig = pinconfig;
 
   return 0;
 }
@@ -179,10 +270,10 @@ static int gpin_read(struct gpio_dev_s *dev, bool *value)
   struct gd32gpio_dev_s *gd32gpio = (struct gd32gpio_dev_s *)dev;
 
   DEBUGASSERT(gd32gpio != NULL && value != NULL);
-  DEBUGASSERT(gd32gpio->id < BOARD_NGPIOIN);
   gpioinfo("Reading...\n");
 
-  *value = gd32_gpio_read(g_gpioinputs[gd32gpio->id]);
+  *value = gd32_gpio_read(gd32gpio->pinconfig);
+
   return OK;
 }
 #endif
@@ -193,10 +284,10 @@ static int gpout_read(struct gpio_dev_s *dev, bool *value)
   struct gd32gpio_dev_s *gd32gpio = (struct gd32gpio_dev_s *)dev;
 
   DEBUGASSERT(gd32gpio != NULL && value != NULL);
-  DEBUGASSERT(gd32gpio->id < BOARD_NGPIOOUT);
   gpioinfo("Reading...\n");
 
-  *value = gd32_gpio_read(g_gpiooutputs[gd32gpio->id]);
+  *value = gd32_gpio_read(gd32gpio->pinconfig);
+
   return OK;
 }
 
@@ -205,10 +296,10 @@ static int gpout_write(struct gpio_dev_s *dev, bool value)
   struct gd32gpio_dev_s *gd32gpio = (struct gd32gpio_dev_s *)dev;
 
   DEBUGASSERT(gd32gpio != NULL);
-  DEBUGASSERT(gd32gpio->id < BOARD_NGPIOOUT);
   gpioinfo("Writing %d\n", (int)value);
 
-  gd32_gpio_write(g_gpiooutputs[gd32gpio->id], value);
+  gd32_gpio_write(gd32gpio->pinconfig, value);
+
   return OK;
 }
 #endif
@@ -234,7 +325,8 @@ static int gpint_read(struct gpio_dev_s *dev, bool *value)
   DEBUGASSERT(gd32gpint->gd32gpio.id < BOARD_NGPIOINT);
   gpioinfo("Reading int pin...\n");
 
-  *value = gd32_gpio_read(g_gpiointinputs[gd32gpint->gd32gpio.id]);
+  *value = gd32_gpio_read(gd32gpint->gd32gpio.pinconfig);
+
   return OK;
 }
 
@@ -342,6 +434,7 @@ int gd32_gpio_initialize(void)
 
       g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN;
       g_gpin[i].gpio.gp_ops     = &gpin_ops;
+      g_gpin[i].pinconfig       = g_gpioinputs[i];
       g_gpin[i].id              = i;
 
       gpio_pin_register(&g_gpin[i].gpio, pincount);
@@ -361,6 +454,7 @@ int gd32_gpio_initialize(void)
 
       g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN;
       g_gpout[i].gpio.gp_ops     = &gpout_ops;
+      g_gpout[i].pinconfig       = g_gpiooutputs[i];
       g_gpout[i].id              = i;
 
       gpio_pin_register(&g_gpout[i].gpio, pincount);
@@ -381,6 +475,7 @@ int gd32_gpio_initialize(void)
 
       g_gpint[i].gd32gpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN;
       g_gpint[i].gd32gpio.gpio.gp_ops     = &gpint_ops;
+      g_gpint[i].gd32gpio.pinconfig       = g_gpiointinputs[i];
       g_gpint[i].gd32gpio.id              = i;
       (void)gpio_pin_register(&g_gpint[i].gd32gpio.gpio, pincount);
 
diff --git a/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_reset.c 
b/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_reset.c
new file mode 100644
index 0000000000..2804f4dee4
--- /dev/null
+++ b/boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_reset.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * boards/arm/gd32f4/gd32f470zk-eval/src/gd32f4xx_reset.c
+ *
+ * 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 <nuttx/arch.h>
+#include <nuttx/board.h>
+
+#ifdef CONFIG_BOARDCTL_RESET
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_reset
+ *
+ * Description:
+ *   Reset board.  Support for this function is required by board-level
+ *   logic if CONFIG_BOARDCTL_RESET is selected.
+ *
+ * Input Parameters:
+ *   status - Status information provided with the reset event.  This
+ *            meaning of this status information is board-specific.  If not
+ *            used by a board, the value zero may be provided in calls to
+ *            board_reset().
+ *
+ * Returned Value:
+ *   If this function returns, then it was not possible to power-off the
+ *   board due to some constraints.  The return value int this case is a
+ *   board-specific reason for the failure to shutdown.
+ *
+ ****************************************************************************/
+
+int board_reset(int status)
+{
+  up_systemreset();
+  return 0;
+}
+
+#endif /* CONFIG_BOARDCTL_RESET */

Reply via email to