From be5ceca25cc2a47ad4e92b635f041dba680e1698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Wed, 10 Dec 2025 11:16:37 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(bsp/gd32):=20=E5=A2=9E=E5=8A=A0GDF0RG?= =?UTF-8?q?=E8=8A=AF=E7=89=87BSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/gd32/arm/gd32405rg/.config | 1457 ++++++++ bsp/gd32/arm/gd32405rg/.gitignore | 3 + bsp/gd32/arm/gd32405rg/Kconfig | 12 + bsp/gd32/arm/gd32405rg/README.md | 107 + .../arm/gd32405rg/README_assets/image.png | Bin 0 -> 96755 bytes .../gd32405rg/RTE/_rt-thread/RTE_Components.h | 20 + bsp/gd32/arm/gd32405rg/SConscript | 15 + bsp/gd32/arm/gd32405rg/SConstruct | 77 + .../arm/gd32405rg/applications/SConscript | 15 + bsp/gd32/arm/gd32405rg/applications/main.c | 35 + bsp/gd32/arm/gd32405rg/board/Kconfig | 354 ++ bsp/gd32/arm/gd32405rg/board/SConscript | 17 + bsp/gd32/arm/gd32405rg/board/board.c | 173 + bsp/gd32/arm/gd32405rg/board/board.h | 47 + .../arm/gd32405rg/board/gd32f4xx_libopt.h | 45 + .../gd32405rg/board/linker_scripts/link.icf | 40 + .../gd32405rg/board/linker_scripts/link.ld | 143 + .../gd32405rg/board/linker_scripts/link.sct | 18 + bsp/gd32/arm/gd32405rg/figures/board.jpg | Bin 0 -> 98061 bytes bsp/gd32/arm/gd32405rg/project.ewd | 3056 +++++++++++++++++ bsp/gd32/arm/gd32405rg/project.ewp | 2196 ++++++++++++ bsp/gd32/arm/gd32405rg/project.ewt | 3040 ++++++++++++++++ bsp/gd32/arm/gd32405rg/project.eww | 10 + bsp/gd32/arm/gd32405rg/project.uvoptx | 1075 ++++++ bsp/gd32/arm/gd32405rg/project.uvproj | 1270 +++++++ bsp/gd32/arm/gd32405rg/project.uvprojx | 2319 +++++++++++++ bsp/gd32/arm/gd32405rg/rtconfig.h | 430 +++ bsp/gd32/arm/gd32405rg/rtconfig.py | 151 + bsp/gd32/arm/gd32405rg/template.ewp | 1889 ++++++++++ bsp/gd32/arm/gd32405rg/template.uvoptx | 185 + bsp/gd32/arm/gd32405rg/template.uvproj | 628 ++++ bsp/gd32/arm/gd32405rg/template.uvprojx | 414 +++ 32 files changed, 19241 insertions(+) create mode 100644 bsp/gd32/arm/gd32405rg/.config create mode 100644 bsp/gd32/arm/gd32405rg/.gitignore create mode 100644 bsp/gd32/arm/gd32405rg/Kconfig create mode 100644 bsp/gd32/arm/gd32405rg/README.md create mode 100644 bsp/gd32/arm/gd32405rg/README_assets/image.png create mode 100644 bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h create mode 100644 bsp/gd32/arm/gd32405rg/SConscript create mode 100644 bsp/gd32/arm/gd32405rg/SConstruct create mode 100644 bsp/gd32/arm/gd32405rg/applications/SConscript create mode 100644 bsp/gd32/arm/gd32405rg/applications/main.c create mode 100644 bsp/gd32/arm/gd32405rg/board/Kconfig create mode 100644 bsp/gd32/arm/gd32405rg/board/SConscript create mode 100644 bsp/gd32/arm/gd32405rg/board/board.c create mode 100644 bsp/gd32/arm/gd32405rg/board/board.h create mode 100644 bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h create mode 100644 bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf create mode 100644 bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld create mode 100644 bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct create mode 100644 bsp/gd32/arm/gd32405rg/figures/board.jpg create mode 100644 bsp/gd32/arm/gd32405rg/project.ewd create mode 100644 bsp/gd32/arm/gd32405rg/project.ewp create mode 100644 bsp/gd32/arm/gd32405rg/project.ewt create mode 100644 bsp/gd32/arm/gd32405rg/project.eww create mode 100644 bsp/gd32/arm/gd32405rg/project.uvoptx create mode 100644 bsp/gd32/arm/gd32405rg/project.uvproj create mode 100644 bsp/gd32/arm/gd32405rg/project.uvprojx create mode 100644 bsp/gd32/arm/gd32405rg/rtconfig.h create mode 100644 bsp/gd32/arm/gd32405rg/rtconfig.py create mode 100644 bsp/gd32/arm/gd32405rg/template.ewp create mode 100644 bsp/gd32/arm/gd32405rg/template.uvoptx create mode 100644 bsp/gd32/arm/gd32405rg/template.uvproj create mode 100644 bsp/gd32/arm/gd32405rg/template.uvprojx diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config new file mode 100644 index 00000000000..c74192943e1 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/.config @@ -0,0 +1,1457 @@ + +# +# 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 +# end of klibc options + +CONFIG_RT_NAME_MAX=12 +# 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=1000 +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_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +# CONFIG_FINSH_USING_WORD_OPERATION is not set +# CONFIG_FINSH_USING_FUNC_EXT is not set +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# 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=y +CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 +CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +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 +CONFIG_RT_USING_I2C=y +# CONFIG_RT_I2C_DEBUG is not set +CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_I2C_BITOPS_DEBUG is not set +# CONFIG_RT_USING_SOFT_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_PERSIMMON 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_MCOREDUMP 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_RT_TRACE 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 +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL 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 +# CONFIG_PKG_USING_CHERRYECAT 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_RP2350_SDK 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 + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK +# 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_MLX90396 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_GD32F4xx=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_GD32405RG=y + +# +# 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 is not set +# CONFIG_BSP_UART0_TX_USING_DMA is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UART5 is not set +# CONFIG_BSP_USING_SPI is not set +# 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 +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_USBD is not set +# CONFIG_BSP_USING_USBH is not set +CONFIG_BSP_USING_GD_DBG=y +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/gd32/arm/gd32405rg/.gitignore b/bsp/gd32/arm/gd32405rg/.gitignore new file mode 100644 index 00000000000..afea5775a7f --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/.gitignore @@ -0,0 +1,3 @@ +compile_commands* +*.uvguix.* +EventRecorderStub.* diff --git a/bsp/gd32/arm/gd32405rg/Kconfig b/bsp/gd32/arm/gd32405rg/Kconfig new file mode 100644 index 00000000000..07edfefc341 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/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/gd32405rg/README.md b/bsp/gd32/arm/gd32405rg/README.md new file mode 100644 index 00000000000..c131b286a9e --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/README.md @@ -0,0 +1,107 @@ +# GD32405RG BSP说明 + +## 简介 + +GD32405RG是-兆易创新推出的一款GD32F4XX系列的MCU,最高主频高达168M。参考GD32F407V-START开发板BSP + +开发板外观如下图所示(仅芯片,没有开发板图片,下图为GD32407V-START开发板): + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- GD32405RGT6,主频 168MHz,1024KB FLASH ,128KB RAM + 64KB TCMRAM (其他F4 BSP的RAM存在问题,实际的RAM布局应该像我这样) + ![memrey map](README_assets/image.png) + +- 常用接口:USB 接口 + +- 调试接口:DAP-LINK + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +| :----------- | :----------: | :------------------------------ | +| GPIO | 支持 | PA0, PA1... ---> PIN: 0, 1...81 | +| UART | 支持 | UART0 - UART5 | +| I2C | 支持 | I2C1 | +| SPI | 支持 | SPI0 -  SPI2 | +| SPI FLASH | 支持 | | +| ADC | 支持 | ADC0 - ADC2 | +| **扩展模块** | **支持情况** | **备注** | +| 暂无 | 暂不支持 | 暂不支持 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 为开发者提供 MDK5 工程,并且支持 GCC 开发环境,也可使用RT-Thread Studio开发,IAR/MDK4未做修改,如果您使用IAR/MDK4需要做一些简单修改。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,使用USB转TTL模块连接PA2(MCU TX)和PA3(MCU RX),打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 DAP-Link 仿真器下载程序,在通过 DAP-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.4 build Jan 9 2021 + 2006 - 2021 Copyright by rt-thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口0的功能,如果需使用高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5` 命令重新生成工程,或者使用Scons构建 + +## 注意事项 + +1. 该BSP使用的外部高速时钟为8MHz,PLL倍频到200MHz,请根据实际情况进行时钟配置。 + board/SConscript中,请根据实际情况修改HXTAL_VALUE: + ```python + CPPDEFINES = ['GD32F405', 'HXTAL_VALUE=8000000U'] + ``` + board/board.c中,根据实际情况修改`system_clock_8M_200M`实现: + ```c + void rt_hw_board_init() + { + /* config system clock HSE 8M to 200M */ + system_clock_8M_200M(); + + ``` + +## 联系人信息 + +维护人: + +- [ShiHongchao](https://gitee.com/shi-hongchao), 邮箱: 或者 diff --git a/bsp/gd32/arm/gd32405rg/README_assets/image.png b/bsp/gd32/arm/gd32405rg/README_assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..ecafcce5ee48d6db1864c9dbb1e80614e56a68ad GIT binary patch literal 96755 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

izs*W#q;L`LYJ1Dw6rvirj#x&EUZqlvU=@C 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"#*~7dH zFr`d_XIuEW+S_2uVK}6vU?%3lBuh#N-rJTdyfra#>NSuwVTyL-o`+Dkj4~RzMeGxg z;W-7`W>fLR1~)|cje6tovyiu0b@pw0bF*~zRnl4^jA5lnb$O=Ogib~-vAs7jx2#oQ zsw+!4BR{?aya*Ppj{C+ph0R7sLjpIfgOA>rwcp^I1XMrL{?2rO~b>(Wv5=My?}UY;L8_P zmzqMg>r(pR0I@=5#~r6+_(t9#uAr9Au@XBQ{%0s1O&Aaf;xvg2d^36m#Utz(kqQa) z=#4Uvpmf*fqOydP;1V8%EU>?9{tf^+-AsT#^ov=lCJyEb7L6gz?84%MVFf{F4f16t zZWQ(voX&r~qAv|nqV>G2$CB!H(gP#mh*^*m;R}@Aat}GcVE7tZ7WjgBS?9dznrz1- zCLwfiu^}UVLkI%oy$)&v&VG=VO+j7fsd$yqk{$~w_nUqrCWd4VZVlh1q=`*h`b=lV134|5&QI|f%meyGJ=QeC)y?zc?dHIa){V%PD+xh>{ddx4fmHFuS zxV{URWGykT9`0bh+t(2H>tto)4Q|IgCY?K<5TweawM1!muH%cGT8-O$B$F+9lkh+a zpZDmXrFZ&+WHqHZ$D$TY(v_TEk%gY~;LNiE( zPC~D0Zfjs-!~R&46^l$_=gFY19~-`ZTsg$P>%2Iu(W6JE;$#g3vj|q~imc!nh1i!x Y;|}tL{22;}TZMmio9s2dM|O?;A2nT-%m4rY literal 0 HcmV?d00001 diff --git a/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h b/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h new file mode 100644 index 00000000000..29cf3e0e739 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h @@ -0,0 +1,20 @@ +/* + * UVISION generated file: DO NOT EDIT! + * Generated by: uVision version 5.42.0.0 + * + * Project: 'template' + * Target: 'rt-thread' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "gd32f4xx.h" + + + +#endif /* RTE_COMPONENTS_H */ diff --git a/bsp/gd32/arm/gd32405rg/SConscript b/bsp/gd32/arm/gd32405rg/SConscript new file mode 100644 index 00000000000..20f7689c53c --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/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/gd32405rg/SConstruct b/bsp/gd32/arm/gd32405rg/SConstruct new file mode 100644 index 00000000000..72997f103f6 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/SConstruct @@ -0,0 +1,77 @@ +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 with specific build directory +drivers_objs = SConscript(os.path.join(libraries_path_prefix, 'gd32_drivers', 'SConscript'), + variant_dir='build/libraries/gd32_drivers', + duplicate=0) +objs.extend(drivers_objs) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/gd32/arm/gd32405rg/applications/SConscript b/bsp/gd32/arm/gd32405rg/applications/SConscript new file mode 100644 index 00000000000..9bb9abae897 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/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/gd32405rg/applications/main.c b/bsp/gd32/arm/gd32405rg/applications/main.c new file mode 100644 index 00000000000..73777282deb --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/applications/main.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + */ + +#include +#include +#include +#include + +/* defined the LED2 pin: PB5 */ +#define LED2_PIN GET_PIN(B, 5) + +int main(void) +{ + int count = 1; + + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig new file mode 100644 index 00000000000..f62e148f3c3 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -0,0 +1,354 @@ +menu "Hardware Drivers Config" + +config SOC_SERIES_GD32F4xx + bool + default y + +config SOC_GD32405RG + bool + select SOC_SERIES_GD32F4xx + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + +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" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART0 + bool "Enable UART0" + default n + + 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 0 + + 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 y + + 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 + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART2_TX_USING_DMA + bool "Enable UART2 TX DMA" + depends on BSP_USING_UART2 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART2_RX_BUFSIZE + int "Set UART2 RX buffer size" + range 64 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART2_TX_BUFSIZE + int "Set UART2 TX buffer size" + range 0 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART2_DMA_PING_BUFSIZE + int "Set UART2 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA + default 32 + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_TX_USING_DMA + bool "Enable UART3 TX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_RX_BUFSIZE + int "Set UART3 RX buffer size" + range 64 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART3_TX_BUFSIZE + int "Set UART3 TX buffer size" + range 0 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART3_DMA_PING_BUFSIZE + int "Set UART3 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA + default 32 + + config BSP_USING_UART4 + bool "Enable UART4" + default n + + config BSP_UART4_RX_USING_DMA + bool "Enable UART4 RX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_TX_USING_DMA + bool "Enable UART4 TX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_RX_BUFSIZE + int "Set UART4 RX buffer size" + range 64 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART4_TX_BUFSIZE + int "Set UART4 TX buffer size" + range 0 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART4_DMA_PING_BUFSIZE + int "Set UART4 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA + default 32 + + config BSP_USING_UART5 + bool "Enable UART5" + default n + + config BSP_UART5_RX_USING_DMA + bool "Enable UART5 RX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_TX_USING_DMA + bool "Enable UART5 TX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_RX_BUFSIZE + int "Set UART5 RX buffer size" + range 64 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART5_TX_BUFSIZE + int "Set UART5 TX buffer size" + range 0 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART5_DMA_PING_BUFSIZE + int "Set UART5 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA + default 32 + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + 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 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC0 + bool "Enable ADC0" + default n + + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM10 + bool "Enable TIM10" + default n + + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM12 + bool "Enable TIM13" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + config BSP_USING_ALARM + bool "Enable RTC alarm" + select RT_USING_ALARM + default n + if BSP_USING_ALARM + choice + prompt "Select rtc alarm device" + default BSP_USING_ALARM0 + + config BSP_USING_ALARM0 + bool "Enable RTC Alarm0" + + config BSP_USING_ALARM1 + bool "Enable RTC Alarm1" + endchoice + endif + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + + config BSP_USING_USBD + bool "Enable USB Device" + select RT_USING_USB_DEVICE + default n + + menuconfig BSP_USING_USBH + bool "Enable USB Host" + select RT_USING_USB_HOST + default n + if BSP_USING_USBH + menuconfig RT_USBH_MSTORAGE + bool "Enable Udisk Drivers" + default n + if RT_USBH_MSTORAGE + config UDISK_MOUNTPOINT + string "Udisk mount dir" + default "/" + endif + endif + + source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/gd32/arm/gd32405rg/board/SConscript b/bsp/gd32/arm/gd32405rg/board/SConscript new file mode 100644 index 00000000000..409d6be0aea --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/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 = ['GD32F405', 'HXTAL_VALUE=8000000U'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/gd32/arm/gd32405rg/board/board.c b/bsp/gd32/arm/gd32405rg/board/board.c new file mode 100644 index 00000000000..54923688ab4 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/board.c @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2024-03-19 Evlers add serial supports + */ +#include +#include +#include +#include + +#ifdef RT_USING_SERIAL_V2 +#include "drv_usart_v2.h" +#else +#include "drv_usart.h" +#endif + + +/** + * @brief This function is executed in case of error occurrence. + * @param None + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler */ + /* User can add his own implementation to report the HAL error return state */ + while (1) + { + } + /* USER CODE END Error_Handler */ +} + +/** System Clock Configuration +*/ +void SystemClock_Config(void) +{ + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + NVIC_SetPriority(SysTick_IRQn, 0); +} + +/** + * This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +static void system_clock_8M_200M(void); + +/** + * This function will initial GD32 board. + */ +void rt_hw_board_init() +{ + /* config system clock HSE 8M to 200M */ + system_clock_8M_200M(); + + /* NVIC Configuration */ +#define NVIC_VTOR_MASK 0x3FFFFF80 +#ifdef VECT_TAB_RAM + /* Set the Vector Table base location at 0x10000000 */ + SCB->VTOR = (0x10000000 & NVIC_VTOR_MASK); +#else /* VECT_TAB_FLASH */ + /* Set the Vector Table base location at 0x08000000 */ + SCB->VTOR = (0x08000000 & NVIC_VTOR_MASK); +#endif + + SystemClock_Config(); + +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif + +#ifdef BSP_USING_SDRAM + rt_system_heap_init((void *)EXT_SDRAM_BEGIN, (void *)EXT_SDRAM_END); +#else + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} + +/** + * @brief config system clock HSE 8M PLL to 200M + * @param none + */ +static void system_clock_8M_200M(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* reset RCU */ + rcu_deinit(); + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 8, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ + RCU_PLL = (8U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (9U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 200 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLLP)){ + } + + /* Update SystemCoreClock variable */ + SystemCoreClock = 200000000U; // 200MHz +} + +/*@}*/ diff --git a/bsp/gd32/arm/gd32405rg/board/board.h b/bsp/gd32/arm/gd32405rg/board/board.h new file mode 100644 index 00000000000..2e56f9cbf4b --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/board.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2024-03-19 Evlers remove the include of drv_usart.h + */ +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "gd32f4xx.h" +#include "drv_gpio.h" + +#include "gd32f4xx_exti.h" + +#define EXT_SDRAM_BEGIN (0xC0000000U) /* the begining address of external SDRAM */ +#define EXT_SDRAM_END (EXT_SDRAM_BEGIN + (32U * 1024 * 1024)) /* the end address of external SDRAM */ + +// Internal SRAM memory size[Kbytes] <8-64> +// Default: 64 +#ifdef __ICCARM__ +// Use *.icf ram symbal, to avoid hardcode. +extern char __ICFEDIT_region_RAM_end__; +#define GD32_SRAM_END &__ICFEDIT_region_RAM_end__ +#else +#define GD32_SRAM_SIZE 128 +#define GD32_SRAM_END (0x20000000 + GD32_SRAM_SIZE * 1024) +#endif + +#ifdef __ARMCC_VERSION +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="HEAP" +#define HEAP_BEGIN (__segment_end("HEAP")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END GD32_SRAM_END + +#endif + diff --git a/bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h b/bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h new file mode 100644 index 00000000000..d26e3d15ecf --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h @@ -0,0 +1,45 @@ +/*! + \file gd32f4xx_libopt.h + \brief library optional for gd32f4xx +*/ + +/* + Copyright (C) 2016 GigaDevice + + 2016-10-19, V1.0.0, firmware for GD32F4xx +*/ + +#ifndef GD32F4XX_LIBOPT_H +#define GD32F4XX_LIBOPT_H +#include "gd32f4xx_rcu.h" +#include "gd32f4xx_adc.h" +#include "gd32f4xx_can.h" +#include "gd32f4xx_crc.h" +#include "gd32f4xx_ctc.h" +#include "gd32f4xx_dac.h" +#include "gd32f4xx_dbg.h" +#include "gd32f4xx_dci.h" +#include "gd32f4xx_dma.h" +//#include "gd32f4xx_enet.h" +#include "gd32f4xx_exmc.h" +#include "gd32f4xx_exti.h" +#include "gd32f4xx_fmc.h" +#include "gd32f4xx_fwdgt.h" +#include "gd32f4xx_gpio.h" +#include "gd32f4xx_syscfg.h" +#include "gd32f4xx_i2c.h" +#include "gd32f4xx_ipa.h" +#include "gd32f4xx_iref.h" +#include "gd32f4xx_pmu.h" +#include "gd32f4xx_rcu.h" +#include "gd32f4xx_rtc.h" +#include "gd32f4xx_sdio.h" +#include "gd32f4xx_spi.h" +#include "gd32f4xx_timer.h" +#include "gd32f4xx_tli.h" +#include "gd32f4xx_trng.h" +#include "gd32f4xx_usart.h" +#include "gd32f4xx_wwdgt.h" +#include "gd32f4xx_misc.h" + +#endif /* GD32F4XX_LIBOPT_H */ diff --git a/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf new file mode 100644 index 00000000000..c38df1f5062 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf @@ -0,0 +1,40 @@ +/*###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-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +export symbol __ICFEDIT_region_RAM_end__; + +define symbol __region_RAM1_start__ = 0x10000000; +define symbol __region_RAM1_end__ = 0x1000FFFF; + +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__]; +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 { 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 }; +place in RAM1_region { section .sram }; diff --git a/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld new file mode 100644 index 00000000000..2505b86d576 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld @@ -0,0 +1,143 @@ +/* + * linker script for GD32F4xx with GNU ld + * BruceOu 2021-12-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128KB sram */ + TCMDATA (rw) : ORIGIN = 0x10000000, LENGTH = 64k /* 128KB tcmsram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +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 = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > CODE + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >DATA + + .stack : + { + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >DATA + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > DATA + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct new file mode 100644 index 00000000000..3116818f026 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct @@ -0,0 +1,18 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00100000 { ; load region size_region + ER_IROM1 0x08000000 0x00100000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data at SRAM + .ANY (+RW +ZI) + } + RW_IRAM2 0x10000000 0x00010000 { ; RW data at TCMSRAM + .ANY (+RW +ZI) + } +} + diff --git a/bsp/gd32/arm/gd32405rg/figures/board.jpg b/bsp/gd32/arm/gd32405rg/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dece91b3ff233d6f3144f2237818a7c71dac171 GIT binary patch literal 98061 zcmbTdXH-*P^fnj>5Rl$`kpxi@5Tp~Dg(^fv=@NRC-a-vUngl`-P(+G=fKmkM(mP0# z-dpH3p@u&B{oi-Z%$iR#b92vHSt~o|?q}b9&e`>5@@5f0r>Ux;3LqjP0w4$?h;{NGKuNC-D6IVmX#3F$2mh>V=-78MocElNsi8U{LQ8hRQ^N;(!gdPXK@W@ai{ zRyGzUHU=hUrvD}(0uug1LP|kOO2I@;NzL^C`MPNa(32BY5sw0i_yNT9L_m6?n|1&% z06;`a;PyX;|Mx{iOyH3WL{4#wl0Z;N2OuT_0*Oh0|8Y&A4kY{zAfYE^xGkna#`w}4 z#P7x=9+Hqv4t`wL!u;wV7V^l#J(S`W3o9Ethrk`dyZ7!(NJ>e|$jUu=`b7`}N%Iezs#^x68;PB}9g~7okxeiZvf>ZO-q)dmw4Wbb0j`(dF`WW zc-+ue4d>)mL>ET-JrqdUQ{tH7O&?Yf=}N8`S)&x`M^UzW1HhK0UI)-#T`65^^Zwty z2UO<;P4QAzYK4bV`-r%!?e(y6!+;5RpVAlDt~gI64x@(7=z^K8yY;;M%6$}@@pmbC z@@@c>;Op$gD-op&4y7f_8^9u@O{sz$61->@NT;Bk0 z04EZ>(K0uHPly{p(+%J%)>VklOvfLSr#gK1T6FlQvI6LuMRory5`FO>_2f_xWOq9s zeMx=;*l`?War?vBr1|v|^Y*jgy{07_s>A&MO*bsv-kcu`<-H)xOCW?;{sF8d?W!t% z&lK($J-VkT==2V06V{2uU~T|q1$XdeD{-Dpm!JNJSfr9Vc7n@qT=FFU57_l`W0ih0 zDd63~3{X?IOVY7yZ7XIjEiRM=FYbW| zqCgX9O1f}z8h-ZnH-HfMRXCy~6TyrBb3S31uW=Ac!5hm$zmbV86LdL?;JX1-mtMD` z@dmm#fFUs@tk4bMSBV0J^_AR6Rpx=+FK)j}l`q#J|IinH1aS9|OJ-U(0ObwBoBtn5 zB^QiZ>hAeJa}VPuzmQRkMUaxOj7rKJ`#_w$%;nGS9ppQ!QK;7qfV@wU`j2>v|B29M z8uo4_B)+twE9FT@_h#BQWLfSIrR9xr0-Yr$uEzNN8E4xDHZKB2HndSZG8EwI>0BF>n*>$Gm=upg1yzE7w41*4J65xY|*XHZ$B!rB}4Vic2xg9KyY8s($>BW28^TK5anSBS+Q9q75B6dy^49m#sB{ev__ z+zg25fxyO_@Ud3WY^`p27giF z0kg4{f1*}tGQ!T^Q1a|1@r?G15uN1QoBfJ!MTEBeQX{U#G?qzggqJR2p-(EpyhQ%- zy^DXnyPoHSY;6|MV7Z0dT}0v}m*C`=FQ!jVt~1>{3S(Wg5hm^_-Gz{Z{wuEgGMh=0j3M~p-@xJ2WvX&_iH@0c24`f}6W9&l z{hkecZW5f47jQUojW3NuTJzE)4lX+9?^WV#s+=WOVx*?64~RS}9^L@dQNfSsEh`w) z7mrHwFzKCn>9~Y=89v*j%sj=nWR~{G%E9nTG{ekBRc|$`c<;&1zvmrh$r?N+waWC- zBsA)Zm78i^iF_8G$DBH}=Y-X64rjxwZa?&K$q*=92pwqT2gHEcpVs&{|YR!Cl&<0f>l_oo_5U8r+? z64{)lwGyFSKnT_C-F^pqBvbZ85yPo=Ma0%H?2q8I<~mP@Q2VtUA{gPL_Rm)OT>GPA zQ1;AgHa0M^de5R<#+*7tUl)67if*50jeJ=>>Lh75uZEhPw0f4jB{mti9OJ+>ZL%Bi z5*Nx#Zui@vF5@eS6dg0e-;-~T$;`4c=deUz$Re##KUQg%;ydDC`J7s+=V?l|)!E)d zNNn^=e(v-_KGgXHCoXhL9vSIZ;i2Wopc4vV-K?X4Josbjw$X(y5lX|e=eK=t=oRSv z^t;EBQ@A)9+=CL+Q`T|M4gs=p*L>@ldess%GQo8`wV8z1PeJ&c zR7AFC-1#*ke0k3^#mBv}ZVToS^)yTde(WpTvf>G59)(H$^^Y^Ss~Y%sOc|7L#J=3< ziPu_o^e^_C-mN#M`AL$N*x{I8{Gro=k?gKXNE>$%ZH=T!j$#!-HMiECb-s|Zbt^eu zDXtq~ykOJRp0VEA_XCM_q1GB=Is;PDs%+>yL$CWCL~TbP#d@B4{c!x3&QRW{>1A5R z{(SqBtk!=mRy2{K(vy{MGzW$-()(?X~ZSao2>p z@5t>g%ad88M2XJ8%IxNe53R`agd8CvRN)Jiu6Lm_yQb_HucYz=-EuaKyc?%U23>?( zJR!{T2@FAU?=2`^`GU4zjYWJNEXcu){awEnC_^?o_uK%c?kO!P*4zNHtdMvnB>n>q z9-PY2btxn-q>X&ZQBs=UFPYpisoiJ^&VUsHLNf4$iVE6D+F;A;fu=9dYf|;fg5N67 z7&7O!w6w6x0OOy@+q*XA|3f}pHBDi6yB;{BS5JjngQ)Si z%a>jSo9_6CiS}p``UT@T<7V^JUK=a2=K=Z2U@$u$&NMZkYsZHVcJi+I?>YnEu}X_9 z25=DcF|mgGffAkI7w)+{|nKCdDS3g=oL)KNn9G z(IS8Rg)2Ym&TNU#(v8=JU2XIMP+h?kEAhU3?n1lAklNc?>A|e*gH;L}tCn&~co<~v z*JQg1D%`ke<=j223bv$Mikiz2K4ESq9BgpHSvb*QDj)e887;J|{ix%--IQVIxUy`b zXzAs3Tzd(J6km$6=1-z->W)CYEsDhz%TO{UF5OiNTW!I(&vez3`eEoa4DW?76fwN? zQGD{L3h&_oLG<|Tlm5|qm8_}FwC_n6@(M&wY)as58@gFj26esn87LYM5amDd=Tgwg z0u~X(E_e268)<>wwOKU3Y<{T1-l?V|BT-x&dd`z_EmdcNY_Gb*JvfcN0no$Hox0t* zU&trYX^#>S$4f%pjgQowF4={b7S;NUE`?r&$k|>isuLE25b=U=oPWqfC4zuQ`_(d>W6Q<5*uj-r zP)jRjPHKp3l0BL#KP)i^;?+s2T?CV=QVb*P2IWi0)mBkc=l_JQb}2Bydx)XECLyR{ zEiKK0N+AOI{7=>A626RSSr)aoMJg{;)hzoR)K2XWHsrTlL_d^pW|lo6*hqpmfT)~n zh8XnOLF5g9m>@)Y14x?ekJX_sUly<*O^|~hmGBG%O;K99n|U3OO)$j%le-?rT58%C z2NBD6h>WGC)n4993Z=_uqL+{frNh<##Yb7{-r=^EW{ZdAHG^a3|C;_kW(h_Vh4A3z z*?&)0x(c@pLMHQOuD0PzYKz>+>%0 z!}=r}0xH2ob)<-y%jLwD^PX6IvdU^hPwk*?#k2VOaC_C-qEs)&GV8(}MAsR6UZqK66unfS*%-&%bEUl_<$U~Pf>FoINvyC$`0)s@b_f; z8(jX_(sQ0dX(TN%#t4b#Z)*H7X;jY6cGu#pQ=N;jnhZ^0c|u(!Q{b;1&R}k(Y38lJ zqeH-gZyx}62}9^JF7mScTwmKHKMpz8h97$E13g$?0yoC8SyicD-ZwR16%1d?NgUPY z*O(*K8!I)24e#xJ+M$1Zkh+sa>>l)~pLi?a&jmbatRGu7iuX}Y8pJWTBOaJM@Xn5I ztJ#{`jeD=(p23dyz?8-sjn)+<%sKinWX@|##65q149KAUwTXJ|w;lsuR%`DMT7MBd z==0NoSl&ms=IJ-($18E4xEmZ#98VB1r*SHe=lt)wv;G60kqF(3re8mqU(3U!h<223lKQvR%GITJIv zH!$A4^f6dvGsBnL@#HK=?^P~w5jo$HBo4WY!9G%lg9z@AwY3@j(dAi!%7GJ=ubG<4 z0yh!+zP7^-s~kGCiN$jtl|d6@SS7@LX{P3HS45kFUx~ZWp&*HKi|hQ|WcO9q5WC-| z_2r68Bd5mr6N9ht=2pkX71vk?O;q|9A7i?}oix5Z zd{~d!Kvi1Iv(UA6_j~aSJ~VO@5%{)~9=sR!w0$}*qo*)KhyQ{qq7jhFNyC3|qdLys)eaJ6UQ;+@p z8MgE!4a?i9t-03L#_`j1UWGU9pTvXM>hG?~C7DL}?4^Dh;nTE+B8{~e_x}5_iHyM| z6r}FzfCRMPW!b1i6U%j<5@Use{?bI0aAoY1mlYO`Px*cVW4n7PsA$M&+{HSD!0k5x z?)^sLfalotXbbH3FZuY=UB{DxqP|4oi+e=i#5)kHDwQ4(2$lWtiN#Zd%wjZg)TQ7-oD_I;8fut;tJ<;Imwsd;G_z;x%XcL|R zXT)G{0GIsdN-;-;m~tFho*&L3h}SYDLb=ZbocZZ4n9aPo`FuG*9-m!=U~NBesC(9C z>>%E3AM=Pj*H2IA@$XsN$<0|5_|O<(=4u-wWWzoyJ}Z+fDaX`CS!pD(`0xC;lG=i89UW@fs$!Nk$-HbkXgx zVGI#may>`^|5Yjc_$RfTbY;jf$>(o>8dCp;Yf>c(W??{yGNnRz%2LO2yY*`ZVYtyB z9F_J1cjGNr<~X~txE`kXhw5N(8CmKwI;t{;m)*$Z*^iEVd)}#654QcuGv+e;s65zL ze!Y08Do!Q~eOXiFKiJC4ZGsq7Nm)Di=Op5^XF8T9P0Q4wezo#W=DwQW3Ac#lYW5{{ zz!f(Cm2{dw`sR;mhZ7$_5A}FP7MLooEm&nSuASa=Ca1gaXVUJAJKn#lEc3_w89zNU zC}wG8HfF-k7-Txcr9ye;4(^s)I2OeBTE7dc*y~(;g!VhLU26FL)eEQ8&H;%`_65<;S&-|imIz@pGfwiqGmPx1;ueIdxvZDtc6p-89 zAZNb-LPRDxAQJaW&GJHH(qvmYExbBHv?zPz*q>WrMa7pZRQZko;trH5Y*eh&yaLbu z&D5~NhxNmyhKCFPgR+6T==Klpst?5mO?}sD2RRX-W<}})bTrhsL>VGru2C8$1$!(m zcfyV-&12y{uH6md)#8>`9&z#<6j4y*^o$!*;X6|{*C4UY+Mlk^JgEY{!pr+OgeqJ8 zsiyRGrc}rcIY(D5uwz&&Oyy3ApBl~Vb59Hd@J7^97rp8hH2w*3LM8ZBWWH$24S@A;&;hrcf|UN(;y8gQqIe9rfRD?kR1Ax5Ss+4m znApwB;{@7v|EjTMy^La8&+h{$sJg-$-Z^HLXTC29Q1Z7eK!mkV_yzPn8}%_tdY3FC zV1U`fb)QPyofI((>J57MPf@^Ndi&IG{Uj45;pp?vIWq0L5`@`o1JI+V_gG_v3zamo zfiJl&7QYHX5vx<52D3L~8UlV}F^i=w)Y67&gROqoh54o{&7A{Rsj@O+iK-7}I(;`y zD{lZ)$KO~4uNmM>tQ*XgT#KH~n6PIh)U#(=i=?GtP}qeQzSs*+_s9h1T751NWD#~d zV)=#BN_WqF)m3h{47ZNJ;|8mbjhFIVV$hWgIe7O19*;ltW>JH(?|?7Z|Qn^CJe(?L5`y;vdrau(5g19(~66i=$_5oGlR5GwBPfeMt_d}|x7WXnss zH4SC;la2|{mQ16kqu+W*Vy@ojudx^m;5&Hq#(Z`OxtPT}b!y6r{eF>GUUy+qKK;j* zp~$|@ZWP1WyHY6A0-&ia^~Cc-#cZ(?I;pK`*`r5J%3tt%kYvNtZsv3`E@x0!+~UM% z#QMowyiJ{YQYR1Jgv+}eficla7FU!zCBcL9Ts)9toGuBF#&cqqxh0SGL5}Cg;qM_e zBf`gI&t55$h9-2&g1~(Alf!l*-bxkiRg3|&I62eae`>30F`uk&jUTWxLEdA6b5}B2 z>(@_&YKD$!DKtEsO0|FB;|BYOkJUv47}(eaY#yM*4iujNyZOTA|0wvMcwoK8!vdX( zw(EAzCCWbSS=5hGL=SNVPqpwRBy_q9Mc^H=@Ws50Y!CY-C;02(W7$tn1OHfM6!Ig`6|NB;LXl7i3qdj?!n$}CU^?q? zFECI0?q|JwYM;JOO>n9|))I2N{>^;EwD5a8vaO_cS@}%}krzLW%3_AR$F?c5FhBus zYq@NhKZ_?=;tBIV>25oz`GI+0d_h_1JQb3j@|%{MQt=XB-hT)TdWZh55V*avz-4zL z7BrH2dfxffFF@9nVf@(X^BCBYp8v>FJ{r_(9tQw%>HnCz?(^ePkC^GmxNE1*@a=m} z?L$=`VwEk0vkf7}c3$cL*2Ta3za121aZf$8`6xN&_np<)i8R>P0mG{dL#JA@d?~$s z#)(++9Q6Z=-f#e8y450$uEPL4c$|F zK}3QZ%@{pX^Ju`^IxSuBf|?~jY1(r3D<6A&|Mc6lg|0>elG0H}G9|E+tZMWtJmWGY zKj#&{v6qIKU;vc>sQ|#^Ae{@9){Wh7T_8hDkIvegisA%j-9o^fX$g;OWqM3(*}45k zr}uYoOWRJ0T7S@N__Wr}+iU9m1)(+ED&0^k+MvdY+9!qRi`!jG@}i*nv_Mpf;%x(# z30>;1<>K87^)Ha&QL}&zgNYhP{c+reQF>z6Nq2bBpJI%&6_L(s`k{p8^NE3LYP>ae zyCe0mBm2L%n#wBtsh4vNrT(|))bS|z5yM^C(&>}6OF_(JT?qrhu%4|IYY7PNa zlo|3DoRjv`I!!^64T|Rr?bLqG5@#jAU|e}JJ=dz1Y8W71T#4g?`>oM4@+}OXGYOsV zG4o+^X+$IU)HZSoxD1PC@k(-3b?#;d0airF*9#P=eUR8J&(ecs;U!JDBpHe=6wC9OkIOjdydLTJ`ROH z{@2-ZjV19jJGueLl#<|--q#Z?DZDUrYX~q`9A}U42v&a*)&k8C`t}=7xzym$ zA+l2sU$!q^H|g>q%TLEm@R=n%D*}gI6-mxm;nX54w)d%9O6~rzI2KNm*I>Pg;)6>KA30uo7^#*OC2op~ zS(Uld97lq0Q$RwJP#MROg#l#P)9|CI5|?_HWjk>66Bgqg?%Bn=e5eb{@dCt?mLO`J z=Nk8;t{}cYwJ($2IVX#&wD6Jk@DXwn`*~;^oHk|>4>PQf8=CLoPDfSk&%Bb9(i6;r1g4=JAwCrLs9t26v@YWEwnJ?6(T zeF;Y52)@_`kBrtvIjm?qj2fSVIgJhwC~#06RF;czNYhInF5tC~)6Rn^Jb7gOk;+ry zng5rdfpc)@%;mFXwPzsbe&s^o7D#ZuKD9mbw`g;}Xa}!--I%0Mph2(5vm^a?Y<)8G zCPdwX{6AmR9>X(!OsVO!gWTTn>I81DmZCH6CTZcX^2$c`k!9iaEayKqSHl*J)!Fte z$N;E>u218wtinM@j>9{8XHB=;@DyJvKq;>9OKuVI`bAKomP) z=4Bp;19q^ShkyCB$0A>@S$&}#w)Ie@OHzt56K2PnBB=43!<^U5Aldv4iPMXRL?m7S zOYEhP@h<0KMw?P5GY;Nf{G|1o70XpO`2NyyS?H_Y_{s1i>W(QhlBD}z+kh#9%Kj7I z159uWF-N6QX`t|mP1EVNb~Y$xOGy^2i{ zqB^PVmtii9z*^!0dVB^#bMJ62S)f>jYx|MHi*&Lo)cavh}D%!4nD z4q^=IS7K~>ho*b$m^l9>kVig3tJv{{`^zt3tDUuf>Bu)8KI-ARwSEI|fU!CR$>CRv zEA}BaT1$>JxYppMH?S;O-sclLrLCDnn@v>L+#8CV!^Ok%!>#|otp%hr>^?GEhS7qv zqZ&t2#=PWPnOH4q(=Iie;d)z34}ac)U)nbRa=1LHYZljQnHP z?}gm;1e^hBo~|aoK-#>3tDiT37GufiiewJkHpJqn0I8ngKI&ft7X$Na z2BKsBMooMyMwBk zxQ(siz{;YHYu9`zBjdXATxNpwQ}|3qwgEAPf-8($Y~S?uh1ex!y0k9E= z>PT%b>qoxx+Vs?lHD!~0rW*fvie%9$*e$l%YInf(5&Uyg)tlk18vu{wObwSp_<`~K zjCyVYKU*_NoD7C*J?%nq-vC?v0qV63zvY=ey>vv zlwBHwbo?prLVf9w`Mm0*$)x>>)KEJlo>lC}>XUeYEGTRg^`ciT)gH-m`DF34@N_F; zrhDeZD~$xPe9QeI`2Y-9uxVuEva5ihR(e%kCv`6IUH0i8vd>KZUtA%H!3?vOki^u}<^f&(`SXOX%M0UQ9AM{#p_iC_$&Nl0bGV^odKt*Gb4> zJo)|%GgtzuyDS^f;r~dc%VTGXj5%x9BB)&33kvt|G^NSqAF>8Bya=&ySm?_F-i_ z^w%RJf*OlsqE?Lv3nI%3?`FGXWlrVh?&h;-1@h7yPxWfmeD3X5CEK6=LWAUu`A%H% zZx`U&BH1MWK1~bd-G2L+{vae+;rx7JNKW%>VNIf2dK&wK%?A@!e6P=#jTkEdh0_jNIG%YDl6!<;!k& zgN7ULja399U*N8GJFas)SfeDit9-$6FVJ>tFQmD6!uU|3o} zjdY*c7AXoE?{}E_U2CusFHf}+EW^&<`10yU1&nU1iT(JGu-bsOxH+Yvagl$D`eXEG zUM}wTxZ1^&(ndXrIElEs$w?L$8N?|t z`IRh`TLCwK3xP?*w|NtX-xVh@`4#TJ0rfwrKLdX{VKSPEEraG#&MUST+u!$-MHnGg zy*RTEu~gEz{2YALn(S+KX9TUR#Cu!9hm{Zo=`RRB=(zKzw0@7c?lup~D?_Q) zt4$`Jt&#Q29iozwE*tKS!fMZw9kcNtwvDT561TP{3@ShNlq(Y%0=Zj42Gm~0VYcBO z*8@^@4NYwZITLI4yu0q7j8xFGiR3S20K__g<+@_swjjn)Nm%6;hfStp7T!fHm_clS z2)I%W)%#ek3R=~ zorLo0RPHU57iau&k;)c0>=CXQ-(2h7Vzy4u8MPqd`}IOahMkS9p{w0UB)Y^`&G=V& z-NQn94Nrg-D6FyuEW3{VDW{zrk(A%%^xe44$wu}~7^jY3y#M+{F^f-6T68Gk4%s|f4^;?1c_pM$`d-$r3oqA_%baYcsj3Tu&bZ# zhYKyevXNtLMS}S#>ySnE-*$M=BB_F6Po122=|+R8P3*hZw{iS2D@$IcBFT`%>JyhiA*3-~4rU zRZ)8^LnT8JN6xkh|5m)(S90sYhc+q{P>9Nt59=^)EU?=% zy7M~Pszx`Q6aA@(d^N^ac9G_*<5ADrTq0uo6b&!Dt{hmvBimRx+Dzu{&&@^!TI_RQ z@I3ajW67KbBk!CC?{QU& z{gfhSe*u#LSMsO?!fs!szB`WEIZka%F?2Gz%j$-Ts^3%TY6L*y@()WWPZ}fJ=@Eam z5(QJJdHjKnjKP|}8J>QiL0HguOaMQe|JM3lF;Zk%@heo`U*aN~t`+4++nF;iarNj$ z#X+U9mgC=Nknp+}uNmY*{doL!M@0({U^~^{x6hHW71bX!1b!Q=KH;Q2GY^ShXO}ll zNJn75BMa~!2Nxq!xu)ZGI<|Jg|UTs7_cx`c(PyJa4NlT$nN}B^;NQTA$20Mane`M~zFpj;fda+$ zb&919WWQ~le4RL*DLsiyR?Mg}azk{6oho(}ht%?opE=$7`o*ak7#ECz4sQ{Hd4zPzOJ3}L6mm&uWbYj$UUt;NORt+R zj4qW%ObwOG_V0|In&L9Gbv!*Hn$?#o!ea+si<3{+eZO z&$s2=A|Cz(hzb8*DBT99Q^|>NtWr7XqzNc*3j(b3SuOhc>$leFpi501V1f1?LbJ0^ zZ_mzr=p-T{2jfFXYyojs9`IbpJIy9yR7Bv6M<&OOVM{U8D)ZFxu<8bzL$)8mGoMyg zydlAUW>|-!+t<8RWBSd04mxhd)KHB=kShut-AV?E=RH;cGQB82fdz`ZTIXZwRB zhoTLZC9=o}pR~9-kmIr1#Zz1Wp|7)ghfpW=v$~jwy+jy)R+Pf8{j*A$*ZPwA)lxf_ zKUgd&V?p!6b{W~GwZMyPmGsYbh~GH>9*J-fUP)Bg?A-<1HS?iOg(AlkDe&kEP0X97 ziA&j&sR8Q#{*+;lt7RRcP7sp=>*yJ*T_5I#P1T*8N|Y{JSo8Svw+0oe0|MhpeekDQ z+hX`$YVTeXU+=oWvC4@ltB*7Fkl*jENvId&Rkp}~z$>I%;B*E7>=XOE@L|*5x!n?h z3+m5$2`qL!FMC>K7te_uw_-uogONooRAx1msB$Y*XqZxVp=e$oGJIY{Q5O3)qQv=j zt#5fTDAL)6%{dBMntA|R*u1cdo4Kw4;)q-q1`P|GWL_ToZNwN5LQx{nm2Bt;(LtGlF|pc zjd(iCQI0phL}!4&=8Q*iXUyjpSl;FF1f1j2c+5}x(`e|vBirXE#81MB(C`=90W%lo zL4Ec(QSDmXooG9OF}(+GTkF}GkaWjTk2qJM#X-QO4sL(v1`x!l+GJNO{V}C?Nj>g4 z0|hYjQ}bEyik`5^uxR#0D)@neVbrZ0f#_zoEf4tJpcyz@MZfgY*Q>nbX>E~!%1L)_ zGzpEW=J`b$zDxhA25P$;WfSv)Rqtgosl|o47}c?0dcsI)u`lccRAU*9<_OPAUo(s0 zi;yX95$l{HHE`?Uv$Dl4hjXU*Rqur4&f;S*cj9r+*1BB0xZ6wgNxegLe7A?2US&J= zx((^~H+AyvBLqu2~TJpyly1;1ViC|mCB?{FaOtYZlKhJp`Ls;PjeH=hhR*1X zW(_-8)z*4_ARlG%kpcJ+itA*Hv^keSk(bZzWJv7lP_`8KhEA)eKlDa(jt0B4*+S@O z$n2Y#C75xnVP2G=k1A_V+cihd_{DFA(t@4Sn7~pQ7v~0 zZM|ci3Toaqx_4#;bol)OW;A{T&Ys`ew5$nFd`8O|n#V>=E(w!tIG5U<|`-&O*Zme(qL2DEV%c874 zwM5Qw+0NHHo@C=}eiC%1t#GsY)uh^;97jhlBy~ZJRLaf@bcRN)SG}hTFi~EF>h&-U z#Mx>SybF4Jr)6U}B{WI&vzISNxfZW1Dq=CwE!aQA2(CqR=+dUdhNymtn}~pFxGl3Z zWa^JvjpPwZ1}5LT{{3Fi{D+-1xtfnJln6o-#(aFIK;LctQK*V@S5lnfr&9XiV;BQM zZCU@l(?TZ?FK!^UKz-V($Hn>E$q=2o^?e;WGh*7~Qtz<`eQvc%uF}1MgqUbckU#+S z2vp6#03Z6#(uGdF)!=2;E6TfP;uP#8!4w1P%Z*f5-zprp(I0sDswZ~ME1Dwi-nJ7~ zp9hyFv=#{&>&b+wHo%(N`$HHEABASf1G`X^%y94TjCGry`4yK${309$2 zy@{@Y=br!R=G>!ZDTj8YeanG2emrvPe`8vwPWux5V=bwfnKhs2(WukUTC6S_P7#%ViBf13nojO`VPf=A!&8<-T2TE(|a zK++G>SGZ1@+nx?O@d>!fhsx{CebfjP{S+lW_ZUT!MHKgS?yjFw?GFw~b{YC~}d{7BW%fKcbTicnB{Y5M2_vZ*h1;`g<& zS-^&YvD5WYTxP8Qo4PHrOVg1e+hI6$ zfaG^OKlwY!9s;`!?Zxu_LM}E5!64xU0FC3ncTV$ADIvz@n3H~ndpfCi;-_vGTfZpE z6{0|(pMHa&L}&Yn4pd&0h)5fE8mS<9wZ3F{w;sP zAL<%R!*sXPm|X#1TD%h=hyyK^cI-#hU89#aE>*rG68-&az8jB4wg1Z^bqyr*h3Yew zB1H9ZU9k&zm%(vQvFd~=VXmwC{ka#pU+$A}7> z`EX9FF`;-HVbdx^=@P-ColW}c?y)*rrb`guE@qik-BqaXn$6CX54)n_pA{hOU+oTwvl%lxXz7xjNl5o67AhaD%#4<+jP3ur-=;3| zZqHI|w#}`eEAo{;4N|UHnUIQX4wAtsCSfo>?{?*Tp$p|jJA)L9sibjYN!>@KLp8@5 zg4kZT(@XDhQ{UIJoK;rn!L+mLwj02$de~B|y~~3}Hf;|w6Q|7AVfX68dSoGHL}(S$ zkMj@kRVVAVZ5IZiT$IRawcs3-s~Q`7&I?8H@gN8y^(C&{;SmgaO0RLzttG>d<*pe_ zOA;0*M?dIy(X{9iy$@BvUf+`>Nf2?ewHxhLv_UNv2-X7PVbD-{{V0cdn(;~}CrP#- zW)mX^Dq!+&LSM+=fc}aMA_Z5PN2Uq+h?r&7B#RUymp0np#_fO$`K^}^rx6h5PJ@KO zrU?lL(BML)ehgIYM}W$>XB#xW%a>>Tx%rr%*?nXjWZTL1+qTt;FTX!*BeT`|)iT zhm^v*u?BSyf_L3f?yhrg>BQ7l_-&nu0Drf&ZC+a88$jjKOHQa?1<^^OD>qEHWhFyq zP;;~XksvyN`8%gD?-BbWtkJsZ0G%Kts!D>V_I8Y%sK@`TCTFBnb5*TC`HgO2v8rb zH(&ls@(U;0Hp5mt!hdg|_*Okp2+1DQ?5L|iQolKf5!V!A5yvgGwBln)WifhZbQx^F zNGh~FqIl#0a=U;b+FoPft^TRQebFA0vr=oG7L6}#I^E@nWqL{zf_U+mb`I(2J<(mO zPh>7)ZeZ5vHZul_7Ah4GIHU4dFiLVTx~}t!Z{AiD)$aa|$hR4&JN(-PaW1jASiIj_ z4H}4l)P63|Ui~ZJVdA1>v)$0vKkh$jbKby&4FJ#8#wcx`h$LkMHfD>yll1TAf}Mfb zzdrvm)H+ca-VL5fje*lUn9BZY8WmyN5(yCn+kat@g{;`_(Z>V00o>Yw;nH!}f<`lc zeWcsEclo1(cG6JKUeoyUt#gw-1d-JT7%Ig<)g}F1h*d>IoJ}8*Hs&yb5`2ZiLdk&& zavrK#f$Uhvc70QREOlQ0nWapMI!RxaZ?+B*rbJxTf1(>%!5RzIE*8>@tcKh_Xu$%nZGG(d7eQ2Jz>*T?OqX3=dr? zTEhlO(uX&=VKM}Tb1X4H{gDs{nM5P<=%0OtF?*ALGF0GNRe&O`ClL9WZtDiqLlb8o`*EPrRpOAgy&Mebm482EU&0~ z6DMz7j{=A#s*r@L?6;hL54T)fK$*(mc*-znx+xemVbJ9V%Lg?G`51zni4MT$HRyM) ze`0~l$Xjlrb|?&ZyIfXduxL;504Sola!gbXa+NzY5sazl#lWMCmI#s42wlU0`iSbr z=;ygyp(}(E9aKi=9~iYGFP(&fl)QrclJ7`yGAcr}TJ=DlCO6(SuxvPfzAN*3bY5BFWRkWT*cDhQ@kB%qtmlS&;xd}G!SEn&KwT)GbAZg zg%49ARE9f_LwiianXmA9&a_xy5)SbsIVGGoXMdMK zab645_+e>7Q`gh74mQ-SaUaV*i zkT0ypwu!k1k8BCLhkb*YpS*mS^ztk03&&r7`nxbNkZ*bxAY2bE0p{Ns|L57Vmt2W}&A+ zWEu54{Vp&Y2(^?c{aHciw+%2z8W6@Vb6TTHr^Y17d(2UclK=p>n2B_ZA{RcaOOY>7 z_a)xim-ODlIZSgV3WcW+U{_5qxT)JuNaCN_u`;KvtY@+1vIsh- z`1@DvygZvz_tl64eTrbCH#X2CZ9M?FA3$u{eL6zj005yR9cHE2Z$h zVM{IJ421&3c86T`&c!mNuhYt?`Gs)JCsmp;Ub|=Z;;xE&8jusoQ^CmVK+to(RmHzN z|Kes;AMJ1N!{rg^)<(tAdfGy~qZZyTMdOEZ)q#odj@kWv5;67-0Mu(x@<=h3y=>&& zgLLK;PEXZ!@ck@0+5kFLyT>V=8Dh_vUh%nCO()3~*!RxZ(chMTop$@n0A@IC_ked* zZNYP$e*BHI7Q5Vl3M01Vr@U2ES*=7O*G(WG5dfp|St>=tVolPP%fN&g{ z!!-432Gg97W=MdF>uO5|nVv3Jq8OVDi5ZH%>q+K2{a*;_#ip=JS{Eiin`kHCQ-JPj zTv#@kTa91{YN*|(jO22InO5|=`xLEC*37oR&p3CQw(F7Sbfx;G_pN6zl%l>EB|NtD zO;JDbhr3z-GiqU6ijzaga^zPpuWtNy0^1G1_IyaPc3Fu-B)l|a-!`RvVaD7t`7tYb zQEy%^p-J&wyu8)K|3TDQ#x?c-VSfk`(#>dPh)So7Ms$EkcY~BLI%IT7j{!qa5e7&~ zcXtg$8bP{SV56MW@818xecunx^Yhy4oU_mOb6wZ_B41nNQ0(oZtB^RM4ngcHHBWOa z{T@tp6qfB1`UKZdDguNiKi-h$iT% zNNI_pcYn|Qq`y(BbEDdTj=ui;COrZMvb$^cI;|ww&H5!Ap-9_st6`3PoKt=vwo;f_ zHQ(QIUpKznCNPU&d{b4_XliE{p}=-{2gDlgCI}E0N~U+_DU_mgAtqJ^*-khnWQ(<5m|?GW zP3%sHV6BMEiq#Uvm0~%3n07LcfYfqC@GO- z?L<}v8*X?IhxPJF%=)jpE5o0ECF2F}5mM*fK$%T24jqFLg3F)Tc#`QB2FawseH3TI z@@41L1FO{Sl0E^I^2>!8Nkt|r6&-D_T*#AC=*SKThHgj?4eP^bgCAo;zD!@>d=LMU zR?#)0ltp*tBZkJpc$6$|Fm*Vg6dd_$to*)ykxTR}C~61xnvOJuJw=_}mn+)^C%&!~ zcgVYGDM8osAf@Q;-6;6mB9EmD-`waqtD+V)GQsGY~2| zD{& zj68Wp%$6&CVik|+8sMbB5@&h@0}F0HX*9nn>@^KRf#28Ysp3OU)LdgNiU~;$_|t_y zRwzfRX8q|=K~jFB$}?5zVLLgS$R7sb)JhOdYh`QwW}KKLESUa&=XWnZKgN#!$^E~^ z-Q@A*XP-6JD6-h?Pn8&#b|trS$Szc;gPGmv#|17!U1PP+3eP}H1yL*l-de<}^5K>9 zl0);}mD*JdbRPN<=atX+`FXWnFAOr7|j>+F_XjXFwyVpA?P^+c0k?_gDgqjVLs7HABHmXkdug$)huv_3Im znTbL@JnW4t+q5UT$&rd_&&Uvan$5ICma1PqQIvgne%j4VL9vpRxu*X4a>NbTDH)x?o;qZ zpdm53MYhr)?}?R|w=%Z~A4=OjCO0{k>4mYQLG(W*i?zT_>~IwoE_MA{(`kco=aX0d zisj=%n=)t!0om5i!f+&z?7lfB|HONo!}LUewGaS_!iN-f&Vsp| zyNL{_SN`6oS~KnE^B&hS}xrH(phs7bT@D@(~A~ zfHU3)giY+;K4bhtiq0oY>T7LWR0ra{t*Atf-{wc64o`W1x&nx7ylGOu~LNlvPr&50(-7M>nZ^HC3K`@>qg}-wu@9d zKhU-{>}0^b{}0foz|vOV7QCPy{MXF)k&jrP8#hHM%c+t)!G4yp;{ z4^Q)>4kJiFZZ?zX(|5mF&LY<$A0+!MF3o)mCdbS)%EWYRXoyngMBk`0utsM`w{I9G ztlg_)B0R41N<}=NwTj+|h2033s}t?aTGtM5|D=+ui&P$WwW}(WSHk8*hSE%(<0H74 zIq?#0lrS@w2NSAHfiv=O!{K&0VaZHbG^@~ZLaFwfHG=VN zYi``GDs~*7r+tU_5VrCz_dC0DZp`jqFvS2NGd2tqNmv^5cRe|=xBv8kZVT(rx-rpv*!et$*Uc3{Cfvx;BQjrsJ8Lz9;E zv@Zr<86w}dyU8Z(!s+Ds_mV%LfU|PcnDLhr7uSs)v#y4D&Dn)#8c*!%gaY_jw$9Xu zZ=8_B!GwX5@-k=o)APR^61AMn(@D71Ij5)$)-DF#-i<4eXvcOksb(1t_(|48=tK%o_b5udW7ps--P8t+-uU(_dw92Z=26a4XH@spu6-s^04#(09@pO@2y zGVaDonh1eTkGAX6dEXO7>%|HpaBH_-)?%SQ0_9iX7tk=8;`q=x&RBntznMi%t(rIh zAq506`t@;&rXGNmLf+Xw3n%6->9#$zmOikeZuu4Z2>L#$K+f!iwThpt;DThspYTW! zAkr{BoQQ%(Z8!7ksfPP~g*(`Il?(0%H3c+>MnMLDyGEHeMkuakq_g0wAGDn+0(#o4 zG~PgpXUaT8V8RMO$hSeuev*YB-b#Z3H;04xIGzqRInwWzSp(CUbX&%m2SgsccMZuR z?&j47aRSi6b2X*W2tYV>s_Gue<4)JxJfViK$#5%*>M7y1>7!#C z_228?yrzvvvNhV2fIpP#Yhl#G>xyLi3x)$zD;DPYWPEzB>zEz!niQcl@DKmbFz8pZ z3&m(J-h!V(b~BHB8z>CjV^}0yl}XsV`-r^rs~8COQDk$%7q=2iD~o;XD97d5(^wJ? z6}x&Vws|R$^xW$eJuITeO`jgApl~dedN*&BaI1*TDhaNmDJF5 zk%cy|Fg#(1YfRBei{Ux3IfVqyeS=+*^XCxZBFXoyR(@yzKh!~f``#yA>fDSZDaobg z!I5C~(F#&n-Kc)1Y7-MpXVA`Q+*!qs7DF4=6?G~l`S?L`WZ^E!JpP z9o#sFMzTziX|-L-8|OZzO!;vG!&|5xJqic$qFH%Fct~cc$oQT*jxg9&R_;xmnd?J)G4`5A$$?nP5U&ggVwk`1Mg-b>jh0_EROm?V<=#37Uwo z8?V6S;Dgi2e=2+iQLLEl@dUqQsss8F+ITmg+Z^$jWmZehJbN$+``ga=DLWLU(2zwB zW%hVRr#;gqE#&u>aP`rVwk~_lz&JfDsxMG0$7j7m)K7N!IAgv)cKd_K`fr31h&DAv zbf}Dr^v1FjSEk(h$xy?uqplTd1l4=31`$)1+hR}dZ3$a|>NYguoV}d=OQ5VettqNR znLy%o1eq(H2m?hLQkrohm~z4%Gu~(Uc;NWRk7c0Uk!{f{1|b< zcu565PQ9$`v3C1*;~1X^e0MZom^sJkA_V3~iOB~Ur{0ZRxtRBr9Z0c$$gD`;9;Q<$ z_X%(*1$ zkTGU|C9t>vq$RuV7E2!Uv2PZ;UR0s(o?2Ko4U(O6$e2_d1;2uFRNM~yA$}F<2A}+A zLnHR1`JBjpBTbO=Hs4b7aT=7jm$cG~5ot1$#ZQaO|IMjLJy@YCW-0t7tNNc(sTpTx zrb3#XBQJ78)`Ta*K4m-WSp+iZ{LmO^*JK2+>3WR%W`Et>qa-@0DWuw>3&+^AP>;Z?F^5BcR#GG6@t8(i%iG4rc#U=>4FF(| z474FYL3g;g?&j#1Ei{}k*IJf_+;6FhWdl4#ht{=?2FZptmo`5xyb%ncE;DV+>HQ)x zRI_z4&iL=Vt3Gy+T;A#E@qYl#j2ZQo{0tHYU4#Km;1$<&=B4%hyP1_{z9_!=Ve%e9+q6Z&w#B1cHVf-qSN znup05@SXO(Rgk5Qy>f5!cV>9gt8PbY$+#8^I@as^F6Xu6_4+EC)oeEt)`ad;uc<{I z%e$YFk)R@_e|-^C;vfmeqIPP^75Ekx+dwEfEQ1!Bn8!tYczBEi^cV1VjDJqDLw``= z5q1m3J8{Qqh6~b0@tP-7R~FUvwRj;byYCON0|3B{wld*3*0G$mf9Ka-kw;#E;iLDL zyW*IALH767;8IF}6!DphjpFZ#a(|U^iE9lt^(|d3Q1g~SquH$^1eA!{?hh7sl{uhVVioteuO&wT=&f@#&c+n=ny&~xC*_YX;-d@|) zT)qe`rGbFkq=DUq{P?H<_kOqG{po~Svz7~Z81oGaGjRZ|x6ea3BY=ij%WGz86kFD9 zj2{Hdzr5;?l*jg~?N4~i4;^JK+YBiP1?54vq70 zhtiMW5AHDj!OY4spFC@qP6mWSbHlV_Hq(KW^dg%gcXcI0j*fsQNT(={sD%X#(W9({>&gUXd4A|wTFLU$OYV>@lz=YJHdICaKmj*usW7X zyB^xezg`f*xgc$2=-;fT4tWS+xEIiK%YX24=>7wdXPz1q1|wWwy00ckh7`DQDw`v+ z^8Bw7`!vd(7c^&L)bl=q{AtA^nuzSVLS_6a@iKEJKaP2waf>y50R5pbSubP$|j%qlT**bJ8(iU%yf2hwRj(-_I{{f!i{5PdKHnrJrWU(Z1g)?t!G0{K8 zzFG?E$kjqB!YyMIT+jAo-bQ9rqJ7pp5UUiOO!G-k?*uCA99U8k`3H>N%@;U`6PX)9bq;2oKbImqdhE8FM2)REj11^t+3_bRDKDrD!WKbhwQ+&sI@4+gGVlMENT zC~()*qWHfTYRH;`zPN1)JjnGXR^q&&xU5{zUYK5A&cvg{aE)VpENmu7Pl&2g2=vTO zXL{REjOWvEkD+UFzmdKFgqd~m<%gija6r`bDp$0Sjq`EnCzsXw*uG>g=TDjUQFTt0 z8X*MnuIcj>AGSQb`lxad9|#vJZ}^(9iZShT*yw{pf8e7z1Lxr^B>?FM07KeL^>+9! zkOfo5JLRl-1LHVk|Z9+WbJH*Pe4^TF_x>O>qo5G zG_qnXkzl~H;yiBqbUt_l+UnQ2VlP)bN)TI=m(RQUVQZq^Ss-|EzS5oWpFYilavN`h zO{8bQzSjO94b|FFkNX$(mvgiN)o)_J42V)?q98v>G>mU;B^vWrFY~Wjj!uGlx?KjC zSCAng-_`ab;yoM?h{YK@wm0IRW1^s$naM{U&qP;i{#L5=hmoBNGeDh8nvtio+wB?m zX5W^YJ$mEO#4Z9lrS`G3$X1;R6V(qR+1A#J;ZN83P?rJ_>SyxsL0tUAovfpxv2?Su z91cR%^Yd_R57DHUH3AY2W%jqNX|t(q)M1#S`qO` z5Kd+7E`BZB#)Z{ktfclc9T}6xx4nY|BN1ixX#EJ(XAb`A_YhaAYz3DviD6m2YIe)r z-Y_Z`1(3`?#O1hw^UEC#jc*C%3=lP|59t8XR; z8kXeTM~~1x4@17-K?}JcWXPz;q*7H0^2H~bTD3^E0?R5k3j7y~C@5j~Miw*I+sW9; z-1<0{D#zE@PMyF;Z4kVRlJ`OUnj$=%Ds|uer{~_s_=)l7(v3JK`?6Zn^jw-Mey*KV~-H0lYswt zfg}S&%AQTkz3ks*IYNDWcEp8nsU$LU{OVC)(&Owz8#%@Jpv0sRuqPI9b7m;_YQ2Jg zK~9+tjOcyU%oGk5FupR7!kj6&yY0d#6SX%^ABt>+Ub1OW)*Q4T?b9Mwl@(Rj-u4ds~4leS{ zm~qclUe}bwyFWrVIeb46DzPktASa?t9?4%%mRZk`B$C4e8|2M89>fOhj8-PIm!Ha% zzYo55;DCuX=~~TF%k^wl{Mo7eSq$+shN=*2M=Q{#nOfTHO`=Qx?YwV;I5^rxMMWXh z7-xm$(#E{iccNLi5YEsQ_{T<(477YzupDMC;UxO9F5ldGCHeuMr%G@^`WEd3ivRuC z)JpFZn~6aIO$kEstri0XLE7+*%WDs;;lYb1hbtUYa++=wtc4$qu__NUct7E(S442y z89I3pXZ)|$!PnagtCRqB6d4M#85yI0VjwX!YNpRnNwK`5OZN0b#H>pLF=}K4k zNq4tOo_E{vgN7fsXkNXA`LE*_2<=b(1$Pn)dDDM}gDPvE|I7#2+r!V`n_0K~xs+{Q zmq%9mo8z3;hgVy7#28)kY-@mvOoUtY@0SoNEm8sHHNqae+le|Zj9zk7#ax@@Mv|#% zMF9S<$=|p%bl4FvWJ*dR;0Yn&S!@!=SgT_i^C~PrjjYKr?f%6XGBFu*6-f0nj*o<~ zaV;P_#c007J6@Q_rSpU}WO{`>+e%h9Ai&E<3jMjJTi`cuBKtb*#G*55V?=u)W{grp zJp~3u%XkCNv(3oV#XoN6e)ek7enG}f^=^i`gIY{$t^CkbN z|8XRF9}`jTq>)=R`|{}%yNG%?JF1VQf}i4FAA03k9VV#=o(j|39T2ib1eL5eJNQwA z$MA5AbdM=-PMjgA*R+!)s#u_0%op+H$L@l@9eNA0g3onYyl3-1r4xCAhr2H;xE6pX zzSivEiR10a1%8%wqxkrLFV-mju5qf`nJG|Wa$+UA!td~EmXm(PAtmKtz9$lJ1aeh+ zORWNrK;+|-Ac=PIxbN7v$A4dC2ou4=bSLC&9sJqMR$d?5r9xByWDkBQ$+2^aXI>^= zOVrj)H$1PMYiKbdN|8_Sc*_4oh=A`InLPN=N)m&*n(pURJiW1dKeazQ8P5dVGMW5H zj|itvLBlVrN`2e*eCO>o!RX5%>7=(tKmOTJ7I5|feAM?U@d^*?;auobtZF~OiGx7Bul!ywpyQwaF_li+H#ul zv0ROHujid>2>avMn5bv^*OGLI?)w&g9@A5n%j_ua`-b~EkU_Qqqy;J2z8Lc+zlR6- zaVn2Ggt!xP)@>&7_XIj7bLM}CMV=l9nH+glK9|o^ zt`vBs*y^7S2Cc{6)bbBkot%$StG1;5ndD1j`kfaeLhKa|V5jD~u*zN)c4|+p_5Cl~m$nBHh@ZCocg1L!6BfStx9u6Vb7ipvUe?E%R3&AY>cDZy9 zSL#lVtj1`8;~()cNIm(^^c82(f$jXxNu~(^PoX1jY~^{a_og85{%b6{Lb;=3CNQ?U zie9?{7j`Xk{Nii@Fww@I1InUJ)=@pQ8eO+k8R(s=jLzgN3#IS)jQlQ{~3#$x~d2Y6lkAHb`G@RaRxEkzhT>el<+56|+IBZxQ$%_Z&M z2~;EPS+hT`LSy5Ok4RtWUzZcGCA((rGX4o`oYH)b?y!H!k{12~kxv*doB8kTkGrF2 z)6n7HPi4YIsydqXV?%%Zlgs(yg?~0$J^WS9XG1(p2C%WAA=rmg_cqpBQ{Oy)QtPWSyMW{&x%OCH}W_;bcEs*&6fTdLI!l;l?EV10%^5mQ=eQYxTI~Y zMx_vZ_{bzg_ttJ_mQsy6|`y|t!DK@nLruiTbh7T)KVsX_~!SLZL8=ek_# z5nCB;2s&b0DzF3I<1h@MAA|B=A}k39!hn($+TB;}nY%GN<^f0URgXl~SO%Zx=?^b- zM+R-~>zHkDm}?`~88;0ntQ|ug05k=s#AHM4>_#!~<%_f_aK#oaGTBGb7w0;r7480% zWDaUH9G~5zm50Ww7&kfP+n0%}SYPlytBHTh0~%zZD+r95UgY^rgG+;b%d?H3U<#SGtJOTdxQ>6?Jiif2&bpscO;w4htxN zNrnEUr`%9D2&szQ%0hJT|E%I^X}}15;#fo6k7VJLEtz{H26%|Ks1++(zdrUge?HkR zTr8IvrC}Q&tIl}+Qu~D9XOG%p{TV`xU_gS;=a8DfLX)fa)?L3@W^pt+<)+(}FYS-G zk-NmA8&_{DJ|4o}fa*P1nO!mO{g5h`vS<&#?w0?2j80CcEnhy?yy2p zQOS`plho%SV$!jt^M9(0ye15OC3**gY6S~=N`~n%%0x8EmtaXu@?g#fg(tY6wPi*fkUQ()kg?ePEYXqo>;Qf}2@T0pI0e;)cd>lXwCnjmJJv9%#t*)vRTGoiSR$ZA zgz5v`3$i!tVte-~lnpDDU%31VWX$AGNs(Z%MvG?mkr3O669?KF)Bo&?ntYZzNwKk5B0T3DLAkF%v$A?p>{+P3+;P{LoEqxh zFb0_L#^aK!v2U~EPV6y3j5DKC+C+J8Ko3E-CS0HWrOWYZ>{T%9F5bdU<2>gdW`j7L z{6<$Jtp^eF8Y3fOe=o86TXlUkx;`w9*2PRU=}7KXMbRgLzz?+T30rjGrDY-8`jMn# zqME=C3581stq1UXV%|a188H_;DBQO%UpYtdj9K}8<-2s+wdAuElw$995zx2H;tH91 zz#Z$8Z{ZvqB*&BZYZm%mTSxwBlGYt7)UY=Cja{bI(=rX+kr1T}#Wr+>!WXXP;$MX} zjQ_&`{>UtcxuMa%+tk)POQ2J6#G8U zI-M-5&ayCDYx0ja=R4!)w)cpDW1p40ufFhOtp_Oe^U5GqtmvF1bj0MFf?@Tu>Elg* z8)ESj>mMyAG;e(bUe1YctIpU~AJESEnD^5K1ZqwWb3@d7cEh1#!OWXJ_)G*xdFrUY zpC3IKpPKPcVL`!&BFyn=M@!v{5Z1f-iW7lNF^cL(u;FJM+PU3B2mC2@)2?iNcWfV5 zBr_^5#YsMYpcioWHbC^-MGbdm0>x0D!v& z1n`<8l=rb}pl}Gh+M2ByXy;JVN}2{A>cZ0zt8Zp_W-91lziB5wwKjRWEPGqAv|lUa zVz@HEV8SJ1(?!LkFg?tjeVqWK%yMAP!?@xzVG8x)b+&3X-Ef^$K;>f8&8mP3)>LXJLyGHwCI=0 z9JSBPKUcA1qoC7%k5-}z*f;BftRIOhZgUh{UJ`fD+^|EA?Si+?Im&qY zGugvP?kEn`*N5zpm(rQ4t-7rNkKc;()6c-u_U;FZ7vE@L1*;I7zh0hp8!}`>z6fA> zq>=?kf&t!Sr8CsuyPUP>PjvAg)G+sbv4XPzmrqQ!6bi=SLtc?0TFS%Yug_KiFhw)m zs}j?FR-@0KI0agbgUt2RA6WSCr%oD2Dz9xa9+@Q%I`2-lKQG#6%30u)oUPE?ke7!r z{bu~Pof0Svx(Cr_KQp+|Twi4h7QiTB`C`^$2RcRQ$SX`e$SD1QTWD&%V!{Vt;9%fn z35RxMFmvIJ!1S@x?1f2XyK-roQ1SPrlo-`+(9=DJ_Z-Ch9n+2pP?JnDiqs<_QLr?R z-`5aR>1v5z=QIE$5W4OH|+ zkZhWV=DfB~073K!h-g$O;6aGZg%WDYFw(tHxw@$%ys3lE^fxSXV`YK3rrq*KcVF5= zFdyh1V9hHkE8%oCT#?$c8ge81Mm z{k6ckZEV$J2BQm9OZfvDGxW`v%@1t~hIU@@*iuHocZ)<(A&I(E7QwXB4WDm-g^RFA zXpnz#kAjJI=mvP&y1lNeF;3gTi)o*3UTtC0 zf}6-ydWbK_LN72@WwetXrZI>D{_5m~dhhuZ9yf5*U%eWr2dg}KYRWhy&GlSmiS?^K zW)*R9m{$&M)!hEr_yqVF0!vZ`3&{g?X8$#9x~LNJExlSh#nq86@qVe?R?u#O87u?248Bs1!N^ot{QP z`|Ts#+y(8nIJ&dD^sVqT8r9t7P4`Z@cETcar20woM*E|Kmv>We)YKEM*_Is-N<>W_ z()=Z@J2wCl7|C4{4!xXZ!AykDm zb2kLGRE-DJbdaS$Pw89!Wx+}!RwUw2H+3=N8W*vH_K}KL^uxCyBa<}AAMo`y>q&aA8RCct~ThR{`09ni~a%yC|M=)?l9sSar#ldV(v{sR#OZ3=9Q;yT%E zTjI+F7ruR}zx6j(u`kGjd0{2dpXo2SDf3r2kxh!)(1BM}&ylHyPo*qJPLhOg*R=2c z1&7#uQtLmTE)%!GHu=xCy}bsN*P<3Bw`4M+*ZF}It*A8d`IEE9&boyTptY5q|5GiFsSruK>hl zFgrf$$&HI4LWy`1`$Vd0)ic2Gclwost@rAq^ZLGorT>eLM)e9mK_Mf7+${;8hur9A zsgVUXkyHVd`h6=B?Nj#T0=lb{ zvS)Jka$}ETGY#%bLwsSUT1~RTgho{iY{c0jffRp*2w%pL*?9F3mW(SWk9{GjJ**z! zi>xO*ABppDMGnqBpZ1KsfSA|8hik0B2RQ4 zPntz}pz9nfdyPrDYD4q8$U#prGKyR(1B_P+wdB4PC1&jVMl$g}=c_+D%gQ{}_5xCo zYNv50_3+)6^P;G{bC2Gzh66?N3t1@iRf2!x7rQ2_T_OO9l{#VOC-ha(r|&p%NK;gw z)uXh5Oc%4C(E=l8B8Ivkt?n&OD(Ulc$tH}kYTK0S`=!=#A!a_g7DA#s#o6YZ1?qv! zl_)HqR`qn1WRO#5tx=IxikxUc?QE3z6Z2&d5a4P>zP>z?04$kq+4C~lcnv54l?f>fbF`+`yAALA=X`;KV*rnQ9|fIskM!<$XS%@pAy#QAU)o$S82o_XR{1*vZGsU`m;5Q@ zY4CWOJh(!KQPQ?`X?LnK__ma51V_CweY>cmJsmjL2}{$9(wq<$I%XG;s%}5YIWEoM zQ}|5WDLdttn3J5bkkr|=k-9!gXlm#2uJ*o(V4qFzv=jlsX8``iIsYECL_Kc#R(4rY z2cdp6BpcaQSS$=A{*I+v80l$J;F@;(9Y66@Gy@Fs)^u8d zQ5HpS0qII(ygjKzQxPEtc*L9giN+jvONOw_WE|Vq)Ov)Ep7;mM$OyE`WU=c?sM#f%OnZG3D+juPHvkFaT5PP$`ACG!e0MkHr@4 z5CiP%nnDAX?r*OZFJ`6KqtI%8aY+>v_~9O`5CMx!w;z|@&q^Nb@V|7%ss0Zw&)A6h zwLF^|vc88@HFdK&bz1sqf(%O}+RSlpQ<< zpn#}d8Llb_gI-%lO%qBC*YHd8abQy|ss<>X3@|4V7xF5vAn|Dd=;mnrs8ApTM>_p>v153LMUZ=*@Q> zbyNCEk^ccSP~>f}%BI4@m)+$N&uM__&&&Z?sr$*E$zYE*P4alXf(SwyNLj!b^s@eU^+%8cnsRKz@+xhB{3BVXkBp98++2vJ_hJ*G{?3jZL9f_(Lp)rmvl zeHrGoDx72YH&v>P9lz|almZ`U45)**5Z-`&t1>p4vNRO`z#VmNqR}t63$7{utsk8qS-0c-S*v?AvYmZ)>d1ZGN&g49`p%ZO%kC#3@bxo5OuhSF zJ9>~)Vn)uiswt|S_X+c7;gFJVu^KN)IMjRIdID|&suqM`h1RUFYh$cp+!jVP>ho=d zc6zCc?pg&h^*0_Z8|g`+Md`i5gX>urp3m3HQK^rwx}OMHNZM2*uTvlU%Xj}PUy2w& zAwB1DMwnxVoj#U1nzt289a+hD7OY(airF~+aR`v#V9(%2K7Yspuz!HXuREWwYwjkr z8{7#^*?Q2x{4H$#-2B`rzGvu=f_y>eggoqi#8tUXPIEbwcf9*y3~~y8MF%+F=O|1L z*%-iM21N{_l6%`d&^gq2>jD?^E9dpZr;^r82Wonhk^q=npUC|z3Pv4jl49$?wN6@e zc`z4Jo=u|`TE%cM+siK~8Sw~2d8YAL`$wsEs5T%dPhy$de!l|`> zwOkuYSkp-aQ8O+bTD#%=%gq<(&D1@39@b{)k+y-nUqtW0xKoYri8$-XshhW$*=!#y zCw~~z-W^AqC=A+P{(9NceDJ4~n$Ou29stUdSpD%QWpq$>@t;x5zMON>-YUKDpHF?6 zJ5??i=#^z=ltZanL3CEXl8zc%#2`fb^_91@T^vz@M1mxX$)-*zNiJddvyO&xBcty` zw5lFNHUeHRBMg-|hyj0h3ezbvj!OqvA|ms%l3&vtYrW%cA_U4&E>q9ueHgOiwCVfX zGju}Fv1-HaDjR~_sXVhPa=RgvL#E|X)v~EH;56)Gd8;uZd2!o^oB%$Qo79F7@7bc`PnZ)*%0b9EdAODE)?XzJ)wU*V&};_1 z@T5U`8)x})K=X0r8@H+hsjUaBV_(5F)b_4_Hc6+S*^p^}!vMyolH(UV`o6cng5B{n zwbjp2xL9e3a#QkU7@E-b*icP{D14j%?o*bp)>XwkYzp9wWJ`n{9kXouMj8=fKz5wz zcI%x5ekXCW3;mh-E_4%E(uH?m>gizPK%eejRB+W5>AF&D61 zDD!VZ1DT}8Q(6kzj_8Z%79_-zg=V+Jb&V>VD*f1+#I~~u=b!udyE9`nuIb*pM=XR$ zF;zP_{fU*s#wx|Wf(UltPo%u64qkb`yf(`5@O_IPsC-?Nq*s*Iu0!~zLm901Ws3Wj zg*5NUCI%@AlzT1LIKOqhIoLW?19L^wH^eJg;q7EZT^tv2;R^O<0v1)CY{|P;v|jG7 z&Xw!3yM3(ouQeAsy3j{jo^o>vT!#K$h-g*Djn=N?t$P1Kw)91dwC6Esbvwt51YR5E z?m;jIUVwYSrYX#}wM#@LU08!uTenD!6l1s;eAZcDrJ)B=aE(BL89As*{`e{qZz5Ms z;^!Yknre@n;vM05I9g>+?+SCruM3G^eD#w?3$oK71q1k=VW3*sq{$`;VS~*L4{}G- zY%)Pq_BVh8NRGa^G7iZLmUmM$LS6Fz^ZgJ1ILBws{=VDu76X8R@>+o1LW?&JEhk3S zr(%0iQzm%q5+0VAe*+!xy}|buXy!Y7PF8sIoE>8>d1Sq5^j7Boc}A3oDP+^ID-B0m7HO0!7sj=(V4SYt;oWb?f${vK?v9UNU~7s zgw<7wSd#9pIF!(g;MT7OXW^e-VrnT8d;OI> zK=9#IHS>VkhbCL9Pp}BcbBUJ}LF}O)SvV7dfy@jGYj`Wk?cZ-~u?qPBohNykC)_idv<}xV$d6Lm@b_UBICRg4;XIAs2 zICl={Mrf*saNKdblhD_^xTM~NCmDb-wFD&*82X2&H-K-pb;LT>(=5eWsU7uL`gHUQ zP%&F?>64)LS6iHe)CF~=>AjZwaii%an4ZB)Mb0W18{Si0@kvBJFf`jGHLxoWF$WB{6FAgK7y*}AQ8lpCGz&x7$6 zz@4yY{LPtx-*^P;TUeiJL6CfNK>R^Qeh<6Og!C5M@^ys z{6^Gp^u2vBzUR1f@A8f(K;f6&hKbw4@tN_I;H)|L_fI+|`vVm~a6h;k%vTtg+^tCK zf_D-owmW7PrQ79?LpkE!)weKdn36;KhuKOvyndh{(7DaJdW7mzw+Ccot8v{#oVjb> zqI#-!ZqNs+P&dj}dgMbmx55^Hq(O(Ao2~1C`{e$WVRA=~`%`@8F3ZpYRpkD?XwhZC zZ=mpJsH;9?vOR1?kJR=by*21ywe}>TKIw%fm+H%3H)2y6kzO(dWk67zy$U>foXD?x z-`aYm_y_e&X!;m5^ieHl`%Bx52TyIIZWQRl6R!BRP)ReB%GhYUZLBsln= zzj`vBCMBuOB5m$0|G(!OUrIuMDA2xoV?FkMtD2h{T~hhU;x=D_%?vFR?2}gzN8Wfn zFh;`1Cyz&KpH=u=A~6Oi+r&W`XtZo?6ZcKK@5Ms;Wavv{{W?Je%MsQKG`+u z4tUf#Px5T)>sxItyrex}K1(j0B0&3SupkfsxCNB0NdKz55nX4ifc#i6-+#zM{=l7w z56JDU`UW4Wu~K~AUpV2$J7Y$6V$;w!4D~pBz1i~WSP9r&1;N>2$GcYia`m2tm(Eh># z%)^~$r3_>*{UcJmIZ}kWNph3(5stqQy0F*UHRD%y-R!XR(8-#gAPO(kDx)icv~PH= zxaQ=5UOr{rHTyH zhwm#3|A(iu@N2?-!}Z8f(#yi**J?%z>56&a@3*Ss1saeG!Z_;wA0@2M@v1lzy;B82+m!tk+=%XpFL zE$Px5OzU&ZsN}pQLOi}TIoDdfMw`*%RyIn+Hp>wASQa$??ftEk4ugQ~ zZZ`9+HN`92nrXXLP<3Mw>Sp|#@h4gDe}LSaj_B7yCSrdiSaX-XHN9J(ajHW1X2OId z;k;Z=k}+a!bPA2M<*TkR4=@klb%Wl;8K?B=N1TDsgu9@&;*KOGvUlR+GzXKfp2}4u zR?#40EKw1d&twZ@K#5q&@3zqrK4eBr%Y|B9S~ka-fy4&!iH0EhO2zx~G{Pf)R!D}n zOgjyeE$Z8qx5G7E%0`SyXzkYBKeDLs1pI?t$O9W4Dt|#wPE^e@?zFAmAm^{;bqHb8Xww{6Q0;8DgQ> z3#OHPWgIloNm28+{naP1Pg^}*^tB-1M@SwcPZJKu;z167Qs%80`QaLUWBv2*bAmaW zWv%gFMynfz#zgGA&|k0ILUf|B&`#^7_$#uz8~EN#(($^;OmY?%>qE} zRw&Mk%Qn`j?9v(WIW0SC&ZX^~12{|3a~HG$yslqBz8?&d^U#&IExQ%F7qf~;TdZpT=<)V4r>Bl!gD%>q3L^D zz?c%GTlMf7=DAIZw--Hyb7aLCm_c0d;f6`CY2j8 z8~@1L$5drWAL;Hxol?^RgBjWwH|kG0*Kt&XM)9?k#)o>(R6o>(F813FPvh+_h`uGJ zGy-~<001C8`_Y5Av4q$nQ$q~9A{E`I2%e~d1wt&9hVrkNX#j%Skw;a*HHyu)t*KmD zLtgQRy~fwn&m8_b#1oVVDpcl4K_W9S|J8bPvyop^dxzL=+K-)O)8~&Uwj)88RT8hLqxMA6%s^l zYo;3oT`ZUj5f&V1VK`m=GB!-?vv$BNB({p7(33b*L?M@o42O-q*DL~TU%m%z*wTyL zJie6@5n;)nFqxM?`595!+A_hD!_~XvU(|hGFIjox$%)af1<<~4P&gUuoD)U8biWrW zoWy@0L}>Z34n6WTq}#IEZ?^!MZWL?SDEm zO>x-_Mk?fm=}a{pDU96hUip4^0vZ6a?xHx$HqRbI&dV717~5b^_@6G8-G= zxqayETJ#)8Mxs`R3@Rdzy|u7pAa-Z;Q$d3-E3z!_kNj}s3n2%rwPpR^Kv$Yu8b%q- zM-im2Q{G}pwBv^1-n8yuNzrfqn^+-j@;uuxg;xm{X3w>|Fh@p@w#8Wm?qOTg@ zZsAM@5bsZGJ=1qwnY0sSuJL+1YYUEAISWPhi8aSpUnLM6p5rUwb+oM$F(U}kNNOxc zKp`H(fUV4XvJKngtzzT-e+Wi$GvgzYUZSKDgIdqf)U5B+q=rL)*WH@1?aaZYg~Q!C zNWrEq>_&Kmv)@8!&-{-X@65AJhkK81l+#!nb{d+4s~7Dkf5O0Nx_CvcBZ^#-T^>5))7) zo%nxUzVTvZ~Yyr zWmL;hYxBxDuJBAM=NVKaz#sF< zia5RaBW>9MbK*_zkkP`yOzATRnG@EmDE9A+NT>@M+nfgDIRyQ?n@zm-!M3qsT-baxsaZ~p z%8Hz(Yf4H%4H`p{2ye*>+~Pja>Xb5A0|!iT=bxfU*2ek_PnzxRwP% zK#B(0Ew^ifcARsS!H4n~iPTHqcI$F6w0$N0PZsbP5p+5kUxn3AQ_!u?GJ#*^9RlYK*AXQNec#iLXe02MaE ztVdzr;yP3E*49^*c8r($rxm3~me9axFk6f+iZh}C7gUEA8G6>GdH!OpWyv=3Uv)u) zDzlDLw2|CSYvMHoA}c|9u|Ly+BW^JomkTHSn=+vwopAih#6_CKIsg1(&%$bGbEV} z9bsWBnOy3?)F`d!>&&X+-wr%|{!Php|r8NrhTYdeSOG?$s$e8^lY za&WGXN|vpZp$2;_7a5<$w-y~{7X3CVmn(tP@WgKuVrEOTtX$oe8RHd_g!N_a2}%ga zakvkDzpD!}nR-v36Y1na`0JBD)&`lpO!|8;Ce0v!7ASt<3SL~X=AKOGCAlixrD+6^=4V8%nc~5XE=wsQJ-h{A0>!Kj|g`0Q|?e7Q9=r9HtMeV z+**W0C`!&##R#JPC^KE`#z+HDkzrID376uut8VDa6+L^u_F*URta2`gsJ+RCcIUY8spt<5PXVt5b$mOa zn3XQ)h;6}p%51mbtw3ST`TVK(f69m*DoSu_g%|Z5L>YVgy$(>hVV$$JjxE)oH8XsB zs#}XWU{hy2UF7G&x7#oBY5}gUePO%@W;P#@!5?PWeA=guPq!Ui>@2XN==o3tZ^xNA z6d);=CVq4j|D9#JfyQgL6~eAKag*Pufw8e9UEALVRrgE%>BhoYl4^nvzk_}cV?PqW zxNw<3=Q-E^rVKuxp!8m~iz-raS2%(!5Fc81i`@eqc{vo#*vf6fvLUnw{!x-{I>(ob zb(-_zYWVOtX}UWaD9h?h@zDW>M71PQlVT!g#94JN_m5XIoE)@vB%{oHM7)Wv7+8BS zvKUS$>B!Ca3=f7D!9e*5O@+*H%f_}&-hkSg7Y$f6Ba$6Bf`<&|Vab@!+)43*(+9h7;pTL~zc%CUaiba+=5?6AMn zu440-i&XuDrXhPdb=R5(6BZs%BvIa(@n9`e%GsQ;`H<@H!}wR}9cHMr8x!PuSmaq+c^1wgyyWx-1RM7{tDG3A_i}co3J2}Yb(6=>LmyRw z)kRKm-=~MJUY?FB4MhPpY^`V_5>7*|9T-E#`>Nmk=*HR zU)J_s%jqHNLH#c(h&e!Z(k4fhy&q+3`QcM|NNfG{tJgdU$HV2#5naTtsC3VeN#?yu zuPIH=`sP!5C?c56Fx3d(xJ%RrT#kljEV>%vs&oXqt&pTYtLjVuX|F_iz4*k!qf{<{ zSN|bo(Lunc$y6qr!7WaT#A-xFE0mnG&?;SuDj3xLiZR zRB$3c5QeocBbp-$kicM{bM0P6>vO8!f20(WtY^n{G#2dKkL_|Oz-A?kmQ_+454-NVT=H$Ht>p=Z^}sZ zw7Bwzh~ojqkhW*j>PUrxBg%}-fzFCEGo2U-g%4AWiFJZsl0$Zxh~5FhsA?tK^#*QF zu*z2CFinZi9x44Ke%-l!wAaR=8Uvvdhe;3eo|xJqs)D4VB>B32S!48Oz8G2%=n#z{ zwM${%W0~}5l%bEls#MiF{HS+nRqad$VFySvs@q48W$0;rxN7bC{Er+N*giJSqIiyu z&1yaEqL@ZitI_QY_8#|Qz(+ozx^2-(CX#6$9Qx@)R7OrqzWO|%tzEehGkF@|IUN5Z z*DKAaE$wA{w266&9_ZNn83Ar$yH3_Kq>2mivN9(B-cA;w5pHmMWxHiFu*&izNn!a$ zl9g1s8&yeCFSdt1vl=K)FAX{Q`f&cjvTgpF?PCtI@zKrvXhF6Z4l;3dDT!uJysdbJV*m2sKh{r ziqKT)l@e(ozapX^={Hu@O`4k>z8`O`)y8A$;icQBd!uq=S$JuSazVOY|#|1e%<{aue`c!l^A`7wI zPRGcBb%JXm!ewKqgTjoUAxB=I{I!;B%5o30CX>5cyAXc}kL+Jyjp3t7$E-jw#kd_s zo9RJ%(wdQ+yE1NChMTOqtSbtJhEa_grxJ9E%be2v@SDLrxZkMlX7_RE+ux8-IS5oEdmZ z&;NulxVnxCY_m=S*K^2HkLK{m<3K`QV=SkhXkT|1JKwdQe2_;`a!3BjpV~Q&SQiPt z6;|_~RUNQ@pK?LLinV;h_}`9XA67OAHA**rOIih|R|f zY8S2|Jv8gg2$AV8S-Rrtidwp%2Cl>1pwL5)lrYIOL;J|60Pdg2-c_c#t9>s_>31$n zPusrFNAU`G_c|0bp0?f1x!BhyDn=^NucjM+sdoGN^!MHY!HM#?7$IvR`s+dD=fV+^ zl#fzVo<~2jxu&3bI2;X@yLSokF$J%_U4ze))!fEiwSxWx(I$ncDi|mVlWpVnaq&Pg zVWAW54#j5)eT;aI;uqVK4TbSrY{F#LE4F2r7yKv61FdG&Vf#%!nGt1y2q))N&T9$j zuVITJ>ka^^m!!B@QQJvJ%b6Dm(Q~zOTXa7p#HKak{{v`5sd_dwArz}M=nFl%nWbs2 zDNb(*FKvCPEq;?7W8ew(X-$?2Me`$^-Vn+ zZ!`OM6V8ElU5;_BTbI=$_G_l{i1xk5-S4cmmqc05vLWIX-i8tGJVbaBf%ZKTA_E?6 zgoUhIqSdk9$Fu<5BRQ|4_^j2>Xg|rAC!A9y+V{G?@aR} z046zTY}I~v*y8G!kTD3_WwlUJj)Ktx|7I`)a1zsv1I--p_G*|7jC%1$2kTbRGnLA0IodG_6tweKASp#RzOVt&vql z2bsAcUQjRN!TNfG9{-k+7nC?mFrQ&+xZ+b%5G!hwuZt=-te@qWLL)GzWg@0Er;Qf3 z4HnoHs}=rqC*uB5*VbufHDc6f8_V&XFiJA2Ak_{N5>k`*SlPNNshB$a&B6 z2wUinCJK-zn~~qQ);*^N)pp|eVPv_bh;LJ^&4`4kHHI_CpAxp(;p(ZUZ=3lr3DIbJ zr2cfiL7s1oiw_2q35=`A&U#)td0-arF|9s95JlJ}Y4bKs$w#Z>Lp$AQ_g zefOmDg@zQQz#%VX%hCkxZ`~QVEr6`P8cn3ceyROPIBNMpt5@8mabJrgV#`-235~QE zfTh4(J9-QM&UwAy!UZ!%<8W_fW6B{U%Et`DM#FC04B_xc56N>{;t%0Z1|0J*FXdG* zD)*F{2KTD5IO%`TM{TgDRCJRO8)#$#=4D)jLOg7{gJ>I>zt7?ZcCN(U%9J12>^g9| zS;Xz38|)DDY%*P0kS8kj3=af6?NqRr(GcVtFnmGB0nR7o`q`$(8}IDI8(e|!QR~Cv z27HDm!g|+EnsgN>WA&D}b`sK(@2_8N8UnxJY)8tf>A1TkE$Ed*35vH0a#OtOtS<`8 z^hdq=R(|)o_V@M#G;8>ZFku72T6a5L3+s$5y`AV_juBar?D*Bz9&NI`I| z{-Z_IWPvfnb6Vw`AOHi%u&QXpT1PfQC+Gs1jZ1QI@yFkX%g7WWV#v zL;^{^La&Jrd-DK-2Tk`@^%lkKQtS`zR^_c8+LMnhGco?$=4rfu%@5g(z_m%LbNd&w_P3BE8nX)m!vQXX@OB}L z9yb&C2gwZTzi}mhje8p@=YJy=-^x|qsjBVZjxwP0bmWaIVEj|pu9x5NQ*lII58zMo z5xazTsQq>KxH&Y`$L<1SG6dwc&mMN49a#;<9_RF=is1m;=%s1O18jOk7_&b)81?(b z7mGLEVl z0$99%q94Y`y|1VNit%hG^+3r1ZF-u==5Dft1*h_2n0)bzLhM0&X9(X0NrI703IdLK zWJcRgR}AIuYrYpVMp=nhR?LjPk-D;Igc7Rl(SQ@(?)1BQACyKvEn|JVb|gSo_gfSv z_K+fN#HoB_@o{p)oF}&bBe0Q3(0PCcNKkux&`(@}vZ&NIPI2T-|4^V5iYrlqXrW&i zi(;Mh5T37E%fsFD3<7cGws(uN&euJL%rJN^!m1i zGja`-u7n5`NYmWtK;4ZbIi?9)_w0S{YaTFZV=3-*9vD={UGbj_Iw4JlX|}w`(R`1;pP~^A8#A?1tK5-nc~C2_F~iIU+Sygf8Sx)JubfDMPfT`(tZ^_@1CC zt8BAx`knm$KG+F+F+C~5X^>yf{elV2jAK<|ZJRRiOieaGR}9;J&)E)aO33J~V3MQE z^zQ|BenCGSSuS@zbCbU;cH1ROHdM&N$j`GE)|a^ajUh_cvj4(&K3X77U;Ui51jVXj zixwD{ojyMA!CW?4sbx;9A0}{h=Z|NPLK>fUUYgA}#&Lh7yqOnr=K_ZX4)4380YMn? zX-BolUurghkJWCYWYQuH7LTHTy`%^hq3Wu$HkZy!E$`8Ce_NUHzpY%w1%xIYn91J4 z>6&LOW&&jL8?-8WoVS23F5lcthZ{K>YYt!kOziz%_N*l#O3N{Q`MEWB?_-B+7YWUr zzec39rOS`$wGc^d{2x;BxhBpg5?ci3Cf%^A<=SOjW3TZ+w3A3 z_myayE&2p#Csyl^Yw;Nv!ZuV7_T3a*080A!5D4b39 zI>m$Ipgz5;HV9RQi$A`!IyJ34>|{M?3M_v;tB;4l2`mfGf}j74@UNgG2F0iQ#X%pt z83#Lz3CbAal0; zPr}->kHTQ1S5IjX_2khK74~lFO}1K!`aPId=Q#`2!5a(}TN2(!1ANFSf6SR<=dT3^ zf2Ao-hBbVEkW>qITu^wDG(&Z4L&~AZI1r{27lJMM{T@wo{Gu!mZ(4{Zp+f=OT}r;( zD%6+jI4|K_>8qOH_Zb&rU1KN2`_A0TV>0fU zal(%Www~DZ>ZUn&K03%ZadBLW6p=Lj-lTjFPSo%eWdYB2gxrx02H|(L{Yo^p(+YnV(D@hSO64iVs);yO60%lb(Yr>A)q zk^B!_NtLfhqmC&*R30WRa_SIqCUsnoFjgnEC;qtB>scnL^sW%WGtrs`bXEdfc2nqC z?#llgpl9sEJ@Ys0I9DyKLs}r_MA;Oh481$?$RVHVL&UeaJau-uP!v!LmNYt`bbDWJ`97nN-{2G$!5K#Ww z=1!*6y@lxdXJ(gowqjm!qgdt)8rDUMrKsLgFCS_J%Ve9h;;-Mwz^sa)+cNVqvd<4w zpNa}Lw(XEWP+L7^6%R=Suq6^Pk+PrusCL|=o;Y1j=$`LUt(MOW%FEzG1|Ms$3N3m` z&j+^h*8w`HA)o)`+mLt8K|i@=Hd50I#6Ifzuz*{SF5akX|QDwkB11|FEC9gEw^I67?%La7v7L z_~YJX^tF$jJh;7`b~clKK3YtXoJzfEC;^`gHq245clm-7 z?_mqOTUBb3K@42z)5%GeJ311K_7P%At$*ow~Z z>WRJo-Yti!rP;wtixWmrV0Wj;WD8`0%uhCHj%@?_a=z?!7{;!obSe8DD5Q69#K>#M z;1XN8At%?X__7+%z@FDG-=-x56(Wb+2hK z&lHFJMvuJ}z)f$Bzichc8_D z3qCW7o=L=J{u7wFq(;0ksO`nLP)9})apcMcIGkUi5_z*ELc zz^2a5>I1=7CPp}R9mJ%}$ss#CQt)s4fF;;f>^bt0J?;EsciS{r{6fc;ViyiOl(6lw z^@+T_CMb6mJu$J$c|G$e>|cp*NIIt3)lSmG@_K=f5LZG3;Dw6fM|uPn^p+~zQswrx zaL3GDBI|zJ>5(|MH+97s8aBZ;n$1jXI-rlQx6Z4A5ErB4$05ip?9za3V> z6dErL$2ud5W=2|8Ln9=V$DUdF52l{NC}Ay$INxJn?jB);qD=Ge&x}oiX^^q9Q`awS zRaI2cRs2u5RQ$c;c9jq#%}iOOUlNT|xZMEXJ;)2w zpuh8orMKh#^)ryM-I8=j|E(8NYRyRBqJvwlLFdZT-~PsLU8za3wlHY+-LkCoO9GtZ zpO1QMB*dUjf@Hz=H_cQe=`o_1A!V+jED(_2d<1m4M~duGAuwMFF+mRvVt?^+r#OC% zdhwOPLISUz+#eonG>GL?%IpjKV;{d8RBVWta#?NG^B29P<#&swmRR=!Eby}kMsAg_ z&lgWAqQe}KGs)IZn+_-zX1d>K_w-^UiP{&QPq57>5z!%<>iMBgvdMOtyaA^T)WN)T zuv9)=IZs9PD*`~XFRwHLM8(3y;S5k=4W!fN!>V>)8$2AfmSTCwXNMGy=4YqSGA<`Y z9d69E2`r3-cIZ zN%~m0qL3h$Fcx#}vc$(IHl#>B{QUO|&#}BZ@VrVKxdw+dy` zJhwjS-S-P#K0SFUtO}BLF_j@3-0|2Y1&4`;JReO3TNHKR zX<}LAUWWx)$qJYxn&VD*@q1NVMF2|ZIH7&UNh1-nc4 zP;9pq7kM{*q2Xr-RDqo$G_!KeJ>sPczWu#d@6Vi%cMcG{IY&AVD!vp?UHVurqM21A z%jY(so#Qa>7{uX_qn<{2MB~oF?czEqj?PEXl&E|k-ou7zkr2`ru*P>@{JqFNh&4fW z+D6aNxe-5-_-CRpshHIkDwqm~H%KkqZj7&IGd^-Y(H=(tz6$jug#wvj-#4}x@;q|J zyj2sva|AIRX1+7>8Z63_<1;S6Ib})gzhJk@USI=*-1|a!L`SMCde&*UymP@?XZ`@JGscidesj-%QM5sAF02piwaKiXeE^st@@aF*YZ?E&6w!bEuu<8>O0XP%od1G=c3l@EI^UWI4x@Wi= zjANBBq$kG(wBBYBEA>1o2yW@M%^iudd=^@Ho2K+hb2O)LzTi=(^Si)*0JH(7g}9=G zZwzWW=r{-SZ0B%^NzaT-r1VtKc5<;i3nV8?YgfSZuyJ5=m%#v*mjuR)0E*WxJe+@| zOkT4|qnMPVRT{w`0f4;AGnP0ze>ewqBR?;2#9$v2svY0#g}rV55+H|*tVO+3f{Gl~ zBerXj@6S)pSPjuhVU_Bun1PcsxkcQ(r}3BF9s@+nie7ZZgmNGc7>Q{t{eDtd0s3$L zp7DU?PteQG)I^gNB^ROMxr&z|;52CqzCdZ3Q_(61muOnnh~GC<{{y<5)V)t?-5~Wt z`A!r-L5+0_d&zVA4`!PJyj3Iahw!A^iUluDMT3KjH3~b@HP)msf>Qvgj(;N2!6Ew= zQDhfA(>a-p6J?qomtlw!r4w+Yfm3Ve0G}GXf_!juS1s|7Gb)g*~g{1 zf@_*oCNoQUX6;SSbs8fBT}ls7O9o&6yn#GiK^!M%fe|X+6-5o_BomOU0)Rk&I_7wu zRFoRBqx5VO<~X^BI+Wp9J4LBNWKn{FLZ@`I5gRsZhk}j}^@A2(z*ZQ)jwB=Uhk82_ zcK-~gfJb`Kok$&%EEX0$Pd7fxv2390xB}ULfSW2#@B5Ez8uKpnl%gz6@8b$Jx@(;Q z6BL(>ga6`C!*|=i;>RW|DV z$wGqD<@2{3vVpw?{rXXL$c%y4UN5Fd14^lFUe_q#VWTlDq9m8=_VaCxGb!t7$%aZc z<|+i|iMacs8=eEKSL|sFvA*ZxLpRgWkId&78lCLPOF^a45OxaU{{S(9R(}KJiWPoBBMgEjogkz(V;V4G`aHJ8QK&T}LHX{2kykWAKFr#DM8K8+ zWgo__LT28cXbwpZ+GT$7s~fub<{XNZ#jqR#2o3Q=Wbhc=-z*QRgOaeBc4|=fMvF7& zQtsoV>3RlW3p~A@zlw|IfM){kGMMHZLp5oDefVt9s@yMfh&ESHD+~*F~rN-^8Mm7|P?gJ4wa&(TQBr?}% z{V8fGB!0gx#knW7RB2K1^K5-6lhhjw345u~d(P8@DrB9|taD=ru62wA7vhRCiCIG- z)$G~G2?7Ks1IB%F-kv!{#tHa(R((*u5yrF35m_ls=i||B*(S*y0)}Bp^>pIaoUx{1 zXB3UNJ!NA$kPBUon!GFLp}^e-3<25V8$T2J51A3TJi2(fcvx@IJM<0`cUPw#VlEB} zI|GwuNW%YVJxU>^sKNxxyvEi^?4RGv6*W^v`PVcmftrH#xv-=SvxZ7OA|fQ-W|iP;6C<9q;x-~%erK!?ZcqD2)M<>ygznH| z6SpKQvlVk2yhLM8D;3VgR9D-S9w^d~;XRMFlhh+>$Rg!dJF=CM7+7{J3Wo>LuO5jh^uww1!v}6O#tR3?Ph7kRiD$dfCUZSg2N@8c+PY&+^!7JOEHu7V7aUNp$e!u={Tj zLm^ODZDtS39LB!+qBqum_t$E6ABP$qFH=|{Apo-53A1Ys#^z1B&#b3vQC_x^GJ@3> zOZsSOC|DNld>pCzR5ns-j_o_tFM-S+nN3#y58 z$0&BVVMn$1Q&a7@R*S4m$>%1uzeP zku<;w9)@5bxB<{y#BB)hOQZ3L)_;K8E<3789{iok?@Tp-3LqOOWrPXuerjG}`eYFt z(>o_hoLpH`%Cvn!C?esf|C{(xdFIDp4tZ|B5k+-|lZy|ycExCrFUnH9jo=Jh&0+P5 zF*b+%{Kafh=l9CxwZJkJ;|8Zh^`>;^DuY1NS{0?M5l*4!3*ppw8bt{=*qN(8>eycO0#VcGhHk{S zoE(`+JSqojsX}n!%*iitu*g3_MYf+_Q^}1z3U39f{XwkjHO^Ff#>VwxpzH-gcm}SD z8)2?WOiv>4i~wERLK9?{e)8zf+D@ZV=HWXN?r#&xV>xPpN_&~N2UN$I1`mc*RE%~S zhH7e43MD}fL)Sm8&)=2#e4JK+Y3iS zmWy+;50OFB$Hrdzf2q@n8r8AkQ^EwS4g*5helZdu=eudsE!7ExTA{y{RqT6o-3Aqb zB@`EGv3Un;63Bl)KgXd>oxol6)(pALth7XdfZA?AB0%)e7hZ$XFRYmXkj_hMOXH4f zPVx@kpK-m}FhjdQA$|mi5GGV$DgW&BkB&N0_W*oY_AEcFv zs|}cC z#r`GluB^K#``2v{zzvr5B>o}KZsGB7$}`SLQHyIA@vCUX&7fWoMuHFh5$t^Zk<=H0 z|Em4oHs;jJ_F_o^d(}cqdT@%*U1Y-O$)Xwq@g*9sppJ$piIqZ44BbO{cv7_~$S}Y= zZlnGztv#H`!QKKuh>b(TXcCmxjkJ*|g_NiGg0st~0{_YfXZz(2CDe~s*rlJu9g!p| zmat&Uh2Djm>he*uDO~gh3^DtW;0GmZBbICr}?6(a) zzS5(K+4T>uGcnq`>#inWaag^tS8jiaG!RvpA{DTfwpTMVqBpbP*w|X~Aj`s>tpQZ)< zg|NWwZo~nuXdMEu#C+HuOC83&QWPvR*G>!?(iSLF#`J? zK1WiS=-oHpZ#3N^|I7^TLUo6LPgtiP_U)Mf?cfEL)Kkl;@gSR6Z_;49@`2H~DDTeyb9!KyZ5?@K2=bl%`^CwQgL-V2{j|BVY-YMZQL;8z(u1(sw{3IF*CspiO7 zNxVZde9s4N413Z;Q&!qk(*6sVMKDnOXJQSWsU(1X7}F}}GpSf^>? z6g`W2@Gs6#3FwJEzGV_+2y%WI^GYFsZc7%Rz?3+0+=uxvZ+u?8A~=|pyg4#m_0wkf zXou@KcjBs=eSj+S)qJEy1p9A$*Pq{Zyx8A}Y#P%`)AUqYos^Z&Y-}151BSS$QHmJ~ z1p~V@H6KP@)0UHj!N%jOMQ2OCcaXXFYnvX+WqSuYT!mQS?Y8WHX_Z!{Q&e)+&!$Hc zdWB?}WMR4A%x{j&qyq>u0%s?tb4NS9koG+R%vN&$R;ah8QwC5KSn|_k)E*}%t^I?L zx5Q7xffEbi#+_Bj_`Y~%T5aP;IzOJ_PX`(im*iGfB*TI>0yuduk4;C#bX6;&VR}QC z1^@5@V%IN=11Gg?=#;Z8uZr;RrXtvKkJOftndV|rM=J6>QnYXQ40ehNjf^k_%ib6z zhme%<`4dbvyHqKD@yVNXl>h!|T--^~bzy*Y2^()H6(mlSn)CfiAiYZ5w+v!UBhSC^ zkYF#2_33VEL}>T%HG0wdBXq@yZX$gF)5;bI^10XV)-vvqY%P}uM$YN;DbTJcfmvk> zvx{c37zlA$Fo}$w0PP9C8(P$YXL&_LM0yTT?h~V*3KjOPa~6rlkkIs7rI)K2;H(-T z2Y=kchyZy4+f(5`=8l@P%mKF&b+F!htN69QecpLBLqC`iG9l7T=+dD1@R3V~?25H6 zI|HuZ+5jrx_tI~a!y@sBSH_>`bFbYkIkUphL;;9)!r%j~aqJWJFzl@?b3g6ET=!JK zws-MT6DY*hZ9w@{P5J}LY#F)!|1c$PDX0oJ0Trg-RZ+x;dipG~``NGc(3@d>xby6b zLkul`_eC!04T_tRas1^l;!|*Vi=XZ{%cW$hJDFmL%PxIfh`ejyTj_WaGhgv|oC!hA zRBoDm`;}$HQo!#p=+H&^ad^tQpi; zropv5`RvI6489P;9TvbOya1vQVz zTbajFj16`C{{u)tx4!s(MbhqLduNVYJNxKnjukA!Y_3?~cfrUWn6GcwJO^*7d^6JZ zODA9Ly(ScgSGSC|Jee}q^Qa@0D!>vl2?S^5HH-0^Le>5Y{7kv=zL{+A;Z1IM?k*>a zGUH9WUK@IW%rYn$Bmt6rtDo`rj|83_hWA2&p@utiZm?QRU9A=VcYz5fd%ipuU}n3$L*YID0Ed1O-T0$jgxCw5Lu+erK$(MQ z4#T!UBri|~Ysfwy{6g_OcQP%up{iRvOg6`JrkQ3ZI0}QD5^;h~4_<)R+TH>9Z>?Y6 zr;ENO-aX6OuIoKI^^yFXpv$_i$Q!5#py2XJCj*W&+Lg|UyDJ_M@bkl$HujQ0ayCY% zYjx-k>%shML&TbWh2DXvLlVL+?XDs+h8QZx?i0sS3CA3QYuVdJv}@bT#D~cHRIMn5 zfCe>UNK!Gu0=&~(PY>Gouf6ujcpNUA!A{bIKjceIOot;baY1~wP%)I zY7+QX^3vk^(rIKs#@;s>F2PAE0SA(xf!yTRpm-0&_EtU*@Lsc_+Gww5sa}}xbl9T? zc!Z30GGGF%r2N2)V>QPohwb#wiT?l%-rH5W*Nw&VF^_9*vyDRqX9OH%9AiCAeIcj# zCq=Z?rPN{4tzy(&w>8Q_0~4M}BOIKO#yV9JVf=2)-w!WgNj}dzPY8B=uNLt)!yRu>)@{>V__KF@)^mNOH1iV(5CN6}6yuOFo|x@k>G4xbyViUkc^02; zE@q6RhBCkss=%BKbHM#8%>E{L*y|DK38eTQ`EM;4i;KsI0XnkdwE$D|WW*LmXs+4oS%et}7S9`VO_>yYCKK=>Gr^ZS{`~e{Ml@ zeWbm<*;(>OnhrSZ4m#qK#Ge6m%?{e%S++#G{rX5PQ02E1ow@hO9PygFqG%eWy~coT zyf>)Fs()_5B z$}5zVM(iVyWD+yD0&D2Y>0~jJyz;p$M?eo4ABnG@elGt2Xz7ueFYT?C)U!t%k%OJb zJ4qwd^%NPc+2LLnvrF`f+~px@N~^HJ40;c0@qZ9l{hwaftj?g*nD3-9!i~%%5%P~w z#&hpp*MDt)XQa(6@p%^(@~gTkagH#5GAqYCQKdyUiM1B9MM)%>O65TWu>g=yKnW+4 z#}%BnxvJdfAiA}i%!=k;-hJkdXFW%MPSukmLoTVZ+vh95WnqQ~oc%j~71rv01k`4A zoiypAdDm=e5RobGf;b&|n$2GVYBuW9$z?UUQgB&F&O3~C6(tokKZCd56}(FZgQgiL z)UGq-S(vwm;1*>d70la>%4-B&h&^e@glzuyr@a3FgtNmp zc30QT1bRlGUR!1Xat03yK_rgdPBI02gRE-rXX0%OUGQg$=hjwv8E-VUyJ=0i1cT-w zBw&M(I$(@*L8MP-{gbYpemrE zdiTc<3HZL=>rA_C4)HCoEdjN=1Y;oJhaIqZ{A!67&FKsVh!}Hsc zR#?|^$fRKJIq#m;>2Q1(gW;~1HoKu}^WQ#~V{*`GECwWIP{owzf_C&htCR2!t$!bb zZsPGp=9Y+0mS)l%kf4#1$?QEl3U7e*4IcZ&!$h>zu5NTz)Z|rUoPj>rw*iuR6V!Lb zP=q5kO4??ka96{6{r!TpDIZ8WjT6{YLU zK!)T3K*%R($OI9_NUr8jgc?_i{I3w79BLMK_K9PwUun@x9Dy#Qw+bX6f_Vh;I^-W} zcO|R4oh`nsnjD(N>{hKDuv@?dz4`~1Fi8Lcz@B?!l0A)lyZdkW>rmDH8pWb(9vZTY z$EjP*r)nQ(2ryvqWKs`n&>K4++v3z2gn)gddQFyYo z4S|D`8sL%Y4st7$)-=0mtW$-GRwaehV09gjv962bG{XM?R*FPEZs7<(oE@P@Ao^n% zJ?j%!jmD1_Lq!e%+{5m3(2svw%4X5fovyW89V&ZCv?$_9BN8qAU~&~n$UcMS2S zkT5+eW8BfbEO*x4DYN)<;1R0ojXP;}?5grX5tGZ@a0yY)GEPo-uX6p7ekSPu01)HW zX40N%Qr=M;NYRx>80w^qeg~TQ<5tu!^nU^+)|Gu7rlyhs6ca=atT@kO z&#iq8`yN`$YiFqc0L3ic7ZR_YV2pzwn11*R$pa^h<0G67m9p68d!I^qw-I@MSPvN> zGIu%ZN7A&sy}%GS$A3=Q{&h|t^=neBpFdvJrLKr%_}bX^rmAk;^&*L;5UG`k*s4hb zo|Q?jApOPMQ|`9uF7LbaKH%_uF;ZjHx<7Tt<5F(j%~flN)ly}A#^)fY$m_w+`R!0b zhSuSTm86POlu|zF=REiAKv>YEY~bNH40BK=z?Nee<-p}nrAZt7Y=W zy}**;O``x&pYH}eN8wVvtDDH?jzi^@!zmmd;MCH@k|RXpwwunI#*KIpn+v?33$YOUOZs&oFagH%TNb>L6O2+Oz55ba8VR>P1J)1Oa`hd8C zLJuskftZOrka`kDcn0pI^&KnUe`&bvB+~pPGDV}?UA?1ut*2c{HNogdof+YCo=!PA zJq~NY%587J{{TvsXf``>BOJK_xdN?uSd5@6z~F<;K(Lv&0C`cIQpU3JAWqmd4ckOf zEND^{B{z^s%Tr8_RYCay$l%jj;p9dKDn|m7Yp6W$$E`pUM2`r~`;td5TKhU`9qq4sdY3r?9WB{4)%({7mshwDuaMrJUL| zyrw%%Wi<$6AgN5b!4RCB4oJw!;=W0--97XQjMwfoHomE;&y@yXx2dkF|@ezqjn_ax}B%CJ-zGc zb&*|xLy^<*&MM4a;z!Wa>C#hZBv5GGOlB%+yUhSgx|H=55Pw>I07$hgOzY6p3rn8I zr+l1oKo?|K?rmm*An-x-uLkjd?2)BiUrniaJ6)T?H!~GuYvl>- z@(DQzNGeG^jw<5bT+O50>htP4fDznWDT>{&o?5vd)C#%bpNUfq8*EXv?YHyna zV*rEHb?e@My@-4x@W0}Jhg#;+=f`?P7ITFyJ+79mGX?34kQDU*jNl)_y+2RUTE&uG zOH#bn^(~+q%jpRt8R1ZTsxnEy8R=g?>wY}8(>zmcqH1@V?Sa1k08sYxk1vo&;Pajc z2d7RAN1*FoJMovn{{RnN*m#`jUMYKMzR}L z1LSoCuo*juCm1vhGuE`-L&P`NUOm(GTP<0|_JePI5VQmsCJ0N2$>{r(00*Xf)!%?V zKJiD1d~}+Av3CxmX&!)+3+q`MWXxm(_lm#~ARHdq1o2X7UlT7b7hZ!=y13G(e-6W| zTU-bk{Fw?8asa>pfOec5AH*}@x5bTT#$OUFEHync*2Ys$TMpy2F zq!O$F1d-b`7ts1GvQ%L0z~dF=e;+i-ulx}&ml2oBk~bLRox}QOy)~7WucsBs`1@1- z&e8_#c~011M^V#{rv`#gocvjDePYjZVW_2@%f@49t|Ajc#sTeAX86b9 zZw`2N-%GjpS$X!$a9~3-Xww8Lpg4-=DtG5AT z1abj5Cy+VgKGm16e$O-M8V%j}@x&UudR5v%HLHMR!INoaVUS2U9CX3y#YaK7W6WeFanKRlKGo|QZ^EAo zPiqv1#AuR)UzERWbJXX!KaE&#ggzJCU;YvsGs5lyVV*nVJbpCpKXm!S;+Mq1<4qau z^v?n6+GEQbFmEhK89>1R0rz=12eo({9tzZ9(`HHh6mIRLb}M%>l2?ETBx4!R0DAPV z(R~lX(|A8zg5$#%npU!2-e|m=n}Vw0hs}}!>;?up*PiKq3D$f=XR4vq^qUKIFD&*~ z5VLtoxjZn(108XnYL--Fuc7g#tD)U$6NP_;LP({EZ&qm)asg0BBLIvX4lCAwX8!<+ z7GDBnx$`~*Lws%-8e7<08<bQr036rQx_*TopEil6>Ke|MscG$REUP3S z?uan}tc8F%S(*L`{iZxG@h{@`hO6-Z z093V}a<;MR7g3-wOw0&oQJ$E_?BryO3i`-b&7K^((lrl>T1WPC+fU`ZOvVBUQd|HC z2Ox}fJ!|Poq+=$V&?uscWCavaKm~cv#Y=y-O>GD`-4hJ`O?owOUlI_t#i<=cZT#pO z-1!H@ei*#eE{&F@d46NIEgW&Pk~R`az&(iKyx-y{g0$ZcX(D%)SR+zdH#z74&IhG^ ze{tm`o8BnhvDJ_h-@S0Z6+AiN{{V;@ELujZJ-vjIKl&`J6;GLiz|UOw9P!h=D-`C> zjeHs5j|zCo8E2DGypA?tvd3>WzK3sb0ru zCu1CfM&&^)MsQ9^IODDLm2KtKwJU^{ zS){sxe>Od?OB|sDfDUqV*A?&DN5bEQdLPA)6^(x1M}p4gIAyX>$L!2d5Wzv=Ndy)L zjN_Vj?D6353Ta+4H##M(7E%8IZfX{`S1BPYCBK!F87CwIk`GWjXA}j`9M!x*uj<;Q zT1Kg>N&TI3dSN!QfQ%3@%92Jv#z{SE=-pD|!rCv5C9{`D)UNOK0R@(ys@S0>8KZy| zf!$9#kcI?|9QMse`%r$*y03=3A0+R4;jLpwTXB3ONX%DrD>faYY@NgxQ;>NLj8~yq z{?8s3zLLXVj{g8!v((xFZ zb-XtNHMDcJ^owsU)5>9p+lC`)VUiCA8O?m@`)+AJ4xspHqdtSQQ;g?4=DIJA78kd7n$7$c z@=m&J_QjEx<@>4+KSTKA*w>qDpA#Qk((bhBZ56Efmo=fp@GhT+vo9S(7U(zBN4 zvDMh-t@S7W09y0^0IV2Moc%w~wO9=15>c?~z_nn)rA7(KCnp}h!nE~>=FxQ69zd&UoUoi`KS6 zvx@qQ;Z~Y7oi)K2Rz9`77PmRx=c2+Jsqe_Czl%P@r9%vx^Ns*G6(IS84{kBmw0nqR z>vj@en_+uyE_UQww17VZ^arofsza(+`EMPpvFvip7BUWBCvYD9NgmbmukA^#&G5#@ z#2VI~M7R2_)Jqk>a+7JYtUv~f*x-^nbI3LE_1DJl9qN}d&NZpvcPk)h(LnP+1I*(b zk&t)*^Zp%@H# zWR@|J(5X2)Mmusbid(SdKU!nf?4rDQKG$xSXaN!VgK@~n7$>+K0h+y;&ZQjQY4ZHC z8A$GP$UVA>{Bj=T9eQ4QP?&IU(3&?g%sujjeRqK(_Apul9GdYev@?^9?jk$&i>uS$#3oV_RuYjR4j zaU_wTRCBPNpem;d=d!A1n>zS_4ftjl0#=H zXXGmoPa_!r0P7m~LU?4h)-^l%FRr5_a zo=+mJYz3y*B1m&2U^qAp?Nwvc8ug2&2+w-2d8e79*qzUMk58~Re0jO(s(p`ULMq!&)&|1;bWdMNa2j2h? zSdynX9E=Z=8Z+laStF5FRRvx~Kt@LyUPsh&I_AF3_-`?j;WPFI`mrY#1m=K77@wh>9%IrL6$!&f&gq|gVzLC z(KeO~W99{RZR}X?ImbP#=3m&(((c84Q3cJ#^oA){%UkPTB<;z`LNk$`Mr-NyVpI}% zJmRRy?j$X@ch;p=-}I>1Zo>|MVw|#IVuDAsWBiI^C#4&h(tO_Z0F+U*`cXg%WZMxH zlY4b6ZiY8x$0u!Q$^9#n@%M_X{2Srh%}(=iNYpCEhYce!3Wz?eK&s`^;A41F@5R0i zj`qqO4@uYbYo@sqNpW-K97x$v7X*Si-HxLe!Nq5MJ@{X(=-O$w)^06h0hrsvYnLd5 zUdgCuX7$&cx-1vv$Z;fxXX{OleqUrOPBDPi}00sdBz;w|3Ao1)zGJ{&wt+Zbe zT3RfT+FQ>tg^>!=!M_LmWuW+1!qd&F*`E_>2ISn^-2(7lM=KT} zIKf6-j1V)%ITgBpXb%Qj=(=XBajAvVwJT`u?IZ&RNZmsNgU>_H9COp9bMk)F9ut@6 zgHcyTC+{#M0gRk_Qm`J6;2#Ly_;&kS)HR81+fvo%TZwJ#RD?pR6l9PxNC1<8lat=M z{{X-a2Oouad|$L)g?Oxf*0=bJL*@8iPLDvpx7ymA7qY-sD5Qx*h6j%ThruHw z2Lti1LAw2*d_2~-33q!DftSm0lJm$UV2*Q))<=eQ4~O0}(&dj!(xJSI?MCKF6-bau zMhg}PB#JSM84G^N%Wg(U&uD2&xkPcPaa-6 z;N*e^I5oN9e}%pp@P@4Vj*+Lmt;p_ixl zdrr5vhz&l~!YBcnB`1Iec^q`9{{XP`#pG#rSsaX8sQ#6pFrx#G!k)i(@u{$$=RFpK z;ghIIb*tJcY1Y>A$k0LxmyxibC|nZQ$QUE2@6CD7hV(BC>mD7uw($ghDbsG`)Fzu2 zaqe4)82qDnQ@~sT2?P4y zHS9)5jxY=5hf)SkJKO$+y1$?^RDK&Z;0RPt-tG=e>wp3S<`sMc^Aj? z;i)_$uXx=Qp@cxl=;J5|O zv!?1$-ZTv_mFB{^5-2B(k`+lb*Ho$Y+ckoN`DCPBC9G{3Y;*i`T?n6!DG3n&eu&+?O$UhAWHXHIRfe0SHck zmnu|&j=b|<5fI!D{z!~@JPS>qGI}M^o zcV%G=QIgOHiB(mIBLe_nk;Z-ftCRR+;>}Z6)cjGUYZ^tamv^GvtPL%Q{ms~6xnxcU zVnH2<_N)5cvApr7k#O;OmayAS3o?caA=|W!_ai>ND3-+|AHoxOYg~rr!^K)wjcF8D zMjJIZo@(qk+6Lo=B!R%d&N#0_Z;HMewbiB48&rVmcH3f_&08|W2*R;YGq(U>^flnW z7!Qdw4-LqX+i6#Nb>SA$#`dFdEWjg1K*=CvliRV)b_?QLn~TjuThJfFmYSxUYYmOe zdaPtM%tA3DsU!jj0EJ_a4h2FP-FWNlhee-I(w%2}#$C*(BLHJ3(~ri!H2tAGD{Ju? zWxlv}{@Kvt7dG%hHW?$0gFZkRY$zu@o->O2>%g|Q-xJqROKncy!*@EB#0?ymAV{#g zMi@u4fO0_tk(}c>uOsk(gzx12qO>^tTK0E$_P1A72_2Z*463D+f)6-3$0Up%)k8

;L8tmyXvrqlIkv9@^0I1B+LTmTh;>PANdSJZwD@x|BdhpVoGt31+tJG;1&O&?ly zE|w*-O_k6ebpbh67yw{%ig)cT;?D?tWbmzpwXFJnhp)V#tn-tyWB?pTa~LZk5t0Ld zK^=xcmabLpsqtsR{{RJ#6?lTm((+IAb0}sQAg}|K100jk`*UALd|vo}qt>G2(%oK|-XqGh<}Cj^DgL2MpzUrc;C zu)p}F3G&Uwmxd%|mg7{JN=vA?$T6Vnw2%QL06@saWR|Say%5iVKM!WpJPW6Nq?x{4 ztFYU+6OceXj%q)S*1jRqWz!$SUMREEq*e1I)9)Ej+?8yV1dvYU1OPeCE9eMqZLHx) zV2@%b3M0TE05Aacz^@qi$FFH#9r1;huY2LI_(;;m&@J?9A}c{`@&t}p)s7j2qz*X( zwptipTON(@HsX8lhc>rUT+KWa&hlD8bm8u7;XI3Zh{jz`bLa>a->U6w5s}`x4~DvZ z#*?9uaGNe>ndfC^1^#RioN=6Ek?CD$m?T#@T;~L-$j`l2><^89Z&3uE6^Ost-chJ3 zD%~mGfW$^4BdVO>oa2FC7ipu(w(H1Z56hFrKhGJjwEqBai^qe&HsHx5LQPExfs`_j zl!8O`91P>$z9hB1f;h-_JKc#0I^(gWv#{31$)f5Ako8V8xbaf>H^UQJrnlJ-3jTjgKn zOI6jnRPXmmr1WP$QaKJ-eJK{1pP19usG>yswCZYo+I34PDk(noOHoPpr~)SY--RbV zjt^of%_iP9`|hVlAZ(I%`cMU5B1f~52e{ns3hrT!y}$bP^QF)1*{b=slEHs}W2iGq zW4O1x9$5@Y`H_JPFnS+O-7D#M^Zx(=@AaZZ44*GN^FSY&U$y@Lfv)@~YvH?Vfiwm< z+BS{veE3NRIgT<&LP^O3*NXY3;daP)z#N~aWBAwXXO2D&_*ddI(Mzvrw%UxgJhjo!gYWJw#+|4&0PX((>-MjvuRJs1jVn*Qwz>FssKGtQge}B}CDNA##blEJHg^O1SJpB7KJYfN;=*jcA8OaSeBLoDYi|^oX0q}J zoo>VtheidI9tig}jp4rw_$v0-!(xAin!N6|`rBR-s(#aM2^RCJK&at*3+hA#dTf^ZWs+$#?$%2y(o$tCTBpWyCi~ zHv&T)p_`lnbK0)!o(=G%68MA4_-&|*joLEXMvd~vc)%H>a85v&1|WlmBy&ZA=gWos z#sqXAmHax=hEk`r(e-;f3wRpZq5V3nXk4_Cpf1)-FRFGLq#< zz&(3aeGkL_5w(-U*K+(a)Mv2!Mzt-)w2~_`>EIC=8DW=&k47A0BA8tHUT@vU#Df?F zZTB>@Mm)fqfFNWxdXvz8ee3C1d>7%B@P8i-HEWB=d>bXh-AH$la%BP=qD%6GU^dWk zoYtp_wC@R7uCpz-!pq2=ZFE*tTpuFrxbqhZak5n>1d@5ls^!w-K3>xFdA03I+REF@ zn(kQ^F#{2T#Eb%Y>zs72(4U6Cvu(t>?dG>-=jc~*S;cQXoEn=t7exWWXE7ZvxiLf866IIuMhZ<@NeUWq5Dl6-2+m* z({$Kwso;ahQ;SQfE%ZLP_#5z+=izjk*tolr<~!gFZ6)cP zaCrkGBOGzxuNCThN+<`gsO{8<5V=>BfMjI*rMr+j1Jn-HCe8fN)~0*v8%qu;HfOCa z(!DxT{b(dnh41>*s(009UCam^bf+wvdUc=+1`*nt(Q*euPo*N0>zZ>6r%wEeR?^^k zM~c2DYq|!b;xh(-_xfIlpj{hQ-F5+8%Q`@Ll05vUX(u`3isXJL_^Lk?d>`^bE66HE;+j+$PvJkWok&8q2F zgh1Oy^AnChZ$ZF09m%f{vG`YSt}lqi{gwBH>?XHlmsHajL>vK<2>viS{$jqX*S;g# zcsI(oyic^5fC4mOj2}>Yab9)euZ%SH?9|8P1&?oRf{@Btj!G;@#UD*nG7#xBLIX>O10zcae;$+q@Z2Clk z-vGLp8Pf-*TO1E#$gJMyO*nHa+-<+?rKU!*sPP7`a_qsGvWmh$>FNjbyxX||pINTs4U;)l?*Ey!I?Je;N+kP}q9ZuDDhdC|IFlZmKme)4n z{gib0qS$p^T450&5XY}Po_XMp%DtENYWPMz8S7fGOWVtfE7(j?c7jQuf%%V02aaAV(kEML2@Y6&6pZ+2!@I}U*rfOaz z)8RgC$%xy_bYmomQNabaf&nAY*S!1}@ZW?y8{x~{Gs0K0UTI5u#zmfgJVhfYCNNG; zG1HTr(rUnYwwdvx;-88%lj1)Pct1zh{5-(AMIG_`SV5eJTwz~~0D0#)=ntv<9QduJ z{95p_)hr^ov$?mF+TUsSiMDG?h5PZa?~caE0rbOr=J2l@1y?WeUrafJi4G9>nl#3&m1g_=CfD@n~A)T4m(% zV$)U%vPBex;4ue=0N@aM=Dg42X0s=R{CqXLKMHA{BfltYV~OvUDQ?Lb0Hbi*a7ZJN z0UT$XKaRJW#*^UR1#1@`8oG-@vD6lS5a?Pgo27;Z84@nh^Mz~@2X1|66DR$dJQw2c z0BL&dzleNBx`};4;^J#bBFm(V|g^hW1QoG-o1+RQb`!LammKx)OF1}SzMCL zmt%3ysjN>CX!>V~ti`6QXC2%M-eh~Su8cY|xFCb{q?c0kU_adzO6O15UmL%08(%gRbWNBkP$WeknTA+0V8hzy&!BOK@8tbJXxF-SvCl8ckzyVPyIvTS)+dKeS6Ab~{KVhTH%T zr(A(ip!GRli5IV+{5|mAyJg`keOpkvw}f4JVnUfj41lTvLB|R};G7(G>AnHYVXRxt zuF0lpuX%3DEj37EZR)O>cpNb#JZI%%F_I5@$MN5XpIPvpfuURYy8i&en*F?St*!o- zA^qfv23AGKC|GACWOW!dTlQ|Ze-8Kx^Gv=hUJ>wB?xS(1uCHqtSY@-70g1yMxne=Wj2xbWf_OFao|EC90r<+o=Tp(N zN71aNic5<*G`&Q;ETENjmLNz+3=ReWD}oLy*S;!iSC)PU)g-aFwur2IrWYU-FpeYy z9ta@k2ZM}PmiS-6_WuA3ZM;b?i*&k-TD7BU7q4pqBvNfq72-t%sVE3I1QW;^phnk) zKWD!R_%87^YrhU!>sRtfXNql7?8JMW)AapkO1Zz(=e4+m-)PZWNEjHMV{W)B)5RiZ#9+ixLj`9P=YcCIpp9TE4q%(I4&fa6A}GAmf)h~FSt6`6}LBomTI1PovTI#GsYRBuMZ?WABzH9FB31PV`G)N5#`kb0cRPACH$k zt47yUCehbsC0qi`dm8%s&-NJ7FXXf`c!vHsB%Wf={q5XvJ?L1kf-1vW5O-|C@8+mmEz6KJL1`JU^13d^M zIOnx}xnrlnrP{@9Y?0eUgNULST%M$Tao)Cywx)7=SsF*6`czEYM?e0$et6AC{<9R> znCQOg`s7pT6kt--Er4I)r#IcE{{Rg+zU@ogWQtDSDi-^{g-8#}P`BMRpD4PKwhwO9 zD91sHjhOL|N>yXKtye2UCu(gJRE%<~F(F1t;17E6AB)}@*JSvCr(fyXOxJOJmr{Vr zk`+fLAQfDWR|H^oAd%j^`aiw??=-5#x1i|cGk;2@8|nwdqrrYF{{Vzz?8C#?t19?G zAc+VhtcbuEfH@t{5_6tw z?1qv}#FK;GoU%C_yMMq=DCH?19e9Jn{xH?GspUQ&xYHw>#qBhWY_FSW**KL>GC*z# zB%B;{;=YIvYin9h*OQ9$}SUB#W@OU}r)}g-e{{V{b zv|WD2=Rmx?K3xhHKP;v%6vuo0qZ~{ft;}F~m;)RfgVgcVKxk-sV3GNd#8$76B*Sm$wI?1Ym>hRqs9-_^p21{{RxLY+c=2=}Q6#iy=tJ z^I;?(;N*gR#eKT6HtcWbCm8zF-fZfuH?rjjToKl;%v{F{@UG8OxA5Mf{i|;F*KMiX zNENvy7>qVO$36b0vh>||##g>8)byz?bXe^mnLfucl!v^HhDakL45J{9bH_^bh4WT0 z9m$XZ$vyjXUP0q81L~e6Yx_%o1Y6tO%PO>5)K_Y+8;8h{atL9Ao(4guYaqS#J+V|r z!VCe%Dfy@^<9MKrC6mpO6e~%BHxK|M{Z4vRwGC=b^%aTr;-jT*SbZr^N|IQNdQwqE zP{Cx{aro53?*2V0yD#xlq}<}F;_66LGV(L^uQ2_geje%{5Iz`cwwgp@eOBDZd24RN ziKK~yn?9@t1$u(?rzjahogsCiwwqE*Bx< zWH=y#NCXUEjAYlB_}k%*r>t6we;4VNcX#*JhRVlDwve=qb0UQjVM!oHM(mNnz&uye ze-S(r@Vmu6A(sCDQAxDV5=S6euQZun-gj}F7cr5$j^rMdtMJF+&x17ktBr3)wz$+a zyolda)TMc@!0rP#-3J{9TxNogCGijJ`9H&-f_@y+JSU_LLs_s$;<$(mnTb#xv(F@w zN#m_~t*?RpDEVSU@U$@ic9_;uPSMaXBe$+=>@7p$7LBIOEOWiYa-$rnw`MsW_~iT5 zc>XDPUGx;z&b4luVI_Xh4i#imheijG%iK^>c0Nms!M_!4ZqXp{eWS%8Ig&{TWguq& z`X57DE#Y5^@~g!D6tc@H#`Y{Tka`|FSJwU!@ve#Edpn8rd-S_#TqLW4thpIh!R$vM zjtz8n_IOjs>*-0WnySrcd`^5H@lHtg{{X@zr{Dw1fLNT9fCdRT{OX0*fIcefam@(u zhM#UE`A+xS#yL3axNvdpUv>SD+;q5l? zYF8Kc#Kf1A#&I3IN1?$alEeXy2_TAT66!f<&#Qb#t7*Ol@V=w2Tq7-=ga+bfTo&2} zP6u=CS3C#e>u((RPfYOzfR!w@2!+HRYHebtp(EbDGrjSzjDKsdi<YTlWC>t@dzxfV-Z6Nl2sH81s;HQ9+jf( zWb`%{{aNQcip}wLyw{!&*KOdB%$8dzkrhT*lBWQBp5F9o`u3UO`%ylpc^#Z(f`^cR zxjy95Hm@J{Eykm#Ngkvlg{O#H$+$>VWGEn$lkHDYADiAe@fMwJ55mna$37164~Oo2 zF+7lJn$?Y@fu7yT#>o(6w*m_e+=}~);1s_OHQ$FfAMmcOV~a+Zn54Ua6)7kIOE&I9 zcO?3I8u{PEpSGusyj9`P6VIV|Lr0cR4zYXNYx(xvh{FIKV<0iXCxMbd>)O77{hxG= zX6wNB8i$GPbh}A4?B7Rkq^86c@!+de1c)#{%j^|wPpNVb!S>bDRYl-|juH7lRw~v-0-colSdBNlIHS3=Nem;16 z;0MS&91MG!^sWtj>G75*?0zVJ zX!wu7T8E7MHzlIQ43;hCt-OGM;iJeWa3ee({i>0o-0DAN9|!3gABA*1Z%)%2NW0gi zx4OKy^Ngxw3;=Z`lY$06D*E!i9Q}}Wi!b<0{8gZ6QEHZ+6|>bXuC&V?Qq`e*Q6WBL zYFm<_f!YTEV;yVmI?h{~1r$+G0Ywy)0h@W^9V<_{Yiq4a&f4H6^9<9fuwPOM>F-`u z@mu2`fwU{#J}dtK7HKxJyl*0gx<<$y#t*H2QvU$KMxnd3{jEG^k2^^1_Gf{cCu%eZ zc8u}djxokP^Ybgi43WbB0K1XFA(fZzk@|D}C@+^wpQK(o_>1s^$6hn>UZXdOd^j~7 zIvutevt1qOFPFh(~XQ$X+w2GkH z>M;o-a1Jm>1mtm?&`VtpvOXF3>r3!&#mz57@VCUdJZqtAcJs$|X>lUTEhJ1daw7qZ zl6eONB>PtEJ|>M_0elj6{KJpVzc;_(q`n}mKf2az;!wba7U7s+=YmH= z(EC?g;6K{aUA4ZHc%ntsEf@@WYOxrPr~nef*mF`d?T;C0a(I&OPStenO|-3E#hAl# zu?dlthSo_C;1oST9D*}fygCkw_t$rK>!@m1%&&2Bv4jj%U;u!e06XXTSIp`ATXvY;h420x=rZZokZE9fl1U8KF6_#z*;vlu z(Lu)?8uQpbGeI7%mKu$P=9cpD47W+PHzy~O3BbkmEDob?x9<^}D4DsM zFbORm_kbUbC#Iw6W3u>(@g{!<*gmCdi!8RxJkZe$7~6t6WRr{!dXK}u9yC7}UBhi< zYpNvEuJbj`i^mQ?85_vPdko_}tKff#AGL>xyi0kgMG{&IZ$JGSZKOzwt(7>=Gskd8 zJu3B&?Wge}qDW@Bu(%mqw6Fqr9B>F7dB!^mjaVel(4PqS+fcaiM3xfD4YaYy>Toci z4!P^iMe$PFUx_~rbm6E^CYKsr$>z-rd(}dnpp%TKJ&k;8@K@vaiabH_CMho-2J@nI zm6b>bjE)9JUO2}DSJ|EnUl_N6SHqTmFwpe*b&ok+?(KKUEOIztiU|X9-~e-y4?)4E zhI9V_v82-JzB%!>g4cQ zZ6gd$Pds$=Jk>9O-wEzK4X$e%%$nVvs+SN8ELy-~A)|b-IXEXigMfP1qifz8vGEc{ zw}#;iXCdupXj`73ka9uvt6H-?oz5rV&4ALa^?M7uDXg{IQEzK>w*d)w)en;DQ-U^O za(OrzuTF|M{Iww9_s=z#q4;l3@Vqmvj8X@x2Wy}Wnqy1sFqpA!n9 zzw^6ZE!xy(8f8&9BJzl@-yjg1P@Gq-kGfrD-~{KD2QC<;LMC z7rsBTMA9@GBxwNHP7{@Go5g;X_MS+~1zl7@ANb2Pd!7@^CLO9*QILPo({e9YWxJ?| zQ2f~*ZqnGDsMv2glE3(sfy#A1(W_4EY0!N3S2=&pi~Q;^RD}pY)}JkfgirFKEbeCB z^h_In@~=T{t+T1@5t&VPeQhfPA;V)&=3Vf|gk5y?hTG`nE$C{4*NYU5(^+KWjA zB__YBoTeYY__~?xWXxP2116}enKk8L;1W*@1lxctu`wp2WkNmpUdqVJ$js;`OkQ;> z8!r+8&aSSw<3{xq$DR5p&&T{O_V#ewqj&v1Iu8z+-2Y8>O76&*g!;WS@fwr1qYiB_ z4IZ8Q`8kg?kk>Ve(t~(y+>1yY-~-o8J6*yWsQJq=7F;&iiz-@(K1b>8^kZx|W&$?N z`FEQQ1dc}oI3n5*P*U!p(FR67tcUSs4TLxS>J#aPlP<@&&VF#n%9NLu!_G_4ZpSA~ z!{f?K`T3v9R^n?Wx~L<7eGEH&bA4}Qw<;|u{#+DCUxk6y-@DvS3_MP-B>(yq8^$TY zmK|cVZHen>BKD`bSEMO%M-QFa_ch#lJx-C>9;vN89G#UFofQRQ6@RR9Pko;xL!^k( z+v-hm_kCxz+(MM|SI2?DH#_!~?G5LaO|+#PT;~!#*++C|f|SVteK*P@7TU zBLS3I9T9v!|3t_2AjtnDpphf?j$aCrq@|(SI~)46x?RPq+dbJfdly%^Pi+;$RzF~a z3O8Ex8S`=3ZKd8&c$R2;4&{8GTm#T=Bzg`2*euLrU++Zlrw}s71GkZ!WgL+=bGyX; zSN7kFq3QBgD&h!s_Gn|aCjL0zRT;9QAcG2M>KxJ~KNK8%?5iHzXl3wNbUtcakQi2U zmlxba(vp$wzQrF~+$uI0Dmx_ETj)^k(pXcQOGo|ur#$4TN;)42`IZ2T(jpgSI1u(6 z#TM&;+D!CS4-MCBdP2sb-DX~YmG4ml`J?orpAk-p&CLizA;U=D!4cG{`v;)+ zy?p4(_!IYSG(4tnn_TGKS!vKvl@NZevZTVy>@qh#6U5SlnCFUCHTbl_!oHg4qJ-`O?`5$UaxVZ+)!c$ zHsD{J{L_C0V!qGWU23+BH<^y{Ev6Dnv}&aDH@Nwx&&Rk9BF3iokb<{<_pZRHQSQ+` z{J_ms<(ESq`mwR30oN1F8|U>8D2Cn}ue5{5esoQ{0=--2mc&UqU9 z)xT@&YEB_61jwwhe;u+W_=aY;56uGqni9JkAl3+XHKwQ2T65J@Nz^Bd|5PMk zUe8l%gr0(gSy=f#qI<{#$L3azxl;nYwMXOI_^3+h&ihaxbG-G?`*71?MUVP3}f>_E&i$ zB%v~@r@OI6<_0_95a)3<&M-~v25pn0QsVD)!~loqEUs7H8E0kaN1r*Rf9LVUJnGJDtz}0bH2V__*?3gNa7p z5{*_m{RbelYft3@o0WMrlV%j>N2hBo*e=fmfv|l82;Ut} z-qYLqNqfrT+Fl2?6p=3KWBpUU z-f3~RU&!*Q>lI0I=Xdx&8T4$0^G!W&v^Rr_`Xzb~Zsr>PX$Wd{%3uo>5mMm(wXcO+ zag6#M309m%fA}&KkP>#bqwBB>0Ebq`3woYtVH@UZoagtm>MDhxrJN>gox!hWqFCCg zjXR4)r0AK}VJCIqmd`7|QegGNhgl?otq4gZ{0<9AP@mDwh1Gemy+aJCz=MdpF z16ChjmRBIIofbb5NH{g`l@R=F?QXit!SogrhEW|!9z9VFQ$x7BLyL^x4kbqgLTsvl zv`41?+p;|)a`3VL0P9`I@C2AETJUyIvVK(fp6}24T7OCX76U;>ocFZbizCkn$A87h zxM5y@WLkn-%cR@U>DB4W@Z}D>*Hm&kE94I?S27v5GMLXhS0t#ttM^p@0gTP{L)5Gj z6lhXbDBjq{KBrX0D_|ja84HsL8@k#2j%AK&>9#MwyHw{5LNe9 zz;UfPRz2Y7m~G+-&09Ns+{lmVhO9z~|A1FID7J)N#;~=_c3#rtad9Abv)#i9vLd`6GJ8H;Nwi_kjrGe{)Sd^s;p{@y7 zR&4~cbTnzWYjmnt)wzusIpE=s?6Op`L#VKvJ><6sBFDUxwCE5mJI|n4Rld_9$q>Cy zv3Zk)4M1@y;TYrPv5_ou1?n}JC+1G8DjCugl)H9*N4O~2OF9xuXiDeTu zD(DES)M4l<6gd#Sm;W-~g0VU;TjKp5mD%1;iYSHn(taj62(U=m=BGLGqXXmhpr$HI z6bMV7o+Vx;FjHC%)%tzhWl8DZjhw-=D8J=c=`Di!mme%&w^>lMEuc%({ic44aN>R7 z9g{<(X_L8Qns)HRX?npf9wD&4aLntIHw1HTeuKdzxC-1#h|*mu`O!m*Qq;}T(cnNQ zXK$;z>#J2Ix1E@moavx^05(bINJvZ9U&b?S2Qhq4kECnZ?%IrP?d9m2-Sq5guv5>^ zH{f_zMZC-6gMTg{hb=Ai(4sp?+Mb(V822}*#l7Sx3CKbg!QZJjsU==QT9}49R?t8Y zBH@Cw_ViAp0=q=`Qp99N$HtycjDYS`igawrQcfe!2pvr(H`uItx|>psPiDW-j*c<( zpXI5LS9-V=t8rCd2VXw0=lSZe+wOV3mXF=9=h{EpS<7f-cpJfc*mq8ktygrj{alAM`05V)Q`qFb z(0+x`WT*&Me9U9^uxuf8ZTdQlZZ;gtAJ`Z4ImX`GgT}4(vYkR01HLNcj!C>91LD{; z>C>At05!J0kEtF_KhBwwIj{m9%Oxe*-^yDep}O_?+;~NwMqEsUsH(%(Q)RNDdhA?j z3%?`wdMntjTo7D%B}a-c>Qvm6!dhnb=oBIg{$^=6B$VwsY-qEz3e2s0Zdo~C;)1gN zgqfU4hsL-*oaDZx0ZRPqoZFV&E47d&z_It9Q`oEUEZE&${3)iT$`i@;*DCFMdFSe1 zhuccp>d$JATT&vXA-1=Rk>IR~l!G*CK{|rOOOj2tm|*vjO*{<0QSbbz@Q;-h-t6{U zqnFm?Z-5#lw(0WHL1{tfJ*GNZWYg~c&vD-;yGl$;02vNk`j%ljpoDIMuYn$lj`sQ) zhECk+FZ#s?j^~#mc<%U7c>(;x%OpeNqVQQ#z z&i~x(Ll%sk=p=Ka_tAz0Ej{Doq7+d3F`WWjkeP=Umk(YE>LjJhOp&*{k;K8Q%wAJT z$wNsCwp9PM`h0raUOJiH{qmC|v~$}sFG?qL}!H1E$} zaDtxfno;9d-o#>DPa}3p@sqDuB@++F4i{6Dj-FX3d$|1ExcSWJO{y>_@~Am#XvIkM8^3yqMhQQ`_;DT)`flN^0cJBtXugXid zDaR(iXL|S`VseD$d8_O(ME6LA73WCn8?xN3MRciOQgp~!y1D|J$@k^-;xk*fatr0C zXpC$)N1lXx6;Vy5=dn85&46Y?nAS-Ce*j+RyNC~B)6?bbqTnw-|FYFl6~%tUUPmeH z_v5k=+W!H(BIx~A98-FAoyFYKLGKn4W&P8f0k+=63HznPR1yZq+QW=W;+K;W`7Yj* z03(Bqk_Vcv-3uE06T_<1c0zLGcBHF^BRGVmF={XP+gZ@5E%{Z)I;+2w@lGcI@~jfj zaJAXC;%Ng-gAh9}sW&vny3A);1-7<&Q+U2ROJ8|bHR^?)pft2d+DMvEojRvcyM5VzfSd)n^-oyR zQ_cba{_ri7Ko;Ya_WwQ|0TzOxhnvB9$w9$$r|ZM^*Es*C&p&54xx9+-YPeH|EKl|| z8~$;(L)VN1aU}e4N6x{mvu*o~-~MWQRLclp?3cg?cOZMyKgUKgNLEHSyHh)f=J|D0 zm>#v}45%Rl#%nkk*i(tvMX*DWHi!4V8hYD=#Z`_uPF^=;fBaLJagT7n*^&0B?E>V+ z`b92UydR{{6$x9iB)^;=AVoyNqYDW#GdPB$w`Jhwlk!Atnv`rzZMajY>Gt%;-{}FOwMKHagW8XWNn3legXu8M-l_BM^Hubmq7LFa<)QaLz^#GMfl}uzPEmCus0LK+>8%B9Wt` z4fSft!n|k0gRyRS!dBQDK&-3$(Fqj%QhZ3Q9(l8Bs)d(8wt6uKTnw zPM1FFFxnKop%*Z*t~DW=){0fXlPPW6s7gpI!-10cUW2K6f$T_%`*$`vzTyYUX`+B^ zm=mKlFkaZyuO*L*W>0-w&cG}ZyWPHkYv1R(_ww|`xV;N|zW()yVxo0I$3Rbb#tLBj zNbL-NC$)dq2hNSL#%d`!qUMJr>npb_&~byuuDZzCXLE*rUn*!InKpPn8QBn&mw?N` zX6z;%j0Dz!rT{AgE=ZaP`K3A(l+p_gU_&~@hM0y{uRHZV zPH^?*ifyTOoKJgptmZ|;*)isep9y%NwD@_;ZfVhSo%l}p-sa8n0~>-z@4$cU$GbL2 zW3lKHBfOY*tQAS9+fAUHIJT3X;3HM0dkM z*o|&Db3oisu4HU6QVVZvYobfvn0;*=tw}t<`G)jdDpE^VOj=siBwh5Z?iCsD3u^vf zcLd7pWZxq;#YC9JgmEg%{{xKbY5fO)$72IA9$VB{=$D0$s{j8lURcza&27xSqtQ`R z`Cpf9E{698=@V1Lcr z6A4dVQIv(W@1twTD^gNxpS5Tp3T$X4f1OB7dgrvBKfk=LnQ-Uk2VR!3Tl=yTYhH@K5qGt zy+!)FBbh#n;HKbr;rIQ;V&Fwrz?~M&p&+jIH|EYgRfZc+ixlMjGhRdOx$|S_t1PG& zbxQ;+3Ro8)*3YW@s=Yga_wL`HE&J48vX|J_I_A2cu9Zl6=z9-geCRh z^N)|l!yI>C;z+>Q`WM~UC%Uz+68L=atR3#NrF)U=keGfBe7qH8a|mADap&b;0lk0R zj{x-;zn|Cg(l_Mdw3mcwDEBMGgijulUyRfh__`SD~vl5 zEX!YPTlye2ethaJ$4n5s-}*w+G9ObzsNu-A!+5ixUQh7O z?cO;-GN2b-y?ye(%-V_B)82*p{(byM3vq2bcSkcsWyw2B*#)_5TIdQPd|g!lX(m?k zWimZ~CtvQ|rse8Tz4p`W^QmL$C*z1Ip$PARtsCt>gk^Ep(T5Mhs$+Ltkx>~%q0h6Y zTC8c8GoD^{d!G{T373c>1qp=;GF}=ika#I~yh#45%I&Jnnf@Wo37;huL_2b)vfLsK z(lGYZ?;i5T+Bofk&S?x?Dc|=O)A<-VR`VJzr&AJ z%2U)n*+40be5N^2b%h4Vt7+AoP{}o^EI z92JhFgQJ-y-gGR4@CRe@*52j!IlrVb2qs&GNEwtAT#LAH*2a|tg)*`V-u7tzZ}5@V{*Eeiv6BA= zj=1BV>h?sYF&_q<44IInl%Ez8V408YAK72aN#%&{yQGpcSV#2#?$RK?2~~gft*c0g zri}s$XC|fP!GWads4XpgzPVp24LjC@Eu^SGxunG?gpQYIyh5v5G9`?Jy~-vs#UA6^ zdM2lpL!Po7nI46gzxruV>XgYa=0!=UYQHVVswzU5U*~kwk#78Jz|TfJ!#e$iMM1_g zYZG=NR>hQDZf50~>hz-$s~eb@+E~EV`07QH?9owgZkHh-M+_RTAlX; z6g`!&?VhFAK`ezk`F`dAtv+IFO?R9 z!8YCunauGFf}KV3_(3xSe|{%ler>x+Y0Y(W=q}_f9VJvHr=gzbD7ndVO|7&03KY%N zF^ds@CQ3HFty_iI%;#+$B>x|_EOlYU^ZwpW|i*q#S1O`BpxbGpG;BG+A>=TWqb>AT#@3tO6t|>!@OWOS(+ObhPM> zx8HF6LqB4RT$L5;bi~s4nw1CHNJ6wwG^l{ytKWl)P0s>3+N`=faG+Ty>on;z({Wf5 z1~wJZdm!j(c3ix$4vlC!fOjvM?kf8pZ|_%>9(}&6%wNZ$H<&do?dci zC;s#Kr%g;^XI_SPMu&$_9erq_UU$cFUvTjs0Qbn^dGk_;WzC_1Wbu{lgu4f0j$Tx4 zF()a52k}l(;O|b$RR=6-v}rT>f$xyx`%P}5D@>v&cr`JHuP z7tdmyu(?iyYGfLXM z)Ry$TGLqvh{bwMR|+0IPs6+kS8Wd@8PGsUwBhXAUm-zddrs1f>nVE2Uv>N z>U8nH7%2Xo>G)pGrOS!FSc4)^>pbsSS>mzsf*XU`r^v@E#oHS%PUd>}w~B|j!1oo;V3rg3W{r)&~0+vt@%PXwF(%MezBZ*aTaOG zaHoJwqdpFMg#MN9P!Z6itY3U0X<=$aG+m5eo7{hmQu#y!7?v9YLRo@vxjXJZ+}WU(Wa(YPs4<@J_W7yGY?pu89^P{=aRWO_uw(5A&d-?fzq+v1+DQ4H=P3)_BJ*lhYEO9$hBR{g~k!Is2B zAM&~c&!1uU`+mo1*)_u`{_;LsJWQx+Z9|o&Ro8Tkk#mCQ9Wx}|ODdET>uBCng)x5> zf5fw^SKK)+U#~U1W;c}tv(at|z$2}p-P$@AI(`tjR9uSohYkSqQUzC3#u&htlbGBA zK}?c{%CmWBA!7o;=eO%U*i#l+3o3kf#+z6_Ja(9v>kRw23pz8bL7;^Gd=}t&mhdxS z?I09bZWg_Daq@_3zMj|~#^cbot=oT2K-7`)Z(tO5QU3SyVQSIhDU$K| z{6o3I^Uwr+2b?drG8s7wgyQVBEwf53dL4Sm1kuwSFOXiIy!>U{^hBK1+u{s49VMEl zStxyWr8ugHQ)aJs&N6z|N zO1VKfTDBAs(j{71F`_xlcz9v}lUXuJt>sNfu~2-fD$e%$V!GAkklTILfcrL}@M4EJ zQ;yMC6E{5+v^O^F)yLH5P{RhmkejZ%NJWP_2z%wG@zTU=&ei?&To!?N7(9TYwxN;F z{sX8mYLr9>goA^Yvn&F4J-M8$u4m#+UAXTb;Z{T%9a@Tl~X2{^+2Vaknds=E^x#=Wm;N3Gr@1tMbac1++u-B%%%S%QFsorn_ zTs6rE@trJ-j*_s+tK3{FRqN8}?J@g?0H)xG_sRlmI{kVJ6!KT%a1D$LDpwm5?qB;e zzFGXFg(SOOz-aB`8ZP^zmstZF{SD$rO2LbzVx{;dlfA`ud(ika$^kNjCStBh5BcWm zI%6HDvKc;Jo8=01SmyX!-!;$&xICU_3aA|JjQ!Zz_x{vc-<)=(?E1Zu0t`xlhZ`^@ zs3f%;a*dW6>}8q}=>s{-ur9cX)G@hyk8%6*LX-WG>1cX#7@BxZ4o@7olzrL2+_V5Q zMw{xRG!|=3>OZ;IwpIT&eeJHAs6R!FPwx58HdQgOcnD76yw=)NHceM3d`4lcf5IYZ zod(Sq|>&6^2^ zqUoPp*%z9t%F=L`);#x0_X#A#FZ5`Jb#SwoWIht5=V_iR zDjOREU7{Gguuv)e^RyveF{SSN%0I$2622O;mfhT*9P80!l8TQQqa+ykBZvUI)Q7{N z;t!m2Qxr$7o>T&iduD8vBFJ!5y0c$6EuW=%=CVF&ehli_Z%6gD>e0+pft{t)pw(8g zo~aS#+4(m=eAW$s>T$-vbWdRT2|;+NlLe5z^C7OvMRZ0J&U6@@JiZkrZbsE3NIW9T zbYeMTLQ^cT^rs(6nV_uM|91(S-mznWwL3WasczSKF^j2s!*Z5iN~jEQM+s%LlO}tS zbFDN_Wo?7&oRA=#m7^s}1Z_4lE>$=y_|=Q3w1X{_vKzMolIF%%hGgOC;?q2CPIjKZ zrm=z}%1YYZnZ!WcMi~80A*GK?_z7{XaEeYkbD1#>_e8RA1VH?)(BSp^UR?$f`3XfLTLj^wrVWXw%XQ#EgKfETE+AYly50mxw4=o#?baZoL z$(&d6=&#<>lGw#n0;ydxid8#MCXkOnD2o8lWW(q%EXkY>_5ukaKm>a7))&?_WVqWW zK6a;Fp`yracJ@mk8c}5&fLpes&tezjA2u4u3H^n)$R$|sLyyu~_@i4=o-g{O=uXX< zu7_G0WG;-l-Ho{tKUE&pB4X5hb2m{eZ_xwUO6|Qow;TvhSOe#x^@hBT4_U+{3u>N^ zHpHk)m3G)ds@HTCA1T;KB}_Zth=e@}&@W$sDO3VSRD~iu564dKoe~NRlfoNYESX*0 zuaw%Cgk5v%*VG79d-o!U0gY%nM5;1)qTq{YBGNX=`&1p&lx#w)j|m zy*vXua9;X&7oJwkAj}Kg`412+Lb5vlX7-Otibg)S0*_!62Ni`pUou6N1h6RkBBgJ5 znqb<_9cJV+%KaYdHLpMG%lTxUUb$!9eKPyL*83kiFcA-!DyL#+XXge$K>k|r-#TKhl7X}H~yr$Op}J}FC$x(u;`U2oaqvg-^B#) zcrM)OSLK$NLhFW43$E#|Z_H;txoK1O*t2}_Fg7Ah_X;94)YyT?7qPUX+*)(;9y0tr zuk4APm(>jPk_lj24&t_2sLq+o6y^alCX@{8UY1n2pF0D&#FnwvfkWILL`BmCh>I_SO>-cDc*OD&pc! zAJF!_vofyRv{Yhl#cZ8-c&#$aqY?LqW|-A1T{4_uDpY_Bj6k^<#aUoXODz=bzy&7H zj3Ms@G{%S3IU%gI^416?+NpHEpckx)Vq#Ph@~Z3Iq-@gCU(x%+hSQy$Pe31`$T)-A43 znwjQ+ZEfL@jG5FpmbdTEN`9QJI*j;X`95fH4P7K%EMH1bzY)z>>knyMA0lI4f*@8= zM8_8EUq^W_lKu^8c%TQ^dDH|gA9=N3vPYg-D5CO_N@?4Dc!${BO_83*d>1P@Kl$oT zvzJsxLcW!9>%~p&`Cyfyf9gU$^QT!JKryReW{Jt6|tfzfd-bO*Nu{vQBKR6m}~?t z`OOu-cs*OQ7ppP~%sLW^3YCXv!Ss<6j^R!&;S4JQ#e+;SZL6;-GxX=UE+Ig9w=j0x5Rhi`x1p$u30GeNx5!76KQGybl-ZCZs&Y6+ap%NjY6mTU6sA} z^rlJn+D&qYQOsTi$zDV-aP|RPW6!yH2>tA=@bDa2ld7|;{JT9MXK&f2R zn)^h1h?5}J!$XB5BO~w8fm?{l5_#MftLAyIZFi$w5=@s*|BJ(;AA_^<9MVl@X9In7 zYnbRa!7gMk-U;6ZvnRkl$L*zmrG;8Y^D)B#$S;@-w8Hly2ukKlg;Ou@yz3fU5DMk?daW(^uq*R`3>6dh+R^{KG2kS`Dr4l9^r6N6=@aPrx=`{iI&v+w zCYpQ`hz_ESip zEhroC0E~armF}ETy~Jw%fDNoJdzPt1Pv)A>)|k~=JLfoZ-vnFlS{j$~UHuj#FCpE> z24Xmnx~$7?2L%v&?qP~X{CBerrvyR+Z_vjU^k`GFZ;KCt0p7z{H2Iwj{0nW-npC;H zm1yG_BgCVg=!l#Mn3z)=+a^CzseXf&Sr?r2I4`$LRi2CXUIEL zeR=t+<$=l1qUxu~le|ks{#-?5WdcgP1$+tflk6oh|<1GeCgyz+8Nb zPPvh#+H%g#n}*g~^Nn^$GOni4R%8~&&>9I^qu!276lVU(6EMQ5IL^?!`Y!pwc;Im) zAQjXb6n*&Sl5*f-T!v}Zhm9qm=#clUR%E@LgtvAcT9r=tlmRD70-uExG)Q|XI1vN5 zA;0`f9~t&6fJ6apdK`pBQB_}3I=a5jd49yVfU@)ogzXdi zW!=naaEPbaBsj>H0wf&qXGw1HFUK8?kl}(bJR-F-_9n)f_)#J%+^F!JfyXntBkrHoZyui z4=#1_XQ^6$we!d<8^G;?M`G_# zaF_2+AI3I_FoWN< zjVIj$KW}JK{&=6+$O*+&X4MSbp)I_9^7EJJ24-0;>D6M0>^4o0X&t@RqTq=;bA@dR zL*}Dcptv|bI&lMouAFp$8@ouR<_FhcWYigJ-Ko{}c&-`+o<5~aRl$$&%oNHn-fVP> z_TBbFtC?z5VIAwgksR~Z3t#NAZHe#)^cx3=M*)`u(uXgEQZbikj_tIev0?>uSZ{qG2x=lkys<0xKY$VHF3dL9^A*j; z`j6o`^TEeWMI}Yq(?&l-peXo|B{N3%Y{>82sR;VljX&hYSJL%Q3!oQYIEWbFR^Ay1 z;o>IHcXv<#$4C(enk}kZ9TeaFw5rT6=OCAido|EOMxFzsq=~~qF8St&734Q31IC0a zqeUy>D^3PidG%#cQmeBb8~`hNR$@kRnac@`*p)x3c(6Eu37!lSamU6IRIh*JtF_VD zr84#OoW?IG@cG@t3j!XitGp`qmo=O1%p+s2YJW7TMy8}Cyya{(TaFb4kDC5(1N`y- zu7q1GR6mE0S`0q)vi}E|i3$4ob`m#{vkdE0(Z<8(QgS&NcuG#?7$A+)|78X$@OW?R zWL?6w;8K{nYpeeN^$!2A)YAK$HR%DKEzQ6ukH;>{l82cyGnD6Oy{Y&DgI?eMIKkGi+vaHctxaj#Wq8 z%-`{UwQ#h+QMokD_q&C4mi?ncH||oEcnz^>io=%2JFicS(GEsglexp!+N7CJ+N^4l z_r+NsKJ?$mXEH257{6j;6J^)-ekF$c)VcvEu_p%~-;51!Qyw~dWX6-1Q{Vfzku0Za z!NYjDoeC#g{4ishmHUE!YZCzih4`U57Vl)m6Mt`T_0B&V&0GEG135R8z#bvX!Z^V@ zb4Ph;-`S`KzPu0KZ;_&@lEBM~+}QbN*x!fqz;7I2Po^-K+c`V?yR*|UJ{?+!ZhBxlY_eVY0+V5Oo?- zWL;Id2a&jw^IK4x$Dc?EhXHbpZ-buHL35-O-H^DbUQPsesan#DPCjW8pMLF7;Co`x z-}g;ykZ}Ct+3L!_<`*)*cR3s<}!1`aknQZSB}@udD&=A(b)0YEG@_A=kmqT;@*`)Pp= z$5;o+D)vUq$UoxmN8h_t_GG!Zk9|*0m)r`{9|BjM_qbf;qYUH1n{9&I`r7ACQ?iG9 zs(AVHBp%b?TC$?V;crlBi9UTS7=uBxS+}L@*S*Q=G>Js8WLm30QlbH1DLm09u$vM) zRtCFB_TBNBGa*Aok8X}t=gxSedJ2aoZ->)UjW|acfxvTktqjhgqzNurye?8|J>1FYru ze*m@ugl{>;Cq~yHuxE5$MC$(DLv{5#^smqJ(a!dr-s~!ZazH%xZxXV*2IZ*(u25bI^i_fCKoergHMk(5tuF?f9#8y%VO`FZ>@s0F~0e7V0|=iNz~abJA` zEj%%J3;YDug6oX3qe^CO2m2-Q!NT|NL-d1%m#)`}V?_?mtP&yuPfD#C3aCd@uH67s z0`D)kLQaHCoWYV^8ZWSbE#6uJDE>QD#zuK|*w)1bEqv>qLvPMUnaLrM_j6ls#GogY zR)d|{{qpMw&jV%Jmw(l;C=x{>_Z8l)3i^_!;W7 z&AsN}ZGS#D7w@hy`=~7>s>~M=f*q)AhsfKow%lF6IHVr4U77@EszJYvmPod<;|m~w z5C;fe6n5KaP1gIlwBa_c{{jkj=|-K}%v|)FdeSvS{VJ=H-B#M}l&Qr)7-1qz5@Y%# z#Z~~e@*suRw8V&)T7Tif7_t8V5Sp9tm>`ydD(2QbqX)UXCD}(3H$~Jaq3yny%V~gf z5oGydl>f}qXaPUhP*-A|X=;$w1E7;C^$0Q39f&d=l7V*3*TRIe){QcAnG#1{>ySp6 z=1g#~^K{@zKyVE1KqW^O;`iAhhUEv-yUuOPc?BN0Lxk?lqC$}~ThV{WLa^Xa;$ymA zzP3c2s)}!jKW8qiUF@U#QDvkA7OGH`+=#>$&pnmpdl}peUHR=4Nh2dXmaqBIxH$MM z=j2{QQ_AcTa1Jyg8M`l`A2Ij^wj^Hvb(AUk{qb{3qjX#%O~OEtlV1GUeQX09 z>BB2{Zjc!qte;RAORmg9T7WY{-j8EhBun3o2M=&Z8dPHIt!9GGg{Pg3op$4Dsp}ow z1(fL$u=E#lY`y{R+y4Our>UKsf?c;=1+r~eGA5nrRLXX|u-jU;Dy*;HjANw6{e3v` zMR4%F&3A)b>K{XjE)HyGmiX9Q&n*Xz0~h5hebiJ8sLqcQ=Zgqx!NBO=m>7ZMGt2oYrd4}&&!*Y;GcXhQ?P;9mT zJI?5|S+V?b9tyOA^&$NE#nrGdT_h|GHB)8DGO`L;%--q*C>vq< z&0}w8?hf7S+&*^&JZ3K3VI-%qwT+zd9zC3kERY=xkMDZ~bFE?@-g1#<(=6IDK~$-_ zGYw_2{2>R7#~rYwbcjQ#BTwc-xKPr~LUE{(^o%M&TDq@*v*k_r4)zBi31LLCIt+2V zo+DV!4;UjohQ6*4zm9d?iVz=BVUH3A{Ix9W<($*3E;*94)%|$NSG$HIuvH^$OW1!H zy}p*W0V;Br;k^@bXCB+0;EzkFf|-_Q+BK)p_K!XlnxKr5V^s{c&)7P{cUd#9sH_YK zSL$l+PO#w0nbed&AY!kAMoEFW|4wV8#1ikskZ9{_#TqiNDMgi!FaMnCN2Fx*58wmj zSt2xpmp6-XL-@a9#I`33iyCh)MKkJc4Rl4D?uOW^CB#{$>m0ekzUX44;o#Z(6iyR!3BrxRJp z4RSF&MgXDYvAu8Zs~=bc;#4u!RYyVyZ<)xinz^FO>deyJUe9A}vw+W)h_P`|a&X7{ z^bq#C!<=iT(^B5~HB|@J50;Jw<^!sb?SBv-7AxGa4^;lLG_H3zsOj%#;lbM)f`7g? z@z%9;0zFE=@2yfJ9%v^+o}l9*WS*+pXJXhi=AeCKtnqojIARUbn72pqY-`fxU;<;X9$lOMYf2 z5KGW|6aDO?BdR84s7_!N`QS7fpaO(jmIFfLko-g#X8E~#cYZ9tQQ66jL}k)30+$Fc zIjA61t0$l@Hcb3ZdKsoFlP^1XD;z~n@^sF4!~_Z>W)$7Usw}X|On^Mx3bV5{u^Dek z>U+=e`a?yvBu{JmTRfFy25v7LvM7+WrzLTK?Dl>FJj7@QQQ_1At`jMS3@gxK^9hhuL$ReaGl(RC z$ee1Zo0MiZoDONwD&4|f&jicB9?Fm?aYzyUPFx}kh>Fup3@*lZlB})WHWBB2``y-- z@M!>)T-wtd*e^@4i4hyPcCVi1x$dl;@O<1pVEyrXx~7-PCF}uU7#p_2MtUdjjT}Og zWw-n)Ej3eMF?_lBI_lReX#Fmul*;rE9K@bdNihHSLWKb~ia)k(VDh<(LN)Qs15;HO z>av*^|7=qt1_1%$yI`zO<$V3S4E~IzcJX%;yP=x%L3h?Nxlu$iKv||z8t|;!@=6U8 zUT<>5ZoXjC{;j1cp{^wLx8P^}bhoFRjZ8e1=Pm5DghO+ z?I5D-LhOPo)5p5XpsiytOdeQu71{7yCSwog^Dv zL8A4U{j4HsvLLO&^=V*;JZi%vrY%Oh9SU?@sILzIef|m3QtS+yKsyU zk`;u^J~^0&UrKXmXP-ja+Y%}gNGMDM2|c_sieE}|AF{26_Xnj#cXNpRs&XTED65(? zof`TWwfjtUm*Pc)lAL&D6_X`>h&uMVj9q)3`vT*w*3J28NCmmCKcwB$aJ zmH=kLd}xsO-R9*`@90R$TV29;gzE%&#Ievy>vS+q&&S=@%g|ubhQ;#!PgQ3f)@1nq z`@ztGG*Y8B*$|ZykZyy4C@9?^pp5`5iDKTOU7uIUSJ@Cy9H>5_G~8nbvhpH}x?!j*6BKK5(W>#zrEMTVpRiYJ>$3yO_aYFseh%MZ)C z+B1}zN|Byf*6%^0a<}V_Mp90z()O+i4*`i6E8AJRoAlF%@A-h6*|>@u?K3T;y}DAb zBGp5eC5d0iX2ww=gPedeQfuKm3O4BZn)(Z>;tqq-a_%hx=SAM6P|{6|MSXVhc+U7o(gt; zJ3Tc!;336uLll{3G_j~CwpR%a&IlP|2?A(ZVd!w_m#d3%1{1ZhB77BVR6%wK{uocI z-$b3vfauWJ18cCBntixW?(^j(t8!DV^&E6xpNoiH@wuaLhL1V-(cU$sC+wPGCh%`< z#K)ogDf`NAg2hZ%;(nu_pQCZ1_&aODSmFb%@xS(Ul&qQ`hX);+71#>orIO)9iJfP8 zuVh2;Iv764ns%b}cHZoq$$T|*Z~BJYs}A}^)tj1eE^dfWA9oa0?8lCkBX zbMdo(p2}kt6^}lH?4iSCn>Sl_aSnJDj}_*9HjO zVa+3Pu9ti!kAo^LtDn%NivzZ_@a5VBUdze zah`VcJJ8168wwM(BGd4ir%O9iT!CJ+Je zbn!i{e;~{F;EN28`isTW*8Lb>q!3^0c&J{7VQQ~3MB3u?oAxzqss(k)-ea9(Q1^%6 zeR63Ya|CKkXqWv;i*Ec%?me@|Q(`5#QByRJmwP<9K9MVA$d&WVC@=M%Qy;VR3g9-( z0xOge{PCqerioh<3!b(wlNRpH-hyg)5`(R z^4i}Yr)1Tz^(l?wpH_Ms+6#WV-Ni`d%*y^yk|?_*f{0opP>ua^W@wpWW2yy;rA18Y zul=?)HdH^yNg=$<<86)vgEc7{Tn_WLnGzcr&fOgs?V%BudgbIhMk5_;}cYH zF>28S%9Rn?XKU2NM%z`p&34U3AA-zz8ud6)B!8TpiMFKFC(G4}F|YrG^o<~Cqf;2> z-ETe)R30fQPH6_8<0>=Stt#gpUv`N(ds=p`DLXhm8ya^kR)Sb>N}QbKMDeNlPWu|= z;@z3jG^cp~(yA?GxxJ1r5&2R?P(G~BcXC)`m(*FT6_}%^^C24YcSRp2ubK3e>%V-= zC!jTBr@Jq7;}~>mm;_-Lryrs91!Dt3O_eK7Z0ETQgW1@=f+adO0li(kw+`(7g#*{< zyLjsxs-%Fha_xcJYW#E?9Ug%lG{QUFh^;RvQ7hSI?G|G(+U9Wkj(mf0$%yj;`mea9 z&!q~bx}9EjoI`d(;c?F-D2j3*Cl?_o1-(q!@Y$&{x&QhwD|F)VPG>vy+}BzEyV~Y+ z!=?5AmfMJcQ;PXMU=3|t9&V*;Iaot4HULZZ_DqoHF8>aG{`wXzc5budnyKbcHr^38 zm)d$;*~^J_&&p17B_=Lxgn4C!BL!y~lfp0KC|h@qx^%XobOLk@+X4ri_2Ek*da^rU zW^RtpcWdRfu094>T$$h!ut@i2Lq*nmYM*6(eb$`wgr9bREM=6%*=DwZp7TG@%I7T5 z;dI1}n#CHUvNtSNd#{cjx}^4VBPtaA?*9WFs z3YFzz{o>W&!@tF-Qpm0A+QyN;0Llb0m*!DZt+8}rs z7V#P{fu$QX3VIi}Kj32PXUY3X&zz*JsxL1ldDw@6d96K%8mg;Mg4fY%XnK~!*x-Jr z`K^L!05K7P=X?*pXGvnhCT)g`&RsH?<$e&#p$k}K_K_PYr{L3p-VL5B*>T*0|Jnva zCUb%_Gcgrvy1X}^-!=qK$<>`rLZCW(z83Je_z7yOBChCpD zS-i|k0`iT%H3V=q$nG zkaqkBkK^uD(uU+04e^R5b`E50E>%oVmS)0wl)C+yxWE?u%r{ge_#r1lUfJlesFO9F zds>m3B?xgsjZs8Qi&MT0qulIVW@l}{BXH79Qg~1wT4d8$9Lv`pBT!~0KYwQtYEAzp z0%S^+>5`s$LgGt?y}f$f;8koRxxk_U7}4sEbwB5VBKHNe`LJiI3khn5G!kpy3-KQ1 zct*^V_G#BBzOqxPCw^}{;EOjF5bzYIj5m$&m5@%f{skc7wGuH252&qc{fY84$Fi3l zs{R#wjO~Z>w>ZmVVea#;WE&5cxGPUeaLxL+lG9RYql`zqlzW6{sJ6yydy4fD#7gp|ZS_ zCs#Te6Sbcm{?-<=>}(^5^5YgQ=8lR<=sqMUvk}cTACPR#rDO;jwbq6&K@t2zM=KAR z;T&JrT})nG_l&cS%rTiv?2mqNI}Fcx*BRNV?QVXw0wM)c1k(w6ZdW;%&uyc?{Wy!b zX$hLDIi*;qj*bolFbyWY$ZV@Ypd36c#1%t>f+jIVyB9M~dA)qDMuL(sPTtC*0iLjF zfpX5Ng1SZue?v#{vyJ9#s^wUl>1{qP6QSNa_oMJ!5R#B(Hm3sx)HGlVmvx}X0k9&l zfmX)%k;7oNQleT+5~bHnr^Wm#Y5Y5Q%r&%9F3Vr7R60W=Ke zE&@$MtNI#~<9tp}v@>Z**l38j&tO}*93KafrQ(DAQdNL~~b00Pc%Ii(*J znY`jowZKq*yh2sj3cQ-BmEnIHqBF@`&h1xDFIN5FfF%A$k{Y|`+BdxLtEOpbp0CS0 zw4`<9Uv$^A7_YG)ms7-P<;XJa?p$vT7OXc}nOHQv=SG&BXiq)FIP>!!B(Ok<84Q7L zWPSCI8@$}=B%x8%%wct!CjnA*FWg1G1XSv6)eDH`xiHipEt=5Kw~s-m6gcbFGV;ke%cgDPfFg;P{VG%Do;~^!`o2?LB^;G5GHs&6# zuPL?1K5Y6yQPJ5o^(#a&^1L9V``5ggS`#KK{i&&Leg6_m9~aVvezxd+(v=MGFx5?Y zkxEgfvp@@Q`1|AJnZvWnVHk-gFowF)Xy&)3v1re;#D0rW31!a41tHBCVrC0~?6f`I zc7-jU`UfK1X`cC=@-Cu}nKsI7WBJ56|PVkHP+!JBs9&AX} z(&qjO<%Yv5Za4@tXj30a#_UN9tG&+(7=Gq&V%3~iw*rj)U7x|vfwo%}LBGl~BZdbX5ONB4O1KE1X-H`Wt)x?QQq{5mrJtC#w=6Py8 zww27R|AYjkG=02>XfV!`)~*2ZCTyl@jr12#9(J6u)$$#Mpe<4iqH! z343;_Or^NkN~`NC^Dyw)ey8bA4)&lU1IteB!>UnHb$+($({^`jE=5xu9O(KvgXwIO zr-Dx?V~A0P6eoFK42Vu-b4vBC+$+6&oY?DH{NAR@e~7~%W3p{Rx|Re+TeOqfVoT?C z9y8um+OwcALxRMD`j`*;`q294mALUK5mtt=n_c`-9`xUZ9!im{1m`FIrGgX>c|~-{ zs2JAa!&YsLSf+*4cbS+HO@-#_pMF~)3>c8mkwL_JUctQ1*A^+l4g=S}Lot)ym(vXK z-6P~Sb7O!!MWJY+}y)>(*Nd=>$Zw%DH4OC+~2{>MR|3 z5Z!qt6^6{V!8>#{sLwANdp%U}auH%)``u&o*5TAXMuLKhlpCqu2rK-|+mRUm1=@R4 zVcnl2Wf%yljRO69!?=58;1;6O4`{Bl)>Oe9J5`}FJb@tQX+ z9gXi32~XFP<6P1Sc&unsnX%{i)2TP{m+yv;bQcR^QYn}*mEs6k*xkKiSRRfEyYs5k z35<4e5F+DD=cbA)${}%7IAu`l_7@l@a9iSrw6EFuXAL;sb_bz2LZq`YfQZ!ofOq6S z>JRO!c1AQ}EiXw~f*o|XP5J8M`VcP4sf=i0DlnPV^J{paGM*kSR0EIAH7)B@g5N~T2zeD|cAOkg6EqLe zQFZrS%Mm73lOhbPv1P*H2{9IXkcyjRXn7YSL(e4mIkSwjC#F(%>U`qx8_#8{e*Yr_ zrHvMYd7o0B$l&woUu-w6`p^R!;gI4TO20o?8k^gm+}%!A^VzzWB!%P1)vU+)39a%n zO1m#^rDZew-YMMaFEI2BpPsuqB5{C|XCx4rI`w0cB-Waz^jIaJ$V0U^ljb`T7qljy z=TsZ+{wSL>Hk_Xyksz}f`_wy)c%ZI@xKXX@lAPr!J+npq(`x?&sByAYPd?4^Yq=@( z&g>Tg@}NmNgCD~E6w%B8dVM*^xOr4EY`c-@+uU#FV z5RM(CnyG?v1K)fS5-cPY(y0+F6^-Y?gqM^KVITYhy_hbW5KXI5CP})lEhsFIsvtv8 zG)iH~-Bg(;_trq>@$$pa3gO=zWMFk2NHhu5W4#ddwiNn%}a>6`H5+AJb43D!jX zdS))XA#b<&NqIeh<+2f_w3(z7r@rvQ!Vx&Ljnm!my+h&=SAkwSWm+c6xi@PAkMr@MA#NmSV{-S!3o+eMUlA z*+ZI;m7dlg3i?`dgF@&s* zMEY|aJ~Dn+RorEjPver=jS=r)%g{kwN^Pg7MfgK?tuOKc2f0vt8Y#1`8DGLz_t!~) z?rFuzMB;i}|19!RJBMvE<5z7Nj*V3ZI}RU5a{f_aw#Mz`K1|ZRN$T${JQzwu&xO*I zs}KIbb;AXkB;=e#@m80OMjpO`DL0q~PLz1}p#wM8u=)l=#>7Z4dq3c6(iv&5_RlPt zU$hlFaQO4vP``)VP*L@6BGnUd#Esw#MiAXiveNcC?WQ$3iaDStmDMXFq?A6q@hq^p zRHD}aN}ke3f=w3zPx~UUwg9P(rjomMtd69)DNNZ%n-zJ4)_&dl2NL|u`An`RKBz1U zhg-1Gmo(~o_t{S5{+qB*8L1ZPH(i$5OE&{%&(x+xU`zn9t{yvLU9=Fj*|=D5g-HH0 zCpbl|PUYx@uAGFimbv+ignN(RXsq2x-K&9%ve5lO%re_3!wMz^P8x1?A) z98_)N@+~=Ih0YJp4ccUY{ahy64xnzgj%S+R_7JO9c3Pc>A`Q-cH`S2|6iQy8I7e@t zp*Ge@X%&nblNx`P$?K{8j9zo08^$0|y(gdK4|IKBOq z%w`|_Hcy^GCTB%FvWJZ7=o=LlIN8bkdhE5A?Q6fDR5ban(zRdidBvi&RwKHVFVM$g zOuopDfi+1qEAeyN)74LV&{Js*HTu#!u|ez#eR;(&QT*lFv;FcMfqs$k)f)?^8asnwB(5L1&bZns#r3%z=R1s?)p@BWhDDIx;@om!W)T zC*$|L^nmg;uPI3CIF4sEU>2p2j4A3x9pWlUlI9E_U8GF@X;P|5Q};f49)`$~*fufq zb*s*Pg;!Yn#7A^|-Q7*&h2&TccQFA7(c3Tx4DKB)|63f&RqCgsBh>ZNUwT zXC$Y5-vc4Y#MgY$2C$NJj)*s_i~N*wFKgol25ykEJ*)ueJO2Ks20a|~6TU`;gO}?}o1Yqq82LKo#ZmdogLGyBYc^|fE97fREY-f-? zZMcj81Wu`aKk|TSHQ^K}WrPq|8G--o(LtoZ1}bNVw!Gl9`}wVTL(afhI9N&-JW>Ji zzM=$pHi%ta*++-=pE22#CR^UExl6xIo|>gHK`BVl91)|qM`vJ6HlEvZZ)nvaRLsQ_ z(#vEr>(4rQcd=+E3H+xM&V1MShgKj&h6pS(}t!QF?AH43*=EBZc_j*Bll%u0}m{R8~BB`ZwXaOqdcVNCzA&J#udI#yi1yI-d z1VF9l;z|!4G-l|Zl<4j9A-AwL<-9Sb83;kdU>_VeQs-;5@D(0hxaeuAhrRp5 z!vUc}pT=X!Ycst@9Qx5&Ri%MM9A1Ke_EHZTv(!v@AibZa30Wup8idSe`}Q+S)&BsA z(Iyd{Fzm@Op7ire3*X2W(}=XlP{8SYjuB4?>wgglLYhyA3|hBA+Q&}?DDifTOKZCM zM|SJFKWiAJBV?|NzUOzGo8Y|gDQ{M<1aNVq_G7(8#WqfhU^XvSbv+{RWxhRI7L{6o z*N*Op!=>!Dka^lvLA2=nGDPBaAjG)oZk<5guH5Y4S`nI>$}?OFjlFT0M6S)a-aD?O zeCHFzjjr{FBQm95;};&+VmIgy5z1d4J%$Myc{G2b5&&p##k$;tB0u@Qbl*3-zmRo98OD%U@oN*3hzLttl4d2wCHJ^(pa>r!mSQV3UABp&dS7V+WAKxa`3Wp zq*uAfrel6LTMxa*@?{p!5=VYHq976=q70oGx&$QB@gXU6FG!y|hjDr{f*|+>y-ejR z;<7q8LKI;4e$xJr%Dm53s4$8*tn;nE!kzD^%JMhcauj=yDrquRsY93;kE(=t$xFKJ zx{{P{6-2&H?f|+IJo7DH0Ukwo0iBkKKZ46o?8l!H2Mf_B&Mbgju0_;3W#N+|um=;G zK6?8-fQt!NWbFp`?V;xBN5l!;1M^(p4q&6zOGQ~vaV(?V@;f9{OkNz{Dvgho+mg&4&)GfJl%Ly^@IgFU^N3AZuk!+$WxN)AYg z)&)?D=D)Y++m8-SA|_G>2W1NH zvA!sb331&>bot)O4B!6Jw0kYd(|LJmmtaNUr@+Q|?D)gCL$nX$^6XQ2iU+D97>Djo z++}71PjEAL_HBF`$!xoA-EUdExa6s_8lEQdr#2`$_9Yt}8B@5L@R`K)cCesvjogQ8 zP856hktfyIEn7HK$fkNJ2)2OJei{)_L&>rmvDo zdCZ=VZY-rvWsOmZ=*?xW{BSRtB!gIRsg+a8oJ}zBTl>8`<`S<+A>jGtrBZdZdoxUH zI+3-XYxi_IW!YQnn~ai>&4F*FPbFSh08v^lx^2vdMe)+aBUfQ7CgdHu>;3HK+Qu$1 zAN$e9Q*#7MY|25`G8yGN*h9T8$?{A29~;q&L6n^E{)CdwISGUacV{KD5q`Hr^rEL{ z!8_)*Qt!aInV?KJWWP32RSTP-xe^j>BtK&0vX);B0i>ZCk4XYpZ5EQeW8T9<3{%p& zDrvXV*KD+bWveeA!?yX|lXf@{Hiq&OyJQTN;I?spxv~dUSaEA0?7b3nmBJAkoWvwk z6W3Zg+{Qq7JngGh*=gy*Raj6kXl38F2!5Zw7)6fr%7s64ob4ihLX@7?+A-5O*>=A# zY`JTW^dp6x!J1Bz6w#KP{yGp&b=<=tIF&c)1{5ESH%^5LcT|F*Gcot2ye+|5JPUC> z2&riM4&=X}xb-SKBXjNSVRM;IC^U9xR5-*C=P zoD6u56TMpICOK4Hz{t*SwA8E>=9O&u!|U3cGN?R4EQ5{J8t&=YMeK@SCDTDZK=^i4urSc`sjXD8ufP*W8~4RuNFBH@VFWDx{VEWpjB zErb1bdXwK^(@^13DzG}uwf zepw*QT5&O67$Tw7!5!bMEPd<3MA8|HMU;5owZ~}Zt!dTxxsdVB8t8G0W}rgWKA)|fmh!+bCpl<4>C2f528-WZN*)r zE@W$qxiOvN;85Tfe5ml*!Zz}0A$KaxXDK#Up2@fs_g$T9nk5@C4rWgg+vDP;StDs; zuZV+|HYhl8a!&?WSE_u44%uSgXm%gtt)33XR&G2*o(@Cc7v|V9138fAfl^!6Kag6( zVOYvS3`G*k7Cs0DV%IWe@;o<=4CKgms(ak)h4LxPn_R*a`@k~2E-`VRM;JPMg(sz- zm}5dG1l$7l%IPpKgy#(VNHgD3h@tOoIZ_dU9B;a44J}aW?)meeIh!VZMe3+;nSH_r zKU8xWd2P5xv6@2v!G%unvgeoX z<-?kj-Aihy!Gb5dy@kOKFFV|#z7%^D6cYY;;dY=RNBA0vOyltuYeA?Q|* zn2F&fRlafd#jKL=La-4kRZk;cANo4p0ih^c z)-A>RHg^Pd+Zm*lv1%Q%)LA%BApTN(;Zt}jXNv#mpEjiqX*#bCj113I8^@C2vL}yX z7Vda2&0qCxW5-QJHadBbB|Ichf{K#1z6 zKLhvp-^7Qk!Qxzj+3ldx;X$wnt3e{=bf(K&_(Iu_(8vLA8dZon`gQtAx%$XjVP@fi zaeHKo_y_xN?YDIwgCWu(F@Dard57eA{NG-lh^3W?$88~v4e~&w+U)psm|D53WLaWi zn$M=<__KAfPxLD*AsPO4(sRG5(|nmQ0<8E_^r+tKETHd9#ogzwpO)97+#D&7Fz8APGG49(J&DbyKxbtdaqD_VXxzVMH!0(7ra zw_-Q)Gk|d+A3L1*CC{nACUw2{H^iB_Z)?XX!&zy_|KqgW2SC7v$2`ean*RHy zePZKJ$|OW%HWB>*WhQfF!`Q=ZzF`t-a;ULq(k05RfSrzWJO7(U&QW9UTT%gH27Jt> z4PaiuEM?F}1wj$04n*#>iB;LkQ1!Ul$zV6>x&9<7L)8g4Mx=?dyfN_OtVdTtCa)&> z`K9I7NMAS$zKz4WH^)ClEnS>_Gp4+XY*8*;R1)D+?0a?>^_fb=G=`1B)MHn*r!da; zC6=Qd(`vTV?|LR{4hdTAcN>9nw76a9%q)`-z}&$nLT689{towiVU|*TNS%W#m7{8- z-dd)1#pl-5>FqxbvyJ!@C%C*je8XdhK?gVkCfpDCJv#cuz3I(AkO^%(!BgkEz;o;s zQB64@{rE5X=r>b=8L1l(^zk1!D9QDMl{PMey6)+|R*c;6kL9%r+n#ip=>nM_^UpSJ zsIzW>+neZ#)_xU;^?FwlCtvHuo7px`UbF8=hTocx%-?QQYL)%G(bOc%j_-vI@Ml`{ zGOwntDi9Rl8-WkgMcgDnSrHQ3+uM5Tc#S8`zJoclQk$|C3HLXTD$3h9@aSxOa`*P0 z8%My&180H^Hpt|hxEpe*15nDannXcV*>>-K+zA$E`W{9cKdSNP<$$a^Vdy<9qV3T; zH13g%T=bqC{+k&=3|q19>IryZOsoNNu0|vCyxLj(nzj4o^az0`nP0#`& z7o~0gf#hu+2)ER(AAE|jYdf(!E6>L3aESZ^eHCfAzQO$u#DF63#Ipd#ITk>-L!1np zcfKl$E_+9Bqh|l;I7bgCxJd^pkiqbk5U#;U1ss*Ss-<+51zUSGO506=jyrWlBa{ZJN4n&hd%8bm^MGwmCjp zmKE=!GmX%#Q~4s|6Q+5OoLJtjC^3Nu{r;Mv2KIM&Y#=F~Xp7T=EA?eU>Vh(IJ=@qe z*CE_rcm-83&j|u)HOhlH0!3sSIEsj{cN(nSy*96e*nHSA=>mu;R&+W=vrPNEo6=ja zoKOtaj*3f?&_gOkmq6RPHau!=@9`t$lR>+0o#FPkizQ$^8vTduy%l5P6JM3zB&bl7 zII+~e5DtG#rLb8p6+=K@6;%=pun>$x6yb?S!51>iL^EE*ombt&H#(stcAX<4Ymze& zz8WP;{FQu#{))b}aFA5C@#nR6qf?XF0F9}NN_&238Cxfjg>b#1tUY5L^QjMv!^-Q& zdZm}J1zt`$ydv*FY1+n~D&Tc%c%F1#7T-5@DBJ$1pUvC1XVxQ7VLQXJP))C3UR~4pyXTya~2)x*c!c^qdsnP-pB;`w{pB9pY@Vp& z;fmTvzPdT(*qw9Ddpm~e^PY*<%S*O?XBFkum(opri<^~?A37boA>zAdv|t_Wx99O< zFAr>tFP~{xUUTVbRjJJ$zP;6mshlDH7-mE8PDm ztoxX?nke91__D)z)lE)nFX?^0O9qDk_AZ?<%EKo;N%E$C4<-g4Fi}3Tgu9K1*vN(Y zKZ--fSmT1U9>=_dfxKPNZ0~Y^QGb$UCddJvpTHAJSoZ}d@9kw9qRO(p{mkxST|lVf z|F#clN^NtYJi0Hj~!|-MSx_hQhh^H5B`WpqJ^of;J8J5#Fn!kX+fOFmblLohZkVqjN;>yMwNWR zO!D!?eH=y8Xw)g04l9WB-b#S5!HoR^Ug1#~J9D+Bsvi@7?RobRf+}oDITZP(ajn#_ z6brmL&JD{H(p8a|_j|T1qZzqd7Y8BZs$)%#TwQXC4t*HD+kOUczUu$&tz| zSUyc%-(@^j6-K;>$+aSa1hIk!6U32Jwp*!q6U?{QW#YD ztoTu(h8tTn%xOnq#5?sAteo~fJ`^pncwj7Zse;P2;kaErA<|WHm9_6q{F39)z_9q1 z%A0r+q9mP?PH?$Tsjo1W5Snaf7E#pyATERIG_Bm15^EV*jtS8mKUq|~xBM&C9ttxz z4Mri@%(5S{jdW2`U(*6ZdCt{4#=EtkwZ+=bw<^r~&D<>}v^HoZ3lH5W_0?_;Q9G0^ zcXA4FD$MPcZ>~f5K1~4MlTlRyxemEETXtqMZ%wzGfB#-pU#rcVQ2JGK#8h}ZR%0dp zgWIC43ZG){&z;#}eF-R3nS?e$&FucME;ZsR(^Y$dfN=6p@0{6llhC)StawuX8@{^s zku6XwTz<$q{}auCAx{ti=@R2Eix<4_|EQnk`_0Cn zO=21Y$T;qGBv@F=C?Oaavj1ML$?)&)x$C=U+c^>uVcwDiD|c=dDvO_%%i*>BW$Ygt zP@m;Lxl*G)Pv8J!Vjmlrd@z3!*(LjVjptcaTN2iz#}Wbl6DUOnGIb^;0r&XaO)Dsj z$op-LZA#?JRRY&oBmnA~%1zbDcFTA=Td`dqzoOrR?!?8P=oiDdk{h>_;iphsc>rEh zR^nAO%d%N)<5H%aq+uU5)m4$mp4!hgrcpOPcGJd|s>x~X+Gch0#!!mBCbn?$R1OUL zZav;Ir{YWQ;u6};!Naz~kX@Up?!!PN@3*ptpT#AH<T zP+*4r8eev7>r_j^OPm*H;`8b%by5Tg?GN^mP0f>oK-qia8>t3Twg%Qnc#S|RIn6_| zJ53!xgF1~rG+OZP5k#6w&Ai8Vs^Fzv1;H3A7rKAC&Fd>yX4E=W#yiltZ#VGS%v4bx zo}*6sACpH4kodIs-M8;}`F$j6UBBioo@mYBLx?j@^xfX4s*HTrBY7x98WvE%6D0ip zI6;!`mm=9_9Qs6L1y;*nB^NI3wd!X)qLHQ|dicCKdY|=eP0};%d-*g*y5XlC+a}Kf zer95GO?kp%<(ZEWGIA{87~pU}XrGCEOY}VNVN@gpy5o5;{vl`x&)ub+MSnPyn)$|i zE;jh~0}~0>q9qk3xFhL^!US`L8t!Aa+|9bJwI(0(Fk0mslcve^LFiPq*9}hnBpj69 znc1CcP`&wlT4`!vImkW9GuL?NIhU@i56XC|#dm<9W=-#g%OWPhJALDvFmIN}Qg zg85E;_#PV!_OBT5%)pwelF4{ zkYe9u4coQ+@bJC)ka10^+L&ncv7=@r}Qf!mB9(^_h9i z%XekROFd2;B}Kh)w+5*!Xv;#NbWgiOl9L33Q4FUVB!01d;uwxPWB`%x6Sl&qTFOFX zNpf5U@O6t|D&e^b>JVA}Kd}p6YI=?3wk8cx1MSSxQn|bBwT#(!ivob*!+axiAu*{M zjZ9>Sdp3|@?(mt}r60=NS($%QE-E9Y{Jl1a&{u9|U^Nex(lm7zmo`ryO-J!3`98_gTmJF|H%r{V*#CXFE}3SornVU4bg& zJFtUXzL=Y?t1e5e)T{ha`Bwh7gN?{vHBX-G_UKLf^n(YJqD8AfuFUMhJ>C@mKqLe$ zC)zlJctJ9fvT#v0*OhuXws&6~4xe=6nv}Rb&3JY5U(!HjJV%T(#)jTxr1c0?1K|Az zEYjo7^)OC|jGf`rS2$${l`|Qn(%cwzd0&4!tyy@t}BfJi#To}%0E0wl@nTa{ed?WRT;KOulEuMOVSrth+K2wfh)IL3R z;!!>-c{Tqr+&&WpFisqP`a{P~1!9*F!PjRR^;IpI`;RW2hd zjwxn1HTPx4It>ft_cNd88)s)Cv%$X4?w%c2A?~sM?$u2kO`>w?Ae0!o!}VBD((9YS zJR5Rz&S*73(%cqv!X-?hQ?4MoWX|7s3QRwr9c}@1|k?2OE+MTG5 zeu;i@w$12uSvjwwj*3(cGn;E)yTU;z9PKVNw!RXWA57&bty3(}89@IyvTCXSR>+xo zk~A9-^E{~|M?!e%T9&j!*9<#eSsI zR6%+cp!@0|XeWuqkvwGlN03dL(wn9T-y+iu}A?B+`hEnJeuPA@hS_cR=m*uAIK~Fz#;S>NLUqkr$}W3M6+dXf#H{t zY|{{1XWwNazYiF%5hxpRR1_cF-0e#~UoGW-D%YDKOTH_2eD3iN6kz@j#PVfF_VpL{ zvst`)<>fi9z#+J~#`MeJuS*peezMvZI%N@ar=_(6c04VI&AreSg$un;pfHcemS}4k zs}($Nhn%{-D);alkZa`)z-Y`9?zDu}aE{zNu}&sfwFb}Jw>k?WsN{3HUK*Nan|0_k zC8i&jQ+G1y+vnJF&x#_QOH=tF fV2}S + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 0 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/gd32/arm/gd32405rg/project.ewp b/bsp/gd32/arm/gd32405rg/project.ewp new file mode 100644 index 00000000000..38b274bb842 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.ewp @@ -0,0 +1,2196 @@ + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\IAR\startup_gd32f4xx.s + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_gpio.c + + + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_usart.c + + + + Finsh + + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c + + + + Kernel + + $PROJ_DIR$\..\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\..\src\cpu_up.c + + + $PROJ_DIR$\..\..\..\..\src\defunct.c + + + $PROJ_DIR$\..\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\..\src\timer.c + + + + klibc + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + + libcpu + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + Libraries + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + POSIX + + + utestcases + + diff --git a/bsp/gd32/arm/gd32405rg/project.ewt b/bsp/gd32/arm/gd32405rg/project.ewt new file mode 100644 index 00000000000..92a8523eb48 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.ewt @@ -0,0 +1,3040 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 515 + + 515 + + 0 + + 1 + 600 + 1 + 6 + 0 + 1 + 100 + Debug\C-STAT + + + 2.3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 515 + + 515 + + 0 + + 1 + 600 + 1 + 6 + 0 + 1 + 100 + Release\C-STAT + + + 2.3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\stdlib.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\time.c + + + + CPU + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\i2c-bit-ops.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\i2c_core.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\i2c_dev.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\IAR\startup_gd32f4xx.s + + + + Finsh + + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c + + + + Kernel + + $PROJ_DIR$\..\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\..\src\timer.c + + + + Libraries + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + POSIX + + diff --git a/bsp/gd32/arm/gd32405rg/project.eww b/bsp/gd32/arm/gd32405rg/project.eww new file mode 100644 index 00000000000..c2cb02eb1e8 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx new file mode 100644 index 00000000000..39aa7f55fba --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -0,0 +1,1075 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB.FLM -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F4xx_1MB -FL0100000 -FS08000000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + System Viewer\RCU + 35905 + + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 25 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + klibc + 0 + 0 + 0 + 0 + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 55 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 9 + 57 + 2 + 0 + 0 + 0 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + startup_gd32f4xx.s + 0 + 0 + + + 9 + 58 + 1 + 0 + 0 + 0 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\system_gd32f4xx.c + system_gd32f4xx.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + gd32f4xx_dma.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + gd32f4xx_exti.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + gd32f4xx_gpio.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + gd32f4xx_i2c.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + gd32f4xx_misc.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + gd32f4xx_rcu.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + gd32f4xx_syscfg.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + gd32f4xx_usart.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + + diff --git a/bsp/gd32/arm/gd32405rg/project.uvproj b/bsp/gd32/arm/gd32405rg/project.uvproj new file mode 100644 index 00000000000..fe4dbccd22b --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.uvproj @@ -0,0 +1,1270 @@ + + + 1.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + 0 + + + GD32F407VK + GigaDevice + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x300000) CPUTYPE("Cortex-M4") FPU2 CLOCK(25000000) + + "Startup\GD\GD32F4xx\startup_gd32f4xx.s" ("GD32F4xx Startup Code") + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000 -FP0($$Device:GD32F407VK$Flash\GD32F4xx_3MB.FLM)) + 0 + gd32f4xx.h + + + + + + + + + + SFD\GD\GD32F4xx\GD32F4xx.SFR + 0 + 0 + + + + GD\GD32F4xx\ + GD\GD32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\output\ + rtthread + 1 + 0 + 1 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 3 + + + + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 1 + 0x8000000 + 0x300000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x300000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, GD32F407, RT_USING_ARMLIBC, RT_USING_LIBC + + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\cortex-m4;packages\gd32-arm-cmsis-latest\GD32F4xx;applications;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\include;board;..\..\..\..\components\libc\posix\ipc;.;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\poll;..\libraries\gd32_drivers;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\smp_call;..\..\..\..\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + + + syscalls.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + + + cctype.c + 1 + ..\..\..\..\components\libc\compilers\common\cctype.c + + + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_bit_ops.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_core.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_dev.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\components\drivers\ipc\completion_comm.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion_up.c + 1 + ..\..\..\..\components\drivers\ipc\completion_up.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + condvar.c + 1 + ..\..\..\..\components\drivers\ipc\condvar.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_pin.c + 1 + ..\..\..\..\components\drivers\pin\dev_pin.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_serial.c + 1 + ..\..\..\..\components\drivers\serial\dev_serial.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\board.c + + + + + drv_gpio.c + 1 + ..\libraries\gd32_drivers\drv_gpio.c + + + + + + + drv_usart.c + 1 + ..\libraries\gd32_drivers\drv_usart.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + + + + + cmd.c + 1 + ..\..\..\..\components\finsh\cmd.c + + + + + msh.c + 1 + ..\..\..\..\components\finsh\msh.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\src\clock.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\src\cpu_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + defunct.c + 1 + ..\..\..\..\src\defunct.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c + + + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + + + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c + + + + + libcpu + + + atomic_arm.c + 1 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + + + + + div0.c + 1 + ..\..\..\..\libcpu\arm\common\div0.c + + + + + showmem.c + 1 + ..\..\..\..\libcpu\arm\common\showmem.c + + + + + context_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + Libraries + + + startup_gd32f4xx.s + 2 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + + + system_gd32f4xx.c + 1 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + + gd32f4xx_dma.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + + + gd32f4xx_exti.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + + + gd32f4xx_gpio.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + + + gd32f4xx_i2c.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + + + gd32f4xx_misc.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + + + gd32f4xx_rcu.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + + + gd32f4xx_syscfg.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + + + gd32f4xx_usart.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + + + +
diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx new file mode 100644 index 00000000000..5d4e1c6e1db --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -0,0 +1,2319 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060528::V5.06 update 5 (build 528)::ARMCC + 0 + + + GD32F405RG + GigaDevice + GigaDevice.GD32F4xx_DFP.3.2.0 + https://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM)) + 0 + $$Device:GD32F405RG$Device\F4XX\Include\gd32f4xx.h + + + + + + + + + + $$Device:GD32F405RG$SVD\GD32F4xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + GD32F405, __CLK_TCK=RT_TICK_PER_SECOND, HXTAL_VALUE=8000000, RT_USING_LIBC, USE_STDPERIPH_DRIVER, __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, __RTTHREAD__ + + applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\net\utest;..\..\..\..\include;..\..\..\..\components\drivers\include;board;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\smp_call;packages\gd32-arm-cmsis-latest\GD32F4xx;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\drivers\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_bit_ops.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_core.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_dev.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\..\..\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\board.c + + + drv_gpio.c + 1 + ..\libraries\gd32_drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\gd32_drivers\drv_usart.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + msh.c + 1 + ..\..\..\..\components\finsh\msh.c + + + cmd.c + 1 + ..\..\..\..\components\finsh\cmd.c + + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c + + + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c + + + + + libcpu + + + atomic_arm.c + 1 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + Libraries + + + startup_gd32f4xx.s + 2 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + system_gd32f4xx.c + 1 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\system_gd32f4xx.c + + + gd32f4xx_dma.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + gd32f4xx_exti.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + gd32f4xx_gpio.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + gd32f4xx_i2c.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + gd32f4xx_misc.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + gd32f4xx_rcu.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + gd32f4xx_syscfg.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + gd32f4xx_usart.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h new file mode 100644 index 00000000000..d1437771267 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -0,0 +1,430 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 12 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart0" +#define RT_VER_NUM 0x50201 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SYSTEM_WORKQUEUE +#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 +#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define 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 */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ + +/* WCH HAL & SDK Drivers */ + +/* end of WCH HAL & SDK Drivers */ + +/* AT32 HAL & SDK Drivers */ + +/* end of AT32 HAL & SDK Drivers */ + +/* HC32 DDL Drivers */ + +/* end of HC32 DDL Drivers */ + +/* NXP HAL & SDK Drivers */ + +/* end of NXP HAL & SDK Drivers */ + +/* NUVOTON Drivers */ + +/* end of NUVOTON Drivers */ + +/* GD32 Drivers */ + +#define PKG_USING_GD32_ARM_CMSIS_DRIVER +#define PKG_USING_GD32_ARM_CMSIS_DRIVER_LATEST_VERSION +#define PKG_USING_GD32_ARM_SERIES_DRIVER +#define PKG_USING_GD32_ARM_SERIES_DRIVER_LATEST_VERSION +/* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_GD32 +#define SOC_SERIES_GD32F4xx + +/* Hardware Drivers Config */ + +#define SOC_GD32405RG + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART0 +#define BSP_USING_GD_DBG +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.py b/bsp/gd32/arm/gd32405rg/rtconfig.py new file mode 100644 index 00000000000..d37afd4c07e --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/rtconfig.py @@ -0,0 +1,151 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.ld' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + #DEVICE = ' -D USE_STDPERIPH_DRIVER' + ' -D GD32F407xK' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' -S' + AFLAGS += ' --fpu VFPv4_sp' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT, dist_dir): + import sys + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT, dist_dir) diff --git a/bsp/gd32/arm/gd32405rg/template.ewp b/bsp/gd32/arm/gd32405rg/template.ewp new file mode 100644 index 00000000000..c3cff156ac4 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.ewp @@ -0,0 +1,1889 @@ + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + + diff --git a/bsp/gd32/arm/gd32405rg/template.uvoptx b/bsp/gd32/arm/gd32405rg/template.uvoptx new file mode 100644 index 00000000000..1499ed81f28 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.uvoptx @@ -0,0 +1,185 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB.FLM -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F4xx_1MB -FL0100000 -FS08000000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/gd32/arm/gd32405rg/template.uvproj b/bsp/gd32/arm/gd32405rg/template.uvproj new file mode 100644 index 00000000000..deb72d33b0e --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.uvproj @@ -0,0 +1,628 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 0 + + + GD32F407VK + GigaDevice + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x300000) CPUTYPE("Cortex-M4") FPU2 CLOCK(25000000) + + "Startup\GD\GD32F4xx\startup_gd32f4xx.s" ("GD32F4xx Startup Code") + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000 -FP0($$Device:GD32F407VK$Flash\GD32F4xx_3MB.FLM)) + 0 + gd32f4xx.h + + + + + + + + + + SFD\GD\GD32F4xx\GD32F4xx.SFR + 0 + 0 + + + + GD\GD32F4xx\ + GD\GD32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\output\ + rtthread + 1 + 0 + 1 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 3 + + + + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 1 + 0x8000000 + 0x300000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x300000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Include;..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Include;..\..\..\Library\Utilities;..\ + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Application + + + main.c + 1 + ..\main.c + + + gd32f4xx_it.c + 1 + ..\gd32f4xx_it.c + + + + + CMSIS + + + system_gd32f4xx.c + 1 + ..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + + GD32F4xx_Peripherals + + + gd32f4xx_adc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_adc.c + + + gd32f4xx_can.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_can.c + + + gd32f4xx_crc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_crc.c + + + gd32f4xx_ctc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_ctc.c + + + gd32f4xx_dac.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dac.c + + + gd32f4xx_dbg.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dbg.c + + + gd32f4xx_dci.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dci.c + + + gd32f4xx_dma.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + gd32f4xx_enet.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_enet.c + + + gd32f4xx_exmc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_exmc.c + + + gd32f4xx_exti.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + gd32f4xx_fmc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_fmc.c + + + gd32f4xx_fwdgt.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_fwdgt.c + + + gd32f4xx_gpio.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + gd32f4xx_i2c.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + gd32f4xx_ipa.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_ipa.c + + + gd32f4xx_iref.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_iref.c + + + gd32f4xx_misc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + gd32f4xx_pmu.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_pmu.c + + + gd32f4xx_rcu.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + gd32f4xx_rtc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_rtc.c + + + gd32f4xx_sdio.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_sdio.c + + + gd32f4xx_spi.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_spi.c + + + gd32f4xx_syscfg.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + gd32f4xx_timer.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + + + gd32f4xx_tli.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_tli.c + + + gd32f4xx_trng.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_trng.c + + + gd32f4xx_usart.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + gd32f4xx_wwdgt.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_wwdgt.c + + + + + GD32F4xx_START + + + gd32f407r_start.c + 1 + ..\..\..\Library\Utilities\gd32f407r_start.c + + + + + Startup + + + startup_gd32f4xx.s + 2 + ..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + + + Doc + + + readme.txt + 5 + ..\readme.txt + + + + + + + +
diff --git a/bsp/gd32/arm/gd32405rg/template.uvprojx b/bsp/gd32/arm/gd32405rg/template.uvprojx new file mode 100644 index 00000000000..27f58a77c55 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.uvprojx @@ -0,0 +1,414 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + GD32F405RG + GigaDevice + GigaDevice.GD32F4xx_DFP.3.2.0 + https://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM)) + 0 + $$Device:GD32F405RG$Device\F4XX\Include\gd32f4xx.h + + + + + + + + + + $$Device:GD32F405RG$SVD\GD32F4xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\gd32_rom.ld + + + + + + + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
From 60d0e11a38b0a350435df7b1af95d9aaaf66e6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Tue, 6 Jan 2026 20:46:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(bsp/gd32):=20=E6=B7=BB=E5=8A=A0PWM?= =?UTF-8?q?=E5=92=8C=E6=9B=B4=E5=A4=9A=E7=A1=AC=E4=BB=B6=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在Kconfig中添加BSP_USING_PWM和BSP_USING_HWTIMER配置项 - 修正PWM时钟获取逻辑,使其能正确得到APB1/APB2上的定时器时钟源频率,添加在pwm结构体通道引脚资源配置项 - 修改硬件定时器初始化逻辑,修正定时器中断处理函数,适配GD32F4xx系列 - 在main.c中添加hwtimer_test和pwm_test测试函数 - 修复PWM和硬件定时器的依赖关系配置 --- bsp/gd32/arm/gd32405rg/.config | 19 +- bsp/gd32/arm/gd32405rg/applications/main.c | 102 +++ bsp/gd32/arm/gd32405rg/board/Kconfig | 120 +++- bsp/gd32/arm/gd32405rg/project.uvoptx | 214 ++++-- bsp/gd32/arm/gd32405rg/project.uvprojx | 163 ++++- bsp/gd32/arm/gd32405rg/rtconfig.h | 15 + bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c | 652 ++++++++++-------- .../arm/libraries/gd32_drivers/drv_timer.c | 111 +++ 8 files changed, 1007 insertions(+), 389 deletions(-) diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config index c74192943e1..d9defb3a43a 100644 --- a/bsp/gd32/arm/gd32405rg/.config +++ b/bsp/gd32/arm/gd32405rg/.config @@ -254,7 +254,7 @@ CONFIG_RT_USING_I2C_BITOPS=y # 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_PWM=y # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set @@ -274,7 +274,7 @@ CONFIG_RT_USING_I2C_BITOPS=y # 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_HWTIMER=y # CONFIG_RT_USING_CHERRYUSB is not set # end of Device Drivers @@ -1442,7 +1442,20 @@ CONFIG_BSP_USING_UART0=y # CONFIG_BSP_USING_UART5 is not set # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_ADC is not set -# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_HWTIMER is not set +CONFIG_BSP_USING_PWM=y +CONFIG_BSP_USING_PWM0=y +CONFIG_BSP_USING_PWM1=y +CONFIG_BSP_USING_PWM2=y +CONFIG_BSP_USING_PWM3=y +CONFIG_BSP_USING_PWM4=y +CONFIG_BSP_USING_PWM7=y +CONFIG_BSP_USING_PWM8=y +CONFIG_BSP_USING_PWM9=y +CONFIG_BSP_USING_PWM10=y +CONFIG_BSP_USING_PWM11=y +CONFIG_BSP_USING_PWM12=y +CONFIG_BSP_USING_PWM13=y # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set # CONFIG_BSP_USING_SDIO is not set diff --git a/bsp/gd32/arm/gd32405rg/applications/main.c b/bsp/gd32/arm/gd32405rg/applications/main.c index 73777282deb..fa263c7cca4 100644 --- a/bsp/gd32/arm/gd32405rg/applications/main.c +++ b/bsp/gd32/arm/gd32405rg/applications/main.c @@ -33,3 +33,105 @@ int main(void) return RT_EOK; } + +#ifdef BSP_USING_HWTIMER +/* hwtimer callback function */ +static rt_err_t hwtimer_test_cb(rt_device_t dev, rt_size_t size) +{ + rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("tick is :%d !\n", rt_tick_get()); + + return 0; +} + +#define HWTIMER_DEV_NAME "timer13" + +/* hwtimer test */ +static void hwtimer_test(void) +{ + rt_err_t ret = RT_EOK; + rt_hwtimerval_t timeout_s; /* 定时器超时值 */ + rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ + rt_hwtimer_mode_t mode; /* 定时器模式 */ + rt_uint32_t freq = 10000; /* 计数频率 */ + + /* 查找定时器设备 */ + hw_dev = rt_device_find(HWTIMER_DEV_NAME); + if (hw_dev == RT_NULL) + { + rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + return; + } + + /* 以读写方式打开设备 */ + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + return; + } + + /* 设置超时回调函数 */ + rt_device_set_rx_indicate(hw_dev, hwtimer_test_cb); + + /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ + rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ + mode = HWTIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + if (ret != RT_EOK) + { + rt_kprintf("set mode failed! ret is :%d\n", ret); + return; + } + + /* 设置定时器超时值为5s并启动定时器 */ + timeout_s.sec = 5; /* 秒 */ + timeout_s.usec = 0; /* 微秒 */ + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return; + } +} +MSH_CMD_EXPORT(hwtimer_test, hwtimer test); +#endif //BSP_USING_HWTIMER + +#ifdef BSP_USING_PWM + +/* pwm test */ +static void pwm_test(void) +{ + rt_err_t ret = RT_EOK; + struct rt_device_pwm *pwm2 = RT_NULL, *pwm8 = RT_NULL, *pwm1 = RT_NULL, *pwm4 = RT_NULL; + rt_uint32_t period = 1000; /* 周期 */ + rt_uint32_t pulse = 500; /* 占空比 */ + + /* 查找PWM设备 */ + pwm2 = (struct rt_device_pwm *)rt_device_find("pwm2"); + if (pwm2 == RT_NULL) + { + rt_kprintf("pwm sample run failed! can't find %s device!\n", "pwm2"); + return; + } + rt_pwm_set(pwm2, 3, period, pulse); + rt_pwm_enable(pwm2, 3); + rt_pwm_set(pwm2, 4, period, pulse); + rt_pwm_enable(pwm2, 4); + + pwm8 = (struct rt_device_pwm *)rt_device_find("pwm8"); + rt_pwm_set(pwm8, 2, period, pulse); + rt_pwm_enable(pwm8, 2); + + pwm1 = (struct rt_device_pwm *)rt_device_find("pwm1"); + rt_pwm_set(pwm1, 3, period, pulse); + rt_pwm_enable(pwm1, 3); + + pwm4 = (struct rt_device_pwm *)rt_device_find("pwm4"); + rt_pwm_set(pwm4, 1, period, pulse); + rt_pwm_enable(pwm4, 1); + rt_pwm_set(pwm4, 2, period, pulse); + rt_pwm_enable(pwm4, 2); +} +MSH_CMD_EXPORT(pwm_test, pwm test); +#endif // BSP_USING_PWM diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig index f62e148f3c3..ea08346a419 100644 --- a/bsp/gd32/arm/gd32405rg/board/Kconfig +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -271,24 +271,134 @@ menu "On-chip Peripheral Drivers" default n endif - menuconfig BSP_USING_TIM + menuconfig BSP_USING_HWTIMER bool "Enable timer" default n select RT_USING_HWTIMER - if BSP_USING_TIM - config BSP_USING_TIM10 + if BSP_USING_HWTIMER + config BSP_USING_HWTIMER0 + bool "Enable TIM0" + default n + + config BSP_USING_HWTIMER1 + bool "Enable TIM1" + default n + + config BSP_USING_HWTIMER2 + bool "Enable TIM2" + default n + + config BSP_USING_HWTIMER3 + bool "Enable TIM3" + default n + + config BSP_USING_HWTIMER4 + bool "Enable TIM4" + default n + + config BSP_USING_HWTIMER5 + bool "Enable TIM5" + default n + + config BSP_USING_HWTIMER6 + bool "Enable TIM6" + default y + + config BSP_USING_HWTIMER7 + bool "Enable TIM7" + default n + + config BSP_USING_HWTIMER8 + bool "Enable TIM8" + default n + + config BSP_USING_HWTIMER9 + bool "Enable TIM9" + default n + + config BSP_USING_HWTIMER10 bool "Enable TIM10" default n - config BSP_USING_TIM11 + config BSP_USING_HWTIMER11 bool "Enable TIM11" default n - config BSP_USING_TIM12 + config BSP_USING_HWTIMER12 + bool "Enable TIM12" + default n + + config BSP_USING_HWTIMER13 bool "Enable TIM13" default n endif + menuconfig BSP_USING_PWM + bool "Enable pwm" + select RT_USING_PWM + default n + if BSP_USING_PWM + config BSP_USING_PWM0 + bool "Enable PWM0" + depends on !BSP_USING_HWTIMER0 + default n + + config BSP_USING_PWM1 + bool "Enable PWM1" + depends on !BSP_USING_HWTIMER1 + default n + + config BSP_USING_PWM2 + bool "Enable PWM2" + depends on !BSP_USING_HWTIMER2 + default n + + config BSP_USING_PWM3 + bool "Enable PWM3" + depends on !BSP_USING_HWTIMER3 + default n + + config BSP_USING_PWM4 + bool "Enable PWM4" + depends on !BSP_USING_HWTIMER4 + default n + + config BSP_USING_PWM7 + bool "Enable PWM7" + depends on !BSP_USING_HWTIMER7 + default n + + config BSP_USING_PWM8 + bool "Enable PWM8" + depends on !BSP_USING_HWTIMER8 + default n + + config BSP_USING_PWM9 + bool "Enable PWM9" + depends on !BSP_USING_HWTIMER9 + default n + + config BSP_USING_PWM10 + bool "Enable PWM10" + depends on !BSP_USING_HWTIMER10 + default n + + config BSP_USING_PWM11 + bool "Enable PWM11" + depends on !BSP_USING_HWTIMER11 + default n + + config BSP_USING_PWM12 + bool "Enable PWM12" + depends on !BSP_USING_HWTIMER12 + default n + + config BSP_USING_PWM13 + bool "Enable PWM13" + depends on !BSP_USING_HWTIMER13 + default n + endif + menuconfig BSP_USING_ONCHIP_RTC bool "Enable RTC" select RT_USING_RTC diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx index 39aa7f55fba..e8e6ea1538e 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvoptx +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -193,9 +193,13 @@ - System Viewer\RCU + System Viewer\TIMER1 35905 + + System Viewer\TIMER2 + 35904 + @@ -349,6 +353,18 @@ 0 0 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c dev_i2c_bit_ops.c 0 @@ -356,7 +372,7 @@ 3 - 12 + 13 1 0 0 @@ -368,7 +384,7 @@ 3 - 13 + 14 1 0 0 @@ -380,7 +396,7 @@ 3 - 14 + 15 1 0 0 @@ -392,7 +408,7 @@ 3 - 15 + 16 1 0 0 @@ -404,7 +420,7 @@ 3 - 16 + 17 1 0 0 @@ -416,7 +432,7 @@ 3 - 17 + 18 1 0 0 @@ -428,7 +444,7 @@ 3 - 18 + 19 1 0 0 @@ -440,7 +456,7 @@ 3 - 19 + 20 1 0 0 @@ -452,7 +468,7 @@ 3 - 20 + 21 1 0 0 @@ -464,7 +480,7 @@ 3 - 21 + 22 1 0 0 @@ -476,7 +492,7 @@ 3 - 22 + 23 1 0 0 @@ -488,7 +504,19 @@ 3 - 23 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\rt_drv_pwm.c + rt_drv_pwm.c + 0 + 0 + + + 3 + 25 1 0 0 @@ -500,7 +528,7 @@ 3 - 24 + 26 1 0 0 @@ -520,7 +548,7 @@ 0 4 - 25 + 27 1 0 0 @@ -532,7 +560,7 @@ 4 - 26 + 28 1 0 0 @@ -544,7 +572,31 @@ 4 - 27 + 29 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_pwm.c + drv_pwm.c + 0 + 0 + + + 4 + 31 1 0 0 @@ -564,49 +616,49 @@ 0 5 - 28 + 32 1 0 0 0 - ..\..\..\..\components\finsh\shell.c - shell.c + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c 0 0 5 - 29 + 33 1 0 0 0 - ..\..\..\..\components\finsh\msh.c - msh.c + ..\..\..\..\components\finsh\shell.c + shell.c 0 0 5 - 30 + 34 1 0 0 0 - ..\..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\..\components\finsh\msh.c + msh.c 0 0 5 - 31 + 35 1 0 0 0 - ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + ..\..\..\..\components\finsh\cmd.c + cmd.c 0 0 @@ -620,7 +672,7 @@ 0 6 - 32 + 36 1 0 0 @@ -632,7 +684,7 @@ 6 - 33 + 37 1 0 0 @@ -644,7 +696,7 @@ 6 - 34 + 38 1 0 0 @@ -656,7 +708,7 @@ 6 - 35 + 39 1 0 0 @@ -668,7 +720,7 @@ 6 - 36 + 40 1 0 0 @@ -680,7 +732,7 @@ 6 - 37 + 41 1 0 0 @@ -692,7 +744,7 @@ 6 - 38 + 42 1 0 0 @@ -704,7 +756,7 @@ 6 - 39 + 43 1 0 0 @@ -716,7 +768,7 @@ 6 - 40 + 44 1 0 0 @@ -728,7 +780,7 @@ 6 - 41 + 45 1 0 0 @@ -740,7 +792,7 @@ 6 - 42 + 46 1 0 0 @@ -752,7 +804,7 @@ 6 - 43 + 47 1 0 0 @@ -764,7 +816,7 @@ 6 - 44 + 48 1 0 0 @@ -776,7 +828,7 @@ 6 - 45 + 49 1 0 0 @@ -788,7 +840,7 @@ 6 - 46 + 50 1 0 0 @@ -808,61 +860,61 @@ 0 7 - 47 + 51 1 0 0 0 - ..\..\..\..\src\klibc\kstdio.c - kstdio.c + ..\..\..\..\src\klibc\kstring.c + kstring.c 0 0 7 - 48 + 52 1 0 0 0 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - rt_vsnprintf_tiny.c + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c 0 0 7 - 49 + 53 1 0 0 0 - ..\..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\..\src\klibc\kerrno.c + kerrno.c 0 0 7 - 50 + 54 1 0 0 0 - ..\..\..\..\src\klibc\rt_vsscanf.c - rt_vsscanf.c + ..\..\..\..\src\klibc\kstdio.c + kstdio.c 0 0 7 - 51 + 55 1 0 0 0 - ..\..\..\..\src\klibc\kerrno.c - kerrno.c + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c 0 0 @@ -876,7 +928,7 @@ 0 8 - 52 + 56 1 0 0 @@ -888,7 +940,7 @@ 8 - 53 + 57 1 0 0 @@ -900,7 +952,7 @@ 8 - 54 + 58 1 0 0 @@ -912,7 +964,7 @@ 8 - 55 + 59 2 0 0 @@ -924,7 +976,7 @@ 8 - 56 + 60 1 0 0 @@ -938,13 +990,13 @@ Libraries - 0 + 1 0 0 0 9 - 57 + 61 2 0 0 @@ -956,7 +1008,7 @@ 9 - 58 + 62 1 0 0 @@ -968,7 +1020,7 @@ 9 - 59 + 63 1 0 0 @@ -980,7 +1032,7 @@ 9 - 60 + 64 1 0 0 @@ -992,7 +1044,7 @@ 9 - 61 + 65 1 0 0 @@ -1004,7 +1056,7 @@ 9 - 62 + 66 1 0 0 @@ -1016,7 +1068,7 @@ 9 - 63 + 67 1 0 0 @@ -1028,7 +1080,7 @@ 9 - 64 + 68 1 0 0 @@ -1040,7 +1092,7 @@ 9 - 65 + 69 1 0 0 @@ -1052,7 +1104,7 @@ 9 - 66 + 70 1 0 0 @@ -1062,6 +1114,18 @@ 0 0 + + 9 + 71 + 1 + 0 + 0 + 0 + .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + gd32f4xx_timer.c + 0 + 0 + diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx index 5d4e1c6e1db..9ab03ac12eb 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvprojx +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -338,9 +338,9 @@ 0 - GD32F405, __CLK_TCK=RT_TICK_PER_SECOND, HXTAL_VALUE=8000000, RT_USING_LIBC, USE_STDPERIPH_DRIVER, __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, __RTTHREAD__ + RT_USING_LIBC, HXTAL_VALUE=8000000U, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, GD32F405, __STDC_LIMIT_MACROS - applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\net\utest;..\..\..\..\include;..\..\..\..\components\drivers\include;board;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\smp_call;packages\gd32-arm-cmsis-latest\GD32F4xx;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\drivers\include + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\net\utest;applications;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;board;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;..\..\..\..\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\eventfd @@ -371,7 +371,7 @@ 0x08000000 0x20000000 - .\board\linker_scripts\link.sct + .\gd32_rom.ld @@ -495,6 +495,62 @@ + + hwtimer.c + 1 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + dev_i2c_bit_ops.c 1 @@ -1167,6 +1223,62 @@ + + rt_drv_pwm.c + 1 + ..\..\..\..\components\drivers\misc\rt_drv_pwm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + dev_pin.c 1 @@ -1294,6 +1406,16 @@ 1 ..\libraries\gd32_drivers\drv_gpio.c + + drv_hwtimer.c + 1 + ..\libraries\gd32_drivers\drv_hwtimer.c + + + drv_pwm.c + 1 + ..\libraries\gd32_drivers\drv_pwm.c + drv_usart.c 1 @@ -1304,6 +1426,11 @@ Finsh + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + shell.c 1 @@ -1319,11 +1446,6 @@ 1 ..\..\..\..\components\finsh\cmd.c - - msh_parse.c - 1 - ..\..\..\..\components\finsh\msh_parse.c - @@ -2174,16 +2296,6 @@ klibc - - kstdio.c - 1 - ..\..\..\..\src\klibc\kstdio.c - - - rt_vsnprintf_tiny.c - 1 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - kstring.c 1 @@ -2199,6 +2311,16 @@ 1 ..\..\..\..\src\klibc\kerrno.c + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + @@ -2284,6 +2406,11 @@ 1 packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + gd32f4xx_timer.c + 1 + .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h index d1437771267..598194241ad 100644 --- a/bsp/gd32/arm/gd32405rg/rtconfig.h +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -149,7 +149,9 @@ #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_I2C #define RT_USING_I2C_BITOPS +#define RT_USING_PWM #define RT_USING_PIN +#define RT_USING_HWTIMER /* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -420,6 +422,19 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART0 +#define BSP_USING_PWM +#define BSP_USING_PWM0 +#define BSP_USING_PWM1 +#define BSP_USING_PWM2 +#define BSP_USING_PWM3 +#define BSP_USING_PWM4 +#define BSP_USING_PWM7 +#define BSP_USING_PWM8 +#define BSP_USING_PWM9 +#define BSP_USING_PWM10 +#define BSP_USING_PWM11 +#define BSP_USING_PWM12 +#define BSP_USING_PWM13 #define BSP_USING_GD_DBG /* end of On-chip Peripheral Drivers */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c index a95c5d634a4..a0ef9eebd4f 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c @@ -6,15 +6,21 @@ * Change Logs: * Date Author Notes * 2023-06-05 zengjianwei first version - * 2025-06-23 Yucai Liu Support for non-complementary PWM output with advanced timers + * 2025-06-23 Yucai Liu Support for non-complementary PWM output with + * advanced timers + * 2025-12-26 shihongchao Optimize the timer clock frequency acquisition + * method; optimize the gd32_pwm structure to make + * it easier to configure; optimize the RCU enable + * logic; optimize GPIO configuration to maintain + * floating input mode when channels are disabled, + * reducing power consumption. */ #include -#include #include #include -#ifdef RT_USING_PWM +#ifdef BSP_USING_PWM /* #define DRV_DEBUG */ #define LOG_TAG "drv.pwm" @@ -24,208 +30,186 @@ #define MIN_PERIOD 3 #define MIN_PULSE 2 -typedef struct -{ - rt_int8_t TimerIndex; /* timer index:0~13 */ - rt_uint32_t Port; /* gpio port:GPIOA/GPIOB/GPIOC/... */ - rt_uint32_t pin; /* gpio pin:GPIO_PIN_0~GPIO_PIN_15 */ - /* timer channel: -2 is ch_1n, -1 is ch_0n, 0 is ch0, 1 is ch1 */ - rt_int16_t channel; - char *name; -} TIMER_PORT_CHANNEL_MAP_S; +typedef struct{ + uint32_t gpio_port; + uint32_t gpio_af; + uint16_t gpio_pin; +}channel_type; struct gd32_pwm { - struct rt_device_pwm pwm_device; - TIMER_PORT_CHANNEL_MAP_S tim_handle; + struct rt_device_pwm pwm_device; /* 继承pwm设备 */ + char *name; /* 设备名称 */ + uint32_t timerx; /* PWM依赖的的硬件定时器 */ + rcu_clock_freq_enum apb_of; /* TIMER从属的APB总线 */ + channel_type channels[4]; /* PWM通道 */ + channel_type nchannels[3]; /* PWM反相通道, 只有高级定时器支持 */ }; static struct gd32_pwm gd32_pwm_obj[] = { -#ifdef RT_USING_PWM1 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm1"}}, -#endif - -#ifdef RT_USING_PWM2 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm2"}}, -#endif - -#ifdef RT_USING_PWM3 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm3"}}, +#ifdef BSP_USING_PWM0 + { + .name = "pwm0", + .timerx = TIMER0, + .apb_of = CK_APB2, + .channels = { + {GPIOC, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + .nchannels = { + {GPIOB, GPIO_AF_1, GPIO_PIN_13}, + {GPIOB, GPIO_AF_1, GPIO_PIN_14}, + {GPIOB, GPIO_AF_1, GPIO_PIN_15}, + } + }, #endif -#ifdef RT_USING_PWM4 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm4"}}, +#ifdef BSP_USING_PWM1 + { + .name = "pwm1", + .timerx = TIMER1, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOB, GPIO_AF_1, GPIO_PIN_2}, + }, + }, #endif -#ifdef RT_USING_PWM5 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm5"}}, +#ifdef BSP_USING_PWM2 + { + .name = "pwm2", + .timerx = TIMER2, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_6}, + {GPIOA, GPIO_AF_1, GPIO_PIN_7}, + {GPIOB, GPIO_AF_2, GPIO_PIN_0}, + {GPIOB, GPIO_AF_2, GPIO_PIN_1}, + }, + }, #endif -#ifdef RT_USING_PWM6 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm6"}}, +#ifdef BSP_USING_PWM3 + { + .name = "pwm3", + .timerx = TIMER3, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + }, #endif -#ifdef RT_USING_PWM7 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm7"}}, +#ifdef BSP_USING_PWM4 + { + .name = "pwm4", + .timerx = TIMER4, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_2, GPIO_PIN_0}, + {GPIOA, GPIO_AF_2, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + }, #endif -#ifdef RT_USING_PWM8 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm8"}}, +#ifdef BSP_USING_PWM7 + { + .name = "pwm7", + .timerx = TIMER7, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOC, GPIO_AF_1, GPIO_PIN_8}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + .nchannels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_5}, + {GPIOB, GPIO_AF_1, GPIO_PIN_0}, + {GPIOB, GPIO_AF_1, GPIO_PIN_1}, + } + }, #endif -#ifdef RT_USING_PWM9 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm9"}}, +#ifdef BSP_USING_PWM8 + { + .name = "pwm8", + .timerx = TIMER8, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_3, GPIO_PIN_3}, + }, // L1通用定时器为两通道定时器 + }, #endif -#ifdef RT_USING_PWM10 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm10"}}, +#ifdef BSP_USING_PWM9 + { + .name = "pwm9", + .timerx = TIMER9, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + }, // L2通用定时器为单通道定时器 + }, #endif -#ifdef RT_USING_PWM11 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm11"}}, +#ifdef BSP_USING_PWM10 + { + .name = "pwm10", + .timerx = TIMER10, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + }, // L2通用定时器为单通道定时器 + }, #endif -#ifdef RT_USING_PWM12 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm12"}}, +#ifdef BSP_USING_PWM11 + { + .name = "pwm11", + .timerx = TIMER11, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + }, // L1通用定时器为两通道定时器 + }, #endif -#ifdef RT_USING_PWM13 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm13"}}, +#ifdef BSP_USING_PWM12 + { + .name = "pwm12", + .timerx = TIMER12, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + }, // L2通用定时器为单通道定时器 + }, #endif -#ifdef RT_USING_PWM14 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm14"}}, +#ifdef BSP_USING_PWM13 + { + .name = "pwm13", + .timerx = TIMER13, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_7}, + }, // L2通用定时器为单通道定时器 + }, #endif }; -typedef struct -{ - rt_uint32_t Port[7]; - rt_int8_t TimerIndex[14]; -} TIMER_PERIPH_LIST_S; - -static TIMER_PERIPH_LIST_S gd32_timer_periph_list = { - .Port = {0, 0, 0, 0, 0, 0, 0}, - .TimerIndex = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -}; - -/* - * 将所有用到的 gpio port 和 timer 不重复地列举出来,以方便后面不重复地初始化 - */ -static rt_err_t pwm_find_timer_periph(void) -{ - rt_int16_t i, j, k; - - /* find gpio port of defined table */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) - { - /* find -1 of gd32_periph_list's member of Port */ - for (j = 0; j < sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0]); ++j) - { - if (0 == gd32_timer_periph_list.Port[j]) - { - break; - } - } - - if (j >= sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0])) - { - LOG_E("Can not find -1 of gd32_periph_list's member of Port!\n"); - break; - } - - /* find the different of Port */ - for (k = 0; k < j; ++k) - { - if (gd32_pwm_obj[i].tim_handle.Port == gd32_timer_periph_list.Port[k]) - { - break; - } - } - - /* if can not find the same Port */ - if (k == j) - { - gd32_timer_periph_list.Port[j] = gd32_pwm_obj[i].tim_handle.Port; - } - } - - /* find timer periph of defined table */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) - { - /* find -1 of gd32_periph_list's member of TimerIndex */ - for (j = 0; j < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++j) - { - if (-1 == gd32_timer_periph_list.TimerIndex[j]) - { - break; - } - } - - if (j >= sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0])) - { - LOG_E("Can not find -1 of gd32_periph_list's member of TimerIndex!\n"); - break; - } - - /* find the different of TimerIndex */ - for (k = 0; k < j; ++k) - { - if (gd32_pwm_obj[i].tim_handle.TimerIndex == gd32_timer_periph_list.TimerIndex[k]) - { - break; - } - } - - /* if can not find the same TimerIndex */ - if (k == j) - { - gd32_timer_periph_list.TimerIndex[j] = gd32_pwm_obj[i].tim_handle.TimerIndex; - } - } - - return RT_EOK; -} - -static rt_uint32_t index_to_timer(rt_int8_t TimerIndex) -{ - switch (TimerIndex) - { - case 0: - return TIMER0; - case 1: - return TIMER1; - case 2: - return TIMER2; - case 3: - return TIMER3; - case 4: - return TIMER4; - case 5: - return TIMER5; - case 6: - return TIMER6; - case 7: - return TIMER7; - case 8: - return TIMER8; - case 9: - return TIMER9; - case 10: - return TIMER10; - case 11: - return TIMER11; - case 12: - return TIMER12; - case 13: - return TIMER13; - - default: - LOG_E("Unsport timer periph!\n"); - } - return TIMER0; -} - static void gpio_clock_enable(rt_uint32_t Port) { switch (Port) @@ -257,54 +241,52 @@ static void gpio_clock_enable(rt_uint32_t Port) } } -static void timer_clock_enable(rt_int8_t TimerIndex) +static void timer_clock_enable(uint32_t timer) { - switch (TimerIndex) + switch (timer) { - case 0: + case TIMER0: rcu_periph_clock_enable(RCU_TIMER0); break; - case 1: + case TIMER1: rcu_periph_clock_enable(RCU_TIMER1); break; - case 2: + case TIMER2: rcu_periph_clock_enable(RCU_TIMER2); break; - case 3: + case TIMER3: rcu_periph_clock_enable(RCU_TIMER3); break; - case 4: + case TIMER4: rcu_periph_clock_enable(RCU_TIMER4); break; - case 5: + case TIMER5: rcu_periph_clock_enable(RCU_TIMER5); break; - case 6: + case TIMER6: rcu_periph_clock_enable(RCU_TIMER6); break; - case 7: + case TIMER7: rcu_periph_clock_enable(RCU_TIMER7); break; -#ifndef GD32F30X_HD - case 8: + case TIMER8: rcu_periph_clock_enable(RCU_TIMER8); break; - case 9: + case TIMER9: rcu_periph_clock_enable(RCU_TIMER9); break; - case 10: + case TIMER10: rcu_periph_clock_enable(RCU_TIMER10); break; - case 11: + case TIMER11: rcu_periph_clock_enable(RCU_TIMER11); break; - case 12: + case TIMER12: rcu_periph_clock_enable(RCU_TIMER12); break; - case 13: + case TIMER13: rcu_periph_clock_enable(RCU_TIMER13); break; -#endif default: LOG_E("Unsport timer periph!\n"); } @@ -314,96 +296,168 @@ static void rcu_config(void) { rt_int16_t i; - for (i = 0; i < sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0]); ++i) + for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) { - if (0 == gd32_timer_periph_list.Port[i]) + /* enable GPIO clock */ + switch (gd32_pwm_obj[i].timerx) { + /* 高级定时器 */ + case TIMER0: + case TIMER7: + gpio_clock_enable(gd32_pwm_obj[i].nchannels[0].gpio_port); + gpio_clock_enable(gd32_pwm_obj[i].nchannels[1].gpio_port); + gpio_clock_enable(gd32_pwm_obj[i].nchannels[2].gpio_port); + + /* L0 通用定时器 */ + case TIMER1: + case TIMER2: + case TIMER3: + case TIMER4: + gpio_clock_enable(gd32_pwm_obj[i].channels[2].gpio_port); + gpio_clock_enable(gd32_pwm_obj[i].channels[3].gpio_port); + + /* L1 通用定时器 */ + case TIMER8: + case TIMER11: + gpio_clock_enable(gd32_pwm_obj[i].channels[1].gpio_port); + + /* L2 通用定时器 */ + case TIMER9: + case TIMER10: + case TIMER12: + case TIMER13: + gpio_clock_enable(gd32_pwm_obj[i].channels[0].gpio_port); + break; + + default: + LOG_E("Unsport timer periph at rcu_config!\n"); break; } - - /* enable GPIO clock */ - gpio_clock_enable(gd32_timer_periph_list.Port[i]); } - rcu_periph_clock_enable(RCU_AF); - - for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) { - if (-1 == gd32_timer_periph_list.TimerIndex[i]) - { - break; - } - /* enable timer clock */ - timer_clock_enable(gd32_timer_periph_list.TimerIndex[i]); - timer_deinit(index_to_timer(gd32_timer_periph_list.TimerIndex[i])); + timer_clock_enable(gd32_pwm_obj[i].timerx); + timer_deinit(gd32_pwm_obj[i].timerx); } } -static void gpio_config(void) +/** + * @brief 配置PWM输出引脚为pwm输出模式 + * @param pwm pwm 对象 + * @param configuration pwm驱动框架传递的配置信息 + */ +static void gpio_config_pwmout(const struct gd32_pwm *pwm, + const struct rt_pwm_configuration *configuration) { - rt_int16_t i; - - /* config the GPIO as analog mode */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + channel_type channel; + uint8_t channel_num = configuration->channel; + if(configuration->complementary) { - gpio_init(gd32_pwm_obj[i].tim_handle.Port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, gd32_pwm_obj[i].tim_handle.pin); + if(channel_num > 3) channel_num = 3; + channel = pwm->nchannels[channel_num-1]; } + else + { + if(channel_num > 4) channel_num = 4; + channel = pwm->channels[channel_num-1]; + } + gpio_mode_set(channel.gpio_port, GPIO_MODE_AF, GPIO_PUPD_NONE, channel.gpio_pin); + gpio_output_options_set(channel.gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, channel.gpio_pin); + gpio_af_set(channel.gpio_port, channel.gpio_af, channel.gpio_pin); } -static void timer_init_para(timer_parameter_struct *initpara) +/** + * @brief 配置PWM输出引脚为pwm浮空输入模式 + * @param pwm pwm 对象 + * @param configuration pwm驱动框架传递的配置信息 + */ +static void gpio_config_input(const struct gd32_pwm *pwm, + const struct rt_pwm_configuration *configuration) { - rt_int16_t i; - - for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + channel_type channel = {0}; + uint8_t channel_num = configuration->channel; + if(configuration->complementary) { - /* config timer */ - if (-1 != gd32_timer_periph_list.TimerIndex[i]) - { - timer_init(index_to_timer(gd32_timer_periph_list.TimerIndex[i]), initpara); - } + if(channel_num > 3) channel_num = 3; + channel = pwm->nchannels[channel_num-1]; + } + else + { + if(channel_num > 4) channel_num = 4; + channel = pwm->channels[channel_num-1]; } + gpio_mode_set(channel.gpio_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, channel.gpio_pin); } -static void channel_output_config(timer_oc_parameter_struct *ocpara) +static void channel_output_config(rt_uint32_t timer_periph, timer_oc_parameter_struct *ocpara) { rt_int16_t i; - rt_uint32_t timer_periph; - /* config the channel config */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + switch (timer_periph) { - if (gd32_pwm_obj[i].tim_handle.channel < 0) - { - ocpara->outputstate = TIMER_CCX_DISABLE; - ocpara->outputnstate = TIMER_CCXN_ENABLE; - gd32_pwm_obj[i].tim_handle.channel = -(gd32_pwm_obj[i].tim_handle.channel + 1); - } - timer_periph = index_to_timer(gd32_pwm_obj[i].tim_handle.TimerIndex); - timer_channel_output_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, ocpara); + /* 高级定时器 */ + case TIMER0: + case TIMER7: + timer_primary_output_config(timer_periph, ENABLE); + + /* L0通用定时器 */ + case TIMER1: + case TIMER2: + case TIMER3: + case TIMER4: + timer_channel_output_config(timer_periph, TIMER_CH_2, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_2, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, TIMER_CH_2, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_2, TIMER_CCXN_DISABLE); - timer_channel_output_pulse_value_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, 7999); - timer_channel_output_mode_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_OC_MODE_PWM0); - timer_channel_output_shadow_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_OC_SHADOW_DISABLE); + timer_channel_output_config(timer_periph, TIMER_CH_3, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_3, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_3, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE); /* auto-reload preload shadow reg enable */ /* timer_auto_reload_shadow_enable(timer_periph); */ - timer_channel_output_state_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_CCX_DISABLE); - timer_channel_complementary_output_state_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_CCXN_DISABLE); + timer_channel_output_state_config(timer_periph, TIMER_CH_3, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_3, TIMER_CCXN_DISABLE); + + /* L1通用定时器 */ + case TIMER8: + case TIMER11: + timer_channel_output_config(timer_periph, TIMER_CH_1, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_1, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, TIMER_CH_1, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_1, TIMER_CCXN_DISABLE); + + /* L2通用定时器 */ + case TIMER9: + case TIMER10: + case TIMER12: + case TIMER13: + timer_channel_output_config(timer_periph, TIMER_CH_0, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_0, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, TIMER_CH_0, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_0, TIMER_CCXN_DISABLE); + break; + + default: + LOG_E("Unsport timer periph at channel_output_config!\n"); + break; } - /* enable timer */ - for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) - { - if (-1 != gd32_timer_periph_list.TimerIndex[i]) - { - timer_periph = index_to_timer(gd32_timer_periph_list.TimerIndex[i]); - if (timer_periph == TIMER0 || timer_periph == TIMER7) - { - timer_primary_output_config(timer_periph, ENABLE); - } - timer_enable(timer_periph); - } - } + timer_enable(timer_periph); } static void timer_config(void) @@ -412,58 +466,76 @@ static void timer_config(void) timer_parameter_struct timer_initpara; /* TIMER configuration */ - timer_initpara.prescaler = 119; + timer_initpara.prescaler = 199; timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = 15999; timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_initpara.repetitioncounter = 0; - timer_init_para(&timer_initpara); + for (size_t i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + { + timer_init(gd32_pwm_obj[i].timerx, &timer_initpara); + } /* CHX configuration in PWM mode */ - timer_ocintpara.outputstate = TIMER_CCX_ENABLE; + timer_ocintpara.outputstate = TIMER_CCX_DISABLE; timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE; timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; - channel_output_config(&timer_ocintpara); + /* config the channel config */ + for (size_t i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + { + channel_output_config(gd32_pwm_obj[i].timerx, &timer_ocintpara); + } } -static rt_err_t drv_pwm_enable(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm_configuration *configuration, +static rt_err_t drv_pwm_enable(struct gd32_pwm *pwm, const struct rt_pwm_configuration *configuration, rt_bool_t enable) { if (!enable) { - timer_channel_output_state_config(index_to_timer(pstTimerMap->TimerIndex), configuration->channel, - TIMER_CCX_DISABLE); + gpio_config_input(pwm, configuration); + if (configuration->complementary == RT_TRUE) + { + timer_channel_complementary_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCXN_DISABLE); + } + else + { + timer_channel_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCX_DISABLE); + } } else { + gpio_config_pwmout(pwm, configuration); if (configuration->complementary == RT_TRUE) { - timer_channel_output_state_config( - index_to_timer(pstTimerMap->TimerIndex), configuration->channel - 1, TIMER_CCXN_ENABLE); + timer_channel_complementary_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCXN_ENABLE); } else { - timer_channel_output_state_config( - index_to_timer(pstTimerMap->TimerIndex), configuration->channel, TIMER_CCX_ENABLE); + timer_channel_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCX_ENABLE); } } return RT_EOK; } -static rt_err_t drv_pwm_get(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm_configuration *configuration) +static rt_err_t drv_pwm_get(const struct gd32_pwm *pwm, struct rt_pwm_configuration *configuration) { rt_uint64_t tim_clock; rt_uint16_t psc; rt_uint32_t chxcv; - tim_clock = rcu_clock_freq_get(CK_SYS); + rt_uint8_t coef = (RCU_CFG1&RCU_CFG1_TIMERSEL)?4:2; + tim_clock = rcu_clock_freq_get(pwm->apb_of)*coef; - psc = timer_prescaler_read(index_to_timer(pstTimerMap->TimerIndex)); + psc = timer_prescaler_read(pwm->timerx); if (psc == TIMER_CKDIV_DIV2) { tim_clock = tim_clock / 2; @@ -473,21 +545,22 @@ static rt_err_t drv_pwm_get(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm tim_clock = tim_clock / 4; } - chxcv = timer_channel_capture_value_register_read(index_to_timer(pstTimerMap->TimerIndex), configuration->channel); + chxcv = timer_channel_capture_value_register_read(pwm->timerx, configuration->channel-1); /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ tim_clock /= 1000000UL; - configuration->period = (TIMER_CAR(index_to_timer(pstTimerMap->TimerIndex)) + 1) * (psc + 1) * 1000UL / tim_clock; + configuration->period = (TIMER_CAR(pwm->timerx) + 1) * (psc + 1) * 1000UL / tim_clock; configuration->pulse = (chxcv + 1) * (psc + 1) * 1000UL / tim_clock; return RT_EOK; } -static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm_configuration *configuration) +static rt_err_t drv_pwm_set(struct gd32_pwm *pwm, struct rt_pwm_configuration *configuration) { rt_uint32_t period, pulse; rt_uint64_t tim_clock, psc; - tim_clock = rcu_clock_freq_get(CK_SYS); + rt_uint8_t coef = (RCU_CFG1&RCU_CFG1_TIMERSEL)?4:2; + tim_clock = rcu_clock_freq_get(pwm->apb_of)*coef; /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ tim_clock /= 1000000UL; @@ -495,14 +568,14 @@ static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm psc = period / MAX_PERIOD + 1; period = period / psc; - timer_prescaler_config(index_to_timer(pstTimerMap->TimerIndex), psc - 1, TIMER_PSC_RELOAD_NOW); + timer_prescaler_config(pwm->timerx, psc - 1, TIMER_PSC_RELOAD_NOW); if (period < MIN_PERIOD) { period = MIN_PERIOD; } - timer_autoreload_value_config(index_to_timer(pstTimerMap->TimerIndex), period - 1); + timer_autoreload_value_config(pwm->timerx, period - 1); pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL; if (pulse < MIN_PULSE) @@ -514,11 +587,11 @@ static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm pulse = period; } - timer_channel_output_pulse_value_config(index_to_timer(pstTimerMap->TimerIndex), configuration->channel, pulse); - timer_counter_value_config(index_to_timer(pstTimerMap->TimerIndex), 0); + timer_channel_output_pulse_value_config(pwm->timerx, configuration->channel-1, pulse); + timer_counter_value_config(pwm->timerx, 0); /* Update frequency value */ - timer_event_software_generate(index_to_timer(pstTimerMap->TimerIndex), TIMER_EVENT_SRC_UPG); + timer_event_software_generate(pwm->timerx, TIMER_EVENT_SRC_UPG); return RT_EOK; } @@ -526,18 +599,18 @@ static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) { struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; - TIMER_PORT_CHANNEL_MAP_S *pstTimerMap = (TIMER_PORT_CHANNEL_MAP_S *)device->parent.user_data; + struct gd32_pwm *pwm = (struct gd32_pwm *)device; switch (cmd) { case PWM_CMD_ENABLE: - return drv_pwm_enable(pstTimerMap, configuration, RT_TRUE); + return drv_pwm_enable(pwm, configuration, RT_TRUE); case PWM_CMD_DISABLE: - return drv_pwm_enable(pstTimerMap, configuration, RT_FALSE); + return drv_pwm_enable(pwm, configuration, RT_FALSE); case PWM_CMD_SET: - return drv_pwm_set(pstTimerMap, configuration); + return drv_pwm_set(pwm, configuration); case PWM_CMD_GET: - return drv_pwm_get(pstTimerMap, configuration); + return drv_pwm_get(pwm, configuration); default: return -RT_EINVAL; } @@ -547,15 +620,18 @@ static struct rt_pwm_ops drv_ops = {drv_pwm_control}; static rt_err_t gd32_hw_pwm_init(void) { - pwm_find_timer_periph(); rcu_config(); - gpio_config(); timer_config(); + /* + * gpio 此处不配置,当pwm通道使能时会配置为pwmout,失能时会配置为浮空输入 + * gpio 默认为浮空输入 + */ + return RT_EOK; } -static int gd32_pwm_init(void) +static int rt_hw_pwm_init(void) { int i = 0; int result = RT_EOK; @@ -573,14 +649,14 @@ static int gd32_pwm_init(void) for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); i++) { /* register pwm device */ - if (rt_device_pwm_register(&gd32_pwm_obj[i].pwm_device, gd32_pwm_obj[i].tim_handle.name, &drv_ops, - &gd32_pwm_obj[i].tim_handle)== RT_EOK ) + if (rt_device_pwm_register(&gd32_pwm_obj[i].pwm_device, gd32_pwm_obj[i].name, &drv_ops, + RT_NULL)== RT_EOK ) { - LOG_D("%s register success", gd32_pwm_obj[i].tim_handle.name); + LOG_D("%s register success", gd32_pwm_obj[i].name); } else { - LOG_E("%s register failed", gd32_pwm_obj[i].tim_handle.name); + LOG_E("%s register failed", gd32_pwm_obj[i].name); result = -RT_ERROR; } } @@ -588,6 +664,6 @@ static int gd32_pwm_init(void) __exit: return result; } -INIT_DEVICE_EXPORT(gd32_pwm_init); +INIT_DEVICE_EXPORT(rt_hw_pwm_init); #endif /* RT_USING_PWM */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c index be459ffcf66..a1bbcc07f2f 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c @@ -6,6 +6,10 @@ * Change Logs: * Date Author Notes * 2021-02-25 iysheng first version + * 2025-12-26 shihongchao Configure GD32F4xx chips interrupt handlers, + * relocate clock and interrupt initialization + * to the _init function, and implement deinit + * functionality */ #include @@ -114,16 +118,30 @@ static void __set_timerx_freq(uint32_t timerx, uint32_t freq) static void gd32_clock_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { uint32_t timer_base = (uint32_t)timer->parent.user_data; + gd32_hwtimer_device *hwtimer = rt_container_of(timer, gd32_hwtimer_device, hwtimer_dev); timer_parameter_struct initpara; if (state) { + rcu_periph_clock_enable(hwtimer->hw_data.rcu); + NVIC_SetPriority(hwtimer->hw_data.irqn, 0); + NVIC_EnableIRQ(hwtimer->hw_data.irqn); + timer_interrupt_enable(timer_base, TIMER_INT_UP); + timer_internal_clock_config(timer_base); timer_struct_para_init(&initpara); initpara.period = timer->info->maxcnt; timer_init(timer_base, &initpara); __set_timerx_freq(timer_base, timer->info->maxfreq); } + else + { + rcu_periph_clock_disable(hwtimer->hw_data.rcu); + NVIC_DisableIRQ(hwtimer->hw_data.irqn); + timer_interrupt_disable(timer_base, TIMER_INT_UP); + + timer_disable(timer_base); + } } static rt_err_t gd32_clock_timer_start(struct rt_clock_timer_device *timer, \ @@ -200,7 +218,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer0", { TIMER0, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_UP_TIMER9_IRQn, +#else TIMER0_UP_IRQn, +#endif RCU_TIMER0, }, {0}, @@ -285,7 +307,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer5", { TIMER5, +#ifdef SOC_SERIES_GD32F4xx + TIMER5_DAC_IRQn, +#else TIMER5_IRQn, +#endif RCU_TIMER5, }, {0}, @@ -319,7 +345,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer7", { TIMER7, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_UP_TIMER12_IRQn, +#else TIMER7_UP_IRQn, +#endif RCU_TIMER7, }, {0}, @@ -336,7 +366,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer8", { TIMER8, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_BRK_TIMER8_IRQn, +#else TIMER8_IRQn, +#endif RCU_TIMER8, }, {0}, @@ -353,7 +387,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer9", { TIMER9, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_UP_TIMER9_IRQn, +#else TIMER9_IRQn, +#endif RCU_TIMER9, }, {0}, @@ -370,7 +408,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer10", { TIMER10, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_TRG_CMT_TIMER10_IRQn, +#else TIMER10_IRQn, +#endif RCU_TIMER10, }, {0}, @@ -387,7 +429,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer11", { TIMER11, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_BRK_TIMER11_IRQn, +#else TIMER11_IRQn, +#endif RCU_TIMER11, }, {0}, @@ -404,7 +450,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer12", { TIMER12, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_UP_TIMER12_IRQn, +#else TIMER12_IRQn, +#endif RCU_TIMER12, }, {0}, @@ -421,7 +471,11 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer13", { TIMER13, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_TRG_CMT_TIMER13_IRQn, +#else TIMER13_IRQn, +#endif RCU_TIMER13, }, {0}, @@ -523,6 +577,63 @@ void TIMER7_UP_IRQHandler(void) } #endif + +#ifdef BSP_USING_HWTIMER8 +#ifdef SOC_SERIES_GD32F4xx +void TIMER0_BRK_TIMER8_IRQHandler(void) +#else +void TIMER8_UP_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM8_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM8_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + +#ifdef BSP_USING_HWTIMER10 +#ifdef SOC_SERIES_GD32F4xx +void TIMER0_TRG_CMT_TIMER10_IRQHandler(void) +#else +void TIMER10_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM10_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM10_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + +#ifdef BSP_USING_HWTIMER11 +#ifdef SOC_SERIES_GD32F4xx +void TIMER7_BRK_TIMER11_IRQHandler(void) +#else +void TIMER10_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM11_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM11_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + +#ifdef BSP_USING_HWTIMER13 +void TIMER10_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM13_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM13_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + static int rt_clock_timer_init(void) { int ret = 0, i = 0; From 29e717cc1896748865ad927b0918bdf95f172601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Sun, 11 Jan 2026 19:18:36 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(bsp/gd32/arm):=20=E4=BF=AE=E5=A4=8Dgd32?= =?UTF-8?q?=E7=A1=AC=E4=BB=B6i2c=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 硬件i2c主机接收驱动采用方案B,但不支持接收小于3字节,现修复该问题 - 增加方案A。 --- bsp/gd32/arm/gd32405rg/.config | 20 +-- bsp/gd32/arm/gd32405rg/board/Kconfig | 29 +++ bsp/gd32/arm/gd32405rg/project.uvoptx | 166 +++++++----------- bsp/gd32/arm/gd32405rg/project.uvprojx | 38 ++-- bsp/gd32/arm/gd32405rg/rtconfig.h | 16 +- .../arm/libraries/gd32_drivers/drv_hard_i2c.c | 86 +++++++-- 6 files changed, 200 insertions(+), 155 deletions(-) diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config index d9defb3a43a..8dcdda7301e 100644 --- a/bsp/gd32/arm/gd32405rg/.config +++ b/bsp/gd32/arm/gd32405rg/.config @@ -1440,22 +1440,16 @@ CONFIG_BSP_USING_UART0=y # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_USING_UART4 is not set # CONFIG_BSP_USING_UART5 is not set +CONFIG_BSP_USING_HARD_I2C=y +CONFIG_BSP_USING_RECEIVING_A=y +# CONFIG_BSP_USING_RECEIVING_B is not set +CONFIG_BSP_USING_HARD_I2C0=y +# CONFIG_BSP_USING_HARD_I2C1 is not set +# CONFIG_BSP_USING_HARD_I2C2 is not set # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_HWTIMER is not set -CONFIG_BSP_USING_PWM=y -CONFIG_BSP_USING_PWM0=y -CONFIG_BSP_USING_PWM1=y -CONFIG_BSP_USING_PWM2=y -CONFIG_BSP_USING_PWM3=y -CONFIG_BSP_USING_PWM4=y -CONFIG_BSP_USING_PWM7=y -CONFIG_BSP_USING_PWM8=y -CONFIG_BSP_USING_PWM9=y -CONFIG_BSP_USING_PWM10=y -CONFIG_BSP_USING_PWM11=y -CONFIG_BSP_USING_PWM12=y -CONFIG_BSP_USING_PWM13=y +# CONFIG_BSP_USING_PWM is not set # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set # CONFIG_BSP_USING_SDIO is not set diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig index ea08346a419..36805b18fbc 100644 --- a/bsp/gd32/arm/gd32405rg/board/Kconfig +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -232,6 +232,35 @@ menu "On-chip Peripheral Drivers" default 32 endif + menuconfig BSP_USING_HARD_I2C + bool "Enable I2C" + select RT_USING_I2C + default n + if BSP_USING_HARD_I2C + choice + prompt "Select I2C Receiving Scheme" + default BSP_USING_RECEIVING_A + + config BSP_USING_RECEIVING_A + bool "master receiving secheme A --- requires that the software be capable of responding quickly to the 12C event." + + config BSP_USING_RECEIVING_B + bool "master receiving secheme B --- don't requires that the software be capable of responding quickly to the 12C event." + endchoice + + config BSP_USING_HARD_I2C0 + bool "enable hard I2C0" + default n + + config BSP_USING_HARD_I2C1 + bool "enable hard I2C1" + default n + + config BSP_USING_HARD_I2C2 + bool "enable hard I2C2" + default n + endif + menuconfig BSP_USING_SPI bool "Enable SPI BUS" default n diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx index e8e6ea1538e..7fd705460a3 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvoptx +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -117,26 +117,6 @@ BIN\CMSIS_AGDI.dll - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - - 0 CMSIS_AGDI @@ -155,12 +135,12 @@ 0 0 - 1 + 0 0 0 0 0 - 1 + 0 0 0 0 @@ -191,16 +171,6 @@ - - - System Viewer\TIMER1 - 35905 - - - System Viewer\TIMER2 - 35904 - - @@ -577,6 +547,18 @@ 0 0 0 + ..\libraries\gd32_drivers\drv_hard_i2c.c + drv_hard_i2c.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 ..\libraries\gd32_drivers\drv_hwtimer.c drv_hwtimer.c 0 @@ -584,7 +566,7 @@ 4 - 30 + 31 1 0 0 @@ -596,7 +578,7 @@ 4 - 31 + 32 1 0 0 @@ -616,49 +598,49 @@ 0 5 - 32 + 33 1 0 0 0 - ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + ..\..\..\..\components\finsh\msh.c + msh.c 0 0 5 - 33 + 34 1 0 0 0 - ..\..\..\..\components\finsh\shell.c - shell.c + ..\..\..\..\components\finsh\cmd.c + cmd.c 0 0 5 - 34 + 35 1 0 0 0 - ..\..\..\..\components\finsh\msh.c - msh.c + ..\..\..\..\components\finsh\shell.c + shell.c 0 0 5 - 35 + 36 1 0 0 0 - ..\..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c 0 0 @@ -672,7 +654,7 @@ 0 6 - 36 + 37 1 0 0 @@ -684,7 +666,7 @@ 6 - 37 + 38 1 0 0 @@ -696,7 +678,7 @@ 6 - 38 + 39 1 0 0 @@ -708,7 +690,7 @@ 6 - 39 + 40 1 0 0 @@ -720,7 +702,7 @@ 6 - 40 + 41 1 0 0 @@ -732,7 +714,7 @@ 6 - 41 + 42 1 0 0 @@ -744,7 +726,7 @@ 6 - 42 + 43 1 0 0 @@ -756,7 +738,7 @@ 6 - 43 + 44 1 0 0 @@ -768,7 +750,7 @@ 6 - 44 + 45 1 0 0 @@ -780,7 +762,7 @@ 6 - 45 + 46 1 0 0 @@ -792,7 +774,7 @@ 6 - 46 + 47 1 0 0 @@ -804,7 +786,7 @@ 6 - 47 + 48 1 0 0 @@ -816,7 +798,7 @@ 6 - 48 + 49 1 0 0 @@ -828,7 +810,7 @@ 6 - 49 + 50 1 0 0 @@ -840,7 +822,7 @@ 6 - 50 + 51 1 0 0 @@ -860,19 +842,19 @@ 0 7 - 51 + 52 1 0 0 0 - ..\..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\..\src\klibc\kerrno.c + kerrno.c 0 0 7 - 52 + 53 1 0 0 @@ -884,19 +866,19 @@ 7 - 53 + 54 1 0 0 0 - ..\..\..\..\src\klibc\kerrno.c - kerrno.c + ..\..\..\..\src\klibc\kstring.c + kstring.c 0 0 7 - 54 + 55 1 0 0 @@ -908,7 +890,7 @@ 7 - 55 + 56 1 0 0 @@ -928,7 +910,7 @@ 0 8 - 56 + 57 1 0 0 @@ -940,7 +922,7 @@ 8 - 57 + 58 1 0 0 @@ -952,7 +934,7 @@ 8 - 58 + 59 1 0 0 @@ -964,7 +946,7 @@ 8 - 59 + 60 2 0 0 @@ -976,7 +958,7 @@ 8 - 60 + 61 1 0 0 @@ -990,13 +972,13 @@ Libraries - 1 + 0 0 0 0 9 - 61 + 62 2 0 0 @@ -1008,7 +990,7 @@ 9 - 62 + 63 1 0 0 @@ -1020,7 +1002,7 @@ 9 - 63 + 64 1 0 0 @@ -1032,7 +1014,7 @@ 9 - 64 + 65 1 0 0 @@ -1044,7 +1026,7 @@ 9 - 65 + 66 1 0 0 @@ -1056,7 +1038,7 @@ 9 - 66 + 67 1 0 0 @@ -1068,7 +1050,7 @@ 9 - 67 + 68 1 0 0 @@ -1080,7 +1062,7 @@ 9 - 68 + 69 1 0 0 @@ -1092,7 +1074,7 @@ 9 - 69 + 70 1 0 0 @@ -1104,7 +1086,7 @@ 9 - 70 + 71 1 0 0 @@ -1114,18 +1096,6 @@ 0 0 - - 9 - 71 - 1 - 0 - 0 - 0 - .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c - gd32f4xx_timer.c - 0 - 0 - diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx index 9ab03ac12eb..69f501cf6d8 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvprojx +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -338,9 +338,9 @@ 0 - RT_USING_LIBC, HXTAL_VALUE=8000000U, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, GD32F405, __STDC_LIMIT_MACROS + RT_USING_LIBC, GD32F405, __RTTHREAD__, USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, HXTAL_VALUE=8000000U - packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\net\utest;applications;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;board;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;..\..\..\..\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\eventfd + applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\posix\io\eventfd;board;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\cortex-m4;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\libc\posix\io\epoll;..\libraries\gd32_drivers;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\net\utest;..\..\..\..\components\drivers\phy;..\..\..\..\include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include @@ -1406,6 +1406,11 @@ 1 ..\libraries\gd32_drivers\drv_gpio.c + + drv_hard_i2c.c + 1 + ..\libraries\gd32_drivers\drv_hard_i2c.c + drv_hwtimer.c 1 @@ -1427,24 +1432,24 @@ Finsh - msh_parse.c + msh.c 1 - ..\..\..\..\components\finsh\msh_parse.c + ..\..\..\..\components\finsh\msh.c - shell.c + cmd.c 1 - ..\..\..\..\components\finsh\shell.c + ..\..\..\..\components\finsh\cmd.c - msh.c + shell.c 1 - ..\..\..\..\components\finsh\msh.c + ..\..\..\..\components\finsh\shell.c - cmd.c + msh_parse.c 1 - ..\..\..\..\components\finsh\cmd.c + ..\..\..\..\components\finsh\msh_parse.c @@ -2297,9 +2302,9 @@ klibc - kstring.c + kerrno.c 1 - ..\..\..\..\src\klibc\kstring.c + ..\..\..\..\src\klibc\kerrno.c rt_vsscanf.c @@ -2307,9 +2312,9 @@ ..\..\..\..\src\klibc\rt_vsscanf.c - kerrno.c + kstring.c 1 - ..\..\..\..\src\klibc\kerrno.c + ..\..\..\..\src\klibc\kstring.c kstdio.c @@ -2406,11 +2411,6 @@ 1 packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c - - gd32f4xx_timer.c - 1 - .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c - diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h index 598194241ad..ad678722182 100644 --- a/bsp/gd32/arm/gd32405rg/rtconfig.h +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -422,19 +422,9 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART0 -#define BSP_USING_PWM -#define BSP_USING_PWM0 -#define BSP_USING_PWM1 -#define BSP_USING_PWM2 -#define BSP_USING_PWM3 -#define BSP_USING_PWM4 -#define BSP_USING_PWM7 -#define BSP_USING_PWM8 -#define BSP_USING_PWM9 -#define BSP_USING_PWM10 -#define BSP_USING_PWM11 -#define BSP_USING_PWM12 -#define BSP_USING_PWM13 +#define BSP_USING_HARD_I2C +#define BSP_USING_RECEIVING_A +#define BSP_USING_HARD_I2C0 #define BSP_USING_GD_DBG /* end of On-chip Peripheral Drivers */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c index 725b306fde5..48dd5154e4f 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c @@ -6,6 +6,8 @@ * Change Logs: * Date Author Notes * 2021-12-20 BruceOu the first version + * 2026-01-11 ShiHongchao Fix the I2C master receive mode B software + * flow and add support for mode A */ #include "drv_hard_i2c.h" @@ -112,8 +114,8 @@ static const struct gd32_i2c_bus gd_i2c_config[] = { RCU_I2C0, RCU_GPIOB, RCU_GPIOB, /* periph clock, scl gpio clock, sda gpio clock */ - GPIOB, GPIO_AF_4, GPIO_PIN_6, /* scl port, scl alternate, scl pin */ - GPIOB, GPIO_AF_4, GPIO_PIN_7, /* sda port, sda alternate, sda pin */ + GPIOB, GPIO_AF_4, GPIO_PIN_8, /* scl port, scl alternate, scl pin */ + GPIOB, GPIO_AF_4, GPIO_PIN_9, /* sda port, sda alternate, sda pin */ &i2c0, "hwi2c0", @@ -229,13 +231,52 @@ static void gd32_i2c_gpio_init(const struct gd32_i2c_bus *i2c) static uint8_t gd32_i2c_read(rt_uint32_t i2c_periph, rt_uint8_t *p_buffer, rt_uint16_t data_byte) { if (data_byte == 0) return 1; - /* while there is data to be read */ +#ifdef BSP_USING_RECEIVING_A + /* + In single-byte reception, disable ACK because the master needs to send + NACK after receiving the first byte,indicating no more data will be + received, then immediately send the stop condition + */ + if(data_byte == 1) + { + /* disable acknowledge */ + i2c_ack_config(i2c_periph, I2C_ACK_DISABLE); + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(i2c_periph); + } +#endif + + /* while there is data to be read */ while(data_byte) { #if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx) if(IS_I2C_LEGACY(i2c_periph)) { +#ifdef BSP_USING_RECEIVING_A + /* + After receiving the second-to-last byte, ACK should be disabled + and STOP should be set, to ensure that NACK is sent after receiving + the last byte and the stop condition is transmitted + */ + if(2 == data_byte) + { + /* wait until BTC bit is set */ + while(!i2c_flag_get(i2c_periph, I2C_FLAG_RBNE)); + /* disable acknowledge */ + i2c_ack_config(i2c_periph, I2C_ACK_DISABLE); + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(i2c_periph); + } +#elif defined(BSP_USING_RECEIVING_B) + /* + For 3-byte reception: Wait for byte transfer completion, then + disable ACK so NACK is automatically sent after receiving the + last byte + For 2-byte reception: Wait for byte transfer completion, then + send stop condition to ensure direct stop after receiving the + last byte instead of sending ACK + */ if(3 == data_byte) { /* wait until BTC bit is set */ @@ -243,14 +284,16 @@ static uint8_t gd32_i2c_read(rt_uint32_t i2c_periph, rt_uint8_t *p_buffer, rt_ui /* disable acknowledge */ i2c_ack_config(i2c_periph, I2C_ACK_DISABLE); } - - if(2 == data_byte) + else if(2 == data_byte) { /* wait until BTC bit is set */ while(!i2c_flag_get(i2c_periph, I2C_FLAG_BTC)); /* send a stop condition to I2C bus */ i2c_stop_on_bus(i2c_periph); } +#else +#error "Please select the receiving secheme." +#endif /* wait until RBNE bit is set */ if(i2c_flag_get(i2c_periph, I2C_FLAG_RBNE)) { @@ -379,11 +422,18 @@ static rt_ssize_t gd32_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_ { i2c_stop_on_bus(gd32_i2c->i2c_periph); } - /* enable acknowledge */ + /* enable acknowledge */ i2c_ack_config(gd32_i2c->i2c_periph, I2C_ACK_ENABLE); - /* i2c master sends start signal only when the bus is idle */ + /* i2c master sends start signal only when the bus is idle */ while(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY)); - /* send the start signal */ +#ifdef BSP_USING_RECEIVING_B + /* */ + if(msg->len == 2) + { + i2c_ackpos_config(gd32_i2c->i2c_periph, I2C_ACKPOS_NEXT); + } +#endif + /* send the start signal */ i2c_start_on_bus(gd32_i2c->i2c_periph); /* i2c master sends START signal successfully */ while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_SBSEND)); @@ -391,14 +441,26 @@ static rt_ssize_t gd32_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_ i2c_master_addressing(gd32_i2c->i2c_periph, msg->addr, I2C_RECEIVER); while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND)); - /* address flag set means i2c slave sends ACK */ +#ifdef BSP_USING_RECEIVING_B + if(msg->len <= 2) + { + i2c_ack_config(gd32_i2c->i2c_periph, I2C_ACK_DISABLE); + } +#endif + /* address flag set means i2c slave sends ACK */ i2c_flag_clear(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND); +#ifdef BSP_USING_RECEIVING_B + if(msg->len == 1) + { + i2c_stop_on_bus(gd32_i2c->i2c_periph); + } +#endif }else { - /* configure slave address */ + /* configure slave address */ while(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY)); - //i2c_transfer_byte_number_config(gd32_i2c->i2c_periph, w_total_byte); - /* send a start condition to I2C bus */ + //i2c_transfer_byte_number_config(gd32_i2c->i2c_periph, w_total_byte); + /* send a start condition to I2C bus */ i2c_start_on_bus(gd32_i2c->i2c_periph); while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_SBSEND));