From 99e92db111b9839b951afcfc9ef726e43940b5b5 Mon Sep 17 00:00:00 2001 From: Yunkun Huang Date: Fri, 25 Jul 2025 18:10:07 +0800 Subject: [PATCH 1/6] add bsp support for gd32e230-lckfb --- .github/ALL_BSP_COMPILE.json | 1 + .gitignore | 3 + bsp/gd32/arm/README.md | 2 + .../.ci/attachconfig/ci.attachconfig.yml | 20 + bsp/gd32/arm/gd32e230-lckfb/.config | 1432 +++++++++++++++++ bsp/gd32/arm/gd32e230-lckfb/Kconfig | 12 + bsp/gd32/arm/gd32e230-lckfb/README.md | 105 ++ bsp/gd32/arm/gd32e230-lckfb/SConscript | 15 + bsp/gd32/arm/gd32e230-lckfb/SConstruct | 74 + .../gd32e230-lckfb/applications/SConscript | 15 + .../arm/gd32e230-lckfb/applications/main.c | 99 ++ bsp/gd32/arm/gd32e230-lckfb/board/Kconfig | 260 +++ bsp/gd32/arm/gd32e230-lckfb/board/SConscript | 17 + bsp/gd32/arm/gd32e230-lckfb/board/board.c | 79 + bsp/gd32/arm/gd32e230-lckfb/board/board.h | 34 + .../gd32e230-lckfb/board/gd32e23x_libopt.h | 58 + .../board/linker_scripts/link.icf | 51 + .../board/linker_scripts/link.ld | 139 ++ .../board/linker_scripts/link.sct | 39 + bsp/gd32/arm/gd32e230-lckfb/figures/board.png | Bin 0 -> 123140 bytes bsp/gd32/arm/gd32e230-lckfb/rtconfig.h | 421 +++++ bsp/gd32/arm/gd32e230-lckfb/rtconfig.py | 148 ++ bsp/gd32/arm/libraries/Kconfig | 5 + bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c | 55 +- bsp/gd32/arm/libraries/gd32_drivers/drv_dma.h | 24 + .../arm/libraries/gd32_drivers/drv_gpio.c | 89 +- .../arm/libraries/gd32_drivers/drv_gpio.h | 4 +- bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c | 78 + bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c | 21 +- bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h | 2 +- .../arm/libraries/gd32_drivers/drv_usart.c | 10 +- .../arm/libraries/gd32_drivers/drv_usart.h | 4 +- .../arm/libraries/gd32_drivers/drv_usart_v2.c | 214 ++- .../arm/libraries/gd32_drivers/drv_usart_v2.h | 4 +- 34 files changed, 3509 insertions(+), 25 deletions(-) create mode 100644 bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml create mode 100644 bsp/gd32/arm/gd32e230-lckfb/.config create mode 100644 bsp/gd32/arm/gd32e230-lckfb/Kconfig create mode 100644 bsp/gd32/arm/gd32e230-lckfb/README.md create mode 100644 bsp/gd32/arm/gd32e230-lckfb/SConscript create mode 100644 bsp/gd32/arm/gd32e230-lckfb/SConstruct create mode 100644 bsp/gd32/arm/gd32e230-lckfb/applications/SConscript create mode 100644 bsp/gd32/arm/gd32e230-lckfb/applications/main.c create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/Kconfig create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/SConscript create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/board.c create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/board.h create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.icf create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.ld create mode 100644 bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.sct create mode 100644 bsp/gd32/arm/gd32e230-lckfb/figures/board.png create mode 100644 bsp/gd32/arm/gd32e230-lckfb/rtconfig.h create mode 100644 bsp/gd32/arm/gd32e230-lckfb/rtconfig.py diff --git a/.github/ALL_BSP_COMPILE.json b/.github/ALL_BSP_COMPILE.json index 71ed62b145d..0370c089a27 100644 --- a/.github/ALL_BSP_COMPILE.json +++ b/.github/ALL_BSP_COMPILE.json @@ -303,6 +303,7 @@ "gd32/arm/gd32h759i-start", "gd32/arm/gd32e503v-eval", "gd32/arm/gd32527I-eval", + "gd32/arm/gd32e230-lckfb", "n32/n32g43xcl-stb", "n32/n32g45xcl-stb", "n32/n32g45xml-stb", diff --git a/.gitignore b/.gitignore index df7cd55d871..9da95424d23 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,6 @@ vdso.lds # stm32cubemx **/CubeMX_Config/Drivers/ **/CubeMX_Config/MDK-ARM/ + +# mac +.DS_Store diff --git a/bsp/gd32/arm/README.md b/bsp/gd32/arm/README.md index 898f92c459f..0645f5082e7 100644 --- a/bsp/gd32/arm/README.md +++ b/bsp/gd32/arm/README.md @@ -24,6 +24,8 @@ GD32 ARM 系列 BSP 目前支持情况如下表所示: | [gd32470z-lckfb](gd32470z-lckfb) | 立创梁山派 GD32F470ZGT6 开发板 | | **E5 系列** | | | [gd32e503v-eval](gd32e503v-eval) | 兆易创新 官方 GD32E503V-EVAL 开发板 | +| **E23 系列** | | +| [gd32e230-lckfb](gd32e230-lckfb) | 立创·GD32E230C8T6开发板 | 可以通过阅读相应 BSP 下的 README 来快速上手,如果想要使用 BSP 更多功能可参考 docs 文件夹下提供的说明文档,如下表所示: diff --git a/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml b/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 00000000000..72ccba25027 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,20 @@ +kernel.tick: + kconfig: + - CONFIG_RT_TICK_PER_SECOND=100 +kernel.console_name: + kconfig: + - CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +component.dev_drv.ipc.sys_workqueue: + kconfig: + - CONFIG_RT_USING_SYSTEM_WORKQUEUE=y +hw_drv_onchip.uart0: + kconfig: + - CONFIG_BSP_USING_UART0=y +hw_drv_onchip.adc0: + kconfig: + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC0=y +hw_drv_onchip.spi0: + kconfig: + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI0=y \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/.config b/bsp/gd32/arm/gd32e230-lckfb/.config new file mode 100644 index 00000000000..6a31342b70d --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/.config @@ -0,0 +1,1432 @@ + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=100 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +CONFIG_RT_VER_NUM=0x50201 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M23=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=1024 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +# CONFIG_RT_USING_MSH is not set + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_USING_SERIAL_V1 is not set +CONFIG_RT_USING_SERIAL_V2=y +# CONFIG_RT_SERIAL_BUF_STRATEGY_DROP is not set +CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set +# CONFIG_PKG_USING_ESP_HOSTED is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# CONFIG_PKG_USING_PNET is not set +# CONFIG_PKG_USING_OPENER is not set +# CONFIG_PKG_USING_FREEMQTT is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# CONFIG_PKG_USING_HPATCHLITE is not set +# CONFIG_PKG_USING_THREAD_METRIC is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_RMP is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# CONFIG_PKG_USING_HEARTBEAT is not set +# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_MM32 is not set + +# +# WCH HAL & SDK Drivers +# +# CONFIG_PKG_USING_CH32V20x_SDK is not set +# CONFIG_PKG_USING_CH32V307_SDK is not set +# end of WCH HAL & SDK Drivers + +# +# AT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set +# end of AT32 HAL & SDK Drivers + +# +# HC32 DDL Drivers +# +# CONFIG_PKG_USING_HC32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F3_SERIES_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set +# end of HC32 DDL Drivers + +# +# NXP HAL & SDK Drivers +# +# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set +# end of NXP HAL & SDK Drivers + +# +# NUVOTON Drivers +# +# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set +# end of NUVOTON Drivers + +# +# GD32 Drivers +# +CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER=y +CONFIG_PKG_GD32_ARM_CMSIS_DRIVER_PATH="/packages/peripherals/hal-sdk/gd32/gd32-arm-cmsis" +CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER_LATEST_VERSION=y +CONFIG_PKG_GD32_ARM_CMSIS_DRIVER_VER="latest" +CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER=y +CONFIG_PKG_GD32_ARM_SERIES_DRIVER_PATH="/packages/peripherals/hal-sdk/gd32/gd32-arm-series" +CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER_LATEST_VERSION=y +CONFIG_PKG_GD32_ARM_SERIES_DRIVER_VER="latest" +# end of GD32 Drivers +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_MAX31855 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# CONFIG_PKG_USING_P3T1755 is not set +# CONFIG_PKG_USING_QMI8658 is not set +# CONFIG_PKG_USING_ICM20948 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +# CONFIG_PKG_USING_GC9A01 is not set +# CONFIG_PKG_USING_IK485 is not set +# CONFIG_PKG_USING_SERVO is not set +# CONFIG_PKG_USING_SEAN_WS2812B is not set +# CONFIG_PKG_USING_IC74HC165 is not set +# CONFIG_PKG_USING_IST8310 is not set +# CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# CONFIG_PKG_USING_LLMCHAT is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LIBCRC is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# CONFIG_PKG_USING_DRMP is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_GD32=y +CONFIG_SOC_SERIES_GD32E23x=y + +# +# Hardware Drivers Config +# + +# +# SOC Series +# +CONFIG_SOC_GD32E230C8T6=y +# end of SOC Series + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_LED=y +CONFIG_BSP_LED_PIN=45 +# end of Onboard Peripheral Drivers + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART0=y +CONFIG_BSP_UART0_RX_USING_DMA=y +CONFIG_BSP_UART0_RX_BUFSIZE=64 +CONFIG_BSP_UART0_TX_BUFSIZE=0 +CONFIG_BSP_UART0_DMA_PING_BUFSIZE=32 +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_SPI is not set + +# +# I2C Configuration +# +# CONFIG_BSP_USING_HW_I2C is not set +# CONFIG_BSP_USING_I2C0 is not set +# CONFIG_BSP_USING_I2C1 is not set +# end of I2C Configuration + +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/gd32/arm/gd32e230-lckfb/Kconfig b/bsp/gd32/arm/gd32e230-lckfb/Kconfig new file mode 100644 index 00000000000..07edfefc341 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/gd32/arm/gd32e230-lckfb/README.md b/bsp/gd32/arm/gd32e230-lckfb/README.md new file mode 100644 index 00000000000..9c5164d67f0 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/README.md @@ -0,0 +1,105 @@ +# GD32E230立创开发板说明 + +## 简介 + +本文档是为 GD32E230立创开发板提供的板级支持包 (BSP) 说明。 + +该核心板以 GD32E230C8T6 作为主控制器,可通过板载的 USB 接口或 5V 引脚供电。核心板引出了所有 I/O 口,方便连接各种外设模块。 + +该开发板常用 **板载资源** 如下: + +- **主控芯片**:GD32E230C8T6 + - **内核**:ARM® Cortex®-M23 + - **主频**:72MHz + - **FLASH**:64KB + - **RAM**:8KB +- **常用外设** + - **LED**:1 个,用户 LED (PC13) + - **按键**:1 个,复位按键 + - **定时器**: + - 1 x 高级定时器 (TIMER0) + - 5 x 通用定时器 (TIMER2, TIMER14, TIMER15, TIMER16) + - 1 x 基本定时器 (TIMER5) + - **通信接口**: + - 2 x USART (USART0, USART1) + - 2 x SPI (SPI0, SPI1) + - 2 x I2C (I2C0, I2C1) + - **ADC**:1 x 12位 ADC (最多10个外部通道) +- **常用接口** USB 接口 +- **调试接口**:SWD (SWDIO / SWCLK) + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +| :--- | :---: | :--- | +| GPIO | 支持 | PAx, PBx... | +| UART | 支持 | USART0, USART1 | +| **扩展模块** | **支持情况** | **备注** | +| 暂无 | 暂不支持 | 暂不支持 | + +## 使用说明 + +使用说明分为如下两个章节: + +- **快速上手** + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果。 + +- **进阶使用** + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 支持 GCC 开发环境,下面介绍如何在GCC环境下编译下载。 + +#### 硬件连接 + +使用DAP-Link连接开发板与 PC。 + +#### 编译下载 + +``` shell +scons -j12 +``` + +``` shell +pyocd flash -t gd32e230c8t6 rtthread.bin +``` + +开发板板载USB转串口,没有调试器,也可以直接连接USB进行下载。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,板载的蓝色 LED (PC13) 将会闪烁。 + +连接开发板对应的串口到 PC,在终端工具里打开相应的串口(波特率:115200,数据位:8,停止位:1,无校验),复位设备后,可以看到 RT-Thread 的输出信息: + +``` shell + \ | / +- RT - Thread Operating System + / | \ 4.1.0 build Jul 23 2025 + 2006 - 2024 Copyright by rt-thread team + hello rt-thread +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 USART0 的功能,如果需使用更多外设功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 bsp 目录下打开 env 工具。 +2. 输入 `menuconfig` 命令配置工程,配置好之后保存退出。 +3. 输入 `pkgs --update` 命令更新软件包。 +4. 输入 `scons -j12` 编译。 + +## 注意事项 +1. GD32E230资源受限,虽然通过调整参数极限运行msh,但是意义不大,建议关闭。 +2. **GPIOA-13** 和 **GPIOA-14** 默认用于 SWD 调试下载功能,建议不要配置为其它功能,否则将可能导致无法正常下载和调试。 + +## 联系人信息 + +维护人: + +- [htynkn](https://github.com/htynkn), 邮箱: \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/SConscript b/bsp/gd32/arm/gd32e230-lckfb/SConscript new file mode 100644 index 00000000000..20f7689c53c --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/gd32/arm/gd32e230-lckfb/SConstruct b/bsp/gd32/arm/gd32e230-lckfb/SConstruct new file mode 100644 index 00000000000..9623c1041e8 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/SConstruct @@ -0,0 +1,74 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +def bsp_pkg_check(): + import subprocess + + check_paths = [ + os.path.join("packages", "gd32-arm-cmsis-latest"), + os.path.join("packages", "gd32-arm-series-latest") + ] + + need_update = not all(os.path.exists(p) for p in check_paths) + + if need_update: + print("\n===============================================================================") + print("Dependency packages missing, please running 'pkgs --update'...") + print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...") + print("===============================================================================") + exit(1) + +RegisterPreBuildingAction(bsp_pkg_check) + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') + +Export('env') +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'gd32_drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/gd32/arm/gd32e230-lckfb/applications/SConscript b/bsp/gd32/arm/gd32e230-lckfb/applications/SConscript new file mode 100644 index 00000000000..9bb9abae897 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/gd32/arm/gd32e230-lckfb/applications/main.c b/bsp/gd32/arm/gd32e230-lckfb/applications/main.c new file mode 100644 index 00000000000..358120c2f69 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/applications/main.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-07-28 Yunkun Huang Init Project + */ + +#include +#include +#include + + +#define LED_PIN BSP_LED_PIN + + +static void led_blink_thread_entry(void *parameter) +{ + rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); + + rt_kprintf("LED blink thread started.\n"); + + while (1) + { + rt_pin_write(LED_PIN, PIN_HIGH); + rt_thread_mdelay(500); + + rt_pin_write(LED_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} + +#define UART_DEVICE_NAME "uart0" + +static void uart_send_thread_entry(void *parameter) +{ + rt_device_t console_dev; + char msg[] = "hello rt-thread\r\n"; + + console_dev = rt_console_get_device(); + + if (!console_dev) + { + rt_kprintf("Failed to get console device.\n"); + return; + } + + rt_kprintf("UART send thread started. Will send message every 2 seconds.\n"); + + while (1) + { + rt_device_write(console_dev, 0, msg, (sizeof(msg) - 1)); + rt_thread_mdelay(2000); + } +} + + +int main(void) +{ + rt_thread_t led_tid = RT_NULL; + rt_thread_t uart_tid = RT_NULL; + + led_tid = rt_thread_create("led_blink", + led_blink_thread_entry, + RT_NULL, + 256, + 20, + 10); + + if (led_tid != RT_NULL) + { + rt_thread_startup(led_tid); + } + else + { + rt_kprintf("Failed to create led_blink thread.\n"); + } + + uart_tid = rt_thread_create("uart_send", + uart_send_thread_entry, + RT_NULL, + 512, + 21, + 10); + + if (uart_tid != RT_NULL) + { + rt_kprintf("uart_send thread created successfully. Starting it up...\n"); + rt_thread_startup(uart_tid); + } + else + { + rt_kprintf("!!! FAILED to create uart_send thread. Not enough memory?\n"); + } + + return 0; +} \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig b/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig new file mode 100644 index 00000000000..92b411e7e71 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig @@ -0,0 +1,260 @@ +# SPDX-License-Identifier: Apache-2.0 + +menu "Hardware Drivers Config" + +menu "SOC Series" + choice + prompt "Select GD32 SoC Series" + default SOC_SERIES_GD32E23x + + config SOC_SERIES_GD32E23x + bool "GD32E23x Series" + + endchoice + + if SOC_SERIES_GD32E23x + choice + prompt "Select GD32 SoC" + default SOC_GD32E230C8T6 + + config SOC_GD32E230C8T6 + bool "GD32E230C8T6" + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + + endchoice + endif +endmenu + + +menu "Onboard Peripheral Drivers" + menuconfig BSP_USING_LED + bool "Enable Onboard LED" + default y + if BSP_USING_LED + config BSP_LED_PIN + int "The pin number of the onboard LED" + default 45 # GET_PIN(C, 13) + endif + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + select RT_USING_SERIAL + default y + if BSP_USING_UART + config BSP_USING_UART0 + bool "Enable UART0 for Console" + default y + + config BSP_UART0_RX_USING_DMA + bool "Enable UART0 RX DMA" + depends on BSP_USING_UART0 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART0_TX_USING_DMA + bool "Enable UART0 TX DMA" + depends on BSP_USING_UART0 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART0_RX_BUFSIZE + int "Set UART0 RX buffer size" + range 64 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART0_TX_BUFSIZE + int "Set UART0 TX buffer size" + range 0 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART0_DMA_PING_BUFSIZE + int "Set UART0 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA + default 32 + + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART1_TX_USING_DMA + bool "Enable UART1 TX DMA" + depends on BSP_USING_UART1 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART1_RX_BUFSIZE + int "Set UART1 RX buffer size" + range 64 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART1_TX_BUFSIZE + int "Set UART1 TX buffer size" + range 0 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART1_DMA_PING_BUFSIZE + int "Set UART1 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA + default 32 + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI" + select RT_USING_SPI + default n + if BSP_USING_SPI + config BSP_USING_SPI0 + bool "Enable SPI0" + default n + + config BSP_SPI0_TX_USING_DMA + bool "Enable SPI0 TX DMA" + depends on BSP_USING_SPI0 + default n + + config BSP_SPI0_RX_USING_DMA + bool "Enable SPI0 RX DMA" + depends on BSP_USING_SPI0 + default n + + config BSP_USING_SPI1 + bool "Enable SPI1" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + default n + endif + + menu "I2C Configuration" + menuconfig BSP_USING_HW_I2C + bool "Enable Hardware I2C" + select RT_USING_I2C + default n + if BSP_USING_HW_I2C + config BSP_USING_I2C0 + bool "Enable I2C0" + default y + + config BSP_USING_I2C1 + bool "Enable I2C1" + default n + endif + menuconfig BSP_USING_I2C0 + bool "Enable I2C0 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C0 + config BSP_I2C0_SCL_PIN + int "i2c0 scl pin number" + range 1 216 + default 22 + config BSP_I2C0_SDA_PIN + int "I2C0 sda pin number" + range 1 216 + default 23 + endif + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 216 + default 24 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 216 + default 25 + endif + endmenu + + menuconfig BSP_USING_ADC + bool "Enable ADC" + select RT_USING_ADC + default n + if BSP_USING_ADC + config BSP_USING_ADC0 + bool "Enable ADC" + default y + endif + + menuconfig BSP_USING_TIM + bool "Enable Hardware Timer" + select RT_USING_HWTIMER + default n + if BSP_USING_TIM + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + + config BSP_USING_TIM3 + bool "Enable TIM3" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select RTC clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC using LSE (External Crystal)" + + config BSP_RTC_USING_LSI + bool "RTC using LSI (Internal RC)" + endchoice + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + # Source the upstream GD32 drivers Kconfig + source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + # Configuration for external modules connected to the board +endmenu + +endmenu diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/SConscript b/bsp/gd32/arm/gd32e230-lckfb/board/SConscript new file mode 100644 index 00000000000..98ad1b98d14 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/SConscript @@ -0,0 +1,17 @@ +import os +import rtconfig +from building import * + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +path = [cwd] + +CPPDEFINES = ['GD32E23X', 'GD32E23X_HD'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/board.c b/bsp/gd32/arm/gd32e230-lckfb/board/board.c new file mode 100644 index 00000000000..6a02b4eeb6f --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/board.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +#include +#include +#include "board.h" +#include "gd32e23x.h" + +#ifdef RT_USING_SERIAL +#if defined(RT_USING_SERIAL_V2) +#include "drv_usart_v2.h" +#else +#include "drv_usart.h" +#endif +#endif + +/** + * @brief This function is executed in case of error occurrence. + * @param None + * @retval None + */ +void Error_Handler(void) +{ + rt_kprintf("\nError_Handler triggered! System halted.\n"); + while (1) + { + } +} + +/** + * @brief This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/** + * @brief This function will initial GD32 board. + * @note This function is called from the RT-Thread startup code. + */ +void rt_hw_board_init(void) +{ +#ifdef VECT_TAB_RAM + SCB->VTOR = 0x20000000; +#else /* VECT_TAB_FLASH is the default */ + SCB->VTOR = 0x08000000; +#endif + + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + NVIC_SetPriority(SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); + +#ifdef RT_USING_HEAP + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif + +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/board.h b/bsp/gd32/arm/gd32e230-lckfb/board/board.h new file mode 100644 index 00000000000..f88bdc9540a --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/board.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + */ +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "gd32e23x.h" +#include "drv_gpio.h" + +#include "gd32e23x_exti.h" + + +#define GD32_SRAM_SIZE 8 + +#define GD32_SRAM_BEGIN (0x20000000) +#define GD32_SRAM_END (GD32_SRAM_BEGIN + GD32_SRAM_SIZE * 1024) + +#ifdef __ARMCC_VERSION +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else /* GCC */ +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END GD32_SRAM_END + +#endif \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h b/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h new file mode 100644 index 00000000000..c4bd1964b19 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h @@ -0,0 +1,58 @@ +/*! + \file gd32e23x_libopt.h + \brief library optional for gd32e23x + + \version 2025-02-10, V2.3.0, firmware for GD32E23x +*/ + +/* + Copyright (c) 2025, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32E23X_LIBOPT_H +#define GD32E23X_LIBOPT_H + +#include "gd32e23x_adc.h" +#include "gd32e23x_crc.h" +#include "gd32e23x_dbg.h" +#include "gd32e23x_dma.h" +#include "gd32e23x_exti.h" +#include "gd32e23x_fmc.h" +#include "gd32e23x_gpio.h" +#include "gd32e23x_syscfg.h" +#include "gd32e23x_i2c.h" +#include "gd32e23x_fwdgt.h" +#include "gd32e23x_pmu.h" +#include "gd32e23x_rcu.h" +#include "gd32e23x_rtc.h" +#include "gd32e23x_spi.h" +#include "gd32e23x_timer.h" +#include "gd32e23x_usart.h" +#include "gd32e23x_wwdgt.h" +#include "gd32e23x_misc.h" +#include "gd32e23x_cmp.h" + +#endif /* GD32E23X_LIBOPT_H */ diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.icf b/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.icf new file mode 100644 index 00000000000..81bcee4a5a1 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.icf @@ -0,0 +1,51 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +/* + * IMPORTANT: Please check your specific chip's datasheet for correct memory sizes. + * The following values are for a GD32E230 with 64KB Flash and 8KB SRAM. + */ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF; /* 64KB Flash */ +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; /* 8KB SRAM */ +/*-Sizes-*/ +/* + * The CSTACK is used for main function before scheduler start and for interrupt handlers. + * The HEAP is the C library heap, which is rarely used in RT-Thread. + * RT-Thread uses the remaining RAM for its own dynamic memory heap. + */ +define symbol __ICFEDIT_size_cstack__ = 0x400; /* 1024 bytes, a safer size */ +define symbol __ICFEDIT_size_heap__ = 0x100; /* 256 bytes, can be smaller */ +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +/* Remove the non-existent RAM1 region */ +/* define region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__]; */ + + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +/* Keep RT-Thread FinSH command symbols */ +keep { section FSymTab }; +keep { section VSymTab }; +keep { section .rti_fn* }; +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; + +/* Remove placement in the non-existent RAM1 region */ +/* place in RAM1_region { section .sram }; */ \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.ld b/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.ld new file mode 100644 index 00000000000..bbe40cb864e --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.ld @@ -0,0 +1,139 @@ +/* + * linker script for GD32E230x with GNU ld + * Adapted from GD32E50x version. + * Corrected by Gemini to fix oversized .bin file and subsequent linker errors. + */ + +MEMORY +{ + /* + * IMPORTANT: Please check your specific chip's datasheet for correct memory sizes. + * The following values are for a GD32E230 with 64KB Flash and 8KB SRAM. + */ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 64k /* MODIFIED: 64KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 8k /* MODIFIED: 8KB sram */ +} + +/* Program Entry, set to mark it as "used" and avoid gc */ +ENTRY(Reset_Handler) + +/* + * Define the size of the stack used by the system. + * This is for the main stack pointer (MSP), used before RT-Thread scheduler starts and in interrupts. + * Increased to 1KB for safety. + */ +_system_stack_size = 0x400; /* MODIFIED: 1024 bytes */ + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); + + . = ALIGN(4); + _etext = .; + } > CODE + + /* + * The .ARM.exidx section is needed for exception handling and stack unwinding. + * It should be placed in a loadable region like CODE. + */ + .ARM.exidx : + { + __exidx_start = .; + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + __exidx_end = .; + } > CODE + + /* + * Define the load address for the .data section. + * It should immediately follow the .ARM.exidx section in Flash. + */ + _sidata = __exidx_end; + + /* .data section which is used for initialized data */ + .data : AT (_sidata) + { + . = ALIGN(4); + _sdata = . ; + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + . = ALIGN(4); + _edata = . ; + } > DATA + + /* Main stack, located at the top of the RAM region */ + .stack (NOLOAD): + { + . = ALIGN(8); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(8); + _estack = .; + } > DATA + + /* .bss section which is used for uninitialized data */ + .bss : + { + . = ALIGN(4); + _sbss = .; + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + } > DATA + + /* Define __bss_end for C code to find the heap start. */ + __bss_end = _ebss; + + _end = .; + + /****************************************************************************** + * Corrected section to discard unwanted information from the final binary. * + ******************************************************************************/ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + + /* Discard all debugging and comment sections using the correct wildcard syntax */ + *(.comment) + *(.debug*) + *(.line) + *(.stab) + *(.stabstr) + *(.note.gnu.build-id) + *(.ARM.attributes) + } +} \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.sct b/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.sct new file mode 100644 index 00000000000..16bdcee3253 --- /dev/null +++ b/bsp/gd32/arm/gd32e230-lckfb/board/linker_scripts/link.sct @@ -0,0 +1,39 @@ +; ************************************************************* +; *** Scatter-Loading Description File for GD32E230 + RT-Thread +; *** Target: GD32E230C8T6 (64KB Flash, 8KB SRAM) +; *** This version is more structured and recommended. +; ************************************************************* + +#!armclang --cpu=cortex-m23 + +; Define stack and heap sizes +define symbol Stack_Size = 0x00000400; ; 1KB for Main Stack +define symbol Heap_Size = 0x00000100; ; 256B for C-library Heap + +; Max size of load region LR_IROM1 +LR_IROM1 0x08000000 0x00010000 { ; Load region: Flash, 64KB + + ; First execution region for exception vectors and startup code + ER_IROM1 0x08000000 0x00010000 { + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + + ; --- Special sections for RT-Thread --- + * (FSymTab) + * (VSymTab) + * (rti_fn*) + ; -------------------------------------- + } + + ; RAM region for RW, ZI, Stack, and Heap + RW_IRAM1 0x20000000 0x00002000 { ; RW region: SRAM, 8KB + ; C-library Stack, placed at the top of RAM, growing downwards + ARM_LIB_STACK STACK_TOP(0x20002000) EMPTY -Stack_Size { } + + .ANY (+RW +ZI) + + ; C-library Heap, placed after RW/ZI data + ARM_LIB_HEAP +0 EMPTY Heap_Size { } + } +} \ No newline at end of file diff --git a/bsp/gd32/arm/gd32e230-lckfb/figures/board.png b/bsp/gd32/arm/gd32e230-lckfb/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd25b459f50b49551738f92c24e4fcff3607443 GIT binary patch literal 123140 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 z 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, adc->adc_pins[channel]); + #if defined SOC_SERIES_GD32E23x + adc_data_alignment_config(ADC_DATAALIGN_RIGHT); + #else adc_data_alignment_config(adc_periph, ADC_DATAALIGN_RIGHT); + #endif #if defined SOC_SERIES_GD32F4xx adc_channel_length_config(adc_periph, ADC_ROUTINE_CHANNEL, 1); adc_external_trigger_source_config(adc_periph, ADC_ROUTINE_CHANNEL, ADC_EXTTRIG_ROUTINE_EXTI_11); adc_external_trigger_config(adc_periph, ADC_ROUTINE_CHANNEL, ENABLE); + #elif defined SOC_SERIES_GD32E23x + adc_channel_length_config(ADC_REGULAR_CHANNEL, 1); + adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE); + adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE); #else adc_channel_length_config(adc_periph, ADC_REGULAR_CHANNEL, 1); adc_external_trigger_source_config(adc_periph, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); adc_external_trigger_config(adc_periph, ADC_REGULAR_CHANNEL, ENABLE); #endif + #if defined SOC_SERIES_GD32E23x + adc_enable(); + #else adc_enable(adc_periph); + #endif rt_hw_us_delay(1); /* ADC calibration and reset calibration */ + #if defined SOC_SERIES_GD32E23x + adc_calibration_enable(); + #else adc_calibration_enable(adc_periph); + #endif } else { + #if defined SOC_SERIES_GD32E23x + adc_disable(); + #else adc_disable(adc_periph); + #endif } return RT_EOK; } @@ -166,20 +197,35 @@ static rt_err_t gd32_adc_convert(struct rt_adc_device *device, rt_int8_t channel } adc_periph = (uint32_t)(adc->adc_periph); + #if defined SOC_SERIES_GD32E23x + adc_flag_clear(ADC_FLAG_EOC | ADC_FLAG_STRC); + #else adc_flag_clear(adc_periph, ADC_FLAG_EOC | ADC_FLAG_STRC); + #endif #if defined SOC_SERIES_GD32F4xx adc_routine_channel_config(adc_periph, 0, channel, ADC_SAMPLETIME_480); adc_software_trigger_enable(adc_periph, ADC_ROUTINE_CHANNEL); +#elif defined SOC_SERIES_GD32E23x + adc_regular_channel_config(0, channel, ADC_SAMPLETIME_13POINT5); + adc_software_trigger_enable(ADC_REGULAR_CHANNEL); #else adc_regular_channel_config(adc_periph, 0, channel, ADC_SAMPLETIME_13POINT5); adc_software_trigger_enable(adc_periph, ADC_REGULAR_CHANNEL); #endif + #if defined SOC_SERIES_GD32E23x + while (!adc_flag_get(ADC_FLAG_EOC)) + #else while (!adc_flag_get(adc_periph, ADC_FLAG_EOC)) + #endif { if(timeout >= 100) { + #if defined SOC_SERIES_GD32E23x + adc_flag_clear(ADC_FLAG_EOC | ADC_FLAG_STRC); + #else adc_flag_clear(adc_periph, ADC_FLAG_EOC | ADC_FLAG_STRC); + #endif LOG_E("Convert Timeout"); return -RT_ETIMEOUT; } @@ -192,11 +238,14 @@ static rt_err_t gd32_adc_convert(struct rt_adc_device *device, rt_int8_t channel #if defined SOC_SERIES_GD32F4xx *value = adc_routine_data_read(adc_periph); + adc_flag_clear(adc_periph, ADC_FLAG_EOC | ADC_FLAG_STRC); +#elif defined SOC_SERIES_GD32E23x + *value = adc_regular_data_read(); + adc_flag_clear(ADC_FLAG_EOC | ADC_FLAG_STRC); #else *value = adc_regular_data_read(adc_periph); -#endif - adc_flag_clear(adc_periph, ADC_FLAG_EOC | ADC_FLAG_STRC); +#endif return RT_EOK; } diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_dma.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_dma.h index 48a1eb05a29..cf1afd77934 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_dma.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_dma.h @@ -12,6 +12,28 @@ #define _DRV_DMA_H_ +#if defined SOC_SERIES_GD32E23x +#define DRV_DMA_CONFIG(chx) \ + (struct dma_config) { \ + .periph = DMA, \ + .rcu = RCU_DMA, \ + .channel = DMA_CH##chx, \ + .irq = ((chx) == 0 ? DMA_Channel0_IRQn : \ + (chx) == 1 ? DMA_Channel1_2_IRQn : \ + (chx) == 2 ? DMA_Channel1_2_IRQn : \ + (chx) == 3 ? DMA_Channel3_4_IRQn : \ + (chx) == 4 ? DMA_Channel3_4_IRQn : (IRQn_Type)0) \ + } +struct dma_config +{ + uint32_t periph; + rcu_periph_enum rcu; + dma_channel_enum channel; + IRQn_Type irq; +}; + +#else + #define DRV_DMA_CONFIG(dmax, chx, subx) { \ .periph = DMA##dmax, \ .channel = DMA_CH##chx, \ @@ -29,4 +51,6 @@ struct dma_config IRQn_Type irq; }; +#endif + #endif /* _DRV_DMA_H_ */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c index 092ed4aeb61..25ec0a243f3 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c @@ -182,6 +182,27 @@ static const struct pin_index pins[] = #endif }; +#if defined SOC_SERIES_GD32E23x +static const struct pin_irq_map pin_irq_map[] = +{ + {GPIO_PIN_0, EXTI0_1_IRQn}, + {GPIO_PIN_1, EXTI0_1_IRQn}, + {GPIO_PIN_2, EXTI2_3_IRQn}, + {GPIO_PIN_3, EXTI2_3_IRQn}, + {GPIO_PIN_4, EXTI4_15_IRQn}, + {GPIO_PIN_5, EXTI4_15_IRQn}, + {GPIO_PIN_6, EXTI4_15_IRQn}, + {GPIO_PIN_7, EXTI4_15_IRQn}, + {GPIO_PIN_8, EXTI4_15_IRQn}, + {GPIO_PIN_9, EXTI4_15_IRQn}, + {GPIO_PIN_10, EXTI4_15_IRQn}, + {GPIO_PIN_11, EXTI4_15_IRQn}, + {GPIO_PIN_12, EXTI4_15_IRQn}, + {GPIO_PIN_13, EXTI4_15_IRQn}, + {GPIO_PIN_14, EXTI4_15_IRQn}, + {GPIO_PIN_15, EXTI4_15_IRQn}, +}; +#else static const struct pin_irq_map pin_irq_map[] = { {GPIO_PIN_0, EXTI0_IRQn}, @@ -201,6 +222,7 @@ static const struct pin_irq_map pin_irq_map[] = {GPIO_PIN_14, EXTI10_15_IRQn}, {GPIO_PIN_15, EXTI10_15_IRQn}, }; +#endif struct rt_pin_irq_hdr pin_irq_hdr_tab[] = { @@ -257,7 +279,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) const struct pin_index *index = RT_NULL; rt_uint32_t pin_mode = 0; -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x rt_uint32_t pin_pupd = 0, pin_odpp = 0; #endif @@ -269,7 +291,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) /* GPIO Periph clock enable */ rcu_periph_clock_enable(index->clk); -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x pin_mode = GPIO_MODE_OUTPUT; #else pin_mode = GPIO_MODE_OUT_PP; @@ -279,7 +301,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) { case PIN_MODE_OUTPUT: /* output setting */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x pin_mode = GPIO_MODE_OUTPUT; pin_pupd = GPIO_PUPD_NONE; pin_odpp = GPIO_OTYPE_PP; @@ -289,7 +311,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_OUTPUT_OD: /* output setting: od. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x pin_mode = GPIO_MODE_OUTPUT; pin_pupd = GPIO_PUPD_NONE; pin_odpp = GPIO_OTYPE_OD; @@ -299,7 +321,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_INPUT: /* input setting: not pull. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x pin_mode = GPIO_MODE_INPUT; pin_pupd = GPIO_PUPD_PULLUP | GPIO_PUPD_PULLDOWN; #else @@ -308,7 +330,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_INPUT_PULLUP: /* input setting: pull up. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x pin_mode = GPIO_MODE_INPUT; pin_pupd = GPIO_PUPD_PULLUP; #else @@ -317,7 +339,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_INPUT_PULLDOWN: /* input setting: pull down. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x pin_mode = GPIO_MODE_INPUT; pin_pupd = GPIO_PUPD_PULLDOWN; #else @@ -328,7 +350,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; } -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x gpio_mode_set(index->gpio_periph, pin_mode, pin_pupd, index->pin); if(pin_mode == GPIO_MODE_OUTPUT) { @@ -555,15 +577,20 @@ static rt_err_t gd32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx rcu_periph_clock_enable(RCU_SYSCFG); +#elif defined SOC_SERIES_GD32E23x + rcu_periph_clock_enable(RCU_CFGCMP); #else rcu_periph_clock_enable(RCU_AF); #endif /* enable and set interrupt priority */ +#if defined SOC_SERIES_GD32E23x + nvic_irq_enable(irqmap->irqno, 5U); +#else nvic_irq_enable(irqmap->irqno, 5U, 0U); - +#endif /* connect EXTI line to GPIO pin */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x syscfg_exti_line_config(index->port_src, index->pin_src); #else gpio_exti_source_select(index->port_src, index->pin_src); @@ -630,6 +657,47 @@ void GD32_GPIO_EXTI_IRQHandler(rt_int8_t exti_line) } } +#if defined SOC_SERIES_GD32E23x +void EXTI0_1_IRQHandler(void) +{ + rt_interrupt_enter(); + + GD32_GPIO_EXTI_IRQHandler(0); + GD32_GPIO_EXTI_IRQHandler(1); + + rt_interrupt_leave(); +} + +void EXTI2_3_IRQHandler(void) +{ + rt_interrupt_enter(); + + GD32_GPIO_EXTI_IRQHandler(2); + GD32_GPIO_EXTI_IRQHandler(3); + + rt_interrupt_leave(); +} + +void EXTI4_15_IRQHandler(void) +{ + rt_interrupt_enter(); + + GD32_GPIO_EXTI_IRQHandler(4); + GD32_GPIO_EXTI_IRQHandler(5); + GD32_GPIO_EXTI_IRQHandler(6); + GD32_GPIO_EXTI_IRQHandler(7); + GD32_GPIO_EXTI_IRQHandler(8); + GD32_GPIO_EXTI_IRQHandler(9); + GD32_GPIO_EXTI_IRQHandler(10); + GD32_GPIO_EXTI_IRQHandler(11); + GD32_GPIO_EXTI_IRQHandler(12); + GD32_GPIO_EXTI_IRQHandler(13); + GD32_GPIO_EXTI_IRQHandler(14); + GD32_GPIO_EXTI_IRQHandler(15); + + rt_interrupt_leave(); +} +#else void EXTI0_IRQHandler(void) { rt_interrupt_enter(); @@ -687,6 +755,7 @@ void EXTI10_15_IRQHandler(void) GD32_GPIO_EXTI_IRQHandler(15); rt_interrupt_leave(); } +#endif int rt_hw_pin_init(void) { diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h index 1c4d8e1febf..b26811bf9e8 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h @@ -33,11 +33,13 @@ extern "C" { #include "gd32e50x_gpio.h" #elif defined SOC_SERIES_GD32F5xx #include "gd32f5xx_gpio.h" +#elif defined SOC_SERIES_GD32E23x +#include "gd32e23x_gpio.h" #endif #define __GD32_PORT(port) GPIO##port -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x #define GD32_PIN(index, port, pin) {index, RCU_GPIO##port, \ GPIO##port, GPIO_PIN_##pin, \ EXTI_SOURCE_GPIO##port, \ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c index 2937f408c27..ccb817e21c4 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c @@ -24,17 +24,92 @@ typedef struct { static gd32_rtc_device g_gd32_rtc_dev; +/** + * @brief Helper function: Convert BCD value to binary. + * @param val: BCD value. + * @return Binary value. + */ +static rt_uint8_t bcd_to_bin(rt_uint8_t val) +{ + return (val & 0x0F) + ((val >> 4) & 0x0F) * 10; +} + +/** + * @brief Helper function: Convert binary to BCD. + * @param val: Binary value. + * @return BCD value. + */ +static rt_uint8_t bin_to_bcd(rt_uint8_t val) +{ + return ((val / 10) << 4) | (val % 10); +} + static time_t get_rtc_timestamp(void) { + #if defined SOC_SERIES_GD32E23x + struct tm tm_new; + rtc_parameter_struct rtc_current_time; + + rtc_current_time_get(&rtc_current_time); + + tm_new.tm_year = bcd_to_bin(rtc_current_time.rtc_year) + 100; // tm_year: years since 1900 + tm_new.tm_mon = bcd_to_bin(rtc_current_time.rtc_month) - 1; // tm_mon: month (0 = January, 11 = December) + tm_new.tm_mday = bcd_to_bin(rtc_current_time.rtc_date); + tm_new.tm_hour = bcd_to_bin(rtc_current_time.rtc_hour); + tm_new.tm_min = bcd_to_bin(rtc_current_time.rtc_minute); + tm_new.tm_sec = bcd_to_bin(rtc_current_time.rtc_second); + + return mktime(&tm_new); + #else time_t rtc_counter; rtc_counter = (time_t)rtc_counter_get(); return rtc_counter; + #endif } static rt_err_t set_rtc_timestamp(time_t time_stamp) { + #if defined SOC_SERIES_GD32E23x + struct tm *p_tm; + rtc_parameter_struct rtc_init_struct; + + p_tm = gmtime(&time_stamp); + + /* GD32 RTC uses year starting from 2000; thus tm_year must be at least 100 (i.e., 2000 - 1900) */ + + if (p_tm->tm_year < 100) + { + return -RT_ERROR; + } + + rtc_init_struct.rtc_year = bin_to_bcd(p_tm->tm_year - 100); + rtc_init_struct.rtc_month = bin_to_bcd(p_tm->tm_mon + 1); + rtc_init_struct.rtc_date = bin_to_bcd(p_tm->tm_mday); + + rtc_init_struct.rtc_day_of_week = bin_to_bcd(p_tm->tm_wday == 0 ? 7 : p_tm->tm_wday); + rtc_init_struct.rtc_hour = bin_to_bcd(p_tm->tm_hour); + rtc_init_struct.rtc_minute = bin_to_bcd(p_tm->tm_min); + rtc_init_struct.rtc_second = bin_to_bcd(p_tm->tm_sec); + rtc_init_struct.rtc_display_format = RTC_24HOUR; + +#if defined(BSP_RTC_USING_LSI) + rtc_init_struct.rtc_factor_asyn = 39; + rtc_init_struct.rtc_factor_syn = 999; +#elif defined(BSP_RTC_USING_LSE) + rtc_init_struct.rtc_factor_asyn = 127; + rtc_init_struct.rtc_factor_syn = 255; +#endif + + if (rtc_init(&rtc_init_struct) != SUCCESS) + { + LOG_E("Failed to set RTC time."); + return -RT_ERROR; + } + + return RT_EOK; + #else uint32_t rtc_counter; rtc_counter = (uint32_t)time_stamp; @@ -51,6 +126,7 @@ static rt_err_t set_rtc_timestamp(time_t time_stamp) rtc_lwoff_wait(); return RT_EOK; + #endif } static rt_err_t rt_gd32_rtc_control(rt_device_t dev, int cmd, void *args) @@ -94,7 +170,9 @@ static int rt_hw_rtc_init(void) rcu_periph_clock_enable(RCU_PMU); pmu_backup_write_enable(); + #ifndef SOC_SERIES_GD32E23x rcu_periph_clock_enable(RCU_BKPI); + #endif rtc_counter = get_rtc_timestamp(); /* once the rtc clock source has been selected, if can't be changed diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c index d62ecc91224..9b0a47fd05d 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c @@ -44,6 +44,9 @@ static const struct gd32_spi spi_bus_obj[] = { GPIOA, #if defined SOC_SERIES_GD32F4xx GPIO_AF_5, +#endif +#if defined SOC_SERIES_GD32E23x + GPIO_AF_0, #endif GPIO_PIN_5, GPIO_PIN_6, @@ -62,7 +65,15 @@ static const struct gd32_spi spi_bus_obj[] = { #if defined SOC_SERIES_GD32F4xx GPIO_AF_5, #endif +#if defined SOC_SERIES_GD32E23x + GPIO_AF_0, +#endif + +#if defined SOC_SERIES_GD32E23x + GPIO_PIN_13, +#else GPIO_PIN_12, +#endif GPIO_PIN_14, GPIO_PIN_15, }, @@ -141,12 +152,16 @@ static void gd32_spi_init(struct gd32_spi *gd32_spi) rcu_periph_clock_enable(gd32_spi->spi_clk); rcu_periph_clock_enable(gd32_spi->gpio_clk); -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x /*GPIO pin configuration*/ gpio_af_set(gd32_spi->spi_port, gd32_spi->alt_func_num, gd32_spi->sck_pin | gd32_spi->mosi_pin | gd32_spi->miso_pin); gpio_mode_set(gd32_spi->spi_port, GPIO_MODE_AF, GPIO_PUPD_NONE, gd32_spi->sck_pin | gd32_spi->mosi_pin | gd32_spi->miso_pin); + #if defined SOC_SERIES_GD32E23x + gpio_output_options_set(gd32_spi->spi_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, gd32_spi->sck_pin | gd32_spi->mosi_pin | gd32_spi->miso_pin); + #else gpio_output_options_set(gd32_spi->spi_port, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, gd32_spi->sck_pin | gd32_spi->mosi_pin | gd32_spi->miso_pin); + #endif #else /* Init SPI SCK MOSI */ gpio_init(gd32_spi->spi_port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, gd32_spi->sck_pin | gd32_spi->mosi_pin); @@ -197,6 +212,9 @@ static rt_err_t spi_configure(struct rt_spi_device* device, LOG_D("CK_APB2 freq: %d\n", rcu_clock_freq_get(CK_APB2)); LOG_D("max freq: %d\n", max_hz); + #if defined SOC_SERIES_GD32E23x + spi_src = CK_APB2; + #else if (spi_periph == SPI1 || spi_periph == SPI2) { spi_src = CK_APB1; @@ -205,6 +223,7 @@ static rt_err_t spi_configure(struct rt_spi_device* device, { spi_src = CK_APB2; } + #endif spi_apb_clock = rcu_clock_freq_get(spi_src); if(max_hz >= spi_apb_clock/2) diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h index fbdaaf745e7..21f42da32ee 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h @@ -34,7 +34,7 @@ struct gd32_spi rcu_periph_enum gpio_clk; struct rt_spi_bus *spi_bus; uint32_t spi_port; -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x uint32_t alt_func_num; #endif uint16_t sck_pin; diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c index ea4c73143c5..316323ef448 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c @@ -171,6 +171,10 @@ static const struct gd32_uart uart_obj[] = { GPIOA, 0, GPIO_PIN_9, // tx port, tx alternate, tx pin GPIOA, 0, GPIO_PIN_10, // rx port, rx alternate, rx pin 0, // afio remap cfg +#elif defined SOC_SERIES_GD32E23x + RCU_GPIOA, RCU_GPIOA, + GPIOA, GPIO_AF_1, GPIO_PIN_9, + GPIOA, GPIO_AF_1, GPIO_PIN_10, #else RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock GPIOA, GPIO_PIN_9, // tx port, tx pin @@ -195,6 +199,10 @@ static const struct gd32_uart uart_obj[] = { GPIOA, 0, GPIO_PIN_2, // tx port, tx alternate, tx pin GPIOA, 0, GPIO_PIN_3, // rx port, rx alternate, rx pin 0, // afio remap cfg +#elif defined SOC_SERIES_GD32E23x + RCU_GPIOA, RCU_GPIOA, + GPIOA, GPIO_AF_1, GPIO_PIN_14, + GPIOA, GPIO_AF_1, GPIO_PIN_15, #else RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock GPIOA, GPIO_PIN_2, // tx port, tx pin @@ -347,7 +355,7 @@ void gd32_uart_gpio_init(struct gd32_uart *uart) rcu_periph_clock_enable(uart->rx_gpio_clk); rcu_periph_clock_enable(uart->per_clk); -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x /* connect port to USARTx_Tx */ gpio_af_set(uart->tx_port, uart->tx_af, uart->tx_pin); diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h index 1e81fd12c61..033ee8be622 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h @@ -33,14 +33,14 @@ struct gd32_uart rcu_periph_enum tx_gpio_clk; //Todo: 5bits rcu_periph_enum rx_gpio_clk; //Todo: 5bits uint32_t tx_port; //Todo: 4bits -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x uint16_t tx_af; //Todo: 4bits #elif defined SOC_SERIES_GD32E50x uint32_t tx_af; //alternate1 cfg #endif uint16_t tx_pin; //Todo: 4bits uint32_t rx_port; //Todo: 4bits -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x uint16_t rx_af; //Todo: 4bits #elif defined SOC_SERIES_GD32E50x uint32_t rx_af; //alternate1 cfg diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c index 37b8090a1f5..149b2f54df7 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c @@ -59,15 +59,28 @@ static struct gd32_uart uart_obj[] = { #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOA, GPIO_AF_7, GPIO_PIN_9, // tx port, tx alternate, tx pin GPIOA, GPIO_AF_7, GPIO_PIN_10, // rx port, rx alternate, rx pin +#elif defined SOC_SERIES_GD32E23x + GPIOA, GPIO_AF_1, GPIO_PIN_9, + GPIOA, GPIO_AF_1, GPIO_PIN_10, #else GPIOA, GPIO_PIN_9, // tx port, tx pin GPIOA, GPIO_PIN_10, // rx port, rx pin #endif + +#if defined SOC_SERIES_GD32E23x +#ifdef BSP_UART0_RX_USING_DMA + .dma.rx = DRV_DMA_CONFIG(2), +#endif +#ifdef BSP_UART0_TX_USING_DMA + .dma.tx = DRV_DMA_CONFIG(1), +#endif +#else #ifdef BSP_UART0_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(1, 5, 4), #endif #ifdef BSP_UART0_TX_USING_DMA .dma.tx = DRV_DMA_CONFIG(1, 7, 4), +#endif #endif }, #endif @@ -81,15 +94,27 @@ static struct gd32_uart uart_obj[] = { #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOA, GPIO_AF_7, GPIO_PIN_2, // tx port, tx alternate, tx pin GPIOA, GPIO_AF_7, GPIO_PIN_3, // rx port, rx alternate, rx pin +#elif defined SOC_SERIES_GD32E23x + GPIOA, GPIO_AF_1, GPIO_PIN_14, + GPIOA, GPIO_AF_1, GPIO_PIN_15, #else GPIOA, GPIO_PIN_2, // tx port, tx pin GPIOA, GPIO_PIN_3, // rx port, rx pin #endif +#if defined SOC_SERIES_GD32E23x +#ifdef BSP_UART1_RX_USING_DMA + .dma.rx = DRV_DMA_CONFIG(4), +#endif +#ifdef BSP_UART1_TX_USING_DMA + .dma.tx = DRV_DMA_CONFIG(3), +#endif +#else #ifdef BSP_UART1_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(0, 5, 4), #endif #ifdef BSP_UART1_TX_USING_DMA .dma.tx = DRV_DMA_CONFIG(0, 6, 4), +#endif #endif }, #endif @@ -240,7 +265,11 @@ static void dma_recv_isr (struct rt_serial_device *serial) recv_len = 0; level = rt_hw_interrupt_disable(); + #if defined SOC_SERIES_GD32E23x + counter = dma_transfer_number_get(uart->dma.rx.channel); + #else counter = dma_transfer_number_get(uart->dma.rx.periph, uart->dma.rx.channel); + #endif if (counter <= uart->dma.last_index) { recv_len = uart->dma.last_index - counter; @@ -377,6 +406,17 @@ static void dma_rx_isr (struct rt_serial_device *serial) RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct gd32_uart, serial); + #if defined SOC_SERIES_GD32E23x + if ((dma_interrupt_flag_get(uart->dma.rx.channel, DMA_INT_FLAG_HTF) != RESET) || + (dma_interrupt_flag_get(uart->dma.rx.channel, DMA_INT_FLAG_FTF) != RESET)) + { + dma_recv_isr(serial); + + /* clear dma flag */ + dma_interrupt_flag_clear(uart->dma.rx.channel, DMA_INT_FLAG_HTF); + dma_interrupt_flag_clear(uart->dma.rx.channel, DMA_INT_FLAG_FTF); + } + #else if ((dma_interrupt_flag_get(uart->dma.rx.periph, uart->dma.rx.channel, DMA_INT_FLAG_HTF) != RESET) || (dma_interrupt_flag_get(uart->dma.rx.periph, uart->dma.rx.channel, DMA_INT_FLAG_FTF) != RESET)) { @@ -386,6 +426,7 @@ static void dma_rx_isr (struct rt_serial_device *serial) dma_interrupt_flag_clear(uart->dma.rx.periph, uart->dma.rx.channel, DMA_INT_FLAG_HTF); dma_interrupt_flag_clear(uart->dma.rx.periph, uart->dma.rx.channel, DMA_INT_FLAG_FTF); } + #endif } #endif @@ -405,6 +446,24 @@ static void dma_tx_isr (struct rt_serial_device *serial) RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct gd32_uart, serial); + #if defined SOC_SERIES_GD32E23x + { + rt_size_t trans_total_index; + + /* clear dma flag */ + dma_interrupt_flag_clear(uart->dma.tx.channel, DMA_INT_FLAG_FTF); + + /* disable dma tx channel */ + dma_channel_disable(uart->dma.tx.channel); + + trans_total_index = dma_transfer_number_get(uart->dma.tx.channel); + + if (trans_total_index == 0) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE); + } + } + #else if (dma_interrupt_flag_get(uart->dma.tx.periph, uart->dma.tx.channel, DMA_INT_FLAG_FTF) != RESET) { rt_size_t trans_total_index; @@ -422,6 +481,7 @@ static void dma_tx_isr (struct rt_serial_device *serial) rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE); } } + #endif } #endif @@ -535,7 +595,35 @@ void UART7_IRQHandler (void) } #endif /* BSP_USING_UART7 */ +#if define SOC_SERIES_GD32E23x +#if define BSP_UART0_RX_USING_DMA || define BSP_UART0_TX_USING_DMA +void DMA_Channel1_2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + if (dma_interrupt_flag_get(DMA_CH1, DMA_INT_FLAG_FTF) != RESET) + { + dma_interrupt_flag_clear(DMA_CH1, DMA_INT_FLAG_G); + dma_tx_isr(&uart_obj[UART0_INDEX].serial); + } + + if (dma_interrupt_flag_get(DMA_CH2, DMA_INT_FLAG_HTF) != RESET) + { + dma_interrupt_flag_clear(DMA_CH2, DMA_INT_FLAG_HTF); + dma_recv_isr(&uart_obj[UART0_INDEX].serial); + } + else if (dma_interrupt_flag_get(DMA_CH2, DMA_INT_FLAG_FTF) != RESET) + { + dma_interrupt_flag_clear(DMA_CH2, DMA_INT_FLAG_FTF); + dma_recv_isr(&uart_obj[UART0_INDEX].serial); + } + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#else #ifdef BSP_UART0_RX_USING_DMA void DMA1_Channel5_IRQHandler (void) { @@ -549,7 +637,36 @@ void DMA1_Channel7_IRQHandler (void) dma_tx_isr(&uart_obj[UART0_INDEX].serial); } #endif +#endif +#if defined SOC_SERIES_GD32E23x + +#if defined BSP_UART1_RX_USING_DMA || defined BSP_UART1_TX_USING_DMA +void DMA_Channel3_4_IRQHandler(void) +{ + rt_interrupt_enter(); + + if (dma_interrupt_flag_get(DMA_CH3, DMA_INT_FLAG_FTF) != RESET) + { + dma_interrupt_flag_clear(DMA_CH3, DMA_INT_FLAG_G); + dma_tx_isr(&uart_obj[UART1_INDEX].serial); + } + + if (dma_interrupt_flag_get(DMA_CH4, DMA_INT_FLAG_HTF) != RESET) + { + dma_interrupt_flag_clear(DMA_CH4, DMA_INT_FLAG_HTF); + dma_recv_isr(&uart_obj[UART1_INDEX].serial); + } + if (dma_interrupt_flag_get(DMA_CH4, DMA_INT_FLAG_FTF) != RESET) + { + dma_interrupt_flag_clear(DMA_CH4, DMA_INT_FLAG_FTF); + dma_recv_isr(&uart_obj[UART1_INDEX].serial); + } + + rt_interrupt_leave(); +} +#endif +#else #ifdef BSP_UART1_RX_USING_DMA void DMA0_Channel5_IRQHandler (void) { @@ -563,6 +680,7 @@ void DMA0_Channel6_IRQHandler (void) dma_tx_isr(&uart_obj[UART1_INDEX].serial); } #endif +#endif #ifdef BSP_UART2_RX_USING_DMA void DMA0_Channel1_IRQHandler (void) @@ -664,7 +782,7 @@ void gd32_uart_gpio_init (struct gd32_uart *uart) rcu_periph_clock_enable(uart->rx_gpio_clk); rcu_periph_clock_enable(uart->per_clk); -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x /* connect port to USARTx_Tx */ gpio_af_set(uart->tx_port, uart->tx_af, uart->tx_pin); @@ -756,9 +874,46 @@ static rt_err_t gd32_uart_configure (struct rt_serial_device *serial, struct ser #ifdef RT_SERIAL_USING_DMA static void _uart_dma_receive (struct gd32_uart *uart, rt_uint8_t *buffer, rt_uint32_t size) { - dma_single_data_parameter_struct dma_init_struct = { 0 }; - /* clear all the interrupt flags */ + + #if defined SOC_SERIES_GD32E23x + dma_flag_clear(uart->dma.rx.channel, DMA_FLAG_G); + dma_flag_clear(uart->dma.rx.channel, DMA_FLAG_FTF); + dma_flag_clear(uart->dma.rx.channel, DMA_FLAG_HTF); + dma_flag_clear(uart->dma.rx.channel, DMA_FLAG_ERR); + dma_channel_disable(uart->dma.rx.channel); + dma_deinit(uart->dma.rx.channel); + + /* configure receive DMA */ + rcu_periph_clock_enable(uart->dma.rx.rcu); + dma_deinit(uart->dma.rx.channel); + + dma_parameter_struct dma_init_struct = { 0 }; + dma_init_struct.periph_addr = (uint32_t)&USART_RDATA(uart->periph); + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_addr = (uint32_t)buffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.number = size; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + dma_init(uart->dma.rx.channel, &dma_init_struct); + + /* enable transmit complete interrupt */ + nvic_irq_enable(uart->dma.rx.irq, 2); + dma_interrupt_enable(uart->dma.rx.channel, DMA_CHXCTL_HTFIE); + dma_interrupt_enable(uart->dma.rx.channel, DMA_CHXCTL_FTFIE); + + /* enable dma channel */ + dma_channel_enable(uart->dma.rx.channel); + + /* enable usart idle interrupt */ + usart_interrupt_enable(uart->periph, USART_INT_IDLE); + + /* enable dma receive */ + usart_dma_receive_config(uart->periph, USART_DENR_ENABLE); + #else dma_flag_clear(uart->dma.rx.periph, uart->dma.rx.channel, DMA_FLAG_FEE); dma_flag_clear(uart->dma.rx.periph, uart->dma.rx.channel, DMA_FLAG_SDE); dma_flag_clear(uart->dma.rx.periph, uart->dma.rx.channel, DMA_FLAG_TAE); @@ -771,6 +926,8 @@ static void _uart_dma_receive (struct gd32_uart *uart, rt_uint8_t *buffer, rt_ui rcu_periph_clock_enable(uart->dma.rx.rcu); dma_deinit(uart->dma.rx.periph, uart->dma.rx.channel); + dma_single_data_parameter_struct dma_init_struct = { 0 }; + dma_init_struct.number = size; dma_init_struct.memory0_addr = (uint32_t)buffer; dma_init_struct.periph_addr = (uint32_t)&USART_DATA(uart->periph); @@ -796,10 +953,19 @@ static void _uart_dma_receive (struct gd32_uart *uart, rt_uint8_t *buffer, rt_ui /* enable dma receive */ usart_dma_receive_config(uart->periph, USART_RECEIVE_DMA_ENABLE); + #endif } static void _uart_dma_transmit (struct gd32_uart *uart, rt_uint8_t *buffer, rt_uint32_t size) { + #if defined SOC_SERIES_GD32E23x + DMA_CHMADDR(uart->dma.tx.channel) = (uint32_t)buffer; + DMA_CHCNT(uart->dma.tx.channel) = size; + + usart_dma_transmit_config(uart->periph, USART_DENT_ENABLE); + + dma_channel_enable(uart->dma.tx.channel); + #else /* Set the data length and data pointer */ DMA_CHM0ADDR(uart->dma.tx.periph, uart->dma.tx.channel) = (uint32_t)buffer; DMA_CHCNT(uart->dma.tx.periph, uart->dma.tx.channel) = size; @@ -809,12 +975,12 @@ static void _uart_dma_transmit (struct gd32_uart *uart, rt_uint8_t *buffer, rt_u /* enable dma channel */ dma_channel_enable(uart->dma.tx.periph, uart->dma.tx.channel); + #endif } static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag) { struct gd32_uart *uart; - dma_single_data_parameter_struct dma_init_struct = { 0 }; RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct gd32_uart, serial); @@ -824,6 +990,35 @@ static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag) /* enable rx dma */ if (flag == RT_DEVICE_FLAG_DMA_TX) { + #if defined SOC_SERIES_GD32E23x + dma_flag_clear(uart->dma.tx.channel, DMA_FLAG_G); + dma_flag_clear(uart->dma.tx.channel, DMA_FLAG_FTF); + dma_flag_clear(uart->dma.tx.channel, DMA_FLAG_HTF); + dma_flag_clear(uart->dma.tx.channel, DMA_FLAG_ERR); + dma_channel_disable(uart->dma.tx.channel); + dma_deinit(uart->dma.tx.channel); + /* configure receive DMA */ + rcu_periph_clock_enable(uart->dma.tx.rcu); + dma_deinit( uart->dma.tx.channel); + + + dma_parameter_struct dma_init_struct = { 0 }; + dma_init_struct.periph_addr = (uint32_t)&USART_TDATA(uart->periph); + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + + dma_init(uart->dma.tx.channel, &dma_init_struct); + + /* enable tx dma interrupt */ + nvic_irq_enable(uart->dma.tx.irq, 2); + + /* enable transmit complete interrupt */ + dma_interrupt_enable(uart->dma.tx.channel, DMA_INT_FTF); + #else /* clear all the interrupt flags */ dma_flag_clear(uart->dma.tx.periph, uart->dma.tx.channel, DMA_FLAG_FEE); dma_flag_clear(uart->dma.tx.periph, uart->dma.tx.channel, DMA_FLAG_SDE); @@ -837,6 +1032,8 @@ static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag) rcu_periph_clock_enable(uart->dma.tx.rcu); dma_deinit(uart->dma.tx.periph, uart->dma.tx.channel); + dma_single_data_parameter_struct dma_init_struct = { 0 }; + dma_init_struct.periph_addr = (uint32_t)&USART_DATA(uart->periph); dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT; dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; @@ -852,6 +1049,7 @@ static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag) /* enable transmit complete interrupt */ dma_interrupt_enable(uart->dma.tx.periph, uart->dma.tx.channel, DMA_CHXCTL_FTFIE); + #endif } /* enable rx dma */ @@ -918,13 +1116,21 @@ static rt_err_t gd32_uart_control (struct rt_serial_device *serial, int cmd, voi { usart_interrupt_disable(uart->periph, USART_INT_RBNE); NVIC_DisableIRQ(uart->dma.rx.irq); + #if defined SOC_SERIES_GD32E23x + dma_deinit(uart->dma.rx.channel); + #else dma_deinit(uart->dma.rx.periph, uart->dma.rx.channel); + #endif } else if(ctrl_arg == RT_DEVICE_FLAG_DMA_TX) { usart_interrupt_disable(uart->periph, USART_INT_TBE); NVIC_DisableIRQ(uart->dma.tx.irq); + #if defined SOC_SERIES_GD32E23x + dma_deinit(uart->dma.tx.channel); + #else dma_deinit(uart->dma.tx.periph, uart->dma.tx.channel); + #endif } #endif break; diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h index 6580791c058..c5a486e1b73 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h @@ -32,12 +32,12 @@ struct gd32_uart rcu_periph_enum tx_gpio_clk; rcu_periph_enum rx_gpio_clk; uint32_t tx_port; -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x uint16_t tx_af; #endif uint16_t tx_pin; uint32_t rx_port; -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x uint16_t rx_af; #endif uint16_t rx_pin; From 000216dc9621cfffdf96875f87d7626d496ce476 Mon Sep 17 00:00:00 2001 From: Huang YunKun Date: Tue, 29 Jul 2025 09:26:55 +0000 Subject: [PATCH 2/6] polish Kconfig --- bsp/gd32/arm/gd32e230-lckfb/.config | 20 ++++--------- bsp/gd32/arm/gd32e230-lckfb/board/Kconfig | 34 +++++++---------------- bsp/gd32/arm/gd32e230-lckfb/rtconfig.h | 13 ++------- 3 files changed, 18 insertions(+), 49 deletions(-) diff --git a/bsp/gd32/arm/gd32e230-lckfb/.config b/bsp/gd32/arm/gd32e230-lckfb/.config index 6a31342b70d..528af6c48f2 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/.config +++ b/bsp/gd32/arm/gd32e230-lckfb/.config @@ -217,11 +217,10 @@ CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y -# CONFIG_RT_USING_SERIAL_V1 is not set -CONFIG_RT_USING_SERIAL_V2=y -# CONFIG_RT_SERIAL_BUF_STRATEGY_DROP is not set -CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y -CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_CPUTIME is not set @@ -1385,12 +1384,7 @@ CONFIG_SOC_SERIES_GD32E23x=y # # Hardware Drivers Config # - -# -# SOC Series -# CONFIG_SOC_GD32E230C8T6=y -# end of SOC Series # # Onboard Peripheral Drivers @@ -1405,10 +1399,8 @@ CONFIG_BSP_LED_PIN=45 CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART0=y -CONFIG_BSP_UART0_RX_USING_DMA=y -CONFIG_BSP_UART0_RX_BUFSIZE=64 -CONFIG_BSP_UART0_TX_BUFSIZE=0 -CONFIG_BSP_UART0_DMA_PING_BUFSIZE=32 +# CONFIG_BSP_UART0_RX_USING_DMA is not set +# CONFIG_BSP_UART0_TX_USING_DMA is not set # CONFIG_BSP_USING_UART1 is not set # CONFIG_BSP_USING_SPI is not set diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig b/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig index 92b411e7e71..d8a53a95625 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig +++ b/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig @@ -2,30 +2,16 @@ menu "Hardware Drivers Config" -menu "SOC Series" - choice - prompt "Select GD32 SoC Series" - default SOC_SERIES_GD32E23x - - config SOC_SERIES_GD32E23x - bool "GD32E23x Series" - - endchoice - - if SOC_SERIES_GD32E23x - choice - prompt "Select GD32 SoC" - default SOC_GD32E230C8T6 - - config SOC_GD32E230C8T6 - bool "GD32E230C8T6" - select RT_USING_COMPONENTS_INIT - select RT_USING_USER_MAIN - - endchoice - endif -endmenu - +config SOC_SERIES_GD32E23x + bool + default y + +config SOC_GD32E230C8T6 + bool + select SOC_SERIES_GD32E23x + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y menu "Onboard Peripheral Drivers" menuconfig BSP_USING_LED diff --git a/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h b/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h index 50b549717e5..bcdd2db5d33 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h +++ b/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h @@ -126,9 +126,8 @@ #define RT_USING_DEVICE_IPC #define RT_UNAMED_PIPE_NUMBER 64 #define RT_USING_SERIAL -#define RT_USING_SERIAL_V2 -#define RT_SERIAL_BUF_STRATEGY_OVERWRITE -#define RT_SERIAL_USING_DMA +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN /* end of Device Drivers */ @@ -387,10 +386,7 @@ /* Hardware Drivers Config */ -/* SOC Series */ - #define SOC_GD32E230C8T6 -/* end of SOC Series */ /* Onboard Peripheral Drivers */ @@ -403,11 +399,6 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART0 -#define BSP_UART0_RX_USING_DMA -#define BSP_UART0_TX_USING_DMA -#define BSP_UART0_RX_BUFSIZE 64 -#define BSP_UART0_TX_BUFSIZE 32 -#define BSP_UART0_DMA_PING_BUFSIZE 32 /* I2C Configuration */ From 042700c2feeab88a2228dacdb7ac422cf1b79adc Mon Sep 17 00:00:00 2001 From: Huang YunKun Date: Tue, 29 Jul 2025 09:52:03 +0000 Subject: [PATCH 3/6] skip none for bsp dist --- bsp/gd32/arm/tools/sdk_dist.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bsp/gd32/arm/tools/sdk_dist.py b/bsp/gd32/arm/tools/sdk_dist.py index d6f97a38355..1af1ed2dfb8 100644 --- a/bsp/gd32/arm/tools/sdk_dist.py +++ b/bsp/gd32/arm/tools/sdk_dist.py @@ -27,8 +27,10 @@ def dist_do_building(BSP_ROOT, dist_dir): print("=> copy gd32 bsp library") library_dir = os.path.join(dist_dir, 'libraries') library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries') - bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), - os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) + # Only copy specific library when BSP_LIBRARY_TYPE is not None + if rtconfig.BSP_LIBRARY_TYPE is not None: + bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), + os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) print("=> copy bsp drivers") bsp_copy_files(os.path.join(library_path, 'gd32_drivers'), os.path.join(library_dir, 'gd32_drivers')) From ad97cfc2a26262177682332c82caed75e9b5bd1d Mon Sep 17 00:00:00 2001 From: Huang YunKun Date: Tue, 29 Jul 2025 12:13:27 +0000 Subject: [PATCH 4/6] fix adc issue --- .../gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml | 7 ++++++- bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml b/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml index 72ccba25027..506885b13f7 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/gd32/arm/gd32e230-lckfb/.ci/attachconfig/ci.attachconfig.yml @@ -17,4 +17,9 @@ hw_drv_onchip.adc0: hw_drv_onchip.spi0: kconfig: - CONFIG_BSP_USING_SPI=y - - CONFIG_BSP_USING_SPI0=y \ No newline at end of file + - CONFIG_BSP_USING_SPI0=y +hw_drv_onchip.i2c0: + kconfig: + - CONFIG_BSP_USING_I2C0=y + - CONFIG_BSP_I2C0_SCL_PIN=22 + - CONFIG_BSP_I2C0_SDA_PIN=23 \ No newline at end of file diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c index 5fa45539a50..74a37ebe0d0 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c @@ -35,7 +35,7 @@ struct rt_adc_device adc2; static const struct gd32_adc adc_obj[] = { #ifdef BSP_USING_ADC0 { - #if defined SOC_SERIES_GD32E230x + #if defined SOC_SERIES_GD32E23x ADC, RCU_ADC, { From 398447c4aa4ce60d896ea37d3771a6640f928656 Mon Sep 17 00:00:00 2001 From: Huang YunKun Date: Tue, 29 Jul 2025 12:23:30 +0000 Subject: [PATCH 5/6] use formatting py to format code --- .../arm/gd32e230-lckfb/applications/main.c | 13 +- bsp/gd32/arm/gd32e230-lckfb/board/board.c | 5 +- bsp/gd32/arm/gd32e230-lckfb/board/board.h | 9 +- .../gd32e230-lckfb/board/gd32e23x_libopt.h | 1 + bsp/gd32/arm/gd32e230-lckfb/rtconfig.h | 1 + bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c | 5 +- bsp/gd32/arm/libraries/gd32_drivers/drv_adc.h | 3 +- .../arm/libraries/gd32_drivers/drv_gpio.c | 12 +- .../arm/libraries/gd32_drivers/drv_gpio.h | 2 +- bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c | 9 +- bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c | 23 ++- bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h | 3 +- .../arm/libraries/gd32_drivers/drv_usart.c | 193 +++++++++--------- .../arm/libraries/gd32_drivers/drv_usart.h | 33 +-- .../arm/libraries/gd32_drivers/drv_usart_v2.c | 122 +++++------ .../arm/libraries/gd32_drivers/drv_usart_v2.h | 3 +- 16 files changed, 227 insertions(+), 210 deletions(-) diff --git a/bsp/gd32/arm/gd32e230-lckfb/applications/main.c b/bsp/gd32/arm/gd32e230-lckfb/applications/main.c index 358120c2f69..c605cd1f909 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/applications/main.c +++ b/bsp/gd32/arm/gd32e230-lckfb/applications/main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2025 RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -10,7 +10,7 @@ #include #include -#include +#include #define LED_PIN BSP_LED_PIN @@ -40,13 +40,13 @@ static void uart_send_thread_entry(void *parameter) char msg[] = "hello rt-thread\r\n"; console_dev = rt_console_get_device(); - + if (!console_dev) { rt_kprintf("Failed to get console device.\n"); return; } - + rt_kprintf("UART send thread started. Will send message every 2 seconds.\n"); while (1) @@ -94,6 +94,7 @@ int main(void) { rt_kprintf("!!! FAILED to create uart_send thread. Not enough memory?\n"); } - + return 0; -} \ No newline at end of file +} + diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/board.c b/bsp/gd32/arm/gd32e230-lckfb/board/board.c index 6a02b4eeb6f..f29d44ca99c 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/board/board.c +++ b/bsp/gd32/arm/gd32e230-lckfb/board/board.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2025 RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -76,4 +76,5 @@ void rt_hw_board_init(void) #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif -} \ No newline at end of file +} + diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/board.h b/bsp/gd32/arm/gd32e230-lckfb/board/board.h index f88bdc9540a..aa1e4ae313f 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/board/board.h +++ b/bsp/gd32/arm/gd32e230-lckfb/board/board.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2025 RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -7,8 +7,8 @@ #ifndef __BOARD_H__ #define __BOARD_H__ -#include "gd32e23x.h" -#include "drv_gpio.h" +#include "gd32e23x.h" +#include "drv_gpio.h" #include "gd32e23x_exti.h" @@ -31,4 +31,5 @@ extern int __bss_end; #define HEAP_END GD32_SRAM_END -#endif \ No newline at end of file +#endif + diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h b/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h index c4bd1964b19..1ad718d0e12 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h +++ b/bsp/gd32/arm/gd32e230-lckfb/board/gd32e23x_libopt.h @@ -56,3 +56,4 @@ OF SUCH DAMAGE. #include "gd32e23x_cmp.h" #endif /* GD32E23X_LIBOPT_H */ + diff --git a/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h b/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h index bcdd2db5d33..9fc76ea3276 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h +++ b/bsp/gd32/arm/gd32e230-lckfb/rtconfig.h @@ -410,3 +410,4 @@ /* end of Hardware Drivers Config */ #endif + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c index 74a37ebe0d0..0a74d7d4342 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -35,7 +35,7 @@ struct rt_adc_device adc2; static const struct gd32_adc adc_obj[] = { #ifdef BSP_USING_ADC0 { - #if defined SOC_SERIES_GD32E23x + #if defined SOC_SERIES_GD32E23x ADC, RCU_ADC, { @@ -274,3 +274,4 @@ static int rt_hw_adc_init(void) } INIT_BOARD_EXPORT(rt_hw_adc_init); #endif + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.h index b2bc10eb984..8a5c5708bc2 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_adc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -35,3 +35,4 @@ struct gd32_adc #endif #endif /* __DRV_ADC_H__ */ + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c index 25ec0a243f3..cb43335dea1 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -471,6 +471,7 @@ static rt_err_t gd32_pin_attach_irq(struct rt_device *device, rt_base_t pin, rt_hw_interrupt_enable(level); return RT_EOK; } + if (pin_irq_hdr_tab[hdr_index].pin != -1) { rt_hw_interrupt_enable(level); @@ -661,10 +662,10 @@ void GD32_GPIO_EXTI_IRQHandler(rt_int8_t exti_line) void EXTI0_1_IRQHandler(void) { rt_interrupt_enter(); - + GD32_GPIO_EXTI_IRQHandler(0); GD32_GPIO_EXTI_IRQHandler(1); - + rt_interrupt_leave(); } @@ -681,7 +682,7 @@ void EXTI2_3_IRQHandler(void) void EXTI4_15_IRQHandler(void) { rt_interrupt_enter(); - + GD32_GPIO_EXTI_IRQHandler(4); GD32_GPIO_EXTI_IRQHandler(5); GD32_GPIO_EXTI_IRQHandler(6); @@ -694,7 +695,7 @@ void EXTI4_15_IRQHandler(void) GD32_GPIO_EXTI_IRQHandler(13); GD32_GPIO_EXTI_IRQHandler(14); GD32_GPIO_EXTI_IRQHandler(15); - + rt_interrupt_leave(); } #else @@ -769,3 +770,4 @@ int rt_hw_pin_init(void) INIT_BOARD_EXPORT(rt_hw_pin_init); #endif + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h index b26811bf9e8..7e31b6c72d1 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c index ccb817e21c4..21d14c0ab0b 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -52,8 +52,8 @@ static time_t get_rtc_timestamp(void) rtc_current_time_get(&rtc_current_time); - tm_new.tm_year = bcd_to_bin(rtc_current_time.rtc_year) + 100; // tm_year: years since 1900 - tm_new.tm_mon = bcd_to_bin(rtc_current_time.rtc_month) - 1; // tm_mon: month (0 = January, 11 = December) + tm_new.tm_year = bcd_to_bin(rtc_current_time.rtc_year) + 100; /* tm_year: years since 1900 */ + tm_new.tm_mon = bcd_to_bin(rtc_current_time.rtc_month) - 1; /* tm_mon: month (0 = January, 11 = December) */ tm_new.tm_mday = bcd_to_bin(rtc_current_time.rtc_date); tm_new.tm_hour = bcd_to_bin(rtc_current_time.rtc_hour); tm_new.tm_min = bcd_to_bin(rtc_current_time.rtc_minute); @@ -78,7 +78,7 @@ static rt_err_t set_rtc_timestamp(time_t time_stamp) p_tm = gmtime(&time_stamp); /* GD32 RTC uses year starting from 2000; thus tm_year must be at least 100 (i.e., 2000 - 1900) */ - + if (p_tm->tm_year < 100) { return -RT_ERROR; @@ -223,3 +223,4 @@ static int rt_hw_rtc_init(void) } INIT_DEVICE_EXPORT(rt_hw_rtc_init); #endif + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c index 9b0a47fd05d..1efeef1b1f9 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -183,7 +183,7 @@ static rt_err_t spi_configure(struct rt_spi_device* device, RT_ASSERT(device != RT_NULL); RT_ASSERT(configuration != RT_NULL); - //Init SPI + /* Init SPI */ gd32_spi_init(spi_device); /* data_width */ @@ -337,15 +337,15 @@ static rt_ssize_t spixfer(struct rt_spi_device* device, struct rt_spi_message* m data = *send_ptr++; } - // Todo: replace register read/write by gd32f4 lib - //Wait until the transmit buffer is empty + /* Todo: replace register read/write by gd32f4 lib */ + /* Wait until the transmit buffer is empty */ while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE)); - // Send the byte + /* Send the byte */ spi_i2s_data_transmit(spi_periph, data); - //Wait until a data is received + /* Wait until a data is received */ while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE)); - // Get the received data + /* Get the received data */ data = spi_i2s_data_receive(spi_periph); if(recv_ptr != RT_NULL) @@ -370,14 +370,14 @@ static rt_ssize_t spixfer(struct rt_spi_device* device, struct rt_spi_message* m data = *send_ptr++; } - //Wait until the transmit buffer is empty + /* Wait until the transmit buffer is empty */ while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE)); - // Send the byte + /* Send the byte */ spi_i2s_data_transmit(spi_periph, data); - //Wait until a data is received + /* Wait until a data is received */ while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE)); - // Get the received data + /* Get the received data */ data = spi_i2s_data_receive(spi_periph); if(recv_ptr != RT_NULL) @@ -457,3 +457,4 @@ INIT_BOARD_EXPORT(rt_hw_spi_init); #endif /* BSP_USING_SPI0 || BSP_USING_SPI1 || BSP_USING_SPI2 || BSP_USING_SPI3 || BSP_USING_SPI4*/ #endif /* RT_USING_SPI */ + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h index 21f42da32ee..cf808844904 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -49,3 +49,4 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, #endif #endif /* __DRV_SPI_H__ */ + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c index 316323ef448..8cb2cfdfd36 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -154,31 +154,31 @@ void UART7_IRQHandler(void) static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART0 { - USART0, // uart peripheral index - USART0_IRQn, // uart iqrn - RCU_USART0, // uart periph clock + USART0, /* uart peripheral index */ + USART0_IRQn, /* uart iqrn */ + RCU_USART0, /* uart periph clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock - GPIOA, GPIO_AF_7, GPIO_PIN_9, // tx port, tx alternate, tx pin - GPIOA, GPIO_AF_7, GPIO_PIN_10, // rx port, rx alternate, rx pin + RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */ + GPIOA, GPIO_AF_7, GPIO_PIN_9, /* tx port, tx alternate, tx pin */ + GPIOA, GPIO_AF_7, GPIO_PIN_10, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32H7xx - RCU_GPIOF, // periph clock, tx gpio clock - RCU_GPIOF, // periph clock, rx gpio clock - GPIOF, GPIO_AF_4, GPIO_PIN_4, // tx port, tx alternate, tx pin - GPIOF, GPIO_AF_4, GPIO_PIN_5, // rx port, rx alternate, rx pin + RCU_GPIOF, /* periph clock, tx gpio clock */ + RCU_GPIOF, /* periph clock, rx gpio clock */ + GPIOF, GPIO_AF_4, GPIO_PIN_4, /* tx port, tx alternate, tx pin */ + GPIOF, GPIO_AF_4, GPIO_PIN_5, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E50x - RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock - GPIOA, 0, GPIO_PIN_9, // tx port, tx alternate, tx pin - GPIOA, 0, GPIO_PIN_10, // rx port, rx alternate, rx pin - 0, // afio remap cfg + RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */ + GPIOA, 0, GPIO_PIN_9, /* tx port, tx alternate, tx pin */ + GPIOA, 0, GPIO_PIN_10, /* rx port, rx alternate, rx pin */ + 0, /* afio remap cfg */ #elif defined SOC_SERIES_GD32E23x - RCU_GPIOA, RCU_GPIOA, - GPIOA, GPIO_AF_1, GPIO_PIN_9, + RCU_GPIOA, RCU_GPIOA, + GPIOA, GPIO_AF_1, GPIO_PIN_9, GPIOA, GPIO_AF_1, GPIO_PIN_10, #else - RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock - GPIOA, GPIO_PIN_9, // tx port, tx pin - GPIOA, GPIO_PIN_10, // rx port, rx pin + RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */ + GPIOA, GPIO_PIN_9, /* tx port, tx pin */ + GPIOA, GPIO_PIN_10, /* rx port, rx pin */ #endif &serial0, "uart0", @@ -187,26 +187,26 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART1 { - USART1, // uart peripheral index - USART1_IRQn, // uart iqrn - RCU_USART1, // uart periph clock + USART1, /* uart peripheral index */ + USART1_IRQn, /* uart iqrn */ + RCU_USART1, /* uart periph clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx - RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock - GPIOA, GPIO_AF_7, GPIO_PIN_2, // tx port, tx alternate, tx pin - GPIOA, GPIO_AF_7, GPIO_PIN_3, // rx port, rx alternate, rx pin + RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */ + GPIOA, GPIO_AF_7, GPIO_PIN_2, /* tx port, tx alternate, tx pin */ + GPIOA, GPIO_AF_7, GPIO_PIN_3, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E50x - RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock - GPIOA, 0, GPIO_PIN_2, // tx port, tx alternate, tx pin - GPIOA, 0, GPIO_PIN_3, // rx port, rx alternate, rx pin - 0, // afio remap cfg + RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */ + GPIOA, 0, GPIO_PIN_2, /* tx port, tx alternate, tx pin */ + GPIOA, 0, GPIO_PIN_3, /* rx port, rx alternate, rx pin */ + 0, /* afio remap cfg */ #elif defined SOC_SERIES_GD32E23x - RCU_GPIOA, RCU_GPIOA, - GPIOA, GPIO_AF_1, GPIO_PIN_14, - GPIOA, GPIO_AF_1, GPIO_PIN_15, + RCU_GPIOA, RCU_GPIOA, + GPIOA, GPIO_AF_1, GPIO_PIN_14, + GPIOA, GPIO_AF_1, GPIO_PIN_15, #else - RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock - GPIOA, GPIO_PIN_2, // tx port, tx pin - GPIOA, GPIO_PIN_3, // rx port, rx pin + RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ + GPIOA, GPIO_PIN_2, /* tx port, tx pin */ + GPIOA, GPIO_PIN_3, /* rx port, rx pin */ #endif &serial1, "uart1", @@ -215,22 +215,22 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART2 { - USART2, // uart peripheral index - USART2_IRQn, // uart iqrn - RCU_USART2, // uart periph clock + USART2, /* uart peripheral index */ + USART2_IRQn, /* uart iqrn */ + RCU_USART2, /* uart periph clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx - RCU_GPIOB, RCU_GPIOB, // tx gpio clock, rt gpio clock - GPIOB, GPIO_AF_7, GPIO_PIN_10, // tx port, tx alternate, tx pin - GPIOB, GPIO_AF_7, GPIO_PIN_11, // rx port, rx alternate, rx pin + RCU_GPIOB, RCU_GPIOB, /* tx gpio clock, rt gpio clock */ + GPIOB, GPIO_AF_7, GPIO_PIN_10, /* tx port, tx alternate, tx pin */ + GPIOB, GPIO_AF_7, GPIO_PIN_11, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E50x - RCU_GPIOB, RCU_GPIOB, // tx gpio clock, rx gpio clock - GPIOB, 0, GPIO_PIN_10, // tx port, tx alternate, tx pin - GPIOB, 0, GPIO_PIN_11, // rx port, rx alternate, rx pin - 0, // afio remap cfg + RCU_GPIOB, RCU_GPIOB, /* tx gpio clock, rx gpio clock */ + GPIOB, 0, GPIO_PIN_10, /* tx port, tx alternate, tx pin */ + GPIOB, 0, GPIO_PIN_11, /* rx port, rx alternate, rx pin */ + 0, /* afio remap cfg */ #else - RCU_GPIOB, RCU_GPIOB, // tx gpio clock, rt gpio clock - GPIOB, GPIO_PIN_10, // tx port, tx pin - GPIOB, GPIO_PIN_11, // rx port, rx pin + RCU_GPIOB, RCU_GPIOB, /* tx gpio clock, rt gpio clock */ + GPIOB, GPIO_PIN_10, /* tx port, tx pin */ + GPIOB, GPIO_PIN_11, /* rx port, rx pin */ #endif &serial2, "uart2", @@ -239,22 +239,22 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART3 { - UART3, // uart peripheral index - UART3_IRQn, // uart iqrn - RCU_UART3, // uart periph clock + UART3, /* uart peripheral index */ + UART3_IRQn, /* uart iqrn */ + RCU_UART3, /* uart periph clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - RCU_GPIOC, RCU_GPIOC, // tx gpio clock, rt gpio clock - GPIOC, GPIO_AF_8, GPIO_PIN_10, // tx port, tx alternate, tx pin - GPIOC, GPIO_AF_8, GPIO_PIN_11, // rx port, rx alternate, rx pin + RCU_GPIOC, RCU_GPIOC, /* tx gpio clock, rt gpio clock */ + GPIOC, GPIO_AF_8, GPIO_PIN_10, /* tx port, tx alternate, tx pin */ + GPIOC, GPIO_AF_8, GPIO_PIN_11, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E50x - RCU_GPIOC, RCU_GPIOC, // tx gpio clock, rx gpio clock - GPIOC, 0, GPIO_PIN_10, // tx port, tx alternate, tx pin - GPIOC, 0, GPIO_PIN_11, // rx port, rx alternate, rx pin - 0, // afio remap cfg + RCU_GPIOC, RCU_GPIOC, /* tx gpio clock, rx gpio clock */ + GPIOC, 0, GPIO_PIN_10, /* tx port, tx alternate, tx pin */ + GPIOC, 0, GPIO_PIN_11, /* rx port, rx alternate, rx pin */ + 0, /* afio remap cfg */ #else - RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock - GPIOC, GPIO_PIN_10, // tx port, tx pin - GPIOC, GPIO_PIN_11, // rx port, rx pin + RCU_GPIOC, RCU_GPIOC, /* periph clock, tx gpio clock, rt gpio clock */ + GPIOC, GPIO_PIN_10, /* tx port, tx pin */ + GPIOC, GPIO_PIN_11, /* rx port, rx pin */ #endif &serial3, "uart3", @@ -263,19 +263,19 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART4 { - UART4, // uart peripheral index - UART4_IRQn, // uart iqrn - RCU_UART4, RCU_GPIOC, RCU_GPIOD, // periph clock, tx gpio clock, rt gpio clock + UART4, /* uart peripheral index */ + UART4_IRQn, /* uart iqrn */ + RCU_UART4, RCU_GPIOC, RCU_GPIOD, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOC, GPIO_AF_8, GPIO_PIN_12, // tx port, tx alternate, tx pin - GPIOD, GPIO_AF_8, GPIO_PIN_2, // rx port, rx alternate, rx pin + GPIOC, GPIO_AF_8, GPIO_PIN_12, /* tx port, tx alternate, tx pin */ + GPIOD, GPIO_AF_8, GPIO_PIN_2, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E50x - GPIOC, 0, GPIO_PIN_12, // tx port, tx alternate, tx pin - GPIOD, 0, GPIO_PIN_2, // rx port, rx alternate, rx pin - 0, // afio remap cfg + GPIOC, 0, GPIO_PIN_12, /* tx port, tx alternate, tx pin */ + GPIOD, 0, GPIO_PIN_2, /* rx port, rx alternate, rx pin */ + 0, /* afio remap cfg */ #else - GPIOC, GPIO_PIN_12, // tx port, tx pin - GPIOD, GPIO_PIN_2, // rx port, rx pin + GPIOC, GPIO_PIN_12, /* tx port, tx pin */ + GPIOD, GPIO_PIN_2, /* rx port, rx pin */ #endif &serial4, "uart4", @@ -284,19 +284,19 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART5 { - USART5, // uart peripheral index - USART5_IRQn, // uart iqrn - RCU_USART5, RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock + USART5, /* uart peripheral index */ + USART5_IRQn, /* uart iqrn */ + RCU_USART5, RCU_GPIOC, RCU_GPIOC, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOC, GPIO_AF_8, GPIO_PIN_6, // tx port, tx alternate, tx pin - GPIOC, GPIO_AF_8, GPIO_PIN_7, // rx port, rx alternate, rx pin + GPIOC, GPIO_AF_8, GPIO_PIN_6, /* tx port, tx alternate, tx pin */ + GPIOC, GPIO_AF_8, GPIO_PIN_7, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E50x - GPIOC, AFIO_PC6_USART5_CFG, GPIO_PIN_6, // tx port, tx alternate, tx pin - GPIOC, AFIO_PC7_USART5_CFG, GPIO_PIN_7, // rx port, rx alternate, rx pin - 0, // afio remap cfg + GPIOC, AFIO_PC6_USART5_CFG, GPIO_PIN_6, /* tx port, tx alternate, tx pin */ + GPIOC, AFIO_PC7_USART5_CFG, GPIO_PIN_7, /* rx port, rx alternate, rx pin */ + 0, /* afio remap cfg */ #else - GPIOC, GPIO_PIN_6, // tx port, tx pin - GPIOC, GPIO_PIN_7, // rx port, rx pin + GPIOC, GPIO_PIN_6, /* tx port, tx pin */ + GPIOC, GPIO_PIN_7, /* rx port, rx pin */ #endif &serial5, "uart5", @@ -305,15 +305,15 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART6 { - UART6, // uart peripheral index - UART6_IRQn, // uart iqrn - RCU_UART6, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock + UART6, /* uart peripheral index */ + UART6_IRQn, /* uart iqrn */ + RCU_UART6, RCU_GPIOE, RCU_GPIOE, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOE, GPIO_AF_8, GPIO_PIN_7, // tx port, tx alternate, tx pin - GPIOE, GPIO_AF_8, GPIO_PIN_8, // rx port, rx alternate, rx pin + GPIOE, GPIO_AF_8, GPIO_PIN_7, /* tx port, tx alternate, tx pin */ + GPIOE, GPIO_AF_8, GPIO_PIN_8, /* rx port, rx alternate, rx pin */ #else - GPIOE, GPIO_PIN_7, // tx port, tx pin - GPIOE, GPIO_PIN_8, // rx port, rx pin + GPIOE, GPIO_PIN_7, /* tx port, tx pin */ + GPIOE, GPIO_PIN_8, /* rx port, rx pin */ #endif &serial6, "uart6", @@ -322,15 +322,15 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART7 { - UART7, // uart peripheral index - UART7_IRQn, // uart iqrn - RCU_UART7, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock + UART7, /* uart peripheral index */ + UART7_IRQn, /* uart iqrn */ + RCU_UART7, RCU_GPIOE, RCU_GPIOE, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOE, GPIO_AF_8, GPIO_PIN_0, // tx port, tx alternate, tx pin - GPIOE, GPIO_AF_8, GPIO_PIN_1, // rx port, rx alternate, rx pin + GPIOE, GPIO_AF_8, GPIO_PIN_0, /* tx port, tx alternate, tx pin */ + GPIOE, GPIO_AF_8, GPIO_PIN_1, /* rx port, rx alternate, rx pin */ #else - GPIOE, GPIO_PIN_0, // tx port, tx pin - GPIOE, GPIO_PIN_1, // rx port, rx pin + GPIOE, GPIO_PIN_0, /* tx port, tx pin */ + GPIOE, GPIO_PIN_1, /* rx port, rx pin */ #endif &serial7, "uart7", @@ -606,3 +606,4 @@ int rt_hw_usart_init(void) } #endif + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h index 033ee8be622..e2fcbe9ab27 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -24,30 +24,30 @@ extern "C" { /* GD32 uart driver */ -// Todo: compress uart info +/* Todo: compress uart info */ struct gd32_uart { - uint32_t uart_periph; //Todo: 3bits - IRQn_Type irqn; //Todo: 7bits - rcu_periph_enum per_clk; //Todo: 5bits - rcu_periph_enum tx_gpio_clk; //Todo: 5bits - rcu_periph_enum rx_gpio_clk; //Todo: 5bits - uint32_t tx_port; //Todo: 4bits + uint32_t uart_periph; /* Todo: 3bits */ + IRQn_Type irqn; /* Todo: 7bits */ + rcu_periph_enum per_clk; /* Todo: 5bits */ + rcu_periph_enum tx_gpio_clk; /* Todo: 5bits */ + rcu_periph_enum rx_gpio_clk; /* Todo: 5bits */ + uint32_t tx_port; /* Todo: 4bits */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x - uint16_t tx_af; //Todo: 4bits + uint16_t tx_af; /* Todo: 4bits */ #elif defined SOC_SERIES_GD32E50x - uint32_t tx_af; //alternate1 cfg + uint32_t tx_af; /* alternate1 cfg */ #endif - uint16_t tx_pin; //Todo: 4bits - uint32_t rx_port; //Todo: 4bits + uint16_t tx_pin; /* Todo: 4bits */ + uint32_t rx_port; /* Todo: 4bits */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x - uint16_t rx_af; //Todo: 4bits + uint16_t rx_af; /* Todo: 4bits */ #elif defined SOC_SERIES_GD32E50x - uint32_t rx_af; //alternate1 cfg + uint32_t rx_af; /* alternate1 cfg */ #endif - uint16_t rx_pin; //Todo: 4bits + uint16_t rx_pin; /* Todo: 4bits */ #if defined SOC_SERIES_GD32E50x - uint32_t uart_remap; //remap + uint32_t uart_remap; /* remap */ #endif struct rt_serial_device * serial; @@ -61,3 +61,4 @@ int rt_hw_usart_init(void); #endif #endif /* __DRV_USART_H__ */ + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c index 149b2f54df7..20853da1c11 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -53,18 +53,18 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART0 { "uart0", - USART0, // uart peripheral index - USART0_IRQn, // uart iqrn - RCU_USART0, RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock + USART0, /* uart peripheral index */ + USART0_IRQn, /* uart iqrn */ + RCU_USART0, RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOA, GPIO_AF_7, GPIO_PIN_9, // tx port, tx alternate, tx pin - GPIOA, GPIO_AF_7, GPIO_PIN_10, // rx port, rx alternate, rx pin + GPIOA, GPIO_AF_7, GPIO_PIN_9, /* tx port, tx alternate, tx pin */ + GPIOA, GPIO_AF_7, GPIO_PIN_10, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E23x - GPIOA, GPIO_AF_1, GPIO_PIN_9, + GPIOA, GPIO_AF_1, GPIO_PIN_9, GPIOA, GPIO_AF_1, GPIO_PIN_10, #else - GPIOA, GPIO_PIN_9, // tx port, tx pin - GPIOA, GPIO_PIN_10, // rx port, rx pin + GPIOA, GPIO_PIN_9, /* tx port, tx pin */ + GPIOA, GPIO_PIN_10, /* rx port, rx pin */ #endif #if defined SOC_SERIES_GD32E23x @@ -88,18 +88,18 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART1 { "uart1", - USART1, // uart peripheral index - USART1_IRQn, // uart iqrn - RCU_USART1, RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock + USART1, /* uart peripheral index */ + USART1_IRQn, /* uart iqrn */ + RCU_USART1, RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOA, GPIO_AF_7, GPIO_PIN_2, // tx port, tx alternate, tx pin - GPIOA, GPIO_AF_7, GPIO_PIN_3, // rx port, rx alternate, rx pin + GPIOA, GPIO_AF_7, GPIO_PIN_2, /* tx port, tx alternate, tx pin */ + GPIOA, GPIO_AF_7, GPIO_PIN_3, /* rx port, rx alternate, rx pin */ #elif defined SOC_SERIES_GD32E23x - GPIOA, GPIO_AF_1, GPIO_PIN_14, - GPIOA, GPIO_AF_1, GPIO_PIN_15, + GPIOA, GPIO_AF_1, GPIO_PIN_14, + GPIOA, GPIO_AF_1, GPIO_PIN_15, #else - GPIOA, GPIO_PIN_2, // tx port, tx pin - GPIOA, GPIO_PIN_3, // rx port, rx pin + GPIOA, GPIO_PIN_2, /* tx port, tx pin */ + GPIOA, GPIO_PIN_3, /* rx port, rx pin */ #endif #if defined SOC_SERIES_GD32E23x #ifdef BSP_UART1_RX_USING_DMA @@ -122,15 +122,15 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART2 { "uart2", - USART2, // uart peripheral index - USART2_IRQn, // uart iqrn - RCU_USART2, RCU_GPIOB, RCU_GPIOB, // periph clock, tx gpio clock, rt gpio clock + USART2, /* uart peripheral index */ + USART2_IRQn, /* uart iqrn */ + RCU_USART2, RCU_GPIOB, RCU_GPIOB, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOB, GPIO_AF_7, GPIO_PIN_10, // tx port, tx alternate, tx pin - GPIOB, GPIO_AF_7, GPIO_PIN_11, // rx port, rx alternate, rx pin + GPIOB, GPIO_AF_7, GPIO_PIN_10, /* tx port, tx alternate, tx pin */ + GPIOB, GPIO_AF_7, GPIO_PIN_11, /* rx port, rx alternate, rx pin */ #else - GPIOB, GPIO_PIN_10, // tx port, tx pin - GPIOB, GPIO_PIN_11, // rx port, rx pin + GPIOB, GPIO_PIN_10, /* tx port, tx pin */ + GPIOB, GPIO_PIN_11, /* rx port, rx pin */ #endif #ifdef BSP_UART2_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(0, 1, 4), @@ -144,15 +144,15 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART3 { "uart3", - UART3, // uart peripheral index - UART3_IRQn, // uart iqrn - RCU_UART3, RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock + UART3, /* uart peripheral index */ + UART3_IRQn, /* uart iqrn */ + RCU_UART3, RCU_GPIOC, RCU_GPIOC, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOC, GPIO_AF_8, GPIO_PIN_10, // tx port, tx alternate, tx pin - GPIOC, GPIO_AF_8, GPIO_PIN_11, // rx port, rx alternate, rx pin + GPIOC, GPIO_AF_8, GPIO_PIN_10, /* tx port, tx alternate, tx pin */ + GPIOC, GPIO_AF_8, GPIO_PIN_11, /* rx port, rx alternate, rx pin */ #else - GPIOC, GPIO_PIN_10, // tx port, tx pin - GPIOC, GPIO_PIN_11, // rx port, rx pin + GPIOC, GPIO_PIN_10, /* tx port, tx pin */ + GPIOC, GPIO_PIN_11, /* rx port, rx pin */ #endif #ifdef BSP_UART3_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(0, 2, 4), @@ -166,15 +166,15 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART4 { "uart4", - UART4, // uart peripheral index - UART4_IRQn, // uart iqrn - RCU_UART4, RCU_GPIOC, RCU_GPIOD, // periph clock, tx gpio clock, rt gpio clock + UART4, /* uart peripheral index */ + UART4_IRQn, /* uart iqrn */ + RCU_UART4, RCU_GPIOC, RCU_GPIOD, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOC, GPIO_AF_8, GPIO_PIN_12, // tx port, tx alternate, tx pin - GPIOD, GPIO_AF_8, GPIO_PIN_2, // rx port, rx alternate, rx pin + GPIOC, GPIO_AF_8, GPIO_PIN_12, /* tx port, tx alternate, tx pin */ + GPIOD, GPIO_AF_8, GPIO_PIN_2, /* rx port, rx alternate, rx pin */ #else - GPIOC, GPIO_PIN_12, // tx port, tx pin - GPIOD, GPIO_PIN_2, // rx port, rx pin + GPIOC, GPIO_PIN_12, /* tx port, tx pin */ + GPIOD, GPIO_PIN_2, /* rx port, rx pin */ #endif #ifdef BSP_UART4_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(0, 0, 4), @@ -188,15 +188,15 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART5 { "uart5", - USART5, // uart peripheral index - USART5_IRQn, // uart iqrn - RCU_USART5, RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock + USART5, /* uart peripheral index */ + USART5_IRQn, /* uart iqrn */ + RCU_USART5, RCU_GPIOC, RCU_GPIOC, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOC, GPIO_AF_8, GPIO_PIN_6, // tx port, tx alternate, tx pin - GPIOC, GPIO_AF_8, GPIO_PIN_7, // rx port, rx alternate, rx pin + GPIOC, GPIO_AF_8, GPIO_PIN_6, /* tx port, tx alternate, tx pin */ + GPIOC, GPIO_AF_8, GPIO_PIN_7, /* rx port, rx alternate, rx pin */ #else - GPIOC, GPIO_PIN_6, // tx port, tx pin - GPIOC, GPIO_PIN_7, // rx port, rx pin + GPIOC, GPIO_PIN_6, /* tx port, tx pin */ + GPIOC, GPIO_PIN_7, /* rx port, rx pin */ #endif #ifdef BSP_UART5_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(1, 1, 5), @@ -210,15 +210,15 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART6 { "uart6", - UART6, // uart peripheral index - UART6_IRQn, // uart iqrn - RCU_UART6, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock + UART6, /* uart peripheral index */ + UART6_IRQn, /* uart iqrn */ + RCU_UART6, RCU_GPIOE, RCU_GPIOE, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOE, GPIO_AF_8, GPIO_PIN_7, // tx port, tx alternate, tx pin - GPIOE, GPIO_AF_8, GPIO_PIN_8, // rx port, rx alternate, rx pin + GPIOE, GPIO_AF_8, GPIO_PIN_7, /* tx port, tx alternate, tx pin */ + GPIOE, GPIO_AF_8, GPIO_PIN_8, /* rx port, rx alternate, rx pin */ #else - GPIOE, GPIO_PIN_7, // tx port, tx pin - GPIOE, GPIO_PIN_8, // rx port, rx pin + GPIOE, GPIO_PIN_7, /* tx port, tx pin */ + GPIOE, GPIO_PIN_8, /* rx port, rx pin */ #endif #ifdef BSP_UART6_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(0, 3, 5), @@ -232,15 +232,15 @@ static struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART7 { "uart7", - UART7, // uart peripheral index - UART7_IRQn, // uart iqrn - RCU_UART7, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock + UART7, /* uart peripheral index */ + UART7_IRQn, /* uart iqrn */ + RCU_UART7, RCU_GPIOE, RCU_GPIOE, /* periph clock, tx gpio clock, rt gpio clock */ #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx - GPIOE, GPIO_AF_8, GPIO_PIN_0, // tx port, tx alternate, tx pin - GPIOE, GPIO_AF_8, GPIO_PIN_1, // rx port, rx alternate, rx pin + GPIOE, GPIO_AF_8, GPIO_PIN_0, /* tx port, tx alternate, tx pin */ + GPIOE, GPIO_AF_8, GPIO_PIN_1, /* rx port, rx alternate, rx pin */ #else - GPIOE, GPIO_PIN_0, // tx port, tx pin - GPIOE, GPIO_PIN_1, // rx port, rx pin + GPIOE, GPIO_PIN_0, /* tx port, tx pin */ + GPIOE, GPIO_PIN_1, /* rx port, rx pin */ #endif #ifdef BSP_UART7_RX_USING_DMA .dma.rx = DRV_DMA_CONFIG(0, 6, 5), @@ -657,6 +657,7 @@ void DMA_Channel3_4_IRQHandler(void) dma_interrupt_flag_clear(DMA_CH4, DMA_INT_FLAG_HTF); dma_recv_isr(&uart_obj[UART1_INDEX].serial); } + if (dma_interrupt_flag_get(DMA_CH4, DMA_INT_FLAG_FTF) != RESET) { dma_interrupt_flag_clear(DMA_CH4, DMA_INT_FLAG_FTF); @@ -1395,3 +1396,4 @@ int rt_hw_usart_init (void) } #endif + diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h index c5a486e1b73..a1fe384b1f8 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -63,3 +63,4 @@ int rt_hw_usart_init(void); #endif #endif /* __DRV_USART_V2_H__ */ + From 84f8eb8ea96452dc35615a136cc0b4b7977ed345 Mon Sep 17 00:00:00 2001 From: Huang YunKun Date: Thu, 31 Jul 2025 04:52:38 +0000 Subject: [PATCH 6/6] fix format --- bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c index 21d14c0ab0b..b8e07954f45 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_rtc.c @@ -170,9 +170,9 @@ static int rt_hw_rtc_init(void) rcu_periph_clock_enable(RCU_PMU); pmu_backup_write_enable(); - #ifndef SOC_SERIES_GD32E23x +#ifndef SOC_SERIES_GD32E23x rcu_periph_clock_enable(RCU_BKPI); - #endif +#endif rtc_counter = get_rtc_timestamp(); /* once the rtc clock source has been selected, if can't be changed