From 40136146de3db939996dee979ca668e9891a9772 Mon Sep 17 00:00:00 2001 From: Dozingfiretruck <1473454180@qq.com> Date: Fri, 31 Jul 2020 17:57:08 +0800 Subject: [PATCH 1/5] bsp:stm32f407-armfly-v5 --- bsp/stm32/stm32f407-armfly-v5/.config | 351 ++ bsp/stm32/stm32f407-armfly-v5/.gitignore | 42 + bsp/stm32/stm32f407-armfly-v5/Kconfig | 21 + bsp/stm32/stm32f407-armfly-v5/README.md | 125 + bsp/stm32/stm32f407-armfly-v5/SConscript | 15 + bsp/stm32/stm32f407-armfly-v5/SConstruct | 60 + .../applications/SConscript | 12 + .../stm32f407-armfly-v5/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 19 + .../board/CubeMX_Config/CubeMX_Config.ioc | 234 ++ .../board/CubeMX_Config/Inc/main.h | 73 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 443 +++ .../board/CubeMX_Config/Inc/stm32f4xx_it.h | 69 + .../board/CubeMX_Config/Src/main.c | 708 ++++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 721 +++++ .../board/CubeMX_Config/Src/stm32f4xx_it.c | 203 ++ .../CubeMX_Config/Src/system_stm32f4xx.c | 727 +++++ bsp/stm32/stm32f407-armfly-v5/board/Kconfig | 199 ++ .../stm32f407-armfly-v5/board/SConscript | 44 + bsp/stm32/stm32f407-armfly-v5/board/board.c | 61 + bsp/stm32/stm32f407-armfly-v5/board/board.h | 50 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 157 + .../board/linker_scripts/link.sct | 15 + .../stm32f407-armfly-v5/board/ports/fal_cfg.h | 48 + .../board/ports/sdcard_port.c | 62 + .../board/ports/spi_flash_init.c | 31 + .../stm32f407-armfly-v5/figures/board.png | Bin 0 -> 404490 bytes bsp/stm32/stm32f407-armfly-v5/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32f407-armfly-v5/project.ewp | 2410 ++++++++++++++ bsp/stm32/stm32f407-armfly-v5/project.eww | 10 + bsp/stm32/stm32f407-armfly-v5/project.uvopt | 162 + bsp/stm32/stm32f407-armfly-v5/project.uvoptx | 191 ++ bsp/stm32/stm32f407-armfly-v5/project.uvproj | 1189 +++++++ bsp/stm32/stm32f407-armfly-v5/project.uvprojx | 753 +++++ bsp/stm32/stm32f407-armfly-v5/rtconfig.h | 173 + bsp/stm32/stm32f407-armfly-v5/rtconfig.py | 150 + bsp/stm32/stm32f407-armfly-v5/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32f407-armfly-v5/template.eww | 10 + bsp/stm32/stm32f407-armfly-v5/template.uvopt | 199 ++ bsp/stm32/stm32f407-armfly-v5/template.uvoptx | 187 ++ bsp/stm32/stm32f407-armfly-v5/template.uvproj | 438 +++ .../stm32f407-armfly-v5/template.uvprojx | 411 +++ 43 files changed, 15699 insertions(+) create mode 100644 bsp/stm32/stm32f407-armfly-v5/.config create mode 100644 bsp/stm32/stm32f407-armfly-v5/.gitignore create mode 100644 bsp/stm32/stm32f407-armfly-v5/Kconfig create mode 100644 bsp/stm32/stm32f407-armfly-v5/README.md create mode 100644 bsp/stm32/stm32f407-armfly-v5/SConscript create mode 100644 bsp/stm32/stm32f407-armfly-v5/SConstruct create mode 100644 bsp/stm32/stm32f407-armfly-v5/applications/SConscript create mode 100644 bsp/stm32/stm32f407-armfly-v5/applications/main.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_it.h create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_it.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/system_stm32f4xx.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/Kconfig create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/SConscript create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/board.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/board.h create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c create mode 100644 bsp/stm32/stm32f407-armfly-v5/figures/board.png create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.ewd create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.ewp create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.eww create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.uvopt create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.uvoptx create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.uvproj create mode 100644 bsp/stm32/stm32f407-armfly-v5/project.uvprojx create mode 100644 bsp/stm32/stm32f407-armfly-v5/rtconfig.h create mode 100644 bsp/stm32/stm32f407-armfly-v5/rtconfig.py create mode 100644 bsp/stm32/stm32f407-armfly-v5/template.ewp create mode 100644 bsp/stm32/stm32f407-armfly-v5/template.eww create mode 100644 bsp/stm32/stm32f407-armfly-v5/template.uvopt create mode 100644 bsp/stm32/stm32f407-armfly-v5/template.uvoptx create mode 100644 bsp/stm32/stm32f407-armfly-v5/template.uvproj create mode 100644 bsp/stm32/stm32f407-armfly-v5/template.uvprojx diff --git a/bsp/stm32/stm32f407-armfly-v5/.config b/bsp/stm32/stm32f407-armfly-v5/.config new file mode 100644 index 0000000000..13a4d62a3a --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/.config @@ -0,0 +1,351 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# 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_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_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG 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_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# 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 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD 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 + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT 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_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_WIZNET 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_IOTKIT is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set + +# +# miscellaneous 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_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB 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 + +# +# 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 +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F407ZG=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f407-armfly-v5/.gitignore b/bsp/stm32/stm32f407-armfly-v5/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32f407-armfly-v5/Kconfig b/bsp/stm32/stm32f407-armfly-v5/Kconfig new file mode 100644 index 0000000000..8cbc7b71a8 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32f407-armfly-v5/README.md b/bsp/stm32/stm32f407-armfly-v5/README.md new file mode 100644 index 0000000000..4f2f74f36b --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/README.md @@ -0,0 +1,125 @@ +# STM32F429 armfly-v5 开发板 BSP 说明 + +## 简介 + +本文档为 STM32F429 armfly-v5 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +armfly-v5 STM32F407 是安富莱推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 168Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32F407 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.png) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32F407IGT6,主频 168MHz,1024KB FLASH ,196KB RAM +- 外部 RAM:IS61WV102416BLL-10TL(SRAM,20MB,16bit) +- 外部 FLASH:W25Q64BVSSIG(SPI,8MB)、HY27UF081G2A(NAND,128MB) +- 常用外设 + - LED:4个, LED1 - LED4 + - 按键:4个,k1(PI8),K2(PC13),k3(PI11),五向摇杆 +- 常用接口:USB 转串口、SD 卡接口、以太网接口、LCD 接口 +- 调试接口,SWD + +开发板更多详细信息请参考【安富莱】 [STM32 v5开发板介绍](http://www.armbbs.cn/forum.php?mod=viewthread&tid=1285)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| USB 转串口 | 支持 | UART1/2 | +| SPI Flash | 支持 | W25Q64BVSSIG 8M FLASH SPI3 | +| MPU6050 | 支持 | 软件 I2C2 | +| SD卡 | 支持 | | +| CAN | 暂不支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PK15 ---> PIN: 0, 1...176 | +| UART | 支持 | UART1 | +| SPI | 支持 | SPI3 | +| I2C | 支持 | 软件 I2C2 | +| ADC | 支持 | | +| RTC | 支持 | 支持外部晶振和内部低速时钟 | +| WDT | 支持 | | +| FLASH | 支持 | 已适配 [FAL](https://github.com/RT-Thread-packages/fal) | +| SDIO | 支持 | | +| PWM | 支持 | | +| USB Device | 暂不支持 | 即将支持 | +| USB Host | 暂不支持 | 即将支持 | +| **扩展模块** | **支持情况** | **备注** | +| ad7606 | 暂不支持 | | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 STLink 仿真器下载程序,在通过 STLink 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,【这里写开发板运行起来之后的现象,如:LED 闪烁等】。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.2 build Jul 13 2020 + 2006 - 2019 Copyright by rt-thread team +msh > +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口1 的功能,如果需使用 SD 卡、Flash 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 暂无 + +## 联系人信息 + +维护人: + +- [Dozingfiretruck](https://gitee.com/Dozingfiretruck), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32f407-armfly-v5/SConscript b/bsp/stm32/stm32f407-armfly-v5/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/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/stm32/stm32f407-armfly-v5/SConstruct b/bsp/stm32/stm32f407-armfly-v5/SConstruct new file mode 100644 index 0000000000..945cb55a52 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/SConstruct @@ -0,0 +1,60 @@ +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) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = 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 == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +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) + +stm32_library = 'STM32F4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32f407-armfly-v5/applications/SConscript b/bsp/stm32/stm32f407-armfly-v5/applications/SConscript new file mode 100644 index 0000000000..6f66f7ab73 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/applications/SConscript @@ -0,0 +1,12 @@ +import rtconfig +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd, str(Dir('#'))] +src = Split(""" +main.c +""") + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32f407-armfly-v5/applications/main.c b/bsp/stm32/stm32f407-armfly-v5/applications/main.c new file mode 100644 index 0000000000..297573866c --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-13 Dozingfiretruck first version + */ + +#include +#include +#include + +/* defined the LED4 pin: PC2 */ +#define LED0_PIN GET_PIN(C, 2) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..4638fb8888 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/.mxproject @@ -0,0 +1,19 @@ +[PreviousGenFiles] +HeaderPath=C:/Users/qq147/Desktop/rt-thread/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc +HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h; +SourcePath=C:/Users/qq147/Desktop/rt-thread/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src +SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rng.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rng.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; + +[PreviousUsedIarFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;..\\Src/system_stm32f4xx.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;..\\Src/system_stm32f4xx.c;..\Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;; +HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32F407xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;..\\Src/system_stm32f4xx.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;..\Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;..\\Src/system_stm32f4xx.c;..\Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;; +HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32F407xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..0777302023 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,234 @@ +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-3\#ChannelRegularConversion=ADC_CHANNEL_9 +ADC1.IPParameters=Rank-3\#ChannelRegularConversion,master,Channel-3\#ChannelRegularConversion,SamplingTime-3\#ChannelRegularConversion,NbrOfConversionFlag +ADC1.NbrOfConversionFlag=1 +ADC1.Rank-3\#ChannelRegularConversion=1 +ADC1.SamplingTime-3\#ChannelRegularConversion=ADC_SAMPLETIME_3CYCLES +ADC1.master=1 +File.Version=6 +GPIO.groupedBy=Group By Peripherals +I2S2.ErrorAudioFreq=-0.27 % +I2S2.FullDuplexMode=I2S_FULLDUPLEXMODE_ENABLE +I2S2.IPParameters=Instance,VirtualMode,FullDuplexMode,RealAudioFreq,ErrorAudioFreq +I2S2.Instance=SPI$Index +I2S2.RealAudioFreq=7.978 KHz +I2S2.VirtualMode=I2S_MODE_MASTER +KeepUserPlacement=false +Mcu.Family=STM32F4 +Mcu.IP0=ADC1 +Mcu.IP1=I2S2 +Mcu.IP10=TIM10 +Mcu.IP11=TIM11 +Mcu.IP12=TIM13 +Mcu.IP13=TIM14 +Mcu.IP14=USART1 +Mcu.IP15=USART2 +Mcu.IP2=IWDG +Mcu.IP3=NVIC +Mcu.IP4=RCC +Mcu.IP5=RNG +Mcu.IP6=RTC +Mcu.IP7=SDIO +Mcu.IP8=SPI3 +Mcu.IP9=SYS +Mcu.IPNb=16 +Mcu.Name=STM32F407I(E-G)Tx +Mcu.Package=LQFP176 +Mcu.Pin0=PC14-OSC32_IN +Mcu.Pin1=PC15-OSC32_OUT +Mcu.Pin10=PB15 +Mcu.Pin11=PC6 +Mcu.Pin12=PC8 +Mcu.Pin13=PC9 +Mcu.Pin14=PA9 +Mcu.Pin15=PA10 +Mcu.Pin16=PA13 +Mcu.Pin17=PI2 +Mcu.Pin18=PA14 +Mcu.Pin19=PC10 +Mcu.Pin2=PF6 +Mcu.Pin20=PC11 +Mcu.Pin21=PC12 +Mcu.Pin22=PD2 +Mcu.Pin23=PB3 +Mcu.Pin24=PB4 +Mcu.Pin25=PB5 +Mcu.Pin26=VP_IWDG_VS_IWDG +Mcu.Pin27=VP_RNG_VS_RNG +Mcu.Pin28=VP_RTC_VS_RTC_Activate +Mcu.Pin29=VP_SYS_VS_Systick +Mcu.Pin3=PH0-OSC_IN +Mcu.Pin30=VP_TIM10_VS_ClockSourceINT +Mcu.Pin31=VP_TIM11_VS_ClockSourceINT +Mcu.Pin32=VP_TIM13_VS_ClockSourceINT +Mcu.Pin33=VP_TIM14_VS_ClockSourceINT +Mcu.Pin4=PH1-OSC_OUT +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PB1 +Mcu.Pin8=PB12 +Mcu.Pin9=PB13 +Mcu.PinsNb=34 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F407IGTx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PB1.Signal=ADCx_IN9 +PB12.Mode=Full_Duplex_Master +PB12.Signal=I2S2_WS +PB13.Locked=true +PB13.Mode=Full_Duplex_Master +PB13.Signal=I2S2_CK +PB15.Mode=Full_Duplex_Master +PB15.Signal=I2S2_SD +PB3.Mode=Full_Duplex_Master +PB3.Signal=SPI3_SCK +PB4.Mode=Full_Duplex_Master +PB4.Signal=SPI3_MISO +PB5.Mode=Full_Duplex_Master +PB5.Signal=SPI3_MOSI +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDIO_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDIO_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDIO_CK +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC6.Mode=Master_Clock_Activated +PC6.Signal=I2S2_MCK +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDIO_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDIO_D1 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDIO_CMD +PF6.Signal=S_TIM10_CH1 +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PI2.Locked=true +PI2.Mode=Full_Duplex_Master +PI2.Signal=I2S2_ext_SD +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F407IGTx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.25.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5.27 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_I2S2_Init-I2S2-false-HAL-true,6-MX_IWDG_Init-IWDG-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true,8-MX_SDIO_SD_Init-SDIO-false-HAL-true,9-MX_SPI3_Init-SPI3-false-HAL-true,10-MX_TIM10_Init-TIM10-false-HAL-true,11-MX_TIM11_Init-TIM11-false-HAL-true,12-MX_TIM13_Init-TIM13-false-HAL-true,13-MX_TIM14_Init-TIM14-false-HAL-true,14-MX_RNG_Init-RNG-false-HAL-true,15-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.48MHZClocksFreq_Value=48000000 +RCC.AHBFreq_Value=168000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV4 +RCC.APB1Freq_Value=42000000 +RCC.APB1TimFreq_Value=84000000 +RCC.APB2CLKDivider=RCC_HCLK_DIV2 +RCC.APB2Freq_Value=84000000 +RCC.APB2TimFreq_Value=168000000 +RCC.CortexFreq_Value=168000000 +RCC.EthernetFreq_Value=168000000 +RCC.FCLKCortexFreq_Value=168000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=168000000 +RCC.HSE_VALUE=25000000 +RCC.HSI_VALUE=16000000 +RCC.I2SClocksFreq_Value=96000000 +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=168000000 +RCC.PLLCLKFreq_Value=168000000 +RCC.PLLM=25 +RCC.PLLN=336 +RCC.PLLQ=7 +RCC.PLLQCLKFreq_Value=48000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE +RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 +RCC.RTCHSEDivFreq_Value=12500000 +RCC.SYSCLKFreq_VALUE=168000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.VCOI2SOutputFreq_Value=192000000 +RCC.VCOInputFreq_Value=1000000 +RCC.VCOOutputFreq_Value=336000000 +RCC.VcooutputI2S=96000000 +SH.ADCx_IN9.0=ADC1_IN9,IN9 +SH.ADCx_IN9.ConfNb=1 +SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1 +SH.S_TIM10_CH1.ConfNb=1 +SPI3.CalculateBaudRate=21.0 MBits/s +SPI3.Direction=SPI_DIRECTION_2LINES +SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI3.Mode=SPI_MODE_MASTER +SPI3.VirtualType=VM_MASTER +TIM10.Channel=TIM_CHANNEL_1 +TIM10.IPParameters=Channel +USART1.IPParameters=VirtualMode +USART1.VirtualMode=VM_ASYNC +USART2.IPParameters=VirtualMode +USART2.VirtualMode=VM_ASYNC +VP_IWDG_VS_IWDG.Mode=IWDG_Activate +VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT +VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT +VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT +VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT +board=custom diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..71f8e09516 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,73 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000000..9638f92d62 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,443 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + #define HAL_ADC_MODULE_ENABLED +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +#define HAL_I2S_MODULE_ENABLED +#define HAL_IWDG_MODULE_ENABLED +/* #define HAL_LTDC_MODULE_ENABLED */ +#define HAL_RNG_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED +/* #define HAL_MMC_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_it.h b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_it.h new file mode 100644 index 0000000000..ab2ae38f21 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -0,0 +1,69 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..b2659cd456 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/main.c @@ -0,0 +1,708 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +ADC_HandleTypeDef hadc1; + +I2S_HandleTypeDef hi2s2; + +IWDG_HandleTypeDef hiwdg; + +RNG_HandleTypeDef hrng; + +RTC_HandleTypeDef hrtc; + +SD_HandleTypeDef hsd; + +SPI_HandleTypeDef hspi3; + +TIM_HandleTypeDef htim10; +TIM_HandleTypeDef htim11; +TIM_HandleTypeDef htim13; +TIM_HandleTypeDef htim14; + +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_ADC1_Init(void); +static void MX_I2S2_Init(void); +static void MX_IWDG_Init(void); +static void MX_RTC_Init(void); +static void MX_SDIO_SD_Init(void); +static void MX_SPI3_Init(void); +static void MX_TIM10_Init(void); +static void MX_TIM11_Init(void); +static void MX_TIM13_Init(void); +static void MX_TIM14_Init(void); +static void MX_RNG_Init(void); +static void MX_USART2_UART_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + MX_ADC1_Init(); + MX_I2S2_Init(); + MX_IWDG_Init(); + MX_RTC_Init(); + MX_SDIO_SD_Init(); + MX_SPI3_Init(); + MX_TIM10_Init(); + MX_TIM11_Init(); + MX_TIM13_Init(); + MX_TIM14_Init(); + MX_RNG_Init(); + MX_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 25; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S|RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.PLLI2S.PLLI2SN = 192; + PeriphClkInitStruct.PLLI2S.PLLI2SR = 2; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief ADC1 Initialization Function + * @param None + * @retval None + */ +static void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.ScanConvMode = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. + */ + sConfig.Channel = ADC_CHANNEL_9; + sConfig.Rank = 1; + sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} + +/** + * @brief I2S2 Initialization Function + * @param None + * @retval None + */ +static void MX_I2S2_Init(void) +{ + + /* USER CODE BEGIN I2S2_Init 0 */ + + /* USER CODE END I2S2_Init 0 */ + + /* USER CODE BEGIN I2S2_Init 1 */ + + /* USER CODE END I2S2_Init 1 */ + hi2s2.Instance = SPI2; + hi2s2.Init.Mode = I2S_MODE_MASTER_TX; + hi2s2.Init.Standard = I2S_STANDARD_PHILIPS; + hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B; + hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE; + hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_8K; + hi2s2.Init.CPOL = I2S_CPOL_LOW; + hi2s2.Init.ClockSource = I2S_CLOCK_PLL; + hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE; + if (HAL_I2S_Init(&hi2s2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2S2_Init 2 */ + + /* USER CODE END I2S2_Init 2 */ + +} + +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) +{ + + /* USER CODE BEGIN IWDG_Init 0 */ + + /* USER CODE END IWDG_Init 0 */ + + /* USER CODE BEGIN IWDG_Init 1 */ + + /* USER CODE END IWDG_Init 1 */ + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_4; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN IWDG_Init 2 */ + + /* USER CODE END IWDG_Init 2 */ + +} + +/** + * @brief RNG Initialization Function + * @param None + * @retval None + */ +static void MX_RNG_Init(void) +{ + + /* USER CODE BEGIN RNG_Init 0 */ + + /* USER CODE END RNG_Init 0 */ + + /* USER CODE BEGIN RNG_Init 1 */ + + /* USER CODE END RNG_Init 1 */ + hrng.Instance = RNG; + if (HAL_RNG_Init(&hrng) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RNG_Init 2 */ + + /* USER CODE END RNG_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_Init 2 */ + +} + +/** + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + +} + +/** + * @brief TIM10 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM10_Init(void) +{ + + /* USER CODE BEGIN TIM10_Init 0 */ + + /* USER CODE END TIM10_Init 0 */ + + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM10_Init 1 */ + + /* USER CODE END TIM10_Init 1 */ + htim10.Instance = TIM10; + htim10.Init.Prescaler = 0; + htim10.Init.CounterMode = TIM_COUNTERMODE_UP; + htim10.Init.Period = 0; + htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim10) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim10) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM10_Init 2 */ + + /* USER CODE END TIM10_Init 2 */ + HAL_TIM_MspPostInit(&htim10); + +} + +/** + * @brief TIM11 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM11_Init(void) +{ + + /* USER CODE BEGIN TIM11_Init 0 */ + + /* USER CODE END TIM11_Init 0 */ + + /* USER CODE BEGIN TIM11_Init 1 */ + + /* USER CODE END TIM11_Init 1 */ + htim11.Instance = TIM11; + htim11.Init.Prescaler = 0; + htim11.Init.CounterMode = TIM_COUNTERMODE_UP; + htim11.Init.Period = 0; + htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim11.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim11) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM11_Init 2 */ + + /* USER CODE END TIM11_Init 2 */ + +} + +/** + * @brief TIM13 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM13_Init(void) +{ + + /* USER CODE BEGIN TIM13_Init 0 */ + + /* USER CODE END TIM13_Init 0 */ + + /* USER CODE BEGIN TIM13_Init 1 */ + + /* USER CODE END TIM13_Init 1 */ + htim13.Instance = TIM13; + htim13.Init.Prescaler = 0; + htim13.Init.CounterMode = TIM_COUNTERMODE_UP; + htim13.Init.Period = 0; + htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim13) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM13_Init 2 */ + + /* USER CODE END TIM13_Init 2 */ + +} + +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 0; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 0; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000000..ab8078f4b0 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,721 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief ADC MSP Initialization +* This function configures the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_ADC1_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PB1 ------> ADC1_IN9 + */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } + +} + +/** +* @brief ADC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) +{ + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC1_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PB1 ------> ADC1_IN9 + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_1); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + +} + +/** +* @brief I2S MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2s: I2S handle pointer +* @retval None +*/ +void HAL_I2S_MspInit(I2S_HandleTypeDef* hi2s) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hi2s->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + /**I2S2 GPIO Configuration + PB12 ------> I2S2_WS + PB13 ------> I2S2_CK + PB15 ------> I2S2_SD + PC6 ------> I2S2_MCK + PI2 ------> I2S2_ext_SD + */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF6_I2S2ext; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + +} + +/** +* @brief I2S MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2s: I2S handle pointer +* @retval None +*/ +void HAL_I2S_MspDeInit(I2S_HandleTypeDef* hi2s) +{ + if(hi2s->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**I2S2 GPIO Configuration + PB12 ------> I2S2_WS + PB13 ------> I2S2_CK + PB15 ------> I2S2_SD + PC6 ------> I2S2_MCK + PI2 ------> I2S2_ext_SD + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOI, GPIO_PIN_2); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + +} + +/** +* @brief RNG MSP Initialization +* This function configures the hardware resources used in this example +* @param hrng: RNG handle pointer +* @retval None +*/ +void HAL_RNG_MspInit(RNG_HandleTypeDef* hrng) +{ + if(hrng->Instance==RNG) + { + /* USER CODE BEGIN RNG_MspInit 0 */ + + /* USER CODE END RNG_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RNG_CLK_ENABLE(); + /* USER CODE BEGIN RNG_MspInit 1 */ + + /* USER CODE END RNG_MspInit 1 */ + } + +} + +/** +* @brief RNG MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrng: RNG handle pointer +* @retval None +*/ +void HAL_RNG_MspDeInit(RNG_HandleTypeDef* hrng) +{ + if(hrng->Instance==RNG) + { + /* USER CODE BEGIN RNG_MspDeInit 0 */ + + /* USER CODE END RNG_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RNG_CLK_DISABLE(); + /* USER CODE BEGIN RNG_MspDeInit 1 */ + + /* USER CODE END RNG_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PB3 ------> SPI3_SCK + PB4 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PB3 ------> SPI3_SCK + PB4 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM10) + { + /* USER CODE BEGIN TIM10_MspInit 0 */ + + /* USER CODE END TIM10_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM10_CLK_ENABLE(); + /* USER CODE BEGIN TIM10_MspInit 1 */ + + /* USER CODE END TIM10_MspInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspInit 0 */ + + /* USER CODE END TIM11_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + /* USER CODE BEGIN TIM11_MspInit 1 */ + + /* USER CODE END TIM11_MspInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspInit 0 */ + + /* USER CODE END TIM13_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + /* USER CODE BEGIN TIM13_MspInit 1 */ + + /* USER CODE END TIM13_MspInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM10) + { + /* USER CODE BEGIN TIM10_MspPostInit 0 */ + + /* USER CODE END TIM10_MspPostInit 0 */ + + __HAL_RCC_GPIOF_CLK_ENABLE(); + /**TIM10 GPIO Configuration + PF6 ------> TIM10_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF3_TIM10; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM10_MspPostInit 1 */ + + /* USER CODE END TIM10_MspPostInit 1 */ + } + +} +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM10) + { + /* USER CODE BEGIN TIM10_MspDeInit 0 */ + + /* USER CODE END TIM10_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM10_CLK_DISABLE(); + /* USER CODE BEGIN TIM10_MspDeInit 1 */ + + /* USER CODE END TIM10_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspDeInit 0 */ + + /* USER CODE END TIM11_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM11_CLK_DISABLE(); + /* USER CODE BEGIN TIM11_MspDeInit 1 */ + + /* USER CODE END TIM11_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspDeInit 0 */ + + /* USER CODE END TIM13_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM13_CLK_DISABLE(); + /* USER CODE BEGIN TIM13_MspDeInit 1 */ + + /* USER CODE END TIM13_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_it.c b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_it.c new file mode 100644 index 0000000000..84413fb5f2 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -0,0 +1,203 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/system_stm32f4xx.c b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/system_stm32f4xx.c new file mode 100644 index 0000000000..bcb2b9f4a5 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/CubeMX_Config/Src/system_stm32f4xx.c @@ -0,0 +1,727 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/Kconfig b/bsp/stm32/stm32f407-armfly-v5/board/Kconfig new file mode 100644 index 0000000000..7c6b8a97f0 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/Kconfig @@ -0,0 +1,199 @@ +menu "Hardware Drivers Config" + +config SOC_STM32F407IG + bool + select SOC_SERIES_STM32F4 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_RS232_TO_USART + bool "Enable RS232 TO USART (uart1)" + select BSP_USING_UART + select BSP_USING_UART1 + default y + + config BSP_USING_SPI_FLASH + bool "Enable SPI FLASH (W25Q64 spi3)" + select BSP_USING_SPI + select BSP_USING_SPI3 + select RT_USING_SFUD + select RT_SFUD_USING_SFDP + default n + + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + + config BSP_USING_MPU6050 + bool "Enable MPU6050(i2c2)" + select BSP_USING_I2C2 + select PKG_USING_SENSORS_DRIVERS + select PKG_USING_MPU6XXX + select PKG_USING_MPU6XXX_SAMPLE + select PKG_USING_MPU6XXX_LATEST_VERSION + default n + +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_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default y + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + endif + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI3 + bool "Enable SPI3 BUS" + default n + + config BSP_SPI3_TX_USING_DMA + bool "Enable SPI3 TX DMA" + depends on BSP_USING_SPI3 + default n + + config BSP_SPI3_RX_USING_DMA + bool "Enable SPI3 RX DMA" + depends on BSP_USING_SPI3 + select BSP_SPI3_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C2 + bool "Enable I2C2 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C2 + comment "Notice: PH4 --> 116; PH5 --> 117" + config BSP_I2C2_SCL_PIN + int "i2c2 scl pin number" + range 1 143 + default 116 + config BSP_I2C2_SDA_PIN + int "I2C2 sda pin number" + range 1 143 + default 117 + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM13 + bool "Enable TIM13" + default n + + config BSP_USING_TIM14 + bool "Enable TIM14" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM10 + bool "Enable timer10 output pwm" + default n + if BSP_USING_PWM10 + config BSP_USING_PWM10_CH1 + bool "Enable PWM10 channel1" + default n + endif + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + select RT_USING_LIBC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + 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 + + source "../libraries/HAL_Drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32f407-armfly-v5/board/SConscript b/bsp/stm32/stm32f407-armfly-v5/board/SConscript new file mode 100644 index 0000000000..2528db7cee --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/SConscript @@ -0,0 +1,44 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32f4xx_hal_msp.c +''') + +if GetDepend(['BSP_USING_SPI_FLASH']): + src += Glob('ports/spi_flash_init.c') + +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s'] + +# STM32F405xx) || STM32F415xx) || STM32F407xx) || STM32F417xx) +# STM32F427xx) || STM32F437xx) || STM32F429xx) || STM32F439xx) +# STM32F401xC) || STM32F401xE) || STM32F410Tx) || STM32F410Cx) +# STM32F410Rx) || STM32F411xE) || STM32F446xx) || STM32F469xx) +# STM32F479xx) || STM32F412Cx) || STM32F412Rx) || STM32F412Vx) +# STM32F412Zx) || STM32F413xx) || STM32F423xx) +# You can select chips from the list above +CPPDEFINES = ['STM32F407xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32f407-armfly-v5/board/board.c b/bsp/stm32/stm32f407-armfly-v5/board/board.c new file mode 100644 index 0000000000..e64882e5e1 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/board.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-13 Dozingfiretruck first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 25; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S|RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.PLLI2S.PLLI2SN = 192; + PeriphClkInitStruct.PLLI2S.PLLI2SR = 2; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32f407-armfly-v5/board/board.h b/bsp/stm32/stm32f407-armfly-v5/board/board.h new file mode 100644 index 0000000000..68016d18bd --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-13 Dozingfiretruck first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (1024 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM_SIZE 128 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.icf b/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.icf new file mode 100644 index 0000000000..067691151f --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###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__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.lds b/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.lds new file mode 100644 index 0000000000..00a1f08cf1 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.lds @@ -0,0 +1,157 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128KB sram */ +} +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 = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 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 = .; + } > ROM + __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*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __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) + } > RAM + __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/stm32/stm32f407-armfly-v5/board/linker_scripts/link.sct b/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.sct new file mode 100644 index 0000000000..0d7c47992d --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** 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 + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h b/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h new file mode 100644 index 0000000000..20bcf9e11a --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-13 Dozingfiretruck first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + +#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024) +#define FLASH_SIZE_GRANULARITY_64K (64 * 1024) +#define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024) + +#define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS +#define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K) +#define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K) + +extern const struct fal_flash_dev stm32_onchip_flash_16k; +extern const struct fal_flash_dev stm32_onchip_flash_64k; +extern const struct fal_flash_dev stm32_onchip_flash_128k; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &stm32_onchip_flash_16k, \ + &stm32_onchip_flash_64k, \ + &stm32_onchip_flash_128k, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WROD, "bootloader", "onchip_flash_16k", 0 , FLASH_SIZE_GRANULARITY_16K , 0}, \ + {FAL_PART_MAGIC_WROD, "param", "onchip_flash_64k", 0 , FLASH_SIZE_GRANULARITY_64K , 0}, \ + {FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", 0 , FLASH_SIZE_GRANULARITY_128K, 0}, \ +} + +#endif /* FAL_PART_HAS_TABLE_CFG */ +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c b/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c new file mode 100644 index 0000000000..5eead223c3 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-13 Dozingfiretruck first version + */ + +#include + +#ifdef BSP_USING_SDCARD + +#include +#include +#include + +#define DBG_TAG "app.card" +#define DBG_LVL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int stm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 1024, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(stm32_sdcard_mount); + +#endif /* BSP_USING_SDCARD */ + diff --git a/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c b/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c new file mode 100644 index 0000000000..9aa8f95c13 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-13 Dozingfiretruck first version + */ + +#include +#include "spi_flash.h" +#include "spi_flash_sfud.h" +#include "drv_spi.h" + +#if defined(BSP_USING_SPI_FLASH) +static int rt_hw_spi_flash_init(void) +{ + __HAL_RCC_GPIOF_CLK_ENABLE(); + rt_hw_spi_device_attach("spi3", "spi30", GPIOF, GPIO_PIN_8); + + if (RT_NULL == rt_sfud_flash_probe("W25Q64", "spi30")) + { + return -RT_ERROR; + }; + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); +#endif + diff --git a/bsp/stm32/stm32f407-armfly-v5/figures/board.png b/bsp/stm32/stm32f407-armfly-v5/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..94de91c01206c957bbc2607b86579fb7d1508a41 GIT binary patch literal 404490 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

rH}o1G4I0SL z&Ltm@j9Z-)Owg`EVQnGF?{WassY~VbtB>`3M|K4wog-QE7x-PeQF|}jHEg$dL=vAe z<40Du$L6|fw5XqstXA$SU{W!s91riii~9Ce%&o4Zu1!KiV+#s%^YMv~J&90Yn09PF zb#nx_>)PR^e!tb!XgMH};>W~f6c6uRi{7?Y8@{h^AH?aJW~x0uJTp=BwAJA^KlO~w z&HmuPA@p@OBR4MtdHK2IhY+2*VcM`l6jv@mUE3g1ec3V;talWJd44*6`DkmJ#1MIC zN`V&AT_Xm`><_k*t*1p#8^$M}d=6bV>4@FBh`V-gMi%w>OK)F5OJ@|5Y2>Fwgn*BB zY??AKMZL-UlQb>L#ePh%k65NA{m9m*(jlclI*tS7IY0+<{en#V^_RbdkC`H#MsjKa@(UKSjs<*~2H@+L`}ieY$RXmT z(%2qGbTS#`Wpn5;3{oiM{Um6(=;@{T(A(cn0pO)cneg~?^ntq3heQ~7@cxJJi7!3_ zf5{|%_VzdMc!+&|Eh`&rOUKVrMFAx$`VV=h**LEQ&Tc%0j~gEDZM9%1ScE!h7NZ0`cRDz1C7-{T3M;ST^jiroJ z=zWsu2};6YMal?%C|F9zV0(+Qe6geEll0TWYinzxkPn#x){ux-!-)|^f_(6^eHuQ| zJf?w>5i0*7i>l%AD z3sS^lcBn+k(Z_nuU%CQWxinVU#pvl9MgPDs+nR!}{HH&_{CP!q`k8xdZpm`%?1VLv6gsLbh2OCQ^JdEf-T-ejJqu|0R`64r0tK*N}ChHPMT z2uY;lJIBuAmDdjA@|6ZQ)N4trJ<1uza^Ng+xDnQ*jI^1LFMU?tU3vlxCv=!tOfyyxZQIRoK zL+zQO-WV}3q@6Yt&6b`NAQIo^WM@-fX~BnbwmA-%^pxo27+9yBIxpsv?s0yXj&mZs z;#WCoPLz(kVtlQP@s6yk1LT;PoUlH6sjdk+3I^c#EN2U}e|o-wDArZw8%f32cW5r> zP@r2fXL7*vdiStC+GR(2Pf;Yho|RC9+nwgIECqUowolaXvF7Kg4Z2Q1Ptnp~P{X2e z^7)YUyZUlsB4B#SfHC`MR`-i;nwMw5l;>5Bz4#{%5^reHjO1I%tEKNGuZpaekWaJo z3(z+-f}zo26qn>-#li)cUs(<}Ww)lY3p+Ni#iu{|3^uP`jjVJ6FEUG2SqX~rbMVz~ z{sVz1`_(&zd2`E;lPU%bIiNTdE7vOtAKA>3X+0n!a> z!WcgO$!AbeR)LG>ZenyiME;B5W1n~o58eGRGP28Ym7sElJmztSv2I}&p53(sk8YTY zRpnI}9O$D{Jb@%P`&!uvlI8rTuv8ZvPc3wbBPYj=PyG5vasJ#@G&OXhs-gfnnPGTc z1(+BPu>P6G^KyVB3sl%hp}sYfp(!PL$)O;50^CV7-0CC1jZiVICeudwVagUB8X-V1$4r%K;W@3jfLB&CbcBQcA_un`bG^ z6#i*?wF%`#QucT?*%^Y7a8FSfEovbK;Qxv?31DfFgObEjXCNoP5^jICMa-(pN|6+w zAmE_~$@?^q!^O{z64Lw*4YkfH8!Ba%D&Hqswr0A5qRjj8vDYBqFcRMNg zp-EmNG6^$KdC;`maL3}si?D3@QZzL;A~P$U0NagZKG)`usVpjGDL|zGh>(r~k4gk9 zKozEfQ?xG{7ewZ@0uky53YMZEHUvl^nH(F&APq*<{AJLVrBNE&mfJN#*QB%h;|^$~ z($@V_)M}5;>zM5?$Cy&_=_LPCR6y_4zhr0@CnG>3m7SfB;=)oCl$4@vaL9~yA|{}t z#KqbkDha>)`@e|`m(F6t=52WEtpn)lA0^FukVbD*UUG&%&A_SXtR72JDiVHD&O@aD z&^A+AA+E^4bQ*asJ)QhCiO>D|M@WY$T)B1w=P%bHN*>JQZ`9Uo7kik-N$*lZro3qw zL@)J;_*3oFcbmj5Vz@{IMb`*G5*h|4c+xZnr6)klB!+GIx2>cp1x!Oq%!1>e$uE@iR`_yCP@d7k<58&MO z7SuL(Vcz`3C@spyo{jVA{ioo-o3Em+vEFu+S+;x~zVPpV8#f#3@!x**j_pMoq3kBj zL{XaO$FDtkA8uZ~jORZ5A!OvH;LSJB;pEvm)HgRHH`hnQn2&5l`Gl`Dg1?1=D(Af-7p1OIDJbdx)KY={Giw63vV-|Sm zyDior&7Ggrel3{cC-RE!(Y2By0R;go0T?A}S3hc4RC{7a*-t(K+s&Kz;0BH8L@17N z@S= zo`4U_qK*i&|J7dQyp&8Sk}N(EP!mOz$Il{syxv)@OWH~28;=VX>6!drJVjpS<@`vA zmF$Rdr8C(FwwOx}5wFz_EYiEWPbps{IkEyOH!u;jNSsY|pgu_^c+jE@&6N|d6Y#SU zA<{;D>m}c-?*z&;dZM=J!2+QI#d^28^JV1WyTd0=J!j{GI)|=cUF>)DE6ZWu%Tb6$ zWK&pE{^q4KDaXj4nTam#;53;aSkJ@arIpyabqO}ET8^>)FluX>5K2kM4`2Bq?tb8I zJoCsCIQa70=xb?1^`d#Gsk=r1)r0)1y`90*xutmco_lfSVgqI3HoAl3n23eU_HA0V0_P9BM~{0FTkhJ3rE8Yb+3iF# z9Tx4>QBahJf~+Y#dG8wA2RLamj=`ZZIwe80jJk2TbrjPCk^+4xGeN9aRF3V-R->`& z20>>nDoZwypZZW*Jcc!_e{w7rt;7UK&B5`rwV=kbh@Rv{_AQA*Azd_`JcW1)bv6G| zY#|DDUXq+9@pBwmo*8`UvmeKIzx7`UND9_xfRcZM{Yi+KyyV*cC>cFiyI@k^YtWs2TZGQvsY2u8*v8R+Ql!HpY@sJUE^ zPJ%uOqF4J%n!zN{q991ANZBZ=FibCXW+oNxR864PkeEEmDcko^lah0?GLeyyP7i<7 zfRBrYQ`cz@isoa?W;(Z&4fF)k{OOiEC^tKcKrNx*8Sint(|;7$J9UupRT;BoYKT$K zj%so~8BmNT6(c38;W6{;2?k;qUuKwLqkOyjEg zkCUU$1Y0Q>y{mrw-%)l{sJd6Q6_D4^uKL&kZO9+V+IjE5h-myejHr#iw)`tbe-=h+rF-hAs_w6qLR$qV<$@OZ6XZGI-7 zYjb)?R@o0_jL%3TK&Rmkj1M9}`UyFpQ>^p|Y4qju%j^|VdGZXyI3wWOsg%&E7v*5sDfqUI^=Xzbochy#Mp@kCy zsp1*Y(jo=?RmQ{&3olhl1z|E5+n}gL3IV@mWpgcPbi>nGzobAEn zcpsV?uhGc$(Z;*j*Gg#2`mjs^QoCPGWBIlx?Vb8)`y+cOE1@=<+|u}pW*M0|^xn%* zoSQ|urJ#v&-qO*HotsxrcM-8E`~cNA2l~_A}22worB#7MdhRkgij+n z8L<7H3kvh`>KpIizrSz-$Ijlyz$ihhKg;sd_4SRSqiqa<@HESEkxt}Gi|A_QX^_UR z9Agt9oWF1rTi35Q9-g6*iqSC(jB6r%HTnj6tp5zSldfu?j@iD{clC+B3h-%8nskaH zUwRi0STFKT-vtUpFZGM~M4%))I|nZEsz90M=Sop%2&}Wa8S@vGptvXvgZ(3X2K$z^ zAElm1)&~08XIFf|dQY*h01$1FA;$HJM6{hN>@m)7=YB}R1nG%AgZ%x z>^HlE_o=0v45lw1x7U*qeU=^cuFU#9}|3z z+N*cfOOC43$C?A{(j%>W^@l~+rDs$RmTxP?*)F{s4XNIgeoMer`({^E&q0YszyeXU zcMs7{rXrKJZ2h{GXs)kCYMelOJcP5S&tZIW1cikeNb_W)zh?p$Yc62kiW2O7a3?Z6okmw@FHRmghx$6rt(in3Dsk1^J(83{qKUK;8b!1e z)esOW;_o?WTR%cPzwQz#UNnWzRk?z-UBlV6c9x;MIpcH_H zD=fOh`=pGdAe?y}Q@k%mgE~Y(7f^GXLex-%<<4S35>7>a1Wu)R2_IN~62?Zy(capQ z-tImM<|GCO224pwxth}E-~IPLfQKG_m^5=?-u!Bwmy)8#H9UmQjsU4ZR=-XxTecia z7carmrAzs2FTtnscTL$MloX*gAr2lsf*FB5YbWb&Mvl+oNg66CY8f|y+c<)gqoh#; z>FzWFC4#U>$W|#UdP-6{;OdTNF6uhK$1ysZ6Dgk1aE}dr(5PsL!vRn;wkdp3)qHxc zD-k8VdOQ0KX!sNbjfU{(L-%6o@;TVLeFGYs8_^@05R6SFyD=G#Q@Id~SZ*yvDp@uk zr)OCT6n>YH6wS4(3)u{Ti2(#h2dPBDh=wOvCqjaF7-{4m`s_&YW+26rMR2VJLM(^< z=0v0QPezM$5?GLfz;+4&Yk`F+3Il}6%CPNa`$!3yg$3#P$W zy+udTC!u~I-^=$k!;)%c3lz$@iud#kDM*85YA4GTde+>+Bn=x*g|MtT6ALTzk>#Dj zNOvphYp)YXkCVm(4WyX>zW7Rf<{UEAykFJ->z}4C_+b$lWflV>+xy-?mV!g%RY2g?JKfBiAa=siszJ$!=hFEtQG$Gxj9&}U=CVu-@r2V z(SQ8n$8hz+X~dOkN%Qvj5EYjs`6R6qG^7H8o|G6K+P587&!40&39?)#3L6YMQ7-k9 z&RLRSzN_2RF6jy#>TBsF0Y6RiP+LPG0>Q~JvT~%OG?L*sq5^^Hdj||Df+zmv@6^e1 zR%fRhh!&!ybd`p`wZn;qfM>LUDs{l@yVXS`QX%{-PE*+qJ)QHqPyB5TBL5_Fb^)Iw zZd6-j6P!MZVW58y5jw_-?n&>6FMQOia&|S^p{T3$kl7i^i$JTQoEqv^$`wmN!#>es z2SrL}X{CDUaDXeTFB#+^5U4|Ko_*<ESvI6 zaO6@_;e0=x(G)CSv;_ItB{=Zz5t~=HWA|1(yl)?#eqcX}2pDrS^YH%rjbMqBimPd$Z$Z+#z+Klmu< zr{U7&I&=?oVT6wJinSY2RJi~rFI+Qj z24m4_j7JivABo}ZQ>QRU$9|gpYICfoDQoQM>8S{9O%#>IUfg%ra#WV*V{9-=J}2!( z^63y#W(3qjM#FsVQswefAJDd@<-p_3!ufMIZA-)ji_7W!Dq846URgc@!_)YOAH9Rt zff_7Zybh;N*5G?T`aX&m6k={swe{yO+wuQ5(APiMYo48wEB-$}rg7ocas2gv|0>>p z_b3{#b|E|=gQBfe98XJvD#?|pNuy__q@bD)p|E?D0<4IS?fb~@Lqjz1yjVgh0g|AW z6y?)+Ptl7`!w|jP6f#+Eel|f(8WqR6g?36xmr8&JLh~o&)us>($P`Pt zSZJP#M%u=PQ~0ju2)NnY9llS=L)SkkCYB|`ErVvBpn309JP83q4Ff51Mu10;dvs(} zK~J7{HtNn2nEFz7@Ultm5Q*69`M|sR?KxWQ_Ue7+V@B)lN#8pEGC#W@t30s9Z=a zBy3@X=GKrW6lWnJTxl8fQhfx9qy_s_E5|5m>|Z_0{7qBrHpI&&+in7Ex4@o^tH3V5 znSnN*;x`!+0Zu0kg-YXp{6Qd%)M9_jiO?Ra;!E-uU)CQ~nvw-Y!)@aE9bjT$lJANN z%D_oEs_tq9RV_l%Fv0mW@;z~^noC)s7u?oVkB;_sj8l21u>Z9nL~{-Gr~Xr|Wv=Xl zDy_!xu=enuWL8E@GGOyC)mAk|*W9VKyzOjy_BiWRvmCU?}OTHdIe>XCjqEP-+K~nEgTC zV&6zqNd~K1FvQ=ILU`cbtyr$~uj-3G3tfOO5F@BCw z#u8EWC#%W^i1!s46$Zz<|5;3HX?B#l&e zZMztp44R%&Vr&6jT|EoxX6M1F-LvKEd6I9RNM*_+Xp&#}YOF z)xffd!ZPIS+7@{1Q~^q@fE9YyGxZEzlX{0I|IvQ%(1_3|0h=P6TDTFSy`+{ zvN^7Dn$%w1qv*2^O-XRT-k^O~6hA~7D6#e|UmGp;Y#z=tRdeUN4!e%;Ix{O5Rxh2@ z^VmM=aM^>r;zG<@xR`n|4YwLPF+4nBZB$CG70VanLyzvp`gJQXJ~50r)pN0Z*AA3d zlp{YcA6G72MUpEW=PsVXx%0=YPKy_>#;b1}!0px!xbrfRlQoWi|AjB1?rIy3A3KL$ zwyUtD0F|XBn4leiJBD5YQ~bb|(zQ{A*%1es;UdDwgJdaPTqgSM*x2i`dipMM%pJ@p{szEV7Y@De7I(@1;i zB+W->|Iv=8@?1;n06%+?S6Pbd4XxJ^AdgCA1OW=_^b7^a8%J413C^CnNP#2L=Q$0Yc@y%O3tvhn6MdO>2&G&A5*2Gcg=OGQpFA`LA7C?zTHS&VPPZZtR&cAFcc3Q}2V zw+zSNOPNT>seH7$bTWYE<`&k2mFBhD+fqtXMpi52a&mI$kw?(i(@*6Up@N98y#$9I ztul36J}AxmQxxpkr=LS%St06L>TM3g_}C~Sbl0LZ;2MU}*pCgjkjC=Jm8M`;d1>fE z6YvE{ZL2j3g0tnC$CR9skSbEDA!)VOzyt5IXa(D(xrW88@6J7IapKew9C`mVz0GpO zVpCYUaz45`H7o)Ho>Hc2tnL@hG$f`zS7!?(${0!L@(PMAaubYDv9oTXPnd>1N|3dF z%}Oj^G6w^L{n);HJAUs!{AXnN%UA@BnGBCN%>hER7g|MX0El%Jf9V=0QpRhkY!!hL z4AO|ChOV+R2x8+w1V;LiJf+F&q@9Lq2q3i~xsqC^=asSyUPnV9ddfIz9;b{Ei)H;& z+25kAwySbLvq&Z0QAAigtNRi(KsHRuo8sgxs~_7c18jSF^1FD(A_!Extg5w3pupox zN0j_$^O#7(B=WJ^q^-NuDe6~6`;?tt;8rViwE|dum+w!-!m2zfs~C;pFuLjCPK<~2 zRDwtvK;EOeD~hhqdWISxqc#f)${vWfnIXRh`h9G4 zjJhI>Jr6&NYi<1q&`H(4x*h^xKAQCB4diS3bF5Pwp7;a;UG?Z|xXJV64}uz9D4CmG zKp@_eGpOFv^Jsgmt}=p(RLP+y`5eG6<|VPkxB6WUrhuP7tmH|neY11241nobn&YNE z)*NA_(ox&wM2ZID0Y08>3*BkABa6W>K_!j9Ml{mWHQM0tp_*o(kY(%n0$+|}B|dTh zn&dg5Rovu7$*P8UB}3hv9Zp?XeL)PQPgUMY&Shuz(^WhTZiOlg$M7x3zfOq1gR0!c1H31t7kB0X(}GN=TVgAm7tM4eD3@y zY~8lWMvQ82)MDk@1-N~?9rxY;EdJta-!>4bPSoDbNl6-=qCTL$Sg~}G*}2OXYuVT7 z76BHICZ*5@>I(@;3PU)+t~L(J}-s>E!^|EkeOGANdnFpg2b_S2=K-5%txQV=eF-x17pD?jH`za?|ro8L0LYZq-*HLdrs9x5XHO z6l|lelG4@rxRg1|2oeNob)$xBS+e~m#iNLnp2No3yb9G>9*(?gJ!5*>O|Neg9(nX3 zT)cb|qk(Z`<`$8R)0m(^8ygw5NTh(X63?a*uqJDbJnLYfO6}lRDe2ih7Vy;eKAQ6) zA=Y^*s0{Xl5<4s1%8*Sao;1)Xg=Y$|at`j=yAAmz>G=Nlet;84PqY412AZ!y`ab%| z!+7Vw0ZbBD7O_9H>AbB@CEawW9y+wlo{dI+Q7H|c-+*!`sEq&VHXr58*^5-zS+>$z zDK}QHT!f`7mg4y7lj!IgrUA?{`pJkW;wIoI;4Q!>BPPQj!yzD`ev#7G^$tDh{S$cD zP&EO$CzVEtypjk9SwGQ;Ww1_epC6g|#YiQu#iWe%JQuxS0<{zwYZXSLCnKdukK$vN zwO@#m&r^M5q{TOmvU3cX=5Hy_f|!F z9gYzbJ34JP+KGnzeO3mw4<_IET_A|x6~5-7YZNKx)%6vk!mxSriv% zp`~*eZyr8n^Mj^nj1{T1#JF-kk_j4OqgYp+hfRx$v0}+Q^bC&Sb{BcwUx1enoFy=n zv^hp~Mn*(>g*43|zkc;ApGI^24QyVw0cXx##rMDeipkyGJ2s(uP9X{l^6~n?qu6!- zBlwH2|5q#~Kz!ux9q6pP%0@*|*W79m{q(F%8p#IoivWa@Pdg5Yo@ow+XvXh(Ik_ey z;sqxa2tmET3Eu^Nln_@=l)j5Fq9=Qe)R|$~E*pYXN}NfXM>mbM{Bq=1Ekq(M9|;0c z@rBVo!8VeWQrXXm84c?4h>jyV*nx?zCPYUED2v*Fp8TyoBPy02(r~AN67>wrQc`n8 zy`_J&4V&f@8<x%Di;14)Mw)omGJ*Z7FF^ ztI&`H3Nt0-3yorl9dNF_TK78vRUPSeR9Q?+oAH$J1-^62kAH%{0tMEJj@y`f| zda+~Yauk(R;neA?=+-=CIuz!Z*#6&aBSD{n3F<3bB}-7IsT9*QTWlql|XRHlR>J<#_}1wRDCI( zBt0g*AzBjd@j0|92Kd-x)YD5BmgAngHsYP1zXWf_0z{JnsGM7lhU@jnC0JcrU5N7X zQq}C@}^RzGm%M~>i5&ZA^w>rU&aXphl1mnPrdXXKKmK0EL}i)$+kHoV*hU({|lf` z6Zu{E^zS}``uaBbX3A(R^5CW-Msk33kI}y6AQULT+7;{ZhyTaZ&TV&&j^W#Q>+QF2 z{N(!>=?xIM=MqHFP*LzD+!8byBMt3om{tly5fUj<34|nE3oH8i`l%Sgm<&%KPLE-n zUay2xno@sKsG4tTf{4ZBDQEA5MniRR~- zmjgG}t=ou_vJwo9bitqLw{2{OXvCA_Gq$rpRz@}r3u#S7WaxqQ)nUMuWoS;K>Ti)t zfe%?>_NomB@)}#A#(q*XtROF!eHO+25A3%TGBzwuWvLVfg9Af2dFBMc=V^=#(0faw zL10m_L*=PFa8_Sy zqV=N>?Z<{SD@oe~I)-}j!V7PaK5`alJV_gMgD*Xg4uOVqwbO&98i+pZCsjfma;JS# z@&bbb@77+v%V-Gziw^1&4W%ej;AY$SGy8#kE=8nrlzxZcLpxo_?#OUD(OkhVK9e9& zv{ju1%rqZSk(U`c7A#EP-F(F+sU(T~42W7^s(2bi0Z)B4AV#CX%8^$swr43D=2m7=(I%s_{xv z&ANz99ab<>O2+h@*+YCS8PH2~)8X)rK(FM%i7X0E7=N)oGJ1AB%XGksu2Egt7yM22 zc<_OJSi5SK?brF{k+T>GrILPbxL77jMk(cT*}`lrs`4Wz19V`3__51K_h(?w?hPm_ z$;PqM$1#t(U`|CPj-I}Zw+|mxYw_7nJcDz`K45=jps}%$dT0`r6?0HibJgVAo9?V; zwt1KW5Nap;Qj1;$O7xpRhu+O#@^_Kec<;{j0z5*&NxV<<`ZRrGB0#;y?@N}huteiE zb=|03x)RZ38XD^r-O7?A)}(PVL5To|=G|(}W~!3ej`m`>`4%GM!=yP4Df?fe72;EY zVSyBFNoeVV1nPL7>f^A%w1H1W_S9ec(|I`(vn$cnw*p1_p?cn2%X2u`uc71wb!)EO zqoxV$I?ggdnzfbZ_!9V)f!9l?rTe5ytzJ$g98ef`_Ei<#3`Vg&qNyAz@tkTbE;45} zS@XWZdVB1-0-547V`~1BY)Lmrud-IQQaVI^uexanTa|Mndy;LoK-aTxQd6f;Sy^TE z>Fn&`bxyl=z zed`xvCK^IwB!sacjR?ii(SIEqH>}0_)mzbdyA5rlLENI#y>#h3?A^8ztCuPv{oCm2 zi{rqxBW8DOdpGG3(n0!0lB@`{+9O>QW93{*uFk%hP6V)QaTylOFF|3sAB*R%!f1aS zH*34_^Y;#6hWb(?7|KDILdVJN_aYGu;yZu&C%Aaz1Ik|>E;aVxbR1Zc7isP|vJpJe{{KivH@wvngVp#F<|K{U= z0rWX&bJSk}e0d9Qg*}*ChNn>*n>OQg{gvC+QWC>|rYC^b9Zj%BMCkO5qOE6Uss59C|_- z9xPnG#^yaxbsJcT@wug?WeA0ak?Ed62ANCBO+yn&RGJn+;nk)B$&k^AhW{k!j<+r) zEZ~f3Ao1C(G~o-&(RT?l z6{tmoDAFXN)VVWnQ9xYAndjK95$)h1rOq~GQJ|FjP;*N9`uohFg(GbH6n!KGpQwm5 zTrNRyL1RhKGHl`Fiu`6r;K<4*?pN=B5UWPev#!?0@pI zNBzX7&yYVgbe}@UK=Y|AeGRX1+NJXjk2pgr&N)Y={F8ChXN8*_r{2Xw zx=sez3@>liFsz2A`9@xf;{Ltcv1Q9T+_=?%ciumTkw_9!eK|C=G5p38`{9}nqocVV zHCL~pwYvu^)~&{`fATq8zgB~s{6bWelw!fWCHUI6{~jM)xDIb-5e$)Z>q!gbMt}KYbC`uin7jyZ2zx!YUkl=Oy@(!q~ofBa*#2c>BnC96nitd-mOn zyrfC=knhJP#?aN(h3dK0xOJ-@Lj-6VDG(Sjn(%+oK@P3nC5t+22#jr>1;WyEMmN4h z!vN)eazbElj1EW=<}Y53$_0ziNf6c6(Svl2u4M8#X_;p3lBtK?%q2W;JJ(oL~psxgZx%nn{+J;O=UTy*J6Ax)xgQ9a$bHp^4QoOD9 z+k9SuNTY}7C%q#58lj`6sVB}NGCrJ_3kaxs;ycPA%hpi1ct`*>nSjJ{p0a)#8q}zS z>a0Y>dY*>kl{!o3l%sHx##={(Hbrf8hJ$DOMJae(HtLj=ti;nEjE*={RAd(nbgNIN zG&17k?~`uP-41ZoaHQsZCy+)ys9v}j#iiw_Yiz>c&>*{L1|NFz3GCaq2S5GsTNoM} zLI3Ck`UV0vv>B)VNJ@&)HhA%GzwlXHyzoBm+PNNi1*Pcj4B^Lgf;B`OCD<#NSAwVa zuEb}a{xHs-xQ=iA?T@f_^J3h!br}|vuw_u3t`93o#^eHz~u|I z2vK)W6P#HOB$EcDe~Q{C{Sa4wizEtguwAk(?2eQaIhrv%{Lo&E_H`mVvjk_()uOd` z6iI1XEgOK3V0qEpay)U*P8>UR3F8FtO)U+$YtI%enpcej2S31?Rhw}1~*mQ<|VgG3Nqv#YJ9U31^tyxmx#fD{7sLIbLA7$d5BS)}p*E%em zGY9=mLpW7e4=?SowqMKiXJcS!63xx6C@jvQ>vVYw+&7!Bjo4RzASRtRzO$jkY0p&0i5!$8xFfm4<8(;k76S#lH7E$wm`|-c9 zki%j8WZy7O9zO-YC(n>~vi6U)ITKR)0$fuh4shea4^Y8{c};-lr=2}5r6?>!A5B6@K^3-b--rhvxeM#JEF>r?M00Bk zln>D3%OxVv>R5%@{k%Rw264b!iUffVqQ7F{-l?ee{PSD7hl)9sd{v>es?zd}`KUyr z6!5XYBpH)HK}yL*p`X?~6ixgOnjpnOWK@FS6>AnDh2T=jYdxBfPWM+)Jxw^)>R+v@ z&CJZP6ml3Di&Z$Rk`V;Oto+zp?x1I@L5^;@Uo3#6B8I78Rhlt(uP09^BRYzUV> z%2=swWIr3Cm`x2MC2oLD28+M(6KUgk{mMVZQ{-(b8r`TeL>t~~lZOqU(XvSSuq_%2 zRy{1z$KM2MG_+5&M-r0w0)Z??22ROB?K5fXWZ|dLSHGC?V|gsYCX@5C`asG}hk;ge zBm|!HUC{*^7jk2gwjxWGa=lKRJwr73o;DuoUU330%2w7M<;FWO&G}4_u#D3x#|(EL2odV2+3) z@8TccE9b$vLm<#p0e}0&>-3%agU*Nc5|tb@+-gHCkf5R3jLOPJMdZEk~a0Cbd_V3+~x8HsXBf)W0R+XczvlkmT?7|B#yoRdk zY7`dcVr+N-bLUp!=Ith%S6Md(pp3RO4O{#g(7Bg10C#T*3B6{ z(j@W`%7~KTik}xPUV!a;c490P#id)V7>oOnRkF|$Nz0KCFL-Qzu|rTrmh4&N9cf$b zY@z;9|GAUo8v}?HO92p+#!~(kMioJ2=Uyt#ui(p?)6buC#U0jZ3AjBBKK|1x& z-CNgN;9!#WH<3JokACPhLYleA<4VY^A$CKX>PFhxq@+8GqR68C<8gG+DJ!e4z?G&J+-@Gl>8qWnZSTT+ zXAfb`(q%}BhcVvMfx9=YgP&l!rST@}X?wNHOh&c`*|~Y7eF{b=MvO-a^9xwMc$IdL zeUME3q0vUIgx3NgZS_ai!c=S=3Er2Jk;ijsn24m{z^QY%Ji?0(Hwk7PXBit z{|k{m9n%;HUdN|@^E1Gt_GF~uifP5AjF1!o6&MYJnj?=(!mpuL^K$uETlpnJMh5cG zOHz_yZSx~ZQ`Z2un>Q9hIg#t3H&y`N0PR9E6Yq8_5tw>Ykc4h);o)moHH@^ra`c0-G zsj66j&6_u~s$m>B@P;j1Nb}}Xne!1Y8TS~$E0ty3%|}k*)1Q9|KYj6sxN)rkIRrpb zBI+#7v+C>VGhjS_-a?d=74baj%64~kcG-$IDa?7*^DHtb+U1gA1$+g_Z8(?;+=iXi z7t|WUCHg!`+R7-oJoMJsH`)+fN-D}q@{Q%vP*I>Xv?u@+U>hQn5z;&jbE+#5o0_B$ z2h30?$#FdD!OEp;apcI$l0XaV zE|BA)LZ(Mx{TvS~-&_D6{@9aPv}6uG_}~!Uefu!Y4;_RoIvmrJHvFK7q-En*83cZb z7=aucCoH9igm{SB)OgPfBQ*kb7~hyR@wdQ{v*UzwXl|b~ ztm{m;7ibbsN~x=S(U$O!0MD7r7iT?rDa)iGR%D#Nt8>k3)~!+H#iJ1?7*m^4XvoCF z64%)Xte&kp3*fSqJQp*AuN_iU4}*4$u@kASNp6tV^2Pe-u@A^wnlN{{55pVPGIGd zY8s*$1VVlqw9ELzuYMUFRNShcm6lnIBZtr8`t=U>EsJ`_OPs0*FX>04VPj4WJx8Fd zXy!Z}roaC4-^Y#f$5C38gMG)3pt7(MhxZ-8SagW@aADV7I}yyx#F_Iqu=m7uY^c|? z*b3abc~u?7NgCeVygazmT{wT`3XPTDK!!TA7|~m-I~P+FeygLj50Ay*=Y1Y|_))z0+B>+`HiC5We}X_%QQkD=(@}Qi{Lv1X9LV@^c*Sh& zFQ3Qp5|7F~nxKOgr9swkrOk|EAwDWhh-r?IQUzA7tVCsT4u0|CYt)-`cF7|uO{DZ4 zOE(}85bfk>NQTI)Hg<9v6%|w3hoYGpN&zVKUyiyWY?|UNC@A1>^K>*FU2edS*DHc3 znQ;z954BientgGcFY$`QZ|n>CP0?%tsl~{%&XKNDwA^w8t&O_I0bgQ4$&T73Fs<=W zo}_l)aIu}rEs?R8vuQ0L0AEb?(8Weh5sil;(q`ZIXQ~t_e^pyFzRF8i*guKmsqH!! z=C$~S?`&^waWQf!PZP9X{T;KI5-+-4Y+t%X`{k%cN5=^!NE6c4R^IbjPTg3^nKK2i z{9vyqh4jodT^@|2p{6n$AOG;vNG2b&Hg@6Ikq*3n;uvCVUUJGbKK{`=vAQ}J+m_#t z4?X%D7))xxeGfbeH*LzR?;Id62}B8G$52&KgnQO(zz=_Z5YYsADlLX^+BkMB$-sT9 zLkJ{wz(w1#5Ujz!ALzilXNQnT&&GV3o9!V#OJ5S~B&eSzXQ@NN9(?^Pzk>^>&mcaR zf+J@xqM^SXkKD5rcWqvSt7ondu;<{N_YY%+ZH;3BbtUB(>c54JtCk?g9VS?9$Az0c z=p{eQ5i58|uW62VGIg1PDRNG`h)K+96K%UsW z>uwZhdZX&a+SW8gN|V!L0dVSPM%8|hd*f&pL*^|d}P->#!Jp2?s9nR z|HknFOSULtmxX;te?cJ*P)GHlP2KAj;5c%GQ7f2S;9+7G>n+79bqS zpqJsHli;EP9H)Rwu{Z@l6|EYjQk$G4V4I91M&V4vr6iqQC{!9n$XW_i&yf&I7*v#& z`kV?+%EM6#@J5U?8GQ0nAI60X7cB=u(++xuat-HaJm&d7^yr-+Y4GZ+uaVI*2xzo` z!%1=$AXTZ9qQVl?Ev=(*CMYFywzRZjXgcv9y<4ZB>Jd%#%=qNp%s_9<|l@N`ldlCtPJ&sKv5aw4&W>kYzAoo1* zAPvhT!t`do{hhx;Usn(E3YKGh+J#FE%@`V`qNRg8G?|111xPzrEMLAJ{hdA7zG)f$ z;u~MY*|YB>Ay1CR^US3NynpZ{ZrtjGpPsG9tnMLihRkbt{a!M36(-_$Fg~B3iocLrh3ab(%ntm2vtNqHS zvU~7Zihv}i^Db1pNu;4GiAGBiXZHfK!*i&s%tAc@-{?RGE}c0+@4DaGrEArHhYNTw z_FuV6nx+qu_ob}I#z)N%7ZnwmGu6@2j;zcKMCe2~WiA}hqUgHrA)Zk`6hT%WEaia@ zSTu_IUEi^H>b22IL!~iT)Dvbb^(7A(b+wQ9j5m=pl7_C{E}Xk?0jpI@vbr2OVIMkL z`q9Q$@9-RMwGJUZoq~7v?L&EO9Zp|q!oGuzn2g3ylAn)YAPtiQINF^;d6~Mu9MM_P zoX=B2c{0bUr?Z80o~JR`hHZE5#9ME_MF%5-`yY7-zyAlnhj4BVz4jSPQ5c%?ptE-X zeFMYTx^*i8?sWJl*NPI2j*X(Kx&mEYU1CGyoy9}65NJ>dlHRT%j12Pp;R(`xgpNQQ zo9@_v-4EV_{-G%Xf;8NH@0}>GDnMRQt{J&A7p`)A=qQukmKRFUu0wRSh@$bK9>o9i zZ!1_!+8f_+%p~suR5MA`mDI^pV3?zWItzhEH(FYIFiNBL@Wc00PmE)D#3|s;k+heA zO2WwG6bI~SoYW^Bi+Wi6qdvbt{398bv&+UO>%B8(nnxh_HI6zpjP?h zY-@f&DVD8R$4h)@X&<7qo8Y+3SdO)-F$Dd|SXNh#jq6v?p)WvtM=#s&=pjANS$vje zD~(f01EqBcfXq`bjnZM+ykQOQ-mw91zWg#WBSkoQ;RfD4vJX4%T#dVSY((457V6<4 zq#t34CT( zK6aFm-mxzD!!87h2%I7_*tj+ywS^J1-{_=G<`}qqNTkeQI&}mamR8`=ZCfxlG=R6+ z9#57Jk3V!5HZCo~VBb8>oV$Rx_8-8L&ppd$mZH105ySlhn21iIr?r7&HH)79evVrd zJGL#w#*M4c)t|t?sAgNJzc>!cSJv)NsS7DcPgUhn<%LQYO;N5Xd(yA65!Ac0i4m+{ zQ-v>m_CsjA)QirfK7E#}1&~~R{oc2AY+&;DweB9YogoSWtrs?g_@MyYG=gHHV zm6G7|^ezKw1x-2PiJ1hJtzLn;)vK}p&`C6PjUYBl4}=3zn3shCdK=mRIwvcG3_@?2 zfXt>`$TPF^skn0E43@8|!wWCGh>Tz{+{qq1c<;S<^4a?+RKKvz%wPWLt9W?NlUTNN zDLnpkY~Qt+g583fH*VN!)>K|IJT%5JO~btp+($3xfYsKTom^m_!Esa9abqAb@ zK294KRhD#t=&Go)#zSMINTs}SGoU;~Z-d8dn?tijzFY)=j-eCJsqYrSotejl%U4lW zS&FiXe3a(-(bdySr-2R{m9qFld95ceG@>_3ubd8LWl=hwePRc8?c9W)zWO$jTw2jh zkW7!?DV50wsV!8>au&J>;)WTknZ}8Ipe!pgFHobY zOWTcwG!%8^WQ%5EBOP)w^iebx020kbPsz0Mp;R*x$#Y0co;CxjEg;7x61aZ-2JYN- z2X&Pf-Cf<5ZlZioi9~X$;|SWQYp{6eO_3_)ygK#$q%#!Jb5Zz!v+9UuuPTrS(l&p;^g32+_`{d+=wL!p7vm$!7BI~xpjp)dJ=$>ZB$eZF%^;D%+ z9Da6QNj%@U*!bT_VCM>qi`I%fdHf-)-mnR2l(&XPf|!XYs*AFb7jhZjC^hL*pZGY& z2D1~~lrE=k6>ZZz>G1jq{P;O(PCz(`x-HGh#dLJ^Ba&B! z@4xsmdPbu7(?9tlo#?4pu1<7<2Hd?%`LdvaMc!KdI(xO#}?pD8^-p{W%$ak ze;k7y1L)$t$S9y%G}>ug(+RXJ1%`SeopL|W+mCnN+>epwn`mooLVH^ihj-p8TLd{y zVS>Bqc#OO?h3w26bE>q^G&(wjtgKwqz3d#K6QgvBhK>GOf$Vb2j=BvXYSr=lj2lB^ zaZFOCl1U?_g(Xw&Iigrd_0q{p!MleJA~i6F6=h2t2Kv8rd_d4A?oPHkd3z7PiTwOZ z4EIg&Yk6HVRGO;LG@-nId7S(=M`K6f6!@#664PF#aWdKP7zcBF9FqijM4z36Xva`U=#*4Dqp1!GpQgTa|N56-#n@yY8k<^BUS5OyA9xI}z5WJ`cM`7OxI!Q|izl9b4DTF#m;EBR^376_ zdeG4p!{@*7alG{M3y6&qSjOcYgz)i?J%#$UMflbW|A>=kF2Iu%vb+b?>{Ap*DGSaWT6v`+ ztcsFp^Kd7zd9ehGEtjWSlj4?_ZmZDvPg98_Q7USJYVC3|&T*XM?<%DtK&EM$5sqQ& z2$jM>0-YmMi1AulNTg1sVoQB7p1fzhMWY^kXdQ}50tjRU@xs5qjBs`ZS~|vY+HJV7zTknMLVge37!S? zw2!iKnG_UO*$pXfl~PIO4Ya?el)ns(wkgueS@D<_(`b)l873_l(*11e)hr-C(;_Mw zXP}0PL5fy`bl2Y_)DWm4s?jS>yQ9Z@QOqDYZqK z>`>}_3}H_)GJW${R*?r6J=?zCPF%it(ef(=gw-Y)Fk5xW@wKudG_FdjPvg5trM4N( z*td9M#v*y4NPy=qSQKK4z+O{vBQzw*yibrkt6WCh5RLg-j4qx%d*15e)l^rbASV|$8?GTf zr37w8MW+!=o5#l=y9>2N9(?1!d<{SR(a&tUy1J?qX;jVu%8s@%OrfL0r_wk$Z4ez4 zL5U^i@a7xuV9WYts9L(5JUog6N41J?o{mTlWrl`C5t?!BNbybqlR=?p~y1uDp4xOVk23g{ef-Lw(6ZZvQNIc@~4 z(jAM?oi{Yc!2lA0zM>xLXPkgW<0;;dbEA5iS^y`SEr)fSF2QsPOUN-~a(% z)TV_qBH1*$S=1}k57aGAyXB;%(l$);Gx?QHi=v0N3Yx94Z69MXjyD};2~abYv-i7M$Q=d}#gAd3y0nc2kjHF}bjxbcA@6eo_@hVb1Ne~M9p-el^Iv=kN3PNzdo_>oQ^&--cL+0vpciF5bZYlV|bNlTTYw=a!q-Fg-qO=?Yr7G&&jOz0xr-*o%UK zOzhdU1-EWC@ZLLc@BL5E2F4N2psm3WKK=ZMP?A@O@BZUI;i*UN!wRWald2lB9y&`}i7k60ps2L>D6fh0n#4?;sEG2#-xgBR z*(U1IB#s05=i-e^@a3kXuArRbLV?hizvAOp0QyvyF9$zs6I0L&`>XiDCp6VVQ2>kTbV`RVinnG91U#nZ+Ul8C<1p5 z0C85mNyrpUa6C$P((%D;AX?Or?~V8be2Cr|n0WlU+n0HiHj6_YrK}z8X_AEnK^P1);E? z9zzR0_WVb1@#19ztoPn?4?UZo(Ho(0N#tO|`t_);^U^wn46SnJAe#}hBzf|gt)!*m zQlw2lN4#Qyf=^dJ_1OU-0!|b?GK+wT=%#W&s{N&WM@1*Z-2zzV>5IxnLt`%EE#=MG zLID14)5&6Z{-F_aXvt^rUQQ_(MO=6-zc*~r-ltYi2^l56mPQ%h>Mo?p?yjn%{6me7JK{-GI z#aaNR{);xMC#QuziW=J@D4r`osK|oGxW9kYa*tFKPDVEv4pLSJ+3#uO(^FS8Lbb`n zH@cs|srsd7iatUZk~Q&==>h=;(`TZII9NGKPJ~{4mO@pMzuG5#v3S@R*x4et1KzJ( zyN21MDJ-igLuSZ@{=q)P$>%w_8Tg04`eVHN=Fd@GvkaHdpTV-qJa|(^v1M%qTQG(E zf&#X`6sIpoIZ!kG{7p|5Q^j&(3bAfOA#>*zapp81YdFn zl<%l?3&oo1>X%Wk#E@T9h>q?~i=Y<|CSSrOJ(=U~(7YTMnWwW|x`mOngi za-x|W7q4?1E6ob1J#-SNqiyxS$p@cIn$6G(s(`b`(Al1j4i=l@_0dU{Zjz0lo*Abt z&`Q>>u5NVq^q{w=*S3{ZluqddT4Ae5;0S@D6S*6=$f0IL#t0h5>1nHgybQQ(il%JE zpo-+mF_nIkeVOC9X}onf`G1mMK}VkK{CE3*dUxbohy9=5TYqmy7M&^NX_S_gVe5`9 zHp9}|HH@2$w`|Jq&K(=zr-Qa;MIFMyFdgdzZr->;Kvao|c^7{E=3$(^+(_L#k05FD z(4M>S@I5O~S5t%fy5;EV?6Jjiaw-L?^{nJ1@&)ze9OY3oR@oHEqPEY}qNSBKu9PUSROAGaU1QEWb<8l_|G*H)xcgSp$@qQE*`3UlA;UzY>)!L25p%nb$;2Go= z=Wz^l&I}rE4dBH7H*w|i1zRmWJvE8J{yvU(7oz;zBGPnx1HmNx?(cm81;sh!ze=*X z8@+u4meRC+c`5Bd3T@~2QMYy-eW6J#U0RGg)^EmGZ#N`b9gRGAj(FBx)`sF2c+flT0*}Xq zoSZCr0wGM$Aoch4(d&yNKDA&~{8hnQg)gsMyN-`FZS%oFt9BH8jY%&YGh`HspLk;q{En{kquCR7){8qlQFi5{qs_3IIHTU!=>ow%(J%D zink+JVsJ$U1cC%MWcZYPy%_bd937sgDN4~>KwF?lfJX{eQv!Z(fY+zeBZ{D?wA5BA zUpRk-G`Iv6fKE~|OIdk>AbF&`6s}Y+n%cYR{Vd=j0r$WD(pjNc-2RZo51j5?yK&r{wR+rLg2b%xfDbPV+1ZSOUcl)q@K*c^EuAlc{ihnLkowW z$eLn3>H)Pwjv!mgwo$?A9+FG`rq9NE{MF9W9d)s_P~SVoR*Bj-8d@Vx}18px}>JCNfy=R_>(9$j!G9uN_L?)I)UziA#7Q<6eC0Z zs3_s|@^H{TT74F!v4Y&G+@ZSFO=o?Eyc2Ox(X@p%~7kOP#Vo_}m3nywv#&+EtPHJdT4Jip#S zOp`ygjhbroIe^b`thC7DmmpuXnOXlt6@zD+_Wkxk+NjJ68_>Z8N z?;2G7Ej^%r23UDJ`|kF+&O2Ym%rZbEKV{5IK3cbFE6OUXarXRW+dFoWHYYbf3;*S7 zUq(mkO&mLX1as5WK`uW|ow-O_dkJiZv9x{z_8vS=0Vim4C*$w_=Ff2O{hwih&erl3 z8}Z|xzJZ~kD7@6wT9K{Ah3@naA5Fc%Hc3606U=rg?~fddmZn~uI@^f;p#tuF0ChBehA`UN(#Ja2y*qD#U>!=Wy;~ zBYIm~;a^a7jd3fpl}7Jkc%a_^yT(M0lz1tX??cfp>cmm(x_diqN&sUcaRR$K949T8 zE?t54t`^+?&@R-|{!Wk2pg6A-ZC%Y+wuaz))mDPa2I{ymg6%?l`AZ+AZJEH^FTaVY z*a9XKedMPZn{Csk4L)seN{2wRi+z+$?Zy!fhm3DjqDScfT6G=_2MlNU*d7HkY!--k zNSr4Lo zH*DF4<*Qd?Fgk=s9)B2zj~+5lIyT`%Ny3qcjmQK&64A%!^IFcM(NA73nM+1rYE7P? zqNB>AQO={Hbeb~Nbgt;Ad@?aFrItF4^yN#>kOJ0D0JgfC?aI#1wN;E2m1P`X4^Gol zId<$A`q+PtHkA;W)=Mu-c|bHU3-_&>AM^m^mTslu6T=x=)Wc0PsIE{jBV3mBV2$xnPs@(=4sPJUgiH#8;?ec>uSiK}0Wd)?& z)eC62aSd7#spng6A)ljYij1XXPI*;|3@Gv4t;hh!U#sZF136h)rg%gbjVHUs`^=DE zgBH9iefXMvJR_gy__{+7*^Dl+FrWH4jjhYZ@!Bm8vE@JJdDy+Yw^>)2QjLG-h76p+bMO%FC;ZV zHrpiGQL%ZBmm*%;&dC`Q^S0xSKGP7Xe~Rv; zYkE+CYMzExZpUm4wS``M{+W9))OZ{t{f)SK^(gLt{9ax&jjq;P*t%s6s;eu|*&j6r z!B3gW$j)^1HyuJ}oHTaE9`;hFG8EnwX+pdeBOtjc?#>6)gm_(rd|yaqzz$YbOh@+ ztw&~V8UFg4-$mQNfK@NpxNZs7uULWr&uePxq>dm>Nk@7gY_ZzLj@*_>(MLMc)X?lW zLB}*6*s~qwxtZ9pVJ)hQN@yG0c=O#i;GXNlW2?e=ZlxQg-a)uCQV>{Din*y_%3%U) z*VNJWO`_>m3qd+<4g1&A6GdB36T(>`@^FOD&};?)uz(z&tKE=NljF!KBxnkxk?ylt zxpWIoA3Y6!nu^^Iipu6h_xJRYEv0`{5rce5=hCei8S;^v9Z)5YUAuO&uRMoNLQW(f zuf6y>_MbR}TWu}Wr!&Z8JG2N>X)9V?J4#@j7fHtBkL-abbpaJ66?px%<9O+(`!P7! zNfPxLPEkEWfjjX)AROc~lF;8bg5hEDCNT+VDZs1?#7X0hj7=P2T)#|$L}=dDLG5V%^NpST2h8JtJfeeHybt8HS`?F zh=B-JF0aFzC;uIP^S9rIH`$LQdKU)|9L25X4k{xuGQA1aoRXoHGW2+Z1d6!`@Orhm zv85f`_dJLn{PbtYE+|2FS0|=PXYHvvuFyF9kws5Mv>6{Avm7+-2`D3F3u#Ot5H#^6 z<1S`XgfG=iV`CI@rrG##C$C5E;^uViyP0a!Fa7;}CQy+`2J&+XP*hTk`1B}_pEyns zdc>v;1@r`BH0?w82T2|Z5d}fHJED=TEYwthD+O)=a0-WvsY}{-mLB~02#pk#F%>}) z4OYNIgW#v|$3`&|AI1DMy~?=+1yC#a*f+LSg5i`ek+GzbOQn(*Kp-78MK2-LRFY_^ zNQ3o@7a1twKm9JFCvc@wD=Gn_8h<>|43VP3Nd!&0pKXW6cjfQtI`No{g^QqB5l4$! zk(P=$sILZ0Wx+`Ueqqm+0WtdUdHSq$0$#!UPV>3ChX6A@dbYtug;9{<#fqf`$POms z*3C<}bm=M;2HQ!6L-Rv2r}Ne%0`I3hM;Wte@|V&AJRXe&+t23-@X7&@QZrAJ22>zI zIh|VgBe19ZNw>?3xN>MoTdiVKWI_ul96nLM3FIh;GNgij8gB=kzOQ+!oglQ~uDO=jhn)kdtMW)gu0-R(!WCVam*4OggaaK;9y+r-lM@KnE zM>b*YQ~8+>fAk@&UR{B_3_qQ3InOg_?&?Bnkk2O|r6^$2KT~4mRogC(*Ir4t847g-eba4Qm^o;n$oG8lp_=F<*v&f+1s;IW|RwY}iqo;*c za-Niypi~K6uQUY#Iww-Eg&%ZqDBt>9QBv6)Hyu2S5^_u?$0y8Lwe%FpIEgF%5&tP# zXA!&Gd?mUpIvL_r@vNna=ri?~^rsvfMIBW8OtF;A>KK2wo{K;ofR$Pvv{CpG=NVK&zT5;re z51hl}Kn zVRhF@K4wwvWLb2p~ZqJ~`EePk;Wy*uLp5_>&@_I8%R3)7hLOkW0bN zog4AgX_{vwmW&x0i*aXiTq)t4KJMY|%uD$`Zw0EGmyqez+am-X% z#7{dlO}<*dsiWsH(nEfT4In9fn9h$=w^4doi-i~nNwI3G#yl)45&bTYQU*l^+Jv6M zt(s2??<=&gId>@(9Wu;{JUGk!Wi1qONP#b$Z9pW&6)+_(K~A1YMtyZAKJuYE@teQ? zc`RA760NONnp8k**C@G`_oqQ?X&$7v@dy=AkW7=n=YH*ZtXW=c&(on$J4NsIU(V4N zZO8Fbhw=Wt{RF*z^yIQk(JAtF_0ly=O_EuNHdKdD3q53r6{*qP$gO5X1w7ooFroy~ z(TOaSp-3v+L0kt83EM`%BS)WqmB%Z5P0U0c>`o-Elv>)lIf+9<~-L+Lt;}f z^oTTFB3cQYOTh_vO5>@(X=YxYt^RCnYJ~E?im4E?Gqcg#(}(jH&ZCzK&89zTI5d8X z23d9IW@!jrIn|igevR`4gZy38nWZ60;rRI@0UC!1D#~#Ksgon4maC@eD6vbxrCNwo zJoJhuN9YxjCoG!A`$(Y%vkEaauYG2YRX#eqei&3EBiw#n-cmQFxMPQJ5WpH$4dj*#S(DuUl^3AP}1{ zgC!7TIgGsC@6iq{N%U0dJ@TLK!JFE2tVM1GCU|cFa<5kfm)#f|jNXvZEyFGEpiYTREmcV(bkb?(Mb0bzp+gMXB-{@eMQAJf^rz2 zfBqvJe}WkD^&5K+AU&9cnT2%nN;2AedwIHxN;iOcj=NF;1Pr9mZCZ@anI)jo6sU~9 z;=EGeqOs29Xc^s%$2pdZ?NWawtMim=agfoBbkQyanl4YH+#$(L{^lLnhXpG5qrO<&@y+&0%P?Z2d7^U8*T+Ezn1|=ak%Ch_j`vpj~b43~* ztt9x<*#Uw!7eU1w<#c4A8RL`fsHv^MvK6cG+AHrPr*I<%2zV}BY(jVMpv~qa@tXGb zcH;?6zb@)z1A4d3j@})*IWsph3*raWgH%LsDj_+M7S#DPuVN+f?CnFJ#EZIzc4)G+ z29B3D1&}_PAT70}V}klpC+j?o)dG1(zw7y?3#jAu*~Bs7uDGjrSs)Sw=lIg&+O!2h;zwzip_{NvNioUTP#8M~V zqU<@ctFd=%t?_@DPFXla+ef}19YJ|nxkdWq;4RK(h^J;Gzm!9Pwlvy1P4jD3N;#If zc{wPcz8jt#!=;8M3{A|z6Dh`Qs*f+yb(VN$E*1W8kh*h*Jl>B#`rYTTyt)GE(_T8G zA-2cJ@+&!h1)xs~IT`=s#lOI-ukOQTdVZ0q3<`)JyY9Oa!_ih;ID4J~?RZm?U3=th z!P2!_87j~xVK)Q8??g0#K7l_O5hYWq1c|2Cv=|{s??B7d<=rVk*A{uGy;@PKmqO>>_FaG#@=x(2YFR2K1 zOIN`cNk%x&gUj@A#Izsz@F#HKzVvdbOkj&7=xQd&iKpYKkL<>Khu*}^o44TeD5+Fa8gu5kLQ^g@ZZq_n zN2xngU17v<>^XqCEx>6d{pOl0wod!TkI@%UKcd(<-Clf+B(+9})!30&YrL)pmK> z!+0z@Wy+=FM7IraQWgTjA<1o8P`_Ma#%H1 z8bXbMfh;qCRD@xIVpk9|DIO{ddg~;Cz^3x0lpmsnAyz(tN_vLCMbl`hibPPXvobu0 z_BLUb3US7EgCHO1IaIL9r3z#gV8N43r9VZErV^pX6D|B&n85K@?w@j(WY8B4h7`7< zHnxJ6G}Dmi^P*8ubijC!pij9|vs40#EC>)M>l(I2_nOuYLD&sMdv{qj^LQvxuyI&&^z^%`~9ieds6MZu-CB!`M(dOaK)^?@$| zvk8JdMZC1YV<_tEnqVF*=_o$aa}-%r4wGmr+8AJ^fmDqw^-WBn`?&}TGc&Wy*lCJa z<0|LPDX%eW({1T)g5089XBk3aSZR~29C@u1=sagVN z%`T+#IaUHhV<&t_bYeNNJk&qYLhaI+iVK{7YM;~2Dbhp$K(+4{k`$4pPSZ706Ew)w zSsVjRhq`Exi}HOa%@3j^I|E7aXQd?mMFdGKqI2q%xi~xvaa0v%U|nqya7?rQwDZr&ZzcTaC9Y z%4YJxmyGEmU7YX8M{JkM70u8|v@zh3k)1`|s#yy~GM%wjkzyUXUiw4lil0Smo?_#m z@3eqJddsG8Z_9+P5&fKqj5BuPXYslN^mGU39{T)${w>~^B|j+AN$EyDo!(Vz*I}5B z>ecHFh)p;JrTH`atcWVF;XeUKIX0N%^T=yzeSCU``rQk6+AQwfvkh69Uex7Q;NAD$ zM@vT=ipq=d$_o&;`5z5M72Zxak0$c*Y zS1(*gdPOaK53fKV5k~W&F7%)6M_|H(Hrly4(qJZi3fTdINb0<-TtB||tsfwio`bRe zG1>z<&OX|`lmR-d>Da&bG=BQCpJQ}vfOb|@2)qP`vq*Et>8K>(8~^p|*mvLnDIY}L z>h07cgV=ZU817hGi?OK`?A>>keCDD&kK^pgcj#+TkIzv@r;U?89NDt5r;d^i5PwQP z=jCM~oBa`Q*=lvlzx_r>NIEy3L9kF>hl=t|aU9Z;gK(uLkQinw~BLBEdF= z$uFF|Cg&OYO@GTU==Vs3iiSo`(`j0&ui~-1lwOP@q^1~YI8D&_oY;i&3W>PM@ro|; zb|fH$lAdlPpP+A^23;-U4?^ac^IDYPw}1O_G&h{X_rLQp)>l4^Pd)z(9{I=?xIM{u z?4$Q!cp!mwtF~EWMfJ_Xp)B4@Q(&5=i1Itt_L1?Ef}5wJqw!LS7`9dDU)9;gJQFdt zEE>k|{Kg+(&l8o{cl_V+x!?FAnLQI3^w zJ)BEsr`Jg3P69ZJCrzb8NE_K9(s68>eS7 zN`B!mhq8(=n;x;L-MFTv$P3C13Wg&FJha-^O@%Ao62C1@F*)ExJn0xy69w`I&$K?s zAea$JcVmX$o92CG_>;+FX~xGqpZ(Rw_v*Kjc-d9EhqJLgslewdii{cZybLP2P0B=k zs%Pu|ibzVqrzKPQh0~Fj=|(C6z3P^Y3=vfGJhHwSD*-q&aV8*AOjLZlUe8h*gk;1( zCi|j$3&>irXRE`ZRf{TE%0D@#%JI|6M*(2=fW{#S8KHnFc8$N%38pwE0-D-EM7b%7 zRxJX0$&6&mN6@Z>dPP;8gWuDzsLYTy+0V?#Ku=Gn-B%8ez>QWmYWl9NrP*>yHBC}f zluxI`h3?J)_B+PsXj;tS0RcM60Gnui(=?TJNMmXpBEOM0Y;lkNBprmWRfc5Ot~;@F z=X#7yOyj*{=W+T*wePj+2!InkDVjjm19lR~-h9rEK(Bj)i^^&+w2l zXJEnJ#n;kh_LH?&V<-@{pzl+B1bL|(65e}Og_m1N1nM;%p0jJxvG9D%U_)N*6oD;2b*RLvV zq~A5eBN_2{1IWpx?(nityk2Z9e$~AeBYdKPctF=^I#A_a;xQU=_5C)#i2geCZp{!s zX?*#+UC%Eyc8lk03>VLp!!b*pJI8U#&dtO6jq54%z_}}093kHI8sM-X2KhrkeDQf4 zY`Z5rOzI01h*i_bHyjTa?OBcw_dj$ue(UKc(AL?9j+PEfaX5GOBytM!DAV(3Y3;)7 z^dKJIy$7?Caa_E96SsN>@Ysi*$15+tgo=_9G_?<*r*{N{(MdWm?3)}6wqcIXr}#ke zUIjPk0Z^8y2dHr8rbe-GeFYwUWEXO2o5rKVc=P3NBR^BCs#Vr&5}}|6n>Q~e2IU64h{Ix0GjaYd5Dvsk_{6Tki0-^8B!50QSrm7`bi5%#|LKq!t!#%q<;i;#dz~E2H=PS<44%AWi!famZO}9*W-hV z)@t9>w$>H{3x^LLM8ma4v^RAkIy7W6YdxJ^Xl`tzVjrMDcu`(aW;r&EHyUvK$We5( zbt}$fW5^yl^jAOCJNDZ=X)04GbpFWEHC1X%o8}Ji5gZ#TcGbQU$P|bXSQT|t>3=p6 zgSL1hB~6%g4_g&G=KyMzgb?5pN=$XrczQTq;cP0q~K$gV7gT8kwVy8$0Z$&;=dv!*B4zY^zANcm_qBXNUSkG825vTvB_%L@9E+k58MS(-Gjyl`exuFiqty2f`w4?2Y8uE@mGzMQ%ph#)*Am$0WP@ zTXh^2EemIB#hbRd8s~3GR_`iEzRV*iRBg%JJdUF)fWDq#0=~E@bkR*Ol|#^e)1sID zrIC7m_y8g)HgZPLgZE%;ge6;CM*KqVMV7WA1XnPVk7>3Yhdwrdn! z$VzM{of{gjqTC2p76!1kz6?{7gSdF<5^glMVnS20Y?tXjouR_7T0}HO zd66t>MXI)-njq*=jns4`tQ3`W01*?W1RP1{@(dU5U0;RzQXhgIfyM>2cXi{$$x}FV z=rGQnJ%h%^o0Rho@}TrvA3@Xr28Kp3qMbsnz9)?|cFEKO#>MYJ;3X!w@7}wS8S!Iukg~+SNGz1sX{E|| z54Br;N#|#2Iq83avUIN>q3nFjCVA1=+>c)zc^4~IufbqP7us$%;(_}g!uj);@#4S# z6d!u-32a(bgs>+G#gwC^ODYZ69zA&m#pTOz;_OudoK8$ml3UrgeDc!t#0bZG9${Y^ z>gx*dkwn*mM^d?!8k}0#}Q|RbY z=^@$jQcH1?gQ+weMbnkW;0h6tq$OePy44u#?!>Y71|)A=3D-m0kf_N+TVj}CiF`jz zr=I!q`p z5-5*ZDHn>)iO0>(69bLKZ^FZ{E_es~_gGgSM1|k%XKq6%%enVnPKl72QZh zR!)X(x1*?o8ZTioa3X<|ppnp|i3z2=HGL;ztZM7Z)zivCd9~UuO!;~aICMaPh#(_N zAHp{FFAR{uKlBv-{4c+X2cF)AvzPbbh3|h4vC%ntP4eEzV0^Y{r`(5NW;Q~K9(vd= zdcn#YQ-nf_^yHDl_{YEgE9~3YU_a zn`UewhQP#cIGCxX(lVvC}kyKolAjvYro$4|yukr4G+hv+Y$ zWaDVSNgt)`9LChUWJgL*j4nl|Vw9>!WMfQ4A@G&N_RW%hx=IE+VG&G+R8laS#+7pP z2Xok$08(6GB)he3UmiWYVx;*pZ08J>z?kOwk?br3y#^l1b21Q8&{n@s2EfKaMuVS8 zBYAdC;;tg9&a|(_i?=dBDn*(iKuMYlL|cS~eKO^6d-_Inv}sfITfd3H_!t>&MFGu- z@Hztok^=!qp5m0jnZ}Z`0u1zY;OeDw{Efz)9d@*%wNts9N~=(DQs935M|P5P@wpH!3po_-TOf)5qtFc51)nh4DMlNCOuP1ue3rEw)sTE!9Omkf}UYXQ9?CWkZE`HT|8F zlS6Rnq0`fc;UOo_P`oN$EG*1MenBpI+ig*GQx77X2yJfyR~$>Vi49ZR%n6Yu<{^Ee zHn&q&8VN?0uULhW!h96vWYYO*remNf7{}?*e|ibpIiS@6^SYBoh3tC=@EQN;Is9Ag z757>MM3&!vlO*!{+jP=>m7bxFSuP~UMmR$yQc8;Qke3adK6L_3*Kc7erUxh|ECpdY zyMd60PP8-4EQi4sIFP5tW0N$ta-8@%I>h_ZK#)fUd)m;`egl8>2fu58rS;Y=WcgEU zuhs3VDiBO(nIe(`EjdkFjRxVdoH#nlbS?QDcE zoQ(DB*PyOu8Qy#2eUw+0psDo+IE=`lgVfv8js1t-L3?)>cHQ$3UV7;*L`P|b>B$t* z_Wt2-e+sFy6STvnxYa^^PN4YQQ+H#$w;z?|rRZ$$C8uB+PrJVpP+v-Y{Hl6`fDQ^nefF`q@i( zccc^HCwC#Sp&Ff@IrPLvOF^&9Zs@q?J9?Q>5rV02*;b1Cek zbU6FtOOBxVS`S|Q>1*g9Z@NNL@Py{@;b)&gWqv&-2MI=7ZlQm;6KgiE!W=!3GCFmi z{p|BL8|X<1VC9A#Xu8>nt5=)o0u50|P2j$J9>A3gjd*YG0qQ$~J>nO0I2`8tCC@qR z@5q2;Ed_l zz7%9NR zyz)H?Vi^)~Hi&vH5?(-8YZJWzHx+vfHPsd9C$nlLp=3N&=v6mR=cPzUNGUEEk5DLJ z^}v)&E(JP4@Hi5UA~qSPLL!MtR1sYSm(iv^(Cmyw7KZlaNqsguy^lUWV8YTu?aKW;fRmmh5mcoQLJ4ZZ3Nc?$j#2f ziskhIG?xGcM$>~~@Ap=B^&ikuV3p6lk0=20wxT!F`8Cgj6&?_XE9Vf6D zr_fLH+(4!PAca#Pj`W{XlB}jxB|L14o+qBOP1tEL1-kSMEnpFFQm2%MBks0(djvI# z9BMyGfhCnLNn-o?Gf$Ogty^kZon7R$1_Jn-z=G~&2A(I&sK{9ASpxB*Ih#WAP^D5~ z5A=59*3Ik4%gSIosCe{~c$FW-u9`|wlujg;@sq(c0IqWdwD^M}Kzg2XKs61QPM{=U z;Puf7ARjupOhyGdHOf0Bjd)L66-gkW_S-(DY?!9>#G6tu0-TEmOowvdbPqGgq91u% zt0vVB%kLw-lw+$XpJ=8wt3a-dcTs+xflqBarv67FVLL~FZ)jkc-z8bk-`^kbAxjDVcjLX;6`PtSFnZ zlYy4zHacl+qsEXo6)&pO4p?`h}rsb>hPw5*?u@4T8V03tlpWV25^$IdVUh<~+Z;rrun%B=+4wWKZ0x+r(rm@tb zEj?>eyg!?a_O4!Zc6Vdz=Jf`Y6#;(Zt-T2Q19;+&6)4a3AZ=kBvjk8ot90h{c|^y? z*%CP+(tA!)y7H)vw(N_5uLR$rr}$@<<2OZzN@JTwK;yFrNAlzl`{+i9AoXVRWvpCZ zi^raL7T^2F7vM?tVf%ge8sGL2G`T2K0%qbHV*>t{CdDNh@o;nt9V*gY^tEv$?PLSQ zS5o#9{M_5uhmp}J`OK-{;7l3wzPGQJyet~=#hdGId!W7aEN6_>M?FvZ&?+@1Cvx4U z&DgY+z@e=hN6vSVRwH=ovHP*Mz7ow>uHv(w{2c!KU;V#0cj+2--nk9AIa#=J^%~sX zAZe41IX+8yz=|5p5n#ILh$TsnN{3M`F z8`s)!{?Zv-x^NY@Zna`)B!+A{f9xeTtXhKQ6?y3E>gMpdFu<|(`sZ=y+G_0Hz8MD& zoyIHgA45nB@#szXc;C-_>{(nqcZ$3-kFJ4EELpw;@sT9_#sB=e0WU2!vz>-g>0C}t zQtnkoE15DpkH%Zw1gU8#EY5(}l}uph#i@PQ@r`$1M$eK6+|Ta7M0FNMr^nIT-ik}t zFQJcME8E90AD@T6Cl&YQZAEIs6dI1+L}HA3P`h*`lHn(9W)tI90C_4lgOR}r#3v>> zX0yCsA2x1Uj^F*l*Rgu_TC88O5xaJ6#htr1<1?T8nC*)3*hBXsGn_#kT7sJyUJ?Ajb!c^f}7^@U;VIX&Q`F)B-5twM-W zV#;?wlJb?P>?!P;M)A>ek-=2*b53T2z#$3w`2o1-DNj$QVh6px`bsaJxPK|e1{<*d zy#oYhWF9JSP3@?y%I6ZZNHJ^GmlILC?SZn*QbKCBz@UH)QWhvs<3#sq7#kj?5sss> ztcZ&F6!P;5`P{e}zMigOD$OA(pHcH7#Ec`OQwA_ch6jwvRJujc1y|P-Z@vmjH@w72s0Nn-0nWX-3*;%EslP(M#tu zXE`>Cj**50{BzSY7QIr$IDR|wr7gGk00crAaI(q57I;+OCF+; zLq^l4#03;&?s=}2XA%8GCBF0e9s>EfnK&{d1UtOmrZ7c6zDv=Fr+yjDU^~@zQ$)Nk zZ^`yaDJ79++5(FG=eUdYL@zDSSv*(oQv}Ld!K?d7iD=72<-(>>p(|lnhTS40e5Pbh zQ^4wvawN6j^Bz#h*5f$NtLbskh46RAj5DkOqs-&;l&2&{Q6o z_M}yrkKFtmWJ+JKE%K@d22^LW&)S!jm1WWFVWlFl%eLau1d0FgO(4Pne-3CfK&Ckyf4i}%=0v)?2@4?@sW0V6afTdDJ&pok=12}`zXHJptRT3gdx%D7v zO8Ka%m?gcmP)WJX8aFL6QO;d-IEsP30rYnCprR}bAA9~0oIQRRRV7tuZ|T8?O&i#> z2`nkeAnj)jG`+w7J+yVU(vi_Ls4~sOTh6v+IyBDWQ}s(P0Fyv$zojH7ZN`L|eUfog zB+ya|f~g!YKbBXP(7}kIr+)yIl@+*gcL(uw(N^Oj6Gb z_xD@>H8uv0^+8X#%~OlV;@=C(hvFbB8X1j_Vk|bw??_A1Uw~C|t7CC&7J;8$`pmEF zIpRZ|W9P9Cjt-tTCo@5sYUo$4U5h*J-h=+(N$e$P8Xlj4H{ijB^-HjJZ8<8+3$S9v zYW(@1{WtvS|MRCfaP)oLvulUVh&=V|htQ^i^Bh+#Oi{H5y?ZXGO3;LRWXlzl42*Z$yBSYE#zFZ}2T8k*^pd6eTzM>9T2rkF>1K=QqSe)8Jb;232l z8UO9Ym#}xd7wMnb1K+wOhd3EeyBxVzhM_UilT%DG2bnUHu&>Pmf?z{xWP^ zzXLskLul`AL2zddMq(p~#peiuvTXr}wwF`tjB?j&%jSdl1a_AvPT& zs0vVjOdyMN2>T+aE?tsI!hEc*sYWh=sw>4ua2=$*Rrw*wpyYz~P>V&# zNBDOiJECZX zq7Eb~2USFpr0ISM8ftlN+8a|~!tuf!^sN)j$WhTKlBAAHaVlz}oIDvkO-sclX{_jR zswim+fu`H1d&^^V2Eyu$%?U6n36uto&&UjUke%a0MPUvKBOa9Ub1-!Zm8BWjefJhz zxOx`VOX~3M+ixL1I|C<=9l@df$FcvwNp!T2V)fe17$Oj}=F%(SqxgJbQTC00>-oxo zkkY!XcBpKeWd9lV#picp{mNP-vHi7G#RQQ($jO)COGRgE9}Q!GhOY-RlWaS|&%b^D z+wf+(aN_K7l;)LS+vW}E>eA}gB&+Z)qmb@$R)VIaclzvM`!* z)3!554)4d6i=7p<+?y!1YU zVYsP?JbWc-RV2x6xt$bFZB?ZxpA5ZdFW_a(wdT+`^SfEnU&c+tq`zfEC0r)l5;%Ug zND{|EB>~hYTX{`^w?!N5pTM8pRDg>_aUxA~wwL8J`$+$cEZ~IlYiqL6+13DWYNi2- zv{V{0p07O9qWlQ{_z%8<!AU;oRacJ(m>vw?=9f}@k zCm5}m)PjsTi`?jYXPj(&cn?kIs@#!9RoNZ^5Tgf;pf>;4=t;J8D4H%MCIBbkDcS`H z@-)3`KrcbLy z1gN7nZ(5D)EFYblIrQ}OvzY;c`ZRm~f=V=T>=cO?SY=o2dMSL-P?04a;&TH^?6dQm zGcKaBQVRso1Y$K*`i>2~t=pV?39PoX-N56IK7jUHHwYS9NmDJ%pM&40JXO+{UpRV2 zz%_|-I*rbbPCCc^sH>~O@)flxFDb`sKYJa!cHWI}#E+V#6@ele%|26jeAFXpt{FP* zrSPYxVu}u9Ze|`@njORX8^7@}?0fqVdb@A2Ju6YWbSZ{MqUa^i7r$w-o5sdy!Ew{^ zOTOkITI)OkQ^|nk5%YJ8K8rv3yUtlWjQ0P>_4;g6uKJ#I*BIE;9Q&kPQSJ0JlQM@T z)m6CT&Rv)wefJ+bhdw$ZfAqC4*?!hrH>^P@;6_e%4qkojT~yaBMSVSA%PX*T^J@It zKfj1a9(jUtmx)ufg|-bQb!WiqMl$76eC_f0EjLp-!lLzTGNoBwnXT^EA^=!j$`nK? zyF~>#_~_Gnuxaf|l$9;T4}bgLe)6MNv7~k- zb!igLU2EZZrO&cNpN>q+M%9j!tc9w@~yyl#%bDUHXhd-6}pt4v!bXGI+3Nb^B(M@2hE$V`Ff_!f2{V6^_4J&G^ zP*zwDUs^U&JWkq%cDG7Nr=F*7(Ly%aU+GwzO)}YVcw5c<&mJEr(nr(Ae*{NG1$g`5 ztC*Uk@+3o-5j-W$N9njGh}>sw#b0@8sg;}%FjI@Ak3~BvObLNLO9AO!({EDP`s{S@ ze|K{6Z)a|uq?hv4x%yG(b1*E5<<_*7sej7>nVRMR^1nEhnYJ?1^COw`3{<_pID-6K zf+G{uG!Bl>Jev!buVY|1fu7!Jy!q}ieDt|b~tVsrYGz21VP=MW~?5%X4vH??KCBeCpZf@ROgt zh&3D5(~}>x70Q-_L4)V@dr(==?Pt>SCV772a2*NpGQOz znBgPsv!bni{e3iWy_RQr`O;-HHa75Ft#Wpz@B~PtWUaxvQ1=kQ)E9o%m^pu`um7i_ zUi?m=!uig=;12>(3u#{XBiRH{{4GiO4;nz8!k1!&I$4TX{J<;Bkh&=ZF0U791Q;%P z$bJGoAHVa5Fs}rE-kW4J03%SXz@hS`QrJfEh$Vwl!P=(R91{tX19}{#uQrRH)IS4k za~wAf4%@Fn-bu)f=OJN^W7(CALtl_vm{p5o6#VqD_!=RkT?55#ZI-uC8&0&XF}m zzjO~xw+i^E41sE(sRWR|mux9ws;HLJGParR)iZe$UZbcCWt;uc)=`=sj99*|ip5T{ zk1m3dajPAu2%t)bWMpL+oh^rp?bbAAXGe#Pqn@wnG3%$uFNJMSUK}H9gtcE^FY>JX z6Sd1t1$+JaHCs@!anlB5`CJ^6WZN5;+)sX@vemSu67Oh{m9Jy@r*=Q}P2=G_Lp0Yt z^%C6{FT!p zY0*F{V08%8i8eaKSE8v%u0wQNq_g^9jv7BNp0{|eUe0IAf|$b&XB?C=r0-N+K_yr; zHN2#@2HUo8C2(Gb3F_m5{6che^&n3E9vvFMSHAoeoIZ0N{R2bha4cO~iM#IHg7&s1 z6y_GQAEWTmc)#}MYuK`36%~67!vk%|&!)~2T3VPvI`x=9op^;rw?>+i#&((wcQ&dQh53oFgZGdIQ5{5;3qQe!V-559$tDkvS%}>J2LV1;W-TKzZ>*2>$_RS&*&)0m)Owc!)|WEeQvQ}FM5Cc8B!K}9mrY4<&~%L!HI$c? z@>OEFLPTeXkH#>mFupIy>t-=ePr*gyH?G{Id4fi*ha&@4EvZ6jRVl*xS?C!ZCh+UW zm1_;i4ADTRvkiQT682}vBw_}(h|I(Ps~toGHZ8)}3<2iUWCDrFI6nFD58>sPzfa(` zfYFI5G`4i2r$35|SFYjVhaM)NY_$GQ&^XEy=EX)r|Cusj&AIDZz`WLZ_!RU8hY2} z*8+s{{1v@RqoUAe`%1DFs9fAY+i1Y&X`}@*9dMgQk51bukak)SAzma8Y+6@`UE7vn zSzWG8^W1FhKt*jmPM$hVhdzx8jbM`UvU}4?Y~Qj9-}%>Xqokq;ANkPJICku??G+sg zL@Wv;D5pbXv1rg1KdVimFaKu|Ndt+zLL?yL+4q`C^V4vPRsu?jk~@Hyd_wuLTq)g% zeb5MK%34uUU1xI0mmC6>aS<>y@S2}w8YBJc(29-a3F7Hw_Qz$$UDKm0SJWaeH;4cYTUS>HNyz??j>7!f0x%`j zYqXNS)9ix4+@fP6IS@T$JoKG2HtaXgkpm%`YwB1Fc=(g?mkK;9w^sB^^N`o5^k)~m zICS_D?z`^+Y}&FM@9uq>GD#zs0F6Nsb!oSiPAM+R#I0YKb^+O$M1s3&Y*KZ9Tc*~6v+tkHUu(MV@^v|w zVT5SY+PkmQmYhStN6;6a1!-_o5v`7#bTx&FVGy<_q7$)Z8e3=gYs2;lXjV zw@#s9XqaGX3iYc>34Vvs+)i*)7{)DVHw)5~{d3NFhgAhAaVKMNv>E^UZ{NZneC6xdb?0_elvcn;oqoq1 zo5(NIC@L<(bIQMtHLR73#6M<}02 zixd*tts-rK12;&4o?#>Skoi>G2Uf+EQ)QTFl&-gQ;Kapi*ni?Y`UYZ1%+NSY%;3Iz z?!Xw8n*>>mrji(DAo$M|7a7H=elO43*(`jT3Uv3*J1x@p)1Uqb*;#p1?rwDSj}UNX zkfBo0c%uy;B?xG^c^ZkSS!877!Jq8I-P`Y?0-43e9d*bq&Z2@njy?D6#K>?TnwoEs zft=}1DL_46^wuG&npbbkOLfZMEvZ`cl#!!xa;Bv<&ib87)UMT)`rF|+o@$5g>v-Dy zj{noR=+L|R?o9U*gicN4!%sg(W8z0^XB(1T@~{XjXxMdk<+vsDri*-G_v1ZmOm$1@ zZEFKRTkSi(t62tb_<4cAS}ddKCfaBkSdKrx7hsadG|w?rvbcm)(?T-fPSiyJ(uvZM zU92w>?{pUpka|EMEV>AuItHEX;b%po4UFp9e7X5?hWs9IrC5Hbft#5GiVGqH+5Pz0 zs|RrIOb?D8IER|*0#ub`qr5Q73W0CgR0R+FpGQ#qFaP!eN()QysgHh?hVlp%bvMEp zbYk=z4yfAf(1-oi!+DrGV!Mnsi}YG-D}T}g9!)<>4pjC-DHU4WA-X6ct(^=6c21 zv&Qo!9@Mxx3D6u7eimKytLYPd5HEE1_v30~1D4m+qNcbQUVhiv-A>RaG1j89G=g}? zK-)bfBcz8G!Dt-BGrv4|joM@V}1sWT%Vf6}vq&{1i(s-){U-*+w0PWaLlYvH0^FD=f)D=+;7k3I4vTAK#&vsd=v|NZ87%-t-{AUO8B$hT|{ zdDBJk>!FO;X~YB~PWyH?a*`fP@+lr7_L%5b;#rzY^o1KV)_U7Io7 zGlb@j%lO2npTM3wcVfe)%{cJZF&rY8F0ZY`eRto1?He~^L8%v0GoZ}wBwZHKUAkOxNl#*pL%sj+7DXX5i2Mk z7mqjH0#NDc0Xl$MOy__<@v(sa;>?2hTQfdt2h{~Xvmqbg_z!|Ub=P^4ycDhAQkYyx z-ST*~icEV(=4I#L;>D9x;t`_o7M|y_5-u}SaSRO%VePu*Xzyqx=ulEQJE9)QWRbYe z3O5o`ije=DsZr<9Sg1sanjr-47!OAQ=u71p8E7PNG$8Wk6v;4xx=7eGMRH~^Ha3Fl z+A6DR9t>vNVu!f}o~vjWnaZWGHN6PcwWDT4kjA#1hDWPn-N7(oRQ{S4lzCC1WqA#` zK_dD2DRj3s;d7t)5DxBplgcs!F#^G<_#6#~RzXUMY4uaWrchMqGw2J_qrVFqx2(YM zXgfA;UWJR7&ZDKZlR`Pm!H+ne7~9>t1Z~DY71iH3DSgP#ea&n%D_8{MIJMODHW2&)0mo{HN;Xz z$}tjYo#_+x)foo^NOrx>alnT$rGBH-SbnC2hkqM*qhKncA&{#Q6xZo>e(EzHXP<`9 z-rGUO_FGv1?PIG^XG6>&Du$HCX9)yqt0{|@@_RjBZn$8!Z@)Hr_4=h8#wn<8wA zK8bZo zE;b-GJtVHOMCu>@=m$unLipsbeHuqk9HCd*gGeab420xDPiJ!^IYwuxDRZ9e#UJb? zV<*~Brlw{%{^A0Tf=7I-b~>QM>s7QfX(98eA@h8IYJsw8F6#Q zc#XhJkbq&9yr-#R?XF_m`q};1Hpw+dba8=;qTuSMfmb!0&QT(kfL6AtBt#~Q+n>Q$vtBVKv^4LtVvLv*ai@a%KXl1@|T=$pXzUcZ1FJp-7fk(F+B z%}?U)O|@*FWJLR2FJP1gePS%iM=HN8oeo$8nW2bH*@nU@dLJN&^H6^i(DB{&v?V|k z$db`<2Vw|@Xt>joQNJpT2en!n`& zm$OK7IWpxUD3>jhjZ`t;kV~uEX*(r%)F~=grKqG9D9M(lE=cRK-E@Lg7HT>+jO9y; z@!S*l;mEPSi5Q)5{X%~(XsMTZh}5qqq!** z=4Yb3qL_|V4zxhS?+=kqE|W2BhbiYkn=T0KS$;AVh!$9iuPvWmTwzf@;U0Y!-#EJE zKYRR#BYhGeis5ZxqynR|mw{6blyb-B>8bbwWa8u*oVs)oqhm8RW#dWqqO7=xo?n2< zBZ#HYI-r}Am;?wm&CA2_oYg_cIGFdRXR!_HumkvXKHqt+2xRJjLge%M zEaD?Wrm0(737MEjRmBqg(bs<$Z9O;9)zfLkA+>jGPNoda1SS*XRA`yVEXYPlbvcbp z2#r)oO*fk1rcs$sj$n$<(&{@Y1w|0X=uQ3M?>&P<@4QOI(22U*WqAIh&*SQqlZcMA z6Z8#p+`(LBKkY6!np(-E zClaM#P2jV?_Hlgwh3_Ij!1(ejuj6KGBdY6G5V-g;M4@}@_2bCRDnoruB^AUxJ=$`D zz!m}>gHZ&+YPX<~a*A$`pXg_ivqgm}#mSGi4+Dh!Tca4f z4BZStmTIz1CzM+@gN%$2cHg}dS$P56YHuXa<(SXW%cJs}Pr5y=foXbTlQh`$z>?gU zWO_>msB~48t zi{NMD`ZZX!W;Jd!HjwuhFir&#BVQgmdJ$(Xwc@>fSJB)whVh9cRFve=`Itv2kdA_U zD(Ub45PnYxpa1+9aQ@tR8mA^I4wW}yKiOWTE@+qxM35db7&>eiZ;y}t(>q@RCz?i` zp4QZsfS98d<2U1y}}qAe@)LR ziZDJt$vbI$1e%>`P4S4sPinbinDs183r7jy6hYMP3*w=H!9kQ1OIe07F%d(5e-uOX zs1<1}EiK~pb5^8XdtExKO*ztRgT`EZXsi822ev_8vuY8ltxf@J_Dzlfo1w){(jlVH z49E2H)vLT_p3g2oRwRs;TQ}&Wu`ep(&hy15;(z4{&639@N1~DRQ#!{+pj^+@y(M+J zx42N}SdNbPMLenqI?rEBSxB-~@^VTz4g^`^*S?`q+`QR_`qkTT=4vO#$HwrL-~1eg z`UkQ5zQ^$T{?mB>#5J71q3LKE443XhKp}uXJ&sKq>qyHf>YfzDCdUl)#U{p(L7k{+ zdKC-zlOA$@7pS*go>Vhfn(B1Bl~bg)&XTU$D>OiGQ%@t;h>Dtd-2eFB5V-gVB99S# zgpudT#l8dk5YEg%3Bg2ast*?~-9##l+Z_9>Y7QE!WJs14aP;^gRFswDk;fjz+pqr& zS>%~58`cxxj-#Wa!{l4E(pZXJ#LLd=Y`v3q;(5~4W-N5F{;zO2mA^SFiD^vH*-X&6 zRcR*e6~1hFJ+iX1XcvlThvL}0X$$#mfby0@$E5%-zW5?RX&*lEvFC8+>~Y*`X~La* zc4GC$^?3cAlQ?$#5>B6Oz?t(G$ww*32$O!)CkxZsi9st}39wXFip@w&s@CW%>8Yrx zBK6cRGEDqUj=zEjqJud^DO$-(8C2gSPyAlaW^aE#-gtK}?tSoaROS`Zu3W>CWvlS> zxAx-@+i~dRMLhA~gZSPz|ABlb-kK%N&toDsfyS0w7G2!HK913zTy7e&>I`vyu3K7% z`|iEZ7GmWWmC@#$BTc6e^!RAY=MaeaX=@%pPR;-xf3O%KUni0Yj^bwLlMx;0B}g47 zfN`VY)&OD&FI)sX<2^$dyVVCzbOsks?Zfm!2UgVYM3BzK-|zi7-snGs$#o<_l@|eT z7F@HGp~NH_J1?T+#tlrSk7nVL#i7*t>_`LPl1EPFp4Z%b)xij-NS!Yb_0U<)?d1r>NHGd{Tnr zr_`+xOj1v&UZVrPIUdGWw07hnm5;MoL+NymoxY=ZVq`c9?f9aUiyb?5P*%LS*+4r> zSqp_c9RCCz3^&Tl%aEH}#Ahjm#mje}Ia7XrkT}I}dN@7Z$+1?>xtvceBy^(KksG~o~@gD|#QiM*JodlxcGhq`E^x2dQz0{crs}I%D-(e*}h6g7w8%r}F z7K*s2h>7Q?;}{~*oC2UuRDo|M47$HOAt_}kXVvP{lcfmtokd*OX?aZcdtyop`fI|ilLr5 zaRmF{dJ{u^y#!AIi6|k*IXz6IhnG4s@*xHYW9(@ek zcWy-~pIJr&Rg{;BmCKf3<%*?PwQ>pS>Ix}PWR4W&k*WU+mUO-M-S_D^s-Dsuc0ce4 zE;qIyCZq25qp5kAv@OM*cWy-gKnp6WOE5A@FC~_s=W+oXw`|1VNEaS>csG@g4{dEN zHifro^EzC;c8O%v3OPr~NZ~jIa%suM=;R}fgE2hmX!wEpNr%3Z!nJZUyjrxi@9l5r zkkL(OWiaXCL=$OrIcACgSJqVHnGZjOt#_`+nd@En`P-*484n_5ipGU~UsK`7ed|ha z-^L1Ttb@%`(tu-#IJd z)DHf|>&090nsft)*Nlh6TkNBp1_LqTA2Y;GpDj<0^a&(Sp*qKf&pv%G#`~KwK>l$1 zB2?6An2Yu!c{+wH3j3P+TGUjQnLv92UK*Pfn4z+bjtxV_ljHGeg1s(V$Pmg%ry)5` zKof@wbI#8vsC?ZtoMrgQk6)t0;m4;x^BEh%=B8W7%*tdN*)GbAh1i_@VEVljsZj;PZPi5s$IY zijFC=7vS$o8E~eIwDMB`ODPn3hMs3U&Xe?7e2$|_7ROX=2bD0#oPX!!r~8s6cy!SWnC@0d%Dm+HV>6U(&>tRX(5Uh!$=Pqm?m(Q(slr@ z99G@c;X(D)qQll-fl>8EV#dGuo$fiu`{_FYUtJ>yM2<%+k&X-3JCUB5XO3(Jbz)9# z0si|xd>0KJV;GsDHgZv(6eT2}XRinz(`eXY$jFo-{}`x~!1JT{Qhcp<(N3urn(Yzor7KjhS%6CQK&z{3 zuyyM;tXaE`c4yFPz+St2)mCIGck{VtpTLRZhfz{dY`|;{&AeR zd;^D0ok8ug<*2VMLS9x9o_VAm)kQtX%Wg(d!5I9$DU1yaVm#VI0H22LA=S*ypmVzf zk>E;n^$(-F_l8YLgEBJTMVTL1z*t%g@!E7;_P5|%ybIS#$V*j0q!I&E_;QdMpGUNR z2z|YM=x*ym+7O+NSSpGq+}KgF90eIgbfW2mL_D}LcnduqI&EbkL@GmQzHkv~3Ca+B ze6AdCf_n;&0wwd)NjQ1zEM9&6ZQN{b#=8gJM^jrHwr<`Ge<+NBfdPz;4BMEA|D7EE z6po9^ASq{8^2y=jON$}}jGcgnQnF^Dz3iu`U#hE1v2yh?>g0B4%g8`Tiy$epDRU?; z%cmoeZ~9PmEdAaP_15j^p3B4M`lx$l|CLvqVv#>;T9ZTBH|Zq-KL`BjZ(*NV8$TV3 z`tm<}{0BjwqpSq-1k@Zu>m=1GLN`q>U`C<%X)^5eJe6fOZna&u8frcLS}jWiE5%D@ z*Jj5m-7-tYHA5_OO97Fsk|4{N$%|Hwkyga$*)q<0mKhHIQym<;R)$Rtp@#Ja{N~M# z(cpwB*!jhU1bsyWSt}8ni{l^#Vc+5FXz!)ro2Qbd;foISA`u;Uu?v~_v|4EnxfGfLgS6Ac;k(I zIJEaPTCR5!91Ng@Z7D4;LT*02z6@>doMe$BtKiLd<%P0KW=N(8mY;s?Dg5Z)zK1nS zEAi;=P5iAN<81GVgI6t*H!?8@moI>`r?24dyLO?hrWjY68+e}xjvcv#b*t8*rm7IV z?1$*MZQC|nymZQg9Z@qsWLs1H`CyeskRP5PYiihs1!`f9v6c8E~ zzj9!-;Kz?81j~ux5i43do#H3yT{N1C-Z?9o)Mx_@l1?^GQ6^3Qr>Jk_6LwN3SRb6W zOF=k&kpK%Qsot4{%YX>Sa(-HLpPt$G%yobn24e}HybOKRkQtJDuY@A@&Ov16g1v!z|lho(WdJ0z1mZD7-NIO*tvZ@ zo_uU4zW#e(z(BMQ@1M9}Mqu@d)t2foG%a!E$0u}};DEFEoRvwu>h=-c#03(4ijg!G2yN^JqiZ`p2 zkfL467qkc=WhR-*T|1zR3@50#`5K)d5E_Teoota?>5{QgEl?V#Uf|u>X8{L2D~10Y z@TZmZDw66XN}B_~|Fq?ybd!sYqgJCHI(P_LR5d=IOmNjtETqVnqMw@Lo+b^%Q40is zX?BewOM15jGD1@73_GgNdW6Xn-z8^~BauQfXnbq!m?8TKypZ<%&*IL>GHFQ`iAzo9 zxpe+6H}~T3*&8$#UXyKYe`h+GH%}w*Ti_+yUN0qW3fYl#ROJ`Y839J=NcHvg6O4s! zCyr}MNjqflU?t<6UukVM%8sw;C)Q!|G4UJ{yYEtKk%`SK1{t6!8>oij)n9v(!7}js6`kdfa>d^qfbLuSXzci zRyhrHApu1;L1GV%AA1X*`Qq>5%&Ft>`twj$S*t@fT^IM7!N$~0FCn!{P-vTj@tUAxc`BBaq;4LY~H-dww#NotkDFW z>6}cw_VbqsXp3>*Lysacmx>qx$GHoQv=v%iPf$z;y{aY~zyH_wI8<(zN+0tc{ z$#Z<3YA1ThBjnTcWa=>|qN7pK9_3R6frli_*mo}9^HGOUvd+u06V7n4cEdz9_RncG)rfT+y(SDU59GSx#`rl_rws%+k&atV#LSDH%$YWSV&-gn9Mg!v71Xl zU+Nelca@>R6-Bo{fn+Zo%dQFhdj7L`HtR{;8CZj=**x^U-->0kCHU;tr;!=;$+X z{*Q8tl$#}wUIluUe`Tv*sch2}C8VG$`jnd+!K$@uP`;!NLnBo9i7BM}Lhy&PF*uRH z*-H&Lb)^H{!?RS1Udtb=Dak^9Mj8e>Za{k;MSEJ280(=S8AXr+n-}yVKN6q;89~=z zlmIK2h9qHo9%>W(c^U$3kbLL5dOZ2)cITw5! ztY&E$J!xm2UWbjD1YD}07J+8LfMj+-HoE(U;3oszw__zXt}H@bMGkgtTTdl0h~=x- zVDI6h7^X08-L!#B7Q~@rr_nPsiL;j*sX(Uq{2?n$45ICkyYjx(pv z(oncaSF$zfC*!I@zVbB90F(A=oWQvhkVXF}9BQYs)C`glOHvu7zDy=N7@pEbCze`B<{#Os}y|1{!r2MVvJX>1O;D-dB-mOwseN%)%Ex{W#8?JYcyQHydsu zO6BtQTkm6hcoJ2GW!S;7@DO-NdBhUq7^FAZ(b0}mCy(R$7Mdf9XH1+~u zig+2AqrA^hwsbG?g8+xXjGnJZxImXy_i7r0cP1F5u_F-Df+DQ|*2;GWjEa}^I2%2_ zb3EBDK~Kqtz?up>#}bps$Ra?Y2R=4AMj)oPYt^gXX$q-da`Gbx@f_V}cwmzHMkO`0 zV~6t;XDXJzYP>}gUTV31{3qi|ZKbAC0ZZ|w5irf8ud4@5O>KzelwvprboNaUyz?27 z57J0|Oj&TT;dEd%m1_LMd-49xc9B!oCq)mmvjW{!8U)3FsK5As(M?mpia3jwk|*(@ z0KX#S3q)Z(b>|E(wdEU`QN`zIZ4JNPyI1wIj-OOn?FT=cRTj&JBs{*Y;4`Jo_f@c<{KUC zmj|J62Kz#=9;Li2S;e+d&e>j-fr&&yn268d!o@R`(JZ!M4sY{5V{|0f5}b9lcOoH& zl5}^rNu$$E{iIYOF}3#NRtm}7thg!#8QGcGy?ZzAzyBUOjr~}@d?||ZbMVs3@1me6 z-&Wur*tZ`=nT1%pay2fTzl<39?Q6gP2k0SS7>_68`#*UN`;VN0pH99a-I}3#@{v2S zm9jY6-GY^?Rv_6ELRNk;stIB*pE`%JxheQmPn2V!a!~?$GUh4`q&>`23E)#`{CiaP zWq1PpZ9N$189-KH4l+4Li81M0jVnPcolmMO^5ZzF%CoR#RV|hjWY~6_2TvTucwz?I zx9`G{Lq}0jwglI&w$rgZhc^%IhdVQbSKmE}{rk`2nP(nAPACamX@^#ps#*^iAoQt-u(tVB*u6tVa%%*7|!mk2H%yNaQXQ4I8skoJC#(*#0F zMe>KyKNv%HW+n16%CIE27BlVr$mX*!-%DPafGanI$#6Pa2fHy7rDNvzz#UCSEx~?S zpo)DZe}?n0d;Ko#T)PqBxgaWXa*;u2F(g>nFhKcEAQT9rk2*wE8`3=~bUdk_smI3Xw5ZNRT!`igL?sh#?4&U9XC z$~<*sI=|0BJ{>FpJI#J*5s&hlwNsIc_RQmn5dXNz$BM2~-_SYG-r0)w3G8X?omnXH zvBX@T9lNZEpH#QmtlO^-a{PxtpF*7m@c5T08!8%`CehzCwgP&VbW1^&VpRCk%g#faLlHhD^8WAW4ZW6t z7iHBoSif}#Jb_G`QoY*HMemHQO;)AuWDJc?qkkw)ZzPT0m!AYyA}tlksv0b>E5PYf zZ=O-Xdi@->Y+8f+_S}gj%PQDbf(s7S$52KZI zz11;Hpgn z46a(FHYhS=%%y*9q>Ng+OF(>p(i&a(4=nrm@v813|nO zPvA8QnUkL^`lB323YtaDG%cOr^~rQDQV<&*wc1vNMIrqAk6uC}`K+sbhybt#D^@Q@ zNqHWQoj!z$+9l>BL<#sVoji@3SFhQ2d7}g&+I}#3A%&ngWc99O$g}hE;mgdyw_o@P z_8mS4cX}RDTmdw9^kOnTMbN&AhG5d1l-k;Qy#D4}=q+N4j`c5j zLS&ax;31_X1tn0ZojUZR7E9;}I!6jkpi0xLx~CnykCTTepvN{_bDTD5?DW0rr)hzQ z+LalJ@Sc;rJ^`=FgwWB;qp=jv4h=;Kvd1t%ux$K6)i32q+@;%zJ#DP*v%V4#w8sg6 zDca>CIGsgr=NQ^MntAOUKJlsNF|2%_IQfwvSd{?ivzp!$y+vz6U3QOh?L5YwImevjB08H5m&{Rx|GsTZ$t_*`@o%_R$3 zghZgqU$sywnL0~lam4G2Sf(eD)^no>d(#p0D>58_YL|6%wxY7U1YO--q#X_3(2$LP zP9)b-V@{tsh7B9)QCbnfvX#{s(uVf!J?J0k;NN%S$bt8%U*5oPeEFZqZ$bRo=`O-HPSZ zRcUB!ZZ=1wrg91L3JCC4EyK{jAcCPV_P_HEKKhYo5FOQ+6Xdt`p=EFwO>EDPUwRGW zv;*Eikiad0Y0`0yukP-C>e4#YE?j7bWBvVx2wAqC1n|S;_1iG-Zf4z<-#n1y-j5c{B!Kb2}T00 z1$^Pt&*A*Z{V2_t!?Nl;TNrbzsRie+G$N<86yp>9`1N0V4nO?&LztkgZEk6@@;aGe zH%fB-=(u?k*UnytCv5;Zg&uTt50RG@C|O4E*^R2wS$z0I`IMK7M1`{Cf<(Kpuw1=*G-v@mW4(W)vB3t2Eo{@@lMIlY&ouxDJopy$bVj6%QZ6 z#8@0Nv=?zCP*=4S?;d%B^45u!`CE*uXUCKyP3Mqum!9MXp&I`CtN)5O`;TCvY7*C@ z7crF_gTJU8J#=>Ou3C*dt2ZJ@y4O9m3005R;bQzE#+pZY0G&W$zYoW*Y1_=%lm(kg zoo9cvKxt%T+*ZuG__}iWDlT8Vz%l7Ve_y99=%8YtljFw#`9LeIeO{t&0!HPdS5=e~ z@NGg5c|f30IEJFldjWamyMm$|WJI!T`c^4viWmm{A&cy~=$LC`0Y!q9@}d+pRZx(Q zm9ALaX+sXAY?=W;IegNQ9EZgzUjAw4eNe!smPus%R9L?_5cnT->KE4s5RxL zRjyjOBF|V}lahq%RxL;Eid7hqcX+*tpl66eNzaym$~N*B!ALlTGE@pdd#9?M+G0(S zL)BrsaQ-|h%c^kk+zm2%It?uakwzmyaH)M!4un=ot1(25A4P9lLydr^Ac7qTS9L)3n>JHbM)>+8#4-N9AFM08)M2_U&>IJ z;ceb`q}LK18ACia#q(sEQ?PpNT0HW^V_3Fs4US#9j5qckB(N#MjxF0U zKG2DKw%6lxAKHVvw$vg%-i0&APGIZiJ8|OFDe^?zjQ7|;uk9nOI)h8=m!Pbw9EXk` z!@s@oIti3TBPI*S;bhxv1vd?_45aBu(U6}tt(&T7F^y@OjHddb^C={XK8xm3q%s(y zy*U=Qg-3#yH=eYc>f(-J$D{6a9ZsJ)iBm_9qT%vo8omz12t*zyFR1&apYzS;yd#Mx&jJ>`b znr=Ev!Y1@|wSv2+y_>wW41OP-kklED>r(7}?>%(1ci}g__(dwKZd{<^3IswHU9Mjr#DI!3^)1@yB7Lv>E#BKAq~rlzYv7XS z=^TMZff)mm)QBFBn+je9aHk2@2uftB`P^BJVXAs8Aj$u8{0s#0CF<*bk_|-)Rq81c zj#$o~R`x2w-wlvDH%95m7Btvx7Fo%5s z8ubJ=ZY)I^9hvFr1-!ra0O>nwr7t4cwfOmqKSSg7^Vqg+4Jzw5;%DFaV_dm%opL!% z=O;|(Xf+;qa1+O+1AqA!KSVSdge#DNk=Ov8E+0WhA=^nOJk5{qeeb8(f8ZF7pFW3U zr_Q6Xv6}!UL7nR+oF>SaNwM7K#+G)1%@rsq$VYQ)yXhm@2H6)a5Yg<>op6U;%^Ap~AwGNNobAToq0Jef&C!11zx~_4h3xDsRMyl31jCp4>}zcU zN_{!cK8y^Gps_bWfO!Mi5f?uE)RUCwO*nDB6`f-fNTO`WX{Sc!vtxMhp3PWUn`isG z=Y+hdpi}+M%kL0awqf;(8ajbBJX6!pH&Iqph5h@Fqi=N1ayXyR?ikTQ?B2c>Q{(;Q z=_j!Ny@S-TQR@Clj6?}ylU=r>M}J2j9=KyQ`rG!w@1=v2I)~}GX#yYF+$s{G0(r$% z=o;$4$oLdSV=1Uyx(iuZ>rqs&g&-}PHp^r6=x(-u52b~)`EG)*^m)|RRO8IyV|0Y+ zI3_X>pYF#v+t7CT3eKN+hq|_t=d8mR^`%fUb zWdg}V6cPV4BHmP_(%x;Y+JLg`3UtML(Hn|k>2q5!dS!t9=|XtU3nluwIX3eu?LuBq z>9c9ta5*roEiKfc%^05?VLy8*K$Jg@cScq&}F#p z$49kY6+DBBZ3dN( z(b|F1f^y`9!>Fz;#;McCNH=*hE=*9t$*8J&zMwr>&6r9+Pb0i&gj73AQ`_48LmOes zL)m`kop}7&Co#>ozjfdUPF}b~MfMbidwP)TPsPR+mAHGya_qWm4c^=TCcXVsdhLC< zdcKiBDuBA$rL?`%6dW&BE?UITR)RtwdBfTNH!a1BbZ-bf zL!;>IY{h2seO5*QW0O(TRM+9yv6E2}rG=Xy=UWLM`4Z`@D=$+ymP(`W1(K1Q z=R##=3O3U@tEeo-n{U2_BL|OS+twYZq2qY|!WDe`A6`H?!Qg|B>_qKK0>1D55GRgY zM>v#`N5kgE?tXob`gQ!5VR&C7|FNP0k_+a20H6U51(e+ zsb}eA$eHl^GC1s73`6?TS&Gk625E#ftW9lA2xsME*Y11JNy9G3LQ`m4wr<9*d+xSK za((S;G_|zi@R7sVefJ*9YZz@!Emos4FDsk6dK{t5AoWZbHyRu1xNXIM|DXSipTBz$ z3EB?n{MqRd+_7aTo_k^^DvHA>&Cf-Yx>jT7@n={7K{GPiyInG^QeIv(*^XO=T6@8e1)Y(i;p}KI7F}w>XsJxbNOQ*t%mk&Rp-nJIAhLkm}4I&Y+W}3XL&d zn~SaM>fj;pyLs^h)-A8VTx`TP=Wp(b`T|$(0Ii0{OrE>v8w+OD&X0Yb-590OMB^;T>KF3a3ppfm7Z)o zzW!lk&qr|c{S$bsd>#JclYfZG)@cl0Z^vB~8*q2!R=CCkl+PTDx~I|7(}E=0>8o!Z z!_+_=$pn210(x^3($WgwvPlNo$hr2t8l{9*O|_|PN6;OjLQ10NHjMtkL5z;i5HRI% zFtkTqH?OCMLl8o9%;!)x6q(^Yg5eEW$hvkLK~bX;!k!>#si8V`EDS{Onlt}U;e zrPfr)HoZ*Hrk1jeGAhakl;KbfCzajMYS~neqHBIchZ6)u1>j@Q(tMeWtb3{q1KSWM za9{_ks%o%m%QmdpzK$MG1TVkz9{kB6R8kpiT2+X<@2JC)ni8i_DM6j+WQD6mDbivQ zbc$|Tim%*7OCIHUIs`pbM$41zMj*KWrB!QCv8vu8n#a!l41fRke}; z-r0at#~bLihH%ea>*y_p@b3F3QIKDO>Z$^~_!>RBk$HNQgV?ZYB?fzYaQRvTmaSNg z{Hy>y+e!l2DO{#^u5IZO2_bV$kI0bFh_F2Z>oQ2%{X|nmTCJvtU?e9S4?cJwcHeg| z704)FdG`qK-GY!Ogd%qs$s^=%CgL;U48{tT_{?FfbPX*}KL5vkPCqkHZ^^Y!xtf!X-Ak3NjP z)=TIc?nAOaOum`j;%309? zjyd^L`5Vq+fmFmN>2b#95sF0cq355%(p5|G!Vlj-Th|o5!Ymp>(7>)o51*rH9;GNG zQ+W*ZjiIHf6;FFWGi&0`nQ+Y$_M_i4C8#$ddyS z6cV*49hIA8)0Bp>r{1MZIM!5(NhG9nj1-X~Y2wv!l{uk;l5EJ(8r$+R10I6jlye;d znOc-2plm>g=L*zo)u$qJ`c6$zxdbxT?dMCG(ZDGBr8ZHASeX@q8?{&Mvh(;)yg4}@ zx7-@>roL5l(m;`(&;RjK13+`UkFMv9Y2&aM{Z=j0&l_t9X@Vby9Gw^G#A6yWf|gZS5f`5vk(EAYr84_je+ZOPZt+>D1G zy8~OcZNt@T9r&yN_P1znYsdQamALobWhg5R1$Li#>@kEr9vbNpT)BSEa-N@m`ork&7{EIRj}ffT zV%^3a7??=Hpa0FbakHZvxseRy&?zm;oWy*sgM!!GpFS$S#y zDfIC9;ZQamU=W1$VBLypJaqpaKBpVIc5EOJ%SFVSfggPLCkTZj)Ehw*)fQp-@_O9A z`$1HfS0j{>MO~4GG*L`*+|s zf9-2nw`LQj=HhIxpCC6*o!5@ZiR(zj*}1til$X|{t7jZHn{HuA?VXh2OiYf=Ag@Rj zCzg=Mg3vaXZSBYCbnYcM>P7XEB)BP~ifqlyxiHW*kE-Gas6Q%jxv_^js>4#R=C$}L zI)*?+F?zydXj-@lgwipS!zG8^>gCKllJ>eVWiRoxQDu@fiPP8_G%v7Okmii;#mvbso#q}Ursf*k~i-h1yD%wPte&oxXyv!_)JKr^)U z9gzf)#O0Yl`rwdA%$_qJ?F`=C4E~3Q9SBiLBl`9L|49aV;q|yk8b`!KKzzwo$>|UVBHfmJ)fZhl3 zQ+UnIVC8?~_Wwxw2qWfM|9M~Ye4IQF9!maKJZ^W+&9bU&^W%S^7 z51I<>gEXLtF&FHN`o;!(&2N2FPJ|ob45?|!C@7qR`1A}q_X%7nZ!%dAHIN2{dozwa zC$B-yMB`@6TCt3*Rp-jfj=9kw)h(jyR_4d7K%mH)Y~M)*^d}K)YHq|gzWyTj3&ilC z1Kl0Hh>4BH!WFAAZ|QR6(8$u$6S05aXUNIS#gfH2B!VGWy&@AS$)RNQyka>%UWZ}m zY#hB-;~MABhZ!VJrIUO_Kt&GBvO9DRK>?wN3?X65Uy8V#G-xHSPxrlvfB4BC;pi6! z(b3$Cp7wDZJ9?Vu3Bc)77ctuBLlQE9+WH#Ye&=mCdg2UjH1^^`MH^;ZHf$(bM&qi% zkG}UbBXb(ZiBqVqX(u^di1walQ&yq1y$hWks#~Tk1_72v>_=j)l_Zp{&^o*h$Cx2a z8JX$0gXfvMU;(a_)nMPT5;V3A(P`STdf^=8#RucdPwd3J#R*h&6}@$#y{!w0NvUS$ zrIu?_Hae zX4vljo^dRin~rUpmg7eGMG^%0V|A;DKxi_N0t9|$GIi7u5(&phHzr00pmim+RF5V$ z)YsLbsj(h?J-uGS#2?8>HKxtfV&l<7BsDJ0<#ZrDGa0KltS~zE!iz7UWhHb;K)s)=e?ePdoAqH zX4-(VR~rZb%~(ZY47JR(yV(sHZou$e2+4H!X;gkvhHrDgauX-DGFVD~^eJgpZ@_DdqiK%UPuDtLUThe0IG z0bv;AeO)QNg2x_t2=ivoF>9@kF(@5oAlKbBh+u1|>B>EI;shRg=zc6GhA&z$-^}z( zNXf>jGuLq8S_7);w2F%Z_wC+*zxwu<5g+2g_Ki6x$|J@QtL;HyIB@VdI{JHY`)xZh zJ2wNtAyH^*ZN*fOU5#aIduq}_A3)q>n@v;30sdBA#}L{(Ix)%sCxX7jLP8K3n~p=L zE}@nFEHo;?kOB9^0J3QFUw`2VxW@W%@#G0CUQh_v#3V^q58K{~OINR&@sigoDoEff z5gi>38%b*a$P9Xh{ZL#|N@CT=fIkd>_QEqb{>5Q*6MHrJN%eBaoZ}dGI7yOX&{W@v z&h8FO5%0He-;7KKkHOrhz4<)GC)#O~S`&K`y&Vi_uT7Q)>>hI=-r!Rj0) zo({qq9f~2}G4zjiVPbF;=`kq?oAg1PUo7H+6O2y#QLYojW7RwKOpYNbg4kq_$B4y_ zcdCzKpYt3hXH8>ZtOr9iy$Bi%K?Z{ho4*C!ecfyi21!&dKT{i0VQxX#lDfgRpvyFklyp#hb|<8mku^5@G@xE#wfO zphaa^NbWSAPn<+;EFK^X@>SqWUu(wb8eH~PXHYMQUJKK_**+0Ho|B);y!E-4iz8Awz9^XRN91ukQ>zzoz z@QQ@Z*Nok=sKyPQtpQhcr4mF`!a%k36!ojVT3C3rxn`Yfl;<+JKpL%Fg9c<4mt4i{ zdGkmNXK>pcw<9Sn6_)T=>^peKEU>+D(E@}A1u-JDGs22Nbfn5USTO0-m>#(r?~+jR zQ2JA5&k#>N^Iog<7Z{$jptfazph!}1xfF+vT}4alD8BW_f5Ok&QCnM1rPMeje@1VUrmJaue2j8- zqmU$T>utLb5f_J3m&$PD+zkvmW=K}Tu;;cNh_VtW*DprV5{(yfIz?+57ij8)O}Q|yFdtw0+KYJP@q5wL-^M^E3U$2y zl`9Ic=g##goSld`w%?q*SQ3+7I6Xe7tZk=5RM$W#b%*!IE9z|TK}TmV<}EDXb*h-C z2L<`FN%St^(#1=7@ue5|TL;dcJ8LpnnuV(@t!_)>pF|`?_C&C}K@sm$4C!AtukDKL znc)%qPIbgovPBMA*$fR)5P1{um~tgNrZz*q43X4lB5NXCrd*7U#f$b%Uhp1Y$2IrC-^gaQiNt!zqW9T=)xYg-090Kn3SL@U+f1p8 zxTq-Xy8Skj9gU8Pz`y+SKjXs>-$yv3{9U)-fi2rM)2W7|t+fTMbewG+{Wx~=w9%=J z>sF$twGtHQD@Q#=dssYwHZGnoHn?n|lM+dvqK=rEhS5=ok58l6LMR_zpHB>SY*~$E%a`)? z1a)zcSUOF74Ta4Ti=Y1ZH~9Hae}Bm>^Uc<@mD|iJA~7|H|niZ(5 zsNua6_x(a?nOY5Dm;v7^l5;yw96f|xyLK7*X#Ac^V%)fVk;n5;|AT1rVfgfu_c3qo z0z({XTRU;`at->4ZPO%>cDn~TDPef({yli*XFtc}n1_U>5xJ=`y!KI~X6BIajpF>3 zYiMj}!-e9@n4TQPta%Gi(a=J_#`fh^v1QCMVSx;^e9X1jOjn;)Qt2NZ#suwT#?OwS zQMP3i37ah#D)b#knLYZ@od~u1Vz{>%%NEYV=JlI#>f{;v#}UNFC!)Kz8;h3A$DZAL zke8E>MT-hi-!zEIx?#Nc*)f#WR$}FA(gzOlAGoI80IDgvIEk%or$ZX~AUkoW{4 zpT0de!GYada74>as=^mid)ffw#0e3A)qbOGc)phTZ zPk_3j1bjTIoU3DekP*@#obEA0Gz5KO@ZLIjzPt`iG|>bEHAaYu%yoId9{q}TqLC?@`79#85yRMC}k^V z&IV(nnVEKSR0Pi;KPraHj*y^ulFB*AFIvnfFbdUm#dzhFAK*8?`4?QfT8GXql48n6 zV+d3dfk6|3~54C--jjhG7%ROL1|4v%icH`;b|t8)=m{D&Zl!& zyksRpBjRx4^g;aH-~AJ#@JmL1S(#~wiVk5^>W_)ZaT48rkW-N`@|QH?6?8E9bJFqg z-hF6p?!tu&Ww=<;ibH2=&@;mJ<2_B2NVrI7=jUYN*~d2_j}dQPRv4UGDkv@*FMZ{4 z%%7c%{_Zw3@))24R^|NC@-p~RKNc-nifdO&=nP$qEJ=Q;D=NVO1^}jxAxXocd09wJ zjYWA`sWDEKs8G9VQ105b>&%#`N$Q1kOcPzyeXwTjTHHy%efIe;qiETD61FBBJABl1 z^FH*@9wf$F>9Ad9Mwux|#NS2`jKhNHz(|zZJKEr)!<#llK;0D6bOK|juWv+VdIloH z!r>xtnPsDRUBzdM@$5^_n07vM<}97HmeQi0Yp8@sg#H8~d@UW79h)vtZbnD>Qsht* zrqr#ki6L4y(!0xyA#CcJHTtbT8ltl623TcF+-UXG4gJ825#FV=_>Lb-FE#W*ftbj$ zFyq#B=ve0cOTk|nLTA!Tbi0o*_`Oe zNZfJT?RfsVXGmt8c<1f6@ZtOK8}QyuhkEy2cM-hpXm0C7XJ@NfNu;#073a!YFk_9t zki&&V^XH*3Zx(+4&Ig!q`%yNLc>C=Sv3l)hoG!V7)tk1XZ+H@W4;&^j9;JhxLn1O` zYS8%x*hzi`{*;-rS-fuj`BVQW5+g2+shrm6bM<;qhBE;SSe0V)=R>5A)}#t08Y3)m zt9wndmOdJZP#pdub!-!5IJEpz49QU-gUr6JZqpWOXJv)L7+@zQr=X>+8>8bSNg-hv zb$Za&JC42q&E5{;x$FoFiA7aaE57^PzalXX$9MnoD_FU5B`#mOjsWUMWJDOR!5^1O zt4Z(@7)*zwsbvHK!7=b>pb)?S&X+-XXHP$lpDacX13Zmu79OgWqO$TzDg-cqHZvND z_evBrH8mnRF%=Iy@F0#IJ!%5m-0WmLa{EdogazUD&8ra;9*pD1zJQ9EfA+~<40QM6 zeg^FI^|h#|tia0Ut1xd)5ymHc@#^pQUTxqT5<&r8Mwn^q&5SOCvB zNm@5*YC3SWx*D0Y7owOxfG~#J7$g)Gtwzz(b!PTzR(2MyUcO|8Pim|uy$tWuPW_Wp z527xr3Ip|=?H6ndW&2neIE9Fc9Hj0av zuh9l)kd=`LOMsi0cLr%G=}1eRg|dovjJu|B_Ucu{rzH_Lyh#;Vq{fhEXQxy5!62}h zpHUa4ENJK$!Jq%=Cm5zm6z0d{;+bNUovp`L;dxH8#{UA=vNN?zChKFa+ z)HQ{naUM6&NunQt#I$BY=TSt&X$EirT++W8JAGa_1LGi^K3a^IUpd2IIt+ci3^FW< z2#?7}kS(2fYD0W%yeahUH{An2PcJeOQ&4uXk$9-tvDA0o*Ko}!#+$oQQF|7)@QA2Lj17+(Y!8nLCjpM8Jx(JzJsqKJtCWOja+z^hc>M5C62jDEL_|g* zI9w&if)N~IHyJ+l8rm%0!rLkkZ_{KAl09YmOm>g@poifBBzdOyhu0$<)A!m$?)0Aj z_|X1d;wKn1_<9o$Z$1C_+-{P-o9M$$aH{_V(sB~KBrm}eqx;v-`CeT#27Aqi-q+mS z>j=CTYKEKK{Jpwhf=L>DNU$`6wyMwN$WO@bUR%+0=NHw%MlPRhi9}$DwckRGEPuz)B8&)AQKE{k&QU|-T5K=77Af54@ z!trwrBxyYunc(^9oTeO8CL8J-pf*$25)C2HTV(h0#mo4?U;YKkuU#U*Td@27-6W$$ zsBG`VkqhOF)W!*DQLy?4BZy&=YK{5&1@ry`arr_iR&w7(bMvVD(h8mEV!fgVA&-L04m0LeV$c@12n~F^yRn3D~|e2c5NN7*WO|G-w*@ z*RRBarSoy+%4M{-XzWoD8ag{r+gOgZTQ?yoJrf5H9K#o%eU2Y}?>lgg_oA_-%{U=l zqXz5;(n)F@R!u`4qQWAPnHZ0@mJVn@t|t3vOjhB16*;Y=?y4|n1U7HofhEg}uzXDs z-g)Oe4D^iQ(%B0*_}KyKq(AQ1wS|#m2%VdjG*VZ(4?^f1o$@dQsxXT$GLj<^7#xIJ zUbovU!me>{JYRq>db@|w-q?+dq(nqT5M)SB^D+xiTh)vsyq~Xr?IqgGG)@(tAdm!@ zfyK&3iV&&0%@9A@s#Y&Bk)*L-FBnOq^qIg&`k^eg9;(%+XBmN@Q_5+&T6s)k7AC`_ z#oM$Nlu$`x{Mi;(KoV1%E>w^%{-Y*9#@OB05kWL-uaE@OgTD zW-v#;;JJh?ramBXL-pF4nwv=+T9A+&hkNh48}~nO4{gqdH-7srjvPBlzz)UM?c1?o z^Ey*guBo{RJ>A{t?dmcP+(P|)>V+5J7vzKbx^k>vwGjN~k520vo0siiL-^4_J3l`7G#h8P^Oy2-3B$z%v4CFMPfburMDB(nu zO+;Hooeiw=;ie2!=E2mXq=QhVPn8KIvq=Wgf%>hwarr%=kl*u1YzwXUq2H@3*pJxg za11agS!T*N#gO<4FVssw1*g8c7+Cb8qT+^`Xkpgg4NErVt-AYM=v5)$J`c)nG-BR@ z6?FWYC}%(H{p=h*+h2m(hHk_pX3=S8k*vj|v2h$7T@KhnqYz-Rp@Sss{DmtddnLG0 z(ZKUjpQtmMWvqJ`pKzFVlLndc6|||I!7&EU16V=(nKOSr&R@EWsHiaH=fz{g>N!|2 zYZi~~hx(>^?7aOB%D#_eFq>j=;?Mu|k1^QmL}f)2+S}UM7PVNnX*2eHb_(Z+Wh#?Y zkQ0TkKKnF|?EL`gF~LZUu~68Z#*>Gnl^a|el(4=$HgqphbK6VpzTzPm8)@S%U| z#?D>a(b>^~<%vJ{_A{p=yxip4+t^0y3J zD{1RiXQ|WL{4q%c5&mBa2VjJ~zj$wR|Rz_cHv2-Cj*$r2J9j~dE zB+eIIJr2ah?xD_ZfonLO?V5&bWnFmm*`HzOJwL?Ys1=Es3lI^V1AAaRf`~&EWfuX* zNicpwUBftRB!eR5$4{O#Gq9(r(>{%Ew9yX3SEM6geIh;|J&VfeZVZGwajgA3c5d5l zd`pP0m9`!X7Y#_m#ex_}`AyT8$J#M_VJ@+J6y4W4U`L1{bQ9{eQIgy?jd*p>hK8B! ze6S@Hsw$va{K`~@+UQR_s!M7yOZ7#?#L_0h`QB>CoeGI--CPZy(bz?cnW*9IRS~Jv zI6igj-XeUOAE3${rpyraLHMYwwwLUA$Lx8RT+>)SVgl{kOz0Fw@;?Kk|AV%Fm+AAK zg}6b3R5UIC*J~+&pjlX}3?83v?P!=DH+4T45T_yYBMs!1i!g(Z`MJPNb=@?kM>7J) zonxq~Z^F@&7ZDnj0jG-qMj;5`lsY#AiUJWV$ie7ZG)6{aKtzfH)P3tir)km%PQHgB z461;wt^yS%wbJ4FlEmqHR0hR=nuL-K#FvJ+1QDF%ho~`#Ccv+rm4v%?F2bs%sdNTb zxF)@s4LyXW8f0m1neT^&dQn?j1}ze=*}qmb@{9*=e-#;?M$mLHte$X0h9x4aa1r7& z)8Y0R!P|fMC;aU{d=sZnpFvXtm9t|SLj!WKybL;nK>iT|;X|^Nmy?bA9^8YcU;Gk^ zRxF^L?A}#RL_R5#TNx1DtD+FQWeS;j;V3?H1^#Y37S74W?b{d7;4Z*35oDZakadP2 zHcIhEkVsolUfqaq{@Jq#j1I=9$8Mmwq=h7y#Mn2S^5(VJ0?9?_kQj|m5yWQbFhHWc ze10|-7o_6i`BS*(!N-uAl!@qw1k7D9AMwe#Xzi}W&tLutUitO!aJ94o>1JOmZmiH5A8BoX4xLzD;>pP1|`KZUob4zV$~> z(ZTg2A=-}Ilt^q^or{jvD%>b*#1uh$)yfTc=k1TFLqXWEVIx{wn()bof53OY^*nm} zCP}mpAT=Qqy)E_l*+2dV%7oGLg%Ye^yOFYW(_u9m5YUBs4bp;(m#!frC!LNi3XKib zn09ebryof=<;j2~Eh`Jl*YCpFOAYWauoxZc!`z%4lQlbg=@O>=19|-Il08?%Z431FeX+J!c#ovyRA*ZRuHLD;OafvZz zpt#l!?V>~4yZ1A^@WR*3c#>l$kI^0iX>SqcI%ep6Oszh^O~QSYfyB{LzqKp zUy;5kug%>&ivUx{k=}dvAr?^&Op$hCgh1Od=Ab<_qqVh(KyAbG&p(45+qdz)r||o? z-oephrx8t}ymtK>EMHNCy!>=@_Ovpn=s|D48%IuD!-(64&D*x&>ZNlC33OmqDxFA* z9jh0R*!a3|@Q8-m{9fRXeeD5!wN6n3Mh_VOZ!TTP@ zPhWczH)=b0odMKKq5|zyj=*$d^G_H_VbSpU;QdJ&1~)~3DJQ}KNm76rq9R!-d!%fv zuvT4Ds`aPBv6_(^Nc>SCsN)GM)t%hl)PPOv*5K^P6K1TlEtuzKn|8K$VPtR|Nr@>8 zRvjjY?k35puWUqXV+%S-e#dxRdq_CaGIObqAs85%K>rAX*N7zK&0UPRq*>@2@JD;M z2Qq2*OaNhF3Vr>}r!yRX_~a7|jf~>*`HM)2OvGRR#Sd}kJ@>;o zL*g~gz$q*Y!+fp!ce}T2qkXBmz&T6@`;vsq(c4gR<{WI4RbyQRQZv#JlU9I%F_M|y z5j3h;a%!3>kF;_9792lTjA7oxKmXDhev~)L_rADJ;k})ec3!?+A=xuI6M`IU4V@Pg@ zFYT>^3`l1X8tF^<*m!(ZPna^ZfYoCcLcM5c?4)jNg*_sNI%vn7xf^M-0jB<7bfU;o zEMg-wNJ49H_1bF)i@Sz6l5W?O!%R*K51xb3zF3rA>tfqENuI|s*#h*F7sQdc-54W| zvd!GY)~i>~VQjJ&x6j{%M0+v@sYjY55glYhLQoi#5f~XBLtkAZrb)i@Q)i*!d_8=q zm!`=6^d#*jfUrT_nDK`-IE+Mh3R(j_F)5A#eVD25r=G*esBk1FYNAFY0|gCj2_cq- zknpL#YPjj$(U@m%y*&~-J~Tv3i5F$-^&m#?Yk-Y#4X_aK(hM!ns)UL4jC z5N!sN1qH+cJ^zo~d`RTHXEmETX+-!4u>>FixuDk!AT~gw?-;v?;L&(Bqs)vQ;=Uqx z0yL#g1xOmJqHM^7O9S9t7#|tqaohxy5e$zG;6m9AG<8m*xl@s!R`bw|EnSKdu>vj% zh+tu|2kKU(Amo&%rwB;F{&0>AlJGeYX7#e|NnV@IuN1YvX6g|&9aLV`Q&Lx{FQYP_ z$PhArzGmY`@Hsie2lKO|F)u$AVIh79=EG+9HHBbDM<;lGHW(d@WS|+tTEkV1H9^JG zm^H03qH`-_D7R|$SYfwCA}T%&iFp}DqKz%r@c#R+qJ)vF0`2iJWwnOr^e0SY00NW0 zhmO{*bwzDhxS$Ys-gz5l7v{p>?n5}FTqtLgHsvMdzp4_76Y7K>Hvav=#FRtie2A z=B!Ktbu(to%0q2S2j1UTVrG{`g$CoPhjyW|svL(-mXLV55yr@2#~s`7{-+sCS(>dxVZOz>bF=eHf2Dc`t6e_ihZhlMo!9$Ote9kL+HH z<#Th{R&G?0T()&~q4HcQhWiKbwdbE?#IMz38Y$ZmOt5J+0}LbviP5=b_}nd7L?O8eJL(S-1dm=?t}`qWS@b#z)ZH z)nka->GS1m2OmVmro!PfhQ#my{MDa6i?WhKNQsR^ds{0Ge13$u5RMh=Hy|&~j?@?p zIq{)$jl;RJcDSuE_|=;qz~dKemSa>w=TAR9U<$+==T96|{mm%`jlR4$$xVD(6SI`z z){=}Wo8&taWU{it&p>r`G9vXelS0^53<^{ROXHZ8QPKf|_?cG4(O6Ptg58vn5Yl8+ zdCoBsh%^R@cWqmTzy0g)Vd=sJl(#1Q6q}{V(o#qUdU_EW5dtfT*I@fN`Ud-n&*KQP zSr8i+OZ$y8gPr|IjN>^^o<@6hDN+)mVAi1~7FIU2;E6BY2YYA;va@nYmeSy&52$VE!9Tx$ z1lL>oNNPv1YHoB0mNIayu5ZEq zeV^lj2k#-FY{i`HRJ8Vu;oyn0roHDBCN6iiBl))Fs158vIA!W+ zbz!J`0MY3&h@CqJi<4(#N!TI`V+eyD@(9m3s%t87>D*{c6za2S1Aq|tYa9wv)Nf)~sOf1`Yz zR@@Px6M?(cjVs*K^R2F3FK&v=={w>T{j7c?jPw#c5j%DHDlpLIC3*id$lk5(zc_nW zSZiWyWzuds0RjB2%{UAF8E3%%bkTGeUg9TU6DbiX6j|i{{4=x82!wvq6apdKV(}Km z9iSs*tcqzr3mq+wXChsVcM*}%Rmf4%Iq)>zS+L&oiWzI_b_fC4CEp^!TSCa8tON{# ze#o9$F$Y2B#OM;V{oni)WfBfD-BqwB2!4oj% zV7MSw&InbD`0Hx4DPpw**(_pc zx|&W#*bcLDz^Lj3x_P;D-n2dVxMvU^5`it7*5jqGKa0B`*vV)!3_c`Z8slP!w&X&Y zD(mXaqDbV*laP$wl&_qF($5YWTvD`c07LXPHbFWfO$D_n46b^89K==YYVY+>mn4NI;RFgPhSsizk7=* zY0*!T(bU||YxUsLrE)5NC_+e@f(*AYgXim+x(SC>}H5P8qeOvCLvw<9+{4`C7E zXz%UD{x6Q;t+)2#(%CXI5L{#Dl2a0~eaBAx(I0=Ek#RfQAq1C8uj9kF{{T`WY~8pE z*J^6<`}f|*m!Enbp(KgVzwi`x-L)AboD1Oibd~@e(vQ zb&-TvamS7gcyRX`WH4g??2Em0x}lV?jrz=JbH?R0Q0h~4eFGNL(cJggljs=igNK2@ z(C8Gdl-9!%o)2B|*4kr;39$`p^H@hdpWC(R=WR1I0LB)q>0QLzvO9 zhydc;lt?WJnY_)UllMMC=Mut~le7tvBr~&+IICeQ>ZZ~#3d&f6>LnxLq2%bzm{Lz9 zA0Cf_QKcm_OIDde$;O|$s$)r*BF2-{kG7T; znO+YqPo)(=oWxm`HVW1v^wjyj?tau(*P*7m7Tvvr)Xf>%dN<0-s?kb9JTl7P>pn<$ zXZ*Z{q19#O)g^Nw#@iBCSF^jaPDe7&Y!C?6Pe_cy;!YD z4>Ke*d1xeYx^(_Hc9T@kh^(JEj~)i9exY_OSTGND6;)WcbUFIkdqB5>`|sK9C6tUZ zzxmZKAw1XzrRQk>LB#$gb1^dR!1=SKl+8l4v^60wHx1Pllua3K8;077ooeamx1>X zUj5}iNK5^BCGYLr~uAgpVx_;fXmW zX%R{?ZlygqCtP5>K@4F)GVVcd>p1PJ5i>#2=o)H9bmTMxE(>}(FQUEcI9ghdp}Xr6 zQc^Yky#rr-d;q6EuffFFApNBc8R;3QZt5o1E+s*XL~MwKUde;|cIPkv8%N8~D5z%e zarj`Qz8_Y93xarG2=&M4gacjEJ#YrN&^gqB`pQb2|NJyOZPdd+4^l&;5!gM2+G8~c znhHivVLnvaW~_G%Ga>5UjU}FH@>~Rhd}mDX7#kOZn1lod3{eQNtL|P1{b(pcL%l`s zE0rI+E2DFe}1c5_kY&*ACW$R z3TYWZR__GX0(4!C*efGAFBY4L;|4f^jhvx~|AW1rLr0L$uwB*-2rzb6GxC<|HARiaKj{D&jMvaOvuK{PZ9H1)slt zgv4hGrI%{4b?Y`v`4FgQhKXGs-hUuGWGp_)!f3pPj}3v-L5QNWFPK+^G#aii9mC$e zui=$fzmHEo{Qz~f-54D5XGAw-n#L8S8hhfIU)?z1HsZ zW=iEeX%!5n5-LN$ws0`I-?M2mveGR$`q@6rpPP@r|M8DdS=xbZ8#mzW@ne`6nZ%<{ z-HtP751^}|85Uk&Or#z4t?hK+{*0PP^2W#5EXsn=>9`%x(o@qeAH;-`1Ts=wyJ{J> zZC!)Ryfir66X+cp#=iYu;ML!}jk@|C_)c306c)rMM&Zugw;?zx4EC5Ly#4Nb7;5We zM0WufPG3OvjV5fp?G6*gUb#kmW$bZC*3mmh3& zkp2uvX54N{ERgNUC~slr(COsNY>YagQ$_j~W`2^xd zbt{gYVszX;iSB_(I{s={L*wXB)P=6`WpsRjHuz~EH_s7FkO(2WE-g6?dsr|!yN7U& z#8#6-W)&ox5)IQTL`z2?-B3WGtcaOV!DHHJ9}y&bK@2ilItO?^HUkh-v=0~CyRxzc znW@PHDFr&yn3b20j`lu$_`zO$>4_%@u8BB)@(A0(*UVls%O!F@Gjo#QV}dlJKwe@e z{o<3+Jt>+3Id8XwY~K4`-^tER5Tfjpf;;Myx*xsW#d`KSeseql2Y)Vbqcxjj7+c^m zH7UVl81)g4X=bY`yGMIgy+KX>P)US9%M62vVKmn@VxX%RanW(O|AG7P%yVBxPk#q~ z_2Zx8*vaF(-wZtd)MH4?NH+2d;`NR8kK!~*#hKC?lr?nF5k%spFF%MSvtzJoQ8HE) zrK2D()htoCV99zj(_AG_Jd>j+SU3ywmo3D_v!~GAGlHXZ+MkgSs(UCrHU{~#7cy{l zqJqcu@h4fL{Y{eqc_%4^U_wh#P7Yz~%7w^Ji@^&|Jb?8pm!i11m?TFlAW$^w&LuvI zAj=sDKRvWBA(`+{6I7eUlo`Zxz@xTgH^l{Wk;khlMMbk``Q^aEitQflw7H%4Tkd`RMV2S zNdn++vGMpMeLSw5r9Qt}UX8T8LabU)fXy2=ptS5dib#wuRyLruX8?~s`Y@tHRG)1E z6~uw|fl=Dz1w8TKE-WG0`3Z5|sa0<*QwWPn!r%S)6|;omw%azNy85!2tntK?&mcP~ zn}KmVe)Y~lT(0ZG^~O#N4D@5!{4DHPH4lsOVz8tj5sA_MSiO7!Gz(PqI-449ptrXT z;mP^%4+>+D(1Y&bA(Yir;L*n)#^#l)as1FR`iWS!p9&&RVQxV#(un=zTDgjTMPr|H zQZn%SxBfsqw;>`b7|E&ONJ&pXWJCfEeNl``;%ruC3c^S(AK0_atS21A29644a5^=K zz>skK@$)ZXkVO51_dh~pLOeoa!WmfSA|WQ4fp$9T8yhe(GER)0LO*S2d?X0u@+hro zft%N1=Xn<{UW9~%bmOnJ641=#AhBZ%&Kc^2PY{NOJj9$X;*kf>zqlDb0j1Q{3kVDA zhBe#)e`^r0b1~vW=i&92kKK@9HtD80ff%7eXp%(&g)8!-37U1Y(e&*fVO8^D}Uh7X*E z%a^1H1RA#$p@DWJhuN@xVFGq6NyFm2B*e!DU^YQMnvu@uN58<||A&9Z<>FeTrp&>% zZMWgB2kykuEelcIb`2?+i5MLjqtmtgR=4dC*ksczBbdw8KKnF*I@PPwV0d)iPA9~ z|Kzv4wqkU4bsJ!r(KrWRk_{f$7GT5qW2f=dm$qQr`XWX;GpMhtq@$}s<@Gw;dG}`Y z^feh$Gwtz1J%M=Z`ZbL5w19Yvxxa|8FboZik;J$WD6+(B@wl9b4iClZRYfNI7DS>S zXt$ez(SLYvABoAQ80sG;sAzc`D+*@k;@Ov;z@{B**`8xKckV2ndHNaDR955pmtMfa z87FVl)c8UXtGft z!AU^i%j3(aHI~jB9okGW(14jqj1P1mgbp(<(uS<81XR~o6GXyr=G=9pB&8!SmkxQX zkJqF?N0V$^M%T4XP=0EwSb}y;q%WOXC8j2wjJO@tD<4c~NiYIq4o&gI|&4BQ)VoEqbYNfUU?BnB+i?$@dgye z=0zsBv-UAMDHRkR7#z@VmBsV!qvu=u83on;Mp321`b;nNEAJ+qmdcy+^M%NuAV9^Y z^-yV_mU=qjzFxCL*j@MR#4}%c!VF9J@!$Upr%#+mYECvDy8m8m*|ZwHU2Ue+Ol!{& z&R=i9>GE0(2LUUV&&P@dd03c}j44MyzS#c>kKKm2_%Q0;Eac^7;)9PrL33L#TDyiY zNz%D<>sC}Lqr+==jE|bJsG4*%I_4qKj>P#El9m`O1z6`@NHoW}qUevTGJD82kq!`s!!tUJOU1|7rfv+44WelIBGlK^LMv7H6Nd^4=b5BQs68CRB*KBb zpYW&z9;1$JZpFx`16|$2$j&Onf`uzlSVc6@5exXfNh{jXH#Zq z$zabU?TbNIyo!7Gqqnmf7V3g(LDp0ZkX$~FsK{N^%M=vMy&bEz?ZlGhcOo@&A;u;` zke0RcmxXh%iq2@LhMpsTkF6-|Tac2TEEwnhgh;3mQJXYdS-`()6k&N0=M z^&9g++o?K?RP>lhP#*gfLMg|XnIyzcCZecd4ca<;F)%g?x6^@$U)T_F{l&9#WKXXZvN@^MAFPS zJOQ^*ft%o6AZ5N2U{FD1)RZ5UYlceMO{4as@{VDKM9rL=VB$~V(RY$_S&b8z;_oyT zNHfWd;}XE}SskzH;hmYW^FKBiKcABmh4o8Puw&gUWGC8@k`jf&)wAIwnfT!MAK({% z{VLjPhp=M99eD1mFJjiLOytikK+c>T%$r?^E=M~mZ;ni3F3cvitPw9A@FgV~uN5?RM-CL4I_pM^kK^`AO5!BahSc4b8^<~`m z_}xg!OQ6H%RSO_BPKWZ8Tm_a!@)8~IRhbycOz>|a;G0UM&6^eQwvUvNyBZQFN2%yV zWh*k%QjwpRhxhjF!y`{VfqjP$VNB#QfKGtNgL49ofdTx ztzC_E>sOKN`C~d@8fVX6#_PX*7oQ(IMp>5h$FS11BA>mdDaKEpOvf->DC@7Gn!xwg9B1$79nvf^ZS+`orYwiY~e&pmhJsi&VJIdS91KmI42ICc^_85wx! z;fJwl=T0*_wXeGmF6R_Vs~T~!yb+CqbP~Z4cwomWBm|6OWlk6ZT)hYj569)wI+R?j z!RV+zj(l+*t&MHC{r0=?^OxU7MMEF1l+|N1+pHib3wPaiFN%+y$F*xW;6we}v1cb% z?YtAOzV`)AU+Kh*ErItmg>c(Aisr;%UV0=FLjtiVD+$qbSRMujjSW4xcDWhvzWpA_ zdWkM{jIe)-y4 za4FMn4L0@DXv`#hYUJgbEhG{ztW}>3eG3>y> zqs7R}FT~!1Z{g`D?nin;6s|K!Ia*Qyx5#IZ0~^<7AuBo&d8tVl?d?ZXMLn{UGEsc8 z7}v@xU}MmG{Ln!ZE?$SD=da^NQ!A3Q(us3UG&VO8Q!H0i zqPsf~m&)1^5SeDWcgOpNF+JuWDWh&%c|FwqDXL2l^~Baajk-hS2xXAvW1E64$`7$V z(WpC4JM6aN#+5RR@_boYIY^8Oq3(}RBRwSCk$l7=A}j)SP1G zv@p=tN*V$F7Rn`v_NH05By|4DuY-r975a&-b_bp;xdaB~NJryKERp5*ZOAZU9(=4S@Jy`L#NL<^^L zC+5ktxLOP z$#Pu3QHDkHa!H^F03Ux!Ct)#09l%H@h+sWEF^CmQm%vVv^X>0`6%JnqMyEs2*fEX^ zH(GJxVgqFyj63dJO`y2O$bAf1>GM&va2~QU;>~!S#P~R*B*$V7iL**#M8-#AY|@GI zmv7*gFTaB;7t1h1UGPy!lz<@Q!aQ66BMrTR*)*t^R zCMG?YoSDSuUwlR1t#&NC!f&kQ`eZ8>xpB zyt0>+w+KuiK|td?bRHS9juRv@qqY!%=L=;&qr(Gn&+VH~S$!D;BSU!b?t3shKMg&D zm2`Rm7#g0$rHd7aiHgL$dHF_v1T0#wS^<^Urun!Qc6SO_^kcR@A+&9i}aM=D2%!F^M5^- zx^RUPH&3E&-5~0ax(J7dhf!NoYsTyq%$kMA9)Aqmc5OA2!G8XaKSS~HGsw%##r+T5 zi*2{4x-l z_4F|yOf%i$OI9pK@r4o$j=5;P!NeV3Tqe2BDVSqwiP>Uon6oG!+jrfAkM>=_Z{9ir zmv1Arj1Rt3TptA9H9Q@);_Ll#-l;%U7@Sq8R{?>`YH^dpIU(UutbX zf1ZPndv|QYp+CHVsGw;qo|8?2(vQm*&mk*+DH{(MZ87^pFtt`^#`BeMsqvtp%K{k>1Xs2 zkC@39kzv6|VBk48Ox&d|#z#jWIx^G*?=|I@5isS!yg7y5Ok!mPd;_P69hrFKp8N6X zq0{)H%eQj`oOI5e!09F)ph-5$+6JzD3VC}0lN*Ev$9MP`pHRO`WRJL@WAF1 zhRf$mX=BF_5u>F+=Mf_V5E>AQ01Jt}dlLOUwbYv`M8>p`B=#dFntmfW8dGiuu2;8U zz(ZXKv|+fb2fl1q6;PhBD5z$TN*#!^C!+pj1wibawowB=D>$i}ss1kcXpaqG+VOU>~fpyFCuw-#E zlIi4A(vy*xl8CdHF5sVk`g2@9Q;D>U0^I-bW7vN8Hp~P%P=56+>aJcx79*%R^XB0n z{^@TJ8xsp(*9`1F!HADZ#oQ$;kvcbrhU&)N4_?O4fA%LhbZ{S3mfh#z{qB^f{MK*f@lBe87x`3$V4peDHm~$z(t3rZW+l(j@OU`liB18%GEob z$}2y0o0w7!qLCgtS~*;ODY~a53Pjk$8F^XI)!$8GGLG(HH=0@)anS+#1lUkt-HExg z3lMDaMRQFP2D*okk&%foMo>NhRx?&AjS*%B0byu-82b+$!!LgEJ6yd|K@j(Y4ORrq zSdfr83&BaLXk*ly7@x$*wE@Gf3OgQ~8yKn&(ESZIC73Z;P^>X+J`QTdV zWgPzEC`N|}h-WS`A|2DDP&2lLkple)BQQhce4uLa*RNecVnPDX5lb>lQb?n&ZEi6- zqov`D{6wzUCbp1poH%s~!J&4nTD}+|L4H`iu#n$P;Cx95{44~fDIS}SL@9sXjue^B zitWMUs4krryXWN)2t*90FxcM<=Y$)#?YteAOU|L}dK(^k@KHpD&tQDGo#ZzNj`3-n zId=^awiqm1GM{?kFkOVsNd;MfATq;$+F|O@sbK>Gt*EZ9$NrB##shoqM`?L210RB0 zpbtE}kMbLJD9Fi1Mq(74;{%9`r7gK<@Yb*2!=8KZ!o0%SICJ)_nQ0wH5Z48pNmiN} zAmil2n~_u2#`~FfVwSSb(mxFeAo1XDZef6)O-4%ZxxWHM(=dF#2?Zq1bn1MTyr*?i zol>6*U`fKYj8ktsL)t?9zroe0uN{ntMjzpdI=!FjUt#DFZrMJ20!DfCOX;$B$k>Gj;m#ku#*@hgu~PNO(;@;o|w z-S`CqP%WQ$t-2YZwkY~u%9MBzXeBXX+q>9q>Sdr?frq+fh9qb_Gv%*NmMO`d1jDqG zkB$2}uw&gaq@~0{%MkYVk78lrGR&P@L`NEi_ddOZt5xF&O~}E{-FGs8nuA`-psunW zQw(a<`yxG-gOj~!4Ry~1F__mO;vT@ZH*Ktc!X;nogc&2MN(KrV{Ls z;EBh-gwBpWy!p`~Op@HWNhZx|1tea9#BohRnW5t}Gnx4uOw3XsLQSI_7~E60-NZQg z5DVp^tc-^HsC?nxclKdP*GI_mq!y< z7_iYtn{kTLbzYbBb7H(3YnIHz^2JN>`6qkPJJ5-uqJ{K144_>u6yzxYc@+0Q_%Nbl z(_y!#;O9U81x81E_`TNNmi%}{ye^d$GTrpF8DF;xLn9uXyl?~ceGU|t6l2@!x%j*9 zzKFyKJ9>Nj@#*197*43_X0;PITATV&kfH zxLQ_h6J5AcasXYehfv>e92q%a@WGQz^-|wSjM;+z zB-rusk*3aSYa`Fw+6Tt~^?H!UbvY0eM*k*VusRW|ag%3TVGSW3rh6Dzhhw_Z0!NJx zGE>tKLH`vRYNal_*!Gi%jJBC75gLl2W!Qp4g3W}v5I(B{fXz-GA+kquX$jP1Bh^3k z4sS5zj&c-nRlp&Cd@H-BhcHq#`b79l!iBml^AK4SZ&F52n?C!u8hqxX|E1f1k@U%` zjRMmkWZ<_pL;QHNhUl3a;EnO2UG$lESH9N`N?G-tke%;AfY6^}JAJ0ETSeg#ux5^h zM@3*@pw~FMzFw!d`;q%9qhQJaNQhdALra+{hibS+2hI45w9HJi^w04l2ay;Vha?ic*!XNl zKAVt`la4`W7k>Tv-{R;0^g~=KDMM?E16@5H3=T1FauS3oBkMF3kYq26gkjmzMR@6( z&yesvgxvfL%7B11Mdcz3l&B79z{igfFZp1m0o zy*Ex(|IC--0`jakoh?68mPHDwE;T9dz{oI098P3s7T}YQ_F~ieb(l3f8;6e_r8Ch2 z<>QEC)N`)%I*rSYL#In|>_jPg2F9V4D|{GyiCl)$*>yBEAx5PW*cLLp-@f^Kl-;Od z6s+a0262UsbKl2@u=nEwB#F%=Tak1kfdp+|SVChFMMoW#7>R2Yp}}Dk6y)OK#S5_c(^;x(kdC{ix*91dsjx?clL-1Cl{)S>+KDa7-n@FsP>0WY zt&gd_-kqq6+E3&}nH=uLUCcN@K9tSj5imG7h{oD_UQa(VGgI)=SD(e6J$IT+$Lp`Z zjvF^hF~6_?+qZ7Ty!=^6N{mBWS3Bxjx-pChd~l%HtWmmi$7bAp+a_eCM8M-1BH3%^ z6_8*A+Hvv1bUGO;$L_lj8WE2VKRt!(m7VYpjbi&#cX>@}doL#N z`gzal`B8U%2%T||MHxok5cknJg;GD;v{P3fqHR-n{>i&A z?HY!iZE~Z$f|%BTrlxirJAMve`&vWO@!D@b#M#RiNJ#y#dc`vQ%@6*@43!8A4`X}C z61+p8G_F^h^jpI{tkYw(LCTb5TsAc{GG+qdRVx-_>xPvW=^sOFbrmX!rT5-@KZA=1 zEG?P`yUm}3t_xknSJf`f&Mic9dk2Ce08EEvv?W08w ztY$ch20!_DJZz^i4D=2&Fs#6e)k`rkIf4fs+QZ;*1RuS77z-B6WssOaxw~=klFpUJ zfUA{lMbhg#hUH7v;E%rkR~Q=_qyKATd-SpmopkSPGw##UIEpsPD>XF$_dZyJh=^Xw zq6O(0K4@*{wdExtD=QsAR_c9VC<7RO>MV6h0VZ4s5AwyDMRU?U1R&KDmacu}zO<#UyYWrHeRRPQ_ToP=NJ+q1i?Mr%UdKuYfvbBHf!qt0a`MiYB zO9*MFd@URlH@az>eC>Vw@3Q?rkUsDBuU(49;Jq0DMS%hz3B)KlKhrLz5F-DKArh3t zjOFcQ1X6uv?1cY@B=U#KT1n7mJe&6SrP13+gq#By9v*_rq4Yi@Fp>+c1*`G~0aj8Z zI_>~pHX5DGm+szx?JMHwpaU>GHe_aKs>`jltpyVkqjZQlrWkH)L?~v$DC*=Z$Ly)JojILyrLzDNlZXx+Zp`hKmR#i``OP?cBum0-Q(!&agaPs z!$r{a7YUu@{Y+U99TtH-yKln_Uwsa@-?J6bDJtDD0q2y1N<@XAfHW9ZU4|ZhHaa$F zWTvqyo=G9Nm#lb69i1zUK(8q&qdZ=6EhXdkrakl%{)X*h_Pe={m+YxsNcbph)3r|V z2Gf{)NTzD*TM6*n@zY5*hA162mZI7I52x?q(-o}@EYfTHnXS1(^he%@?El4vK#t5~rc zEer;vE2?Xz8jzE%`AE4nwi8MBno>!Ie_wOO?c>$J&ZyF=qNk+8$U+*Gq`f~ z3U$JU4QtoJF*-of8f3bE6bSjVZPf*mk{p9;*RNxOfSJE&4UU|=XozzlBVbJyQg%k& zYa%bX*_lX;vJ>dr*;a|P$w0jEyEm|G*)ptKyNV>`96CBW&FV5<9rEgyvd-pq^ubMA z=IwYt(|=TGZ#S7ph__4EJK2Cb#~r*xQPN>sP*!HPsW5|ovbi8eJ^pms1O2^dX>Kqj zSTZuQ@XS}9HnsLHT`a+Cue^fFs!9|sS&D}qcntCJsfdYDR@#LdRn53oJ&dajBPgkD z#{|#!?H8Yb$JK+_uu%qY6WF+BHdIZ&qOzXEf)1GX-cZ?r^we}Sq(hnMrnWu=2K!+v zNlHsaIjUNE;1?POKf52vewcLD=+^VLqmgDv3xO~d*GrI zPf1EfVsyA!DPn|plA1jW>o#x0;Uk9;M6wddYn~kMM9I0s#2aNtX#47_b&en+)CZ5> zzXPenoGYcJ)R_>@u33CrU)$^>5P9U&YZu9 z2|D>fV$~b(pTyM~o-;TKs%N6fR1T6lKOZXzh!3upR-%d|)EX6zwd+@6$8GCK+!$o@ z_*2BUk={`Tr%sYUUyKZmv#lH$B0g)mIV~L*9A-yKdLrf)W?|!|Em*vG6*_w-@WqLX zICs4P4*w7mKI$-WFF7#=IcW(bF%0fW5>$CX)evmKRBgx)ss>@yj`wW3 z*(8q{7cp~+7!Zg+>e38J>D1%^zVq}hRF_^rJjqv7NGx9c=hso!NWw8I2kEnOk&-nR z@9sN;AqRsK{>~aOiYM>ggreL8B-t&9Cpnlyl2gloNnNye@7_cFaAEgdTab|&gQEQT zNMa!M>48u2mFJ$uNAG+C)u>(`CBRjx zW|+AD#mO@a`do;Qi9}{XFmAu?4xBzyLPBC=aQ+@n96p4(d5iJUJD=n9`SXa2k3sK9 zKR!Ej9M$!`ICk<9$<@7Zcm|=h;8k1n^Zmye<~vC0^Vo>Q3;J;1AUm<1 zN}wUj&7JR(k-#qcr7O zt5rlIAtePtb{pE-dQf|#iC{NL<>Yalfe5w6VE)oo$X--vrmUYVejk7P58uX{um28> zbP_$iP69d1xDjP_l<~4m`@uq|o0px3N51p`p8M8QSh}GQ)(}5lKS7B5NM;(RCxbK5 zDIM~JW0Fc3fl19!qLVjtS){`_S+DYl^m&CN0UC*UBWrpJeJAqw@3Su6E?uu6|Mfj1 zOF0Mur%_BAj+DQV^@)@;($1Uj~`89ccAPCWMXL&!`o!06;Ce)sO%Bz?gc9Ue3WHOVM!oDMTsRY;t!X*%dqM#+-!K|vJGhjg zp>B#8PfR#Xvw0zwdct5vZLS(<0T!!SQf|f*fZca*!DpXo`MoCGwd-jDYZSVBuJW=O z>rxI^uQ$_)`Q!GTI}ysjL{uq=Z5JIAkLb8KRNiRD&wu$gtf8qme)cN*hX;@tAITtz zj(D_(&XDcSU}A*&diioGqv24@o0CuSFvI({li-EotvBBw>D!1+8#m+Pm2>FqYBv)b zsD6~02=pz|r~ef^NG1I-Ha=#YzLuTSI@HP{2qaagT)Hb|75JI9ph|kRm&fEoHRu#k zt45e+b5@hkIVZ+3D?bO1Jp3Sb@7|5difa7i$3I6yeKQK@FUH+>?Iziar9&Gbf`LZID!5tp%B@v8)TRVHZ4WVy&_>2xQ|7-}ne zI$H7gBljaVDi&>>{YcJ8$J)(nkUg73xo8mTbl*EV#4>1{FwbeAqw`@cAL&w1V*bY7u*tumT?%uuyXG#1@&R)a(qNQenTUAXh z78Vv@=f(|);x+x^XTL&Cbt5tscF$V@=TT z@yCbYqE1C8*f2M@z%0Fa{ahJp>ibdO+J~B!dc?ASZ+QLV|-C zFl(*cP*_OnHI`4aakVmySw78Xp^SnIM^GkDV~M>Jm~K7fH*RJ2ZV@|gwohuR+K4bp!gYoZx$Yx;*l6?Jc#`Ew6D~ZHbGDh53#`M9AY#ZfX;3@dpdggAfK54?xDfL z0gPsqSzv@qhn}5cM|-=*&E%uAr^5i5vXO?^5m$P;`%rx9JnE~Os0bm*PR~MoND`tV zlCW^~8l=w7!A#&dKKS@${P1u71pD`WftH#94E6e9Y=UHu!0efsgw;0~e!Sc$TR2wG zK%ag7Sv>XJLnv63g=xPDlAUqhlZ#5Gx>PhOUbM24B3_E@B_rLVV|>Cy5X!>2T>mx> zO;Q$V^C}Pb=Vy8;La1kNm)NZ+!|M#>1hg4P%Y*A#ClT@UW&xFvA@JyXo-aNz9^G_6 zi3w4tzEMU)u%Vd_HZ(j24?p%L{OPy8i68#pFL3(YMGUw|T}0HyAqeVi%{`c%n?!)f zz(=3%$8YEe-z6w~<7+SA)QQ8UnCQUZFma6((;fx?$Rtb$MVPTf4wo-1A<>vykPTmg zN^g5FX6Mhs;7BKiY2R6 z7#^8GS6>fSE?a z5p*98A1}twe*P*+MK7=#QHgo;=Ht=F9>v^wv(eMnjgYVq^pk9Ta{2;F8wmJLJKTP% znFUOYGKdMcz{bF-mn448nw2gpJDWmI+HxQg3il_eOIjmm49anowaig{Zfyq%A5A%hits4`y?N~5pK7R0zufi4{ ziL`hd{AOI(z2|XMRMaCQH5C(Nxy5HMA}J|}jxZda2^WqXI0`o-8kNzRU?8C~G7%9G z7#bciHSwg=nkaFhHNPqgaA8_LF~|a-hR{{l?F1UPT&sc6RzE8Lp7amNADzq z5AsLNRxZk>+#B$f#~whOJqTZY=03_U9$E2WC}DsR86S_{{voVcvJ#Co4Tjjx+^o(Z zn-X3cVB`JBrp?CtG)wqV-)PAQQZ{8~9QW?oiOUzyb7Bc0>XJbVzEC-@$@979WDlM1tkT#pVS_K_K8|Y_FJMvOY<%aN-$eglC%U@(5f>kY!Z%tu{LrEnbe+mTq(sADSDxDMtlo^oLWkerx_TDEs*R~v>MZCJZ;3BL2v zi)gLwLStnsb^bbUOn2q322E^2Vi*F>_NF@DepOLC7 zX!Fod4zV5Sm?tOD-&ui?o^D(^UT%7HW*h;uj{pohE%?J{43vl|i>Q|&^w(Vj0|=rY zvM}IICb5f;ihw1Mh(mmj3X4EujEz1$+>Ff&35}#5jxaNFRp8!C`k~)eIhH^YJ}aL! zGuMzil08jG)B5$d2%dPjTPAvw_)92LQJI;q%N z34|JRI3+d3hf<#eehJyPrN6 z@iF92XVF2-=6$aY2Rlh|cPEKnSP+h!IEzV71c`Mh3Ubo1X6;G>{1vR*%n0=Cd0wx& zR7j#}98ol~D$4lywHlOEwV-Rz0T&&PgT(dA&wT|q>dG-VK7*j}R3I!F9!oTQ8QE#Z zwT*2tI?#nN$^fiDQ@`rd1BXmOYd67h$-+4VFt(M?I2IJmLU~OOqj@_?cO{A67|Ds% z$V~U80k+aH(|xVLLARv4;=L-f`S0Z-GNNuy?<_=rOcG>#15|4abP^Y^aQ=K_s9MoQ z*^%z6PT|V6dLB#TW2}aRN}OIjCn+M)Q&eKce@F?q znHjOXKxMZ*JiZ~FJa!OCb}IpTk}|vVj@z++|EDM`yFn6oKQgnD3AB~eb(P7`^XCA*RI>KW#ekvU^5?`ut&sW?}3XrUR;SWt-m}Iq=YC55YO#1 ziI<*y2=h{6ux<5X{O-d8Xlv}lL-#&{{Mi}UvU4>adhC9bm6uTt7F@4wMu3kMA2Co# z43EIN#YM2w1}euJG5fwXsId;ApCstyZ$CiGp>y!`4$)CtFxcZpYHU7!`^J8Z^GHPt z=Hh9R(lu)~;>h{Sh~@b$!TxAyA4AEtR$^2r+B-Y(`YXReYz&DbgNYd{iHeVc03Qqu z4Ve{J+^$LE7&Wd-wlzqi&?_Rc{}g5z{6<)VF|E`uWh#Q^A>oq)GQ9`VZR(qJ+cXb@ zO#c}Y43fF2Y3e(1aZYX+HZ9A>izEvc>hprR1-N|W23#`?2uMUMGY;IbaUnLY%E$e? zx4_5cqCE@5;_#2Z`aQZPcn%UzKL!Ya)<{D>l})5_b3fW4ZNXv>V_O7KuPxZLehzM1 zSA@aVdc5?Nr!h77ls34c>VxWyHS%*CML#6rlZhQ%|LG4W!B8qxH4VWq-V;EJq`~EHQAy`kw5wp z)BD2TD&wT=|B+)yNFb}Qa>WYF%E>`_*;%9{C>s{YHVVXF{MC;E+W1=P^67(T5grzlhEwCz zeQXTi{4v6SKO!v=Pd@pl81B`WYaWB%Q8jeiTDuS$6+?gH9fPT5H7A|)u_HYg9UQ`y z(+#+GwgswwV6*xfa#&I^gu0$EO#0c-)X|Li4wbzyd#rsGVgf9=Dk-ChIB|E z=6g9jJ^0?Jm9ko1$82T+%6|E|NThzJjGaEYH9kn|G6wq7FaoA9GTw*baW^AVIs0Jv zPY1w41IiAW#yuMr;{LnW!5%qdy110llf#Y(kHQ!Y)moX=jsJL$$^J9ucb`N+VQ2fTk@tN8d=Jixtnpe+{u)1;W4GWdcHNeM#NI%xy+0? z8eLGJNQ#H&48)mp<>vT)({7&G7e@{q!L@6b@SX4cF;1L3WhP%(Xgo7y3pPei>NQx9 zmw-p_+e#3!;P|;xl+^a3X^_#7H3`0!c;2Jt8&1JCGl7Dna6EX&8hrihyHVG86{(r2 z2&Xf7{Nab_=x3R=P-$rxo0vvJYd=Xy0`9+kHA>DOGPfM$7XnLws-o*oBoXiZ>b|8j z8r&^ilJ1x>dPZK}`_?{s&)p~ktySuRdtwqdD#{J%n4ycFO@h$cU5_D$vUDOflm!7r zV_P(++?UrD%1BZJuvI)(2i5FdF9{NO{@YcV^HcWHZ)GLroRt9+ne?GfYs_E}oli$+ zH+8ljo3?B*6OJmcS7Xnv-AK<$LQU;8(-k^A=7fWwIY!5?D4utK)YNoF=KVY-X-tq0 zQj+6w;NU(~Rn?h+=^wxUF&Zi>@$6T=f>WnX(J>S7gSA40ADZhMk(!dm_7fS?*rNa> zBqZSXZ@i1Fj4a&u;61o_=^~n2S`Zx(!zKx2J8EV*^<>6PvS^_!DQU`6^41tDkwTNT z=ItxlsZCL_#x@BHI$GP%P+Je@_!#CC&ca{(<@c~)(Lx3k#d!10H_aHy!UglNdi827 zEn1GK7=M)BILqS&0vE2K ziNZAm4D% z*Y&}bvU03jw+<&yAI6;Q7^FnmP5@#~34?!^AjKR|MNDn9t493Osh35QGS zF>Q&Y?$FVxyO>w0_BJzI>HKD>-v(c(kJDPzKRE$CosF0^I|+8`%#3RaKl|A)vH7;` zxa;1#@WyX{gTB6D1{|yK`m1k})WqW9haW&%dN%eQIERkj3F;JWMTW$Gx9nHjEk`Sz zBGj7ilsxw#+0o>Ifgu+zls2HOrWPX|UE4h&DLxHWNx zzAeCi8skGfxL$GwcQ8P{aONC_+!M4JZ{|qXs9``O!z0|+&t!OoRc1^Wn`=sGO%g*@ zPiSp!HRSJuBYUxa{VtM_SiV1r*7gQG^W4KYaqPGmqBKqtEj`({?=u|!;xP4!1jgoz ziRnQsT{#zj^yq_ZR|j_PT#I}X$Sup(kW7_hWD*#s3-Y56rI$6`t5iS;r5s~@Sh;jA zUU=bQ%EQL*dhxeE`XlVQZ3~0Pd58>2KwL~bgSKWfWG9EjOX~(VwALY4TW?a3n-WBa%KDTbO6?&wQru zMF90)dTP}5|CsH+g7p2{rhD@~{{5f#8x7F*N`P;T;hHbJn+%noOR!RYW6b=Unv&zx zAX6F=S-jJafT#h!E~yt)r;j= zy>3646PqIC}DJ{OIrh7;nG%7Frtz=!^m} zHl!JHGqgcv(tHr&Z$Xqj78xnoShsc^zWn^7SifU6rmRyK9HYbKJ!q{|)5Su^e@kI> zA6mUbk(5AL(Sy2E93(YTHf8-ZAX;gDkr2&Xw$pKG_OeCe3@jSYI7vdt2wU=@JiQUU z6pr%KGe7eZWsUUm%G3}Xv%fy^k|DE?gwFFwY0Yc%R-Ho(=B)%rMy>Jj(a6h*MM6w4 zsw?Wz)YOK%?!MQIl>q@HB|RObbqxg4FdiomQ^UQuW8DIL_l5h>-(Ab&1enF^hsM}~ zzG3j4a3CSr2isTY!68l=U=V8N_>EG}G#vZ@ZLrWW`ScH9!_quN$4B5~$pwUHz%B1VDKK*%W>e-@V=e@;azHolPtH((YD)@2 zy5`LqC?h#)#)gfK52B^H9cAUJamOIS5@BY6j!#O5mC2*L_;W1}sEHFQqvLV9OdBg} zC&H~r*|Y`Ed8?~lHJo&I0lH=vO3qYoI!V(EbZR^%+s30YJ=EpKRuz$T8qaP;6o zM$j#|>OfX+&?W(hM(ky$J=xbx1fsHiGKRZS}$MF>9o z^fS!PpKWHUSJ4joL>lRUl_63M%TbpP&YnDvxX2h1-8m$+6J{txbW9{Z{P05pWe6U5 z>;WFLl*F@&x*Kjla7x`qQZ23RDuATE-U3GHob=BGbaY6X!K?tLv!fNYH5CN+3Ct(? z_}=&a6e~#VKK$@w{QB3wLuY3%9o$ANS+a!JQa}QgVH`^b^`UoY9JA*y1)BrsE}SBP zeFWDoorYy<5HVIa7UafZ!|Ijz_|wBUS8|od*}yiS-4gs2#dr1g;fqt3aE2Igv91TF z%j@9MY)#52P<6XBo1WagrLzY)ne)(4Q;*L22K09KBHS8-l4HdP=p4a#&j3R;E9H>L z-}oSVdj^(#DGyWWQz*VvP2$;%^6GXpbdBI*Sv^**oMWm3R9rrf^~>ksz-I^0+cRp$ zEr!xLt9w#yp~9|uOwrbrsZfazO*$GJQ`e<0v96CeF@rbW`IMMoM;3!r&uBlW0hBq_ z+UT4d5A}=0L0F+BFzpuF9*JhroIIo_CNgL$LHE!IGG{NsD{p^{4-Q{vz?uv#XQjH2 zZnoQnYgL%Ha4p{Z_ykHSy5XWz_M>j8b&tSBz4vRGlwRHfa^brb-6R6w5xFDOx<}$$R*D`t8w1q%aR#v0Av5$I|hk>?Q zsLWQsa|R<*;XGv^uU&y3FgVbOyKdWozxuOp;R%Muzx1 zU-~nWMqaa1!6fZOMbZ^iX&k!>0uK-NVcy&#{QCFrAvPrgYd38p@$1K_lUEr$)Kh=8 z7VlMza6hdbt3-o_T&NanW@b7zESimRmp}gYr>|qyyh2npw4(U(4UE&bnQn8EYSRNj z?DF%~+RuZy|IUr*ZEHeqavHCv760&qAEWeA6aMb6e}#Q}58%?}5?r}|AO$gLH1v3ts zT4lz+`{=zAH4HYW^JYkuUK^t4C5*So-v6oFe--J|{r#8j(HQB?hhA$VZ!+%%N+Naw zC>eq`dh>p%?`7p017#ewzLWFho&qtA_0u>ajlmn}Xu^_NX^7(So_p|aWMz}crAOoV z*(118dL8%Nc^6{iLow*+CvZEEm6d_kjs}d4xDgf}kDU4Q@cw&0!C(E&SMkNCCos}I zjfr6rHR;v(w-whP(uV*XAM63Ji5O zzB6)szQ(!hrd*2V>0tj=7=$XrC3SlQCy@iQuXd(@lugov2i4SanMK$oDJh_o%0L^R zc}|lN^vXs9o+Up4qDepVq0KvM$V>XP$-#&iDa+?2rCy?wokdPM^hLSI)ex;nctHs-*>g+&;3PGiUcT&Zls*aU-)AOez+4Rumk6ass1T-XRM&v%G9$>9nra%y4rnmr7xBe|wP4tljD2 zXRFq&$BCl{QC?PUx>`4ET!W^@a@1Cr!^dMq5O{5>PEQg#J3AKt@RJ|H9vy@~|H~gB zJ}wudePdWpBD7=oZE#!s5R;sO6DQB|tQvP>gI2H*4fV5zprW>!@(e^udxFSDtwm8@6o0-o2mWm;dq#`g%ICar0{2b=MsT3uBZX5o?G`OM4p{Iw#QF zHi7T_>9_F4+v>7jiGsX*ghvD-Hrj^I-`$6(*f``A6f#g~pySzy(y|+LI$dPbbSka^ z60S@5_Sas*vD4=<5flyw@7Ug*!g9xxkrV6ra5e$J8j|GNaJb)rsa4 zm(g{(8P@&)JhWpsTBrK4>fWumTz&~tkyEhe)1l;9F{>yI4ON}+b;o1e?FV~e9Gn9l z?A!M?9@ujS-ucZRNOXqq?28YgaKUWs|NI0(tdX=ik>Uxq3+Px#HYO%bsSh!^&c1H6 zwsfGUyC2OhRajV*g=e3C47+!1#oj~5sb6;PCR?WdOe;X~gVQmBh;U!*AWo&n*|Cl~ zpsvK@#i#MYOE2K#gGX@VdIL!~2~JcjIU56NW&7D)nkX{vqW)L3V$4PR4J0v^wo;F2 zJ(QCV+{8TLl`>3bwGT~P;>Ays$o}L<-^U-`d=1;!P7xti)ZAz`%aV;d99Xw`16HkF zkC%V>Dx#xf@%3+f6A#?GoBC!W-UXn0*opGiRs@Cp^ z!fTLU7O9g>2|L-O#;){FBGF7+w*qR~d%%=~wm*gbu@MyHCLRB3`S}f_v91~_fWEM36{@IP0leAjh6Y3=kStG!&|i#^pxSti z8q*bwb7!yM)Rj6^cMnj$k+^N=4!DK~(9zL?kcb$e0|H34JQJfB8XY$oKXoyVj*gn3 zUpS%6Z+~AuT;uBQS9u(dS&p)36b8ALs1X8ciG zRfm!b7qI=dyKwsKHN5fuK@{`4Ce#%!dGeSuY&+G5O^CH%^`c}va{C5!)iq(+;w22i zTJZdrzlx7PR1erMNDkfbw^NQfhsK8T9s=1;zP>@|W-wG)SxMX)MPXqsq9Q}FX%&yv zK4>O$l;607q9y6XI~S@-TZuh>u!h^uExiuSC*CbujP&7m4s8?pvDD6@Drq^C|)Be&uVf+8tgiqW5 zr%c~}y8Zim_r8{k<3no;S2}>4B#k^e zG7{D~GYSeIyN`&9!EKDRf*D0m`;k1+c{;{Obo?2W=VqaehIgs71m`at z#OuF(4ep5mOt@#@B+$8NG|C3~xz&vviZD9EyzFf3zVA*v`t$=>xO^`Bf~Kk14jLGh zUxdwEr?8NXuIuJqXl+AjfRsRKZq0z4aE$Z%eW~m&OiWCeG_%I;c}b(eFA@@US5w&p zZrs;oP56cGTSQI5G~mV;hCFaTz1D9Hu`uVCsCa&}kGkL}PaU7E+pCzmPP3aizSm*v zwE$HF(Sz{tP*b}pFE1CDOUuzRJca9w&Q4#cM)!bbXGWRKm$_e(A-k^&$q^*3B*Dsd zohmLtMmpto=Tn&R1`vHnHFn*-8T$`@ipbD7M!R8#>#Gu_Cevweh?T$2KZZ( z8Ps8TE+aD@*-fISi5aGQjmK7|)rgkwMGDO|a8sMzB7uhR@p?=*u!uLW*&7l0dT07- za2<8EcbL)e^d#1=SxB;S2G_2X;kIpeVDpx{OwB%d(^vrbp;e!w9%&d6&nWxauP>ITl>j<-jnJyE_;Z^}%WuP^&K$%wQct=MY znyRZz=5WKt4Y>cI`>}e>Y8*R$46ps_RdjcEplHof63T}WLZBWW8%9C`ueG%qSFcy$ z%8hnhZyKd8dKe&_#qPVeGJxwKp-m*XN18$IXNxbOk>urz;}_7>)Q!ZrI7G!I;nejy z)Dah!EnSM(qzruY`7!iO&^7~tjjVlUG`5z30m+Wa2a)?3EK-1=pkWfD$X%L^fkfV6 ze?NRCr!g=%0hh&srO)4i!B`j4@*ScKM?RPLbOs6<^9zOr%GvmxhU46V9IzS5vDuXT;^+w0)?HNWzWg}XfdwHGI z8R|)Ja0I6O!g1+FC*Ih5(oBe&4p1)%gBYnBFFwG}fjf7s!Gm}2z_La8SiWQ)-hS^L z1Y5(fWgGesw@5b-9zyJLO?WXvWP%zl znaL)6eEj*Efuyq^GtO?TTfPV<4j(3Y--BFYM|gCUDdsC3s;#T%{=`408)<22xKUP# z3ndrL?EeF&&f-#SD~^<0hktN1$s~gr+6Yg>-|#=3+}MscP%?hNe5Y%sy%@aXrofB# zI^%Z2s`ga*kSRNLGT6+Tb&iknUVKo+bA=Og;v%U3Qftci@$MaWkYo>_f3SzwCOr1yVrwUZoM4jG zF&D00y^NyeMaaxdW8ie%Wa9#fJEkXT+D%e4WN;xiHr8bMMn^^%gpQe8QueR0u?nl# zEyb2CtFdC`LL|q;;OJ+cBR(bqwonpwipMia|3Vwq`prT;1p>C9K=e=g;^6UO%#f7& zQLerL40iPWv=jasUpGblCwYrWu;ELOZN+j1Pnl`aIC1tYmeOW56yUpm`h60nAl}-9 z$;0D^UTV0fi{P*g<<7Mo6>|5|XmeHxr2q*C!B`JfHFmMwHfyCeCQ3 znCNgj;-kVCD25UbEwG1%z)nmuS-s#eGk#COs|dC5S(7XRiP!3#Qh+1>smc$gJD2h| z**$&F&y|$YxJNG$^y;DfwOpR@p?oN5a_jZ~4cmVc>HAMNiNyQRpI+P)l7NI#l+P29 zGtOBGNpLV(8VcA{o9E{mtD!;fax8M5axQJ1?da+6Bj`-Aku_Fo%ov=U5Ov;=9sz~c zF759d#hiKb(beCCVFx3LFe@%ysNyj#RAg_lQ=WxJZ$ol?3bHaX@xXn1@Yt6hM8Uiq zIt34$Q)A?ubR3M140+}Ci@5U1dtc_2mmug)z3Ym4uSMBDr*pzY$C}VFGNS3`+W1QY z0{jiHUDqt~a%+=Q)!SR+KB${K<_y7B>3Hw>0&RwL@>vALYkt&Vxn^?=wuP405iwb}ehChpzlafp5inwS*EEo+Q8PI}g?*RhCF9{O1$bcV zERw%r5|IT+P0TP;?zhpwj}MI+XY^11^b^zNrc}GdYC~bc5=6v=;KcDG2#*Y-{Mm*i zAyp)D8&)pG&W+1(|6O$+y{Vy@gvXBU+qPoI&J9?xe3@C%<7Yp86;TN(@Z)v( zF+%hwXu7C7ej)*EKd)$S1|^i8p0$X($@IECh7d}Y$_6TWRClNJ)abSOPSRBysqJpI zvB)0}N6qGW{4mM(=as`ZFbEwzeI&ykETudyoI8uXpYF%B%Y*#9MOeFj8wt&NWM<7K zfos9bulxkx|G^LG@U(Dv96_}UNg46D{l16r!AA!W8=s8rn^#l62F>J-aXP^Ih88pH z*g`_Cw${X*`i5>^s6UbuNbEf>ghtRgCM4j%fddSlM)BecFQBQu9@np5M`)Oc-%Z)m zc2sB2G3KDtY%*B_&BnXq_FZ`L$tRJNoQRWWPU6?U`8E3bda!8m0^GZMkE!uBJkY`R zP&a1~4jd`Pi3`nWADe-TGSqBg%_F5IS>aSnLJ$v>bD>E871^L** zKp`(H6&7Afci#vqTYF%OOhn0*8eFewN55)X2ihrHZ!T7wu?;>ehc!dTr}h%5k;?c4 zPorm~6+U(!q*0E8GvgTTa=KBVi z*9bCGeewP)e}j?!8GPqY{to>^L-_hPU&QH?Cvo=7IXw0B6L{dUyYSYV@6s-nq0qXl z9yB%6F}8H^7&EY{RL~^vJ0}$p32A5_aAPVc5)P8=DFz5LbV@S}P6U=J^giVo#p4g} z#;d>l7X}RLP;#LHb@jd2cknPCe)wKI^1v=6#)o3UIfkvb-Gt$A)A&J2^VE>Y&L_p=0n-LWZ|cYJtV?2#7B}px2FedixP16x<$Bp_9AgC z0+qG(nB=uZ+JL1+g=QJbn2-RB61NUAI8DgRN9L>olG$MfOl=q#oko3o52B*%80u{y zevjgw2Oh`Uuf2k=eeJ8LtggivWvDTZnuUA+U7Jvt7l$=P`B*T2E`yVclsT||?H0DL z)-N9-uFE&@2DoV=k7jI7(zo2|4bbL06$Gby0wMHQ5s^`7uIt8$L#I$*)xaRm8?4B8 zs631&noYVVjU5J&vYZvVPVR)1JX$z+9h(yaDQK;(8f)9ghnvxO)CR!rSDT_8TJZ^>x^!9e3 zx}pJ7Gh+ygbRj-52#vL!4BW!dI}(T*+Nesfg~j7233nUl32xSo}M6~4@5#V?Ji2imu;pSH&l}}tiiOG5I(e=8UuHWjSsEtqlp?k zKCxIfE=~|Ytd*}YWAG?z;~OPMwx2d(yLY&X*MEAkoBok9Gu^#6Kf8tL|2J&^T}j`6 zzEMzK8JZ`ly@V^*CjzL=P$}xsjK&P9YmjKb%~;bi=Q z7AqS>vCISk$^(Ckx-O>C+R}%D{6cheR3SXVf_H!aJ{`JuOn?uMoe&a*EJkzlX3xjN zPdXC61SSds2nQ}9d zx6mMHgmktd0@_Crl8QlV@pAn_-8|~n(rdHCkO(eMDAD-%kU-J_s@u#(0wWTvF-4j+ zt?vaC0!1^fk00n+n~0tF*-HS;Of5sCy`;}9wWZ^0A9H2_I>D26Y_kN@iSix;$4QhL zN%j~a(FrUlh{dL*1=zE71(L&EXsRrsQ|>}?ayGhpofsRPz}Ahc(cW2yU%dQNM)tXw z%?Q$Fw<0kumd>vmy?w)2zj7;@ddhHv1R^dXg0vx!vhqQAY#gE!Bk{qJ&+*=oYiMs6 zMo!8s6OCtNCNY}qz!wKk;cMS`32hzaW(`xT&B|+5)|8PeWjif}pbT7N6X@^hMN3l) ziT@ytKL}rb=2_f%HzRbH3#U$>!r_DaG1%9KqQwjG;3JRX?8S?`XUz(xEEqs2qo=mk zfNULKvX!g^%qr$7!l!N-$ykJ0HMl5f10sZQSa>Y6Du;+3MQk#Cd^W&AiR<`gfH42$ z#H@kTVV*m{H;92vuPH&aa(NLNYAR7uQi3CgkK&^b_u<2j_TsHK-oWqQ`UCZP0AZGJ z3=j4ba6NeF%g@6am4J^v{sJ=r;b`t0q;u`W>eVagXip(AHr9-#x_sp-f~j}(u$W-r zqvf#c8|o1o9zjAj+vsL|Ot_gGvhULabO=*;;e~Iat+yGMubsz~%a8J&rUTVdi44NJ zyNwgtxpOPN{~!LsL@5Ukeu2H8e2VemQ7l@x5UWuxaCB1_-{0BB^`zH=iMQ)*QHL6CHg6 z@C}K^+xw1?bj0zv-ZC;ijNU~A46&xV`?5`CH-vTSwE7o#(`p*tzrQc{SNFZ2lXg0V zq5d9{PZ!25(}(7%vd~i3h0lKVDT;r)58GxHAw4(&UCjdw(yY+5 zt;)*{c;&S}@OnJ>?svX|B}*5QBvf*Q7^8vk+NRimLb8MSk z*)pC-KqIH`PdWNcAvP`;U%d6#D9lX9Km3R9BMkQ!ITOAn@vY~H*T4Q*{`?djnc{G4z)I6Q2Y!P3lF zgJHBoVV!q5GvXNuh$g+ru1HJaL#(#(fHq#E4}+E|60wYo5PaoJw;|f zaH<2(J+=;WvJ+^terT%eASrX9y80TTNaX+I+uz6e^JUc0el#`J;-LrcLw0sH=Fggi z7XE&aq;Kuk?O3^P0|S){B#{H~_=lPjPpNS>%uk8J=}+Frs^#`pkKp zzgmv%x8KF!NcHMEp*7=;Pvbo(SQRD+R}7ZOt~`^xF%Oc`QV}1Yjt}2EfIGL}f#$|) zk|z=>&kS{3q+hF-Sj;#;ttc|#aHF?p5I1UT8MtpiV{0eWOZpQwD7ufc-7#i(IdRi!QG7Ip*JD;$vh<$#Oye?|>G<}ccO&t*5oAz-d zfYH_r<>=?HnzlZYIVh{~!;!Pi2(;%SJTirrq;6OzA|pc(8ySx%dpJUZ0$^2vWzER7*-b(r zI3&!BgSV0Z1_h|zp0awHm8)SnB6xv-x>L^ElfM`AwQ{%o}NV( z&AvAY-~Vmf|6tOm%`4n#m6qpgIZ-K+x*?_TB2Om!z=kqeKW!Aan?z28&u9Vni;Rp! zLtQnZqa#TMdXSQs!q3&sL|~vsYDSNit{NShF_E;2uvS)H!G1c12x|n8ECPt#To{4qdZIf$Ue`>0{l49HPjT zh?Yp7Q5Iv|-uu+JDl?;#24mK6rT0-b%O0%pP^u-TF%ud?;Lpfk3#yB}>E^|0ro0&@ z9@49Xl9NuXO~=>o^tm4Vmgf`k5a{bW9Y$F=BX2oG%2#D%Ot&(>GvtN<5f^L2P)`Sj zJNt0gj#b#aayH(7<5i3g3}V~1?YK-JJAV2qik5D}sS_mzd^T-dXJ%*R&&`FFmeUMo zEtmH3`=6m`!E#(LyN0=Q^098kMjS5QkN%NiSbf3>#z1~v7Gl#9@$K*ZJ)**M;hFX^ z>tkkRq`~St&EL;OY1u_wx^fZEJ^MVaT)B?!u5J_cDH2n*bc!TkphrvVb(%rrsVT|W zvUM$9`r7j(qm6j^7r(}h%1Xq>#~~p$9?O=_$F5ylP*q!o{5f+_T3$opkcd$Raw;N! zGIkMdijHkV`S7(eiUJFb1My}~l>-qVDr>}z|M3^zrqOTpN4?Q81@bfgvIC8UQ*im1CpR5I zp*Bo1=n(n%!#nTNnRMct-~KwzmlUJEs?IF?HrPLaa0W12x30tY{_;Bp#DDs;m$CoT zqm&P@c+mnBE|`zZ%sixJW}&gA3H_sEsA?R;$NP>UhtBk&hwsM7P&4k@wGJbF9eC#P zdl4HEh#O^Bu!wEm+DSst*Nc)XwHO}r#T&ohhk=o&JG6}iYw4`{4!sUQ|Ik$hamjv*S>-w5|{d>Zn%8I(bGEuYnTTg{Qh4sFyJEb z`!NOwocObEe~ssGVDIM#@Yv%I;d_7a9lY|&Yi78DmJ{^z^DtP7!NR4>F+Lf9L#IkH z$?t+05Y3pek_sqET%~N>Ut{akZ6)$PHZegRxMZ?BKlc>T&uIh+n&?-X@0 zoHBLe#PO31278d5mVj?Q|1hpyJq-r~0%4!Ja+Q_QunvvOQ^_BVbymq3S)2&qlxGlg zaw72M2e)DOre)}PU?&MfI5Dk}OkhT1wfi7m<|j}DHbrK`sfotmb028s+* zG{(_6gu8BEhllUE3%{eigjjqK5w4OUQLu-`;FG=kux!~v#3x3erlArG3+E#{J)7rf zCNZP!6XVR1j_xUp5*MPv{qdu}{5HvGDvq8m#l`Y^%$=8y#Q1PjS2eO79Bdny6?7)q zXafW4hHfHZ9Ky0yML10oXSJvN|JeHrD7mg{YZRUh)m2^9%p|qCTg=R8O9mNbW=P_I z?Zl1)4mxzh@P%){j_sIj*_Lcsl5H`w)Pm+#Gcy!5zByM(`R;gQd}I9o|NfVJ@7d#}A=*8jz?!5H|96CfEp{qqCM82({ zt&GCrS&Pu!<0n5?QynT-n);A{T4^Cebh1^X)+wMD=Cl%6BjNl!JcwxW%);sO5uKWe z)2A<>mvY+H;YLS~6G{ARTy6%M8fr1(iYM5PB-rjEICS7b$q;t!Z$LwP6hYv4j=75j z2_QDcf%KF(Bzip5Gj4)B7uy$08xt2=oI%~MJ@-9Yq~UTIe?>*9&K{i$18kB1Wub=n zNzclE3;{qr?7V+~yb$P9IhYXGlb)tpxul=}-+27r3i_m{^w9s8!G{c~lr!I5Izd2+ z`Iap*TH5FOM>>l}`dovc zX&eCzjf)Hj;VE36A&kvVL^{1Je{ZktkT7l9LPS!y&Xt|P?3vT?;nuC_Y-z*n=`*ot z!5m~{rkN5*OUXh>St;KCU=yZHnM%c)X}K#)mM+3?fB!p7%%6;F)?a~_UVa|oLyGhb z<10^p5&KW=!-cYP4z%06*+J6k!r5Yiv&HD87doEfc$A={`eGCAzyCp;K6M7|1O!fc zx&k4}%jx3t;-yP*-Hr6fmo3H6zzClE>kIh!!`+xVWfDQ&^`;CaO`C+c)O38b|0GIk zx^VnVB^6(&yoi91Md1V#^ml1Y^_f7qnD;VZlX2Aein;~_HTK~;PZ1`A6`^bK8X6hp zkl7S5A9j8AQ9R8L>>A=D2Z4x#3azfCnIkxixpU^B=3e)Xgm^PlQAYI z3tn#z?z{I+RMnKzaT%qu&tUroZ56E|ioN|li?W_PRZL)8foK|BvKQMEQgq5`QO!5P z9vc5fw%w0-g31JX>5AZu%g?vfdT+n}9*!M3Z&UT+O9KUwPCWMcC-KKW{uR%?_yRjP zg0%#Jn%2+EB52AkyoWK2jyfR5VxI}YNGo9;%E%Ymv3g#<%!q<;kVA3Be>-+C9Z(GmE{ zmp_fU3uoim7hgta`!J1EG+uk1aIEPvND+F)@uN=SIIBWHHyx?H`#!|&H>|Ziqc2=+LiX-j>+o4@-$Qx2P(+8Ug8-AjSmm8~j_S7h{XT*R2eftN z;GmyiG7L#6)QxoN=ggQ*9&bg_xr=<;izxA~ znUnG`iJ&opz)91gVIvMSmS4b%MdLALY6_OGn1ki>337S=va*XfdgcH={i&xgbJh%; zK68-t8=-?(fKKJYMvtJ2d>J2?LMOG9eUBipccG)R!}NZAJ%Jv_^9Rp7jmdeL1gWQ~ z^JJ%@2y_ZjFmV!2A1$SxI)T#SA}g~}U009mZ@LwK{rhW38$$;uE1&wR4;=)%ngz1J zfdV0;p&e3E(w%gqZY9ub#!Ih#hyaCk?AR1cnwo=@3=bx;t)-=<@bwK^P@uEB4GoRe z?9XgmdBwG;Zy%w)q?RBMi;QZ;SH5r$zVPrv)Z_i+>rt#&y^`R_gJ1vVuU2btn4m2= zDH<^@g0$v#WadQR<{NHB$+<>4{yy^DFy)5hMSwLpB%MVW(t<8kH{iIAXhw?sw`l%S zl$X`wbWs(rF&1sT0rU-op`Z6?>}*C(ekQKIehq##qt05MWfKE|kMTWlH8$xY>*nf1y=z7VV?*)oOOD-cC@a zDK`&2ZsoxZQc5iz(A5oJ$2Aq#m;N-!0@D^fB|VKN`6uO}u~j5Sr-{b;Tx9_?PI6+5$3=M3 zTQs*a8&W#_NW3IK5B3*_?6bTxpk>q_tyzqF z?zjaWMLq`l2yE!hS2W_-nFbsyY(RCZAI|tBfQDo7qUoe%AG|%yICktfmMvXPLwOc; z^)1NG$sx^xbQ0!a^|EDX=x)XNq7p847YL~OZSQCm zSuU@x$N2FDICbnGVjRP`la5k(;c0XS;kM`I~P<> zSTKJ!QWKMKp|BXUXU)Z#bH!+A@1$J#`FRjJjZCs2lU=OhSLJkMa?Z!)Hz- zZ(ITHy5m|p@JVQE>EL$*bP%Yo=m>FC>0t4CloOZb+y#)GnT=a+yB8ZbZznAyFmLV* z-amshZ$fW(5U!{MD{$Y@;luq8+zwxmvNaf_-YT%!p-9d5BZ#!*7^J19*{WR8U3=z+ z_RHlXT6uda!4i6oR^2^0edKwI?orojWwDj-63C0vj9JLuS;`0HClt}s_tN#0BZB%c z%8?v+o@(Fge6xumZTJENVZE zBmE0wASKc2WM42~*AEr3qypnLbp25ObU)sJMA1F8q(2z+@-^E;LE~Ks5(as{5qKyh z0)a}PC85+zqoG~G0G_VR>sXsZ_t9a`{Ku|dI$!iwtt3A^CI@nI)6hpF{Oe!-1i$*} zD+EquxKLCE2L-mOvWbdd3=QT0y4!p4?t9yinl%yiZGG7I{>Nx+>BQ>g3)of)6X_F8 zZ%kwH(eABOpsh$C2ur{BpaS(MP|9%k=Vazb(A5D#fA2m%EP^-@E^pW4&{zZ>Gc zY`l0byG_s+8rN9TP5Ft*RD{>xd>2}}hw$pgJ!otVpsCG=g-ezrKGuU@{rV5sweKXp z@WfMyPm08`qel>*kcY86!=D?4J?nL5&Ha7k0HNcoE0oq&8zmFA#B@s z8i!9+AS=HBcieRY7R=5xP*he{hm$AHVB!3gICheTxvvKW`QtDqGZoEr9_G$pfGWy$ z)|dkP>BWuMzWXHGocNbB5?3?6)M&sDDt4b$jj%bn9(zm zYb;4;ftry(A7)M~Kuz&kf~H|Os52bNZVXr+lMDdq)=vPCKySZu-0jC;kBtmdpnLH80Mn9u(i@N;y3m} zPL)ir0{d15i!{;V30oDeF(r_y(}JC_K`fn{kG0FEVENKnxL8|<^z?k}-gOX3sj6ib zg?HY31(U|*VFu;$%-NF|n?D98FVtI#f$CCP87+Z5-dWBlRhP-8Gb#%WUBh^1&t4SO zbi&)uw)s2p*e9>SvKeErY2)h#{9I9P^0fng0z7SPs9I{8Sg_iYzMwhUii~?`;N|?v zIq&Nm#NPc!=(G$XHja95i1Hus8b})*8pYV;2z=|whtXJZ3b`4{$WF^ZX>ln|oj7KZ zo?EY9j+s+u+p5x%k|Io;I2{EAlWnn4z}rpTl#JYQy#F{}e(Md4nUan{wtfALcjCj{`;1;A!9GlzkPlz~ z0A+Cisj2xmeC#C7my}@T>P5KzrfV@}>Qpqa4cg0ATal6ppn~t(*LLyzrFh`pNATvx zT{wQG3iHTsY3Xs8GBKOFeGYotdaNk7gAQdk`JlM+f|Xo~<+a?(vEw+$5xixlr6MUY znY`d3@5E6S2<}|b7U7Fg{$4EkiOz#oy(>LMKu`JA0(y~}JtL440F;iEtrPH*{k;t0 zq+eyL9n|rcKhq;rj^%%z^WW+Cr$+j03n6)MA~Kbh6tWpmz2dVH>TNqWo8n~S_+HbH zwy8L^-7p!?8SS9qYqA^<d4`|RL*i=@h^3vKYVoGR5A6eNj@b5lSQ>7|$9 z=Rf%+{^R?rgmP9zBozoQb&k&g<}pzx@{1Z@2}2 z{L4%5Q&FcSjwO&wW7{$PL5RFxd{*^bM$FV~v zsQ{=@*r%QzKWR9CVH(}xC@LkM+S1g9%F+hRnKheU-!Nv)oQW5o|2wpAX&)7GkJnGH z{WPk|s&UIr*YkceIkuyiGjBSItLkw0Y$cj{!%$Mw!7-Hkz&27@XeF-SAGC4S?i*S# zqphx#M6NB6hQts2PDW4T6=@4{Lb)O4BoJ+gZ%I|7KkcGjUkgT*lr7Gd5)xmTf#bCY zcwQupmqU!ru^P~K91{n>m*Ubs$9!o#palp@SZ-+Qz()s9p@iT&!peNa!4;d1;*xS4 zI|N7^6`iaL;R#}ba)^0?3LfZf;B2414F9Hq`<}j(0fjC8<3B;;w ziKa+xt2)xArl}JZwcXfupb){RWJK_OT2P?KVBa9GKn$H*IQ zeC5Y4pxsZ<9i3vUi%00Zxntw4bWwYEAC8}`K}$~%VNMV4>j?FmJyQT*PHz-JxZVu2 zOD5MGJAqzHX5?oh13mc4=kLPJYv&-*9fsuO479fNpyFZ`Iy#&AqiD+UK?2^1xb3D} zZ4>{q=Swhu!2*<(pNA`A5L2g4w9+dU5fM|9mm?#nkLWB6)8Hz{Pg@a=M9^tgTEwUy z>Ct}78=r+&UwRdt9h5WDTPZ3^zX+#+?kAr_&?sv^Q|(41=SmH>$_3P85p=**QmMJA z0Tae&;|q`7k6F|5aq94X+;#I!1Q?OLu2MKgag6*U=kMn0)*vCGAFJn0L{CdI_U_q_ z>C@)&y8USHsG;1{ldfqfEiJ=Pu%CAuL`z4fIn6VsOhg3%i2A4;G;NI-OCHdEz)Fd@ ztULXILG*jsUiuT-@3xgTCq6Zk?o+rqvA5o|9zXx_j|`Mvea#K{)Du6!`KmsAeDoZO z%gcBcu=C@6h>A`?bX+_R9jm~;qlXcf8iCpKC*i7fSE0J03wsZpMW-)-n>S?QyH7uX z>(|^yAe4fftVAqZz7q51F2ccsH8^&r2pt_QWD6gbESimYPcnAx*he`Z#KMJhF>(AP zo03hB_n^AG4)4FW6MGJwKxd#AQ)W#=SZoIV^xR9-b98#O8kf$&z(7A1Em(}Ik_u#G zWs%QZY?C}w;MTUHiqWx2fl%kCSc5=eCctgNVI!yU{dVSeG>!I^P5kRGXX=v%((pKB7 z$E9=ry8%8O|1{7?nwt_9p=B^N2zE$;3GC?u8Bztv^cmlWfL7=sMXoXz@U&6$f10>3f2W06bGu7aMRw$Q1mt+q|uJ9^u&Wz&av@SaD|&|HhmtZcM2w^`W` zGwhd)gzl?*ig9GPt)2g;XVbCjiQ2^<$e5@!%K$-xfQ(iNX;DaMr7gjp7?9^G7i^FQ zSF3il`c4U{`n{$Q6+u+*w7OPcM$-wr6@RP$K%kmP1*BaWhAp)1^Jyws088dC)F#nM zuhhoSA?B6<6AyoK z1Ma@>26|<&7(aO;z15Q_DX&LjMgfH}1qtz~ICkWqm4r}&?ylYYkr+3Y-fKGV$37zp zQzuWiXnOYj& zIP@svnaV;&Hi}+mSQHHx4U!&VG)m!?BgS!Y^O**2WGEa_q}yn405Q%mc$^$Ndd=E{ zc$j^Qq`?jw3WJM^GlPJ|6fteIR(~rJt#J%F2^`-`xuW8ikx@&R7n2cqgj0EuNBD^r zASps+Q}qt=N*K?hvNC5NLM!xi7Ws-`Wi*oaV0%0sIu`yR6j52wuc^hRE&FZd z-UxY*4Iph)^`GankE)FrsVPq0O8{HIPdp;t)1jSUtegQ`B%aZARMjaImnO4ChG zTQw)+sgUCdNHwl!&zvLAMqr<|_j0BX7`o9;fU$hxG!$eeV%OI9tbW;=6;~p_He}`I zp}M}o@{u06|1Qj*JChDvtrfsc9lyx-&mD-+w7Yhy5KJW?7MHJDBbR~tnGRX3o)^9}hiVN5FSzU~GTS6AWP?T1lxu?ctHdONmmevja&6ZhY9 z9}XWnW@!Rjw|xk|*Nd#oB#g~WL1%pp=1iT0v03T3P*e;eQaWJKc2AYVh;T%+b%W${ zKcc9^!ux!P9qhv|p7|o)-}E}RZQqA^^JnAv7yin}3v{}N=-9^Ct`~k^FKIn$({&K1&k^8jwX;|}VZD0DVd;>kzuN3}{Y)wZI(NoBcu z;O%HdV@)X%6Js!gAY=N}S!ivowgphJ9Ly$(=|!3&WAahfEfF zdwc|R(m$hcdt8=pr_=}s`Chf%Iy$;gRaL`tsBbw20=e$kWH_9$sHv}|Y>Z<4b=Ogk zwcxdv-$!%;op=mk+N5-jgA)(jdKFeKT|s>?ipnY#eU8Kxt7qa1kKTj!8*{a&ij^`iIFUiAW)!jCCt=n?MIN3U6$FAM@zU zm6o0)0Q2yA%{Z(YuRWvq{oh`;yvVUx@kooOv!lrIZ~)0MF~~_yMpCT6o@(ud0H2HY zSgUeXSlPpeb~TaXpv4+;inaRNO0iJ>v`W{_F;cO7@xB0`aDmOdNVoDKu%~k`13?|3 z*V3mUUHCuk<$tf^pPSRiLyRS2n@7k8-|~=Yl!4@T{7hpZVU+RIbQyh4GnP7C=S$Hm z*|xIsBEK8KYp=gfkPwGwpZ&dU>!j(+mX;3W)BEZ1woow2={-#(;LCu|??X&X0>M+i zh458=MNA=(CE*UWiO+V+5U4UX(K*(>P}{{o@*JY6z}0?Tk6+SAYtaP(!tftS9~5vAPzeur;bK)KE)-wD;UkBz<%4Z}Y@vcEC#^K)t%#FqwvAE&_h9DK0yrH* z^emTP?}0;zq9;2-a2rnHZ|(PE|CwUcHTRNkO5#t2Zy+4b_+$*xa~)SO2}Nh=G55Hz zXa9NRPtL{sRa0=b`~(3`Jg*bS>nXZIbE@d5h)e~+(I8MENFc2>|D^n|Fe;{~Q6ClD z5FWhiO8nwmPvXplT~ze#PUY-1v{ z=cp^fW6{8@EPbW(J(lROztg%5s~NPPdb zr#^*-+F}|fg2JLI96Mf$rWP-D?%0dtr_bTDkAEIVj-AHtJx4K#&H=lCH$K>ny=R*c z2&2&>f7>BrOS)<6JLv+ky7*qi)fQ&x&s?zT-!fVK(?uza+N;al-`v0!jXk zb}XGW6`f5r@b>o_*!9xsh|fthnHmlw;Nnn)vG3u7(k{{k{3Cc(Ngd_d27>`i%E`o| z_uPxu32?Mn=p+GfW9db#U$Y3Ge&_}qIdTA9T?Cy@HwFn1ET53=5xoT*BiOIupx?GA z9OZM^V6QDu2xGr7$gx)rqQ2vMjhb>1H6^9KX;tzN9YIqH{7(8#fcyN(vp82=ZHoaa z+P!G$^V&+)g>xogTvj4BzWXv3ES`lrI>enF-L@T{$TV%z6s%pn8qYoZ9Bw2?Ji~tU zlGnm%bd_!qK^_oq+fKY%IUH!isrEnA-`PR-Jkj#imOva9V`v__#Va}v+ zxOna~rccO4Sw#(+ySj0{@F-R-nuPL_Q?}aH>l;CHQytq9Nsj|~>I=7E!wqZTAuouJ z5@V@D2)O6X&PR4C9kf6PVhAdwBgET!i1P}@W#O7@R$=Xx3vtVhcbI6UBJ)!K%x&R#m^)Unh*no-hJyPuB;%4Gh;Y^0=RkoP>K)gU%)+kvLec1)U7fDs^wEgdW z{8K@n42}Se*jfMdUP@4kM_&kqOO0#xQqeJ;BT%NiBLPCyyVH;fjHpm!Kb5vX+@u)= zC@#Bz?OTtL(Z*ro!~%47cA6*Paz#*3hH&iYXjo$xCHok zm?7k03}au~J8Q72x{HC-PMbQ&DZWt(P*7Fx zhX)Wt4@QN6RRLY;e_BzcX<{iJ0Yz<}qbQ9c7Ru{W4wsLfxqx0`LY(FEsQ9vs9)HQ# zm)j}O6(ksm!q~AnY>yXz`RkwX%r~CF$L}3MeV z&)%KbvgIA@-M0rPPMkq`*+tu1Qs7huR3r`6CsYm=s8k0qfnM*i6NTvW`LSTp5)>8{ zO5;*d(Hkc~9HOzIxuY`B^pdvrNr1<;af(1W!GC>Yi*3R8?XP``#-@P=>9YhIEhs5# zpvM@C0F{{PIhnU-Ttv`IMWTdWDfcJ>E>|R#Y&JdbnFYAzx+_sudLGHC$(ToF|Ngd* zF{NNECXP$vck3`QKMQZY`7$=FzYY%%##q+14 ztD}K*;|&BL2~L#IPn1r>%xB(M`vZ$_l;kY_9iWV;e1-uA5uXp+28!pY^YV)2c4$$D z>P%XWD$miWqq;6>rO4Y5!HyyyE{=hIue~kBEy@p_N)+(iAAb%{q#q0C&A_X4#HP=j zYoKjHK|b;eaLe)ln9S(D!@)iSmx|yiVr~kZ zeG3&d4*@(mH3EI1Spi8w=(YMks>mi~RIBm@u&wGofv(y*$ZN;PJ4x3rw34TlBiGx~ zg|Oft;*wG@NJFDVm86W#oC;^k@f`5>B638LIX8ij!-@`18Z!ZznFV<6xtDRxx_S8e z(~o2G_FeenpWnvk9)BF|U1eyjYarJqkb;AjVi8HFZ-hD`jItI*IvZE>Mr=L%qm|(7 zD}_SSx3&O2 zD85jG%IXHnek4{cT?TJYuZ{g3cioM`;!^BCa0WS37vRrtZbA2;!=`b~Sn_XB+XpHq zSw?o0ZD5=4zT;lBH1*)SKl&AV3Ff}~rB7f?P62-U<6pr;2Y2iCw^3Gp&UTn_geOwx z##&n&RiBR!<>P8xqG{A8PMM5~o&Y{^|1Egx@%zbZLDH@d`wyMsoq!EDUx(EAcHDXE zt)xXC3dW>R2Wm!!jt6NlZQ2Y=hv?~QK#7vWrK8RjfpgTFoh2F{*2La>;R2kyNA!G7Ljh`L&G8$o%}Z`h`q z>P~dG*HY&OEP@`+>(*CQ;PAnHm@qMqz=(W9s`s#8rRBBA&7Xl6UfG1V3HBnRBe8VN zLabUcgM2ZH*>e`4zM&137wd7ZsF*wvZ9A4f4%n1|G zK}VqSVjcQ=`$!kr0?C_`V9<+m6(uOG?#Ag04ftr!K2%l~W6i3iIC$tdI{QYcpQ&HT z;BHqKa2ZPB5b(SFd>QD4z#iHC((`}!AIXkwJjm#RP5==;rLv3RjJues9T3RXG188dO z#&zqjL~mCIdOC+tFex9tU@P8#`vC5}=M(f|nt5J3Qj@ai{q>Ln1Xtl&9Kn}l9Gfa4 z)94;*mxMyOc~;^?Mn(!&#+w}x!^zi{#}PIhW`G=J29sw+hSNAxVcE8JG6MWl zxeAAK)V8f_qZ0YUZ+?UCJ@W&c*n0t^{cejY6^zfr&9_~H&wk+nEL=K^?HDECWE)9- zi;C!AKiLWsn&H84#K**A%A`z!hbDaR{w`1l;uDYDL+`%Mc4kmLvT$B!G?GX$a?n=lK0 zbb$9J;Fae_x~UMiq6gYE-N9=ny2A0<2iIfX{9H7)RuC*F;qkBh9JNh~CaYMl#**V_ zETm~WURt~*;GjsBx=awgc;Q6Mot=l>A8jSwfjRS5QV zwf&-P1*MvXg9Iw#Ps=l8-)vVK{wbmqq{7xdlvc7q{KxM!O*^2-k)oR!yK;@$Bq*S`|-pV9!FJk7k>TQzoMqL z6_cmVz~5he2@h)9Id>E;mKS5x5z8L&g1k-y4Plg~`zd$gKJ6+IMGz24U==1{%kv~3 z(k&Vv-8YPFG~Gnmlp)mAy{6ucciBz3p~mNQazz6z@Q5G?iHuCJ?Z{f%n=xtPWQ@Kq{JaUBblJV%iG0Z%mgjGs6|e4EO}ma`?Qr>8OlowkrLB}Nd=2BZ}wsw*t?gY zy%q6EF<7>2E&8a&PaZqT>qVidwT?WKimTV&O#a(T{ur@(dx1bGQmWLN4wb~A7bf0O z!Q+m$9@I8ehMWrO80A-6YzN8iSPubY54nPZ~eF67*kH^uK^(Rk~PcL;nUkd)vi zFAd`$0oD0a$I;MO3m+YW8FOY?5q2vwPRDD?>r6$WxT<0QF1<^@s}hw>DKFCDDmlv!>J8u0>HrJ;|U|w_e&S7ZT~fiWkMb2{A4t zC&VBn!Gl<>!gcc5B71aT`CikwE`AoR#Xq!d$_)-h_~@`u#%zjKDG<~Xs!u7Ps_2~x z?<@COPOaGo>V^L^$osF4%g29x{onccr-D9_{4&|8moB~Ge^S(X$^XS@7HQK7!h!ah zpV5dZAw=&j?~MvxIZ4qmQS=^b338gyLyzOY!E-dcw@@H`sH$nev{_Tp-rZnHyEA7j zg15iTHi_=;>_%2*vPG>_bW{8wZ^0VEH@dz4S7a)*GDv`s!b-FtBcf?qJ4c^W7`5<1 zN>~QfMQ)n;DL&L?ZCz4Yv@eh`70kM|wo?=)R(`BO9rW_)=~^;daTI#a1KT^UFPeG-!rkddBU_I6#lTo1XMAsw!Hrbm?-; znL7n1P9H-@dnXm8fQ7(=Xei35&oXm-<~2k!t+vuiZ3&;oPQt9=)pXXRMz^v%B(07tQCRd^73e$TqrE6#9Nzo(2&Mh zn>0qeEfq4s-mt(e6*RrraPm_a`6z;PRH>RFKI)qqF>CrXESNV1X^B9=xFp1TRL?67 z$Bvv7(b?}sNJ)xCR9HXe&&oq}c_B7$+Gw@x!U)8DG%kUG2(&i0A}V|sSFT)$#WTj@ zyI;8vu}NIDzpQ`~`F6x$IfXaUMlFi7J~H7wwB zNiiB9Yn=EKEv^!P(s=3n5gI!wTt%G72>*~rTk%VyXneu*6g801P=qbCh$RA*4UI_8 z$wO>hA|0+S@~qERkN)MwS8=wY9mh{q;P9yu{w~g@jMR=nf+i=Gx2B}DZ>lMHKB5Q) z)qWC;M#+H@0)-*+(Zgza-qt?K+bCiZX@p4vvJlTFQORS&1Pvp6kQ3n=cHkRd z{toHv!7qRPpXlidU}A0>KKtoAaK|0j;-g)Au;b%{ShHd!`6v??2!bL=zX9D>av{bP zE%{LN%-dCs&X#I)x7Wej*U0f9j|%sa1~$8(A4qP*vuw9kv~mR5))3f`b7?@GKO&pj zm`Yy67ZK4;j$bUC(NS2pb_J%*n2eqK_9K1VOniK#6dSi6gVzy*NXogcDsGTlV0oYh zsukgjM);r?S&2jV^nI(bW@#SoyW?gnTs%4&i)ViECzKJOU489ReCexSz}M+)c6562 z!ykSV3l>ermbdq?FY3<-G6^hFv(r#8c?xoKC*aO|9>AfK#W+!T0a;^mFyigQnd3)s z>xS!r-a5?AOT-5s9z#)49p2lt9kXVP<5&jK+}eto`T*W~cOTr&0sc0Lpdk{4rz@~) z=U#ZIJA1l2Xdjx;=N&f3Q~9vA;OY{h_IiD6XD9iX`UEkgt4Ryoo^Z@wFoXP@W81XN zpObIE{m{uGv^O{7E1!P=?Tr^vUe%1S=nT>-1g65G$TW&Vv9o?(53ap(C8}%6tdxt2 zW^2|)5l$x^)7>8(!{1+g4og?e#PEQF;3pmz&KD6xj?!t2Mtx%=QZiE6W)JlpTSdN9 z&S7F=8b17ZFKHQVfJgfrA2?dVKJVvyIxjU=UDLp_ z|Kvq_wknvd)zaS4D4Z=Wwfcf%I0lm^6kzJaT!OSwjLVKkZfY#@IA&uqGfAsR6qQz? zy0O(3!l;Bxd^}}>fKA59O&gdL6GOlkOQ*+;nAljT?w+E(F$8^jZBx1YE}D+1>g~yi z*9?OAT@gLaRB3k&fpFU;iJ(tG6UnUUC+P*rv-p*-b^Na)d^-LO`2OedPmlCnK4fGx z5K{c1s9NZ~jJbv_ByWBV3MLOr$c& z$aJBhsSb$=DFgt0==b-dq`01p=0tyYFETT7(bLBc`9~I{dX=M}lh+68?y~-uhtIrBLf$ z^3rVzi^_X&P(Y6cZj`?bbJOl9Y1_&3v~AOXDfH}2?Nv)TtM z|8%~DHHL!U+TL!)Ha;mHM-HDvlrx@fqTcW8MJ^55#7B3EL*S`AHTN=<@Am>y}KJ#wf)G-D!{{!d>UQ-UD&y6 z8&)ixi?2QTIh@|Vmr64mbLP!McefAQcO1p9e!GzXsK%nC@BRJvxcT}8w$knS=XayL zq6_ywxE^=jdIiSBC!(^f*fvz3H+MD8o+?CJQ$4O;w~Xysjjq046c$&IPV}xxNXd#V zULb9v+|kgMWg`Px96);0&?w(e3Q_d7mAe8<{7yVzG$BzOhdrN5!^`z^_sw!eW8`G+&3~C zWyVf1M@x}VZFMJLC%%(m@sjodI$nyH-TT13Xl|+|@bbbzqu<%khM+fqxOk-xNRBCM z0Xhsc+A#!|{x&aYvT)%{x#cEy^IAXr*5@gU$)I@9*=$8ib003&)XrA z40wC!2++}CpVZDs_FoY{Ut1$Oo9lVcK63zuhJ1VqTEs)q5yElOKtNG)#n*h+q8ghb zWgl&Ni{#Y!@-4eBy{gm+j=Q3w{C<$K*Vfiy#fJw*+-T|?!KNKY(9lhuh>quVs82Nx zQcApvl}=J@lGpN6#-jsG1ba7Q!IW&wnvi9CqNb!}667S}w|{++3@i^mg}?FSMgY7yA18j1N@kTTVg0uNyOF zPr&+{uOjGMf;TqqL2*e3;4|}Npbz&wcrP9C6R56gAfLx$ z|G^8`yyF0!73n_8yYw#kM}SJ=?Qn$?u*JhM9EGNaCiwe@$+yiYzu1I^)(*6Gc&XF; zXz3q76?wXvkDAtg_}Gs4I5*;A!Vn!L8KZ1b)=~%{GZPb$niyw=!#&i^9#;&s#htIQ#!8xyU+5DtBQ+M^^C3{k4?;`*W!RJyPr;(1m)9#ncF>r_ zDbH=FhYC8zHu}Elx>e}v=&^#Q<0p?b<+bI#9r)6dkK>U~JdRs$d6*0~V)+^gN!mdm zbbTELLS-@d&p;jz8B|5yWbnjr0vSBy+up!4-~J|E zd3G~8n|w4PZe*sV3505AI( zn(_+?liH_fgOr0m*n?@)$K#b(Ub8%*hadb5jvhIRew8~2jUIom-%230dWxV=_ldj& zDEMp(S2T|7nnLu-t(-GwF8aFymgqZsawcX>%eErUBT=a|K&r!}t?UK}ngt$Z_(F=@ zrYiUs&d)5Dk`Egb@{7F3P@bk72pMf9(Nn>&jS+z^%pRYBb<1+GWLh%vQbuw2?Q1Y; zaw=jI9H^_jh<&^FW6|P;m^^thHow0G*IvC21$o)<1v>cp3hX&}0G)jUa3!Q-){-S? z?`*@dBYQDz0v(UsEO>jm;p^?=80{cfj>pmCN3d(x$H<#B88wZ~Bz6>PFV^AYsS+GI zb%X{b8((?y(=^~dQ~rK}wyd-)_`N|KJiH&vRxZN%$_p4nQ2OHQTk+A(qjp^b@Z?uH zEaEdQy3j(8p#hq0j)kUo6)9IVLV#X;C`GC$UzBnr`I&gnN*VC80fJ!-j=&gyLdDD9 z^BVe1XxcaAZ96<}D;BL{uQJ|RIjcxyeM={XoU!N`apJZ2cOo)6$-udadn+0cPC%(h zc{II!f51nc;FxhpIikiw0{Q}h#;iO-j-d2_`XPDImNvmmdfWDp_4T zt@e^LEEm;yZ&*3FyuTL9@cPR2Jbmi471FJ4sX`E5Is*hhya9`K=JpagZMyo6Qv)uIK^uDIRthc==BexxUvonZM}5H6m2Ew6HWQ2+L0FZmAs3N z!7juMwczWYxfzRRXJdSJCYtLTaEknzoIW0Zd1*8L_U0C}^#*OhLI$0iAN}IbICZ)V zDaj5z|H3b@YtI23I@XB6*kLQAykyx5H1`dnZ`6sxl1eO`Jqz<@DxdcV@^j)a)KP=* z{%+Dc0!_U>Z2fR6;ye*JS5yj5OcHX(PsHB+2MKyz=qG^7qT}L0TShpUV-`R-#G0C|7#w)Pv*jdt86#)d&hvDz7#n&Ex z82Q<0*t2slu35i|`qpK+<}op$y<#`M@eao92g%bY<;m^Bz5_=vclIKzUU3y(`1@NJ@sOqj zT$8qqTlc1b;F>&?Uh2(!?6tnNmIY>6HdMiL#!tp zX-O_bN6MLE3wY6Z(my*bmHIm#anVl1(CM^jo_5rTQ_Vdsm~q?GZm76&GBOo26?=2OC?Nv&a*<;Gae|`M>_+KCYl1QJ1MCzO> zJT!1rU?Jcm&(+jB8H`LSgMMjBS2~@rfdG~@8WW4K|%)imH6QCk(nisjc647HHC`zeS?&;khaAjn`kF6m&} z5;7XwW$)ESDr0J0i`tn&Xj*310MWiqqUEujFrHi)lK8){Di*`^;^bRJUSwf zXj7PUnW@!BX%O^V{@D6HL}l%!$CR5}z<8a$u zH{;PSK8(3bXVD8+lD#J2cn!8yo{^rV;02iUEG4g;MR}1n1|+7QP2e;xY_Tn>kpbmX zW_lKyn(C<_ld%8rarlO!(d*TY8{KAPFN5XKbLjdi6Ci`DYpSohz7EUBV*lFOS}=Fc zEGw<^@wPpfGj9%Z3-VA{R02BXh#GcaVyYYW-o6y+$=ai}iuyI)_GebKQ^iwx7mfwN z3IUU9;b~!uK#xZ&5XB%I$ViTjhu~!9_+)Ijb~aq-rGkn;W@C>lEiP1an?!+xO-hjd2 z2=*U3j-v95xbfy2FeWz>HT9)<^3g}w)*!}>8;eO(C*k=+k8eEr2>f(f zUVQ0A%v-P=^XAS+drKoO6qjShj2T$Fb^)3?0{Cd}c^ccT1XeyolV=s_7VDAnq45oo z-{eF&paD5EBzHJLmRMEag|<=Bxtbd0x#YVrcZ@{Q#^0hxlrN*BqRn;zjvZ+z8FkQL z>HR1bG+Bq&QIsu|V=9m>rQFcihPDnLf_qaPF9plMpcnaP4CM&&=oYk zmTDn6<^=)+qiAia;W*BOudffj9I|9sL-gGZNIU6YV1i_DM%*OS~jHQPDVY z<~V-w>+hhou?4$!euSbkC-B4Xehryp$KscNcoEz8lo5cBLA2UThmAcq9iusTQlC82 zjQ+lM(vYBwvag*tl&=(;0TI9+A()AxO^)U3kUXk?(n&J*(k2?iAvsn2j&PR-o}ZIo zGMobQasuQ?+H^1PEeBHd&UDBjlM|@=rm7D*z-MiBnUOGz$M0W_Th`7-URol-))=U6 zYDBol0O)J)Z^gxi8a#0KZMIK#QN0%z%G%J=--}N_v<^T1?$g+^WglMNeiYs0mm6-l z3b)*GJI)rJ$N0QljLXPILv|2;LE)BJ%g}jCjtFONSWmT1M4Ej)4 zaUNqQ0s&ywZ8^qRgrYxWI4}X{Mbml=rIf9u143 zOn0HVt(kOoSR_zU-qG*@q^8AU;ljnpoG=Yr_Z`8U1&i?6PuxwNI)WVpozHy#89Iq0 zc=6R&;f#;N_rCKqJdr_69GgNO8o|12*W-hakJ}#n|% zV{pmwCjgC!i$-qtSZsOs1H`)02nJhGSy7LcRxc{6THzn04kjS-2fA_BUAJJE@oaA^U$0t}} zZcRsPkw#2hqP-T_b1TB9#T(I=_sr!rsGAjZ&;mOZMOV>fO<&6vg{E^Amz1AHNTXJ?1b zm0jRDWK2C2d60p3xupmP(BmCMZG9WkGxAVe)`(fN7E_2C=tXrnfjsx)@UlGKu}Yxv1D@fO-3u!TlG;>uF8GL&dESqcLkn%?pOH6*M5M5 zJ4@m1j6{Mb6|?8ez=NN>6AwOoFD4UA1gXRo!LX=|qBOj(u4s`qwV#UKz#m`hGxbXk z-7jQ7b+#I>BLrUckygK{BuR2oGOtgdoRENHN6%78u=n(sLuN@wvH`^lsAdsNMrOD|Y(QD}SYp9zx-{YJ9NmESj4K%wwECBNspT<|okGRf!CO zKY7Nr4OHF&A0t!(nj)m~cIYp{N$@m)Fqis6pe)akN-WkffLT*hv3zkJJ$^qyf2p<6 z<%;7N5R_1X31l5UaR9&h<8zoWV5>NQ-+uy+efAL?-n$DtcY%YZW8jx<{)!?4mN%KG5+|s_wdqdAE2{)011g{ zq}@PhY&b63T|`4h;dA44;bj zM(VzlGa?a=xyCURh2y2{(CtI~7;2Xc6kEX437anQsqJa3{_wq`Q=zGz5FIQxm5eB! zloO}je{`OJi`r%F<>@kjbSq8Aw0Cr3e11M+X^>TaQPF8Fh8XA%V5pl0oxH~8!a+R~ zM&RR#%SKaA5U04*rqTTZZthq_d6L+E$&etRb`2JFx-l!+Gc`>5jx*-_;~M5%9N81%mUQc)R1pg z)1f;PnU5(;KR@iz7sK%xgK&?^N%?ziZ@&F)Y>l^P)%q)4#%MLS{1R;av{MA;^NV`9RQLGYiP;O4cw7(e{7vbnb*F`n&nbjk*0L@xvkQr42U-`Z;vKfSD!-r)`!5J$vw}}^X13C zkN@wEe_>9a%!{6-q(X{X#zw|UKv3Ze1AKZ-hPB9^e#9{jc_ATCs1L=^0$&3Zu$TlI z{b0X&Oh=EFqrEGLtn3_QX9;lm@ZozW@aUtT!mF?U4wc0{$j%st$7?INnQBVgL0|+Z2u#%c(tV0NX^Sl{RHxBv?|?)_$2Q^-)Ha4=qB`?=^L+ zyd4?sP;Lg#=5Gd7=Z+>qA@Q{IcvMxL#m|26L;U6!&*J#Oa*PCHkVG$P#j1sP?1=|) z>s{9&Gbhy+TLfv~wMavBb?{k+MLT(1_S~$&mk4QK@Ur0WBMF<0fq*qX_^(1G0Hxx^ zD)bx{sg=ob7^boaBPi``YsHeq3s6;A&Z}x1C9I+y4V^=;HLWV6rD%pcP8#^&uqos2 z_AbntIR$wI>3Hq6jkXE56t~Omz|&v)92U$SgOkVh;9_w-Rxe$R7?+!1J`v^RmGJpF z{?ZP1MdeCK@v61_Z;%FhAczF#5avxv#?`APV*1oHoGm;6Z*M=m{lmx|n}@VaZItgN zt*DfuhLIE>jhLh~y!HMr%$O~ud?n^DScpA`_9C|+AMbs*8@_Ni2E!B49~iQ2z;PyFXohug)Po=X>~Gk2xEQ@b7d_<^@(1}v(Pk<{@u@(R>hGCi z7pS>3mf|4WkD71fT@NU?jpJc#97b?VMa$76=p$e-S>u`fUQ?|q@T?pl+oMx5rm<91 zkUS)%Eg6wKYU*Vm;6=E2nCB>OQh-j2Ey4(DG)1d6$#AH|j3QFX*-?~F@?^l0#1bFc zefg|U1X?r|t=9%z$d9&&hv(bg*ZM-|g*sz@I?OpUIa9Aife;VttWia_)NVO-Y>14W z443LOjn<%&7$y(ixN=(v{sXV<{Ti#4Pp62tQY}QzTJj#umPjP?u@Qk1!bUDbC4T zQ}zZW&jR_QP(8K?wBeQ;79zzth)>*hGr|W0cz4s=m^F7H-u>tR-Z)r+^K~rOd90ZniBJ+qZnk#*=T!sRF$% z&Hc6`PiA(g5Pm~L7Xd>IR0b;}JDFqGVZ5cSDph~4uC@WKZC&JB>Sc!jw`wdZIy{1` zF=<$HA$;-i z2aNALaryY!uU^64V`tzW4ItW~Ei!o@GGEw`A0F2rZoGCG`np;P41>7x>Sf|k1L~3s zS``Dqxq0Jp>)kg|pU0u6zY9IyPPpU3F>U5}eECaHYszu0A zchPxHO^HKxN)%MRYnbhb3?D*PS`so-Q;x;3=-lJ2=uf<*F#8{9B&6f!o31vncg3~K;Yp0P+%GA%z_1^&@dO9a z;Z%mgXS&FtY{3^zWe>} z5eco0q9LvXs|%_~)uPD*Krv?wer#=2|PqQ0>b z*<-UUx~5g;g~yL$|AE8!>}MatmJfHKsJP5Z7+ke#392fJux#04INWjg{a;?d|M=y1 zan-VAI8k1Pmp1Le+go;H(cBqGi+7^2rHee{u*DLJ>S!~2tpp6y^eg#O&WS~M#9XGp z>9kN;%HZ3+v&!+~xi&CjS6*v`Jg3#Ja2t#af&gmBm;$%slL37F}%r5^AC%FDal7Lz~GK!0klSU1Fq;2>GVOGSeu&sKz) zCpg&Ocn{khAdhfNHD(tpYsklO$fL2Zudg@x3F8L;Wh;okN(I+23LUK9| zA1cDD8@KVgDlrqqcCtSND{NLsuGrQg>Ln*>YGt9=R?%RX-;InYYUqM1CJ_6F( zw&`2tlu05fpr*rC%*e+h4{tzu(HZRCu@Bc>w*f^fuzl}w3=v#uvDScp5WTIf zmZIQg2Y&F|7jde*#}8ZF z)R~b4?y5sKJS2V*pADm}r5)Y9Doo7J$e)@`Q8Yh)(iqH~GYv5bNtnNA3H;QDi3BhK zuM1nZzJsqk{U~WVj7^(&aEx3CY75MSa4cWF2!3Ax6UWcS8yk0E;|DvDKY2VR=Vzj& zrkKv9BDdsX$0+>X9!wcufNy{0N$lNs3LBGTsBiQ!QM`&s5z}4%o z!7aCMz-_nRjE5h50Jq=r3FMEPf?%L8lsY4OM`qF@#>glSp8MNNaJXV^b-C3A)j#o- zMqNz8>#IbK6q{^{7Ln-lLGp_@Ku(|Nb{QNh*EY&U!sSSJCUE6iG*km5@O>y9v+M8#S!eO#-NA5Pcp8B8>+!4{co#r$@{hl&rKLs6R+cj>Q)|EOkAgw>js~-P8{;wVX(ny~@>jfE6hDxtBrUn2h7#iM? zA>u13GYvW!LD3>|x_z!wm5-uam_Zsi{Ya%eT&_rT_jFP@v?G#2H%Rc%P*X=G9|w;! z0aK^uQ~h`HvQenI*g^rzGll5$_aixlNcd9gNDjp zIN9cc{PDQ^-dphalMi9hirLmyTYN&gv1xXnD0)b`tMaD2{r#3Jp(JIkP*bE%g+>R0 zL7p!<%22XDq?;DS*i@J`S;mq^hM()a(4dIamy8KtheS~KRTRldVRxgms|&ef$D+8X z6iJCGHin{!+NDVB@bCcX=C}K6Iye{@MP5NZe(@FlyQ7@X9 zg_ZN;Io7KD-(>qXwzjrd9Vow7iQ56v!i~y{Hwa5<(b zwk+d6$cLhG#Q7LQnEkOdW=X8dV&jJLK z2?W|61iE|h$bB17dv-T&S~m-0QX)}WQiMoPJn2M0LOzuPqA0OymFY8ak_0#;AAE>s z$iv!2#AJm=&Zc_!mH0cQ6jCDZ)@#9Tzo91&zy{k$})mR{)YM`JYoRLm(9b?x8II!yG~;F zkuvlS2#CZQpDO|-;OQhX8R6JiSs^)61b0SY$q;o2$-#FaSyRIm4Y#RpMG`gLE+ftN z`d&I^V3ab-D`+c0ZH=Y~sv#^Mc!iv{aDhb{e(@{+Gdd{GQI4hz ztMc0}*0!UktqphIeiNEo8*t%bGj<#)!M6Q{i0~xYbp%?Y$OD}{LF_zw8plg&;UHL5 z&X!-1Lyl1duPa>B8yvx@^CcLYorzUTW+TZFz^YY?Nx~l9vkwUb5*-AO2?;5<{kFSN zT2V)Nqz*`MqP^9Nj;v&a=&fsH*g$ufK=-aTMv4iSo)Sey+NB(Ht`eTIm$^ z_Xh|NgXrwm&OOxmbaKKBEDs^d6NTkV7h>Mr1(-5p9=3e6A4O$#$V$&dZca9m(^D`e zClh=3?8VYWi?L|o0=)kED~OLz!Hj8h2z1hTek*?d>*o=loPz7tEkwzQ-KeBoI7Xx3 zqdaN_>o9e>+Yy77=4QP9)|<#kO+{H*HFoYkfJKWIAU!LQIw4oxu9$TGTgHQ+KFVV3(a6MIbpa97&r&J|X`^QOE7ydjdYvSPP(rX$x$u$tPx! z6cy7L8w-fPq%$NO5;JlP&r@_aN>O=!E#T!L&-M5F$>t-VN=GusC&op(MQBE980paw zNRLlIMpB|}fu_~B4uZPGgm}bSl+Q!`NwB9JJ_2Aphsv%H^vMyT+-VwK`M|aqLw1Kc z#{wec*U$`52Z;{PNr4K3wcOVwxO1aL8aK$7BQ-ftpribEJLF|^(yq5 zucUC*2(_ONh0B#kW2+%$z9|6m^3pR?2{in8@%iWRlOOyNA8y`{EhmLR;Sx>N z9(h=zz36KKNQ0%RU5lcq?dmtbQ~QNs4bV!z@H>Gz>=-P?)E@=`?5u%xBuAUrCXc$#A~ z*omuGFFo8F5x;?SmkkqT*@}fL42p=VaGIG?h|S(Q7S=kP^3Adji=8`1Ggoih$Ea zu%NOd2Bb6{OT)na3k->uH9f2RNR@Lv|E=G=rfi&kXOVTi z=DFrL@_S((MMZ4yVe9yaMJbh z+azx? z+ydb2Gr^3;R@WPejwTIxAD*LWdz&KEOoC{_G1YyfLj?#!dppZ9=DpZW!A)|6D8^Gs zEAg>tWcrf*RvV)uQBqcp^F>wY4Mbzd;bQa*(s?HERdm!PCo?dJ0XoAPCnrIspE7_^ z8g=Dsg?C})oUvFww}5R?UNvt&>c-iVr%+pZin29~m8)(*W_BL>JA05A;~*F+#_Frq zT8uM= zHn+3{4vDv?9pC!;6Sk;p7oE7?{w{3Y`VpOE52j9=NM|#a`mWmm(YSGWNJ>h^`QmdH z5uP-860!-FRsKs(k9a|=b0zbU;Z8I)b>KotC497PK2ZNhD4HkUAn)+rk_YjGo;3p` z2Ou&^d`Z6GXIiWiNnIknpa`6%z2#&_5?sc)hmjbkjRyEJ$I(Sb$xKW_T2efcV`C7b z9K9G1-0^Wx&AnKaVsS;=Yen`|09qwi#qlFWxZ#Ey(B0EOMX%_S11FDP zumZg^XU;=QQ=M%VZHpjyO);P*pzON*XM35lEiy!wv!pj{%jJ?5)(tVTe#iHUa9FWr zg_Ec}wH=LCCBOFC8~FbBenjtbKYsJ`KjO^M67+Wvq{gOW#qyPS{0ooZ);rfDg@9r> zY`_wH74D9S_ZT&#Xri1E1b2RGQ)qfw@kgy>PGJ9I5EmCqgCDAKCp#yQCK^hR3@D1U zY!>mT{nh}V{`hQzpdazQ0Y$yyJw%UC&9_Um=D&jcJiPh(yFA^2`|o`a^XJa7x?C}y z2zu-u0>doKpSJ*O)?A6DE0$vSuATVacYlD36%B}X#8ELsQDFz*5A-4@HwX9M{}2uw zJb>=*E)?YDoCsGbc}4d7i10XX5pj-oSNNtVMj77oPB1wAWXlsk|Glt?igL zdjc8=I1*?)8f$8iXq&JHk&~T+j;;=iIBI2^xNq#(u_zcecvo=SNh;qcn0|yiYt0RTRO+Y}|9t)hH`Hjp7T%$jhIA zF%u@@FVDZi@rbc;krA+k3KRC#7RYYF&By9B*om35&zn1tUw z_byuc_#4WW`o$}DW9i{g}WUNxOAr&O&_FKo3ieN9>EqHGdx@4@8ib0*yA+C*X0(fae9%vDA`-G>9h6J9~Q3*4b@QR`G>)rO?#i;D{WBQTT%Gh>q;Q-8U}59oH;D zeR&D`2!66Na&Y(cs}S!RfY;k=r8%lDmY^Uv7AXl~C_Hl#J-wPX{Q%>~CBoZZkHnND z)HDTAQrQK!Lt6!gAwD4IDHatCvWJFhJgqig4i^+aJlk(SO12od@vdMuN(;Tx4ZW#7i%2rK9*h4(vaSccm_`2+O$0vM9*BUMzmUUEIe`^u5!h>1-? zqGau(>`=}uCzcddnI^5Il|0yjFg>D&5l6Fj>e3sGf-4mh0gXqq^2if)w<=l@~TzH$WApO zR(_#`RuM~8FIN=Irgf#{36i9|4Z~SZkJ`t!u?;Gwtl!u)H3=!jt?v{GG>?i#M$>f4 ztO?Ocw9*uySN^~>MtPyG$$Qc_6yr<@UoGaRQ*9j8+2z^{M#Jm$__ zMGtly(lV0x+hKUAr0N^%QD4_+Q!@ddb{tWD2gjF6M)@t%XHCcS*|P~2`U%#(yv7_{ zvu+hW+O-|$FO*@yv^hwoQTXdCFC#8>5@|VTJpLS8Hn9eye^=LilR zIS;Bgq@*Zn8-^J(rlF>~((>VY`udQPmPEy!XkKYVWDw|YrGfAxz`mB1R^sf5O7aL@ z-jo>#Pt72$f|xfmA2aeZ;Tj5}y-B;kbmN};@58sB`HpP~cg5-}ke-!;Km7Gsix8!! zq#!#z4X?lb4#wxt!en~!9qncOT?NvUVvwGYf!?lgy!7VBNYBm2-4EY~%BmVF(s=y( z*MCJ1`{K|RMs5#5YCp$ct2=3cheMw7;1I_*OrKHd2kDu+T(()dlgd}qx~i|J^TOOw z2=u6qBpoAyJ?&qth@q0;6Qd*X`G>DYQ)2^SX*gG}Scx4UevI9__aKIV^v0WRLU~mM zZod8|{NQ^(Mp;#zUE`J;uR(uv9VSm0hxVR+l$4ekKb$&qHk8Ywd`q@ReB4Q3u@ye2Tl_a^t`Ijup8VjERZd4&Cm5HOTMkWrPspkWDZ560h# zK`8_>Bq~0xNcZI^yG?QPImEkSWRpt19|l>LuLjXgCjoxS8b7n0ba=julp=zI1o_&* z!P^_8vynpjIS3F22w0L4n?QLCSB*D0TjUceF-7y)Vap*FU?IYzyzq0%m&QX=x00HW zTuG;dp2OWSCYM^&B{xf7ORU*=`L#6og7~BtuctQYr{PY@JlkV(O3*$yMA;PZA#G&f zW&1^kA?XRf3azmn)D1=f@`X}h6ev{wq07J~gb(R}3Qjl+`Vi}B|L$4bbi+#Aam%#`^!u=H_h|x}G;G?kg*-Ka88hQ?*G;!! zI52>c@)|tz!(U?Rw3!qj0;Z7x0)LJNokj%-EMg8iqS1r+?XQ1>S6P9(azd)WLi#Ly8_KD0(%`=$4IdoX@{0lxR0@4*uvi~s!Pi?~=-W!u!n z#5=J3%H=4fo(K#(5ga72B3P5t$Kf>DlwA}c)&AI8FcJ|NXFQ?lRYid{3!|<5BI&Ti zx>Pq%=|V$vz$4+N3}q#HkQnbF?}pj^qn$456c^&$32<->#d{hH6^?gOb|d+nMfMbp z=AnqWMexMCY?t=BSN^jO%@(L82AcJp} zyh?7MFzJN<`JnzXMJmH#8c+$*LXH$r)tk~PHJf%N<8^elQK2NFwb_fQlO_{R8W}&m4T6BWs@w|A}Y*QV~+Uy@a$jzf@hxjHdfwn>gO?g?sP;^X{i{j`mJeet=f`NAEbgYqo}Db_D@Pq3kohzH|wUNSqLQ3E2dCt zN=(y4^0?F{>2f7K$HqpRw;UNsWiC+4@2mqn{^4;Mc-8b+=$fGc5$$D`_`S~ID~rVP ztE`+{42<@G`Wf3k*h%2jjKhZxTWNdd-Z+n-(SLhB=VshEEKg1mG7|?oaDWb7?AfkE}FhEAfYn}I0U#90hBywQ}-yF ztD!?OFha!~W#>8FH0au)g8Y%48jGc~$KlxiLl_{~ZmOxpuHE}kda)h@a3d+b0OwCt z;nnB=j!!;#9}ROMzWuEyuy@D%xN`9#9Ne=X#T9j^tE;nxQ7SQ{!q{w?@#=`CiD(>Z zE6(DYD;HZo8rr%EP@>5^lof)L0rFe~L2YiT8>umo=5@^v9v z+Xz;Ioz$U}-7ymhx|`8bUyiO$0w6fiKxax72Q+OcP}%8_Bbc{f8VV*%A~0*B^HFM%WoM6DO+i z_NEV!J3a;9_`+StpksIJND)dZno(I(gM|xcqrB)GI-44C@W3vtTDh9QECql1&sPW( zgQTC|7OF%>XjUjBff^UlQ;Wi~$0S>g&4Pjn$j-{3Q(Q`Cmt*G`fWswlsJ(DU$WsKs zl;OajA3m+HW}lVYNomEt{U@<&*Fox(!_?`1qh-#RR7A(RFl){NoGL7#9S|UvjpCS# zhr|6yO#t=PGHkehJ@#(jjiD$P&(mU@2m}c_wI{J#)44I>B&xvNsmWD zECF4#hu^0Y@FgKWmikiLr)f1Vfut7HXu*c|&Q@B3i!!0bLAFrC_+R;!{qd3XwB56c1OUhJW#n_W=vG!QQ*&ca$b~iK8*7oGYICN5>{q{G% z!OwpB3;29}m@|DAI$MG?lxOK_C*q!m@5EQ1c@nd<)y^mdSJ#yhm*G+04YY-Tov5Py zFcr~IUW=ECS5uZIU=AmZSZtN^5a_w52I9~)60^a@p4m|NWf|A-Z@UcI2jlJmZ?xiP7 zLqdJG4sw!qZII!$ z$dJV3k|DQ9GC$K8iw6~%()R)dI@cn&dCfO>$!Xnp2CeP?B0_(D3$#n+NS5m1ZYY{wkx729iN zW)3Ck$ZI(XVh6n4a65+)=Z?bBqsLI++(hs+22D*B`21(?CI7S`jSj@DsS|OG&fdX2 z2a%JVOpw|`ppuQZ-`<6jC(j`+o;>NGz8s3ghaVh3TXQ#(;+$50v%0#GV;kb-C^-cL z#mdtg8P+OZKbjhwC~KiY-^vr~_w`d3#$v_t*~rPCicaq+5|UGJ&)qlE(T~N!!$sJ8 zun6D(!ROK1)oDf3Q`7S?Wy(~{n5O*MsmM;tMC5P^{`$%$y!+8UEMK)24OJI$_ULg; zoiGtQc79Acb>r@PZ#Q23%b#9AUS2Mp@P0J6G$R;L4y}N+@N`TxcBaxFmL*Jq{T;L$($L;$&AC?8FNv1^0=iO zXwi@OT)BYSl`4`tCW(${W_l8T6OS0uUFB9{;u7c_IuV-~1CKMt%CIQn>(R~{v?WfC zf%5lcZv^lZ=@Z}+5Er}3c8Iqf947@}^x7OMJ)1mA40z(dkALd%F9m%XZaoB**p$$F z{wLL>L%<`XsCdxO8GG;qF^?3PfQ^9?oxu-`f28#FJ6(s*)T8_=6z0|@)VT#YsH`qW zPuD2s%%6-4MF-K}OR&XjY1N=KZGB^ltu9?SZ#jji$)aMa2c@ajkS8ZiN`uOKD1nKlvV>`_pd`JMERyvfCTIb_j|RzUQ?qOg|9C!M%BU!zNQ(tRyKlgN zmq?^CDSn@yzoFrfVzs^y5YPZ98esh)%|u&yWd`nO3^fI(WL%w~cBv7fgAOytGH#dN z>AfOo+1aURZmmLbNfi}>$J(zVtcj^fShH>|7A#td((+2|*>l+TXjHyfR%SA$PMu&= z_dQ+RXl-i4vPBCGbXV2a;)zE;heRs!Ypz;r#h3esf^Z}zVb9S*Tx{w`cEUsiyPB|K z#YFVli5hR{2#@N&hwAWT*&eX{So!z9}0IuJ# z9+h=f$j&RU&Db|?+KI}VUWB{TkWN56VZs>l)lAHvKbJ~360z|y1g_WMOlb?YZr@{| z&%!y}g_M{m%v>KSYdLeeh=4lZ zOB*U5&;TNTqxS1IR;DK;=+?ea&Cd|nWn=7;YX1;*m986#s)u8c-_1rl0b=S~gyNH}|s+F3@_70K1rlY^76&)=- zR%lq21(K;VwR+U&3$QN&4dk2PAOU3yyuKhE+yN_m9;yPs@xH|K$&|tQix(p=e=^d> zjl;VizJ~?#7UEjUROGM=C)t*8j$dP4Bd)t)EwZSW-r2Yrxnnahmpq;p6Oa8L9m8*4 zd=Z1rcz}F&`1l2s7nkBf;R(biMqu&snV3C$2By!LNIHdEN|1&u%IP3b?L$X<9rm!WL8726{|G%aBMA^j>-{^tk|Qpgu((^E5$^_dY zN99iBv4jfZl7ra}<(LR;2?uHCgQSEQG&k1Z*FXC)UU>F-DvT7Qq>sa?V-+YqQGuMC zvH08*pTWbQeE`$uPJw^GPots?vXJ7pX(0AN5uVUgHUAkl3q>+5U&07NBTFHZvGPz5 zWB5?+lOlJTE*hdTROCQLLB>ltUaDhgxqG~p%**A7g(dupM(Ps}o2nJ%Lc}z~BZZ^G zw$S3|p)*5*Yqg*>{lxPkBL@g5XbdCbDd+>3I4y^uSVq&0)T}hDx?&Bc&6tOy$BSs# z&$7RyA^URE_17RSCKB&$-i(|vIRtj8c>A5rNRCg&$iN83<>MGcjxNe7KX-P*T%?w*C=3|MJ^dzIX``=tWy|6JCGw9X$NV!>DU$ z#DxpxxMt0@9D^v_LGORwg1IQEC`Wgnk6v*GwtajEyY?MNb6dBqW>XEUV9<+xUmKD$ zQgN}N8LeG3%2A1E=^e(aZ*9ipX*2Mdhi<_g*DuGJqdO2sKosD3c{#?)YqjYS@}EUo zB?lS-@uTsKI9)svn$`>91fC}rqJh^6Lj~OuoWqzuC7pa7hA({P9=!g>E4JrxT}u~! z^vjn~Q`Lz6&VJ-1r()9^Z^BInBx2Z))Fd|+uU>`!{Lkmm?{}b~u^q=b7765cIX#N< zsz|qZNIWT7(e!R;?^p7&41pqPY8Uw>ijRuo3s^jBCgR*-m_8*N=_zi+C#2z{J%uQ1 z9zjWcpLUU#uV;=1A#Vt5Nfu}f73~uLiVFq$hIoGgN`5T%H5m=@v_O%r5n5DXl;YmndKaD-lH}J`8S#}Bagsr%xBPQ7$A@7@urkM+!W4y#a-mj;#30GgS1h-Kho&0fU zOA9iR5>Q)NjsgDwZn}0I3i5Jr^7skNoH-NpsLUOVDsDWQQ4={Sn# z{{Av)=|*c?HR5C0&oB?~;=zFfhj>o{oWTL~b`jVNgjp_SLY&L;^UUcajkGUwA04jh zni?Ai_Lu;JK#aoxi zZYXz8Hc0%X=$&5MLJjhh`1LaIlPt&~F}q{7$Jp-Q$G`CSm*@0}1;hjjW0NOB3}L83 z+MZARK#EYBTMVUVi#GA46oeuQdL!@O6do0Zmd*3zOA1gI<8Ll0@}{mz!_74a=4-Lt)uD_~-#gdQ$Mgo|D-8@kvxS`w_+WsyQdn zSxUt}b^1KKy=fzsELP#vWa{BwG_|*&toS^=@qQdQSb+~dIFIsLFOsuzF=N4EL?)!- z$k{Rk`}}y|-VJaNAXe3OprWD$pM2;p+<5&8_=mdjw`ZTjGtc}82aldW3zhnv_uYw- z;v$q)*T4}QL*Q4B=bnF)AUB3|8HR@nJ(9+H(BFr7Q^w+^^~;c-myUP0eT+RPN^tC4 z9f4s#oKYUM)iq$!l<{b9qa!kXg01@X_mkIXoBe!@L@0kOG<`QbqG?kCcpC_T@=H5R z7~&BS7x(ZCz8BvJhzR`WW=G-YKYj``Cg$Ofzy2#$EWHXBiYw63-HzPcWPJa7Par=x zhU4x>dvhzcZQVsWuA=f!#I`LT(tzHL?K^i;21e1->oq=#iW2D2B8Wk&-IbV}WYciI zARU_FK^ip|d4fhjeGsp)iKD?G)L*PcQE?^aEnA6qx6**QG6>?kaQJ*3dPk#a%=jR0 zMR3doyasqL<@H*c1C5=)8qp8?CPzd-LBK~jY6Mw)XQbhO;$caRrYY^U^oANPRAdC? z_y_>;ED4POl-0Vs{554#v{Y`eE-2urR0-Q!kn~lQT=g(bC7HOA-Vz4Az9cu&Ns?uY z+VL9t+M<)}i^jzkwCJAto8eF#ibxLdhFTb+eN`Q7hXDY- zmL3r;Ob*$X0qTGVm&)Z3NQ|-#egX}(V$et4V87KaI*Q6?j)_gAgWHeZjvmaPIm6Cb zvT_+pD=(s}BZ!lQXVKBoiPdY?ASXKub7xFNR%$XPj?J-(0+Xgs#i64|sY63s7arWZ z4TY{Tg365CU~wU0tZJZ_ucc-m0BQ zeMJW>H8~E;R;+@X4nlQ(GaBkI;+x-il1@_|PDtOD*WqWs{0@$u+Qn=167XG*)RcHQ z-GkIOYmrEYBw{E68{gTAy$6q@ys;5Jl40?zX_#J+jTm$zJlKQs(qh^JO?^jM^zPkF z+X;Bwm^*(yjvPOR-24Kxw05AYw}-q>y~{Rhw1&*S8&5`=S12FaJ2E>=xPN3@4LLmAf$4FS_2X`!O~iiGy{51?;=wu_EX zO?59Wls2KVz6nIC1mS6zI(`h6Em~^}T;6@-EjqtfqCYT--#`0z6jxOtCMg<`ykBJa z0Gy-!NOOnNv5TdS(e`NxaJZ7_s6|oEV@W4BKZ~*2i_zLyBU+9Q9Uk#KZJwr|l`F0t zHk3}F&ny5FNt?xX%b^!c^n$A^@UtI(8(ZFc zlUg;F-enxl94bd!br)t&n}Nrl{yaYU#DmBhn`)&D40ur()IRk^;6TRBi~{d#MvX*~ zaWTJ$9gxw}RGk?Ueh>n>A^K?QNy=WUbfr*TP6;WMsucp=t!dH8iyD+J0w>Q@qNybu-eEVcz5NzM#5-~DWC_{`{vW>ob}XAU2gPR&!R4TF zjT)s>Fo>%1Aa10dB?v6Ujy>mT7~8RO$t)x% zQGq&v9==z?yud(MZ~zb9e zjpq*>J)1a3lPD!v^HA}#oIRAZ1Oo} z#w?sTSAxdg2-G)sz!{@$@dyOi8Hs{cb<4T3gmCsmJSb(MZT+ka5{-)bC;1r?kMabI zGVr}c9Rz%NA)Th*%0ba90qDz-2Z2PjMYNMV>P7+@p{>mLnPiEKZ8?-$i9ui)O#^8u z5ko4_P4MNU!PXBY7XoRahVnuAA{}Jl&3WTJ)J{buwXwYbqvgcXnUgye`Z<9bpCkEm zjwZ)>z!t-3QOGdI-ge>8;v8OkSo(@h()6?SSN#zmh#zzf0z|dPK}S|C{dfR5Oucse#W=_MLIg{wzc2aK!P*L7M9m@8Ro++vEsIIN%7)29o zDq<9Y?oKa3OP5XWDi7D|4W*%2WSjjHKFuk}!Tc4AFnR7A@Y7hSW*S}!tiiKD{Zz1C2;>_`DqocL?y=`=wJ?Qs#qo=12 zdrzFA{_n!RgU3)>QH3skrc{e?(o&0sw9w-Cu@mNGUvu?UXlZM+$gj#H$qA2kjPkvQ z_8}E%S?O4H6T;XAEjuXMtrPb)6 zeQ&i;$W8DUVE{1bA4ab?40Y|@sA;M~R(3QVy8BwJUA_#b4;ND3ZNi;*+y_rW2LAT< zH__4OMKt^8i6M>2Ad&DPCUOLs1bf*j$w-djcgpdOj)lh)V<}8AvGJklT#nhsv)wj5ao%E1*YSQ_iUP*S6a<*^)HyA%_0<@xRsazsdA2feil_2r;!~ z3Nv&lS|Q^lCbIVm74Ws3Vlh+*;2G2leXiI1jZP1J$E${Gx^qCfk4oK#q!bz~?NUMg zK0Y^xO6xe1(lRi9d_L;xs%dlr_FGMrdi#PjhE-U1+|y5 zC;~E(9h(}g$^0pkkIN`Hx5l*gg(W?N>k4ZcQ;e30SBb zFn9JuRFpPa)bseUL-_oo4^pwVlBQmG;#1M??ZN6RR>BoFj7eisfWdB*RTg8_x@+*` z-#w3Q2P@Fh5kyR4rbR{wFDz2w^AF%lUw9Igr}iR=3M?xt4`)j10cQd}prZZYy|aQU zxbfOs(caUJDKjS%d^mCPbSZ&IIBr;fH6Ffi1Ma(NJx(4!N_s@&d*As1X3x&Yo&)cr zskI&3wjRN)H*DaT4O20WAV^-Ss&3=B#o^SsQUcp9WTZH;?ux}|Yph01aTx-=LEDE^ z3o%B?PlJ9h8fqJ`XzoG`koS`4d{kFoq*qTbp9Xwnzzd&u1T|Hym^Xg`73&ZZJmHu> zI}a0cQqb4jih{8jsH?7`_wBUt6_`*`kH*vX)+K+~>Rho87;I*y20}Tze7&m4N z0pIm>j=U%-DMFyX4{@G2^bV7M+4jINjY$Lz2!RhdhyazXCqPmiIvE$+7LNB&nH^nU zc~7=tR()5LT)q_fH9~C=FN-A!-mHEd&k=YOUz;rPwRDF~f09Pp<}I}A0e{54NTvp9 zFeSE%sA)P^Q|dxvN~O>gmw=l9oPeJq9(qu%@)6Qak`F}>2h@JHT{0>MG~~2~kp}~^ z@4T+$hR^(s3P!7~iXsZ==`%B-nil5oi8E=4wQ5p8kKMhb^Ay!p^u?~jYn#F4!(>!r z!Ox|K{JsI+Bbsf{jd>pBbJ*{rOnccUf?VF~@QE`7U_s=KOUI%Gld*i+R3sBLt-tC< zI#|>2*4r=Q?mMr;#YzCqKrz3S>50UV|mETu55?f6J_~%7*!Nl(}EGyyG?XNR9soL_y~H~3GJN27f2-loj-pb2EyWS;8Z0J zpDM)aRf}-LjaT9I*Eh4>(YW)r8!>IhL}X-;$Iq4Hjn_8fmRqjFmFt$XO_4ZBo^NaK z!O_E~uy5}{(!j^-`w;3KU z_j<8l!Av~ziO=AX&pwH+{$V;!@fdY#ffHp&EA+`5nK5A)mzj#xxLB*lsFk^Hg1tBb zy|{R7nHG8b#=(P-v0ad zfZo)c!+nx6zJkCvU^D(B+D!?y(_HA@DSK;@+`cEV!jKSPR zvrt*ng2JS83Ml5Wv1xZ~2XYtI2>B*tNOUJ9m08bKHiGQKL40Sg?{keXYj$+x1kN>N1X8lNaQ60JBq=PE|Pt{ z7doP3ST7|9`keeKS#|Ic92kUCJR#X-XG2bsu0T0bLLr?beMZ3}DCF<-o*+Y|RRjzT z7b;(m*Od%P=ES>_n=m>Uk}2ieIq3{)+eEFJRD?}{E{fL|`32^5Lp=#RXyvco*zOrN zeM#dez{++82M5RxDy}?0P|9<8erN>wOa4ZN)n+J24{f`rw%B4Z7l8opEuct2FrZ4* zY5frJu<2nPmt;^8Mvgq?s|i!{ld*2;EEJzP0o8I;^K?H~R1ly0)Lppu_Ulkcz&ASV z#KnsZ?DL4#V{}D$u>at3?B8>cZH~nK_uY-EnkpPUb`JH8?O3sDHdd@y!ah*{5UgD| zcOEH82?TdtIC0{nr71{X3P?mm2+%60*v-#J(b3s~o~|yNnipLH0k82$R!%0CuUcvg zG0xZbz!^P)Weca{vCn)4zxc)PkeHB$Z+`7b?A^VM@^}G@mrp}lS}dkbnt|z)r_iw_ z!;@~c7n_ltF$OQc^a_fLi>Zf$rstH8Cef%UtwdTv3er+NxaPW5SUh(g_I|hz(Gf8g zp&bej@rQ_|QasxC_teQll*j9lo|Z{Kc?KQ*9keMRAX|ug@4g!yjedOfiSJ_X{zLG@ zISJCq%cBG6>FGp#N(P+nRE~>>JRjs3dFi`Fk}n9JoEnpG>W^qd6TB&p+8N_UR9ru9 zTE7NYEnbW%WAji|QH51&*W>k#@3Dn$Y}|ebUEY3zMA?Y|^#h*=d`R>}BA-rUPGS;b zqhrhw)fQ=Saq) zts&!vBF)D5|33aVKK`YkPwXKjA$6x@bSb>chp>iKkiX1Bm!AI-$)mIi%t=k!RHlvWmF^_taqf752nUoe-(bCh7MA3ndIMv($Z zCGVzkJbmgECeg#q9+v@6Vi?X}IEQ2V&%zUyg4G0jU;O&#aKo+F!JQam$?PLEc)Ybm z7$hvVJrCP>IV!34$!phl>Ze+#_E~;}-t%|*+zhsipb6Qq8L=TMcU@fd+Vnf^!l2)V zR`L>TP)_L@LX=jlfJ#OeZ4fmvVFHyKf$AMo{I+VqKd_q|O7ml-q+;5Y~b_u=DhAL87} zYTWa{2DG-dV$-G_ShM^Nv^03J<(GSJ!6KBBiAzR@FWuBhx@cPO=vN)S`Qk zjsd}+0x* zNRaUBpZx-WDCcPvx^kn%>a9q5^m1bMm%8 zTxh2X$^`+dfRyr8E%kziPCI5O@*-KWJU*uubPN(KsbmGOs+=>vSNpWMNkd?=&9+K* z1j9lAl=q{oX^dn%wJoFa1tTa6>XX2_IzPg(WCJOe`UM%1=V+Rnrx{RE3WqcsDM3Te z@#VES_y{BOnw+xDDkr09H=oxJcVs_qU%w2F{szpPl!w>(^ry z9gRAU+2l#%tu%^?H_x9n1^s=!_`_dcz{K2qESNhRAH2T>M^2Vv@1ar@RaRiaq->-o z#N)ZYJdfV4UewoA8)ze?NGtL}W2a3YOZUh@ZD?pCu%n*s50KZ}O<(#|hf%ZDdbn+#ztuRf=QPh9#HSy*6~~WOVe1EPV$F)> zm{u?iPFFZCRu&oUb93@=~>t>}o&~o!+dJG~#C!Id`JA zp_(U!^tk@h??QD?HQhRdz5DiK#`GD;$V^0a!wEe0=x4EH$!h%UNB@au|NJt?OxNak zgi}ut;Af-_;rrkD5{ind;2U*Yo~46yijGkJTs+4*B)FPRR`g#0*hNq#Fm>OZS76VbFl*s*yt?TF>cD=u+ysnaDrBzoqaoyFrXV*X1<3?=9+#Va z@>srJY-}RIUOa6?yiMgsJ7W+cRAKyoXJ17H+(n>A~eDz26G}&X@ zBr6tG{`c|!h~r-#>61#kJYD%;4+AJton$79FcHw`9OVmyrWGZJdX^#_GUaDpt^GCx z{Pa4MbH;yE`~pz=PRy)mm_ScYZ?}1*y;MH(KGV|EsJQwpr^H94q{RqY(W@MW!-r1b zhU;#ilJugiyb|;0FUAvJ`68~kW({04@LG*)(KNM}H&=wifT`Zgda*60#0|Kr-vXs- zTnH5E9KE;jIfY7{w0=-|u-p88n94qs19PdPcD};u>YHkcdE6d?y#RXqdJI6S?}{u4 z#OX)6r;efF0Rkbv0TYGoBW>lc8Z9FgM&Xa55oiDP8QY-sbD>}AYxPI%w^L0SNCD`l z7UJL|G~KI+6AdPfq}`W&m@;`Hwr<@_rSC&>QW6^LJCK(*k=|w)cI?@X^*3INH(uX} zIs%KXzAk+A8&BcTv4d<+8pZu6zGV+u8@h4*%{SAVA4Nh+GR~Kr z#mle0hvO$};G*~6N;;NSwBy5%iqYB9ff#2Pu3Wyrwx4QhsIx^29wmnpEhWTjFG@Gs z+uCi~BsC?S271VDGjBrec3;?NSnDK^n8f%$h^`^`NP_*`|t{8|yHB{8+49z7*L6w}q!p!0YQG*p0)Nzxp&TR@dO3 z`yR$eA8p6D+&r|mcA|v9z&GMXOYflNHc4(It5(~Nyd)=2$?`%=;yqi0M23&0Xlz_g`l6`4Z%%0ptRVy2n;EI zSFEd&H=?Zon_ZXJ(sZhAV4Be4F`e-7EP}0Y|&NE0&j|Rh1w+$FQXYj zg(2KVGYYM6)^9bQ+6!6ZXTVndHgN9@rO0RdjpQ1EJk~m5ANtVoIb04XiwnU^;csKf!)lR)2P1!2zb4? z`l_ojb>>t8lqh_#c{7%;Sb*-{c64y8KmD0|k)Nw5*;temSJ)0n(xV6qlE*`(n&d!7 za!ggjad2=L7ptn#+uLt?TeQ^q+7H`B87i1K4hvSSMsvpi_8lt3(Nm}Kg(sgtMtnRz z-10G|Oqq^}6AO?(emt)iji%OKy!XL}`0A4nVdm5VMAMl$eY^zkytM@>X(>oeO*IGj z-M6=pZ$f&=W=Kd+Ij^DoGmZ*rr77u~uD=eQoy~j?+JaP+7MGhtK&If}$;ycAMw`N2W-dpW+k zKLPs)dCeK7lm_w&pQ(%~f4UF(N=!qZDlIx^)3Zw!Oha;NJX}d>*!aN?>XLS(BukIb z86Y1!B1Wum{J89Nq$kE9mVE1WdT8t1wi?(L8M%?7vx3pEA659U%bl}{`>fU(DA=PPM^exe9gZQ`$#>Sb~GS!`TG#i zpt7XWzMMZMqj2d(=rjXUyp9ZoT|iL_El?oO5=BYCr3^3caG_k7#P}qfKYJQ0S1iWS zqeqdIkzpXJqqW-7?&ij2o9hu-%Jo+jgVA(T~N8 zmto!7B}hz8!};P$+`Qo~tXp>t)?a@Ey1fKTG>qx|T~+xxJbwQMtY5bXAMN^>;2nse zak=xld009<8>s~E7wekv?8_V3rf^IgGX~SAj;A5?p)1gfojcyaOoGEb2R_1)Q)kfD zHHh|J2jY`*F>M+RM)ZKyjvGH^8jhYji_*$Y6c*MYNH2O^b~MIh(iN~g4)UJK28|M* zjmz|`apJvE$&@4)y1QBs8=XR9 zzmkSI9QzOMz%m+s-~YkhUw~P5U00*%s5*5RimQv8nHfbb=vIp*Te4(Xkz_lLWjk@~ zBu?yr6NgQ4%xp_$Sy%JF~iecyZUf_-oP-qokiJ{#AXYr>dw ztu+@7{L@drf~Ct=<3oS+K4d6c2M->=-+%V6arnSqR92MYSHJuf9((K$$R-(lzyt5am%i{teBeVLBfx$Rt%C`?_|7p55_7sdN=nW0Q{H9oR8F#$=?7NC`ACNN zXJZBxc_1HZWfdR!B%2}-=Djw%miLk~or;pCmhy&jq+tQ-rjkP<&@5TCs2;(`s3yk< zh)|Z5)6&gr6(!BEFuGPW)tEzpxzP+ANWMgoKh3!GQI^y`Y0b>%Gv!>$nQ&S}qQZAm z{sitcv(bSNH26gIN~vVs^L)PeN3(g;sd1U64&(DAQyM6*@~I2eG^L)&dsrLmhE&u~ z**`RE9Em7G1u1;sy|?4WmGkiO%P*35uD5Q(Pk!oCm_Bt9Ce~Kb!D=KgRw15=VbRh> zIDh^$-g)y?8hsZ5MLC{-{zXilIuGCa=8wo{Ssn{xE}ge?r_P|WvlE+cyN$;SC_h28 zw6x<&<3)r*J~}-`tc$wG6Qr>p!$ZRaL>-7lwH%=8tsIVVqu09GuXg!-yVl$B4wmCNT5 zA4=iH=Qrc>g(keU`BiMVZKK(YXMXXF$?N!n{}yOaJFwjeVMs?8lBppqC#ae|ccwW< zef?1^UbF|jFv<|wnqDD}FkH=)IG-N=) z&re=e1_h}M#?e`4&q_!kH&i`clF+tQX zF_ojxoM@fAetw(A4*<5iShJ*oK+G$?MUE2j*tZLN6lq5Dip5B3ca2vpEG#HjQs z2pWvdm#E9YB6NJNjFJH)d6N`mi+HJAEQ`RailmPLS?)-QTf|RbkOHQweH6}gGQoE$ za>(aM8I0Yd-&&j4O^;6COYfGT%5Z4Fe=Ipn#Y3gbd-Q7Sg5qXly-1r>I%~7GEE>pj zdWSRVBoAd}rA{P-*YS?Avg@OAI!aT9$VuD6gETa{Mqa%$4l2*meaxIS8wH*ae(|%X z@%exL5{@1|hx*z{mgM+CLmT&NP~>x=xqSfN|NhT0dEyLIPN>3;ojXudUxlGq0_QKZ zV&ly>VaMjJC?P1FHmR2MP2gi6yblANjnmmh#vW|CaUJftZ4KI+ zPO^PR>|I*Fl#PIVD(#Vsx-G4d&Dd&^fklDISTcM9{sIiQ$IFV>YTPCL&44NYR&VJGNLVp09oHXE@bF9%zg5*&*W} z89jkAP1sPPT1U<)FXU;H51!YUyL>+}052czU)K7-e5=!8(G459QANk(JoWlC0!$uD+1R`S zOSQs_SvI!iSme*r#85tYlcVFLV^k29kwswLyab|rrvNEm5zCC??d=EP4TR9xm%{fc zgO@K|#AENd7n91v1S18QJ#7lkT{z1}Xbhv^;|SI)S&GP#-Q@ zwg{6Zm*cgUpQW=nj5XJH%$#Oh(rKW>5RDFFXpoLGJQx@pv~({< zSGJLs29&OnHc{f^$&|r`D{sJSTX#}M68PKCd<^&Axt?`MTb6|F1Ud5;PQpERZL*$# z91>W&b|I?DtI*k!#NU7MDfA8X;?w2=50ZNhh=tT&KxLy z1b_-Waxe5JL@4JfpK|Z$Q$_c~#Y$zAVcQO1&ipF$cDJ)`MJxyD?IRzOL(-`M)RzbG z@h2W8AIEX|@+Eiz5qQHz_T-&=j^dTKcEBAdWP2(Qpm)YtrYveoy_ix{fe8e8Mbs^d zSZiX2KTOb96r$5cz(?LzS^NP%b(kh-s5_T>iTq__`FKpJyT&8hqLqN2?4%u2wZ&s1 z+tuy=wcGCz^chOvM`p_L+#SfoKWZ{5d-=$UY}wTsvMo>$``6##^Dhfpb_$<@=1dO~#-2z%YM3F}g9xsfj z`;nl80_ZNLt64aJ%-h! za!~35?W-F-V~J8HO`eXyp+0>3JKwa0$B!L7itf&S8rLw2iYjsI#*Ij4x-n&1C4s{( z_-U{nd+)>e*Dw4l-u=G&(bUm`xwGfu^Z)iAIDF(RZrOM%e);q>=*mDF>%ry^z^6LcB2G<6ES<% zL>i$U0>OG5*?Sl*EiJfX!##NNdq2Uw_rDuGgU!g04(ZM)TACVJWpXJMp_VYxY-kx< zfo(;al=N0(^^_oYn8waaI%=hnR5E6?awgm;*Hu1Ji73fN!{>J4+}U%OSW}DQ5P=^X zQS`gg(1L89A9-4$%#4x@^Bg)IaWtJdjQek2j|cC%k<1gr>2sHn%MT$#=2I80fStzF z3G~SLIw^u!ZXVO7meam7Hk1H~=Tr|l7-`M6CXWsG_2J&zHzLvBhgV;E9`CwmlP$5e zb?+GrwGIj)%IrWNm0x z`J3E5$|D*x8;zoX4vAYSNRXye#(MGGnAlibDa{ZCl!lCQMcEx;yJgsZ`R)LLF|UzM zAs`$T-300=3!QtDiEaF`@#femWdJ zUPIYuoox~djl3LOtGvp{x@v-m+B(a69y!yAmd<9}efLdRf9(qFrSs&c%$5`u<4VgF z)X|Ab4R>JayeTLlD5$Bf$C=aTaE<`6u66?MyyXVOqCI&0k^6AX>eZNBKNT(Q9hfqA z9vWIZ@x32WX70Ha7tS9>IzDJ=U0Ux#D5CLg) zFhS=ziJFPEm@{h*zW4PXpsTf;KyQeSa}1j{-D0a_T)Et2dQ!`o2>@y`o-9y7K@oY4 zHiuq?_#ly`qerK^xTq8(bRq^vQiu)$F62bd)bJ8izMOj>_T+ws%uN%Zdwe{P-zMs;ftJRV9ubIe@B)I*XzyrGu_h@IaBpS}LO1 zR4f`a9~+LNkoT(lP9BjKao2n8JuIid==i4kX#9%mV|C*{2dp}?1hYb&+N|LGkLP8K zWhC^;WR;6=)Vwu~fk_eYX?;qSNdQ(x!+;p?QwUxjojhyRHBC?=uTw_;w{ruEcqFSu zE0r)>YbV+@d|r@BM1!i8o607DNWqOM0)a`#Q-*bIYW6Snh|RduiYHf^8VI(&f$x0x z2RMJBnH7^okq_bC@uCOnI1te-!EFh#cvE-g6aHZ8jn5n0A@}p=;oEybGZ9~TM;I&?Ao;-55DJ7 zY~8-sB4+pAcMrbzo$un&$3B36|H^kzIAIpP_WfrOPkV{U{MdKk2#f60^1dbPZcG`1P9l5WboA`}@uGn=9V z#779EOI~!X7K&H2kBG`XdHm@5BtfNsa55o4NoR>hUbEaavtMArWS!t%WfQ1YcdwL# z(Up%DpQ{^I5kqsxxRD!7UdR$gZ|A6Ut&WLT)ctE9obORIOxJ5IXF0?<0Yg25jzN<8 zO1&3OyYg9jXEbdP&O6i0~lH|QK z?z?v*W>2j}B;-MNR~t&pipc{FC|2U}6PFS81+n>!Ehs6gvalY9TIz~g{OHF&#mAob6t?f& zN{4$3KKr@PQm+o-n_vGn7B5|c8M7B4;2FfSrPEo*Bo@z|kNvw(lDD44g)6ND;7aVA zK_AO{Xx~;;))eD?k3WcOuDc$&5as1sbtz`E-`m^T(B9sLo}O;XeUh{q zwP897mn_EANi*@(kA8_u7cXHb-igor^`GGjU-%w2Y`7IwHPtwF{3yHx;~Ez&pd>w7 zQj$YyQH0J{XY-2C=$~HXlM}KKKF%RxLLLdm-bkj0C z@z^6s_D6AW&t6ndD8hBuFT>U?dl65Nul&@nZrQaoJb4)e-6NPtJyu;BL@8w_7$`A- zr!IDlVbnO|pt^Di^g=x54mjiXq^rG@P37p*WFYGWlTOoz^-x`8N5p%w!S=Zd`2JgM zzems~Hu^7Ck{Xt9NJ*04OfhP+2$;_Ew-lq)r?c-w0QFleDPSW;HQ=Xv?9o(!dM5v5 z67&)o1D$e!p}-ffqJm5lv}hHMefth!&FVGi>+e8MeIP9(9ocHM*?2XKy=+BrRQv>^!Ywhg!Wzsq$;YXYXz#DG6^t9 z#mf@#I$o|Bl^SGA5wysg2DodPoOmooBORs!A^_nrfiXp!l)gbg(gyewoXU`jHa;3w z4XDT%Ry%>%wCP$F&21AKG)AYTrO6VBwiD!Z(yPuQ zh*w_OhMn8?p{BeNbp+UF&z(bUNgmY z-*+E|(jEBnw|>g9mtq3}==G~-VDnpVn1T!j3VB>aV@nWRC>gORsK}-aiXsDpgF^&v zY4TLo09ZOr<4itO)HaqNJxfaMoH$Wq*9dLQcr9751Oq)im`ua#3gj@vYvV~8mys|$ z!BU>fqP3~pa@}?IHef>P}?y2>i1>jj!3x8ndH(c534>=4aD# zhwm0ID*3PmXln^Kolg>k`3ppnz^YvCimj^vZq zeHyh$M~QrByw36~1&f9T=%?|Z0G5o7z-hD}es%AXViXhS;~H^Rq{t=+f>M_6Q1L;{ zWOisv`64|EMzgk1zjaj+v@8D~-66h2K#3c_b3#uviY`TR*j8%qR6JqeuCOqG5w@A% z=MjYAyRrnm9`ZhAi9C>r%VF}^I~6Sytu2z|Jbmnc=UXx^MIf;1$T;82w$eRLbkK>S z3wSCSvrbd^oqO3{fe7WE4uF$J!vUB130}|NBkCIGhf09Y85@VlwpJvX6~l>>4G0yM zWA@BB1VY>Cz+|y*?Gh|oG!G%KAMt3MAjD1Gq6uLMESkR%3l}X$&R>9w4UJg5Y#lm! zqxkMmer99t%8T;xp1ZHd1Mj*WJGSh`NjeLKkrK*4KV=}!I*At46LgS5Wreu;&f9Ex zuv{t+zxve+XlUxd=lac135=^OE zj<(J`eDX72B#+&Qci*=j%cqrMf;)i(+vCjfLkQE+J#y>>Iy-u>Y{^m^({|?UN%Rg3 zqouXU^p#Rn$w897)h7L`NkEFA-T%zB~z6U+seYokCTP#=S#fv=zq&qQb$|S76 zX+2JyKE`Kd$WI!2lf+FoFTk&V{RR&0-$%LjB9$C0jrt=GM-E)U$>wf4L%q1?zMJ9o74h9UeDP~PMw~h(>!BRb8B;V)c}y!J zAxy5S#DpTHVTr(B5Hg?_4n?fpG;U8(JdN8^dM+<{R#9RBK8-KdFciyk$!FWrhU7B? zucU)`Q#@!g=ctIQ+kdm|{{h{*+D!FPfk{mX7*YAzQT^vAM;Te?h}1a0`IASvCymG> zbmL9I(70NZ&^hYdLe6ynm~^X-IuSQJK#fG5NkvIL>8HZXj^NP2;g6aS>BSCk(&p@s13K-G&*Ig- zQh6xiV%<9|zwWmPf&Fugh<=VoWt3}4;|umJ^8bK*0jVCj} z67->$o~;t;Dog(8D9xAXCf!G)6OR*+6c`4YOiWhjftT{NDmHaRE?sUyD(l1LhHe^?AU^o;9ay<=22LD3j1N8WL39r^p}(aYS1vW<*1PUT zX?+#WT|9&5e)>yvx3pv8{)yPbVttt8wQ&ci|(S_!yQhTZvMwgIpfs^UveZ z-V<20;s(|ygwmP`2$YuMw!7bjmDesr)0NApsh)<}^A}<7fz2q0Ch&oW9wPv2#-Sre z;3qvaW>GxGCghewipEjgI5ZR^{Rv!HXOf?vJe$PAR^~^_RBfm{W{L{2t;N%%#qjVT zE?+!{lgG}me4Qw%nvAYkhCs9rdET%^>qfItI&3n$! zwgmWIwxxj=0ywsxqGcMVlcm8IAdsOGZ>fC0;ZKtlwvjUb%kUBK$moqE6PEg?pT@eO zwGSV8{C-@wYAMcLX~KoegE)Gwffyo(Sa&b3UA6|>cfC!};301Y@$y?+P*hWc!>3Q7 zu&59p{@@cheX$9bDI@CUBMv60Vi|oQ> zvuLnbHwwSy&PxtqxbrePIxk|VyBWj%?Z~EvENUs|#+El@4b`Qnh2hhRf>IW;q>u9J z6$t<4q)D8%$nt$T(ol3zl+9*6=hE;IOb9@zJ5^&}J$$b69NLN!d{04uGDdn?>LURP z$t<60k0meIY+L&+V=DP~#>lF_!6t`Lv#3=B{M2Ds;4QEr1R85-&Kq@wz=_7~DR-PE z+-UU%MJID)L|4E^ULnwv@#g)CB+CJ{^?q4ajm=7?93a`-*^KBw1JBSL+U z6F|#|oB0mzWJi+-Mm*>r&?*@Tf`u?jt1B&UW{^5!>7qq=<+&FybIMFQo+&!MZPo?( z*4uB;A?aqB{g!xL`pd^QUa))#3hU@R?a_L-dvVK+*JJgHWq9$`S8%1J74N$DW?Vjh z5$jf7gEwA(lYsOP)?T|BH($3BVecr~dXxC_m%oqaU)W4~hp_9=0kn0rqPVaKr%#;3 z{@weG&r{Tgnuyd%2lL?mgHSF|IauwT($x`kbagmUWL~Fn(+V^wvg+~X@YshQA;7F6 z9r7`I`eKCXXzks17+ZJjVY^ZDvzXk*#(?A--P2Q zTCnfPF@#Ilrdn7alcWw$qb%Y@ZFv~=6@@lY!^Z9T1oX<_4+Rj4L~LfRkNR73XfxO; zOJ4F&fbHS;5b%+gY*sEm8ZM;v(U2aeE7#%8tAOvn_x3vkeTKfA-Tz?|Y!mBI;R&n= z7|Au{X39|??TaTRsM_bBed`33n!3`YVeO|htoFvf#LU#~+#OedVs!cHG#+`5m#llU z`BDNSC=7=Q>RL?MEt^mMgShUhI*qo{=p%6NC0K#2xm z=LGQdG}>H6tEf)LhC;b8W5!(8y9_V9@FKqam9OHL&%Q-3Tw|Y4{#}PMy)M>o@^4nCzUeuJ=AvV~7>()(&J1=H42QQwzgzek5 zVAIB1@yxSt;^g^OJn-Jf@!Yd7W9vIxsQ3alNZHctBw{EjE5?UD{73lUhn~Q^xeM|3 z+uINdM5yqC*5&986yW)nU!cOH;w-Deg2i*F6!Y-4FMSQmSFXm7e)ntC|(*eXhZc$K{ zfrTW1BY)GG(ri-WaTZs}n}Y>;80u`mP;WcwtqB*73rN^Y*@&aGw1l)H&-1~mvc?6= z$stlB4?DD!E*U1%%m4uY^hrcPR4~0jqpoYTDPN(;sJ4_k5dhOWHAF(=VkIY1DgtX+ zEy2cnM>V;FzoowY;GUJZdF?z@ zmPQCr36ye#)s#sAPDdN_J`!30Q8e7Udnc+YOHfe~z?8ZY%&0HN$|ds%8kb|=fx~F+ z=*Fc>m#CAS}KVCD*Z=bJyprRG*d2yD9AF0w93YyY94EIN9!cw@^U zLR&gjy`%L(cV=%f#j*9p++v}vYwad9ERaFBJZ!sK}qao1gU z!ISSp$CW{R_Zz>&E3dvyJJ3#jFhr`Tmq)AT1kp+Wd4>+>qmMpfIsM#}OHI5|k4j&E z54s13$TW1;sFx&L1@tU5o;*Z=CPzo9riPMvIDFR0?h*>J87tkbbH<$fNTKT}|KlaLZ{4TdbWWQS`xrKfOh_OG`}2h)RI9d|5gA`nsqjZsB(i-#v=r(o*#I4Oy3jX3Z*+ zCd12DQJ5T$N}CkEb?=yZVi{E~X>%%W855mSIc>9gvg|4|kLfuwHUeqN#i!cpoW^a) zYg06Gd~iPRw0CQ4kOW)H9VOE#Dgl8DzjYNW51(kME+CmFfdY+P(#$$3eYJ(g4cbgf zm%K&~rcIqg!xz9$e)c{5`{%!e*IwICr5`64q|p(*d7p}{fkw(*r@_(9&CQrPeTGAG z8oqQ|WI%mj+)Xd)Fz`{I%k8yBX?ay`EL_3z^&fAMj= zx@S8I0@XId*d=F!bsFVIUC?ASb2Q{2D0NAaz)E9|Oe>hk@IRI@Kb0^C!j`qmb0*OY z_jh2RyOlgk;49!IB2ZpbH?^~fqG1J^(JDY=*YJ~-p%dt|r;84vlp<`@H>MAyCq%vx z1NS;6kfCceR!v=hHYStUPXO7*$f~G(hb3cIWY%cPb|L82@@XWdJ#$1+%`usmeCe1o zHc@4#%<0^i{9AogGCtR7Q|SS=DX-y^?0w_MvZK^p^v(+MDDQlp#^8!~L@Re*9Mj9A z*tC8=?!9#_s!9vZVM!!dK7wLJU-Jq2q>J=M6~#-i;33_PA3JXO-Igqz59I(YB5w}I zG6Z3LczN?)ytC&N3M*<+R~<$?o}**-GB$0x8@_M=1F;zX{4<}ycb<9*tr?ATOyj0C zi|~<$@50et@8ImQgE)2c5I*?+$8qZNMKrcHVC}VQFn8fnOs<=OBgZe{AO7_Vn7d># zrc_qq*pZ`jsAH^emLRm!x-pxY8(GIu_}SbVQlWZ?tZ4ic0G2a??-6Wj<`Y;~JEN>hScFZ{UaD`x*KM+9+!&>Z&Z#3F^;~_{hU1FQD@n zwCLfUz5A#;)}gVZ7mY1#m{{Y(rkm!YvEeL|Ii)~~P^Y@dw{%cwGvw@$;B0Wx!tb%H z30m(s8B?bE0r)9rp^yiDugac*kN1_ZVpFTjQC(hU4sOsd`w~Kc_o_?RuW@{I7Q+N~ z8p9_*tFBr%`POFUQf8elT)vj_ELj@|e&RI;=!p;Y?a0E_?Z5Z-I{ZayBG;9Jys%m>@ z8wv|csGv%bpg|ud&`jktzDR3q=J1s-{S7A2tLh8sRAABD^^Xb24n|N8l5zL)C6CeHKkKq0X9)y;Com3((cmiH_!8Oqn`~(3J1$X~4B*svGKbjjF(cavO!cc(EU5tPDhrcI%LipM@zmL8_rC_0A_7@VJ1uROV zs8x=~QlkNQ_zr=;>OvPn`3a09V@T7`YK&SokNitMQ5n?s<}QiXxu36Y90F1SBDIf~ zhDeb{U1w2cUZ~X&#DhwhYYZuF5D)U5T9(ffF2z895@*hyL*;}*eE5$ZvFJ%dQ#ZDlon6#2_SV$gM6ha_H z(JdPj%lD3tF|y$bDdoOnnFz>KKKXS$J?%)v2cRKOO1B~dYetRrR2SYTc{&g*MuzgB z@obVEi)fKI^8-EuysD`-?Q3mp8)7mhqeei=gUKH+B*}OUpF#Q1ILQ%$IRSf{v@xPC zd&-yBjSRt;@&GDvcpl54nZ1hoNgUNxubMmhfO{upRRX0yaL;Gct(Dg;{J|IuY-pQ#HA=1o^o%fyM~ID<8x9 zj^s-g$wMQ~un_4wjRk9KYol{>$a)mC`hzo@Skb?Hi>50{cS`Gck7O{|*^0@vWhf*~ zYbwg{+^?Ue9Iv!x6upww=PU4IylX3j;3H;sP{VUp9+wk~f58>#c9oVsDJ8}eYAvy#CD$;2hjv@e6Q(cLV zJ@G-)5vK21((y6X8R~QCuw#_>DqeTf`s?XT_T%uuqiAkz!HQK2@xVj(qOT43(&xW{ z(=4Z3DU>{#%|1+9AW*0Y*7N0W&7+?ZHViYeu#C}y2K z1e$(2Ou;||VXc`?;1}Yz#_aj{Jgv5&WYrp$V3ABOokg~#*G(BB3rRj~f`<6p_{af$ zlKJ1ZOINr5{@d@gd)E{l)fLs**fG;zrnH=M4tN^}HQL0CGMLNr+bJ4Pj9zj;lT##x@36tD^^m3|9d>W5G{wTimpI<>NZvu92JA)-l7vZg4+wk+}w-M|_u$=7}3gl2xQH3|( z(6JHx$)9`_+qb{T=QUFSPav2k0I&qBVoA}D`=o;av;e;*!(6%ChHjS6ou9)4@4g2& z-?ScUR$YtlfA6Pw^2uMKxHy1ouepxk&4qzz0{&2uC3{v5Jr~=p&_#e-mxn*NeGWeQ z-kWh?%Nuz3frkw2U2ME;`MfmVQr)8h+|=#dL`U)u%R%NP%^l#tg9eV2T-c<+8qV?d z1(*c%Y}P0bYjOt<(MuRbko44K8zl{n_Yc_ePDA}|C@uFQ*q?7{Lb$9J z&y$94>^Tj0sGO{*cNt6m*GA)=BcJG7awiSIq7k%kU;M-}Npe&dm&TCtX7Tsk)Oxw`RDfWyvK!PCP7fedh+>J zAC^;K&yjysnERAnD*)?gx^J9NEQdv9^hCSF(HUx6ix8U3^DLbxx~u%{Cas21ABtn+ ziaOkN-6AZQQP28NzF9uen_7X-83O?PEyu#+_7m&{(B0ibxi~`SC2dQL)z{ZihY18J zB@@AHf#{gRoH^4`9QI=7lv>Q4IR!`doyK0u&APSAP**=0q2elZ_NMX9o|8Cm>>O@d zx){55?Z$;m=crc*5K9X&Ff?rGuB7VTeC0Jf^6&?6_Vj7AwKrku!s&STy|?rDn>cac zB!We3SJFabl+95fUu)d4oOLDSzH<4Z<%B$Q>cnp%?#53Jspu@_aPIUOwp$vvZMq5V z?N>0NqJ$vuR=n`^8+iTY*N{poBSM_iNF$brQf_;2>+RR!7e9Rqhu_(UrtWTx5O^t3 zw?)s`78+Mw;P#=isswqSFdeo^Jo4a&v1!AtIIwRY24e}h{6$FS$Ds9e13@KYciW_| zQGz>va1^0Jr>t5Q)K`$hgknFza}jl!CSrtnpSo`&h=gf>LIitSI*mN6$g9An*36aD zqyT_=eAL6?aXBDQj=0tf7OR*;M7l@^IKd9_6lr;N`=4t29e_TmKm9N1lj?Ggjqf{W zC6{7*hY9Vtl&+4Nf|H_io**7|m{p#N4)EyMHMa5GxW3fA4pWa^!)v8vEt07B*(n+q zJ$poBuF@3b43&^GD@)yUZLR7)N>T_XqPwTt0FJ;;fjbPPZo50yF9IE|g^=+s%tS$MT4t^x0>OpWucTt zp{9BgjvYOLFMsiK{CpGp4qPNyBb}rys6fWYASt?HW#ch{X4O$0Wy){Z-qDJ}!ZOxb z&*t@-cd4!})r4P4hq7eJN*Y?Xb)%j-eGDtstir6RbFpmk90Dyb-;=^yZ*D_XX&oj{ znu>Yz<{G$OwQdbP{~QkPJ8A>xr%#@Sa~F?W9%ViYDHsPH=+raoPg}*H+SIB$rc17RcLDIWMjBcQC5ZWG9PN{ zD)8%Hzr<&R@c8>5!=AmH(b3jsUB_+@+fg)OJF88_kA2;}woYwVXS+Rn-MZ!Yr+@w| zI=cJFFMIf`=gCuTG*-*;@O$5fb7xNB&f7L(>z=&?N)gg@)D})(GPN2XymJv&%=g2U zX~DtW``LB{*tUBQjnW3}*}sRhcVqe7T1+S`KxcP5M(Ooy5)B_g7NAw7fppS{(8%+6 z9>I)_UE^l*AYdo}!cFZepp{E!Xr5%)2za3GYDEdXtWPgNzZVsir3CGBv1Bo6-_VP_ zM~B8RQm+}0Ydoj#1=D7j}D6Cu4#87gesF@>^+P4W!fEkRVcqkA{*gYceK) zYxz8RMLzi{pL}ZL3q=m`H)U1z&Jvhv7=+5J31ezu)j_o3%gN(}T#6==u5Ok=&((XC z*H2x^E}>a<&l81ceP2z&(ET2k%c^XVaX#JjoB$nVL}g>0#ZDux4Du*Pc{%Al0X7Z0 z5KRTnH3`Ryd^)QodBeDINi`n2eHj+ds&V9;_X$==?pP$%)aqb*fuP0b3uAb22z&PI z!QfyY=FFW**_mS9hj|3h0uCO9Q(1d8n{;oAz&{cxHV|_1)ET_7buao8DfDGLD6E}} zXI|cpBgfBLDy-q&Hk>)OlK?M3MOA4?q9KF9{fHaob(D z5eS8B;=!+e@ib}dC4Y*IshEzJq>qc!dn82ZUBt{2JtMz#Jt`iq~ zkYQV~0;wgtyA z^Lv%wm3*oWi)@Pb$5BKlK{@y8D@qY0-vt9&Lp^{1X&ekkjMnN}R+4G0sv-J#ssFW_ zhI*frYt;asfjv1r)a%sevNw`vIZV<`YIoBC;Bu-I4E9h+nEXR`+dcYf@ka@9a@l160UZLj&y!6}- zdTBEVOctPju$AxBy0$cUR1*TRDzg-{^M1aL%3s21KX}Xl9u@rftX`GHs>rfhstF3L zl}`mXx(FaTMo0TjZ57>-g>-16tEBQR_gRk0hUF2RhYgIk9iDvZ7dUq03XPYKFiw||x}>4Xr|up_0HjDnNR1QGWEYE2QgLc6Q{{Y9S{Zrf zdWE*}ykauoQbgsYC73;LHhffotFKvs7oT|!ZI?UIa-{)DKI6@;yZG)f6|rWV`EmUX zt5HfLak=R{E;nAl`s=R2kwZu6Y1d#XfuGj%ed*;FQN`c={rv=hOEG2AOx{!G(4Hmv z(Nj-h@x0|!q$Ox4kl(TIAU$+VKH*t`Y1T(8tY}ttTSq@q(NQd(I}sy!DNLPKkEee8 zGaEN}>&6Y(zke5c`g&{;b4%7rx(p5sqVdWVba!>5I8umJD^}r8{`8MAvA!Ok``o|a z;DIBSUZK3A5I5eu8n@iI8duJr#QNLrz?XmYE5!1P*>AA2tb+m*n%2EBaV zQ$KzVyLX<&oCPZ}Yu+4OX>36U9h3X-T!WF}F5Gk5jd**@J2vZgR8b!>7HKX3qFH<5 zAvqot7qXDUfBLO<6kn-b#g`g-q==Vwt@5~LsVcFqc&NbVL1RlZ)~s8{I{WeDPoBqx zh9nJ783ApI0G}YiAHWD{sB}I`C*;WL_{NuW6KBeRTl9`R&Z6<4!^vWC?HeE^Zwi(P z0FBZK5LTshIL{=|3Pwuc_7%eyDMzHZ5&_C;L7qYq>dto%5!e}&!)WERGiK3$^7EozWv^K5)v^aS*Sl5s148JiG>+4j(*- z#-=NnIYYW@K8lLU`ChN^B){cc@}1H_)KAi*iX6##P*63M7j5T?jXXGTDy3mBDU)zgw?X3uw7s4B)vlY!lJQ1b5WGMUj1cn75g-OR0Lew+$ zWnolTl%Y5nvSi6xGR;Y@tfd}9{2kzP0@SCPoG~_DkIs$8?`amVfS`JTEQ-ft8b)9d zVzYy+o4#2=*+jL!{=d5Y&$;~$yLZKAQg9B_Ih*sX|0R#(tSALzQZ;tOz{WV(;WPB@ zL;`sQ59zmEO-a?58@qpOGxbUZstfd`9gD81EIgp++Vd&S`Yi*au19&e^8A7UdQc%R zP8>f;AW?5hCY4MeMX$EBv>4N-PNmZ6z}yAX@zY=Y7?;ly7)+Xmsng5R+R|xb0%M6@ zKAHk2E%jeTbE?Qq-O=hcvhFOEhedOYpn#&IY$dr;MAoyxd!&dhdd6#PP&gkfFsifq zUpB<-2yfCjAk|UEHI>wOBmz;^Rp8J=?{M;@DLhs{ulFVV`#=9Xe){7V(Adz8bXLkz z29k8q^;CjV9x9VVV-||Emokxs7_n|;vz7KclcIvAS<-^tN{(#?hqqZ`XBs?Kl}b#5 zk;6E3_Ph-k?`iKvBp9(-prh^)965UegE1GP89(Xa!JL`1Xe|7gP*#oUlV{@4$$coI z(Qj++wVZw|C8kWCjv3RZqq1@W3!+VB6;*)O-g+H}4xPrumTv2U+`e-^x_U^HP%RSl z>Xkh|-=pq4){Es9A2cH*B~DTXwvTfq^)yoR8Kf zb>nKV_y`_&*S)y));myEUV%5>d>v2z;7J;ueB6BFjXYL_CCe6DRP~*$2Wcp?c=pZh zNJ8U%3gKp(E+^1jy}S;oco&{~{snB=x&xh^ag!@BYvvZORVjYdYx?b)Dn88PzJ_(TsI`zMBE!z!vG zaIZGjtiZhoPGa-6Bk1T!S_C{ds)<2K^0WBFi7bm}jZ-v9iZ|-d9-xoT@Y~@f9n&H0 zOAaN=4&PcgB#o({kIpF)=drTo2%40ej-ZZwsWpo;e2*5bml4+_4vMll8lx^}=B1Xv zQ(7BE@${-OlW0Zp@SW<)&DU&Qzf3ZL8$bDa2)`8#PiX=b0gsKvA`ctT=Yt4sEy9vW zrwqU-EsTb3kP!@Us}5SpMXyrVIfco9q8@EaII=;szP2=(#6+^Jx2mg}yDWnPb}Su` zfUF{f1Pp`TSQGU5RBza#rOh<(EjKyQteLOfcU|p2bM{b|M$_RSS!$k1RvZocIjI*=2rH{d5fdJ0RHFSASvr_Wv> zuX-(lD?MvvmOgc~s5vp>k8!71V@5UhSmSjUELlRn_MxG<0p$~tm^h^hJ)K>=HAFX_ z;Lk%kkuIrNisdcGzkc@9m{wnleftk$)EhuiMI}blv@Ju*iK@v(q(Nj90T1;q-(5ic zTN)0azPtqGk)TEFlt@{tX$0vM`uGW0gikYey*6f9IrePLTt#SEHf3kf>OZnA`bfts z#gCXqZDX>-_B457S)G==y8X|*{SHB&gv?Q%&gKZ6Jj&7w;vfFtFgv2t1_ zC`LurbfptBrcOpII%I}ZV*w{ltmE}rgbIUvAU*v+lwNESv!*RVQE>)Mjh8TW+FT4q z2d!Qzqx0(jDzBn=Dv<;D9I&Tin{ra|dD0XX_f=laUbFkHe%eG6r%p12I;YL(I96X7 zbeq}BBTBleSzlA9%%MTb;HN+NG5+-*{ta)vz6GuA12m9+DtszSLZi&uNCQK&;wKZKO#kx30et16@sgo(ms% z`~&#qGtbf6uf^;IvssQ1fnPI5d||`~lSmBZuypY(8fSZztq*+W;xTM_`%M&;6l3zl z=_rg8IyC&vCjJ6mdgD24erq#w^pZOW@OJDwiSE8pD%280`GmR4ty_+D*R8~Buf2xe-hKksFcuP!{mZ}p zJ-RxY@xpVj;NYP{hz|9lrn(A$_=k@n9`DDLSyK_qdhqn~yU`W(qisOT{Snx*tcuX2 zMN`se&g7}|{v&wc!3U8+3Nz--$Ffy7ptFAvbyKEe%a%Rp>WZPTXaX8K(zcvcca*JB z5HN$3%~Sk=Z9>lfyXpvPyn9m?9npoz~BC>KxVQwH5Gf^_K#y;r=?`}HnOZp!m2Rff7$d78W| zxz@RHxv?+Z#MMOR6f`&BB?(WDz9ZoJ(oEs(R5`2Hq>M zAaH5VW;w`41f_hpqJR8T8RbYRA}ARu;4>tr4(M}agFjg=C+e3|5^6>D2y!(9#hcfU zspTm=aKl{Ob?rRVRhO|0ESELFf*F6vZ~!i*gi!zVAhyclcN zt|VVqvi%FKoRVAte*>x3t}H8cft^!5Sk`g9qH9ba@f~r3yJbt}5ya%-)S*4dqg-pb zuTnZZ{n23qi_zg>1gHyiuXs*5FBO^6*wuXR2xa3#c<$M!@oqXx0bdAT`|8&*rG7ew zhZ7i%Db19|6>2$32bhutFcghiMDDIT??f)`!oU5?mr+wwhl58BTV#E~f<-ua@|3jA z7+pnF@;w2#+Af~bNW!f8Pm|Bqthokj)?JSy$IhUoxf_GjJ1bW&#$C7HfR>Br z(ceb^>5d?g9fr@9z#l#G5S`8@6tK-^O`B+A48>5IFp{B6czkXGR|OErFG^!Ydilr@ zwUrUnlolaEeWaz+!iw%``80t&(k7&()2Mp_J`eSg@Dtw~e?9#b2M&LpI@ zv)WFwE#9^v0&FwM5%(lYSGTL%?+WypMs;@ocQ+Y0eWXi&i#es-Wd!Vgp63buGU3&4 z{YjxYcEXgTHVO9lM`v`Ot{>lYeEfQOjRH3cgG)5@N_{KMg$C*>(xFAM3rl?z;x_d6 zrZI6+4K6hvC%C9WMcD*|3w<`YU6T$bPp!7dRd4SgCRA2ZP+e&6=&%(lVnf4DS;h*i z@k<&2u485d_@{E3VjWXZ=2f#yvSTWogxE1wjxft0D5{_uDRSrH#e&K5&Z(mHG#(?3 z=vk}2!NLfpOq)YxH;nIo=bQNV&;1*=y|W+vLo{Yo?pnWAgQcAmBUC2#Vj52B`SC6~ zl}!-?d7UbUyiF&|J1^qpibl#~ZTBg9>{F#ED)4<5b|fBc8<#)^fL z(AVFEGnX3(euB1gfZ8PI9>v)cmvHM1x7q3jRaKe*(~GxX-->;Ej$vRpMnx_qU5G#a zlTYA_U;2v8_*H6&$#e{+O__`jJo+FGAK8m=X$=lv?8ECjP9f`x*!Zqd7r{D}dzN&~ z3ZS!%2M1&5=ovz!s1lv+O}P1%jW~VoBL4GRKS5hh7V{Raz~q`@^bYpox$T#6zO@@E z@~VqQQPElBc@mtYH(t(?0W7Txc|>+w-9Z}TX;BWgw=;o=?V<>V91GGMraK4 zDT`!K0yqIowWZ!AvPh_$k0M%fWUMP&4vml@Bh$$Q zc`1g)i|1qB{5fcCYsNr-KY1rdz!O4@;L0n$B(2n4T~t_1dXAvKzYpCs>6cCv$1FY0o-}#yKv#uLF*Zz@LRnyBR#nO`UP0Mcmu$n_-v2Rd+qMTC-7$FGethWhd+@{~cOyBF!RE~` zVeZ^%xc`9%aQygL8xLMs=z%{(z83#vk_3q(s4NPgwxSqCHtW_yr`TuXBQHB(&+G<|som6${QrNjr&qVD8@Jza zr0=&kDJbWdn3B9{pRr$#(y^cX?O+M#V~R(Lm1lL%K#6u8<7{X3&ork_=vuys*N;cp z>^|;lZO-3Z&%=73u9HsF1r~i6`z?T0R9J{}XB$va5kYB*7rQs_!LkL*5eWyWD55+c zrV<;bA=6s7&Nz<=mDT)?*%-I-@^TwPBcLkdB2P@7t95s>OcGv|L&{sxHI+qzoTULV z;HMJmpA}a32>kJ*0`gh`F+PRLRF{!xQZ%Dkq;n~o$y!g~+1uTW|M>Ff@r8f;5A4}> z0>e?#j0%>wvMe$j0*uah5D`wt{wtRg2nwBieFd5wrfXyrsEl+@ibn?68Iwt4m`oW! zl7Up7KSgg?QhS~)8^LpeObBDm-&rv(o3 zvIJp+ID6_iP8>dmp?(5_bOA!%8kU8|i?59((&*^u!Rb@yuw(aLn=J9x=6BH2(rVz? z#xSz5T2gDq)JZ5WEySlj^-g1eO{IX#LuUwa$V zrq^TQ#8N~`lx#SMU3>Ri1SXNppu4}<*7a>{X~3r2HelwQ`2<_QH8-rsFJFBJXWO$l za&Z8S?FkfUg_8mTAR7F5G{Lq@pthzEOXp8T^ZB#%BQMfjas@G1ARSMxqJx* z3Dhoi58}YtMl|*$2~azcBgjz%RkRnC$?g0Tvp60NT%$`&R59ylX{c;f0A3HwY z*51Wq0@jg8A$ogy@T*__63qlo8*aG?Gw04Cun1e(UHQsqsOXUD;FMEQeT(c`^hge$ zLp$k1fpnEy$9@x)HTlqZ)=}$4sH>~Rk|m4L)zyXmz5xR!kw^&17=fR_GJkh`5BhrgDC=H4^4K3BnMlG*{Sq5W;+?HqtW7cmOnQ&HKZF z<#q#|M~>{KL)%NBw-J*j&&IdE`zs6$j^f^Ty$6>YnhY$87ZS04{P>68!-Efg7|%ZY z6mGp|J*LiFf)`)ji<74tZ48~qS3n(5OyE{c=OJP<*l)c4M%;bZZ8&uB0y^l}?>%+~ z36}rPTdqMxRUOV_`r80t*meUH5#een*ImKCA9uM^RDhTdilZO#3dH)}DLE}4yvu8WvC zdnOB)qgPG?PeC13M1jKT7-cC3)>%eD-l)~bF`k-Drf&%{OV4{`K)5HHAu_NY(#xu= zMHBc@y#hhM0n*~4Y8*WJ4xaqck8o_?Y4rA{`OYE&1-{FZvGQ0K0XKn6%O%DKCkaq3 z-NTbt)BOEocDgQM>pNn|J~=NCXWs${vpkL3+!|qgPi~k7K7!p_&U_`qV~%Z=A9#pJ0q_}-I0#@?eR5iF^( zHCP1>CWJ=uk@wvLCCY7TYC}!UY&`SEE;J9&;6zHPqyxw!=*+~UmS;=D3Tny%xc!c6 zkr?R4NLt-bK|J@u^LXNqA44n^WxKl3cw!19PUvoxwoKAcPvl#-?vIk53`V-FX2 z;=T;OW&n#v&FIq@DHV_+7vfiq^HM~WR~bOd4{7ExfAjWq(GaSZ1yH-P6vY!Ghz-VZ z>gi@Q9qLBK$Rw7}gS3m!%}W#P@CJTtr8KLcWR~B2rm7=(wg{DkfwChsU~{!T4=nV zfUp3mastZf;Q_mkcRBBpZ1YcgM-GTiY2wqU_%sm4sGG)JC^(x$dC-OH=9l5xm5WeS zL?BB?N~_kfVfZ-eMCvQnP!G4ZkbG*K+zp(C0Mdp36vfoOwL1Z-0I)J2*!=`3S{71?(3RIyGjezB+{fxW zQNE7$F0{6_7#NikEQdJD=PBau4*GD*?HjQEhU;wF%E@CV@zSer;5hZH4HeMP8`%u* zi?<5sED;;xJrCT2O&jl|?8gx!upySm{`FWGqc`z6qCQU=QWfMG)C=?h4C4 zg8KR*Jn_U6lN- z3$(BCd6Yfzi_!r}7Yo$cj9faTvJ>JpwV#?ova2#$uwaarwTWk)y{p^R?SH%d4kLZq z98l(LVoNF4-)2vN8UmJa1EYP(y6y2pYh_AV%*~G}Woch-;|f~;#(|)I7?2u!oCyW@ zbJqdz;Kv62 zt6lg^DR{@A5n#&r7x-8q-o)dhBZ`Kot4a~SQ7Zc)^dwz)efJTx4AFdf3oTi&#=aS7RU(!*E^@qrM6v%o0A?gB1%G;qZ~u{9S<`{^EJenKug`c>H0U zJ+>dQp*{qt*b@mYb=Qx)Xb^awqm$vMOFIY%gjuKdsFZdC-5_ygOs-Crvc*bc9GK}$xrEt-XF3D4bj=bbi zcc|8ICdeXR3CJm_trqhy2n3)B5oxu7wFQBU22_&g)b`?IJzw3q{$LP^WSpR?fT!8E z1lC?U6XaOZoS=cv>1BIudg3}%tac&c>qUQi2c}M#h-KGK=lvd=Fy+Y)^LjZxd?)#2 zgg{(vCO&fjnS@jGGz)@uU>@-)pb@+brCw_87W_CCl*j;l>X8FxNejl5&&_4vz%m& z_q3`T&78>{4&c^oS9P=MnaQzIz;>>e2x!i zPPO1CPd$enI}fmpSSGTn#^lBmIh?z25;xp(GioPJrgJ)snX@J#IXH}?2T$Ydl@^;Q z;UfL=H7tN_D979z4BPO4{5*nUUm=cO?7-3U&G2dBMTqT9zR#qxXm0K!ucioO)eTF% zt;jF+PD#Xz`Uw$~hl>%>q%}qO_)Mi63KRHhX0le*3Gkd!fGL`%F?(J*r#{UMSe|GfQ$BWvB9* zVW0t0q$`&fvoTD?MH2|%8f}*5z4zXXpZ)Y_SU7(ruT5L(gMay#FH&)JBRZU-I?K^x zJ&O%D-i=@+jh4nsm_2h2f!{D+m7?%!CasK_V;l_pjnzhfrkp9?U! zKJH7&I3&p0DiNinMO1z{OP!KV37|QEkHxS}%Ex9U^Crs|sJ39)G^yiD!|@zeEt!Uwe*II7 z#=1~SFTJO~4fOX13f4VB=MeiZNQ4<3y?|RU|XJ3~%2Hv^W48G)s?Iv*JA;_ntK^~2dx+>KMGJpa>wk|H)S;G@FHqhS7 zw$V)CbUKcp#(C1nYiyptZzk!agQ3ZWf0WPirjT{_1A{}@{FPtfz*FyF&C*pE@FfwU z!Aui-HC^gPc(f1&iVQ0~2}>zQ$RhbxX1!1Ui~m(a?ny?p$GQkm$rxJCfNo&jL<`+2 zZDC{8_>t_W8&)1nKAk0{SW=oBnNR5lqY3G)sG*C_gPu=+h|f=w2kBJg1?>G!3Kg$i zFQYu7I_E?uzRXMALBp-_fV_ZmL0%>A%h{3kk%OdqB-2?sGCmXt#VK2lTYI{jIfHjjx{G}ObPuiAmv(0N?6 zXaOQc9&FvRg)$N}FsQMl%H^pPL0YFU$zdH8;0$7a!{md2-$#8pf?$C1kxkIC${@n)s!CbjGUe#=BSgR`hgzwff`#0tjQI)p zw3M7C#QE&Q_IFVi^PIrDj%mDPfxK7ss)%1nPqm}k&t#cpQyV#dSGTL%|M%^84EmhS zF-5<_n6l9|)V-#_O`&U_j4t(S%94k~^o|nKH`S;Ny(vUJQy@>@wrkIo zpg6~65S$aH_;`=L`JZ(G>6}U+!y!=S071Q1iVYN2x1}dY#z*nM0}o;QuFa^dE<@d< zTDBB7>t|8b5XAd!u3@>1mX5zG<0Hdm#*KiFtZo3-0X7cU?HcYwY{ZYO%ZHoS zufVBe$FP0tF5G(SyHQ;^7eD>QOSt{kjc97RWMc(0$w9pT;XCl)yKXV?_xhV};hy{M zLPez(KKJA7#RfAH13i7XdEFBH!9#b_Pyu&syao&ARO8r@{kZ>K_h9vsMW`z;MXb96 zmGt&&Dl75a>#ySC*;Z7P)}p95jI|rq;8aUHo_u*9_MB*=;piU#=7RNk4grfOcN6@IoI;L+qDX3GN6xKH`96~Y{#N--W_hp1!2ZSn zl2;uEipR#BBF9N#+09^bUv#o3OOAAxfD5m8kw*y_a(Xu(K~|x>k%vb-s4ep1Pu_Pe zZd_6hZ>oph_~K(6K=k9{rVd) zandB~610dF>o3Ppe4uW3iwyCj`U}X(Nm9F;ju1V$iO#ytsH1(}YoJUtCtXc8NlTSS zG*p=cE_t!tZ#3m!I+Zf{U$A%%)~vn;ufF;^_2LjO&|OjodC;U~LPU8WmBz^?MRHQ|i!I(h0MjvP5nKt=)c7TAbkZtNmoH{&7K3Dg9AdpW`M<-Itr{%~m1bnp>g{UeoLSfihE7z-u zGy-_x5CY0qNC2uKG19Sqx7I-?u%p8*hrs|Jc}2r*1g>p-HQPs#bBpYe_L2wd+9jzC zxZB^=?dtab+xB|_eg9hql@W5(ul+K`GQO{)jsh~!z-x8JmNL?B{xHBtWug6XkmrCv zJ7iB+RLP!b$DN3X6rVOJJ4fmBkH_r^{Lhpl{{#@71f}YhP=q6e!bpJLY6_Px_YgQ0 zV$Qrt7>-9Rqx_q1ze9lz6A&h;@RDW>FI{P}1kZ~XEyQ6AUU}{%tXi=Kg;mwqe&8rhoVtMI zU=ArMscg!k3<3qFM2rBcqgFQXptLlM>bhzwMKAgX`qAChL%^qTJ&KAsN{1veg)9Rh zFf2o>(u!uzGYLuws<=b?@j8N4t!9!UxK!80_~3Ve3=vrO(vlH?x!^DGQJF?<{9K-l zAn76lEZP^4KAu>g0lpxOg_5fp=#-)2^YlHw(ubZeg{YJa0wmVZIz!ru&OX+MHXVLn z9_B2XiBsnrkRH& zRaQrL=u&||XMCHEXLlU0R8czGoFa^uTSn@3y6QzVAgE)~o%(Hj zF}82fKa+LGp*H=h`z3cQn1M!KC)pp@m(Kls+1MuVC)uv2jNEbOChXk4!_pfGlm-aO z!i8ZZ$orc3qIIjY0=BHPx~{iv+iGk7&YL?8FTC&qdb-;&abh*z|G^JXj$HWWSAT}R zJCDKVrXxuC&MHsjNH=c2X+Bo3U5FDWFA;Q?TPXyt9p~LkU{`{Q+8XplGn6|Q?!WWh z*tF>uI#(@d>F7qDFJNhMq^p9yFhX?1QYl_LIApRL@VN-el`bWP(QFJ}g1++NASPCq zqO^$D+o~C1enN;8mcbM85%h(fh#rBRPkHyK!~N8YT2;gC^&mtLC;+I*V_H(poPO>r z|D#f|=)Iz`sBH4fzpLBT?f>8H_X7I<_ct-HG=+@49pL8djO!0651o_}Hw8pRWXGk5 zcutDPi4ajS@|a@)q|EFxyGO?iEb1QZ>rQ@;gGD=Ud)&Aq&>FdIU3s*3W2HoSQ;->E&jSb<#IT~yloODX%qLTFHV>gx4@)avEadHtF8X8br zJ%vg&K`@o0l5>>ie?=+vde)VNw}ImNO@+m?C@Lzk)fEnI-;KZh#9!d-F?EHkhL=X* z$m!E)YH7nz-;nSW67)WuT=7(iG~DB~6*yCulV*^uTD^n@L}?K^(bYAGSTsqSE)QG_ zeaqYAO{|MHQ^=&Bil{@PEsJHea)6aXOa5;FQ*}utVy5hD<8R$#3X4Em5d~Rwmrs!p zUQcD0=MvDAV$-u};8=r#L^pvUjZY?J04MATQXyS9X^F6^XFpqxB5;8lw=3CzPPTUw~Q}cWgxr9U%|exK4pF)=@@4bT{C`KW$DVOT;F~;Qh|yiM-K2j8KSRdvy(_O)Enwd2j!Ly|{AX6fVAc40&AyR=G;# zWs3QBfs_mZChMj|!)!}!`hQ$Lm-*UZD()hqGsA3THae(#sK_4-w~ zVdZiZg{$$OU;PF_Vj(8hD_0xq>d8lSMF}=svkvdPy^TPZPEfwmxVQ~CD;lZy$&s>H zWOfj9XVp_Llw-=|so1(@r>!ufsE{V5DPpatTw!66wd2m6yKs(f*KjIhBNz@!4J|fzh-qg+fPvgt<+vM1E zl^q_FGXiNo&p;xd?X-pSHtlCJag>%7;@WGk$FbvQEhUP^xQ*szZT7AozL1BRHml?LM+z_3ziPe6T7DsqIgn%c2a4T4SoYC`nxPUeM933OrJId@fbZ^f)b~Dh3}PNl2PJEz(udr%;F#wo}0(E zyzv_T(1<{fhxc@KG{RRv5b7eV&L;Wc zeHv?Jz>ddAGwY%vz?Ra~nv)vi3c)W83B}C@U^OG?kC@ zSK2UT(n73Su!;)XhnL=Y2PNfoci_^!K%+q%efRz8DpG5#D}h z8{T;BHP$bS4L9C`{k!(z_{p<2hH1|11q6RbY3NBu8mWLcfLC974GWhnMeUS2G_?2P z%`GQ!rlErcFC^cDNSiqMCdIlbr3PVMUWU&mSRfcoXU4{I(U7YPUHm9mZ(VZyIG~&D zEoXr{Y70?b?d2G3o)p>DjNEJt7QvoNK$*rzAkf9O%MK60l}wOrlW>!X&Ed(XG4}9T zqA}Y|t1Y<65AGb>v|t4NBmF3!R)k=khmKAbT{{n8O+^i6uCB)H^|dIk3SyG48fUkj z!j`wTvJLVu+&V-+nLx$l8hDE)pnH&Dk9Bp4Z&(&ffugpRe430B*sIJejw9!)j6e+e zg}+rj11j35u~#(DW)MrTR1X0`@U0dMV0vX&wmRWZrzCLN-uf8pY->k zwRHf=G~p{j@{xuvr&*$qQ1P#dLhUoe1YAop(2W~YhM#P z)H-SzR@0tq_h<$*`L(us9wL;Zy*rd%MTwWA1j^Ge9F3Fjr3Lg@wYhV@x;T#?J45>9 z5m;5=&DYIbcg_=qoADJdk(Nu zltahI$HeJ>U9U&meRh=Rg}C_bj6rga>1s0yywKhxW1u_iekUT}bOZ3PbB3=SD>Gl9 zF=hf70z&~R2PvP6SFRu#P0^DrM}i>g$T0#kdYT;_EmH5iPYQDcJza4Em_gif^F}^n z7z6zP<3Jq0eWP%vU^7jlIZ9(ZN~Ndt1{#p9B&b!@H7G4FMJOEP?+6Bmh6sdI z`2u?KZcD$SEcKd|7KIefR2zSCtcfS994 z@8tHjv8jo5qyggl3}jRBX{KCWff5w6Z3r#|#Cei*Nh9b^Sl0U@D$V-( zY7`fT(B9Qfn!3%vX_+_M)I@AsM|rY*JRmU20~jS(QY^N>J&KQh^uzeiuYL_msx8`8 z*43gXk;IuR?KpM*3J#sSgmdjZ*t+*5yuJ`Yfx16~IC1tt@3T1<~Kl_l|m<=%m`$$|eWRF@WRsGx=2+bcWYxv#M%`JY`W$;Skl? z90)lvstd2lW0^H^i0zc0BbOw*F{x@458bs8PdvC0^Cndy(bt8LcN9|zMypCI$-k2O zG?FO-vSmx)r%`_G^>^@%Z$FRcwwwm>0dBf+C2A%FZOB1^s{+q&-i#SD=A-#yGxnb+ zsCS21IDskA%T4kTsIdxJ^0%KrfA!p1i1l|Pk%_W=BiMA?ZFuhK7tqz#MP1U0p56`w zi+q^3a3LnuPqr>XfjH}`W@Y7&NhZ`iD0)esDpD^xnIma*QoA{9q)q1p#%%U>f%GcD zVO9}Tjok8)p^qF*uo+S|2+uM!Kjt(dnptY+s zE8ii9RJl=8bgF&SXLa?H2yUrods|UJoukP(1(e-f#tp3tO~pU}=X9g4U%!C-*M)(; zJoF6>AkXJQfb<<1$siVu*}Jv+MKF+M`%{OIE*g7T6fD4`nhF$$Lx>P?YodriUQh{^ zE#F?4&LKgix^Fdx&mZPK!K9pNI#$ZRCs65DWL>l+FUesR&q^l>@EQ2y`}GmOkGI#= z?dtY_X8S#L?}~lLKjYi@z5~D<@FyiMW8<82#j`#=$&3`D z0HCAz93bdy7J=h+j%@Kid6@i@GBH7;u~1@KOaDNnXWp&U4WD7l6j3JyLLPea{kU+U zjfy1?m6es)xnmDz&zx=1vW}i+>xRptK~!?h3l}chn7dRj6mZgpKK{YsjONl~Zi zQzqIvukehZyqrp^q|C-{DKeyly2^I1$rzm-{j86h<<;s5JV%h1Owo(Bh#G83pwhAk zCQh7ys+uxee^$$QrIX4w^(P-4J5!Mzg6KEV^ z*-OjIkP?`&wxR*i^Y~pH_Tk;Puf&_LJVygrfcBPd+;P`N96h<0AjD7Fs#{qTKGgP( zp|Xf0DImqJF=t*XR;@CTq0;`~hyK9QrF`wH|B3qADHtB;$LId~Pq6LKUJ~AmOr9IV zsT@ch8fCVd8ky}Kj}M`&*hi3Fik_Z!Jo%%iX#B55Nogtid)o=}dN7AZd&`zLak=3F z<}8?n&fYFGHMR41FV3H9w5}h4{}acL;NyS%$N1uxzKI7OdIVRxE+G>i#uM+q6W1)R z#xp3282q2Xig7dIN-)$Ulb?y9>;|@j=7i)HNhSY zYj0NlTdk_M^SwEaptD$HMv3QB)G$`b5SgqGZS~+eIr7lEKVFbOaPL_b*opCUKxV4PHf+@6L;KlAHMseU!yb0 z_M&VG^jTCg-^Y3qJmp)Qma-ei)MYgY%%Duxji4<-dazF2Z9Ulh;@kMxCqIn(DOHr? zV$&ZkMS-(p5qL%A^he$oFdiQ!BJd!3SbjpbuQmhmJSRReijC8YAD*yllrH7J03YQ* zNSS5T1Ow>{39q_4bzZlb^G!Mn^f^zU3{#dv)Dv25qA)y@=Y80_a}SOkK8B*=LOlJ< z&yjWIP&2vS9OcHAR;*dG7H#cq1YA)*K~IuHB0l5$S^NSzA#yaN7sj2-ENLDJcrbBF zJ!P>L%`H7>X>Gv5g|+zOkKB!mC%2-tKL>xX5NVd%7s#NtGKg7IYEfQNf%m@mA?kx( zbar-9SA;M)oPx&B78K+N%tlCSB_1aTCMXV)7WL#;4du|dzLF5z!W%$15@B7#1bZO^ zc>(HJC0W)nrM=P`&Gs#)nt)H^_(WeNMR$5ZNIO1T(NaY?6~R~An4_kT(e&zeb^AZR z{hmOdgn68e9TnlAHe+-9rQ_p9NrLVCb`-mGjwu=`D=B(iqvzP8oac@IwyuluSLr5g ze1MJhbAIvp>H^|>dA*+L7)%P9y-3Q8pD{(J$eZ26-|FgA*PE13q%eSi;RH@yJcFW0 z7}1^t0bo9=r&S`Bj3P0paW1MG6-T6ipzsJ5%v+6V)2E=R@f;>jor)-d2&LX8c_=5> zme=3H7ytR+sKlC3TVIQT-WZx2+Aut<@o64u#R+!Pgjg32&r-mZ*= zA_IZKkVWRayvBgFfj%mG?nZkCP)OxlUsHsJ^Ow-tG=ycVR-m*ZfD7j@(y#^e8kUHB zKoTn&rAaZ0fJwQAsDOw2hLBCA@!^kr7^~JU!@KXlk97;9q^Qbf2Htt^yYR;DUA&nF zH!Z-U^c`7@2mlc*(sW|OEo-oD2+AUVj-qXtRro5XeD^h_vB;Y@_A^u+<<|$Bx)-n zm^LYbijrbH^`jTD_L|iQg!6IfN{1N@$%j}`W4n|}N1)4=BqPlQxW(%Z*l~DtTz(`c zcAgu_!*-G*LolUw;{mxc>PpSUqpWY508mjiIX66`JbAGWv^1SVUw0#7gI$OXcN6#x zkqa}(B-*iQ{R}K+{f=DTh5GBK!c9Np!1iq@a~GoPY!^;Hw-bp|jmW#)hiG>XvK9HL zSw9Wga27-TQ6#&g$WM+U=&GRHMEF!U3#3=G4l1_*resv@tU9S~;w|TZ6D{VhqC*B& zbgd}>-lyOECDA2!OT<{_F3hTNracvysioO$~T|FFMjbl?z-b{@^p-Hq)8chm^*C>0>K=eq9V3m4QcJh7e4=OeDDK* zh^_m#;K|ocV5F!NIkuOV{8TW)HX{86pwgqm$SWMcn%ichZb>0hp%_xc&ViB=#NAmm z_qAb8{bckf;;5yQ;!)T1n2cz`jewyvpwUH#wa-5}aR%;K2l0$Hl8N-t)%;Twm_Wk; z$OIe$h`LZTB#j&}qH$(y3sO*WuXjjC3WV!fMq|D!o7Vdj{ngTZNghqxQftLU)A)=c zG+$`KYcD;EWM&vObra~UB=N#aFJpi@@56uc5e!AMIDX;;fmb&jsig)2hX%D?xf6NR zdjviOSmTt*Jc1;>SwmN5%$SAg3zndV&fAsCE#!-!4OQqJ>OlRZIz0O5<9P9<&7>7| zjMt0#^DFUz_uhu}D_7tfU-=$(Zaa+kzwaR%%Y632S^9nX)Kz%|eA2QhxUxyMSph0b zLZ~SZqbw9agt{Z(FEoG`E{s5_ngRrTK03#movV*hIBC6H(KYB()Q`ZA`pBY;q_^nq zOn@VQvOe51Ue)IC@73+<_J95Mdz{E&8e{BRpE0dun*+$qTOGU1mIl%_V+zaekmA>G zep?jJ6cV-G*gfMb@4>X0^Kkn7In-9uGcPN*<+;+?VWe{zjArODyMpw3cjD%o z)>{Pa(&h7*J8v-!dp>sW-GOg>^-H*T;UX$Zt8KyWmezhGq8islMLgDhB15jhzJXvK zYNiyUs;1J)+uqSe(3K|0Bk)RkFwi}W2kzg1!zcD5mddaWrNo}+`&4lmL z0A`hUH0$JRQ}R(MHk+lF$ygV!pTM$&214-;50#^$66*fS&!thqx?Ok83Nx&QB`(Ag zJp>$a96oRckG}7NC@L+$*>gwuER8SINH7{iMI3T@G%WJi(})iZVd}K0`1Id=#>P_K zbN9P3Fc3ve%|z$@p&(Y?bUj{p`EAlOLcYQi%B#n2afK??%fC3Mp?|9HJvo+#Bg)?j^ge~M$xkc%(a9?s+&M>d=Yj`)C^a$24h|45s&wiUMXS?^2dnAzzKH{_~a$9Vf_j^JHY9) z4d`P_da7MWWl}i5^*9DjG{7~?w(%AqG`$r0vw{SCvrt+;0X?mK$n+)<$Y~AOQFwjD zbWkGXmjV>9uu9Oa!kPmn8D|@-9#&sDWSV?I=F86~CtICaU>Q&Di_a9H63BBGkk2zg zn^|35+>cLv@GiXX_D$Hic`KS*&*H`#mSg$SC4e_eGw(#AeWN~>Cy2`}ZTQyLpGQS? z5vEU_f*(BjGq`B*m(5>;x3}&=Ape1zQr zG#ovPsr6Hl@Ao3BE^pGs#|KOQ2waFXa_rRgDk_mBY!f{kT}h`_JR#5_S{k?@KWJ4C z(pj_;sFQZnbJXJ@vbrhTLX?shahlVW%lmmlma;89sv$4g(F}rNH!8~O5%5)`r=;jgO+Ey%)6;Dsb~P>!=s%v2NWueC8j&fx%eZmYMX2=zMzU@TCbZsjo{3 z>Lv>86^2n5P;zCB%~K>#WA?%b5lCvXhF0xSgiq_^YAB1==Jn8d*YA8qPO1M2yret7 zHFnZPXF~0!XsHcbVEd>&tX-UDySiQ7{x9EtkCDFdk2bNm43^_bI=>wyWt(%F%9P4T z!a=2F#>^Dg*pqmTqts*=Xq4>{&TnmYe9Smn^v}9{_#FPPpYrH+y>pwc6U3BybMBWP zCePZrLI<4knKBjpV*$b;Kb2O@)|{NbU_N&4d78&gfjp#7W zoo>LU4R^!kP2kAUo!Gqf73|ot6@D)bz;N2qr{t)RE&ixVS!9g1$>%~%eJNI~o`ZP{ zreP=+!`U;9Xl)%P&~p(4X@+rwDGRyqsO+CxSE{zo6io3Fo&SUk>iS*%;N z8ok|}252|Gy#>pbtigL8co#~G0~n5JeAqA*Y8u|a2i4jE=>jZSR)}*KFQc~?IDTB?9g|4#Nkz5O@Xa4S zZ!EkQbgZ0sgvD_#z>6H*{gRp%4C?*UFXSUx6pg9j!K^B+mp97+IVUeO+b;eg8YCmi5;_ibQ)g3DvIYM$Jt~S5nmJj=)vpoHy?fiM|K~= zTW`IDhaS8GYgVqrsGHZP_)HD>=lk4x_J|K({mzT{!Oyqi(TCrI+KEBbSJt3=Ac<$5 z-HN@3kFu--SiXD#L4sy`wvrx&_@}>r3KJ=t54>w5-v6inil)8*gyBZ%n7H#)&NTA8 zy_mf+h?^gnhp7un$m^p>48_sg*n#FVSJ2zkfoSglvhgGWo*+u=iqX;Cj_#grG&eS5 z?({kE^PO4|LaP9=ingilYI=CKUE6FDv)`9|ayezWB6FNSg%11iPahM%Fsqtr$ zUrpSQv!VQ+V&W9vXZ*x}8nTk1Tq{~nLQ|)tD9a@%49+CIz1aTNRvbFC1D+t|sUl*- zPSh5nK@;2lt+zH~LR}Ry)P-3BXZ5~F8EZIAV`C#~Yim$mUV@H}4rp?UhUV7Q*5ku} z_z|{~3-Oo_CoeYQQggFS$Z(S$TI1X8_aWd9AsC?ZKzT`~Gnh7U9$wyZ09~Z9KU9j- zr>@}4xhB3lfNy^HDR>J*)WI(5Ds`)-ke5x7?!e^AQaauQt6Ewu5JH&G)tEiy+*7KV zfY(R8&v%8K?p)=lROSFrfgk<=e^Y;oe|226RQi>104|Vjldsff`c1k!8ujXSb^E_> z`#necq@J`nY%X2m?90=1{sg+rFc~P*d2Z6?2I3sykrA}$hpy3GGHBd21Eq)ZH8zl2 z&*L#|&hw<|sQjoj^$shI2_%p49Wp|aLfxn6k(8nY*dma8r~dRD>k@$*>1-5*#hMt= zMXpl|W82$UbIl5zyKoMv#HdB>v<%s3UXsG@CJ>DC`Z(6ETTWn@Lr;G*!P{wi z_yS@yzKUkhuxc&Vg8VE>%Dk93rNVMh&09DdSDG5JdGjt@IHz$i8u&b}Hk>gxnr%9v zWCBhfzknr+=40yQT9)M~->-q&1b(b*PGkF6Z*}R~46-qriHv&E;NTG2JG#-*+K!HW^&&IlG`K?qk;Y8_-k}8MB;CQGkS#~OX0Z1oB#RvgGF%|j*(yP#}9HmAd zq4FQmI3c!?pXCrxJap)&jq?fm{5W#tghd(`upXUVja2$^?A~<*JGLJ}5udkU;S$W7 zw-5^#EW%uVmlW3!1b5@DH@4&Z-}(Wcbp)ZHa%j;&r{m}!8bA$=&Idp8NBH)Se~O&D z6j`>(NGgpRR?J0Bkr&5~9>k>jT1*J@J_48LUwH+W8?}CDFXqmii+ww{;;uV4*=)RX zXD-lS<>O~RdzQx4XFzo;+kfiRIt&c-vOf9n2Fviyo?|$8`Z6lYtC7e0E}gpw>#w^N zMHL|orrL3)p$TW32XLmT7rT#~M}}Ze(Yb3IHbUMZ^=Z_Ven#M3##;O@1MPr6 z$B2%SXL(kvE~a2c}|Q`)+id>L4I< zAxsdj+;tj8r}Eu$*tGZ`fRil@?fN}ikn z?Y1K~ZXfAIUgj}(dJxyo58}(8`#1`cDSYt@-@%-PQ}D$5Z%4?VGO(ASY`Jv5PwO&| zTDPW~_5Jz}2)JG4bX10M;^aXrTRI=JXVqgUaS88#{8nsSzYcCiZwd&AQephvXTOVS z(`xbfBk#qZ{>`^>sDbq=V)?Zqj)qKRhEOvj9~&Q>hZQ$X#%Mtb*+d5IC);pv^KP8p zaS$y>&Y|OM16nUNqP?XZ(Rd7=A`hx&PQ-A23jKqF7-;Ur#PS*h37)l1v2stUaixk( zJ@U7KVj~n^ueRs6^r3a_6MPsz7Vr=dO_Z}6`H^nbdcwNT7>NHQ=hA-y zeVXVH3j0t|Jcod;7-vtM#pXBOK!SCxol=DYKY2?pXESRh9G@$IV@J;7;Ne4awtP?e0IY3rb-8);qh{?ku?`)42#z zSr64q!)~-{hs#6SjJk06r&pTVarWXxctb%tAq1^#!~D?% zTy#<@dELbFQWQtRD5Ad5WUjEr>`|8mBN6!Y9WJ!VT>*>iDGiJA?D=h0uAFLHVM7iC z=_xQSIvcH7=HGPdl9mE{bZbP`tJ~G>|MuP@+z~H~O@!wKFG)DHn43u+RLgGX@ z1j=~8z?R^RW5leBm&Q=nNIA*$36NO`ozF0!$IXBs|M4;UWnCEB?D@Rjo}=S@vhI~5 zt$bmQ*5rkHubwx`D|pOBprB}+KpYEzl1K^8oH~uk8rzc{LT`T?ib_feK)NtI7~}OS znZ~FPaOJ0Q{MZT1o<1M-lPb~K(}GKvuF$ag)sbuU3i#b9E(#IIOvi%{-iPX{a-2AI z3NOF385b_J8<>ZU1B*RDA4R) zbz!qC8W1f&C!;FTNXctlUw2m@`g#V;8`o+U8hhuV^73ieRh}YyQGQr|Yaa(_i-rXn zzrtsQBSBJ<&!+LvBID&1<(61hUB(%8E7ADq-J=$D5bZ6l$?Ls{B}d?+XWib`U^9u! zCY1A~Ih0nEqNAsS?{pjBJbm^Ywr|^wJv;Ve_x1zW`qobD-M$xB&Rj%)cQ-WgwWO$s z$`>|vF`q`|@h6_Zs_SpSx1ahY`clf)A7P!PkUh9?`LeCeJ2H~S_RTwR!9jINuW^FA>aAl1(->5kUp^d5Q=|%P^8*y(pK8?m8fr zZWWDZmLOJgY!QFem-kAX-TcqRx|2JRCg{wk!9}VU;cPqp^8Fj|@kif*~`jyMc!si`|rCAfBbj*}bt4Y#J#OVxW2$YX1(aO9w||g8&W+{Qtb$+Zoajz? z3+N2^^UzJ6%27w;dz9l-ppU%3vKJ75`RSyQVfZ1Cq&&L{-PA*cro%M*cZ9qei4>qP zR6ua%I2@zt1WE!fOq@`G3WDjvV4)>u*7&?2pBMHK;3?s<#v`kXmwMIjb-G;025L;*@P50TzxffklTy+n&BGl#?pz}~=XCq%8a=_eRZ2;bIvPPKLp@T;?l)RZ zijW?!j!O~oI!6&Y@6&OCt5E_44f$1GHF>lW>Hs~!0|yV`rkgk5(9we^t1L%*b2mL^ zr7%g`tSxnMYRNI5SDx=hJp8^#Y50$!x%o1Dc_r3e74Ufp2J5k6?P63{RAArULwMu$ z&A4*8jo^jKTFQj)^SA}Fr1V5P8GI@-D%eaii7>rZMJ-ba7mlAggNGk^HyRtRptqYw zi3*Fg9ILCkUuZbpisTTG2{iIA5l_-U^0|DMmU$Yb0b9CY7R#NF5B$;l@yH*(7f=4; zDV`@oX|Obvol?XItoo@a1&WoZw79U?xZM)CYLLFVu+@F45@e#7SY3i18ZY%?pS^e)>1YhASFOVF z!^g04$#MeW4y;&K{@hR+iq$nubu0US7d2G`%P4vXg$;bLnyzVp=cKtVC@^;!fir={n3Plkp|^)kc8 zwld?cAqV7FrOB}fEoo}}DcX+lserWFP+%!v^fk|bZOyh+Y99^E%UA9_p+m~nP_PG^ z{_%EQ#+B&3J8v2}{ax0yjZJb5j(hMb+53|0v$rdJ2b6HDcZM3o)0nH`sRxjm^#2c+*^q z9OmZ&NJu!z?>++5S6@4TFa78D@ehCVNz9!y4UhfVKjBCd`M5ZOL}~!^*RbNw5U#s- z0Sar}NU^T!CMBdpyg!azFYm%&Loex+fRAmOmmMX5AYh@+p@${WL^7GBJSI^(p#&v0 z6Ob43p{=b0?l^%L0b${UGIOA$A0%-=EcA=@Y6CTRu%2iA0WVK>AI?Mv7yru>0BmFoWi(_yg#q$YV zY-qrAIvD@{xj!SI8peSmXUI~O#*50m=OXBeP|xrstcO6C1NO*Zhz=!4!wgSlsV7Dd z^vcQ2(T5y`-=0n z4TDjnPkif4-caTM0c(>@wWa8*Z*FFTtR2)6SGTL%?{51&fxdA@*S9_rZwZ6cjdMK=_laenIg`rkS0yq(9?jY|cn zV>+X5UQ>cpo;qki#gyULQw=ORN=h3~(ZFV?AiOkA37k25f!_Zec59I*uVccE?sFxG_I}|y;n;F zxu}p_1cw4yG-52KQd($$eu^48MdOwmbs?VAlJ{}+_Qa6Q`myQG>u~7U+XQo7DyR@N z6wLrJ%c7`}l$+=*04GK1q7lg^qo^q_!Qw^pP+238NW1ueu zAC0!s7AU$G(t49rxWy$UESnbZcW9>dL`7>wqm1MN13W_eV(lyM$c^$K?EK7^^$r=cV?V!0Ft zdxvoCwKw5MKmI9hxM96@Wp3NC5AST-i5b%-5-4>dF+9Nc2Ur%(uub9@PyZ6JLfy&7b7y5{s1yAwgq`5kATz}rz##K1w}{l zC97(DX_@1gj@Lti=92wD@-=o&hG`^IxP{lm8~ds;PI6N)jMmp~n9ar#&*%8DnEc3NJl7`Z$T%F9C-=xryx2@J^l zdH$3wMxRTw94e8LD?keB@wHts!ZqD4neHX8<&A2#f1H3OgOZ|R;@Me*bRitvvmd*5?jUc)QC1O#FTi(F=Jb4Ls0g26 zI#W;5&=1nwU5J-n*^It{0fdYExMjoj*t+u|T;y}DS|W!;8dyCi>LwK*D?QXOon=4y zt*2`kLj?8n=1s+viBoX&@G0bbY zoj?{bO#n|vy{tHZ+LAI<6h)}NT!>KjX?eI{gzez>@|htX3lY!;Y`mblp_Qh^$NEV> zTlNEw*BoV~x)B`}$#e0yXepqr&56QNCMBEvT-~m2zmM(r+`X%9ocVuS2n6=Vy*+1N zA3H##Q>^{f4)iZgU45{wbpFM{EjlJ1< zmQ$kfZV~6bQfi8(P@B_mX*o4*QZNxJ3(azk)A%h}yaYS8ZO6n(b%@1c^g6Xhq)f4} zN}9?#jipPLVakkBG&MJ)qqUF9F%MdVyt|{<)}&QFwzN`MP>F0{ThzH+y58nOoeK>XMEROC!iJ$%SmuPG4p&>6I*ekN` z4UKUL7nh>2xWpnnY6At6oEmczK$9WjF(-*n_ka9ryztUa46{79-h4CO_wb$g>VN(d4PpqxgDLp^A<{lhqd^ce>OsVx z#vgv*Hgxx$MOV+T0gi8e@sqfB(^CB4XFnuxrLlk?t?k3e^C%6ALlbjujA&!svm~K_ z-O$jm0c3R}X><6QW|hW8Oe;RoN8=N;e3U!i2UkwN$w&DyxXN-UoK=X6y%!O5715|G z;^9WJy9I||c@2N`*kkzUmp+Ao$^vxd=g^xRLb4C&I+=h!r^V=%v&|`6Ns)&AWv@`E43H@^8LbanUP)1Ucs6#8?B zrF!A=5OBLo===bO4qrrlZ9OiwoX5fQE#%#5JoEHxD;HzV)afW8zZa7~YbtB# zgmj^RAY|&inHb6rK`9Z7DoU~M;6aplBN(Q0GpS}GMN53(WINCbCYpJhWgA#Rd(l(` z6Mu;33p9y9I!wRSE{+o_FwGra=8U5pB~lIe2=2?Kk(VlQ`D`OzdHz*&bv2{7jKDNf z!20;fYLZ#$S+)j4mIiUpyY5DU&p&+d9Q*`Z`Q*Q} z!t43Gj^!2j%Tu}CN8t6mkx&_d`icnNVFzssEgMoypWcXN3%WTanW1yDzXafIf>1$ZdbS8@AiA{-qj|x zVxs+<-_9n;`*6q6K`cAa~E6LF*9JK)YvI=^+8A2Sl>?mFjmD^;Ee zs&k(+)m2s z2{JG7&SHzGh#I1WfQH6ADMbw*PUYpsn(No%lYjYXONH{z8}Hzy=U&5>ZM(63*Fl1< zd{k6anIQ{>!ze5)Vf6%p*}5c-CA;QxZKaVh1*lE!q<0B9s0JBDp-5*bOU=MklI0vd ze4nB@ql)}#kTwkoi>lmo$4@n4;o{}EWz#w=U%d)TRxZTUIg?O7qZ&8eb_=fGa0B)o zJ%i0VE}$q>ic4oN;M}FtD5;r-cXpjecYn&fc^SXFJU;<*KCWD8#AiPJXQ-(v$4`I! zV=S0I4+jpNz~U9xAdz+B!j*2k{Q3?=X`BLu8Yk#N%Y|mrDvj1F7x9mO|5^Ov7r(GU z-imq-4G*EQp&9oPD8B#w??*v!0580@mvki{=ucwy^oeZeAYOiBFFF!=$hkwtdz#Q9 zT4`LAfSTy10r^gZbQDU5V?d7|b7<^Z8aYGK4&Um38ULKo+=YxQf&57$n0jXo=G{9D zbJkBn^^^$C?P(+*)3DNTh9WU^_MbrQ%t~}dTo@p21{*qY^7VsgdhH4-q7^6@bt9*= z7A_iD8v1b90e#7|5BVhokgk5DwT830Wrb5&WaChlLo%i4uH@CySBSqT4jpGM;-e4! z0fzeq(Aw2a?}JVVpRZZG%EPA_<<7Ex8S6$BX=*xA3yQ{{^^VV ziV^~pk9^=Eg2hHU3#1Y@RVWTEP`%7X4TEb2Os7L-tqu3L5;md{>-^9|>ba;GtE?o?#e#VtMN8$l&`ecPM+=&Z3#`eUf2918rW z_#%zxq!1EAje`-rSbC3ANBI#ySL8$+JY+As^}NPf_oZ2AZ_Sa#fdwFtNHE#k@A8aeILP!JZ~+Xu_73 zQ7eL9x%Yf*JApetfgbr$H1@cumk9thGgrx~HO5&(YXtbT$>}m@Ou9|{E)iOC{bCU*H~f|saISQ^3$!`c>x^@r$H$GJPV)@) z7?i}+naMbAIL8dCDK}--;(a;Z$9;>yN$FTO1)m@Qs1FTqhS#fGQTJFkDxWEZnNDV` zC|b%WL9bpDJEE}x0;d=*H(tiElP7TVP1oX?XP!o9TOWEmqevxr3xS+!;8gG-sK(qj@Z9Qmc z>_J~&oC?%YI?7rvLIp#`KsJV{^|dr4X*oPCS*K4$c?AZeQJgw?#=3l5E-H6#8V|gC6AtX(izBBlz)u5kUcES|T1# zp>%!$mcMTX`uttUC(E|&K7-x^O-MF|;3+HNeZb8Nr=W_M{qWgiIMm*TqKaxLgOla5btPKIuAlgZaprq zv&QtuARfJACI0+_kK^l4eI7N{^|<54^+?3pc`M5_qNN4%@x({IN`jW+D_{8=eBi@> zMtRNQum19J_|k*;=8wLGfBW~(!AIUoWa22u5sc>3DIi!J>ha6t$hJQMPhOSSUQ(6rI}17XiySJb3Z|FaOn5}#G-?kJ9id7|4(1CZoFjNG437> z_{|Gopg)6cJ6=Lt=Qh0c<{PLenqmWn8yYUq&}Ha#X8C&rh2ao^r+}3UDJuWg&H-F% z>O*IHFNO#zMn_~IHF3pJz#31dZj(ILA&-i8(ZWS2t0;pn?84-!RS1`O@wIP%6VZMp z7_GOlZJAtDIKe5O$1(8AqVK1&JWs_xJQPJ)`2-pT0)cP@O4}e{tVt>|7$a1&P9#C8 zL)dzXM6$Yy;92xfvvt)5I!I+|3*z&7V@LiIu+b)?B*kj$hk~9w!Rr8(cbtYfPK6&G zj9H{8qh{pwYFkB+6s5F*)B=Mpf*^iU$vo?33q^eJ1l=~N!tE(_fQ!o+Z)CabScY^W ziuG$&qpGkNue|&++d7W>-n9`eZB5vH;27Xl5?&ew8s$-5`}t3Q6zf(@Lq}T&9(eFB z3?}2~=GM(S3BuhPNAh$h4(&gI3q2hehz}8Tk{$#E#nt7QzF-CR@4f_YWu ztpBK%DC@!me-eXT18mm}hBCt#LJGxo73d!BBLBEaS;~v}g0vPeC`gPFJPsk+-h=#9 zK79HA3w!S!C)aVEiGH2qbWhF+z#tED4$L`=qC`4Xxvn{Zq=z%=X`al>Xh5K zizBj~rW!?EmBi6Ax5DEhLn(wK$8=!(_mjcTgGx*+D{ssq+ya*eW z^)BW!SBOvvhcOYEMNPT*X$IeV^eDdZjaRUF=Q4cggLmVf{^$1)@_X?&fBIXjPXa8h zm=?IOlYbl`wlOb$`ow;G`-zvZc|$qA`1xPQ+_VRO^ymMA6Ma|UZ1Z9Jjq9*(Qvh~Z zz{&?U?cOfruel1`vVeoSP^d$mCAN44ESUY-w*rA89|D zGe^$j%&8NI=cZ9xUkP7XIXiqalu?J!bx|wQtu_{qMUaSTJ4ZV~nH}pkbYjmnJJ8h9 z1TEy!a%8QHk3?PT55Ix>3(;7Qg= z3TcF7kzKEbtKsJ={2a{bD+Q~uP%`jGVf1#Bv5r#tx-TVX#Z#~vS*fAvr#~aq%st%_ zaN|J@lb8Cxq&x)b6l5WJI}IMxh)YG zb|@IM5xCL|m-}$}$`vXpFGhza2%recoK`PVc1HPkvcZqmmPV{y-++OEeso>xXKy#o z1o=LD-ENOEXGex$VR|-);jtJlU7oL)T)c$K&{S86rR|NVtOyc( z#?Vk-Z}OK+$FXzw779nN**CVLstj#QD{%3AAJRz)Sb|$BD9z2Y*_c0;Roe+^VtAUs zK|@4!jZIVl^;BG8LmN>*^8f{irPNgqQY-=>3T9D(ls?I7T*(mNXyuz;R(#DzBwS%h z7wd`f%(;&GfB-mYDZwuwlO^zxl`%_N6eyIHXFEZhhJ6JfHNQtgEOH1dS0@4ua=z*b zkIeB%Jq5JXxy1LHc)1Uevd1?}O-MklJDiiHv z(lfd~e_3y*q{?p%K*}9b&ADhK3x7|qvxQ-xo2DjgN zJtk)6F(%g>p0EmO@~%~wm^q|L$oN;$>L7c_~({ zX~Ao6yoK087Qge!hjH!oZMfyyy{yp!+iHRU45T^1UOtHZ1a5!$XMcy$sd4<(AAJsY z+K+G?|=7 zf#1tS;wYx`$i=M=PdFTe%jYH!XAn)zVKOs?iOd|P3vtX5cqM|2TMi7SN6~MaKol|Z zHt)r<80#8E7lHZIfEIlv394KeJl{)7dePn0OVH&*WqBoP8fwT}1R<;|@rPuXeA!tY zX7ZDfm6TnS9ZnDXGJYFsYdYX{)nR;i5->}2{F{>8<~@&`AM?4K(C68i zbGZrxb)bx;JhjQea)RBmqFKG&91fu(;Nx=-Y2!A|lm+rM6~(XleEy*6K=?^F`2h5@ zO>6j8Qwp?D!$mMCo^w+Em<1|EXUMWg8N)UvFAf$6w0=f!Tn$&l&tdpES;!#)q@d%X z<}<-Mx2`N9rEAJ5qae+MZ~`s~Py;g5*wky4CN&yVz=HsU=X#TOrGofBgI?u(x-uY7 zajhrjzJ`$usN>JX(F3I;aG_LqE;Xho%7dKcYSpWTNVM{;$R1}YPuhKh{ZLd8d>uXh z7HX<%5e$SW)F{lH8hX{_-~h^lEy$!|xbDUkn3#~izHx#qJB5!E0Romd0omxpEH3v> z6X;FiQtu=tXQPN~ID%`> z=`~kYh6%)MR6^xAcJwd;6o%T4Opa6y$Y7ZZM3m|k=Lxcc;V`OeY7Mw$F^z>&9{U-U z%8#Ilw39_az{CJH{sdG62#wng#uM43=tUzlw~KU=b7<9+1S*O9c0HJ&IDD2DfTQBq zLWd-Uf0iKE*ysqJ1!6S+(?z0cI7V~7w947|cT+O#rQ2j7<8{E5M?<9@TUJ+M_txb& zdHy^VzFbZCkK6@A@jaNVxm7#iwF1HsbR_&j>AjKD(>r3y^3>?+au zfnj7kKEzqBQx|%0>P$ZlAG?D0-v1z6RN0^V_0QpV|KLygybSX>w*jqW8q$HqrLq)X znWFM1MJEMm_=`VvG%Vk0*6@+|N)|k0QJ~Vcc;8N7$xedkMjD#EdRa%JP%#-L@FEbF z16l%yeumtlH6K6!cGCb6n>Ia$X6Kfmj9hw+vF`At0diI3q2-~T?|*guZVTh?O3+DbV2zE*!~ z1+^CN==)yA&*ejS{?!xsqyPH%7#JGHZ-3#_c=!YN;wMiX#DDn9N3j3W0GhUXao;C8 zv32J%=09yLd1Od<96`MG@?i{|>}FYG$deZ8s3h2S@+^l{w`vDDf*QWZvNyIht2sb! zN@Pu)wI?uZo5zf84iotqjAy41btoOp4=iGGa0opox-r!=hTK8|c^hSp+%*+l7`r?S zN1h!`)^}g;72{^8y1E_}ls8V&SUjY*AeNG)Or2x1(+1g2D}=+La+LYokdCDB#!LH+ zFFjv{0~Pfi%BV8TvP1CCUw;IL4!uQQ%OO-zhKA-PD6eRNI}kE}t+8n-;<2>x>nZn1 z%U86Zp|KiHAKMl`?DK?h@xm1xJ9Q3a;Y!RzQiu=)H`F%ZO8*2N`RQ}4KekcTGxO4+XGzVF9fxw+R&+j>yK3QJ#f^%t9Fit}aWmTAf(Ypxj$_VDP zGMDGUvI@hSlEq3-b8zK$MT^h`Sk)odGznS%%pS$0oTj@N;LLU>nWkZLGjGz!FzE{G z?`pUjeqO`RiKVa9NOY8Hx6VpO1)b~4fGr9vYu?$YVc;*jqgYZ8D*^JN?-r!n|vTEllGgnvS{ZvWw;YlKQ4LGj;is^yDhr{yqJly$j7Ijxmv=6~u4_8+ z!+Cij9D}xuz98td}hF@X3d6#jn19FZ$0N!paqE5SdS*y`hfu&R}?C1e-Q( zz~uNOM#pEU7(&dJ<)g7+6ClmNTNc2?+ zoMIaC5!IXVqsDS8=#CVzib9pb`q!|t=qWcmN!EkrMT#Eeb$0<7-jfwCPerF>CiIT!cVUgiK}erO*B=Ds_uae-$yA)*B|VsSKA#}}m*e!seoW63h`N$kn4dx_Hh~B3 zx*0pRZe*M+9Bw~p=R;z_hJXD2i}>rWeV^$>@JC<%b=-H)jrjJXui%fq@+e+8KMr@h z3%7iDCGNUwIkvYG@Wu1wZy?TZ$x7xV9C z-cK^)iDU|iYzi$MON_-z);>aW)@h#fROg6bj&~eRYu<61^y@x;0fVRekR_coTx`tY zYzxJl92Wa9-ZR36DT^*;58La|#2BWhXVF^Uim+Lc>S29q>IV7C>{abz8&PMk(sVfO zwg65Xd<*+uegVnM44T`^;VUQQeL;+N&*Pil_#P&w3G|tc-Qy%c@}sSFIRU2+xv2Kq zj+;(ZO;s~x$Q7pRz^c`)sBfq>`5}{-wtw#Y6`Z};$GQy@Oa_hrz2m2QFf|u5t8UFU zf8;46BZ}lE6{|2kHDP*-TD_^2V8a8$xZ{pH2pHxuF*S_w zkvMy>JLt$hxO^`WY7?q=bfHrL1JtC=Gis0n=;Od&bJZYYUj`(K{es z-x8qFJU%mjQZ$!IQE_-`ciPN+O6?qCoXYYiYmmcEWl!K^tVaR{jH}g|HYyIcoggAP ziGTdte}@m;vm38H@f1OCJC-bI$M=5x0}M~)m?nW##*SJ7^BZ?=LuGjl{_)#S8inn) zEugWs31^R;#G9|ag5UU!PvgYtW0+l-;deB|<3ml@hR&sB`0{UkjQTi&EB(Dx@&Ocr z6*$#Dim912yu}P|-Pw*0+`SIH-Flz=;;5jKCl65x%le~^g@~eEQnDy-AIl_Fn?hL z$-z-L(q*s*>}cG%1gGkZh^n78m}EVfsv^N zcmh?%U53rhb|XN{G@a~#XvMhp*d=*bK(U9co0jEeW@ZN0Y+s3rpwC!_)K=xL!$|`Il_5Ek??H@ja%^N!K?|$>+SigE5 zzVW>m@F#!&1djGZV6O~d_XE|q<^GKb)rzJ?vs28h7D})#)M3*K`5*!0(?9+RI~4&e zU)h1iWvyV>1XbjpNFt4P^4ijlcC@=l9o%Bw3eIy%M<$^;tfnvsa7 zQBx@wN*Mx~G{Kt_bydsAH(~U4UBc@xy@;9F352S&n}(D1pblpMCy!mg_kaAHam1Y^ z;PQp5P*dMbnbOV8`g7R0X&u7lRV<4-XY#4&V<(6m zjxhpzf-$G|+?I22f_ecdtuQaiWC7qJJ5qK6Q|-o~)z|5i7HViHH_vYu*$LG<5+IZ_ z`4no(eQ0Cnx4Nth0oI4v6PI8w$UK!vMrwtw@~9tWuJ+N@DtM2!xn#T1N?k47Q9F~| zk~Ptx4j1!ft_cdo=Wjc?{+Zv^a5elQgr6hO_kR!X+*1qzFAG>v4e}w+7QvZ;a}+9S zcs!UG0wa1Ri<7YwNf7eSfDc_su<~btMBP|CEH>T}05Rz>j%nZ&!~!a6@FlRKuAi~| zDFGvVln);GTxnQ7>Kta1f4MG@i}q!; z7-pQ|(Me-w0PSnFKSTpmO#MjRc%zzL#zWk5(`;u z>Rf019=`PQD@f&vSlii&>-KKI3opFJdUoQ}sk6)j0auR7k&1PCauD@3wPrq6OKl@U zK0ki^vZY<=0+do-$b1xeV8AS%F>am*b6>p2OzNTM*3_&^5{MKR8Aq&5=0FN_8g|XjyaTk$DkK$t=x)ben zwFG-{#G)C*7CiXjBhTUck35NZI*Z%yx)q;doY`anfA!7B@ZbOGCG?D^kuNV`%}o`! z;o)UySP^0#*$&j!*||#a+sT5gngk$(Uv3aMkQRdkKYLmC*Y4PXJ8!-Pqx~Z|eDEl$ zD>cMw$FG0t6Ij;Th}A3Fae1H{D>tlQ$G`&gqLE~b&qaC@R8Fv?(0%eeriaF0O94KD zK&=i{`PB;bP6_lW%nZ+>n6TuejIvpRYYkgQ6LFmHzJNGoh^y$rvZYHYKbqn9)Dkd9 z@$$1TF`t(R&IpJ?>_|DY1cW}O;>Yo$J$U5DFTqn;hsL($rlj@tO{l7_CKx9O%h_@M z{3Y^d8vb%G0_Ek<-m@b^eUxq0*s#8nGDMEbDYa#VBoNzo_zWf^1i1uPb_c<7*n?Yc z+>E)o8DlL}dsq7Hr&d3hGPxB!Kve_=!sUhPb?6sq{t{in`l#Ohk zL2n2FA7vps0{)Pfpic|Vg6yF9;qwR0!VGncy&5_uFL|9_GY`_N+BH@@c??qLfgMM- zH?>LCjai+$XzsJL(baG@{9=Wl3()uf-gKnUb+kZ*0e9Ao#lRGJDKKWGCZ(}>WH1&t zUGk@QEfA={=M>&b(GZCwAKLm!^UfUXrTYCI^z`;1#9p(Uy(Z!m$Zjvfp(+BmGOSwDhN-zpOiWE-VL>in zD12;M#ptABjbX#44zx5^p{~A$U_iy7l4t&_!XftFtI^ur!k%~o+6eY`?YSB2H*TZS zzkpX?dlG$DdMN)$+jn)YAt`|y0Y3q8DK4u_8d4Dm z%qtmHt5#|-j{XW%*qW>4b$OAZLXj&S&DTj&akyPsENw1Ftv`?d_@$4dwz7bk$utfh zJ%wm8ib(>X4eK{zpuZOv&YVFm62+%K^$-rf`2u$D*ou`)I2os&2=*E0Z{S>Jl98FtU*d z{_r8GB+)(yKba(NQ@SPbQ^d3^qp_rQ~mV&(EGg2y#DbM_+3>?N4UA>@gn zsn&(r$Sf6;i-3hdlnPP&N)>1pJ7_pp!%)WOnyhRDe)@^$?Tl3uaH7&PjaWK`g)|X{ z$AReVFi}As<;^wlR5|!98)8(%(V-}cV;Q8bM3A3Mf{4oSxj?>@Fp(MRtDABB&`AvS z4Nws$F*iSJ7OX_(VpPrrc4pG1?Z~pDp?JY`8+krJP_dn0sG)T!1_sA)f`BH&^c@}o zJ)g^1G>h!i1cM>dR>UuVYzbzVUrWHxc|0mSgsis zOY_I75M3w|;H<^$Odfsx^EhzujM@HcE7kVHm}`fC}-G?$hMg3AHx-b z;h~GY$P=V04HCmx80CH^qp1*VipJ+9PXx9#q7WIGLou!yaSmv!J6XhKNt5M2kxpPH zI)hj;f#YwTLME2MrE}-;*5NnUVJxDuf#6zOINAv790b(->ZL2A`0fv%MOkGN$_bji z1Wx6lO5>iYx2Ff;vJk(^c1X4>3;0pjRLitH6rgrYj1FS`x>l@Q*=|6SR@X);<1{pT z;K*r2Qxs^(qGM?-wya-9nN@{*?!E`lJpBUYV2B-AIYMTh$lKy4`6Tpua+I4nRIq;B zYUB>-Dt*C{l%&|za5elQg`bl-eg7xHYGMX3P@9=Q zo*Q`aHjpR^5Aa;40(3kVSYRX7#oGWx0FP-HrKld9B2sWkky5r;N5(Tllma_cIF@~j z?-KYJFv6q0DUhRYSz8bBT?>JkOz0rRB_(Y}DVattpX590tp?1B%7MONG_}@KPA2(` zLOrYDStr(QT!P5_GI%}7L?OM5@>+aW0^kBL767#BR%x2m(Tp#Pmw>g2&!3|x$F5WgAyudi@%aSq zzx^6~@e2=Q$&woU-B-Sb)$MChSM7kuIfvgMxC?pxc>2+w;yriVj+T~2yl~(sCPva! z1_6Bf6ZhkL-}y(JJ$+v063oucVgLRE2$xr2a%KiEzxoRN!Eyq)7pQ20$fnZRvv&vT z%WLrb(~lrQP`>ZrML7IzETNr1C5raORcq)pS1lxf(fNU-bXdAYLEV86mdX{yYB47~s;7?N$3gk~& zr&T9PFNX|)M2LCm!?gs)4o4J&BmKx^T?9oLBvJ_~NVOa0gZ!$H%csnotBqUNVO8fA zT^~9>$p>^g!5U$1D)(x$h`_|8S+~NgXJBK7eUAmAYpXZGwFI48C z9Lka}6D)fg)j=OxHIy5Y-#+HSfI1E7h7cg&^UHszKp**C`O|J1Zdvm@OvkN78XC%V zkxp*%8~KYgll(R-a|N<>Bri+LxFpk98RAEtnQFKiu7+R4@CyO@)Wi(HGidIe^U|Lc z3I-sQegX^vggRHyt7fhUuit)W@nC=(Ri*A5H!h_l&G)Qe(&44Rhio4TCjR2EjQO64 zuY6EZNkB82nQy4b6c`#B)+BZ*(p)Bss)|ZP7N#*W+>egd-xUQQ*O zpwgPg;NS#ONh+WO0b^di<}%o^Wh;Tg0G4$uMPpq#ma)gYe#=HQFI$0YZoG?vJcwY> zg+exkp7W>Bb-o+Dm#Mstc2Rga&7^zHj}f4ZMRF))9GHtupuVY!WyW4Ps(n=rF5 ziP4cU;);MNqX`s*QbEQY2o;MKO=#nLhR zg-)J2Z&@RAau&;c<}w6lMYJ^4WA`?Kne*pSMkVvmgYUuW4Queo(=Q=V-VFJFl%K=X zrw6F~Q>Y09uzKk-?B3N0wqnv{$UdXT$ooj>;Kach3^+ zxvv$D>ICVOMj_?E;F-%f`pTOazdVIPG!I9T^kiKi4VF8Gnb9dEXQS|vN3<{?TO{}; zn2IrnGX=I^XB=y;TaUGyRwGAnm8rC2s5pT!Od;+d2;!fez;c>xv+MLZ%uP%idN1~s z3@ydqY8xg{K3Q~;d?5|kresl7yIYuEKq8W4yOCvzDU)t;Ga?_Fa@(SG@&tE9cHY*l zT}x0zP)Z(2CkR{v0^9}iSsKY$0pI`b6YLOX(b&Ecp~@F%@qICrR_t1F z)zB$O`A+GYa+fI*m{53{_sutSkjiJ825{*8MPa-c6xF27qnW2ux>jmNA?v62Y{(bW zsHpU#zi$}soD0jAHQ}|FUdGlfTg(t|h=Ox+Y8ZnAcbN<|F4NIU)nqDxwG`T`RxM|b zdJ5aNU61t}u0!k6PGn+fTsU(O73>vHjEvx|0|#*S+ie!N%&ZL9&(N)|u9VaRB}w}hy!dDG1MTC5`p*iwC&MIQ_r>QgYo@{Frm)I31T z>Z-b+@+WZdQ}AnWi}=9oW^nT8S)^jKXm6~+%;YrY7h>q`?ZcB#y@Fr+l`rDS$6q1% z7%_nQ-aGFwL&E9IEIO7o7)@!$;|Kb_!e{~<;I(!C~x+X9m zFQTHRo_XuW=RWrPo!+#$mkh`a%5JAO8W)o;rqDGKCyF2U+rx zi{;k}T_PV*k8~70d5?M3j#O!fuEWZURW(WCm;|lD(eh)h}S-f%R zJSJJjqCJhf?%a(X1VBUN`H{&qj$D|)RNP5GOwi%-qTq6yxn2%gVw6wqzQH^dQYm<- z$hD?bJ4`6gW+4zkkk7*o2?&Czq#fP>h6ut=4~*eBf$6FKDfCPwFcixnCWqaArmf*i zmZj)QAm^Jy=iX|(_cI$&x1<7*%mQ-cGg)=!2c~iG$^FO@L^`8sWagtNrZPye-DEW1 zlRO}+d@@d;mrSCuwZT{wwdg9Hmp8{GGM+T1l9QOvr(kRJVi?m{aLX?wzfS-;H#m!~ zx6Wg3U<5XnMfE0nm)d|pBt!U!;7=n2s>0Z83=8ZaIBoJ9PO;d&}n5`0<8Y&4Qrx7Z1GQJ-bIpEATzL}iGwh4tZe6_Cm%$m?0ORF(5r ziE;wgGIkO)_s~mOS>_8-rj?np7;B$7df?-8`Pn0CW9Q4opWDpi6J0bCAy8)lJOMt5 zC7!cR)!AgxtRHz^GRL%stKn++1rI;>pzmkwI{zj}Br24iSo4@HMP=lr-YYdyUaRry zwt2Lu%oHq;VWnfezj#~(ALg6_*1Tyzhj0h~)1AfVdTh;IdMB?&Xe(W%XYS}d4YyH% z^Jj)d`3;9dyI_RT)qN2gx2!-qm&8c|hn+ijAzTr_-251ZN5&ANQk8>g0Y{~$;fxz@ zxDMmf69fq}*!SWac>Sek*}JYoYg-+Tymb(V`McP43Ekb72rTAIk6f!m$0x?A^lS*Q zC!9#c5TK%JYi_|8zVzEzy`dGSFC2zFLogW4F}+r_EUCwdvv2X+GWBRnA`N$^sf$u9 z2Zbb+C@})GdRL_tO=R`6=2-F$>6Rt>5yb^2Bv7TuBycSZB`v3i0>%V&Mi4vAu&;oK z6e}N?a*M2@sTtnods))a7`#Z!LdMB5$-P62k=)4f`gec(llZ59{CliuUxyW|nt4Bk zlcz4=^;eG)WQ`d&A6m@v_#=<;dvSc}cm5-O_X~ew>SQ4@jW_onLV2*7?+IA3uE|HL z={)lwzR;v_ei|D#ci`F^x8bGdpT*|29k}nVP597kZSyqkK z7AjBHTVyVQNMZ)H^=@3VcP+MWU5A#2dK`HD5FY)(6Zqt>{u;jhz3<@tA9{dg)+*f` zUVrl_?Cvu1kcRw4!$q1AyooJk4K<67c%e37lo#XGm1T|ZJ>q==P$xmjJV8f>aW$9D z;zh%=EQ`(srmPN)>XYfPK3wd0gvbLng4trqjcBZZA$BY}H+GPZW-%X|M#qXa+<3#S z&kK8r*{$bH4*S+kV&VQCf_6PhdmW|^Z7S1(>H_K- zI?p_4J3Uh|ssS+kJG>&&7uNKi)5tU}9OOSRX5 z=DHeoW_@g%UgN7z&Xa>|e`N%CYKMV9nX&ZApQs!!>s<3bwer^G)BHWRadz$@FT3?4 zjU=OVF8Z5}lI}6Sk^B4;)lGY{NPjh44ZrZ==Lqys+L@+RIx6VAbXB@%0WPaaDp+7k zcXZTKDKAYPwg7^artX=>%qz)Z0X1u=b}9VwFhPD8vddlVgG8}mBb)@IxXs9j2jkoNe;*H?($DTpg`HL7I9YQL> z9x{8pl+8#{scFwnt@cb((JaJb6zlZME0MRUHA;k>H zU=RovZS;=j*XX`^Uy6^?$mMm+h!Y;$a#0Vn@ zX%~*3?#DFW?dp0Hzxv7dqkm`+lXC)QW{-6HAm+6F1&;1L~U^*r{s4>XoZ;`9e2bc^Br#=MktNz^L${d07jz z^`aJRB{TdhJ`7Hz3BD`w^1kDUC9`b4tS5I79>3gL zvBcyF`DOGFur^dypt&-Pklzn&OQ~%owH=%G{0^0c%(=g;jPH7k`xOKH*eRATPwk$e zA#QEE=GGiX$qVv|=IxmU8vL$)sxJlcistr-&WdZEnk^~HX+VOnR_Fo|VNGQ+%V#70q@qx75=&nQeaY~3^QEg-1g9g{Y}+~ZAM z3exD2zGxJsxuyWtglY<5MY066rG#ajllu>)CtUhGi+C=v^C z+;ZD40=FNcv3@C9Tbj@}e8~U=?Mk5S#F&hkG+$Ryj=?JzsMK?)sc$m7eQ3eK0+oq2 ziVs(LQC1Z;a{x8}D4EEzck44fVGZx@+Oq>U-gphxZ(NU+YdVpp@YPV+npHO;UFgHa zWG^BV&K`F?wr=l4EHR0`fh+7WS5bFpVMT^YOSEDgNLjOt`K;zxSu{8FA^k-M(NM}o zz|+uDMC8%Xj&u`HmLQgE23ht5I`Y=)7XmmcF@DG>JiWuT4E^}7z@M=UlE(5Qr}<2& zMABF16 zZ*~T^>{yG#2Tl@LS;JTwf?P;MNlOb%h?WI{o}AuOuZR@#!HdFt9`k)Ohz&R}#>I=r(79>&@9 zbS^VsnhZ(IN?^)whn+t1QvyTX1L!_=39*?4i{|2ciUZS8Vx#6AF_qzS<;O5P%On{m z*<`g9wE12$P)SZ z99)GonraC4DymTF)qFe;J4V*9t(mu{#Tq=o2G_uzE!&CKe83WM~falXf)MHDTSR z1`Lh$Vth2svdA(KwG<_lwJbtrh=kVyw<@DbYF5PYo_fvJkfBv>St3MA&3i1(wKNK7 zaUP$EBY@0j0)ILA>Cz$!eMf2WC_!x!VKnU=!NS8y$*qm3Y=s2mlsc1g;NqoGMhT+6 zE{L(AOE`DpH2&B%EQM^FVb?VqftX|WCF#>Im$Hs5CSrh?x zev2g%z|?%Es;Vj^5^}NlW>u=nS6Gu+t=^wqtbaJG1 zz$m-Tn>P?VXHXu<>d&`~Z8H(ZA=igvwAdGNX4&h)PN8UVu z@=zUSM(0VNG-~T*&75Sq1l**tQ}naV;nN?x9{1g`1^r#8kc}4?;=q*xt7m*{lba-oVwtEyAx!DMWNN>?y?MLlG!=Y-0 zY#;30Xf9S-0L&i4`fELS&#&%4{aSvQy86?Kx=zD63HlTy7orw+_HrrI*rODwLri{J|-v=m@E)* z<((M3(1T0Ix-d6B!v;(qQrk81L9my!mK-6!t8FM48L}uZOgkrCG>?z9poU>&mEs!< zI@^@m5K}N^nH`%VZLK+JYCC+BKhaIYnl96pRxDeA_U2YBENIwO{^`5~j1G2G{srzp zEovIu$=7mu5;EJX*$7^>T3kWylX9870Y~z6nP%tHM-Y{W67@=nkD)&&n+{~gD zk&Y+%%@jKyY#puuPMz(=h3*jp^lgqj($SZINV&gIY1Dc3auc8fF>*fUl<(>c{M zp7Ur71o{&n@^>{{4e!SAa|rqr3|z2I{~v-|RytO0jq+m9iZ}%cYgzgfN7gR`TKFe{ zV_C5*D}=y67CGax!tTuD%$aU%+H@VF@gWK{8_Ghp=;`l)-z`@g1^xssZI~XP#pcd! zxaGFnaNmbMf`O@{xN!L-fn6Drk+j*WC>Ycpl@z!hAC`4=V9#~ep{1?eIOEmuT18D2 z9PDLl&RSw2g~(jmI3=#AYQ)Nwn{dA870geMB2H|vv||}smNeqT`Ta{HA*#^T54 z259MJ5?6*Pv*QElDYq2b*}%p!=d%PsJbKNd2PZ!M$@@^-*oe*BuE7r<`zflMs?f2r z6My+P|AJ>!fRikT5dyQ~2tieI6S-8gcUV*Re1}1>ds+Yd=aj3Kg#wcO3z)w$&F^N+?hn?GC+W^khrs&o8}_26xdrFW_n6`S$il3# z#1M9{Vmz=@0bd#%C(t`b{tuBAe1_NLJI(-0)}`AnrA*M3)>d{21U2LwkD(^y#NYmx z&*8=$EAZ0OKgF&+H)4!n_2ye{#}A%4gqMzV!x^k3Xvz{$L?Iu3!i%havVwTh2^Z^H ztE@Aa#u(Sq{4%v|6pYq@!ZRe*K zaPin#Obv{nn3iRZj7omh>QG^9H4wQ$65ncJm-t(9NRQNJbgqt)CBH22XLYD_E*X+D zmUV%?l)!DWfVs&CzpqZAbIB?;dZc;CEk9V#m-jSDEPZq-WMS6+Mzhe(U+ z##TP7g^PKbXXj*$JY@EwbuzomgZ2>ikkQ}E=K;)wrK>O>=gODAzZlBi;RgUnZj z1xhKy0^}(Hy)xE`wMfHfIe`%*7%HQtbjpVWyAmOIF#?|;MLTN5Vo7vexPrUxycx4|W2kSe!Rhno2nuCc0pf{- z>ESyIWk}4F;Sc}Y@9{Hkq;jL^z0{5P3;~wIXZAkTT$`rW7Hr$K8x76Ywn?IewjqiU zur#-{nxpn}mB;&V*o!37PsZ}7s%}BcQV)(Ce-5!J53&U(RnH5dh?+te8(}69&;tz`~G>wAc1(0(&~Dj!K|V zL{}Q-JBrKi8+ud7Ti@V)p+LD9;e|k7wn%_r%i_|dE^OPm2fc$s*t&NIe(;kg@#3q; zkav~AOGRTZ#u1wt#J_(1o0uM*p(3&)oz|*culc6tUkRW~xg-b>l)iRG$>mZki};Im z&p!>RHa6Gcf%n~xnaRue%xB(*hdy*KmakZffBEMhArW_DYC49)$Ir0Z%JJs0O9Z29 zad6*J4EFco_B(fB`?@fi%2JpcoWrH_V+eQxIDhIm)@@vkwxuiJ4pift-+IJ27xsAz zh!X%63GDl?jG)QuG>ZM@m-k_IavWtOYk~k_YG#J@tRa3E6~1==$WT%H;Ip#~3t1$_ z12@|6m4b2P6icm zf%ixv)+Mz%-!*Bep=e$e0b4S{d=c#J+|-JXy#H3b@7BE-9J_-4!BOMOZtI#3BvZ5a z(X)pz81ds@fBX`nx37}b&5so<>tQlCg{syR?)}(0 z?6_ko3jPF&DF?yV6b?Oo5Eu8K!+ifZQZw@e#4Pu09QimfJvN28=^514)*=)LA(_n} z?Z{)U5JyKdY0mbvq_Pz?;Tog}oLS`pOcHJ*T^nosYvV zkjWJ{@YWWWc{O@zf*rh`Ksw?u{H5oMOz20MW1WZKAss4au$_9niP zW1UaKN04Px2FbHUwgCYlC+Tme{MoT(i&+ezQ3fwTpM!wtTi<-tI7|*zG@!b=9wS2o zxN@ZnIfCEH3W6+$*R*l9!+181q2bF&rxs9CS)q}1*fXeI*|7&*9FspGbkS9x|aUI2LvzUysN4{8%1)Jp;z~)1Xwmdhq<(2Wn$LIRH z8m@+SbND%$(`Sh|tI7SJHoQ_i2~Rd)^S|y<`Lh8VASg+xJA7zPC7}5Cc2An1!t|mg zk*!yGZ2>(?04ObU+guyLE0AWMEe2le4}njt*jGZXT;wtT)>f4USz#WKP>sQR$@;RNhfz(aUGp%S8>}i{aU) zpTR9R-ij^?>#F(?I@T`1%2jL8*tCpkGj%En(MA6LBqX&0PWxDD=#;rLKD6c|6UMq` zFZhknt*u!HyC;f^Jtqh-vk1CEMrovw!I|@C;BQ#P z-8ZO=a@VbaEed@CP0_;i!1*&1)6H;|USSN;l1W(3ua$;|XIOtimHek<&8FxS-e&Jk z#StjfL5h;Jce(>CLkQ`t4HqvBU|@6#kN)IEmfcBOS0Sqv%=tOoebZWe^nKUku^)dO zm6aj9_Udc6JbD^$oj8oT@^)sPfX{0U=W0WIYtc&4_~J{k9LlH1>7hclBesyhpj8=1n& zWgQqA>cfeX$ElDB5vUwJJ~u&v=_^=1?pO^1-xEXQh|ew{9m~MU=Ncuq_RS>^Fpl`T zv8fiDw{M2aUx~vfuV6kwrOE=x-x*sFI|CU6E9@+14Z(#2+59BxYSQ@V!#5)vpTOkE zC<#-JEWx;TSTJoa6~!Na`SZBvrrr47*Z&2NfA>xN_V0cM(=!wJ=}-3&FaYd86TepA z+5KlQ7R_KPLGJX_qL>-N&NVf-b;nxRlTp-HR-vNIiGki8@=guEI}KOGG;V(1YTW+5 zP4I+)4C|$kb7N*chPPfjh{;Q%C`=Qi&u7fOw&{4v3~lGKMbj3NnG8Wx4Au3u@Dqq6 z3Fx&5VmLa1iS#t4$tM@4FQIq77rm(gOgrWBoIqxG1fDLt`lc5J30wF)6~jo zbuz^#YI~A3I;x}cb|9f8fAq}yv69qm^p5yhyew9evutybGp=l6DRxq_3504ZQQg+W zc3?BsNm(r&S+y^=2F)jCyAa<>PO0CreJeqq_SI!Q%R0RppsxLmr7$UGGp493MAgIsi=hC!}dsN0L+tS71* zd@O?Jo_!Vj4j#rlWtXh*%DWFt*!=DWqtxtc0l-T4deQPe)yS3?WEyjM>yb- zA4GOA2qHDlP#rH>-L=z+z@0#?WSZvon&DdkKz0_@5mSdyAkYloO4gX8C5O~z&75J@ ziJ|q?a5cQk!_O7y`~My!83m#&VJOH^`qPzxS8T@;vIbiTD3q>sBrVzTFtBf zBzzS^0-^*Q^`0^RQ|Rekoyr14RmPu$x$Y?q3v8Nae3eP)3bm92#@q#>UhDjRxR?<<%dK83zsS1(=*YLvdLgi1$BKz{{( zU*$~@U`OI{4`_~Bp?vmWHTz0$K*{QQ@Pd9k?J!T2%x^M5g&N)0RqTpaqYERasLBb@LRw0 zLA<#Cb&SrC2bfOLm&cN(X56`_6UBHG-}%;$@a*%4aq;390aXQBm##-`>k^D-@;G$r z6hc8KuHUu_zxjy=F*iAcxw%<_&MdB6>4&?l2FK3!U}kz8k?{dkS5}gz@@79*DbI+u z!ZJ$I$4*29S|KSgA;l+yocJV9prqA|8v5UL&2E&})Zo;`5%dqu!sej@W~Zd+WG%4% zT;w&EGsN<`*nSB9{CV7d<6bj#JT)+ihwr}+2M@i0h{FSCeje+V)?h`0mw?TIj8 zLfA9aKY^~37g^>p6bU9hEu`5_1xl0o3_^9~Xk69`H#>#m&x`;S>oPvavPY6;KAWuWa!RcEts3%{kGk!f zw~#l(NW|Isv%7HS+(qo$cMN3&?ZJ@zbZWot0y})wsHmf?oOWjFAyC*uH&>SxqaKHJXQ~{jlGB<0PJW`W2Jk>V{hOG_;FM8fAVL8mr1t z8w{dC3p7Y~ZIPy-+cNE@p@ka3GBYCKCJ5B3Tm$sn9{9X&@~bs>PqNFh>=C$;J{tCx zjL~8i(Nh$)I+Rvt(Fh7&Th89eUId5=My_8CSHmws_yq@j3ToJ;2D>OU`6m#l_N||Z z!$)SwRwop&x^FB~JXf&(|F^-4y7-(I64+L-zW9!yRvhb`|C>K!wc>4)6BEUHSMO*T zQ*&_yY$S+GPAP$MS-z*qRI<+L|fgfbI)d2<#Rp_<|T6p2O616h%iK z3shKg*n92G+YHD!diV_X?!E!-ti>{m1|5KVW%dE57y*|B6@l zA3$?!BW@rq|MlB{M@8hum%jA7Nad!{(=&i_Dn$*2D_`k!7V%gT+A~>0NCJH_*%}4J z@@bo?L@bUsUO!4@?85E$>_R%@$5;RUHFWnx;0=;4{6ofr)@mEJu4~1*_3IF-slf3w zCyX`Z_V>LXEuHJ}>MO6nX_Qg*?$ zR-C!ei=Mu5zT%_U0CfaS|-2`bj(*(YBlcy#0Dn{Ppe z^co)>#3$~%4O^BGnBBG)*Y4hmu8Ra4FCH{|xqkKU{u-~ow2zA2iMBP3INx=J%;7-T zoy6~b<{rHNjxC5xMhSSsxZHICzy0f9#FMWb#-DusYw#^|;J(l7!1~?Gk+o-$B-qou zSD7>At4=$T9DL#h%=JxS^V*GAw!96Fa`IHbhI{Y02X4|Zl_t;gC;oHGp&xlzyNN{8 zQMP5)ldNn^(wdu_WtvWSZ9XLCV(2|}1rz7{ktZ*Zghmd?#;uN@c-^#l@js8^OLc72 zNm9_Y<;0!w$?uAbP<;u>jI}ER?eQTk_fj17~)Ul(`ZYSl{^$5uK9f6i) zfjR->C4D}TiC?^;%Be2t|e(jU%S7%mMKJu4Oi_v(LFHvom=Jt6_ zJhM1M7QRKG=j1)f0Co7@9@br?waP9)t$T*{`Xjvs_(W(8`D(~pp#-?EhO6P-9)7_< zpCts@L>G?=rE}|xHukJa#Ho=`AH-L!guYV=0PntzNZ3zLaz#kVYl zJdrSA+>+pyFi{js#4sHSAPH5T_Mj*<8xY0WsIrUmGEi_eS$XqMFgN#0W#W4yT7@&$3SC9>k9)pL!iX`u>ZUo0`FfHOuh3U-~Sfg%~b$^~2|=$0r{CRXp;O zM=>yvOqEYr_)=-ojtW@Mlsj#!S6&^&j_W${r+@K32n4gZ z{<1DI^!7m>HjCXCZ=x$b#WpIUyE^ zRtLbEUrI2}y7KzmShac;n%mnkK0Sq*NDOoH1UQ~Dg3AmQs6c>+X%OT(sGMB|Y+4<{ zt$UYX&6*}8W~XuI&9|YgxecA`)?#>K4uAL0Kf$rnm+_S^e;%g}AI8xGhmeRS(b~Ke z|MHFRA-a%ce*K8V?O3~I4W?pq2>L2;{~b4CxcexkCdTlw4}Jn`msR8P!vNx)(^J{sj##H_|7t7vG|UUZ-J3uIhl@UBp6W4jXoD!hDML%yytQX(ND?lW~V#E?9~f zx;%o*r%od}H9^275LdK#mESe;!0;dWmB2~7Z|#L_xYh7{sS_zMB1V?nQaiC^hZZ^+ z1W90>K|G#;CqzKJx&^f@wd8RJd1c=C`YVv%>}h_FGQ-Y%40R147o*JK>uLj!HHv0>c?V<8j&%caTbGbeHWe7BJe4$2?pacp>$*=O4|Ak1Sd+m+?bh|P~75SYPd zKl32+=>o1?xrDXrmY}||k!A3*6Xd{i&%S{J2adqbI?>$LOkQ9*Pg&zbQ*AXnmjMDp zHv*JBZa+aEk7e?`C!pt(=YaraAAg>JHI(btu&#r$Ks&cMP2RP5L)K7BK2e5}PNqye z>Sw^6kpULC*10vbD;X{L`%WDwjjQ2m_+<&dV4#nJ&HPHCbY41IU`j%hO@8rA3XKh1 z!eB9;j#7S-zY>Z9DiYHs4h297oRlm}`e){REdFH0)4M!1LcK1k*yJR-yLx#)k5$XoATpbPcABWITT8$+h>_7jGo)j;S;A6VmuW9q0|E(3lgYFJ zFQJfjm=LfM@GMXWmr?2D5Rk|H>P{4#GZ+}YgxT>p1#lGweh1)6o@M`WH6*!B| z_gQ*r-l8?RUI0nu7T7Srn13p#%5NOW@>2e^G=yW^*pT+B1Dz`$=}g85ea-1n9f|4| zttGrgGX>Ki9;xpx}VQ)Ve=s6rdd=MY}@cnrG%{SoiHQ@Z&QFsW*=2H{+8-^E9P);LGu$LyFH@3V)0n?)q zvp@$K8>U94kY%S#ZBRRtXz>Iw58H7Pb=6hazI~fn2%?1)8WJ5JpTN;0=gp$8=)x51 ze}H+)qpqQr?M8kmUF@g;vvVi0d2==X@IU@LTsnUV$4|V4RclwErnZTaD#Ytcc>3v= z*iq$o8Y>9mB&QOT6CTuPD7U%-ey^M)JIPOBJ}0Qt!VLmEzt@X0fj`bVzy7?&kXGv87va2To&LnpiY2qu|jk#{oWaQu%2BFSHmwu zcoz)smVz3t8od<1eiEowkZcv8lYq4ZZK?4yz7(@{!+<#x>z!BM4kf{$_e;;E)OA~F z3xp^bVPceh36z+-dSI@tbO<#lu*~oe|ICo4R^*u{<_^!4qUQMtNVqUIJ;D!pFg=$f zfU;3xX7MYZ{uq1RcKrB}M=&#AG{9}=j_v5ad=XnWZARDW(^$7*0~(svp{Ms{q|+d% z3bV*mUIZt~r-WrP5vL+|Gd}`ARGI{X0$av1!QA9iDKpW(th^3O+cqPTJ&D1wQA`dO z&{{7mPdy^>Fo<&cvkm~dj%uh7cD6ymesS@w*;iM@Sp?$t)CVaR8&;*o51wUG^WOe5TB2*cy4&g zDiKR%;UH~``7FZ0YD|t~@ef~p3@<$QDu@g5?|<*tv2{l$9(nW$REFDe;LZJb;e{7) zhIFkY`1WeASesTM%Mzr`4&+aefG?-=NeS5ukk&2)np@R(VGiR%!*KdD_}A||fuBBp z811cf`1Gf4#?hm%!bNZt&$9Miq?IFzU;Fe2@aT^o!Te+j6T=Jm-nV~3ph)l@te~t zdH9{R>pG23wb^J9r_Xoe!4G~2@k|^~KKlgT`~LS~edk78IDeV-Q^q3ZQB@PbuYKwv z1d+jQyLV%5coZj&p1|M!{kL)dz3(-{ZK-^UU?WGqtH;>z2;5FD`lsVaF2wMG_r4c1 zljGR5aVuJuwWE3IGQ6<=5M~ktGm|5z_GYkgZ39-VYQqnI@Du!}FaHOeJaG!&eeM8; z(nDBx*9zS5;Vmd%N`5V*5t)c%lHmFL;j_4O<}!va4o0NQF=%)7SoAo8_kn9av5mo_Z9ya7ho>FPP& zh4D*+C`6M4Lu?)7M|BQlsTW@hz=;{urWFJ@%%Tm`_E`mnR|yOaPpfT61`(X{eY2-7 z+hdA66Hk#|q+?xkEtakBK(ML;u~-`O^HF2H&GF|gcrZT@N8dT^yc0t?`NB=~Io3Z4 zd(P@yhAYd^xp^&O3-bi188kN3W99PY#=0fBBKJ%#cDAncUNIJFO9rY<6cCTiV`_33 zGc)}tub-s6xg8I_?*Y8_>~XgB%jCaioH^Tv3m4)zbnGO~oI8hx##;E<3CQLsY}o0m ztR#@HuR%B@AEEN6M{sAhOY<2kyU(LNbggUSbI(}y1nj(&0Uov^Yj{>Gb@g+zb7U-| z{3qFEtoUqarlUuK>L;3)g5*pI43LU<*0ltQ(vq-I`sOi%go%W|2_~L$pgr(KKZ`NnO>{`SvIAm@5o9a&|pKTJdAWPj!10AY*&;{Q82nI(093)Lil=| zIDL!?K_JS8b!*nJw?1tIcuUg~jQ0+pouFXF%5^w%>L7dnQa1c{j)I-as!+@@eLu^t zVJiw*3f)XLZ7g%jsJRbPSC%hsZM;DFhIVx)f-%a*Oe(v|fXrGg(B z9x_(7d|u#8L#g~8Ww1c4p@pHF=wi*Y(R?LMwwEyHP3FyEhPcdkd0%ge*48HIJXb}r zoSI{4u1$J*DlQFBt1d~eP#D$K)w~akj*MZ5`I?!XLYn!N6-=%~oS{17NH|46pd__p z!|>=RKNrWZedfLR&wuz?x+8;6ga!%er`g5E0^2*RDnFz;CcT$NJ}g#}cXE^EcMoja*ugLwM6*DyXA zhuu|%eFu)>uJ=4dUd!S5$;){5g*RFML4qFwYzKkft$Q%meF?{2IgH436ff*Mh|`yP zQBg_YAB&@*rPa&<92uCzeRtfBrb;_vQgF2~GhznNFKdD|ZJ5G)FKcCJ}L;5LeQ zB#x<}IRe%@@!^Lb!lw0|_}+KEkLlSFeDw40#btXJ?*900v}_K(=G&@`q8#t87I;bopHtE%8;-Dsca4BKhO!}e3mp|znEH*dVg?47G2 z#aeb~hGs`GA0QvtrZHz*Ags+8XWzM43WI05artx)Qu73btaJz2RlA}T1oB8&R+*6< zhCNM?{17{u2Zrwz4Bs1YsK&*XZrZ@&k@vODS(;!kK;Bx}xeAr_)db-QL=&}xpBEdT8iG*@NP*CSU^wbCD~m%FIoE( z{?}($!`1N17JdOhpWu{!|GNe%kfomls|EJhq~CtSTpO9IhHl*{1vPwQvD2Rff+d@c z5H^0r6qTR1o?C*V1RfQv$9$$6yf8UsJb^a7FXzk(8miU*nn10dt6Y8PXLy4B9^cd{1p+Io5P1bdJkTCU{wIG*`BOA@2p?x`O8-lple}d>X2%j^+qZT(%(7V0TU_4j8HUH31$`X{aSP|H2 zWn+;5v6ywBtfCRiR@9=a_Z1|jfw}PlmM&d_*5wU2d+8JbQ5GJ1i0O+YqJwB6YluZ7 z0U-+*YrbQ_fNhms^9facJx}vo)hP&UT%-_8i6#PlW=@|8%BftESiO7=7gbl+n0!x8 zPGN9h0CO``;G~gp1f5|WFbkp2C0o>+i6rJ~TG?QB&(@-PtfTmBM@9dncAP zR^is$uEp`Qhp=JWHQ2OcD<)ziXlQF^x;9)qcN!mh@GkWCUBT%1D7Nq2gHspI`*;828+D4Tgt%F-5SJa|N+w#~#$wH=6yNj~_jb zLfVfrN6+Khz1!Fs=t41-f|sQ6d3Ht!nEXz(ESCke)wnj156x(70rB(#>}>Cuu?#LBzJ#HR10aeuK+P;vA}jmL z%S>l!VRR0*oP&T=!_7IwBJ*a)7@MPjrsf8$Sk}SLWDY5I1hg*$uzJlB z{@5Yd-f0%(Y~Q*G;j%EUTpGbBfwhmc3zd5@!1EVhd;=|P_x0qjfcS*;_4+&nj3Lxi zRr1_LK63LNKLWuDo?Cn32DK{JNAM@h9y>=`wQB)Bmzm-rS3<_x$GmCLndGIwot!Ld zp0w!zN)8wx$j+98J7t50tBngR26JCDrfe6$lbo=?A>ZRO$r3%k8m@+4w(tu8`qVK0 zPa0<_o)NYG%XO)NTLMA%4X6{aVlYPu0Upc{3*(l463hZCn$xFv0w-1|rD*|7ffXZ2 zD3}EJ^vI-cguTFubx#6bLQEgi$~d!lL}^P|y!~w{1@oFoQ=Z}lDuaFx6+nc*k3D?? z2}&;v4NhUj@(!%&tjE!}ju0UEu%crrjvU$t7lFj`B}*|rI*HoyX4JJTL<8bfyzn;uJoT{`VoLi ze)-xq)YVnt{Mqx=Zf*)?k8w&X8k#vbEL6z~W`?|YU+!EMsb^?s=w~b=JlBE@327ly z(nmuz8V1th16eQxzV+N}!cM@a=aEQ+U~drP<6}H0*wdm4#uu!YMNn>AG6c9De~7@x z$Ba3N`>43{NtRy@Xx(^i-vOMxcm^w1*WvS@e?NBZ-iD`MJivDe5Yu)n%%}0()2|~s zLy(xsqaqY$IkgbQDv1=kRxhi7qN9e=%PYb#+n(`$DCC37W5XA}^gDR+nIB`%?sd3k z&wBj+fBHN|MyGJ}OfT|Oen(E9M>6HXORto8Azc;?g@?A_amZ9AG-Khy9BJ=p)onuG@PJj-5S)q1iD!b?9ZRx_K=&+`SQJ=gwg^9|fzCZ8K*qm!n<7IR4@h zO?V1%2}FV+3gNOyIQ!kXsf&ip+}p>f8z*h8fpmU zB*WO*VHv{&ot2dpC<|)X)qQD@fx(iHFv9-r=ZbDA zdZP$5E7*f? zZr((Ne-ZIa40bAGIa}5I9cG-pfA##Sv{Y78J}N8;Ti%l~%WOABEs{+TfKrGzG;AQY z8^!QsFD8d#a1#t}A}}b}5;)&=p7G1gyV}A`gRiFWqCdYUTIC3UY`m7*6yTNMH^a>O zF3V~FFO?<_X08t}SRDmq_@2k@q>>34tAZ3lEV6*%pF@KBDCoPNuvS*XH~KmJdDh^5V|@Mr(|A8_=*CDc@Uaox4+ z@U8Fs0}`p20c|s}L5xiG5qMS_nkm1=`@gX!sDq$|LOFt)1wL2(c?i1aF*-7X7oLBO zK)Q%)_TGTH+GhOlu{ZJL%O~KX(#;dRr;0(G?jAuO!R5&_gShF|9q=DA zBNzx{^~x69aLsz-_ifFlU08_a&^sK#=u`?0e>H5Rx6555n9icL%8mPOx&}M9t;593 z1fG8B2!}eFTPK*#NX~?eo;$^lSxpArB{VdCwL?%rj7M~|5 z@Ur})s3@;xCt(R zfLiF0k&7ZniqBk#%_Iq~x-oH~AB9AMylCK>Sp{qXyVCRo>!|L8f~-g8xthBeR{XBO zIv2024Xd4t*CjEs{B9zhK$a<#*H)l$bt6L66{b@n|9Nr+lblP!o+-e=PM&whfqhTD z4rfBvf6GC*Ytd17k)4_VI})CNAIbTcynY)CquPnAl3D@paB2>325VVgwN*8&hq#%4 zYQz(NvZ{r{Wu`Nxj)^*hS}egVqw7)+&Ym7***$pdi6=2mzN)OMAmFs*mw;MbRXIXs zWsna&EyR%f75UsVV9y^Qp!BlSD(jw{F8g_HfjqPLiE_`y{ArPfe(E49KavO5)@T+r zMPtq3ll;{?%AYc5$w|p`wmWlf{Yv$uU|IKM^^+_YJ1Irglfq(MT@6>mFF|;hfWDs* zvJ$Dhv>LU6T8ob*oGqZIM;74IPm%dQg@>6hre{1#G#i0Jsjpa)?N*u!I$GbVRC97TCHs?o}^tSIgi_}+l`g&_3$}z*#G)#SlzLL zd2?Z4cmzZJ0~oq8h|U$QxaH1OERmD68e_c=o1r_cs!b;65Q|S)Ly4q`R&wfDb4v?) zdM@+WNE+0kvOS2#oy#!mPoR8h1#*QrL8JC&7IUb*Qqsm%&lm`#IuPS8-Y#v8t6c?3u;ezU-zTtexNX+L6Yiw#W@ zr70kZq=udo@KprSx?(9B+8d4KEk!!}hAVo0-`tiaGMW$&i_Rz&;)M(VoZ370XdmQDt17XhpdsU65dr z6gJjTS>E%c2@0~Z`ElWVKmPSwKfrW!7X2dw@DN-IU}o|u_}mUuhRV$LX|lANg&LGM zn!D%I;ta3m?uGfSAdlKI&2QR-akA_Y*kijOc+-%svGB26)`)-w`b0akP=j?~S^AXQ zp8_^!!J*Gmo4OwWyKQEYT#C* zmN2HUwr&_fVnCIogD#Dbuq;ib$<{j8t42sLJpm$J=(Ys9l#h90;wv31Z3!d^72VSv zrDOcY>5ocZ&jdhZ4U~mJX-U3HfymEW$>OIZm}6s!uzp%0syTpODnmQLmIslkaem*4 z`FH^t?Yo;SLQYdZ^|6QWgCBh#d#=5SwQEB|bq%6a0@XE@SeP4y59O$6tVd&070z8c z!O{h(yqGr%Ncj`gYCbu|6&O{%wJE-6Kx{>H@y~{hu;T56VO3 z_|CWf8Dm2eShjR290V)Ts5Y<k-4&HPB-BiwYoI2Bo;r=Q7)^B|Vue|Y!nco#l*)TDc z!f^tfiAa`;yo!02|2@*1ylD-^2aI)a>9W2*al{>2vpbCH&-%0KQ!N`VyK(0G+S4!Lp1rqV+p3MY=Z-sZ^vDq;V@dS&_M)-2 z8LQft!(DVB93YUatU~`#KUQ9|3CUE7Z7b0RyB37Y~xccA7;-5(ec2do`qOS(z4KFfEUO9XmdOavlZv0*r6DT@gRXs;AYs z7T^=elO@k>S^F5zfI78Z(%1k$9!v67^`TSAPwSZl@+7x)Ey}AL3c5C+ob{o5B{{Eq z7T_~i=K7uRv*%aC)$r~P@3P@t2>=bjl+H`iS?7yEm-^{c|Cuu@7(t?=E_h-Tjdf*3 zV=_h%@s^4AzX%j#A>#uRmDf2l9JDBac-JiIFy9c^vl7v{iJ%|j8mkuXsy8YiC~KI8 zjWh&Z$V;&Cxm-C^S72g#nhM;8NGuDtFMxr|z1X~AGuoT$F+Dwm>dFeEbk3YPOQqq! z+STjO-P48E#wL_kErBnPK=056rX5BxCxPljKC4x;8GeIciTQC-ImnT*9MlS|$wJ_? zYlUx$`C;BtIaF3H!}6s~IM@9e6<7=lGahVSw+;36ew^$&PT=FC()XCM88Ac8p_R!h zr%|x_4ndw-tw({bG8({4(4#q&8Um`Rtw&9Dwb^p)+}U#&8W_aPoN%V z=^eRB5tuVz-l8ZgMM|7?L`7~Bu+z|^{JN?BsK}&DlsBi>1)GcCW`4D*aC$C>#~(j~ z@BYh^$i?G$=%E|%>0iGO-}}iojFa9or_ZrGQ9Sy{qtNab+D%0ZcBUsI7`j-HKmY*$ z^hrcPR2iJ&alw?!O(mz{ws1ud*W7wD?7k4jX9)xYRVcbc1O`O50;l8_@tXWFX0)(I z^O30G9ljir$l&n7Gx+lF{1*1V@Dv7zM$yr+386A4LDm$i!VQQ=bJ($S2V&_MUfX|& zz^@GblL@#|llcAL{5YmYE}|-AN8c6Zn{{1q+mR?{kbw`9l;xcvyW}<*lv6n#ya@ z*}4{WfjT&fUTj#m5pNuL1vZb@?47%J=U#$k#$`t-LmF1EYC+D&dM8=Uq9Fn3Y!T7P zIh;Fm5|h0nD5S;T>R|D60wCf~U68HBw_+c)ceQJC&1YsyLtd-XW;$%*HNGo;GqOZ+ z$OjrS)k^euHiq)X5SFa!KpGMyTU7+K#0R+WmM=bP58L%?4~ zkQXz%uxLt0bbf(6lVIIB3I5&e_}H+2-)X%1>LG%3FRJVOrY=N#KWSWD5kggY1+-P9 zK)!tW$=9B>3Rl+zc^b|o4``8wWQHtzvhwLCz*lm?qI1a|iB+rp37EYD`q(si&#DW_ zBMTT>U{0V;&n@}O6LHGo(X#%Po=LVTt`$!sDv}gdP<-p1tKn++WeD#wOW)51HDt@m zXQ_Px19RjZfdnH&ETLe5HwkKi2TRZxk-+;U;bVljNt5p^-dB7xCvQ zz8T);JF=2!x|8O$X{GN7!FA7A7an?GEB@?{KaaN7rTB~g_RsKpS0EX+>Rmp9-&_g;fD=T4d3TRJ+H zvrfmbXZKdpt_*J-eG^-@F2jR&--z?)x)Cg|!KO_caPJ+vaQB_NuxV{8ZrRg`HOrcq z?nxvFI5hW;&>lDK*@Dmh%KI=deFD?b2wVgVu~-H@mxl;4=P{v01)d;WZYf#SX~6&q zbs9u=0Y24(hW+hnc4Wv$>2L-e_jF>z`}e?8A23$zvB6=SJ&_Ce*jq@^O(g%px{N2p_YCa?_&)3?99V+1@b} z$&;S22NiV$eJrnoofKI{=jY}Ks=Q{=hF1AH`~-Rd0w=GAVqIoc^ZZ<#09igR3G~P} z;(oI;3~A^ga^ARp11c*j2=bC_Lur#{mL0e-!CkTF!^u+vc=G92Ff=}d+NKJEH?|43 z6&Hb5WqBCYRTT&YLacA?)?v9<@%gnt!#WyYdmcBhwVMVzd;GS3Zt{mfo~(SF!taKDqAFKezwdAwj*LkU~-U*U* z`u*&^tKn*R_lI{W=qokkcN#RCJpa_lt-B=wAmLF0YNeo|83_sn1KjvrLvDIS?-?K= zX{r<#}aj0Mw+CER=a-5BWar{GVbso7(~&ma~_!Cnkw!{)V^ogc)&z?iWH6f{SRC|FbA%`q=f zNue)=Od3e3YwM+OxZKPSN~BU49U8{i&xoIHLQ9qsMdu%?qr(}vgHJdA@E zCvogz0{dRRgcqMZgU6ri!okziICAI^RxDeChaY+`p8v^r@ZQ^Y;*Y=l+lbFh;K$$j zE`IZ4U%J-W*yDK>j{x)MFNQ=L8unjz^qo*d`8t%f_$AW z&!GOACT#rBUW8XRkypqAi9GsG^x(*I$1r@Z4+{e`$j-(H%wkB)5>yV1U}|`Rb?Rcd zst7s>fC?$3*%Tap53;0Lj-YYF`mOL+)!_D<@5Fd4hN`wY^k+sf?_EI59%E%Xkx!>F zab*l$M@}O;I;YtNVZ7ne8sK zqIT29HD-8rYHA97gMIJ@-DqrS#N>1uk3aPqI}TS+RvAKh75U7@4iVc=&>KW$mEWw& z^^;#UOsmBha)9lp3<_!`u33faHLL5jI@hx1IVn@@7U0uD4RhZbQr2@L-*|5QL`%t7 z-LvNDS=Sc*EnsM!t8waDLGoAEimT_P`|rfjb1Nv$JJ+RnrC=&}F}(B6)o?Yu+rqmL z^pzTKsew}<{7fU(Ib}M9Bn2Y>jQBR!5;~UP(Jc$u5iq=c&-CHVwE+@FAPE5Kk-!Aw z@ww7gFwYjR6_;m=&-mV=U@~Bb0#A7n=o8q~io=p1(^2`5ZOTC*shuA5J*oloF0l;- zZ_xPRk`vP@3j9pogIFSKwwS78k3KRJfye1VRZS)4X2+4w6wqAPf@C5?Mc_t7T|F9_ zYH{-78}JdNXu`O%D*&V+B8{3FNa`Z^5xodDJyiMuxlYN-iF498QY~g}1Rj2@T(%DV z6NfP|Ife1jc{J8kW5dQ3ICb$9VpPWRM<-xeDCU@Ffio={kY!VI{Vb&_%YZ=bh}C3u z7Zp}A9cNr8GT8zZlw8Vaj$a0HA0d#LXTBc&>C1Ta&=J_2Nj&htZhY_qx8wBbGnkt$ zATj}L+Oh}FJ-;96bRI4TzwJn3#o89Mu4+gBxE+`J=a4E0>{V)O6uA9v(p5eiSpu7z zV3SBm^SH7_gghCvR%UVQj&=CJJ-4F1!GmMR&+yyK8|$rT_hM!|f-LFsv5!5BKmE#I zWBZ03xc8R(@bnWuMX1~ZyUUJ->J}V5a2)-;BN&b(P^6+xW#S}D5+1(|u8Dnck^BRGBhB#s@vg5UjjpTqG}hs|(*f%QE%7QxCTEiC^y zV$lVZ1%hxfZvsVH6yRm~wCKnYD57k05St&m0rlHE3_m$okJ{es{KZQ+_Qok>dJ<+a zg*}l&h5#o=0F;+QY4W2S4a>Q(b~UMNt}`oMWgV2yzPP7|`Cx%SZw7ht;Y==$iTn(@ zW4%bYnFj0K#*W3@;0!LFxPZ|sL$GDofg;a{Ps|hywntgUOk3m6a1wdPv{Rm1U_*Sw z=d9M!oL&XJuQsXnsBh(RX~Rny9;+K_(Yay08OohYCa}P^nAA{eECD}J>*VPX9DV*R z%nVGE9SDY4J~j zw*73HoriqR_^q^&zqESX>@tSRX}QeJz1>6JFnU6wf|)kma?Zx}F^s zcI21!4_<1s0MqYU=`g);(GICG$$>3Kod7I@VUa5~$O=rD0wj6_l2d38u~z->RdM z94*OJrTf1R)_YgO)$nc%??TX5YS^V!*BjET~aw=>Dmh!QfO&twDVJO8_-t-Lv z1a(b7qFIJ|*SG>v9tmtTgrecYoGr>UoCJ1rRAvd3QxUFS(S+H_5ga~z1iN-zOORGX zeSHHa=BCiTq@AE_1QkIF^_ryw6=4F!^Kc0uIh9v06<3};cP*@NQlAuzCBs93F2Sqq z%e(}BW|b-xi+b+ycoN}?1~fG^;>y5DWKtQ7^hL35{WdB<56+)E$9#L?u=`Efgec{= z(3F^$qMD%`70$%i7^WvD&9H7JlUy7s)BGrc1%6WsTfod3vLnT%r1__RN=(*DB_=AF zVRXeY!d?o8aY;vy$4}4|ApJ>eGqGPo=h{10^MzPu0+WE>kGZ)80;Do3Sr3)#EWZ0c z{|D~8aW7tY>Ij~B_AMk5d0c%+IIw>|P9D98O{+E$xOEYT&J(aF z&D<(kCHuxF%mR@6ZodIv{mS2&`E|=%YtY8}tO)qcLW*yH_xtD|h`a7u<@qTPR~Y`v zkoHc$2btt7I%*5}>?iLc$eKb`RRBA-??&&XKI8zwKt8`05~#1NBEU-E%>z&2%fJ6Q zJoVF`!ppK`Q*qX9JC-eJKwnQkq69mksxa(10@*AO^APy#ZAIt%x1nwOO5_6CCpQOo zPHQrpX5qrIXAdINJA>@p9Qn(E>e@!^z5XV+2_P%#DiNymVti^)wTPKi1kEej&B6dX z^RA9V&R#%*c}v<8NV{T~&5a}Bm^Z7;!FH00L~-TR1q`0+CE$u19@cz4S>{a}H|>>C z$v*;Z>I52qK-!991pMSi$m+Pg)3z9vvO_Z#a!Pk_CNYEyjl6cWP8#OEy0m2-QwCn*xE);3#-KUn*S$DurK66 zFcgH>O`y(BUSckVB8!@fXN@E0)hpMq9mbJLr`dsF$42ur*)hx{bMSiYSl`)!shJ5h zHnm`QB!b78hoRv))Yey;J(%TM$3a+K&TrJ$)Ec0u)wN!MJo1*8Kkb+6mSvAev+9;$ zPr%Qs6}glH@=K|y66P7(sw{kNb1loCrifUUJhfxVPQ9asE3jt)ILSMUt`^X9T6Lwm zE6G!H{j*@tx?ci!Mn*$my?-@a4eze-E}ql(PEa$KQf1SB zTWC`hm_I!=E87-@iFv}KfQ=F6ieUta00W=$mUS+`VF?%sBLh72Cjqngp5m3RtvQ5N z+PW|0BB`X9M$l2|7?&m*Tht>f37wi?y~~^Wr*r;E8OY!zC(E+9X-4<-)C?YY;61qE zhU?jTe-@QBHRwLqO|a(2(&Zhn6KqV(O%kZYu%vYvrUs*EZEHa&+=7K@HzM%~<|SY( zA9gC#oaQxAQ2Qvjlc^+?K!706WvqIkaF~ik6W|3xv+%fUj2no$x(+nA024D^n3!BZ zl)&fqo3CfQG)|m4P9+j#A*?bB$Vwi|!lF4n#)8M6hKQ!8r_5pkQ)fR@2LgI3yMly! z>1Uqnb;cE;480aXx_*Xuj9?A7^FD!XSy?&3N{Y(SFN{DAVLFT~a4Eni}zvJ~#U_ZoDrYQyHu zJFsf?a`X)L!cL`VlSPc#6kn<@;3}lBcjrp1ZLY+wRm-uawH~bv)!2H?Ry_O4o49ak z02|k>!2S1JkETiw&Kx@mEpo6sg1C60535_6@WBt?hZQSBs0qa}Id~q?DJ^=rjDf*% zT)EVZ4eL4)BVZh#j-bHrs|s?-DSYO`_v6~NOL5@2=dpUpa%@?@6_5V-CpdECE#%T! z+;-b-1pTx4^V@-f)Ro}Z=MR7?M0yBO79Q`j&>tA9OZXcgWC&ta~ji_s^F{`3w`7#ww{;)aRNETwqIpvave2}nX;KBedpSp<1*c9C4 zXIXeP^-hw&bl%7_+VMubXHp?w2@D%HVP{Z`X<3vR^q!^(n6{@cs{NB;crBlH^RWeX zgd7BWYtXuE3DdSCLXfAG+wr*w?C~_5@-UrITX7;fwt&%#L-3LZO-0D+E$(9)%qS|V zD$GI+4HKLExe5q|gNDyFjGLHGARp(e$s$q<86*kn644a%WW%mqdoac_tDOk+%Wqy8 z0k`JBuHUeUMf2h5XAa=(*&c+eD-f*olMbY2K8>K?jmEkfRFsD->!aOeR?T|}w0&&* z0)K9{2LU>3NS6RmmOgeA&73{*wszK#zddW=20Mua__6?+Hp=#8S?^d*h7zDtQ2Q;l z^Nm(F#x;w-+VrmX+Xx$Y?q1uM>Cq{Zh}u+qL7u7+R6@Jj*u)Zk?)phz(1 z3KBlneFX_}3&bguR*PBSL4u@oZuJ-?On+9G=-y&fBTq^~NV|JT3Q3vhvl2qqH>}8d zPXbIy8C6pHo`h9N8S!U*%K|-?>jiy87B0QR{P3d^?8)dXwDnQX;0(U?{TC6-x+&(1 zXm4MNNrJ)VB~8pz8vQ*3=sw?zC2bvi&xP5EIW%`PptYp~-GfJvi2JD|*&}zQAs1m9 z7S$X-S@n|16kHVGny@`NIcbhs37ccYOnx3IDmR}ujGF3Bgv&j+GH@Cr1G5OC6+5q4 zi7R~8Tqj^=LFZDc?x+ci0zLiT2 z@oK_t{r8i3vN(C>Bo%TsY2`*HF@rr@H{!ta&*G+QZ@|f8XYs@{ zuVDZF!`QrW6RzF87n9LB3`~w8lS^UOmUS4ocoAN926pb+i&ID5M8M<0z~wHC4)tMp zVhkyp8(o9*@P;b!+n@O)UVi>4{`=p269at%c=$sP;N^XuY z#t3RNtY^6g685YUUxEyMH#?+T7c4eY%Fo+O4v{BPCTe*a+8$g z^CGI3R%7MbRc1Gng?Jn@^9zX0Eg-AsS$>zG%*B$+LTGmf%+UBm|Ckvbbp_nyQ4JMa z9U!~gPLSn?eDRsB37IFqCx}#n;BG#HOq|`11i#N?Hkw5$mO?gVBiQm0)WR=xq2LU8%z@hKa#UA_*nata)5iVQ zKDog%WAT^&Pk}lwfu2?cYg;w>)05TF#XRd=?NJM|)IJ3Q-2}C|ZvZoctlOsA#0zY{ z+D}*QQ|D^;`dJn~om=;;_XHFrXDxYK3MF7?0m%}Wv(hnV=BSz_pBS(wMzPwn^}8Cb zhF`AmO9A>8#k)khY4`?Mm^+q0u+Ai4EMP^svIx#3WGsu4u1kVMK|)KH0$$cok!9^O zRz3akXnBukWF{pmo&ki507BnVF3cQ09<4FL?iQd)y#U8P8Z3HEIz{-dnbzrrd^C zpL!ZEKl2veeDe~9Cl`<;z^!g;M%~H|oaw%Tb0^N>(+@p}HEq>+=E)x-T(y#*?Ghfk z=Q>>KzCa-RakK5*=-eRMRyJT_p@_cTIh;Rs82(TW8#Z>}%H_*uKHa?!+=Vxf9EQW| zM$c$BuK(n%xaL=Hf`3V+)&&{I+*+xs@njciZCX-6TupGJ`D>*4;F)u{e$!5Z;2>76 zT47dpYiQW(^kH4cTC~+P!JQ*7g#+jv?ZMIwOW~;SAVWS-doh-ADRI{C{A2|E=dWP! zVh;-Oq?wOuTzBwKKu;}C9H4&&M3A42D^&Wi<;_B@hUP|iJPv|52NLO+S`lemj)sZ~$_EecYnax9fL{wV z{E!25FYDJDzLkYfJGEHDxh{4_ znY&ApT7b=J&uX{obSqf(VF5x51X`f3BomE{T?BhNmkhApDOn16!^G3Mk*4O_)TIg5 zcdmx3;g>1=l34nzpk{9!B@8S<@XlQY3)mUZ#Uo{j5ikOF*0m)xEWlTar)%rE1d#BA z?kjn7UvW&z*0lk5Cg{7oW?GhLVrA%Ci&yXX^wUMb42c;Y( zG#)!<=BABLxcEYhvE(4Qh^5W)-xftS6+>Cb$G383C^j*l!J3sTF*14u)fLsKtX+z- zKpH&*=P5Y7C}gw+n*4702+H_z=0BUw^T3`w0g;zKL9n^$DJp6|maN=p=J=Gt>C>+x z9+^S!l|h_3(TAX~3fJDS2X7JhxyN9Jn<1P?SgIq@*{UbKD}b4$@DEqj@~bSCCeUY?78Shwk0lc^ zc>I23vPl91DlA4SqzMd(X0+ONfeQY~*WSRfOMNK%wAW}BU;NdFapuqw_#HI_*Y)_D zzxo=E96yPa(}r8_x*PQk&3JnMF)ZY%B&j&x& zi{j3I{~m;vl_ODj3e@57vnV+0)yPV5mv}+7Q-Gj#3=nr~PRvtoz zoiA{26y3IhQ5~B%mb7 zt81#q-fOqB%{oz8SG;v^LWE`EHn=v>zY_?64YnOB~&UVW-#(ac>epFY5 z**OakbUWF}BEVyN^AUji%gW3Y4q5VLv9ng+%Gt8l$OA3fFqXWub;?5X`)bT*xBUK=^a=a$va0*0ni7%X6?Yb%cRvl@9REwyvw z;%X5zDz2$LrESg?&q~AkT@6>mFJJg20)3^1UTW-?peP9y1qmHJw?M)>M+-QV-YY%R zHH8(GicU*$B#cU*Fp6aHJxiz=U9>376cpb|OW;ku`y}wJN#aab!r6+*_Zep~J$*vy z<>fG0dEmK@xqRBVRmigkpH3~9;j(O&kcMe<*yt!i1bVRN z(9l?g$>9aGw6&qKrUUV0FJhT7gk05_pOxcQx0!d8&LxqfVh;*9rjnSO8l?iUVb%Iw zXl!3;tYYtk93K7d*U@*SpMc6mMODDrGv~2u=N^<1mq4GPH-j}CYsE8lvPgR?4o`TY-3sJ(BvfI|oe~NN zlNPZ!m9dS=n95H>*&eSO8BL~Vy|{hWa5*&`wCdJHP$&n^X@ZMwYnP$goyNJ7hw<2> zPvWh^Cova`A?~(e`NnmqWZFFgeK>IH0s&qn3fUO0>8!$U{pu}PyRsUuzJ44Pemj2U z1%-~311a_#MS`2G*z z`4^u=TgPfNG_S^*)tk||eihbj+KBHwb^x#LKZ7s)$_LQe>c{IZ{TNl@pjpuyBshqS zCJAV5sB7?JWNZSvue}bt_w2$yefwK@>%f}?lnx}Ky%-v^;p~YqY*?dV*8OsP_s9>mfe%aC(r;mm?SXBcN*If_Hi>_hMIi|9MqjlL6?aOFfd=H_DrCglhP$vdQR zk;=IuMEd7k2qQ#5lg0e>0=z{x*0rrfOHGsU#Wy%RjhSK;6Sf%Uy&1%`a)HcJOyn@x zHH7Zt7ce_KZv5?eZBDZlnen+uKCo8W@>^;nY**w6*5G3MUE~d8spp@9+L+p!f-K02 zr{{82w7`x)j_AK}SreA8SqZn-h57jfwvRbPqqDGSYD3zE*~@dd@K!IPQ!)71{EGPm zycJ=y;#PBfT}8eZi4vIQ;3;#%;U~Wb3-H$jQQ1_7Ky{V*b~=$EU}UF&KX=xS41u4v zY12w|`NdnaW(nGsRHM2&fXu=?T3XvNO3!)U0lLnY(nvl-Kg@wx5f z#~^B07i9qgH_9WAKWJI=$oE?O;qm&}F;VA4bM^=V$@?C5(%b}lTAeHUN{-2OlUBHU zn5Haxx~IiZr3D)b^5Lj?eH!Amz}h>*w(7*0;d3n>6IipVg+bFYEV-uX7m#zg4O6NN2r=V*qz6B&K zAyYa^pjg7is1LR?}&el+nB3LD{=RL;dN+{?>A~9pqn~O#X02$ZrLMlFow)%RUJA09eq7kcBuR<{B zFh1XkHV>*oVN4HAqG@?ETAG&Q^1xwu2ndQ<7qZNEmP$n1K!tsNvx9{%5XPpRH=(6t zgHaOyHWcwM-}nohICv7#NFEMZ3>;}QFX-r7$MNBhet_v;K$27g&?Ae6MsxtiW@#oPyJc%VM zm*Q{#=||`uNa1qV3@)5FgT}gAoI8Jp<*LRLKRJrs+t=foEt?7Q@&qZAA{l9w;!kfG}Gky`1 z8Fny=IrRr{Zr>T4d-gbHFO8xg_b{mx9LXeX1TCWDIl5k)~vRpH4+38jAM3!(LMcmPj#txWnoq@ZIJgASBrV%8?dUW8XcX> z;SKwd%p?$DdE%_2R3ZUa+K+|)1)O;1BnHn7kY@-wWgaHe$iHT&GQ^IAhk#9Phl)tV zljfOIZgbe7@|Bk(SXPc)x`5a;%Q>GhAhwufyCaBA&J*xOVg1{tMD~(pPop6^m#i~&rj8`*_Gdw#^<1^5pm?QcyprrxV>LlFZ=@)H zrF&Py)$q$3eu*r7YWNZWmT-9IT7p17^%gCmV9npt**k*85>`6uw`e)yf9i>v6}l8^ zR1qc#rEC<7gcPrh05b1c5Ku4c+_K)OSIS#PL0MJ?qmY;f_4ajLde5Beb*62O{OMzk zBJ(2!p`Y?>FS55D!t~rMg`*1#b5yKp!kz+q`2i1t0Uu_krm>{Gjlc&OBxo4un!?%@ z9ne-+F75A2z|hv*j`7K}h{qNXa96@F3m5Yw<+N_ojc6s*z7rBRNfEP*5>A%VySZ2Vt>ZNR{fxxR#pEsP`^5J*TuVH9Vi z8BOfzp3pg`>gvi>r%uk{zVEl{OgA!c@inr9b=Ij}d+)W^UVEjzzGr_cb*uxrVyJY~ zm%cO$YI0gy$|&J2=cIwL=~$R9U2UKCu6buw=+n;n0WyEIM3@AaB{-kcqP;q-Yre6D zSJPz#&>_dDm6gyMFc0B%GbQa`WCL+vIQqjALRMVFgi4X;|GtMKz`r*--bW`^q-;S zUx$3&gJPkMnWZIMn3}~e{OnJmmN|~8vyWnIWDtj+dm2+S^O&AqSQYeyV5J4)B_(R9 zlEJ`W6pIT>xaR7+@yH_waMkYX2%~ijkN6SW9>Cz8Vf0-c!hC&+9}-MnrjI}3!|4M@ zarBWR$W1Szlv^UCWHA^`A`%E;DL+ea%Gspi>XW!!$YEmJMr+n=^Sq7*mXSj#R7b{_ z$D*HGAd3b663$dFVzPD-g>cc{k>*MTXZIboDOg%HLBH~%Ws}}$G_KwmX~3D?G^_8U z@`wk5LbG+&ys87*t1PH5p_+DCcJz7G^+(#}SR#rod$wVCVvKN3P%V{ET+X7NC(xEz zhWJr**KgX2OVi7E^64WuczPbQiz|Fa z6#evbVr&3W!k@})y;4IW;>BP(jp4yG^Ia1)yZ(F9>Ivusd>T}uWd}9AijFmUU7)9T z#H-P{L9LD5)#kb50MlIk=X@R>6YvDkI#->iO@lZDZ5n{agrJ=p(Q9_r6e}&D`_MJ8 zBN*!3Adctuv-(zhmw)=;z0yu~oN`mgs&gIibvOEBn~b}^XL{xb+5CV&-{1GLt1{?T z4qf9akIQy~GF33N;a&nm#*XELUP#wtUg?@uL_FnnRX*J&+Aaj@epQ;zj>jgQB$Tw1 zKXM~*k(<>Y-E{%7tId$5TguI>xw$ZCS_TdD&_uQYR?3B34$W4>7IpUp!kC*|#^w#1 z(5~l@N~#Y}$OOq_k3EJ2zw)lmF%8*#GE$RC%t+c{Rx~DDYo#|I4tDUBWiW+x%8{L}n;Jkc}h zm+aM!cluHRPdqz`qh}Xv^^2Fk`n4!!8u;SpzJ_G~7|vfR;n963aP0gN=2qIsk zam~O%qn$gQCZRrrP{KnX%OH_RV{v8{n>LK&i(mc%uDkOpT=$w=klN9Qp&bK+w3>PZ zSQ%GFHJQH$A9xJQr-&R5^VaUwvBIQrOOG^!PTF!2LNeb!9Vr*~8z1wbsFV%o#B(>6+%4~wie zqn3*m)K&_p=NMl?Bryn$Vwv^?;tJ!_3DQ57_l~q{5q^j*F|Shgf%5c$<19-hTQ54y zZZh-bWCaf9A@x8E7xs05;O1Qp!I`0CXd-s%24&r2|dTh0SB-2SBXWF}a z2#b79_ndF>>OD?7Xm+dlD&x-Gv9ou6$f#WCoVMKbrYqCkwVvsjA9V8r+NbY3w<}H8 zu3Jf5d0iEeB!yK;CREHwYS5YBPqW(Fsob#QG3^sK`GVa_|RR$QFypQK*Dt zeJEy&*s^H@1ybE0OAG8zPM@>6#;Uazwr|^m%zOdk8wXiI4`6)!TCCe}4F-oc+bR~{ zX>t@opZn9lz#skI|Al=|@5k)y3@QYfmL?KwS19n;0--8)T(i@(1zHZPUGCs(Uw#BH zd*v$_-VTl(IczHoXsusMKMG+@qHJ|G(?cVAm6lNoBngMi^0K9i)AT9nlfy0-d>nujfK=sD9h9*rQsw2U?dOeY-EdITDzNe~P`OSGvElTGE~ z4;mzyFr$!@fKu2jF9;iy$!G-yj!b`sZH&TpB-O^9_uPg*{^UbgEOhYP*;!P*adZMH zWHV(v{n(Ru(LJ~0mYc7KC!9mMS;vv%D>!ocB8Juu;ZHvPX`H-}M?0LR;7?*|YSDnI zZ*UNQ`0-ETnbRw1M}`@M7W(+ipa0O?QOulUNh}cJgLwGiM=(3Hh$`VK9*-L6X{};9 zWjZuX^AsRR>$x6Mj-aDmZV>prIJbNf@A}1ep*%#e%$z{6lS92xg@@@F@DglVtUy9u z<}1u6est7;;n)D)^~Seg&*rUo=*wTXa&+yj zHzQwNVL~&#)enssrw=LRqq;6=FjBML!u&ZxEkStp!Yl$U0*Kx-dq4F~NTaJGXS$kk zl?}ZZc8%v+%1j?%$~#%wGni+B5*catG*CmDyc&Uclu*6#s;vkn<5(%@kz3JxdqtN% z1%4%I5J`)Eu`Ft8l{5Q~S(y#7%mi6B8eWw#!Dz?kxb()urmfa!X2mg)NYD?UuteA+ z{QJvKzYR?@VOrbADh_fyYAzKnKnM}FPb82v~hwgtDE>vsT)RDd*}MnIbc&=Z?jZW0FCC}ux)!>(%LkuD^nH6kYzYYsa z3kb!+h_bTpizX0gM-U&1*mGR`|F&sXDtO?pK8Zj0?cc?Lg9lKltIt&t<;F5Pz6#cE z9>IODdNKaxulziA-M$3}o;it$kufZ0rci1&`MfqB`PzQ`@-O`>JpAj!v*hZVV3h^Gr*sDMbW0fy)b#+y+Y z_F$o&A#e(k8jK^$tuIJ_D8N&Fo<+lLOw0_*nU%j)|%**Sxj0{y(4@~?p-;=@q5Y~+)Y)TugHc~E>Sav%s|49teE>0lS7GU{}#i9&f0uk=j z)GUpj=He6VMYyStpI}eZ6hK#;TqC|aRTaut^CoT0MrO%C83&S6N!}d zt!gxCj91$Po#H>x--p3;1nVZEc=5|`LV7%cgU5~_;OQqvR88or2}^lgE|-zd6FRg? z0@HhB%`k@6j9`T@DGf{8!}Mi3DxI~AnzSMs5h)N=leq*TGnnq$X!xr1gKn8o{(vA{ zBooBsd>-?83hxjFV4L|uA@8BEZ18%=NBHVAv29{KMwmw@o;`*?`;(91hu-mSUaMnj z_6+l1&F?G|EC+&}7Qx3Kjl)C1tkoL$bi$CEsz!ap^3@y)xgrkkJB9*5Qv)W1JvIq6 z6Hnl#COwr$H8lzblqPWsV=ZS^?`vVxeS5Hrz~>()*aSTY=-Es$#b4!KeIZS&Y#PoM z5(MSqsSN(bM}8jVdw!|U7J8VPB3a# zpsZ`~ACV5NQWe#u0xldri}Od%+R|y#D$3|R(z_rHt;(q02feCVzD;rKYS67qMN8LL z-zEOk6+$0JHZe2Zv{|IpXRoFa?)5rq{x-%ot;5=_n{1FmwNylLWtni6C#cpCsl+jV zejewKpGBQzV04V{1;gBIGT#YdxrGdZVL}l--QOtq2|!j$}Lyz-oc#p@B?WXF_!fJVN#K+)d}+4hgqIBt{cG! z{fz{?2zL09!npLOk{BKuBDFZtV(1=B}RxSZgP5Hd0au5k?9=@(7kRTT% zz|lW{fPlsi2{k86!>u&d2wb}^*b>OG%t*`06N0*{=cGyQf}1wwkxkdaKwG~)CcfS$ zwJ-?YlpAhEBtf66J9VFo)Bd@0cbzVj=QLe6mMHp9dtJJ$;dAzvjXro}_nr1V(=$I< z#>2`|bzsl@gGNd8ot1@&4tGdFsLD%PIaXhGtVxkwB_v@>7j)`I+ww#gXle6@$q&{? z>c^vNYI1VTj;>?5zLYgZL$jfd<#Mg*Blw^9O2Z-eP?MAfV91?y6t7okS3{M8SL@c+ znkoGjRJ^3)(H~$Quy`X`z`#--}rshf+K{Q z7(t|sAmxkJA@(vqz;tc2nl@0T(qvwSL(Gc+A&r8G`RZNG7v*nP>tRsNW6esVj_-|T z9)0~jMCiV-xPtZRe%!btg{$^#!|9Xf@zt+9g@66){}zAz7oWiCON;0*ER9ZxX{9nF z?UtYAi@+zL$TCHgAbhD=jpd%4AaP6JF)e?YY|RI;jcApkiyLDk`10|*)%9V3=H>UbbJJ1LQRFhqyBgr4UG#8 z+`8d5j7LY1%Vpq?@m-*MPtAiz9(x3dz97RYtx*`up%OadK`b?MjEl;*eWsvHs6Tt; z6vI7heFoKBXse(wjv5GSnnk9q0iHG0tNVlA5eI|a_sYP4r+Q^g+pYtql?JUS&vjWN zgsXg4Gzg?`AdPj~wK`4QrtB$|b13DPfD-e*8N$+34l}2wP~tTWf(WG|*tl~uflhwW z|7sJbo;g9757_*5O@_foXj0R6l;t#ReJC3QNWT9y#+PuXIR+cGwrTh34Tg&}_?G)$ zhx2?-^Z6Crddsay_Ko4s|Kc+Quow!pI-}Mgu=#CXy`gjxVfD%62UjEzAoO_%om!bE z%=ZR-pQHSMWBK(9?qYmzI;O!>mj_!Lm-!#CCR?Ym^Yi1P!wd?kD3K^NTYW7qDH9cvWk znbYFA4;2|{6J>NRdu6V|=rY=siLSk?m%C8dHL{cWPWztenIA0EgTDXI=E`J~E=9sc z-{!6&Qj>%=EwM6IC1x(Tmn-Yv$DahQY5Q~+g!=F$R^hK$$eBjs`J+d$uu{bFlat70o2EetvohVaZ6hw6 zI)OXyx|f2XgG#B0{d1O=;M?Zm3-&(Zm5rmj0&1M-LrfonlE)8msf}Fy(PF(Q^2|bLUWR6nBBkdAT zq7<^sH0w*)pkVX{B+QC<&Ar#*n)M@?JaYmU2skf&$;>)nzrd-v_i|=;fpx?%vsD% zW=u0h@lJ3hoG)#EfH!P`3lMfLLc9k z5P`KmU&iT2&!RNXkBt=blR(uX>;(IwnAo`i9lzfACKwG&pPC`$5$O3M2P1?qttO+U zbpli|lS81O3Bj3Xd>>kMzGDTxtEC1DjGtf_L7`s2wk?~nogYS{qr>>hR~|yzCR@%S zSEvxyTS)Ug8XAlv5hq+K-ijXMER9{5`Jg_irpY7ZNkbP3s(goeu2H!BR8Z5c0FirX z+FVx%HxNV3wJJQ))X84yti+V&Om0^BjA=_-#@q6R`6S>ocxyXIGdHWCr~Q@Cr#ex` z>QbS6bI_;vZ?%r3pSmV6cO&rK=B_io^h@q^-{t#dbgumFYWe;y(}TXA=^2?`^X~s= zbGcG-XROdxe-gX~61u=+{js_Jedw+F?-4UC{f@vnm!aL;MJ5fJm{9r ziYGNOaRZM({5+~<57uu?qZQ5K(Aj5^E0-t~%j*7x{y`t!`GL3MBme4Gv3<{Lu#~xo z&;Qxq;5Yu&Z{x2&`2fyOUV`R@_C_dFB7`44v_V0vrJb7XGJ%v3B^75!b8s~XZv8lV zu!^7jxew#;vBz=Xxnr20TSOtBL8(|WO^9hi30x5hvREW;>E@@f8XX(Lzx{XrKWyE0 zBbH`YaOUVmJpI@+_}0S@wPOpmZ(oDw4?crXG_Bb)NDhQVKCh+p;@%gy$peS*{I~bw?wjt!#p>=)$Mv_~h~c%n z@$3KoKOr9V;{Mm%iVwZ>wFKG2SeZGE_q~ZQe$6Jl_P)FE$m35~x$?Aq#E%y0jEC2w ziG8zp+1(ZUJff$SBQn4Y}nE{hYRD@`-g!Q^5?&pa3%8%41@5Ex{y(rEC#r z=4Vk3wlGy(!1-DR$Ldqa2bm`PMTnA1XD{N|-sdoV_5weAng|n;GD3GBFLH{z+JoBy#? zLM}7SJj)?g4dB947xDa8pG9ddi%^IV6nC28jwTU~1(6(1+i2sq1|_jvS6PO=5f8$N z5K;q4#P~tcu5^%_Eg?{2`OouRthHGNl9;}@z>f*$8G`nHj*X@9;~#n#KhDZHcX}Ed z*6+rJ$t9e>IHN)D2*kYDFdk<)@3)DqZTdf!KVmTw>Z_-zR>D3v&t6!oXv7iWhk~YL zQP&PZs8+VoxwL(1q7C{9rP54lpoSoj>8>e?)1B`fgeiEvqo4towKn zu&IWUTR-o;JknO+=%7;CJ^`UsNd|NB)0*CyC#I$4Uiax(#_~~)Svfj;xp(&VJU-W2 zL-=GHSZ8~8@855%#9XoOnV$K}nyTSJ%v zpiIGCulcM~J$xZ7Ew5mFWE|;K0__H2fX@jM)K>BLAv2ptUwi-) zYsc}2pZHU3+4EB5=a%sG2R@7c|F8cs{^oDKj7yn$)B^;MxRyBUGdPu|r%s@x_(qrl zN8!|3q7r(hr6i~%;vp7>pZ-v|QgHO8DO4G! zxl7A9e|ipYdhOeA=ENy{@(er01oWr;{KZy;S*Wl(`Zoz|Je*{lG{tOC) zKBa%106>vy9o>B$4SJyPjQ3;zQ_tY7Z+sQgtBjKuGw_G|2yZI{5{9>2HNXf*Bewo( zD3)Ss`>cOoOU+-*7NNGXPV?X;!V!jJ&A8Ux(~0o?-h8%tFFU|rys^6pMMM=`rzBKb6Xs*y6;AO<% z5gWqra6gV6KZ?3<#9$!mBe*eE`CJV%QyIMc#kV56Fpb5f0`novd|a49m_-qJrgaQ1G$gE|4(AeQ-~GVR^~72{P9R5{jrAWe|={L?GJ;%@h7l&;E!y<-9aKC44Jjfl+p;pMce@j66TYI>|E^v2qOe#(yT~h*CfX&I<2-?WDTi%ac4A_DJti+)fRFD2 zi!@?Mz9*gpBN4-?^HbQn?>Urf6>Az!CBs-dI)J_uVU5x85Qu|}b0ic%AFruNHxlzB z8cCX#FA+=fLm_6P+y!|)zI*E1=Ve*cQfY!Zn^f5VPoNe=h~Ve7W7ZV@pw(nHIEEiH zPRplsc1^CbQ**GUoG~pRH%-2*`b+LKdw~HV-RV6s&$zk#aX`qdaenHO+36W_sA|e- z@LZFxS#eK)?L?b%r)OWblj-jNA)}J=k8#&CJ@db>=|SKBw7Ih45oM`TQsts!UQvam z%5b&fl2(ofs{ki=Zl_AlY4~`*Xie_T9~rq-1?j*~?sQ$ogd4$6d$Xs}*RPs;^);*& z2y7JqUXl>is6A=Td;!hkU*@JJ(=g`e7SNwgAsPtd>HYh0&9%ExEM;w!VqYqbTW`M# zfuI*_Hm$+dZ9CDd`tb2T{wV(QM?Z$of9XM-yEKa?uWJrAX+sopKfnGp3Rcflb5f;R zK|GN#*ph%3uQuvs45kO@Hh`_$<9OYhZoos2e+e^7E2vh2jFX3PP+v#&WfW9N@N3fC z3NB7ww0?o=*VOhm@vVoxg_EaF6UOQ&lnWG`C0xCIH^D24zxvC+#98&rDwHuW5X0bL z0@>^$V$me}2m0aDAmtF$Scix=f~TK&0zdU*AI8P=r%=o-@tI8TCi9Kg^^*i{6ZAYx zyB48>SYQHA6K5+Q1RTnTa;ZvT%Hw*CLN|iFPwvN0{`d#6fA2&1>7V^kjBcJlg5VZR zMlql9c%0w|6TWC_Vn|3=80$Us+YgsG@f7i@}s!r#+T!PFFt`+yy|s$nDBUE zZVKCWZN>RZ=MeI{$$Og~&2LvnrMQfh*$cS$o?9`qJcX5T5!b)vc3l6aI}usik7|p6 z)$$_T_7Z))sMQ+S_uv!Aou6kMfOXq8kCgxXsj1oC0eeLV3jA4rSbOiddHAuwkE2ShY@^CO zDd4K>_F(Onji~ZNV==qTvXe(8TZ5;D<=T%?5 zpaw+o1BuU*_D>qJXe?@BF6YW9F^##re`sAX%3}oljS7HkD4gftsTJNP>_(_;`)u7fSl>D>Q)~++Uu22-l%C_gFDD%28Mz<-J`tJbvf(;o;}0toKgDe8LAJh zu3N1)SFf%fyK?Z~Z~qwck9F5GJ@db>=|SH=sp(cK-HOO0l2u|htqLnFRidiAx?i-e zLUhgz9ae9XsI$s%^@~==29IVh0Vx;qoBptJl~8noQ8)8C?@=YHQ&r+kUh{e)=5Hk8 zMWHx{aMVxes}O1keynVlGV>T2AI7PZCn<>9*s^gm`iF*a`qU&|b>HhTyml1Pz6j

0h>Uqp)DXIVS~g%rVb=0#-L*Mmi690C)ZFPqJW63i zK*(e+;Engc0XN@vJ!V!eVshp@mR9nFk+6-fR0ncPKSo-ET1qALE0plBp>H^f=uj9J z&R=9af+$tWShs!+wr$&jFvIfLqmLr9k_EYg_cjQ;EsU?}BODSsS~X~Hz(&!J+>++D z)7)e&)CqV;4xh!&?K^qzJYvBps)eEr$na6fYv6{oKTU!yGt%NEAe2Uf5w|qZ!uGLf zjPRU8yibBKhFaZ=gU=nnzxdgoz%$Q2L(tuY3+JYA^w2RBD)fOueZ%-5c5jHGuy7h% zH*N(P#YWcdKXw97J~xTkCBjTSPng?*pLowZ5a9F9on64nipz(g!4^L9zE|R%Z+a=_ zW*6|>*%P??LodQ@Z@B}>9cfh1K)u4E(UQ>iph18OguqkbB3^Po{4AZ)V8}GOkrB>;Mrd2fsvLG0AX{sUh zHEY&9xOCz?PCt7T`RPTF0;M0NGr=AAy3dYTzFCY_uDkH3{#^2zR;zAU-t`E&)wvDG z5o9pE)$GpC1JoK7TVBu~_hVw~Mr^+R00cq%zIx_Q7%R&;uxiU`)|PmRyw zds!`45D7#veQp|gmW60EjzE}YHpJ(#EUP<$U?!G~nbypvz+u>kDrnJ)&lCTe#NH9j&iz28gSOk77cR^|U2!4V) zY4LQQMxG0-bguq=8ing)q}1eV^^9U805l*|{Up%SUT?8LO!bw6IIGKOr|T~N93(0a z_0eO^zqZ#^+8HRiy`JT^E02|*4zRmrdzFYGb{Q;4_*+0PS6?n@w$!hwVQ}Qyl#EX?3(Nx zAZqkuqg^#^ikEhpFDw>|Az#Q5GBjGZYEwa|KUle3z}8J$aPH_CT(kQ+6C#sS)42Qg zJ5Z}tQK{5%@W>HNFD@XHFYwt4phCjRd{qD_L#c>KY`2znBDBDVzU5|RFfHS8~;`FhLgj!8N9N;su7#NM<-S2rT-t(jH z#k=13E;PI)Joo(Ls4Pm8=qF4Tk?4;g7}Hv*1DKhera#%=x7{Ol5fykC7M51yStB)uO0@pu0eH(zrj ze(J~HguPFE2@$5>{M0fg#y8^jyKctu!-p_AIgjfI2%$(G18Kqr^Wi=3eiIVO5FUB# zApYbNk6<#(a=|cGD)adFzxV;{812K}eNUh^3S9g4I}qDE#JDn_1V~K^(bZ-=b$~a} zVt$nu^LYMiPv95d|1%8JZAe5?@DN(I46Vmg`=7zS=bl5Ibp^>5&D=X0&$jjn=UBg3lg*&Sh_Tev(FvJ-0AZORGNG)0Y@JN{P{$0d=Kn% zMH*8TU;f;C(-rs<{-zNx=G;4H+CAN~3UuxsoilgLt=#EY`J{K2IY~F&!5cE#Sst#w&(4o7;F%K|9jk

?0j8gQ?Q+xHW~vZ%EG>tGm#f@VJL)cX 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 + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 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 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 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\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 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 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 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\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32f407-armfly-v5/project.ewp b/bsp/stm32/stm32f407-armfly-v5/project.ewp new file mode 100644 index 0000000000..db4161a4b3 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/project.ewp @@ -0,0 +1,2410 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\startup_stm32f407xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.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\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + CORTEX-M4 + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dfsdm.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma2d.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dsi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_eth.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hcd.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_irda.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_iwdg.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_lptim.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nand.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nor.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pccard.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_qspi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sd.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sdram.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_smartcard.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spdifrx.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sram.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_wwdg.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fmc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fsmc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_sdmmc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c + + + diff --git a/bsp/stm32/stm32f407-armfly-v5/project.eww b/bsp/stm32/stm32f407-armfly-v5/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32f407-armfly-v5/project.uvopt b/bsp/stm32/stm32f407-armfly-v5/project.uvopt new file mode 100644 index 0000000000..b53d69d5df --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/project.uvopt @@ -0,0 +1,162 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 + + + 0 + UL2CM3 + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + + + + + 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 + + + + + + + diff --git a/bsp/stm32/stm32f407-armfly-v5/project.uvoptx b/bsp/stm32/stm32f407-armfly-v5/project.uvoptx new file mode 100644 index 0000000000..f8c4606a9e --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/project.uvoptx @@ -0,0 +1,191 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.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\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.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 + + + + + + + + + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32f407-armfly-v5/project.uvproj b/bsp/stm32/stm32f407-armfly-v5/project.uvproj new file mode 100644 index 0000000000..a2c80e0594 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/project.uvproj @@ -0,0 +1,1189 @@ + + + 1.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + + + STM32F407ZG + STMicroelectronics + IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "Startup\ST\STM32F4xx\startup_stm32f40_41xxx.s" ("STM32F40/41xxx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + 6105 + stm32f4xx.h + + + + + + + -DSTM32F40_41xxx + + + SFD\ST\STM32F4xx\STM32F40x.sfr + 0 + 0 + + + + ST\STM32F4xx\ + ST\STM32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 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 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU -REMAP + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 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 + + 0 + 6 + + + + + + + + + + + + + + Segger\JL2CM3.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 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + + + 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 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + USE_HAL_DRIVER, STM32F407xx + + applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\include;..\..\..\libcpu\arm\cortex-m4;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + + + stm32f4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + + + startup_stm32f407xx.s + 2 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f407xx.s + + + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + + + components.c + 1 + ..\..\..\src\components.c + + + + + device.c + 1 + ..\..\..\src\device.c + + + + + idle.c + 1 + ..\..\..\src\idle.c + + + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + + + irq.c + 1 + ..\..\..\src\irq.c + + + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + + + mem.c + 1 + ..\..\..\src\mem.c + + + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + + + object.c + 1 + ..\..\..\src\object.c + + + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + + + signal.c + 1 + ..\..\..\src\signal.c + + + + + thread.c + 1 + ..\..\..\src\thread.c + + + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + CORTEX-M4 + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32f4xx.c + 1 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + + + stm32f4xx_hal.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + + + stm32f4xx_hal_adc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c + + + + + stm32f4xx_hal_adc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c + + + + + stm32f4xx_hal_can.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c + + + + + stm32f4xx_hal_cec.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + + + stm32f4xx_hal_cortex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + + + stm32f4xx_hal_crc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + + + stm32f4xx_hal_cryp.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + + + stm32f4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + + + stm32f4xx_hal_dac.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac.c + + + + + stm32f4xx_hal_dac_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac_ex.c + + + + + stm32f4xx_hal_dcmi.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi.c + + + + + stm32f4xx_hal_dcmi_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi_ex.c + + + + + stm32f4xx_hal_dfsdm.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dfsdm.c + + + + + stm32f4xx_hal_dma.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + + + stm32f4xx_hal_dma2d.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma2d.c + + + + + stm32f4xx_hal_dma_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + + + stm32f4xx_hal_dsi.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dsi.c + + + + + stm32f4xx_hal_eth.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_eth.c + + + + + stm32f4xx_hal_flash.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c + + + + + stm32f4xx_hal_flash_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c + + + + + stm32f4xx_hal_flash_ramfunc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c + + + + + stm32f4xx_hal_fmpi2c.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c.c + + + + + stm32f4xx_hal_fmpi2c_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c_ex.c + + + + + stm32f4xx_hal_gpio.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + + + stm32f4xx_hal_hash.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash.c + + + + + stm32f4xx_hal_hash_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash_ex.c + + + + + stm32f4xx_hal_hcd.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hcd.c + + + + + stm32f4xx_hal_i2c.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c + + + + + stm32f4xx_hal_i2c_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c + + + + + stm32f4xx_hal_i2s.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s.c + + + + + stm32f4xx_hal_i2s_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s_ex.c + + + + + stm32f4xx_hal_irda.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_irda.c + + + + + stm32f4xx_hal_iwdg.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_iwdg.c + + + + + stm32f4xx_hal_lptim.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_lptim.c + + + + + stm32f4xx_hal_ltdc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc.c + + + + + stm32f4xx_hal_ltdc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc_ex.c + + + + + stm32f4xx_hal_nand.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nand.c + + + + + stm32f4xx_hal_nor.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nor.c + + + + + stm32f4xx_hal_pccard.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pccard.c + + + + + stm32f4xx_hal_pcd.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c + + + + + stm32f4xx_hal_pcd_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c + + + + + stm32f4xx_hal_pwr.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + + + stm32f4xx_hal_qspi.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_qspi.c + + + + + stm32f4xx_hal_rcc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + + + stm32f4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + + + stm32f4xx_hal_rng.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + + + stm32f4xx_hal_rtc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc.c + + + + + stm32f4xx_hal_rtc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc_ex.c + + + + + stm32f4xx_hal_sai.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai.c + + + + + stm32f4xx_hal_sai_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai_ex.c + + + + + stm32f4xx_hal_sd.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sd.c + + + + + stm32f4xx_hal_sdram.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sdram.c + + + + + stm32f4xx_hal_smartcard.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_smartcard.c + + + + + stm32f4xx_hal_spdifrx.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spdifrx.c + + + + + stm32f4xx_hal_spi.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c + + + + + stm32f4xx_hal_sram.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sram.c + + + + + stm32f4xx_hal_tim.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c + + + + + stm32f4xx_hal_tim_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c + + + + + stm32f4xx_hal_uart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + + + stm32f4xx_hal_usart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + + + stm32f4xx_hal_wwdg.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_wwdg.c + + + + + stm32f4xx_ll_fmc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fmc.c + + + + + stm32f4xx_ll_fsmc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fsmc.c + + + + + stm32f4xx_ll_sdmmc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_sdmmc.c + + + + + stm32f4xx_ll_usb.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c + + + + + + +
diff --git a/bsp/stm32/stm32f407-armfly-v5/project.uvprojx b/bsp/stm32/stm32f407-armfly-v5/project.uvprojx new file mode 100644 index 0000000000..793a467224 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/project.uvprojx @@ -0,0 +1,753 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F407IGTx + STMicroelectronics + Keil.STM32F4xx_DFP.2.14.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) + 0 + $$Device:STM32F407IGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + + + + + + + + + + $$Device:STM32F407IGTx$CMSIS\SVD\STM32F40x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 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 + 4101 + + 1 + STLink\ST-LINKIII-KEIL_SWO.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 + 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 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32F407xx + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;board\ports;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\libc\compilers\common;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32f4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + startup_stm32f407xx.s + 2 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f407xx.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_hwtimer.c + 1 + ..\libraries\HAL_Drivers\drv_hwtimer.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + DeviceDrivers + + + hwtimer.c + 1 + ..\..\..\components\drivers\hwtimer\hwtimer.c + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + + + libc + + + time.c + 1 + ..\..\..\components\libc\compilers\common\time.c + + + + + STM32_HAL + + + system_stm32f4xx.c + 1 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + stm32f4xx_hal.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + stm32f4xx_hal_cec.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + stm32f4xx_hal_cortex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + stm32f4xx_hal_crc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + stm32f4xx_hal_cryp.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + stm32f4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + stm32f4xx_hal_dma.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + stm32f4xx_hal_dma_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + stm32f4xx_hal_pwr.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal_rcc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + stm32f4xx_hal_rng.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + stm32f4xx_hal_gpio.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_uart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + stm32f4xx_hal_usart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + stm32f4xx_hal_tim.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c + + + stm32f4xx_hal_tim_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c + + + stm32f4xx_hal_lptim.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_lptim.c + + + + + + + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/bsp/stm32/stm32f407-armfly-v5/rtconfig.h b/bsp/stm32/stm32f407-armfly-v5/rtconfig.h new file mode 100644 index 0000000000..7d83eb4f99 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/rtconfig.h @@ -0,0 +1,173 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#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_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 +#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 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F4 + +/* Hardware Drivers Config */ + +#define SOC_STM32F407ZG + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32f407-armfly-v5/rtconfig.py b/bsp/stm32/stm32f407-armfly-v5/rtconfig.py new file mode 100644 index 0000000000..00d5d737ac --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/rtconfig.py @@ -0,0 +1,150 @@ +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 = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +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=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + 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 rt-thread.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 == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + 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 += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + 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/stm32/stm32f407-armfly-v5/template.ewp b/bsp/stm32/stm32f407-armfly-v5/template.ewp new file mode 100644 index 0000000000..21c66ca0d0 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/template.ewp @@ -0,0 +1,2031 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32f407-armfly-v5/template.eww b/bsp/stm32/stm32f407-armfly-v5/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32f407-armfly-v5/template.uvopt b/bsp/stm32/stm32f407-armfly-v5/template.uvopt new file mode 100644 index 0000000000..5cc5956b4f --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/template.uvopt @@ -0,0 +1,199 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + + 0 + Datasheet + DATASHTS\ST\STM32F4xx\DM00037051.pdf + + + 1 + Reference Manual + DATASHTS\ST\STM32F4xx\DM00031020.pdf + + + 2 + Technical Reference Manual + datashts\arm\cortex_m4\r0p1\DDI0439C_CORTEX_M4_R0P1_TRM.PDF + + + 3 + Generic User Guide + datashts\arm\cortex_m4\r0p1\DUI0553A_CORTEX_M4_DGUG.PDF + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + + + 0 + JL2CM3 + -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 + + + + + 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 + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32f407-armfly-v5/template.uvoptx b/bsp/stm32/stm32f407-armfly-v5/template.uvoptx new file mode 100644 index 0000000000..904af41f77 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/template.uvoptx @@ -0,0 +1,187 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 24000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407IGTx$CMSIS\Flash\STM32F4xx_1024.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 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32f407-armfly-v5/template.uvproj b/bsp/stm32/stm32f407-armfly-v5/template.uvproj new file mode 100644 index 0000000000..73d0b32956 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/template.uvproj @@ -0,0 +1,438 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 0 + + + STM32F407IG + STMicroelectronics + IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "Startup\ST\STM32F4xx\startup_stm32f40_41xxx.s" ("STM32F40/41xxx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + 6104 + stm32f4xx.h + + + + + + + -DSTM32F40_41xxx + + + SFD\ST\STM32F4xx\STM32F40x.sfr + 0 + 0 + + + + ST\STM32F4xx\ + ST\STM32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 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 + -MPU -REMAP + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 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 + 6 + + + + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4101 + + 1 + STLink\ST-LINKIII-KEIL_SWO.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 + 1 + 0 + 8 + 0 + 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 + 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 + 1 + 0 + 0 + 1 + 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 + 1 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/bsp/stm32/stm32f407-armfly-v5/template.uvprojx b/bsp/stm32/stm32f407-armfly-v5/template.uvprojx new file mode 100644 index 0000000000..4c3ec18c73 --- /dev/null +++ b/bsp/stm32/stm32f407-armfly-v5/template.uvprojx @@ -0,0 +1,411 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F407IGTx + STMicroelectronics + Keil.STM32F4xx_DFP.2.14.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) + 0 + $$Device:STM32F407IGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + + + + + + + + + + $$Device:STM32F407IGTx$CMSIS\SVD\STM32F40x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 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 + 4101 + + 1 + STLink\ST-LINKIII-KEIL_SWO.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 + 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 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
From 020a82a65ab6d92d352c24a2e9b9c2013447cb16 Mon Sep 17 00:00:00 2001 From: gouqs0615 Date: Mon, 2 Nov 2020 16:44:13 +0800 Subject: [PATCH 2/5] fix at_server_getchar spelling error --- components/net/at/src/at_server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/net/at/src/at_server.c b/components/net/at/src/at_server.c index 81d00951f5..e67ea9a620 100644 --- a/components/net/at/src/at_server.c +++ b/components/net/at/src/at_server.c @@ -412,7 +412,7 @@ static rt_err_t at_cmd_get_name(const char *cmd_buffer, char *cmd_name) return -RT_ERROR; } -static rt_err_t at_server_gerchar(at_server_t server, char *ch, rt_int32_t timeout) +static rt_err_t at_server_getchar(at_server_t server, char *ch, rt_int32_t timeout) { rt_err_t result = RT_EOK; @@ -595,7 +595,7 @@ int at_server_init(void) goto __exit; } - at_server_local->get_char = at_server_gerchar; + at_server_local->get_char = at_server_getchar; memcpy(at_server_local->end_mark, AT_CMD_END_MARK, sizeof(AT_CMD_END_MARK)); at_server_local->parser_entry = server_parser; From ad41afbc65abc334bcfb6064a90e992356877977 Mon Sep 17 00:00:00 2001 From: ZhaoJiasheng <18535861947@163.com> Date: Tue, 22 Dec 2020 17:33:49 +0800 Subject: [PATCH 3/5] Fix bsp/k210/driver/drv_gpio.c error --- bsp/k210/driver/drv_gpio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bsp/k210/driver/drv_gpio.c b/bsp/k210/driver/drv_gpio.c index a6eaaf197d..05ca8fd934 100644 --- a/bsp/k210/driver/drv_gpio.c +++ b/bsp/k210/driver/drv_gpio.c @@ -180,10 +180,10 @@ static rt_err_t drv_pin_attach_irq(struct rt_device *device, rt_int32_t pin, switch (mode) { case PIN_IRQ_MODE_RISING: - irq_table[pin_channel].edge = GPIO_PE_FALLING; + irq_table[pin_channel].edge = GPIO_PE_RISING; break; case PIN_IRQ_MODE_FALLING: - irq_table[pin_channel].edge = GPIO_PE_RISING; + irq_table[pin_channel].edge = GPIO_PE_FALLING; break; case PIN_IRQ_MODE_RISING_FALLING: irq_table[pin_channel].edge = GPIO_PE_BOTH; From 66e7465c5a202bf0cc37b3daf2991a4e3edc3b19 Mon Sep 17 00:00:00 2001 From: liuhy Date: Fri, 4 Jun 2021 18:58:22 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=AE=B8?= =?UTF-8?q?=E5=8F=AF=E8=AF=81=E8=AF=B4=E6=98=8E=E5=92=8Cbsp=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E9=A9=B1=E5=8A=A8=E5=8F=8A=E7=94=A8=E4=BE=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/essemi/es32f0654/.config | 49 +- bsp/essemi/es32f0654/drivers/ES/Kconfig | 160 + .../es32f0654/drivers/ES/es_conf_info_adc.h | 97 + .../es32f0654/drivers/ES/es_conf_info_can.h | 73 + .../es32f0654/drivers/ES/es_conf_info_cmu.h | 87 + .../es32f0654/drivers/ES/es_conf_info_gpio.h | 5158 +++++++++++++++++ .../drivers/ES/es_conf_info_hwtimer.h | 103 + .../es32f0654/drivers/ES/es_conf_info_i2c.h | 95 + .../es32f0654/drivers/ES/es_conf_info_map.h | 2691 +++++++++ .../es32f0654/drivers/ES/es_conf_info_pm.h | 32 + .../es32f0654/drivers/ES/es_conf_info_pwm.h | 72 + .../es32f0654/drivers/ES/es_conf_info_rtc.h | 43 + .../drivers/ES/es_conf_info_select.h | 44 + .../es32f0654/drivers/ES/es_conf_info_spi.h | 132 + .../es32f0654/drivers/ES/es_conf_info_uart.h | 206 + bsp/essemi/es32f0654/drivers/Kconfig | 146 +- bsp/essemi/es32f0654/drivers/SConscript | 52 +- bsp/essemi/es32f0654/drivers/board.c | 91 +- bsp/essemi/es32f0654/drivers/board.h | 18 +- .../bsp_driver_example/adc_vol_sample.c | 5 + .../drivers/bsp_driver_example/can_sample.c | 6 +- .../bsp_driver_example/hwtimer_sample.c | 6 +- .../bsp_driver_example/i2c_e2_sample.c | 109 + .../drivers/bsp_driver_example/i2c_sample.c | 22 +- .../drivers/bsp_driver_example/pm_sample.c | 43 +- .../bsp_driver_example/pwm_led_sample.c | 8 +- .../drivers/bsp_driver_example/rtc_sample.c | 4 + .../drivers/bsp_driver_example/spi_sample.c | 36 +- bsp/essemi/es32f0654/drivers/drv_adc.c | 100 +- bsp/essemi/es32f0654/drivers/drv_adc.h | 15 + bsp/essemi/es32f0654/drivers/drv_can.c | 265 +- bsp/essemi/es32f0654/drivers/drv_can.h | 27 +- bsp/essemi/es32f0654/drivers/drv_gpio.c | 298 +- bsp/essemi/es32f0654/drivers/drv_gpio.h | 15 + bsp/essemi/es32f0654/drivers/drv_hwtimer.c | 408 +- bsp/essemi/es32f0654/drivers/drv_hwtimer.h | 16 +- bsp/essemi/es32f0654/drivers/drv_i2c.c | 93 +- bsp/essemi/es32f0654/drivers/drv_i2c.h | 19 +- bsp/essemi/es32f0654/drivers/drv_pm.c | 53 +- bsp/essemi/es32f0654/drivers/drv_pm.h | 19 + bsp/essemi/es32f0654/drivers/drv_pwm.c | 230 +- bsp/essemi/es32f0654/drivers/drv_pwm.h | 12 + bsp/essemi/es32f0654/drivers/drv_rtc.c | 36 +- bsp/essemi/es32f0654/drivers/drv_rtc.h | 16 +- bsp/essemi/es32f0654/drivers/drv_spi.c | 180 +- bsp/essemi/es32f0654/drivers/drv_spi.h | 17 +- bsp/essemi/es32f0654/drivers/drv_spiflash.c | 10 +- bsp/essemi/es32f0654/drivers/drv_uart.c | 567 +- bsp/essemi/es32f0654/drivers/drv_uart.h | 12 + .../Include/ald_acmp.h | 14 + .../Include/ald_adc.h | 14 + .../Include/ald_bkpc.h | 14 + .../Include/ald_calc.h | 14 + .../Include/ald_can.h | 14 + .../Include/ald_cmu.h | 14 + .../Include/ald_conf.h | 14 + .../Include/ald_crc.h | 14 + .../Include/ald_crypt.h | 14 + .../Include/ald_dbgc.h | 14 + .../Include/ald_dma.h | 14 + .../Include/ald_flash.h | 14 + .../Include/ald_gpio.h | 14 + .../Include/ald_i2c.h | 14 + .../Include/ald_iap.h | 14 + .../Include/ald_pis.h | 14 + .../Include/ald_pmu.h | 14 + .../Include/ald_rmu.h | 14 + .../Include/ald_rtc.h | 14 + .../Include/ald_smartcard.h | 14 + .../Include/ald_spi.h | 14 + .../Include/ald_syscfg.h | 14 + .../Include/ald_timer.h | 14 + .../Include/ald_trng.h | 14 + .../Include/ald_tsense.h | 14 + .../Include/ald_uart.h | 14 + .../Include/ald_usart.h | 14 + .../Include/ald_wdt.h | 14 + .../Include/type.h | 15 + .../Include/utils.h | 14 + .../Source/ald_acmp.c | 14 + .../Source/ald_adc.c | 14 + .../Source/ald_bkpc.c | 14 + .../Source/ald_calc.c | 14 + .../Source/ald_can.c | 14 + .../Source/ald_cmu.c | 14 + .../Source/ald_crc.c | 14 + .../Source/ald_crypt.c | 14 + .../Source/ald_dma.c | 14 + .../Source/ald_flash.c | 14 + .../Source/ald_flash_ext.c | 14 + .../Source/ald_gpio.c | 14 + .../Source/ald_i2c.c | 14 + .../Source/ald_iap.c | 14 + .../Source/ald_pis.c | 14 + .../Source/ald_pmu.c | 14 + .../Source/ald_rmu.c | 14 + .../Source/ald_rtc.c | 14 + .../Source/ald_smartcard.c | 14 + .../Source/ald_spi.c | 14 + .../Source/ald_timer.c | 14 + .../Source/ald_trng.c | 14 + .../Source/ald_tsense.c | 14 + .../Source/ald_uart.c | 14 + .../Source/ald_usart.c | 14 + .../Source/ald_wdt.c | 14 + .../Source/utils.c | 14 + bsp/essemi/es32f0654/project.uvprojx | 513 +- bsp/essemi/es32f0654/rtconfig.h | 9 - bsp/essemi/es32f369x/.config | 90 +- bsp/essemi/es32f369x/drivers/ES/Kconfig | 197 + .../es32f369x/drivers/ES/es_conf_info_adc.h | 97 + .../es32f369x/drivers/ES/es_conf_info_can.h | 73 + .../es32f369x/drivers/ES/es_conf_info_cmu.h | 89 + .../es32f369x/drivers/ES/es_conf_info_gpio.h | 5157 ++++++++++++++++ .../drivers/ES/es_conf_info_hwtimer.h | 102 + .../es32f369x/drivers/ES/es_conf_info_i2c.h | 95 + .../es32f369x/drivers/ES/es_conf_info_map.h | 2876 +++++++++ .../es32f369x/drivers/ES/es_conf_info_pm.h | 32 + .../es32f369x/drivers/ES/es_conf_info_pwm.h | 78 + .../es32f369x/drivers/ES/es_conf_info_rtc.h | 43 + .../drivers/ES/es_conf_info_select.h | 43 + .../es32f369x/drivers/ES/es_conf_info_spi.h | 159 + .../es32f369x/drivers/ES/es_conf_info_uart.h | 205 + bsp/essemi/es32f369x/drivers/Kconfig | 154 +- bsp/essemi/es32f369x/drivers/SConscript | 26 +- bsp/essemi/es32f369x/drivers/board.c | 93 +- bsp/essemi/es32f369x/drivers/board.h | 18 +- .../bsp_driver_example/adc_vol_sample.c | 6 + .../drivers/bsp_driver_example/can_sample.c | 6 +- .../bsp_driver_example/hwtimer_sample.c | 4 + .../bsp_driver_example/i2c_e2_sample.c | 109 + .../drivers/bsp_driver_example/i2c_sample.c | 18 +- .../drivers/bsp_driver_example/pm_sample.c | 53 +- .../bsp_driver_example/pwm_led_sample.c | 9 +- .../drivers/bsp_driver_example/rtc_sample.c | 6 +- .../drivers/bsp_driver_example/spi_sample.c | 36 +- bsp/essemi/es32f369x/drivers/drv_adc.c | 131 +- bsp/essemi/es32f369x/drivers/drv_adc.h | 17 +- bsp/essemi/es32f369x/drivers/drv_can.c | 279 +- bsp/essemi/es32f369x/drivers/drv_can.h | 27 +- bsp/essemi/es32f369x/drivers/drv_gpio.c | 310 +- bsp/essemi/es32f369x/drivers/drv_gpio.h | 17 +- bsp/essemi/es32f369x/drivers/drv_hwtimer.c | 379 +- bsp/essemi/es32f369x/drivers/drv_hwtimer.h | 16 +- bsp/essemi/es32f369x/drivers/drv_i2c.c | 88 +- bsp/essemi/es32f369x/drivers/drv_i2c.h | 19 +- bsp/essemi/es32f369x/drivers/drv_pm.c | 60 +- bsp/essemi/es32f369x/drivers/drv_pm.h | 20 +- bsp/essemi/es32f369x/drivers/drv_pwm.c | 328 +- bsp/essemi/es32f369x/drivers/drv_rtc.c | 39 +- bsp/essemi/es32f369x/drivers/drv_rtc.h | 16 +- bsp/essemi/es32f369x/drivers/drv_spi.c | 212 +- bsp/essemi/es32f369x/drivers/drv_spi.h | 17 +- bsp/essemi/es32f369x/drivers/drv_spiflash.c | 34 + bsp/essemi/es32f369x/drivers/drv_spiflash.h | 19 + bsp/essemi/es32f369x/drivers/drv_uart.c | 448 +- bsp/essemi/es32f369x/drivers/drv_uart.h | 12 + .../EastSoft/ES32F36xx/Include/es32f36xx.h | 14 + .../ES32F36xx/Startup/gcc/startup_es32f36xx.S | 438 ++ .../Startup/keil/startup_es32f36xx.s | 14 + .../Include/ald_acmp.h | 14 + .../Include/ald_adc.h | 14 + .../Include/ald_bkpc.h | 14 + .../Include/ald_calc.h | 14 + .../Include/ald_can.h | 14 + .../Include/ald_cmu.h | 14 + .../Include/ald_conf.h | 14 + .../Include/ald_crc.h | 14 + .../Include/ald_crypt.h | 16 +- .../Include/ald_dac.h | 14 + .../Include/ald_dbgc.h | 15 + .../Include/ald_dma.h | 14 + .../Include/ald_ebi.h | 14 + .../Include/ald_flash.h | 14 + .../Include/ald_gpio.h | 16 +- .../Include/ald_i2c.h | 14 + .../Include/ald_i2s.h | 14 + .../Include/ald_iap.h | 14 + .../Include/ald_nand.h | 14 + .../Include/ald_nor_lcd.h | 14 + .../Include/ald_pis.h | 14 + .../Include/ald_pmu.h | 14 + .../Include/ald_qspi.h | 14 + .../Include/ald_rmu.h | 16 +- .../Include/ald_rtc.h | 14 + .../Include/ald_rtchw.h | 14 + .../Include/ald_spi.h | 14 + .../Include/ald_sram.h | 14 + .../Include/ald_syscfg.h | 14 + .../Include/ald_timer.h | 14 + .../Include/ald_trng.h | 16 +- .../Include/ald_tsense.h | 14 + .../Include/ald_uart.h | 16 +- .../Include/ald_usb.h | 16 +- .../Include/ald_wdt.h | 16 +- .../Include/type.h | 16 +- .../Include/utils.h | 14 + .../Source/ald_acmp.c | 14 + .../Source/ald_adc.c | 14 + .../Source/ald_bkpc.c | 14 + .../Source/ald_calc.c | 16 +- .../Source/ald_can.c | 14 + .../Source/ald_cmu.c | 16 +- .../Source/ald_crc.c | 14 + .../Source/ald_crypt.c | 14 + .../Source/ald_dac.c | 14 + .../Source/ald_dma.c | 14 + .../Source/ald_ebi.c | 14 + .../Source/ald_flash.c | 14 + .../Source/ald_flash_ext.c | 14 + .../Source/ald_gpio.c | 16 +- .../Source/ald_i2c.c | 14 + .../Source/ald_i2s.c | 14 + .../Source/ald_iap.c | 14 + .../Source/ald_nand.c | 14 + .../Source/ald_nor_lcd.c | 14 + .../Source/ald_pis.c | 14 + .../Source/ald_pmu.c | 14 + .../Source/ald_qspi.c | 14 + .../Source/ald_rmu.c | 14 + .../Source/ald_rtc.c | 14 + .../Source/ald_rtchw.c | 14 + .../Source/ald_spi.c | 14 + .../Source/ald_sram.c | 14 + .../Source/ald_timer.c | 14 + .../Source/ald_trng.c | 14 + .../Source/ald_tsense.c | 14 + .../Source/ald_uart.c | 14 + .../Source/ald_usb.c | 14 + .../Source/ald_wdt.c | 14 + .../Source/utils.c | 14 + bsp/essemi/es32f369x/project.uvoptx | 1180 ++-- bsp/essemi/es32f369x/project.uvprojx | 506 +- bsp/essemi/es32f369x/rtconfig.h | 21 +- bsp/essemi/es32f369x/template.uvoptx | 8 +- bsp/essemi/es32f369x/template.uvprojx | 6 +- 236 files changed, 25721 insertions(+), 3162 deletions(-) create mode 100644 bsp/essemi/es32f0654/drivers/ES/Kconfig create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_adc.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_can.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_cmu.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_gpio.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_i2c.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_map.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_pm.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_pwm.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_rtc.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_select.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_spi.h create mode 100644 bsp/essemi/es32f0654/drivers/ES/es_conf_info_uart.h create mode 100644 bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_e2_sample.c create mode 100644 bsp/essemi/es32f369x/drivers/ES/Kconfig create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_adc.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_can.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_cmu.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_gpio.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_i2c.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_map.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_pm.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_pwm.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_rtc.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_select.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_spi.h create mode 100644 bsp/essemi/es32f369x/drivers/ES/es_conf_info_uart.h create mode 100644 bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_e2_sample.c create mode 100644 bsp/essemi/es32f369x/drivers/drv_spiflash.c create mode 100644 bsp/essemi/es32f369x/drivers/drv_spiflash.h create mode 100644 bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/gcc/startup_es32f36xx.S diff --git a/bsp/essemi/es32f0654/.config b/bsp/essemi/es32f0654/.config index 3a014cefdd..cab1975d8a 100644 --- a/bsp/essemi/es32f0654/.config +++ b/bsp/essemi/es32f0654/.config @@ -19,7 +19,7 @@ CONFIG_RT_USING_OVERFLOW_CHECK=y CONFIG_RT_USING_HOOK=y CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 -CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_IDLE_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TIMER_SOFT is not set CONFIG_RT_DEBUG=y CONFIG_RT_DEBUG_COLOR=y @@ -114,26 +114,26 @@ CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y # CONFIG_RT_SERIAL_USING_DMA is not set CONFIG_RT_SERIAL_RB_BUFSZ=64 -CONFIG_RT_USING_CAN=y +# CONFIG_RT_USING_CAN is not set # CONFIG_RT_CAN_USING_HDR is not set -CONFIG_RT_USING_HWTIMER=y +# CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set -CONFIG_RT_USING_I2C=y +# CONFIG_RT_USING_I2C is not set # CONFIG_RT_I2C_DEBUG is not set -CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_USING_I2C_BITOPS is not set # CONFIG_RT_I2C_BITOPS_DEBUG is not set CONFIG_RT_USING_PIN=y -CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set -CONFIG_RT_USING_PWM=y +# CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set -CONFIG_RT_USING_PM=y -CONFIG_RT_USING_RTC=y +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_ALARM is not set # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set -CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set # CONFIG_RT_USING_SFUD is not set @@ -159,7 +159,8 @@ CONFIG_RT_USING_SPI=y # # CONFIG_RT_USING_LIBC is not set # CONFIG_RT_USING_PTHREADS is not set -# CONFIG_RT_LIBC_USING_TIME is not set +CONFIG_RT_LIBC_USING_TIME=y +CONFIG_RT_LIBC_FIXED_TIMEZONE=8 # # Network @@ -468,6 +469,8 @@ CONFIG_BSP_USING_GPIO=y # CONFIG_BSP_USING_UART1 is not set CONFIG_BSP_USING_UART2=y # CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_USART0 is not set +# CONFIG_BSP_USING_USART1 is not set # # SPI Drivers @@ -484,23 +487,26 @@ CONFIG_BSP_USING_UART2=y # # CAN Drivers # -# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_CAN0 is not set # # PWM Drivers # -# CONFIG_BSP_USING_PWM0 is not set -# CONFIG_BSP_USING_PWM1 is not set -# CONFIG_BSP_USING_PWM2 is not set -# CONFIG_BSP_USING_PWM3 is not set +# CONFIG_BSP_USING_AD16C4T0_PWM is not set +# CONFIG_BSP_USING_GP16C4T0_PWM is not set +# CONFIG_BSP_USING_GP16C2T0_PWM is not set +# CONFIG_BSP_USING_GP16C2T1_PWM is not set # # HWtimer Drivers # -# CONFIG_BSP_USING_HWTIMER0 is not set -# CONFIG_BSP_USING_HWTIMER1 is not set -# CONFIG_BSP_USING_HWTIMER2 is not set -# CONFIG_BSP_USING_HWTIMER3 is not set +# CONFIG_BSP_USING_AD16C4T0_HWTIMER is not set +# CONFIG_BSP_USING_GP16C4T0_HWTIMER is not set +# CONFIG_BSP_USING_GP16C2T0_HWTIMER is not set +# CONFIG_BSP_USING_GP16C2T1_HWTIMER is not set +# CONFIG_BSP_USING_BS16T0_HWTIMER is not set +# CONFIG_BSP_USING_BS16T2_HWTIMER is not set +# CONFIG_BSP_USING_BS16T3_HWTIMER is not set # # RTC Drivers @@ -515,7 +521,7 @@ CONFIG_BSP_USING_UART2=y # # ADC Drivers # -# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ADC0 is not set # # Onboard Peripheral Drivers @@ -532,6 +538,7 @@ CONFIG_BSP_USING_UART2=y # CONFIG_BSP_USING_EXAMPLE_ADC_VOL is not set # CONFIG_BSP_USING_EXAMPLE_HWTIMER is not set # CONFIG_BSP_USING_EXAMPLE_I2C is not set +# CONFIG_BSP_USING_EXAMPLE_I2C_E2PROM is not set # CONFIG_BSP_USING_EXAMPLE_LED_BLINK is not set # CONFIG_BSP_USING_EXAMPLE_PIN_BEEP is not set # CONFIG_BSP_USING_EXAMPLE_PWM_LED is not set diff --git a/bsp/essemi/es32f0654/drivers/ES/Kconfig b/bsp/essemi/es32f0654/drivers/ES/Kconfig new file mode 100644 index 0000000000..1f3b0a4e96 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/Kconfig @@ -0,0 +1,160 @@ +menu "UART Drivers" + + config BSP_USING_UART0 + bool "Register UART0" + select RT_USING_SERIAL + default n + + config BSP_USING_UART1 + bool "Register UART1" + select RT_USING_SERIAL + default n + + config BSP_USING_UART2 + bool "Register UART2" + select RT_USING_SERIAL + default y + + config BSP_USING_UART3 + bool "Register UART3" + select RT_USING_SERIAL + default n + + config BSP_USING_USART0 + bool "Register USART0" + select RT_USING_SERIAL + default n + + config BSP_USING_USART1 + bool "Register USART1" + select RT_USING_SERIAL + default n +endmenu + +menu "SPI Drivers" + + config BSP_USING_SPI0 + bool "Register SPI0" + select RT_USING_SPI + select RT_USING_PIN + default n + + config BSP_USING_SPI1 + bool "Register SPI1" + select RT_USING_SPI + select RT_USING_PIN + default n +endmenu + +menu "I2C Drivers" + config BSP_USING_I2C0 + bool "Register I2C0" + select RT_USING_I2C + default n + + config BSP_USING_I2C1 + bool "Register I2C1" + select RT_USING_I2C + default n +endmenu + +menu "CAN Drivers" + config BSP_USING_CAN0 + bool "Register CAN0" + select RT_USING_CAN + select RT_CAN_USING_HDR + default n +endmenu + +menu "PWM Drivers" + config BSP_USING_AD16C4T0_PWM + bool "Register pwm0" + select RT_USING_PWM + default n + + config BSP_USING_GP16C4T0_PWM + bool "Register pwm1" + select RT_USING_PWM + default n + + config BSP_USING_GP16C2T0_PWM + bool "Register pwm2" + select RT_USING_PWM + default n + + config BSP_USING_GP16C2T1_PWM + bool "Register pwm3" + select RT_USING_PWM + default n +endmenu + +menu "HWtimer Drivers" + config BSP_USING_AD16C4T0_HWTIMER + bool "Register timer0" + select RT_USING_HWTIMER + default n + depends on !BSP_USING_AD16C4T0_PWM + + config BSP_USING_GP16C4T0_HWTIMER + bool "Register timer1" + select RT_USING_HWTIMER + default n + depends on !BSP_USING_GP16C4T0_PWM + + config BSP_USING_GP16C2T0_HWTIMER + bool "Register timer2" + select RT_USING_HWTIMER + default n + depends on !BSP_USING_GP16C2T0_PWM + + config BSP_USING_GP16C2T1_HWTIMER + bool "Register timer3" + select RT_USING_HWTIMER + default n + depends on !BSP_USING_GP16C2T1_PWM + + config BSP_USING_BS16T0_HWTIMER + bool "Register timer4" + select RT_USING_HWTIMER + default n + + config BSP_USING_BS16T1_HWTIMER + bool "Register timer5" + select RT_USING_HWTIMER + default n + depends on !BSP_USING_UART2 + + config BSP_USING_BS16T2_HWTIMER + bool "Register timer6" + select RT_USING_HWTIMER + default n + depends on !BSP_USING_UART3 + + config BSP_USING_BS16T3_HWTIMER + bool "Register timer7" + select RT_USING_HWTIMER + default n +endmenu + +menu "RTC Drivers" + config BSP_USING_RTC + bool "Register RTC" + select RT_USING_RTC + default n +endmenu + +menu "PM Drivers" + config BSP_USING_PM + bool "Using PM" + select RT_USING_PM + default n +endmenu + +menu "ADC Drivers" + config BSP_USING_ADC0 + bool "Using ADC" + select RT_USING_ADC + select BSP_USING_ADC + default n +endmenu + diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_adc.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_adc.h new file mode 100644 index 0000000000..772f7a0df0 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_adc.h @@ -0,0 +1,97 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_ADC_H__ +#define __ES_CONF_INFO_ADC_H__ + +#include "es_conf_info_map.h" + +#include + + +#define ES_C_ADC_CLK_DIV_1 ADC_CKDIV_1 +#define ES_C_ADC_CLK_DIV_2 ADC_CKDIV_2 +#define ES_C_ADC_CLK_DIV_4 ADC_CKDIV_4 +#define ES_C_ADC_CLK_DIV_8 ADC_CKDIV_8 +#define ES_C_ADC_CLK_DIV_16 ADC_CKDIV_16 +#define ES_C_ADC_CLK_DIV_32 ADC_CKDIV_32 +#define ES_C_ADC_CLK_DIV_64 ADC_CKDIV_64 +#define ES_C_ADC_CLK_DIV_128 ADC_CKDIV_128 + +#define ES_C_ADC_ALIGN_RIGHT ADC_DATAALIGN_RIGHT +#define ES_C_ADC_ALIGN_LEFT ADC_DATAALIGN_LEFT + +#define ES_C_ADC_CONV_BIT_6 ADC_CONV_BIT_6 +#define ES_C_ADC_CONV_BIT_8 ADC_CONV_BIT_8 +#define ES_C_ADC_CONV_BIT_10 ADC_CONV_BIT_10 +#define ES_C_ADC_CONV_BIT_12 ADC_CONV_BIT_12 + +#define ES_C_ADC_SAMPLE_TIME_1 ADC_SAMPLETIME_1 +#define ES_C_ADC_SAMPLE_TIME_2 ADC_SAMPLETIME_2 +#define ES_C_ADC_SAMPLE_TIME_4 ADC_SAMPLETIME_4 +#define ES_C_ADC_SAMPLE_TIME_15 ADC_SAMPLETIME_15 + +/* ADC 配置 */ + +/* codes_main */ + + +#define ES_ADC0_ALIGN ES_C_ADC_ALIGN_RIGHT +#define ES_ADC1_ALIGN ES_C_ADC_ALIGN_RIGHT +#define ES_ADC1_DATA_BIT ES_C_ADC_CONV_BIT_12 +#define ES_ADC0_DATA_BIT ES_C_ADC_CONV_BIT_12 + +#ifndef ES_DEVICE_NAME_ADC0 +#define ES_DEVICE_NAME_ADC0 "adc0" +#endif +#ifndef ES_DEVICE_NAME_ADC1 +#define ES_DEVICE_NAME_ADC1 "adc1" +#endif + +#ifndef ES_ADC0_CLK_DIV +#define ES_ADC0_CLK_DIV ES_C_ADC_CLK_DIV_128 +#endif +#ifndef ES_ADC0_ALIGN +#define ES_ADC0_ALIGN ES_C_ADC_ALIGN_RIGHT +#endif +#ifndef ES_ADC0_DATA_BIT +#define ES_ADC0_DATA_BIT ES_C_ADC_CONV_BIT_12 +#endif +#ifndef ES_ADC0_NCH_SAMPLETIME +#define ES_ADC0_NCH_SAMPLETIME ES_C_ADC_SAMPLE_TIME_4 +#endif + +#ifndef ES_ADC1_CLK_DIV +#define ES_ADC1_CLK_DIV ES_C_ADC_CLK_DIV_128 +#endif +#ifndef ES_ADC1_ALIGN +#define ES_ADC1_ALIGN ES_C_ADC_ALIGN_RIGHT +#endif +#ifndef ES_ADC1_DATA_BIT +#define ES_ADC1_DATA_BIT ES_C_ADC_CONV_BIT_12 +#endif +#ifndef ES_ADC1_NCH_SAMPLETIME +#define ES_ADC1_NCH_SAMPLETIME ES_C_ADC_SAMPLE_TIME_4 +#endif + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_can.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_can.h new file mode 100644 index 0000000000..46df1ed054 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_can.h @@ -0,0 +1,73 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_CAN_H__ +#define __ES_CONF_INFO_CAN_H__ + +#include "es_conf_info_map.h" +#include +#include + + +/*默认的CAN硬件过滤器的编号 0 */ +#define ES_C_CAN_DEFAULT_FILTER_NUMBER 0 + +/*硬件过滤器,过滤帧类型*/ +#define ES_C_CAN_FILTER_FRAME_TYPE 0 + + +#define ES_C_CAN_SJW_NUM_1 CAN_SJW_1 +#define ES_C_CAN_SJW_NUM_2 CAN_SJW_2 +#define ES_C_CAN_SJW_NUM_3 CAN_SJW_3 +#define ES_C_CAN_SJW_NUM_4 CAN_SJW_4 + + + +/* CAN 配置 */ + +/* codes_main */ + + + +#ifndef ES_DEVICE_NAME_CAN0 +#define ES_DEVICE_NAME_CAN0 "can0" +#endif + +#ifndef ES_CAN0_AUTO_BAN_RE_T +#define ES_CAN0_AUTO_BAN_RE_T ES_C_ENABLE +#endif +#ifndef ES_CAN0_SPEED +#define ES_CAN0_SPEED 1000000 +#endif +#ifndef ES_CAN0_SJW +#define ES_CAN0_SJW ES_C_CAN_SJW_NUM_4 +#endif + +#define ES_CAN0_CONFIG \ +{ \ + ES_CAN0_SPEED, \ + RT_CANMSG_BOX_SZ, \ + RT_CANSND_BOX_NUM, \ + RT_CAN_MODE_NORMAL, \ +}; +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_cmu.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_cmu.h new file mode 100644 index 0000000000..f82c1d2b6b --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_cmu.h @@ -0,0 +1,87 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_CMU_H__ +#define __ES_CONF_INFO_CMU_H__ + + +#include + + +/* 时钟树 配置 */ + +#define ES_C_MUL_9 CMU_PLL1_OUTPUT_36M +#define ES_C_MUL_12 CMU_PLL1_OUTPUT_48M + +#define ES_C_DIV_1 CMU_DIV_1 +#define ES_C_DIV_2 CMU_DIV_2 +#define ES_C_DIV_4 CMU_DIV_4 +#define ES_C_DIV_8 CMU_DIV_8 +#define ES_C_DIV_16 CMU_DIV_16 +#define ES_C_DIV_32 CMU_DIV_32 +#define ES_C_DIV_64 CMU_DIV_64 +#define ES_C_DIV_128 CMU_DIV_128 +#define ES_C_DIV_256 CMU_DIV_256 +#define ES_C_DIV_512 CMU_DIV_512 +#define ES_C_DIV_1024 CMU_DIV_1024 +#define ES_C_DIV_2048 CMU_DIV_2048 +#define ES_C_DIV_4096 CMU_DIV_4096 + +#define ES_C_HOSC_DIV_1 CMU_PLL1_INPUT_HOSC +#define ES_C_HOSC_DIV_2 CMU_PLL1_INPUT_HOSC_2 +#define ES_C_HOSC_DIV_3 CMU_PLL1_INPUT_HOSC_3 +#define ES_C_HOSC_DIV_4 CMU_PLL1_INPUT_HOSC_4 +#define ES_C_HOSC_DIV_5 CMU_PLL1_INPUT_HOSC_5 +#define ES_C_HOSC_DIV_6 CMU_PLL1_INPUT_HOSC_6 +#define ES_C_HRC_DIV_6 CMU_PLL1_INPUT_HRC_6 + + + + + +#define ES_PLL1_REFER_CLK ES_C_HOSC_DIV_3 +#define ES_PLL1_OUT_CLK ES_C_MUL_12 +#define ES_CMU_PLL1_EN ES_C_ENABLE +#define ES_CMU_PLL1_SAFE_EN ES_C_DISABLE +#define ES_CMU_LOSC_EN ES_C_ENABLE +#define ES_CMU_LRC_EN ES_C_ENABLE +#define ES_CMU_HOSC_EN ES_C_ENABLE +#define ES_CMU_HRC_EN ES_C_ENABLE +#define ES_CMU_SYS_DIV ES_C_DIV_1 +#define ES_CMU_HCLK_1_DIV ES_C_DIV_1 +#define ES_CMU_PCLK_1_DIV ES_C_DIV_1 +#define ES_CMU_PCLK_2_DIV ES_C_DIV_1 +#define ES_SYS_CLK_SOURSE CMU_CLOCK_PLL1 +#define ES_PLL_CLK 48000000 +#define ES_SYS_SOURCE_CLK 48000000 +#define ES_SYS_CLK 48000000 +#define ES_PCLK1_CLK 48000000 +#define ES_PCLK2_CLK 48000000 +#define ES_HCLK1_CLK 48000000 +#define ES_CMU_EXTERN_CLK_LOSC 32768 +#define ES_CMU_EXTERN_CLK_HOSC 12000000 + + + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_gpio.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_gpio.h new file mode 100644 index 0000000000..dc3fde3020 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_gpio.h @@ -0,0 +1,5158 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_GPIO_H__ +#define __ES_CONF_INFO_GPIO_H__ + +#include "es_conf_info_map.h" + +#include +#include +#include + +/* GPIO 配置 */ + +typedef struct { + uint8_t pin; + uint8_t pin_mode; + uint8_t pin_level; + uint8_t irq_en; + uint8_t irq_mode; + void (*callback)(void *arg); +} gpio_conf_t; + +/*参数的定义*/ + +#define ES_C_GPIO_LEVEL_HIGH PIN_HIGH +#define ES_C_GPIO_LEVEL_LOW PIN_LOW + +#define ES_C_GPIO_MODE_OUTPUT PIN_MODE_OUTPUT +#define ES_C_GPIO_MODE_INPUT PIN_MODE_INPUT +#define ES_C_GPIO_MODE_INPUT_PULLUP PIN_MODE_INPUT_PULLUP +#define ES_C_GPIO_MODE_INPUT_PULLDOWN PIN_MODE_INPUT_PULLDOWN +#define ES_C_GPIO_MODE_OUTPUT_OD PIN_MODE_OUTPUT_OD + +#define ES_C_GPIO_IRQ_ENABLE PIN_IRQ_ENABLE +#define ES_C_GPIO_IRQ_DISABLE PIN_IRQ_DISABLE + +#define ES_C_GPIO_IRQ_MODE_FALL PIN_IRQ_MODE_FALLING +#define ES_C_GPIO_IRQ_MODE_RISE PIN_IRQ_MODE_RISING +#define ES_C_GPIO_IRQ_MODE_R_F PIN_IRQ_MODE_RISING_FALLING + + + + + +/* codes_main */ +//#define ES_INIT_PIN_GPIO_C_8 +//#define ES_INIT_GPIO_C_8_IRQ_EN ES_C_GPIO_IRQ_ENABLE + + + +#ifndef ES_DEVICE_NAME_PIN +#define ES_DEVICE_NAME_PIN "pin" +#endif + +/*GPIO外部中断回调函数控制需要,补充是否中断*/ +#if 11111 + +#ifndef ES_INIT_GPIO_A_0_IRQ_EN +#define ES_INIT_GPIO_A_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_1_IRQ_EN +#define ES_INIT_GPIO_A_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_2_IRQ_EN +#define ES_INIT_GPIO_A_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_3_IRQ_EN +#define ES_INIT_GPIO_A_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_4_IRQ_EN +#define ES_INIT_GPIO_A_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_5_IRQ_EN +#define ES_INIT_GPIO_A_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_6_IRQ_EN +#define ES_INIT_GPIO_A_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_7_IRQ_EN +#define ES_INIT_GPIO_A_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_8_IRQ_EN +#define ES_INIT_GPIO_A_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_9_IRQ_EN +#define ES_INIT_GPIO_A_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_10_IRQ_EN +#define ES_INIT_GPIO_A_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_11_IRQ_EN +#define ES_INIT_GPIO_A_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_12_IRQ_EN +#define ES_INIT_GPIO_A_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_13_IRQ_EN +#define ES_INIT_GPIO_A_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_14_IRQ_EN +#define ES_INIT_GPIO_A_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_15_IRQ_EN +#define ES_INIT_GPIO_A_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_0_IRQ_EN +#define ES_INIT_GPIO_B_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_1_IRQ_EN +#define ES_INIT_GPIO_B_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_2_IRQ_EN +#define ES_INIT_GPIO_B_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_3_IRQ_EN +#define ES_INIT_GPIO_B_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_4_IRQ_EN +#define ES_INIT_GPIO_B_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_5_IRQ_EN +#define ES_INIT_GPIO_B_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_6_IRQ_EN +#define ES_INIT_GPIO_B_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_7_IRQ_EN +#define ES_INIT_GPIO_B_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_8_IRQ_EN +#define ES_INIT_GPIO_B_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_9_IRQ_EN +#define ES_INIT_GPIO_B_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_10_IRQ_EN +#define ES_INIT_GPIO_B_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_11_IRQ_EN +#define ES_INIT_GPIO_B_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_12_IRQ_EN +#define ES_INIT_GPIO_B_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_13_IRQ_EN +#define ES_INIT_GPIO_B_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_14_IRQ_EN +#define ES_INIT_GPIO_B_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_15_IRQ_EN +#define ES_INIT_GPIO_B_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_0_IRQ_EN +#define ES_INIT_GPIO_C_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_1_IRQ_EN +#define ES_INIT_GPIO_C_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_2_IRQ_EN +#define ES_INIT_GPIO_C_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_3_IRQ_EN +#define ES_INIT_GPIO_C_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_4_IRQ_EN +#define ES_INIT_GPIO_C_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_5_IRQ_EN +#define ES_INIT_GPIO_C_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_6_IRQ_EN +#define ES_INIT_GPIO_C_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_7_IRQ_EN +#define ES_INIT_GPIO_C_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_8_IRQ_EN +#define ES_INIT_GPIO_C_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_9_IRQ_EN +#define ES_INIT_GPIO_C_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_10_IRQ_EN +#define ES_INIT_GPIO_C_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_11_IRQ_EN +#define ES_INIT_GPIO_C_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_12_IRQ_EN +#define ES_INIT_GPIO_C_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_13_IRQ_EN +#define ES_INIT_GPIO_C_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_14_IRQ_EN +#define ES_INIT_GPIO_C_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_15_IRQ_EN +#define ES_INIT_GPIO_C_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_0_IRQ_EN +#define ES_INIT_GPIO_D_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_1_IRQ_EN +#define ES_INIT_GPIO_D_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_2_IRQ_EN +#define ES_INIT_GPIO_D_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_3_IRQ_EN +#define ES_INIT_GPIO_D_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_4_IRQ_EN +#define ES_INIT_GPIO_D_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_5_IRQ_EN +#define ES_INIT_GPIO_D_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_6_IRQ_EN +#define ES_INIT_GPIO_D_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_7_IRQ_EN +#define ES_INIT_GPIO_D_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_8_IRQ_EN +#define ES_INIT_GPIO_D_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_9_IRQ_EN +#define ES_INIT_GPIO_D_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_10_IRQ_EN +#define ES_INIT_GPIO_D_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_11_IRQ_EN +#define ES_INIT_GPIO_D_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_12_IRQ_EN +#define ES_INIT_GPIO_D_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_13_IRQ_EN +#define ES_INIT_GPIO_D_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_14_IRQ_EN +#define ES_INIT_GPIO_D_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_15_IRQ_EN +#define ES_INIT_GPIO_D_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_0_IRQ_EN +#define ES_INIT_GPIO_E_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_1_IRQ_EN +#define ES_INIT_GPIO_E_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_2_IRQ_EN +#define ES_INIT_GPIO_E_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_3_IRQ_EN +#define ES_INIT_GPIO_E_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_4_IRQ_EN +#define ES_INIT_GPIO_E_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_5_IRQ_EN +#define ES_INIT_GPIO_E_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_6_IRQ_EN +#define ES_INIT_GPIO_E_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_7_IRQ_EN +#define ES_INIT_GPIO_E_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_8_IRQ_EN +#define ES_INIT_GPIO_E_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_9_IRQ_EN +#define ES_INIT_GPIO_E_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_10_IRQ_EN +#define ES_INIT_GPIO_E_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_11_IRQ_EN +#define ES_INIT_GPIO_E_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_12_IRQ_EN +#define ES_INIT_GPIO_E_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_13_IRQ_EN +#define ES_INIT_GPIO_E_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_14_IRQ_EN +#define ES_INIT_GPIO_E_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_15_IRQ_EN +#define ES_INIT_GPIO_E_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_0_IRQ_EN +#define ES_INIT_GPIO_F_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_1_IRQ_EN +#define ES_INIT_GPIO_F_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_2_IRQ_EN +#define ES_INIT_GPIO_F_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_3_IRQ_EN +#define ES_INIT_GPIO_F_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_4_IRQ_EN +#define ES_INIT_GPIO_F_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_5_IRQ_EN +#define ES_INIT_GPIO_F_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_6_IRQ_EN +#define ES_INIT_GPIO_F_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_7_IRQ_EN +#define ES_INIT_GPIO_F_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_8_IRQ_EN +#define ES_INIT_GPIO_F_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_9_IRQ_EN +#define ES_INIT_GPIO_F_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_10_IRQ_EN +#define ES_INIT_GPIO_F_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_11_IRQ_EN +#define ES_INIT_GPIO_F_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_12_IRQ_EN +#define ES_INIT_GPIO_F_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_13_IRQ_EN +#define ES_INIT_GPIO_F_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_14_IRQ_EN +#define ES_INIT_GPIO_F_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_15_IRQ_EN +#define ES_INIT_GPIO_F_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_0_IRQ_EN +#define ES_INIT_GPIO_G_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_1_IRQ_EN +#define ES_INIT_GPIO_G_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_2_IRQ_EN +#define ES_INIT_GPIO_G_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_3_IRQ_EN +#define ES_INIT_GPIO_G_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_4_IRQ_EN +#define ES_INIT_GPIO_G_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_5_IRQ_EN +#define ES_INIT_GPIO_G_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_6_IRQ_EN +#define ES_INIT_GPIO_G_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_7_IRQ_EN +#define ES_INIT_GPIO_G_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_8_IRQ_EN +#define ES_INIT_GPIO_G_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_9_IRQ_EN +#define ES_INIT_GPIO_G_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_10_IRQ_EN +#define ES_INIT_GPIO_G_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_11_IRQ_EN +#define ES_INIT_GPIO_G_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_12_IRQ_EN +#define ES_INIT_GPIO_G_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_13_IRQ_EN +#define ES_INIT_GPIO_G_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_14_IRQ_EN +#define ES_INIT_GPIO_G_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_15_IRQ_EN +#define ES_INIT_GPIO_G_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_0_IRQ_EN +#define ES_INIT_GPIO_H_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_1_IRQ_EN +#define ES_INIT_GPIO_H_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_2_IRQ_EN +#define ES_INIT_GPIO_H_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_3_IRQ_EN +#define ES_INIT_GPIO_H_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_4_IRQ_EN +#define ES_INIT_GPIO_H_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_5_IRQ_EN +#define ES_INIT_GPIO_H_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_6_IRQ_EN +#define ES_INIT_GPIO_H_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_7_IRQ_EN +#define ES_INIT_GPIO_H_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_8_IRQ_EN +#define ES_INIT_GPIO_H_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_9_IRQ_EN +#define ES_INIT_GPIO_H_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_10_IRQ_EN +#define ES_INIT_GPIO_H_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_11_IRQ_EN +#define ES_INIT_GPIO_H_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_12_IRQ_EN +#define ES_INIT_GPIO_H_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_13_IRQ_EN +#define ES_INIT_GPIO_H_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_14_IRQ_EN +#define ES_INIT_GPIO_H_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_15_IRQ_EN +#define ES_INIT_GPIO_H_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#endif //11111 + + + +/*是否需要 GPIO外部中断回调函数 (控制函数本体+声明)*/ +#if 11111 + +#if (ES_INIT_GPIO_A_0_IRQ_EN)||(ES_INIT_GPIO_B_0_IRQ_EN)||(ES_INIT_GPIO_C_0_IRQ_EN)||(ES_INIT_GPIO_D_0_IRQ_EN)|| \ + (ES_INIT_GPIO_E_0_IRQ_EN)||(ES_INIT_GPIO_F_0_IRQ_EN)||(ES_INIT_GPIO_G_0_IRQ_EN)||(ES_INIT_GPIO_H_0_IRQ_EN) +#define ES_CONF_EXTI_IRQ_0 +#endif + +#if (ES_INIT_GPIO_A_1_IRQ_EN)||(ES_INIT_GPIO_B_1_IRQ_EN)||(ES_INIT_GPIO_C_1_IRQ_EN)||(ES_INIT_GPIO_D_1_IRQ_EN)|| \ + (ES_INIT_GPIO_E_1_IRQ_EN)||(ES_INIT_GPIO_F_1_IRQ_EN)||(ES_INIT_GPIO_G_1_IRQ_EN)||(ES_INIT_GPIO_H_1_IRQ_EN) +#define ES_CONF_EXTI_IRQ_1 +#endif + +#if (ES_INIT_GPIO_A_2_IRQ_EN)||(ES_INIT_GPIO_B_2_IRQ_EN)||(ES_INIT_GPIO_C_2_IRQ_EN)||(ES_INIT_GPIO_D_2_IRQ_EN)|| \ + (ES_INIT_GPIO_E_2_IRQ_EN)||(ES_INIT_GPIO_F_2_IRQ_EN)||(ES_INIT_GPIO_G_2_IRQ_EN)||(ES_INIT_GPIO_H_2_IRQ_EN) +#define ES_CONF_EXTI_IRQ_2 +#endif + +#if (ES_INIT_GPIO_A_3_IRQ_EN)||(ES_INIT_GPIO_B_3_IRQ_EN)||(ES_INIT_GPIO_C_3_IRQ_EN)||(ES_INIT_GPIO_D_3_IRQ_EN)|| \ + (ES_INIT_GPIO_E_3_IRQ_EN)||(ES_INIT_GPIO_F_3_IRQ_EN)||(ES_INIT_GPIO_G_3_IRQ_EN)||(ES_INIT_GPIO_H_3_IRQ_EN) +#define ES_CONF_EXTI_IRQ_3 +#endif + +#if (ES_INIT_GPIO_A_4_IRQ_EN)||(ES_INIT_GPIO_B_4_IRQ_EN)||(ES_INIT_GPIO_C_4_IRQ_EN)||(ES_INIT_GPIO_D_4_IRQ_EN)|| \ + (ES_INIT_GPIO_E_4_IRQ_EN)||(ES_INIT_GPIO_F_4_IRQ_EN)||(ES_INIT_GPIO_G_4_IRQ_EN)||(ES_INIT_GPIO_H_4_IRQ_EN) +#define ES_CONF_EXTI_IRQ_4 +#endif + +#if (ES_INIT_GPIO_A_5_IRQ_EN)||(ES_INIT_GPIO_B_5_IRQ_EN)||(ES_INIT_GPIO_C_5_IRQ_EN)||(ES_INIT_GPIO_D_5_IRQ_EN)|| \ + (ES_INIT_GPIO_E_5_IRQ_EN)||(ES_INIT_GPIO_F_5_IRQ_EN)||(ES_INIT_GPIO_G_5_IRQ_EN)||(ES_INIT_GPIO_H_5_IRQ_EN) +#define ES_CONF_EXTI_IRQ_5 +#endif + +#if (ES_INIT_GPIO_A_6_IRQ_EN)||(ES_INIT_GPIO_B_6_IRQ_EN)||(ES_INIT_GPIO_C_6_IRQ_EN)||(ES_INIT_GPIO_D_6_IRQ_EN)|| \ + (ES_INIT_GPIO_E_6_IRQ_EN)||(ES_INIT_GPIO_F_6_IRQ_EN)||(ES_INIT_GPIO_G_6_IRQ_EN)||(ES_INIT_GPIO_H_6_IRQ_EN) +#define ES_CONF_EXTI_IRQ_6 +#endif + +#if (ES_INIT_GPIO_A_7_IRQ_EN)||(ES_INIT_GPIO_B_7_IRQ_EN)||(ES_INIT_GPIO_C_7_IRQ_EN)||(ES_INIT_GPIO_D_7_IRQ_EN)|| \ + (ES_INIT_GPIO_E_7_IRQ_EN)||(ES_INIT_GPIO_F_7_IRQ_EN)||(ES_INIT_GPIO_G_7_IRQ_EN)||(ES_INIT_GPIO_H_7_IRQ_EN) +#define ES_CONF_EXTI_IRQ_7 +#endif + +#if (ES_INIT_GPIO_A_8_IRQ_EN)||(ES_INIT_GPIO_B_8_IRQ_EN)||(ES_INIT_GPIO_C_8_IRQ_EN)||(ES_INIT_GPIO_D_8_IRQ_EN)|| \ + (ES_INIT_GPIO_E_8_IRQ_EN)||(ES_INIT_GPIO_F_8_IRQ_EN)||(ES_INIT_GPIO_G_8_IRQ_EN)||(ES_INIT_GPIO_H_8_IRQ_EN) +#define ES_CONF_EXTI_IRQ_8 +#endif + +#if (ES_INIT_GPIO_A_9_IRQ_EN)||(ES_INIT_GPIO_B_9_IRQ_EN)||(ES_INIT_GPIO_C_9_IRQ_EN)||(ES_INIT_GPIO_D_9_IRQ_EN)|| \ + (ES_INIT_GPIO_E_9_IRQ_EN)||(ES_INIT_GPIO_F_9_IRQ_EN)||(ES_INIT_GPIO_G_9_IRQ_EN)||(ES_INIT_GPIO_H_9_IRQ_EN) +#define ES_CONF_EXTI_IRQ_9 +#endif + +#if (ES_INIT_GPIO_A_10_IRQ_EN)||(ES_INIT_GPIO_B_10_IRQ_EN)||(ES_INIT_GPIO_C_10_IRQ_EN)||(ES_INIT_GPIO_D_10_IRQ_EN)|| \ + (ES_INIT_GPIO_E_10_IRQ_EN)||(ES_INIT_GPIO_F_10_IRQ_EN)||(ES_INIT_GPIO_G_10_IRQ_EN)||(ES_INIT_GPIO_H_10_IRQ_EN) +#define ES_CONF_EXTI_IRQ_10 +#endif + +#if (ES_INIT_GPIO_A_11_IRQ_EN)||(ES_INIT_GPIO_B_11_IRQ_EN)||(ES_INIT_GPIO_C_11_IRQ_EN)||(ES_INIT_GPIO_D_11_IRQ_EN)|| \ + (ES_INIT_GPIO_E_11_IRQ_EN)||(ES_INIT_GPIO_F_11_IRQ_EN)||(ES_INIT_GPIO_G_11_IRQ_EN)||(ES_INIT_GPIO_H_11_IRQ_EN) +#define ES_CONF_EXTI_IRQ_11 +#endif + +#if (ES_INIT_GPIO_A_12_IRQ_EN)||(ES_INIT_GPIO_B_12_IRQ_EN)||(ES_INIT_GPIO_C_12_IRQ_EN)||(ES_INIT_GPIO_D_12_IRQ_EN)|| \ + (ES_INIT_GPIO_E_12_IRQ_EN)||(ES_INIT_GPIO_F_12_IRQ_EN)||(ES_INIT_GPIO_G_12_IRQ_EN)||(ES_INIT_GPIO_H_12_IRQ_EN) +#define ES_CONF_EXTI_IRQ_12 +#endif + +#if (ES_INIT_GPIO_A_13_IRQ_EN)||(ES_INIT_GPIO_B_13_IRQ_EN)||(ES_INIT_GPIO_C_13_IRQ_EN)||(ES_INIT_GPIO_D_13_IRQ_EN)|| \ + (ES_INIT_GPIO_E_13_IRQ_EN)||(ES_INIT_GPIO_F_13_IRQ_EN)||(ES_INIT_GPIO_G_13_IRQ_EN)||(ES_INIT_GPIO_H_13_IRQ_EN) +#define ES_CONF_EXTI_IRQ_13 +#endif + +#if (ES_INIT_GPIO_A_14_IRQ_EN)||(ES_INIT_GPIO_B_14_IRQ_EN)||(ES_INIT_GPIO_C_14_IRQ_EN)||(ES_INIT_GPIO_D_14_IRQ_EN)|| \ + (ES_INIT_GPIO_E_14_IRQ_EN)||(ES_INIT_GPIO_F_14_IRQ_EN)||(ES_INIT_GPIO_G_14_IRQ_EN)||(ES_INIT_GPIO_H_14_IRQ_EN) +#define ES_CONF_EXTI_IRQ_14 +#endif + +#if (ES_INIT_GPIO_A_15_IRQ_EN)||(ES_INIT_GPIO_B_15_IRQ_EN)||(ES_INIT_GPIO_C_15_IRQ_EN)||(ES_INIT_GPIO_D_15_IRQ_EN)|| \ + (ES_INIT_GPIO_E_15_IRQ_EN)||(ES_INIT_GPIO_F_15_IRQ_EN)||(ES_INIT_GPIO_G_15_IRQ_EN)||(ES_INIT_GPIO_H_15_IRQ_EN) +#define ES_CONF_EXTI_IRQ_15 +#endif + +#endif //11111 + + +/*GPIO外部中断 声明*/ +#if 11111 + +#ifdef ES_CONF_EXTI_IRQ_0 +void irq_pin0_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_1 +void irq_pin1_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_2 +void irq_pin2_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_3 +void irq_pin3_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_4 +void irq_pin4_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_5 +void irq_pin5_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_6 +void irq_pin6_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_7 +void irq_pin7_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_8 +void irq_pin8_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_9 +void irq_pin9_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_10 +void irq_pin10_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_11 +void irq_pin11_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_12 +void irq_pin12_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_13 +void irq_pin13_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_14 +void irq_pin14_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_15 +void irq_pin15_callback(void* arg); +#endif + + +#endif //11111 + + + + +/*是否有配置的管脚*/ +#if defined(ES_INIT_PIN_GPIO_A_0) || defined(ES_INIT_PIN_GPIO_A_1) || defined(ES_INIT_PIN_GPIO_A_2) || defined(ES_INIT_PIN_GPIO_A_3) || \ + defined(ES_INIT_PIN_GPIO_A_4) || defined(ES_INIT_PIN_GPIO_A_5) || defined(ES_INIT_PIN_GPIO_A_6) || defined(ES_INIT_PIN_GPIO_A_7) || \ + defined(ES_INIT_PIN_GPIO_A_8) || defined(ES_INIT_PIN_GPIO_A_9) || defined(ES_INIT_PIN_GPIO_A_10) || defined(ES_INIT_PIN_GPIO_A_11) || \ + defined(ES_INIT_PIN_GPIO_A_12) || defined(ES_INIT_PIN_GPIO_A_13) || defined(ES_INIT_PIN_GPIO_A_14) || defined(ES_INIT_PIN_GPIO_A_15) || \ + defined(ES_INIT_PIN_GPIO_B_0) || defined(ES_INIT_PIN_GPIO_B_1) || defined(ES_INIT_PIN_GPIO_B_2) || defined(ES_INIT_PIN_GPIO_B_3) || \ + defined(ES_INIT_PIN_GPIO_B_4) || defined(ES_INIT_PIN_GPIO_B_5) || defined(ES_INIT_PIN_GPIO_B_6) || defined(ES_INIT_PIN_GPIO_B_7) || \ + defined(ES_INIT_PIN_GPIO_B_8) || defined(ES_INIT_PIN_GPIO_B_9) || defined(ES_INIT_PIN_GPIO_B_10) || defined(ES_INIT_PIN_GPIO_B_11) || \ + defined(ES_INIT_PIN_GPIO_B_12) || defined(ES_INIT_PIN_GPIO_B_13) || defined(ES_INIT_PIN_GPIO_B_14) || defined(ES_INIT_PIN_GPIO_B_15) || \ + defined(ES_INIT_PIN_GPIO_C_0) || defined(ES_INIT_PIN_GPIO_C_1) || defined(ES_INIT_PIN_GPIO_C_2) || defined(ES_INIT_PIN_GPIO_C_3) || \ + defined(ES_INIT_PIN_GPIO_C_4) || defined(ES_INIT_PIN_GPIO_C_5) || defined(ES_INIT_PIN_GPIO_C_6) || defined(ES_INIT_PIN_GPIO_C_7) || \ + defined(ES_INIT_PIN_GPIO_C_8) || defined(ES_INIT_PIN_GPIO_C_9) || defined(ES_INIT_PIN_GPIO_C_10) || defined(ES_INIT_PIN_GPIO_C_11) || \ + defined(ES_INIT_PIN_GPIO_C_12) || defined(ES_INIT_PIN_GPIO_C_13) || defined(ES_INIT_PIN_GPIO_C_14) || defined(ES_INIT_PIN_GPIO_C_15) || \ + defined(ES_INIT_PIN_GPIO_D_0) || defined(ES_INIT_PIN_GPIO_D_1) || defined(ES_INIT_PIN_GPIO_D_2) || defined(ES_INIT_PIN_GPIO_D_3) || \ + defined(ES_INIT_PIN_GPIO_D_4) || defined(ES_INIT_PIN_GPIO_D_5) || defined(ES_INIT_PIN_GPIO_D_6) || defined(ES_INIT_PIN_GPIO_D_7) || \ + defined(ES_INIT_PIN_GPIO_D_8) || defined(ES_INIT_PIN_GPIO_D_9) || defined(ES_INIT_PIN_GPIO_D_10) || defined(ES_INIT_PIN_GPIO_D_11) || \ + defined(ES_INIT_PIN_GPIO_D_12) || defined(ES_INIT_PIN_GPIO_D_13) || defined(ES_INIT_PIN_GPIO_D_14) || defined(ES_INIT_PIN_GPIO_D_15) || \ + defined(ES_INIT_PIN_GPIO_E_0) || defined(ES_INIT_PIN_GPIO_E_1) || defined(ES_INIT_PIN_GPIO_E_2) || defined(ES_INIT_PIN_GPIO_E_3) || \ + defined(ES_INIT_PIN_GPIO_E_4) || defined(ES_INIT_PIN_GPIO_E_5) || defined(ES_INIT_PIN_GPIO_E_6) || defined(ES_INIT_PIN_GPIO_E_7) || \ + defined(ES_INIT_PIN_GPIO_E_8) || defined(ES_INIT_PIN_GPIO_E_9) || defined(ES_INIT_PIN_GPIO_E_10) || defined(ES_INIT_PIN_GPIO_E_11) || \ + defined(ES_INIT_PIN_GPIO_E_12) || defined(ES_INIT_PIN_GPIO_E_13) || defined(ES_INIT_PIN_GPIO_E_14) || defined(ES_INIT_PIN_GPIO_E_15) || \ + defined(ES_INIT_PIN_GPIO_F_0) || defined(ES_INIT_PIN_GPIO_F_1) || defined(ES_INIT_PIN_GPIO_F_2) || defined(ES_INIT_PIN_GPIO_F_3) || \ + defined(ES_INIT_PIN_GPIO_F_4) || defined(ES_INIT_PIN_GPIO_F_5) || defined(ES_INIT_PIN_GPIO_F_6) || defined(ES_INIT_PIN_GPIO_F_7) || \ + defined(ES_INIT_PIN_GPIO_F_8) || defined(ES_INIT_PIN_GPIO_F_9) || defined(ES_INIT_PIN_GPIO_F_10) || defined(ES_INIT_PIN_GPIO_F_11) || \ + defined(ES_INIT_PIN_GPIO_F_12) || defined(ES_INIT_PIN_GPIO_F_13) || defined(ES_INIT_PIN_GPIO_F_14) || defined(ES_INIT_PIN_GPIO_F_15) || \ + defined(ES_INIT_PIN_GPIO_G_0) || defined(ES_INIT_PIN_GPIO_G_1) || defined(ES_INIT_PIN_GPIO_G_2) || defined(ES_INIT_PIN_GPIO_G_3) || \ + defined(ES_INIT_PIN_GPIO_G_4) || defined(ES_INIT_PIN_GPIO_G_5) || defined(ES_INIT_PIN_GPIO_G_6) || defined(ES_INIT_PIN_GPIO_G_7) || \ + defined(ES_INIT_PIN_GPIO_G_8) || defined(ES_INIT_PIN_GPIO_G_9) || defined(ES_INIT_PIN_GPIO_G_10) || defined(ES_INIT_PIN_GPIO_G_11) || \ + defined(ES_INIT_PIN_GPIO_G_12) || defined(ES_INIT_PIN_GPIO_G_13) || defined(ES_INIT_PIN_GPIO_G_14) || defined(ES_INIT_PIN_GPIO_G_15) || \ + defined(ES_INIT_PIN_GPIO_H_0) || defined(ES_INIT_PIN_GPIO_H_1) || defined(ES_INIT_PIN_GPIO_H_2) || defined(ES_INIT_PIN_GPIO_H_3) || \ + defined(ES_INIT_PIN_GPIO_H_4) || defined(ES_INIT_PIN_GPIO_H_5) || defined(ES_INIT_PIN_GPIO_H_6) || defined(ES_INIT_PIN_GPIO_H_7) || \ + defined(ES_INIT_PIN_GPIO_H_8) || defined(ES_INIT_PIN_GPIO_H_9) || defined(ES_INIT_PIN_GPIO_H_10) || defined(ES_INIT_PIN_GPIO_H_11) || \ + defined(ES_INIT_PIN_GPIO_H_12) || defined(ES_INIT_PIN_GPIO_H_13) || defined(ES_INIT_PIN_GPIO_H_14) || defined(ES_INIT_PIN_GPIO_H_15) + +#define ES_INIT_GPIOS + +#endif + + +#ifdef ES_INIT_GPIOS + +static gpio_conf_t gpio_conf_all[] = +{ + +#ifdef ES_INIT_PIN_GPIO_A_0 + + { + ES_PIN_GPIO_A_0 , + +#ifdef ES_INIT_GPIO_A_0_MODE + ES_INIT_GPIO_A_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_0_LEVEL + ES_INIT_GPIO_A_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_0_IRQ_MODE + ES_INIT_GPIO_A_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_1 + + { + ES_PIN_GPIO_A_1 , + +#ifdef ES_INIT_GPIO_A_1_MODE + ES_INIT_GPIO_A_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_1_LEVEL + ES_INIT_GPIO_A_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_1_IRQ_MODE + ES_INIT_GPIO_A_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_2 + + { + ES_PIN_GPIO_A_2 , + +#ifdef ES_INIT_GPIO_A_2_MODE + ES_INIT_GPIO_A_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_2_LEVEL + ES_INIT_GPIO_A_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_2_IRQ_MODE + ES_INIT_GPIO_A_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_3 + + { + ES_PIN_GPIO_A_3 , + +#ifdef ES_INIT_GPIO_A_3_MODE + ES_INIT_GPIO_A_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_3_LEVEL + ES_INIT_GPIO_A_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_3_IRQ_MODE + ES_INIT_GPIO_A_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_4 + + { + ES_PIN_GPIO_A_4 , + +#ifdef ES_INIT_GPIO_A_4_MODE + ES_INIT_GPIO_A_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_4_LEVEL + ES_INIT_GPIO_A_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_4_IRQ_MODE + ES_INIT_GPIO_A_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_5 + + { + ES_PIN_GPIO_A_5 , + +#ifdef ES_INIT_GPIO_A_5_MODE + ES_INIT_GPIO_A_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_5_LEVEL + ES_INIT_GPIO_A_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_5_IRQ_MODE + ES_INIT_GPIO_A_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_6 + + { + ES_PIN_GPIO_A_6 , + +#ifdef ES_INIT_GPIO_A_6_MODE + ES_INIT_GPIO_A_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_6_LEVEL + ES_INIT_GPIO_A_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_6_IRQ_MODE + ES_INIT_GPIO_A_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_7 + + { + ES_PIN_GPIO_A_7 , + +#ifdef ES_INIT_GPIO_A_7_MODE + ES_INIT_GPIO_A_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_7_LEVEL + ES_INIT_GPIO_A_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_7_IRQ_MODE + ES_INIT_GPIO_A_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_8 + + { + ES_PIN_GPIO_A_8 , + +#ifdef ES_INIT_GPIO_A_8_MODE + ES_INIT_GPIO_A_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_8_LEVEL + ES_INIT_GPIO_A_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_8_IRQ_MODE + ES_INIT_GPIO_A_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_9 + + { + ES_PIN_GPIO_A_9 , + +#ifdef ES_INIT_GPIO_A_9_MODE + ES_INIT_GPIO_A_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_9_LEVEL + ES_INIT_GPIO_A_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_9_IRQ_MODE + ES_INIT_GPIO_A_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_10 + + { + ES_PIN_GPIO_A_10 , + +#ifdef ES_INIT_GPIO_A_10_MODE + ES_INIT_GPIO_A_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_10_LEVEL + ES_INIT_GPIO_A_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_10_IRQ_MODE + ES_INIT_GPIO_A_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_11 + + { + ES_PIN_GPIO_A_11 , + +#ifdef ES_INIT_GPIO_A_11_MODE + ES_INIT_GPIO_A_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_11_LEVEL + ES_INIT_GPIO_A_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_11_IRQ_MODE + ES_INIT_GPIO_A_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_12 + + { + ES_PIN_GPIO_A_12 , + +#ifdef ES_INIT_GPIO_A_12_MODE + ES_INIT_GPIO_A_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_12_LEVEL + ES_INIT_GPIO_A_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_12_IRQ_MODE + ES_INIT_GPIO_A_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_13 + + { + ES_PIN_GPIO_A_13 , + +#ifdef ES_INIT_GPIO_A_13_MODE + ES_INIT_GPIO_A_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_13_LEVEL + ES_INIT_GPIO_A_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_13_IRQ_MODE + ES_INIT_GPIO_A_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_14 + + { + ES_PIN_GPIO_A_14 , + +#ifdef ES_INIT_GPIO_A_14_MODE + ES_INIT_GPIO_A_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_14_LEVEL + ES_INIT_GPIO_A_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_14_IRQ_MODE + ES_INIT_GPIO_A_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_15 + + { + ES_PIN_GPIO_A_15 , + +#ifdef ES_INIT_GPIO_A_15_MODE + ES_INIT_GPIO_A_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_15_LEVEL + ES_INIT_GPIO_A_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_15_IRQ_MODE + ES_INIT_GPIO_A_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_0 + + { + ES_PIN_GPIO_B_0 , + +#ifdef ES_INIT_GPIO_B_0_MODE + ES_INIT_GPIO_B_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_0_LEVEL + ES_INIT_GPIO_B_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_0_IRQ_MODE + ES_INIT_GPIO_B_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_1 + + { + ES_PIN_GPIO_B_1 , + +#ifdef ES_INIT_GPIO_B_1_MODE + ES_INIT_GPIO_B_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_1_LEVEL + ES_INIT_GPIO_B_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_1_IRQ_MODE + ES_INIT_GPIO_B_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_2 + + { + ES_PIN_GPIO_B_2 , + +#ifdef ES_INIT_GPIO_B_2_MODE + ES_INIT_GPIO_B_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_2_LEVEL + ES_INIT_GPIO_B_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_2_IRQ_MODE + ES_INIT_GPIO_B_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_3 + + { + ES_PIN_GPIO_B_3 , + +#ifdef ES_INIT_GPIO_B_3_MODE + ES_INIT_GPIO_B_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_3_LEVEL + ES_INIT_GPIO_B_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_3_IRQ_MODE + ES_INIT_GPIO_B_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_4 + + { + ES_PIN_GPIO_B_4 , + +#ifdef ES_INIT_GPIO_B_4_MODE + ES_INIT_GPIO_B_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_4_LEVEL + ES_INIT_GPIO_B_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_4_IRQ_MODE + ES_INIT_GPIO_B_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_5 + + { + ES_PIN_GPIO_B_5 , + +#ifdef ES_INIT_GPIO_B_5_MODE + ES_INIT_GPIO_B_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_5_LEVEL + ES_INIT_GPIO_B_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_5_IRQ_MODE + ES_INIT_GPIO_B_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_6 + + { + ES_PIN_GPIO_B_6 , + +#ifdef ES_INIT_GPIO_B_6_MODE + ES_INIT_GPIO_B_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_6_LEVEL + ES_INIT_GPIO_B_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_6_IRQ_MODE + ES_INIT_GPIO_B_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_7 + + { + ES_PIN_GPIO_B_7 , + +#ifdef ES_INIT_GPIO_B_7_MODE + ES_INIT_GPIO_B_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_7_LEVEL + ES_INIT_GPIO_B_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_7_IRQ_MODE + ES_INIT_GPIO_B_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_8 + + { + ES_PIN_GPIO_B_8 , + +#ifdef ES_INIT_GPIO_B_8_MODE + ES_INIT_GPIO_B_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_8_LEVEL + ES_INIT_GPIO_B_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_8_IRQ_MODE + ES_INIT_GPIO_B_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_9 + + { + ES_PIN_GPIO_B_9 , + +#ifdef ES_INIT_GPIO_B_9_MODE + ES_INIT_GPIO_B_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_9_LEVEL + ES_INIT_GPIO_B_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_9_IRQ_MODE + ES_INIT_GPIO_B_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_10 + + { + ES_PIN_GPIO_B_10 , + +#ifdef ES_INIT_GPIO_B_10_MODE + ES_INIT_GPIO_B_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_10_LEVEL + ES_INIT_GPIO_B_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_10_IRQ_MODE + ES_INIT_GPIO_B_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_11 + + { + ES_PIN_GPIO_B_11 , + +#ifdef ES_INIT_GPIO_B_11_MODE + ES_INIT_GPIO_B_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_11_LEVEL + ES_INIT_GPIO_B_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_11_IRQ_MODE + ES_INIT_GPIO_B_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_12 + + { + ES_PIN_GPIO_B_12 , + +#ifdef ES_INIT_GPIO_B_12_MODE + ES_INIT_GPIO_B_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_12_LEVEL + ES_INIT_GPIO_B_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_12_IRQ_MODE + ES_INIT_GPIO_B_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_13 + + { + ES_PIN_GPIO_B_13 , + +#ifdef ES_INIT_GPIO_B_13_MODE + ES_INIT_GPIO_B_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_13_LEVEL + ES_INIT_GPIO_B_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_13_IRQ_MODE + ES_INIT_GPIO_B_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_14 + + { + ES_PIN_GPIO_B_14 , + +#ifdef ES_INIT_GPIO_B_14_MODE + ES_INIT_GPIO_B_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_14_LEVEL + ES_INIT_GPIO_B_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_14_IRQ_MODE + ES_INIT_GPIO_B_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_15 + + { + ES_PIN_GPIO_B_15 , + +#ifdef ES_INIT_GPIO_B_15_MODE + ES_INIT_GPIO_B_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_15_LEVEL + ES_INIT_GPIO_B_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_15_IRQ_MODE + ES_INIT_GPIO_B_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_0 + + { + ES_PIN_GPIO_C_0 , + +#ifdef ES_INIT_GPIO_C_0_MODE + ES_INIT_GPIO_C_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_0_LEVEL + ES_INIT_GPIO_C_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_0_IRQ_MODE + ES_INIT_GPIO_C_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_1 + + { + ES_PIN_GPIO_C_1 , + +#ifdef ES_INIT_GPIO_C_1_MODE + ES_INIT_GPIO_C_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_1_LEVEL + ES_INIT_GPIO_C_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_1_IRQ_MODE + ES_INIT_GPIO_C_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_2 + + { + ES_PIN_GPIO_C_2 , + +#ifdef ES_INIT_GPIO_C_2_MODE + ES_INIT_GPIO_C_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_2_LEVEL + ES_INIT_GPIO_C_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_2_IRQ_MODE + ES_INIT_GPIO_C_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_3 + + { + ES_PIN_GPIO_C_3 , + +#ifdef ES_INIT_GPIO_C_3_MODE + ES_INIT_GPIO_C_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_3_LEVEL + ES_INIT_GPIO_C_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_3_IRQ_MODE + ES_INIT_GPIO_C_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_4 + + { + ES_PIN_GPIO_C_4 , + +#ifdef ES_INIT_GPIO_C_4_MODE + ES_INIT_GPIO_C_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_4_LEVEL + ES_INIT_GPIO_C_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_4_IRQ_MODE + ES_INIT_GPIO_C_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_5 + + { + ES_PIN_GPIO_C_5 , + +#ifdef ES_INIT_GPIO_C_5_MODE + ES_INIT_GPIO_C_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_5_LEVEL + ES_INIT_GPIO_C_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_5_IRQ_MODE + ES_INIT_GPIO_C_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_6 + + { + ES_PIN_GPIO_C_6 , + +#ifdef ES_INIT_GPIO_C_6_MODE + ES_INIT_GPIO_C_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_6_LEVEL + ES_INIT_GPIO_C_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_6_IRQ_MODE + ES_INIT_GPIO_C_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_7 + + { + ES_PIN_GPIO_C_7 , + +#ifdef ES_INIT_GPIO_C_7_MODE + ES_INIT_GPIO_C_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_7_LEVEL + ES_INIT_GPIO_C_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_7_IRQ_MODE + ES_INIT_GPIO_C_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_8 + + { + ES_PIN_GPIO_C_8 , + +#ifdef ES_INIT_GPIO_C_8_MODE + ES_INIT_GPIO_C_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_8_LEVEL + ES_INIT_GPIO_C_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_8_IRQ_MODE + ES_INIT_GPIO_C_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_9 + + { + ES_PIN_GPIO_C_9 , + +#ifdef ES_INIT_GPIO_C_9_MODE + ES_INIT_GPIO_C_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_9_LEVEL + ES_INIT_GPIO_C_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_9_IRQ_MODE + ES_INIT_GPIO_C_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_10 + + { + ES_PIN_GPIO_C_10 , + +#ifdef ES_INIT_GPIO_C_10_MODE + ES_INIT_GPIO_C_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_10_LEVEL + ES_INIT_GPIO_C_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_10_IRQ_MODE + ES_INIT_GPIO_C_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_11 + + { + ES_PIN_GPIO_C_11 , + +#ifdef ES_INIT_GPIO_C_11_MODE + ES_INIT_GPIO_C_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_11_LEVEL + ES_INIT_GPIO_C_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_11_IRQ_MODE + ES_INIT_GPIO_C_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_12 + + { + ES_PIN_GPIO_C_12 , + +#ifdef ES_INIT_GPIO_C_12_MODE + ES_INIT_GPIO_C_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_12_LEVEL + ES_INIT_GPIO_C_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_12_IRQ_MODE + ES_INIT_GPIO_C_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_13 + + { + ES_PIN_GPIO_C_13 , + +#ifdef ES_INIT_GPIO_C_13_MODE + ES_INIT_GPIO_C_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_13_LEVEL + ES_INIT_GPIO_C_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_13_IRQ_MODE + ES_INIT_GPIO_C_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_14 + + { + ES_PIN_GPIO_C_14 , + +#ifdef ES_INIT_GPIO_C_14_MODE + ES_INIT_GPIO_C_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_14_LEVEL + ES_INIT_GPIO_C_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_14_IRQ_MODE + ES_INIT_GPIO_C_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_15 + + { + ES_PIN_GPIO_C_15 , + +#ifdef ES_INIT_GPIO_C_15_MODE + ES_INIT_GPIO_C_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_15_LEVEL + ES_INIT_GPIO_C_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_15_IRQ_MODE + ES_INIT_GPIO_C_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_0 + + { + ES_PIN_GPIO_D_0 , + +#ifdef ES_INIT_GPIO_D_0_MODE + ES_INIT_GPIO_D_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_0_LEVEL + ES_INIT_GPIO_D_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_0_IRQ_MODE + ES_INIT_GPIO_D_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_1 + + { + ES_PIN_GPIO_D_1 , + +#ifdef ES_INIT_GPIO_D_1_MODE + ES_INIT_GPIO_D_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_1_LEVEL + ES_INIT_GPIO_D_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_1_IRQ_MODE + ES_INIT_GPIO_D_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_2 + + { + ES_PIN_GPIO_D_2 , + +#ifdef ES_INIT_GPIO_D_2_MODE + ES_INIT_GPIO_D_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_2_LEVEL + ES_INIT_GPIO_D_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_2_IRQ_MODE + ES_INIT_GPIO_D_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_3 + + { + ES_PIN_GPIO_D_3 , + +#ifdef ES_INIT_GPIO_D_3_MODE + ES_INIT_GPIO_D_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_3_LEVEL + ES_INIT_GPIO_D_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_3_IRQ_MODE + ES_INIT_GPIO_D_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_4 + + { + ES_PIN_GPIO_D_4 , + +#ifdef ES_INIT_GPIO_D_4_MODE + ES_INIT_GPIO_D_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_4_LEVEL + ES_INIT_GPIO_D_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_4_IRQ_MODE + ES_INIT_GPIO_D_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_5 + + { + ES_PIN_GPIO_D_5 , + +#ifdef ES_INIT_GPIO_D_5_MODE + ES_INIT_GPIO_D_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_5_LEVEL + ES_INIT_GPIO_D_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_5_IRQ_MODE + ES_INIT_GPIO_D_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_6 + + { + ES_PIN_GPIO_D_6 , + +#ifdef ES_INIT_GPIO_D_6_MODE + ES_INIT_GPIO_D_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_6_LEVEL + ES_INIT_GPIO_D_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_6_IRQ_MODE + ES_INIT_GPIO_D_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_7 + + { + ES_PIN_GPIO_D_7 , + +#ifdef ES_INIT_GPIO_D_7_MODE + ES_INIT_GPIO_D_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_7_LEVEL + ES_INIT_GPIO_D_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_7_IRQ_MODE + ES_INIT_GPIO_D_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_8 + + { + ES_PIN_GPIO_D_8 , + +#ifdef ES_INIT_GPIO_D_8_MODE + ES_INIT_GPIO_D_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_8_LEVEL + ES_INIT_GPIO_D_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_8_IRQ_MODE + ES_INIT_GPIO_D_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_9 + + { + ES_PIN_GPIO_D_9 , + +#ifdef ES_INIT_GPIO_D_9_MODE + ES_INIT_GPIO_D_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_9_LEVEL + ES_INIT_GPIO_D_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_9_IRQ_MODE + ES_INIT_GPIO_D_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_10 + + { + ES_PIN_GPIO_D_10 , + +#ifdef ES_INIT_GPIO_D_10_MODE + ES_INIT_GPIO_D_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_10_LEVEL + ES_INIT_GPIO_D_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_10_IRQ_MODE + ES_INIT_GPIO_D_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_11 + + { + ES_PIN_GPIO_D_11 , + +#ifdef ES_INIT_GPIO_D_11_MODE + ES_INIT_GPIO_D_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_11_LEVEL + ES_INIT_GPIO_D_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_11_IRQ_MODE + ES_INIT_GPIO_D_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_12 + + { + ES_PIN_GPIO_D_12 , + +#ifdef ES_INIT_GPIO_D_12_MODE + ES_INIT_GPIO_D_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_12_LEVEL + ES_INIT_GPIO_D_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_12_IRQ_MODE + ES_INIT_GPIO_D_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_13 + + { + ES_PIN_GPIO_D_13 , + +#ifdef ES_INIT_GPIO_D_13_MODE + ES_INIT_GPIO_D_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_13_LEVEL + ES_INIT_GPIO_D_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_13_IRQ_MODE + ES_INIT_GPIO_D_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_14 + + { + ES_PIN_GPIO_D_14 , + +#ifdef ES_INIT_GPIO_D_14_MODE + ES_INIT_GPIO_D_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_14_LEVEL + ES_INIT_GPIO_D_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_14_IRQ_MODE + ES_INIT_GPIO_D_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_15 + + { + ES_PIN_GPIO_D_15 , + +#ifdef ES_INIT_GPIO_D_15_MODE + ES_INIT_GPIO_D_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_15_LEVEL + ES_INIT_GPIO_D_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_15_IRQ_MODE + ES_INIT_GPIO_D_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_0 + + { + ES_PIN_GPIO_E_0 , + +#ifdef ES_INIT_GPIO_E_0_MODE + ES_INIT_GPIO_E_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_0_LEVEL + ES_INIT_GPIO_E_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_0_IRQ_MODE + ES_INIT_GPIO_E_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_1 + + { + ES_PIN_GPIO_E_1 , + +#ifdef ES_INIT_GPIO_E_1_MODE + ES_INIT_GPIO_E_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_1_LEVEL + ES_INIT_GPIO_E_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_1_IRQ_MODE + ES_INIT_GPIO_E_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_2 + + { + ES_PIN_GPIO_E_2 , + +#ifdef ES_INIT_GPIO_E_2_MODE + ES_INIT_GPIO_E_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_2_LEVEL + ES_INIT_GPIO_E_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_2_IRQ_MODE + ES_INIT_GPIO_E_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_3 + + { + ES_PIN_GPIO_E_3 , + +#ifdef ES_INIT_GPIO_E_3_MODE + ES_INIT_GPIO_E_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_3_LEVEL + ES_INIT_GPIO_E_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_3_IRQ_MODE + ES_INIT_GPIO_E_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_4 + + { + ES_PIN_GPIO_E_4 , + +#ifdef ES_INIT_GPIO_E_4_MODE + ES_INIT_GPIO_E_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_4_LEVEL + ES_INIT_GPIO_E_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_4_IRQ_MODE + ES_INIT_GPIO_E_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_5 + + { + ES_PIN_GPIO_E_5 , + +#ifdef ES_INIT_GPIO_E_5_MODE + ES_INIT_GPIO_E_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_5_LEVEL + ES_INIT_GPIO_E_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_5_IRQ_MODE + ES_INIT_GPIO_E_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_6 + + { + ES_PIN_GPIO_E_6 , + +#ifdef ES_INIT_GPIO_E_6_MODE + ES_INIT_GPIO_E_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_6_LEVEL + ES_INIT_GPIO_E_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_6_IRQ_MODE + ES_INIT_GPIO_E_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_7 + + { + ES_PIN_GPIO_E_7 , + +#ifdef ES_INIT_GPIO_E_7_MODE + ES_INIT_GPIO_E_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_7_LEVEL + ES_INIT_GPIO_E_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_7_IRQ_MODE + ES_INIT_GPIO_E_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_8 + + { + ES_PIN_GPIO_E_8 , + +#ifdef ES_INIT_GPIO_E_8_MODE + ES_INIT_GPIO_E_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_8_LEVEL + ES_INIT_GPIO_E_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_8_IRQ_MODE + ES_INIT_GPIO_E_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_9 + + { + ES_PIN_GPIO_E_9 , + +#ifdef ES_INIT_GPIO_E_9_MODE + ES_INIT_GPIO_E_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_9_LEVEL + ES_INIT_GPIO_E_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_9_IRQ_MODE + ES_INIT_GPIO_E_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_10 + + { + ES_PIN_GPIO_E_10 , + +#ifdef ES_INIT_GPIO_E_10_MODE + ES_INIT_GPIO_E_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_10_LEVEL + ES_INIT_GPIO_E_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_10_IRQ_MODE + ES_INIT_GPIO_E_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_11 + + { + ES_PIN_GPIO_E_11 , + +#ifdef ES_INIT_GPIO_E_11_MODE + ES_INIT_GPIO_E_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_11_LEVEL + ES_INIT_GPIO_E_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_11_IRQ_MODE + ES_INIT_GPIO_E_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_12 + + { + ES_PIN_GPIO_E_12 , + +#ifdef ES_INIT_GPIO_E_12_MODE + ES_INIT_GPIO_E_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_12_LEVEL + ES_INIT_GPIO_E_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_12_IRQ_MODE + ES_INIT_GPIO_E_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_13 + + { + ES_PIN_GPIO_E_13 , + +#ifdef ES_INIT_GPIO_E_13_MODE + ES_INIT_GPIO_E_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_13_LEVEL + ES_INIT_GPIO_E_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_13_IRQ_MODE + ES_INIT_GPIO_E_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_14 + + { + ES_PIN_GPIO_E_14 , + +#ifdef ES_INIT_GPIO_E_14_MODE + ES_INIT_GPIO_E_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_14_LEVEL + ES_INIT_GPIO_E_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_14_IRQ_MODE + ES_INIT_GPIO_E_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_15 + + { + ES_PIN_GPIO_E_15 , + +#ifdef ES_INIT_GPIO_E_15_MODE + ES_INIT_GPIO_E_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_15_LEVEL + ES_INIT_GPIO_E_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_15_IRQ_MODE + ES_INIT_GPIO_E_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_0 + + { + ES_PIN_GPIO_F_0 , + +#ifdef ES_INIT_GPIO_F_0_MODE + ES_INIT_GPIO_F_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_0_LEVEL + ES_INIT_GPIO_F_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_0_IRQ_MODE + ES_INIT_GPIO_F_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_1 + + { + ES_PIN_GPIO_F_1 , + +#ifdef ES_INIT_GPIO_F_1_MODE + ES_INIT_GPIO_F_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_1_LEVEL + ES_INIT_GPIO_F_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_1_IRQ_MODE + ES_INIT_GPIO_F_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_2 + + { + ES_PIN_GPIO_F_2 , + +#ifdef ES_INIT_GPIO_F_2_MODE + ES_INIT_GPIO_F_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_2_LEVEL + ES_INIT_GPIO_F_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_2_IRQ_MODE + ES_INIT_GPIO_F_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_3 + + { + ES_PIN_GPIO_F_3 , + +#ifdef ES_INIT_GPIO_F_3_MODE + ES_INIT_GPIO_F_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_3_LEVEL + ES_INIT_GPIO_F_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_3_IRQ_MODE + ES_INIT_GPIO_F_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_4 + + { + ES_PIN_GPIO_F_4 , + +#ifdef ES_INIT_GPIO_F_4_MODE + ES_INIT_GPIO_F_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_4_LEVEL + ES_INIT_GPIO_F_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_4_IRQ_MODE + ES_INIT_GPIO_F_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_5 + + { + ES_PIN_GPIO_F_5 , + +#ifdef ES_INIT_GPIO_F_5_MODE + ES_INIT_GPIO_F_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_5_LEVEL + ES_INIT_GPIO_F_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_5_IRQ_MODE + ES_INIT_GPIO_F_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_6 + + { + ES_PIN_GPIO_F_6 , + +#ifdef ES_INIT_GPIO_F_6_MODE + ES_INIT_GPIO_F_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_6_LEVEL + ES_INIT_GPIO_F_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_6_IRQ_MODE + ES_INIT_GPIO_F_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_7 + + { + ES_PIN_GPIO_F_7 , + +#ifdef ES_INIT_GPIO_F_7_MODE + ES_INIT_GPIO_F_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_7_LEVEL + ES_INIT_GPIO_F_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_7_IRQ_MODE + ES_INIT_GPIO_F_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_8 + + { + ES_PIN_GPIO_F_8 , + +#ifdef ES_INIT_GPIO_F_8_MODE + ES_INIT_GPIO_F_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_8_LEVEL + ES_INIT_GPIO_F_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_8_IRQ_MODE + ES_INIT_GPIO_F_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_9 + + { + ES_PIN_GPIO_F_9 , + +#ifdef ES_INIT_GPIO_F_9_MODE + ES_INIT_GPIO_F_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_9_LEVEL + ES_INIT_GPIO_F_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_9_IRQ_MODE + ES_INIT_GPIO_F_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_10 + + { + ES_PIN_GPIO_F_10 , + +#ifdef ES_INIT_GPIO_F_10_MODE + ES_INIT_GPIO_F_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_10_LEVEL + ES_INIT_GPIO_F_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_10_IRQ_MODE + ES_INIT_GPIO_F_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_11 + + { + ES_PIN_GPIO_F_11 , + +#ifdef ES_INIT_GPIO_F_11_MODE + ES_INIT_GPIO_F_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_11_LEVEL + ES_INIT_GPIO_F_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_11_IRQ_MODE + ES_INIT_GPIO_F_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_12 + + { + ES_PIN_GPIO_F_12 , + +#ifdef ES_INIT_GPIO_F_12_MODE + ES_INIT_GPIO_F_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_12_LEVEL + ES_INIT_GPIO_F_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_12_IRQ_MODE + ES_INIT_GPIO_F_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_13 + + { + ES_PIN_GPIO_F_13 , + +#ifdef ES_INIT_GPIO_F_13_MODE + ES_INIT_GPIO_F_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_13_LEVEL + ES_INIT_GPIO_F_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_13_IRQ_MODE + ES_INIT_GPIO_F_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_14 + + { + ES_PIN_GPIO_F_14 , + +#ifdef ES_INIT_GPIO_F_14_MODE + ES_INIT_GPIO_F_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_14_LEVEL + ES_INIT_GPIO_F_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_14_IRQ_MODE + ES_INIT_GPIO_F_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_15 + + { + ES_PIN_GPIO_F_15 , + +#ifdef ES_INIT_GPIO_F_15_MODE + ES_INIT_GPIO_F_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_15_LEVEL + ES_INIT_GPIO_F_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_15_IRQ_MODE + ES_INIT_GPIO_F_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_0 + + { + ES_PIN_GPIO_G_0 , + +#ifdef ES_INIT_GPIO_G_0_MODE + ES_INIT_GPIO_G_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_0_LEVEL + ES_INIT_GPIO_G_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_0_IRQ_MODE + ES_INIT_GPIO_G_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_1 + + { + ES_PIN_GPIO_G_1 , + +#ifdef ES_INIT_GPIO_G_1_MODE + ES_INIT_GPIO_G_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_1_LEVEL + ES_INIT_GPIO_G_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_1_IRQ_MODE + ES_INIT_GPIO_G_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_2 + + { + ES_PIN_GPIO_G_2 , + +#ifdef ES_INIT_GPIO_G_2_MODE + ES_INIT_GPIO_G_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_2_LEVEL + ES_INIT_GPIO_G_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_2_IRQ_MODE + ES_INIT_GPIO_G_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_3 + + { + ES_PIN_GPIO_G_3 , + +#ifdef ES_INIT_GPIO_G_3_MODE + ES_INIT_GPIO_G_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_3_LEVEL + ES_INIT_GPIO_G_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_3_IRQ_MODE + ES_INIT_GPIO_G_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_4 + + { + ES_PIN_GPIO_G_4 , + +#ifdef ES_INIT_GPIO_G_4_MODE + ES_INIT_GPIO_G_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_4_LEVEL + ES_INIT_GPIO_G_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_4_IRQ_MODE + ES_INIT_GPIO_G_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_5 + + { + ES_PIN_GPIO_G_5 , + +#ifdef ES_INIT_GPIO_G_5_MODE + ES_INIT_GPIO_G_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_5_LEVEL + ES_INIT_GPIO_G_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_5_IRQ_MODE + ES_INIT_GPIO_G_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_6 + + { + ES_PIN_GPIO_G_6 , + +#ifdef ES_INIT_GPIO_G_6_MODE + ES_INIT_GPIO_G_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_6_LEVEL + ES_INIT_GPIO_G_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_6_IRQ_MODE + ES_INIT_GPIO_G_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_7 + + { + ES_PIN_GPIO_G_7 , + +#ifdef ES_INIT_GPIO_G_7_MODE + ES_INIT_GPIO_G_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_7_LEVEL + ES_INIT_GPIO_G_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_7_IRQ_MODE + ES_INIT_GPIO_G_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_8 + + { + ES_PIN_GPIO_G_8 , + +#ifdef ES_INIT_GPIO_G_8_MODE + ES_INIT_GPIO_G_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_8_LEVEL + ES_INIT_GPIO_G_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_8_IRQ_MODE + ES_INIT_GPIO_G_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_9 + + { + ES_PIN_GPIO_G_9 , + +#ifdef ES_INIT_GPIO_G_9_MODE + ES_INIT_GPIO_G_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_9_LEVEL + ES_INIT_GPIO_G_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_9_IRQ_MODE + ES_INIT_GPIO_G_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_10 + + { + ES_PIN_GPIO_G_10 , + +#ifdef ES_INIT_GPIO_G_10_MODE + ES_INIT_GPIO_G_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_10_LEVEL + ES_INIT_GPIO_G_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_10_IRQ_MODE + ES_INIT_GPIO_G_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_11 + + { + ES_PIN_GPIO_G_11 , + +#ifdef ES_INIT_GPIO_G_11_MODE + ES_INIT_GPIO_G_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_11_LEVEL + ES_INIT_GPIO_G_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_11_IRQ_MODE + ES_INIT_GPIO_G_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_12 + + { + ES_PIN_GPIO_G_12 , + +#ifdef ES_INIT_GPIO_G_12_MODE + ES_INIT_GPIO_G_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_12_LEVEL + ES_INIT_GPIO_G_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_12_IRQ_MODE + ES_INIT_GPIO_G_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_13 + + { + ES_PIN_GPIO_G_13 , + +#ifdef ES_INIT_GPIO_G_13_MODE + ES_INIT_GPIO_G_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_13_LEVEL + ES_INIT_GPIO_G_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_13_IRQ_MODE + ES_INIT_GPIO_G_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_14 + + { + ES_PIN_GPIO_G_14 , + +#ifdef ES_INIT_GPIO_G_14_MODE + ES_INIT_GPIO_G_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_14_LEVEL + ES_INIT_GPIO_G_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_14_IRQ_MODE + ES_INIT_GPIO_G_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_15 + + { + ES_PIN_GPIO_G_15 , + +#ifdef ES_INIT_GPIO_G_15_MODE + ES_INIT_GPIO_G_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_15_LEVEL + ES_INIT_GPIO_G_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_15_IRQ_MODE + ES_INIT_GPIO_G_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_0 + + { + ES_PIN_GPIO_H_0 , + +#ifdef ES_INIT_GPIO_H_0_MODE + ES_INIT_GPIO_H_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_0_LEVEL + ES_INIT_GPIO_H_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_0_IRQ_MODE + ES_INIT_GPIO_H_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_1 + + { + ES_PIN_GPIO_H_1 , + +#ifdef ES_INIT_GPIO_H_1_MODE + ES_INIT_GPIO_H_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_1_LEVEL + ES_INIT_GPIO_H_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_1_IRQ_MODE + ES_INIT_GPIO_H_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_2 + + { + ES_PIN_GPIO_H_2 , + +#ifdef ES_INIT_GPIO_H_2_MODE + ES_INIT_GPIO_H_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_2_LEVEL + ES_INIT_GPIO_H_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_2_IRQ_MODE + ES_INIT_GPIO_H_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_3 + + { + ES_PIN_GPIO_H_3 , + +#ifdef ES_INIT_GPIO_H_3_MODE + ES_INIT_GPIO_H_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_3_LEVEL + ES_INIT_GPIO_H_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_3_IRQ_MODE + ES_INIT_GPIO_H_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_4 + + { + ES_PIN_GPIO_H_4 , + +#ifdef ES_INIT_GPIO_H_4_MODE + ES_INIT_GPIO_H_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_4_LEVEL + ES_INIT_GPIO_H_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_4_IRQ_MODE + ES_INIT_GPIO_H_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_5 + + { + ES_PIN_GPIO_H_5 , + +#ifdef ES_INIT_GPIO_H_5_MODE + ES_INIT_GPIO_H_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_5_LEVEL + ES_INIT_GPIO_H_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_5_IRQ_MODE + ES_INIT_GPIO_H_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_6 + + { + ES_PIN_GPIO_H_6 , + +#ifdef ES_INIT_GPIO_H_6_MODE + ES_INIT_GPIO_H_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_6_LEVEL + ES_INIT_GPIO_H_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_6_IRQ_MODE + ES_INIT_GPIO_H_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_7 + + { + ES_PIN_GPIO_H_7 , + +#ifdef ES_INIT_GPIO_H_7_MODE + ES_INIT_GPIO_H_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_7_LEVEL + ES_INIT_GPIO_H_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_7_IRQ_MODE + ES_INIT_GPIO_H_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_8 + + { + ES_PIN_GPIO_H_8 , + +#ifdef ES_INIT_GPIO_H_8_MODE + ES_INIT_GPIO_H_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_8_LEVEL + ES_INIT_GPIO_H_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_8_IRQ_MODE + ES_INIT_GPIO_H_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_9 + + { + ES_PIN_GPIO_H_9 , + +#ifdef ES_INIT_GPIO_H_9_MODE + ES_INIT_GPIO_H_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_9_LEVEL + ES_INIT_GPIO_H_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_9_IRQ_MODE + ES_INIT_GPIO_H_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_10 + + { + ES_PIN_GPIO_H_10 , + +#ifdef ES_INIT_GPIO_H_10_MODE + ES_INIT_GPIO_H_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_10_LEVEL + ES_INIT_GPIO_H_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_10_IRQ_MODE + ES_INIT_GPIO_H_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_11 + + { + ES_PIN_GPIO_H_11 , + +#ifdef ES_INIT_GPIO_H_11_MODE + ES_INIT_GPIO_H_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_11_LEVEL + ES_INIT_GPIO_H_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_11_IRQ_MODE + ES_INIT_GPIO_H_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_12 + + { + ES_PIN_GPIO_H_12 , + +#ifdef ES_INIT_GPIO_H_12_MODE + ES_INIT_GPIO_H_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_12_LEVEL + ES_INIT_GPIO_H_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_12_IRQ_MODE + ES_INIT_GPIO_H_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_13 + + { + ES_PIN_GPIO_H_13 , + +#ifdef ES_INIT_GPIO_H_13_MODE + ES_INIT_GPIO_H_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_13_LEVEL + ES_INIT_GPIO_H_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_13_IRQ_MODE + ES_INIT_GPIO_H_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_14 + + { + ES_PIN_GPIO_H_14 , + +#ifdef ES_INIT_GPIO_H_14_MODE + ES_INIT_GPIO_H_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_14_LEVEL + ES_INIT_GPIO_H_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_14_IRQ_MODE + ES_INIT_GPIO_H_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_15 + + { + ES_PIN_GPIO_H_15 , + +#ifdef ES_INIT_GPIO_H_15_MODE + ES_INIT_GPIO_H_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_15_LEVEL + ES_INIT_GPIO_H_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_15_IRQ_MODE + ES_INIT_GPIO_H_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + + + +}; + +#endif + + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h new file mode 100644 index 0000000000..d829c68f93 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h @@ -0,0 +1,103 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_HWTIMER_H__ +#define __ES_CONF_INFO_HWTIMER_H__ + +#include +#include + +#define ES_C_HWTIMER_MODE_UP HWTIMER_CNTMODE_UP +#define ES_C_HWTIMER_MODE_DOWN HWTIMER_CNTMODE_DW + +/* HWTIMER 配置 */ + +/* codes_main */ + + + +#ifndef ES_AD16C4T0_HWTIMER_MODE +#define ES_AD16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif + +#ifndef ES_GP16C4T0_HWTIMER_MODE +#define ES_GP16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_GP16C2T0_HWTIMER_MODE +#define ES_GP16C2T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_GP1624T1_HWTIMER_MODE +#define ES_GP16C2T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_BS16T0_HWTIMER_MODE +#define ES_BS16T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_BS16T1_HWTIMER_MODE +#define ES_BS16T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_BS16T2_HWTIMER_MODE +#define ES_BS16T2_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_BS16T3_HWTIMER_MODE +#define ES_BS16T3_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif + + + + +#define ES_AD16C4T0_HWTIMER_PRES 1 +#define ES_GP16C4T0_HWTIMER_PRES 1 +#define ES_GP16C2T0_HWTIMER_PRES 1 +#define ES_GP16C2T1_HWTIMER_PRES 1 +#define ES_BS16T0_HWTIMER_PRES 1 +#define ES_BS16T1_HWTIMER_PRES 1 +#define ES_BS16T2_HWTIMER_PRES 1 +#define ES_BS16T3_HWTIMER_PRES 1 + +#ifndef ES_DEVICE_NAME_AD16C4T0_HWTIMER +#define ES_DEVICE_NAME_AD16C4T0_HWTIMER "timer0" +#endif +#ifndef ES_DEVICE_NAME_GP16C4T0_HWTIMER +#define ES_DEVICE_NAME_GP16C4T0_HWTIMER "timer1" +#endif +#ifndef ES_DEVICE_NAME_GP16C2T0_HWTIMER +#define ES_DEVICE_NAME_GP16C2T0_HWTIMER "timer2" +#endif +#ifndef ES_DEVICE_NAME_GP16C2T1_HWTIMER +#define ES_DEVICE_NAME_GP16C2T1_HWTIMER "timer3" +#endif +#ifndef ES_DEVICE_NAME_BS16T0_HWTIMER +#define ES_DEVICE_NAME_BS16T0_HWTIMER "timer4" +#endif +#ifndef ES_DEVICE_NAME_BS16T1_HWTIMER +#define ES_DEVICE_NAME_BS16T1_HWTIMER "timer5" +#endif +#ifndef ES_DEVICE_NAME_BS16T2_HWTIMER +#define ES_DEVICE_NAME_BS16T2_HWTIMER "timer6" +#endif +#ifndef ES_DEVICE_NAME_BS16T3_HWTIMER +#define ES_DEVICE_NAME_BS16T3_HWTIMER "timer7" +#endif + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_i2c.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_i2c.h new file mode 100644 index 0000000000..65310fce01 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_i2c.h @@ -0,0 +1,95 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_I2C_H__ +#define __ES_CONF_INFO_I2C_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + +#define ES_C_I2C_STRETCH I2C_NOSTRETCH_DISABLE +#define ES_C_I2C_NO_STRETCH I2C_NOSTRETCH_ENABLE + +#define ES_C_I2C_GENERALCALL I2C_GENERALCALL_ENABLE +#define ES_C_I2C_NO_GENERALCALL I2C_GENERALCALL_DISABLE + + +#define ES_C_I2C_ADDR_7_MODE I2C_ADDR_7BIT +#define ES_C_I2C_ADDR_10_MODE I2C_ADDR_10BIT + + +/* I2C 配置 */ + + + +/* codes_main */ + + + + + +#ifndef ES_DEVICE_NAME_I2C0 +#define ES_DEVICE_NAME_I2C0 "i2c0" +#endif + +#ifndef ES_DEVICE_NAME_I2C1 +#define ES_DEVICE_NAME_I2C1 "i2c1" +#endif + +#ifndef ES_I2C0_CLK_SPEED +#define ES_I2C0_CLK_SPEED 100000 +#endif +#ifndef ES_I2C0_OWN_ADDR1 +#define ES_I2C0_OWN_ADDR1 0x20 +#endif +#ifndef ES_I2C0_GENERAL_CALL +#define ES_I2C0_GENERAL_CALL ES_C_I2C_NO_GENERALCALL +#endif +#ifndef ES_I2C0_STRETCH +#define ES_I2C0_STRETCH ES_C_I2C_STRETCH +#endif +#ifndef ES_I2C0_ADDR_MODE +#define ES_I2C0_ADDR_MODE ES_C_I2C_ADDR_7_MODE +#endif + +#ifndef ES_I2C1_CLK_SPEED +#define ES_I2C1_CLK_SPEED 100000 +#endif +#ifndef ES_I2C1_OWN_ADDR1 +#define ES_I2C1_OWN_ADDR1 0x20 +#endif +#ifndef ES_I2C1_GENERAL_CALL +#define ES_I2C1_GENERAL_CALL ES_C_I2C_NO_GENERALCALL +#endif +#ifndef ES_I2C1_STRETCH +#define ES_I2C1_STRETCH ES_C_I2C_STRETCH +#endif +#ifndef ES_I2C1_ADDR_MODE +#define ES_I2C1_ADDR_MODE ES_C_I2C_ADDR_7_MODE +#endif + + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_map.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_map.h new file mode 100644 index 0000000000..62274d122f --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_map.h @@ -0,0 +1,2691 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __es_conf_info_map_H__ +#define __es_conf_info_map_H__ + +#include + + +#define __ES_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_PIN_##gpio_index} +#define __ES_PIN_DEFAULT {-1, 0, 0} + +struct pin_index +{ + int index; + GPIO_TypeDef *gpio; + uint32_t pin; +}; + +static const struct pin_index pins[] = +{ + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(2, C, 13), + __ES_PIN(3, C, 14), + __ES_PIN(4, C, 15), + __ES_PIN(5, H, 0), + __ES_PIN(6, H, 1), + __ES_PIN_DEFAULT, + __ES_PIN(8, C, 0), + __ES_PIN(9, C, 1), + __ES_PIN(10, C, 2), + __ES_PIN(11, C, 3), + __ES_PIN(12, H, 3), + __ES_PIN(13, H, 4), + __ES_PIN(14, A, 0), + __ES_PIN(15, A, 1), + __ES_PIN(16, A, 2), + __ES_PIN(17, A, 3), + __ES_PIN(18, F, 0), + __ES_PIN(19, F, 1), + __ES_PIN(20, A, 4), + __ES_PIN(21, A, 5), + __ES_PIN(22, A, 6), + __ES_PIN(23, A, 7), + __ES_PIN(24, C, 4), + __ES_PIN(25, C, 5), + __ES_PIN(26, B, 0), + __ES_PIN(27, B, 1), + __ES_PIN(28, B, 2), + __ES_PIN(29, B, 10), + __ES_PIN(30, B, 11), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(33, B, 12), + __ES_PIN(34, B, 13), + __ES_PIN(35, B, 14), + __ES_PIN(36, B, 15), + __ES_PIN(37, C, 6), + __ES_PIN(38, C, 7), + __ES_PIN(39, C, 8), + __ES_PIN(40, C, 9), + __ES_PIN(41, A, 8), + __ES_PIN(42, A, 9), + __ES_PIN(43, A, 10), + __ES_PIN(44, A, 11), + __ES_PIN(45, A, 12), + __ES_PIN(46, A, 13), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(49, A, 14), + __ES_PIN(50, A, 15), + __ES_PIN(51, C, 10), + __ES_PIN(52, C, 11), + __ES_PIN(53, C, 12), + __ES_PIN(54, D, 2), + __ES_PIN(55, B, 3), + __ES_PIN(56, B, 4), + __ES_PIN(57, B, 5), + __ES_PIN(58, B, 6), + __ES_PIN(59, B, 7), + __ES_PIN(60, H, 2), + __ES_PIN(61, B, 8), + __ES_PIN(62, B, 9), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, +}; + +#define ES_GPIO_ADC_CH0_GPIO GPIOC +#define ES_GPIO_ADC_CH1_GPIO GPIOC +#define ES_GPIO_ADC_CH2_GPIO GPIOC +#define ES_GPIO_ADC_CH3_GPIO GPIOC +#define ES_GPIO_ADC_CH4_GPIO GPIOA +#define ES_GPIO_ADC_CH5_GPIO GPIOA +#define ES_GPIO_ADC_CH6_GPIO GPIOA +#define ES_GPIO_ADC_CH7_GPIO GPIOA +#define ES_GPIO_ADC_CH8_GPIO GPIOA +#define ES_GPIO_ADC_CH9_GPIO GPIOA +#define ES_GPIO_ADC_CH10_GPIO GPIOA +#define ES_GPIO_ADC_CH11_GPIO GPIOA +#define ES_GPIO_ADC_CH12_GPIO GPIOC +#define ES_GPIO_ADC_CH13_GPIO GPIOC +#define ES_GPIO_ADC_CH14_GPIO GPIOB +#define ES_GPIO_ADC_CH15_GPIO GPIOB + +#define ES_GPIO_ADC_CH0_PIN GPIO_PIN_0 +#define ES_GPIO_ADC_CH1_PIN GPIO_PIN_1 +#define ES_GPIO_ADC_CH2_PIN GPIO_PIN_2 +#define ES_GPIO_ADC_CH3_PIN GPIO_PIN_3 +#define ES_GPIO_ADC_CH4_PIN GPIO_PIN_0 +#define ES_GPIO_ADC_CH5_PIN GPIO_PIN_1 +#define ES_GPIO_ADC_CH6_PIN GPIO_PIN_2 +#define ES_GPIO_ADC_CH7_PIN GPIO_PIN_3 +#define ES_GPIO_ADC_CH8_PIN GPIO_PIN_4 +#define ES_GPIO_ADC_CH9_PIN GPIO_PIN_5 +#define ES_GPIO_ADC_CH10_PIN GPIO_PIN_6 +#define ES_GPIO_ADC_CH11_PIN GPIO_PIN_7 +#define ES_GPIO_ADC_CH12_PIN GPIO_PIN_4 +#define ES_GPIO_ADC_CH13_PIN GPIO_PIN_5 +#define ES_GPIO_ADC_CH14_PIN GPIO_PIN_0 +#define ES_GPIO_ADC_CH15_PIN GPIO_PIN_1 + + + + +#define ES_PIN_GPIO_C_13 2 +#define ES_PIN_GPIO_C_14 3 +#define ES_PIN_GPIO_C_15 4 +#define ES_PIN_GPIO_H_0 5 +#define ES_PIN_GPIO_H_1 6 +#define ES_PIN_GPIO_C_0 8 +#define ES_PIN_GPIO_C_1 9 +#define ES_PIN_GPIO_C_2 10 +#define ES_PIN_GPIO_C_3 11 +#define ES_PIN_GPIO_H_3 12 +#define ES_PIN_GPIO_H_4 13 +#define ES_PIN_GPIO_A_0 14 +#define ES_PIN_GPIO_A_1 15 +#define ES_PIN_GPIO_A_2 16 +#define ES_PIN_GPIO_A_3 17 +#define ES_PIN_GPIO_F_0 18 +#define ES_PIN_GPIO_F_1 19 +#define ES_PIN_GPIO_A_4 20 +#define ES_PIN_GPIO_A_5 21 +#define ES_PIN_GPIO_A_6 22 +#define ES_PIN_GPIO_A_7 23 +#define ES_PIN_GPIO_C_4 24 +#define ES_PIN_GPIO_C_5 25 +#define ES_PIN_GPIO_B_0 26 +#define ES_PIN_GPIO_B_1 27 +#define ES_PIN_GPIO_B_2 28 +#define ES_PIN_GPIO_B_10 29 +#define ES_PIN_GPIO_B_11 30 +#define ES_PIN_GPIO_B_12 33 +#define ES_PIN_GPIO_B_13 34 +#define ES_PIN_GPIO_B_14 35 +#define ES_PIN_GPIO_B_15 36 +#define ES_PIN_GPIO_C_6 37 +#define ES_PIN_GPIO_C_7 38 +#define ES_PIN_GPIO_C_8 39 +#define ES_PIN_GPIO_C_9 40 +#define ES_PIN_GPIO_A_8 41 +#define ES_PIN_GPIO_A_9 42 +#define ES_PIN_GPIO_A_10 43 +#define ES_PIN_GPIO_A_11 44 +#define ES_PIN_GPIO_A_12 45 +#define ES_PIN_GPIO_A_13 46 +#define ES_PIN_GPIO_A_14 49 +#define ES_PIN_GPIO_A_15 50 +#define ES_PIN_GPIO_C_10 51 +#define ES_PIN_GPIO_C_11 52 +#define ES_PIN_GPIO_C_12 53 +#define ES_PIN_GPIO_D_2 54 +#define ES_PIN_GPIO_B_3 55 +#define ES_PIN_GPIO_B_4 56 +#define ES_PIN_GPIO_B_5 57 +#define ES_PIN_GPIO_B_6 58 +#define ES_PIN_GPIO_B_7 59 +#define ES_PIN_GPIO_H_2 60 +#define ES_PIN_GPIO_B_8 61 +#define ES_PIN_GPIO_B_9 62 + + + +/* UART_TX */ + + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_B_10 +#define ES_UART0_TX_PIN ES_PIN_GPIO_B_10 +#endif +#endif + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_A_9 +#define ES_UART0_TX_PIN ES_PIN_GPIO_A_9 +#endif +#endif + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOH +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_H_0 +#define ES_UART0_TX_PIN ES_PIN_GPIO_H_0 +#endif +#endif + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_D_8 +#define ES_UART0_TX_PIN ES_PIN_GPIO_D_8 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_C_0 +#define ES_UART1_TX_PIN ES_PIN_GPIO_C_0 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_C_10 +#define ES_UART1_TX_PIN ES_PIN_GPIO_C_10 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_A_13 +#define ES_UART1_TX_PIN ES_PIN_GPIO_A_13 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_D_5 +#define ES_UART1_TX_PIN ES_PIN_GPIO_D_5 +#endif +#endif + +#ifndef ES_UART2_TX_GPIO_FUNC +#define ES_UART2_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_TX_GPIO_PORT +#define ES_UART2_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART2_TX_GPIO_PIN +#define ES_UART2_TX_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART2_TX_PIN +#ifdef ES_PIN_GPIO_C_12 +#define ES_UART2_TX_PIN ES_PIN_GPIO_C_12 +#endif +#endif + +#ifndef ES_UART2_TX_GPIO_FUNC +#define ES_UART2_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_TX_GPIO_PORT +#define ES_UART2_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART2_TX_GPIO_PIN +#define ES_UART2_TX_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART2_TX_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_UART2_TX_PIN ES_PIN_GPIO_B_3 +#endif +#endif + +#ifndef ES_UART2_TX_GPIO_FUNC +#define ES_UART2_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_TX_GPIO_PORT +#define ES_UART2_TX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_TX_GPIO_PIN +#define ES_UART2_TX_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART2_TX_PIN +#ifdef ES_PIN_GPIO_E_2 +#define ES_UART2_TX_PIN ES_PIN_GPIO_E_2 +#endif +#endif + +#ifndef ES_UART3_TX_GPIO_FUNC +#define ES_UART3_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_TX_GPIO_PORT +#define ES_UART3_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART3_TX_GPIO_PIN +#define ES_UART3_TX_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART3_TX_PIN +#ifdef ES_PIN_GPIO_C_4 +#define ES_UART3_TX_PIN ES_PIN_GPIO_C_4 +#endif +#endif + +#ifndef ES_UART3_TX_GPIO_FUNC +#define ES_UART3_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_TX_GPIO_PORT +#define ES_UART3_TX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_TX_GPIO_PIN +#define ES_UART3_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART3_TX_PIN +#ifdef ES_PIN_GPIO_E_10 +#define ES_UART3_TX_PIN ES_PIN_GPIO_E_10 +#endif +#endif + +#ifndef ES_UART3_TX_GPIO_FUNC +#define ES_UART3_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_TX_GPIO_PORT +#define ES_UART3_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART3_TX_GPIO_PIN +#define ES_UART3_TX_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_UART3_TX_PIN +#ifdef ES_PIN_GPIO_D_14 +#define ES_UART3_TX_PIN ES_PIN_GPIO_D_14 +#endif +#endif + + +/* UART_RX */ + + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_A_10 +#define ES_UART0_RX_PIN ES_PIN_GPIO_A_10 +#endif +#endif + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOH +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_H_1 +#define ES_UART0_RX_PIN ES_PIN_GPIO_H_1 +#endif +#endif + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_B_11 +#define ES_UART0_RX_PIN ES_PIN_GPIO_B_11 +#endif +#endif + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_D_9 +#define ES_UART0_RX_PIN ES_PIN_GPIO_D_9 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_C_11 +#define ES_UART1_RX_PIN ES_PIN_GPIO_C_11 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_C_1 +#define ES_UART1_RX_PIN ES_PIN_GPIO_C_1 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_A_14 +#define ES_UART1_RX_PIN ES_PIN_GPIO_A_14 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_D_6 +#define ES_UART1_RX_PIN ES_PIN_GPIO_D_6 +#endif +#endif + +#ifndef ES_UART2_RX_GPIO_FUNC +#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_RX_GPIO_PORT +#define ES_UART2_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART2_RX_GPIO_PIN +#define ES_UART2_RX_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART2_RX_PIN +#ifdef ES_PIN_GPIO_D_2 +#define ES_UART2_RX_PIN ES_PIN_GPIO_D_2 +#endif +#endif + +#ifndef ES_UART2_RX_GPIO_FUNC +#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_RX_GPIO_PORT +#define ES_UART2_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART2_RX_GPIO_PIN +#define ES_UART2_RX_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART2_RX_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_UART2_RX_PIN ES_PIN_GPIO_B_4 +#endif +#endif + +#ifndef ES_UART2_RX_GPIO_FUNC +#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_RX_GPIO_PORT +#define ES_UART2_RX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_RX_GPIO_PIN +#define ES_UART2_RX_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART2_RX_PIN +#ifdef ES_PIN_GPIO_E_3 +#define ES_UART2_RX_PIN ES_PIN_GPIO_E_3 +#endif +#endif + +#ifndef ES_UART3_RX_GPIO_FUNC +#define ES_UART3_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_RX_GPIO_PORT +#define ES_UART3_RX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART3_RX_GPIO_PIN +#define ES_UART3_RX_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART3_RX_PIN +#ifdef ES_PIN_GPIO_C_5 +#define ES_UART3_RX_PIN ES_PIN_GPIO_C_5 +#endif +#endif + +#ifndef ES_UART3_RX_GPIO_FUNC +#define ES_UART3_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_RX_GPIO_PORT +#define ES_UART3_RX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_RX_GPIO_PIN +#define ES_UART3_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART3_RX_PIN +#ifdef ES_PIN_GPIO_E_11 +#define ES_UART3_RX_PIN ES_PIN_GPIO_E_11 +#endif +#endif + +#ifndef ES_UART3_RX_GPIO_FUNC +#define ES_UART3_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_RX_GPIO_PORT +#define ES_UART3_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART3_RX_GPIO_PIN +#define ES_UART3_RX_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART3_RX_PIN +#ifdef ES_PIN_GPIO_D_13 +#define ES_UART3_RX_PIN ES_PIN_GPIO_D_13 +#endif +#endif + + +/* UART_RTS */ + + +#ifndef ES_UART0_RTS_GPIO_FUNC +#define ES_UART0_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_RTS_GPIO_PORT +#define ES_UART0_RTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_RTS_GPIO_PIN +#define ES_UART0_RTS_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_UART0_RTS_PIN +#ifdef ES_PIN_GPIO_B_14 +#define ES_UART0_RTS_PIN ES_PIN_GPIO_B_14 +#endif +#endif + +#ifndef ES_UART0_RTS_GPIO_FUNC +#define ES_UART0_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_RTS_GPIO_PORT +#define ES_UART0_RTS_GPIO_PORT GPIOA +#endif +#ifndef ES_UART0_RTS_GPIO_PIN +#define ES_UART0_RTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART0_RTS_PIN +#ifdef ES_PIN_GPIO_A_12 +#define ES_UART0_RTS_PIN ES_PIN_GPIO_A_12 +#endif +#endif + +#ifndef ES_UART0_RTS_GPIO_FUNC +#define ES_UART0_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_RTS_GPIO_PORT +#define ES_UART0_RTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_RTS_GPIO_PIN +#define ES_UART0_RTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART0_RTS_PIN +#ifdef ES_PIN_GPIO_D_12 +#define ES_UART0_RTS_PIN ES_PIN_GPIO_D_12 +#endif +#endif + +#ifndef ES_UART1_RTS_GPIO_FUNC +#define ES_UART1_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RTS_GPIO_PORT +#define ES_UART1_RTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RTS_GPIO_PIN +#define ES_UART1_RTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART1_RTS_PIN +#ifdef ES_PIN_GPIO_C_12 +#define ES_UART1_RTS_PIN ES_PIN_GPIO_C_12 +#endif +#endif + +#ifndef ES_UART1_RTS_GPIO_FUNC +#define ES_UART1_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RTS_GPIO_PORT +#define ES_UART1_RTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RTS_GPIO_PIN +#define ES_UART1_RTS_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART1_RTS_PIN +#ifdef ES_PIN_GPIO_C_3 +#define ES_UART1_RTS_PIN ES_PIN_GPIO_C_3 +#endif +#endif + +#ifndef ES_UART2_RTS_GPIO_FUNC +#define ES_UART2_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_RTS_GPIO_PORT +#define ES_UART2_RTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART2_RTS_GPIO_PIN +#define ES_UART2_RTS_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART2_RTS_PIN +#ifdef ES_PIN_GPIO_C_10 +#define ES_UART2_RTS_PIN ES_PIN_GPIO_C_10 +#endif +#endif + +#ifndef ES_UART2_RTS_GPIO_FUNC +#define ES_UART2_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_RTS_GPIO_PORT +#define ES_UART2_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_RTS_GPIO_PIN +#define ES_UART2_RTS_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART2_RTS_PIN +#ifdef ES_PIN_GPIO_E_5 +#define ES_UART2_RTS_PIN ES_PIN_GPIO_E_5 +#endif +#endif + +#ifndef ES_UART3_RTS_GPIO_FUNC +#define ES_UART3_RTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_RTS_GPIO_PORT +#define ES_UART3_RTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART3_RTS_GPIO_PIN +#define ES_UART3_RTS_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART3_RTS_PIN +#ifdef ES_PIN_GPIO_B_1 +#define ES_UART3_RTS_PIN ES_PIN_GPIO_B_1 +#endif +#endif + +#ifndef ES_UART3_RTS_GPIO_FUNC +#define ES_UART3_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_RTS_GPIO_PORT +#define ES_UART3_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_RTS_GPIO_PIN +#define ES_UART3_RTS_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART3_RTS_PIN +#ifdef ES_PIN_GPIO_E_13 +#define ES_UART3_RTS_PIN ES_PIN_GPIO_E_13 +#endif +#endif + + +/* UART_CTS */ + + +#ifndef ES_UART0_CTS_GPIO_FUNC +#define ES_UART0_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_CTS_GPIO_PORT +#define ES_UART0_CTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_CTS_GPIO_PIN +#define ES_UART0_CTS_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART0_CTS_PIN +#ifdef ES_PIN_GPIO_B_13 +#define ES_UART0_CTS_PIN ES_PIN_GPIO_B_13 +#endif +#endif + +#ifndef ES_UART0_CTS_GPIO_FUNC +#define ES_UART0_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_CTS_GPIO_PORT +#define ES_UART0_CTS_GPIO_PORT GPIOA +#endif +#ifndef ES_UART0_CTS_GPIO_PIN +#define ES_UART0_CTS_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART0_CTS_PIN +#ifdef ES_PIN_GPIO_A_11 +#define ES_UART0_CTS_PIN ES_PIN_GPIO_A_11 +#endif +#endif + +#ifndef ES_UART0_CTS_GPIO_FUNC +#define ES_UART0_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_CTS_GPIO_PORT +#define ES_UART0_CTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_CTS_GPIO_PIN +#define ES_UART0_CTS_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART0_CTS_PIN +#ifdef ES_PIN_GPIO_D_11 +#define ES_UART0_CTS_PIN ES_PIN_GPIO_D_11 +#endif +#endif + +#ifndef ES_UART1_CTS_GPIO_FUNC +#define ES_UART1_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_CTS_GPIO_PORT +#define ES_UART1_CTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_CTS_GPIO_PIN +#define ES_UART1_CTS_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART1_CTS_PIN +#ifdef ES_PIN_GPIO_C_2 +#define ES_UART1_CTS_PIN ES_PIN_GPIO_C_2 +#endif +#endif + +#ifndef ES_UART1_CTS_GPIO_FUNC +#define ES_UART1_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_CTS_GPIO_PORT +#define ES_UART1_CTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART1_CTS_GPIO_PIN +#define ES_UART1_CTS_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART1_CTS_PIN +#ifdef ES_PIN_GPIO_D_2 +#define ES_UART1_CTS_PIN ES_PIN_GPIO_D_2 +#endif +#endif + +#ifndef ES_UART2_CTS_GPIO_FUNC +#define ES_UART2_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_CTS_GPIO_PORT +#define ES_UART2_CTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART2_CTS_GPIO_PIN +#define ES_UART2_CTS_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART2_CTS_PIN +#ifdef ES_PIN_GPIO_C_11 +#define ES_UART2_CTS_PIN ES_PIN_GPIO_C_11 +#endif +#endif + +#ifndef ES_UART2_CTS_GPIO_FUNC +#define ES_UART2_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_CTS_GPIO_PORT +#define ES_UART2_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_CTS_GPIO_PIN +#define ES_UART2_CTS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART2_CTS_PIN +#ifdef ES_PIN_GPIO_E_4 +#define ES_UART2_CTS_PIN ES_PIN_GPIO_E_4 +#endif +#endif + +#ifndef ES_UART3_CTS_GPIO_FUNC +#define ES_UART3_CTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_CTS_GPIO_PORT +#define ES_UART3_CTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART3_CTS_GPIO_PIN +#define ES_UART3_CTS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART3_CTS_PIN +#ifdef ES_PIN_GPIO_B_0 +#define ES_UART3_CTS_PIN ES_PIN_GPIO_B_0 +#endif +#endif + +#ifndef ES_UART3_CTS_GPIO_FUNC +#define ES_UART3_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_CTS_GPIO_PORT +#define ES_UART3_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_CTS_GPIO_PIN +#define ES_UART3_CTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART3_CTS_PIN +#ifdef ES_PIN_GPIO_E_12 +#define ES_UART3_CTS_PIN ES_PIN_GPIO_E_12 +#endif +#endif + + +/* UART_CK */ + + + +/* USART_TX */ + + +#ifndef ES_USART0_TX_GPIO_FUNC +#define ES_USART0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART0_TX_GPIO_PORT +#define ES_USART0_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_USART0_TX_GPIO_PIN +#define ES_USART0_TX_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_USART0_TX_PIN +#ifdef ES_PIN_GPIO_B_6 +#define ES_USART0_TX_PIN ES_PIN_GPIO_B_6 +#endif +#endif + +#ifndef ES_USART0_TX_GPIO_FUNC +#define ES_USART0_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART0_TX_GPIO_PORT +#define ES_USART0_TX_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_TX_GPIO_PIN +#define ES_USART0_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_USART0_TX_PIN +#ifdef ES_PIN_GPIO_E_10 +#define ES_USART0_TX_PIN ES_PIN_GPIO_E_10 +#endif +#endif + +#ifndef ES_USART1_TX_GPIO_FUNC +#define ES_USART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART1_TX_GPIO_PORT +#define ES_USART1_TX_GPIO_PORT GPIOA +#endif +#ifndef ES_USART1_TX_GPIO_PIN +#define ES_USART1_TX_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_USART1_TX_PIN +#ifdef ES_PIN_GPIO_A_2 +#define ES_USART1_TX_PIN ES_PIN_GPIO_A_2 +#endif +#endif + +#ifndef ES_USART1_TX_GPIO_FUNC +#define ES_USART1_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART1_TX_GPIO_PORT +#define ES_USART1_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_USART1_TX_GPIO_PIN +#define ES_USART1_TX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_USART1_TX_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_USART1_TX_PIN ES_PIN_GPIO_B_9 +#endif +#endif + +#ifndef ES_USART1_TX_GPIO_FUNC +#define ES_USART1_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_USART1_TX_GPIO_PORT +#define ES_USART1_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_USART1_TX_GPIO_PIN +#define ES_USART1_TX_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_USART1_TX_PIN +#ifdef ES_PIN_GPIO_D_5 +#define ES_USART1_TX_PIN ES_PIN_GPIO_D_5 +#endif +#endif + + +/* USART_RX */ + + +#ifndef ES_USART0_RX_GPIO_FUNC +#define ES_USART0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART0_RX_GPIO_PORT +#define ES_USART0_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_USART0_RX_GPIO_PIN +#define ES_USART0_RX_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_USART0_RX_PIN +#ifdef ES_PIN_GPIO_B_7 +#define ES_USART0_RX_PIN ES_PIN_GPIO_B_7 +#endif +#endif + +#ifndef ES_USART0_RX_GPIO_FUNC +#define ES_USART0_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART0_RX_GPIO_PORT +#define ES_USART0_RX_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_RX_GPIO_PIN +#define ES_USART0_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_USART0_RX_PIN +#ifdef ES_PIN_GPIO_E_11 +#define ES_USART0_RX_PIN ES_PIN_GPIO_E_11 +#endif +#endif + +#ifndef ES_USART1_RX_GPIO_FUNC +#define ES_USART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART1_RX_GPIO_PORT +#define ES_USART1_RX_GPIO_PORT GPIOA +#endif +#ifndef ES_USART1_RX_GPIO_PIN +#define ES_USART1_RX_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_USART1_RX_PIN +#ifdef ES_PIN_GPIO_A_3 +#define ES_USART1_RX_PIN ES_PIN_GPIO_A_3 +#endif +#endif + +#ifndef ES_USART1_RX_GPIO_FUNC +#define ES_USART1_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_USART1_RX_GPIO_PORT +#define ES_USART1_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_USART1_RX_GPIO_PIN +#define ES_USART1_RX_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_USART1_RX_PIN +#ifdef ES_PIN_GPIO_D_6 +#define ES_USART1_RX_PIN ES_PIN_GPIO_D_6 +#endif +#endif + +#ifndef ES_USART1_RX_GPIO_FUNC +#define ES_USART1_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART1_RX_GPIO_PORT +#define ES_USART1_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_USART1_RX_GPIO_PIN +#define ES_USART1_RX_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_USART1_RX_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_USART1_RX_PIN ES_PIN_GPIO_B_8 +#endif +#endif + + +/* USART_RTS */ + + +#ifndef ES_USART0_RTS_GPIO_FUNC +#define ES_USART0_RTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART0_RTS_GPIO_PORT +#define ES_USART0_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_RTS_GPIO_PIN +#define ES_USART0_RTS_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_USART0_RTS_PIN +#ifdef ES_PIN_GPIO_E_13 +#define ES_USART0_RTS_PIN ES_PIN_GPIO_E_13 +#endif +#endif + +#ifndef ES_USART0_RTS_GPIO_FUNC +#define ES_USART0_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART0_RTS_GPIO_PORT +#define ES_USART0_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_RTS_GPIO_PIN +#define ES_USART0_RTS_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_USART0_RTS_PIN +#ifdef ES_PIN_GPIO_E_1 +#define ES_USART0_RTS_PIN ES_PIN_GPIO_E_1 +#endif +#endif + +#ifndef ES_USART1_RTS_GPIO_FUNC +#define ES_USART1_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART1_RTS_GPIO_PORT +#define ES_USART1_RTS_GPIO_PORT GPIOA +#endif +#ifndef ES_USART1_RTS_GPIO_PIN +#define ES_USART1_RTS_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_USART1_RTS_PIN +#ifdef ES_PIN_GPIO_A_1 +#define ES_USART1_RTS_PIN ES_PIN_GPIO_A_1 +#endif +#endif + +#ifndef ES_USART1_RTS_GPIO_FUNC +#define ES_USART1_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_USART1_RTS_GPIO_PORT +#define ES_USART1_RTS_GPIO_PORT GPIOD +#endif +#ifndef ES_USART1_RTS_GPIO_PIN +#define ES_USART1_RTS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_USART1_RTS_PIN +#ifdef ES_PIN_GPIO_D_4 +#define ES_USART1_RTS_PIN ES_PIN_GPIO_D_4 +#endif +#endif + + +/* USART_CTS */ + + +#ifndef ES_USART0_CTS_GPIO_FUNC +#define ES_USART0_CTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART0_CTS_GPIO_PORT +#define ES_USART0_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_CTS_GPIO_PIN +#define ES_USART0_CTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_USART0_CTS_PIN +#ifdef ES_PIN_GPIO_E_12 +#define ES_USART0_CTS_PIN ES_PIN_GPIO_E_12 +#endif +#endif + +#ifndef ES_USART0_CTS_GPIO_FUNC +#define ES_USART0_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART0_CTS_GPIO_PORT +#define ES_USART0_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_CTS_GPIO_PIN +#define ES_USART0_CTS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_USART0_CTS_PIN +#ifdef ES_PIN_GPIO_E_0 +#define ES_USART0_CTS_PIN ES_PIN_GPIO_E_0 +#endif +#endif + +#ifndef ES_USART1_CTS_GPIO_FUNC +#define ES_USART1_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART1_CTS_GPIO_PORT +#define ES_USART1_CTS_GPIO_PORT GPIOF +#endif +#ifndef ES_USART1_CTS_GPIO_PIN +#define ES_USART1_CTS_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_USART1_CTS_PIN +#ifdef ES_PIN_GPIO_F_7 +#define ES_USART1_CTS_PIN ES_PIN_GPIO_F_7 +#endif +#endif + +#ifndef ES_USART1_CTS_GPIO_FUNC +#define ES_USART1_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_USART1_CTS_GPIO_PORT +#define ES_USART1_CTS_GPIO_PORT GPIOD +#endif +#ifndef ES_USART1_CTS_GPIO_PIN +#define ES_USART1_CTS_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_USART1_CTS_PIN +#ifdef ES_PIN_GPIO_D_3 +#define ES_USART1_CTS_PIN ES_PIN_GPIO_D_3 +#endif +#endif + + +/* USART_CK */ + + +#ifndef ES_USART0_CK_GPIO_FUNC +#define ES_USART0_CK_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_USART0_CK_GPIO_PORT +#define ES_USART0_CK_GPIO_PORT GPIOA +#endif +#ifndef ES_USART0_CK_GPIO_PIN +#define ES_USART0_CK_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_USART0_CK_PIN +#ifdef ES_PIN_GPIO_A_8 +#define ES_USART0_CK_PIN ES_PIN_GPIO_A_8 +#endif +#endif + +#ifndef ES_USART0_CK_GPIO_FUNC +#define ES_USART0_CK_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART0_CK_GPIO_PORT +#define ES_USART0_CK_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_CK_GPIO_PIN +#define ES_USART0_CK_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_USART0_CK_PIN +#ifdef ES_PIN_GPIO_E_6 +#define ES_USART0_CK_PIN ES_PIN_GPIO_E_6 +#endif +#endif + +#ifndef ES_USART0_CK_GPIO_FUNC +#define ES_USART0_CK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART0_CK_GPIO_PORT +#define ES_USART0_CK_GPIO_PORT GPIOE +#endif +#ifndef ES_USART0_CK_GPIO_PIN +#define ES_USART0_CK_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_USART0_CK_PIN +#ifdef ES_PIN_GPIO_E_7 +#define ES_USART0_CK_PIN ES_PIN_GPIO_E_7 +#endif +#endif + +#ifndef ES_USART1_CK_GPIO_FUNC +#define ES_USART1_CK_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_USART1_CK_GPIO_PORT +#define ES_USART1_CK_GPIO_PORT GPIOA +#endif +#ifndef ES_USART1_CK_GPIO_PIN +#define ES_USART1_CK_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_USART1_CK_PIN +#ifdef ES_PIN_GPIO_A_4 +#define ES_USART1_CK_PIN ES_PIN_GPIO_A_4 +#endif +#endif + +#ifndef ES_USART1_CK_GPIO_FUNC +#define ES_USART1_CK_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_USART1_CK_GPIO_PORT +#define ES_USART1_CK_GPIO_PORT GPIOD +#endif +#ifndef ES_USART1_CK_GPIO_PIN +#define ES_USART1_CK_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_USART1_CK_PIN +#ifdef ES_PIN_GPIO_D_7 +#define ES_USART1_CK_PIN ES_PIN_GPIO_D_7 +#endif +#endif + +#ifndef ES_USART1_CK_GPIO_FUNC +#define ES_USART1_CK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_USART1_CK_GPIO_PORT +#define ES_USART1_CK_GPIO_PORT GPIOE +#endif +#ifndef ES_USART1_CK_GPIO_PIN +#define ES_USART1_CK_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_USART1_CK_PIN +#ifdef ES_PIN_GPIO_E_0 +#define ES_USART1_CK_PIN ES_PIN_GPIO_E_0 +#endif +#endif + + +/* I2C_SCL */ + + +#ifndef ES_I2C0_SCL_GPIO_FUNC +#define ES_I2C0_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SCL_GPIO_PORT +#define ES_I2C0_SCL_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SCL_GPIO_PIN +#define ES_I2C0_SCL_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_I2C0_SCL_PIN +#ifdef ES_PIN_GPIO_B_6 +#define ES_I2C0_SCL_PIN ES_PIN_GPIO_B_6 +#endif +#endif + +#ifndef ES_I2C0_SCL_GPIO_FUNC +#define ES_I2C0_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SCL_GPIO_PORT +#define ES_I2C0_SCL_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SCL_GPIO_PIN +#define ES_I2C0_SCL_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_I2C0_SCL_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_I2C0_SCL_PIN ES_PIN_GPIO_B_8 +#endif +#endif + +#ifndef ES_I2C1_SCL_GPIO_FUNC +#define ES_I2C1_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SCL_GPIO_PORT +#define ES_I2C1_SCL_GPIO_PORT GPIOA +#endif +#ifndef ES_I2C1_SCL_GPIO_PIN +#define ES_I2C1_SCL_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_I2C1_SCL_PIN +#ifdef ES_PIN_GPIO_A_5 +#define ES_I2C1_SCL_PIN ES_PIN_GPIO_A_5 +#endif +#endif + +#ifndef ES_I2C1_SCL_GPIO_FUNC +#define ES_I2C1_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SCL_GPIO_PORT +#define ES_I2C1_SCL_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C1_SCL_GPIO_PIN +#define ES_I2C1_SCL_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_I2C1_SCL_PIN +#ifdef ES_PIN_GPIO_B_10 +#define ES_I2C1_SCL_PIN ES_PIN_GPIO_B_10 +#endif +#endif + +#ifndef ES_I2C1_SCL_GPIO_FUNC +#define ES_I2C1_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SCL_GPIO_PORT +#define ES_I2C1_SCL_GPIO_PORT GPIOH +#endif +#ifndef ES_I2C1_SCL_GPIO_PIN +#define ES_I2C1_SCL_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_I2C1_SCL_PIN +#ifdef ES_PIN_GPIO_H_0 +#define ES_I2C1_SCL_PIN ES_PIN_GPIO_H_0 +#endif +#endif + + +/* I2C_SDA */ + + +#ifndef ES_I2C0_SDA_GPIO_FUNC +#define ES_I2C0_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SDA_GPIO_PORT +#define ES_I2C0_SDA_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SDA_GPIO_PIN +#define ES_I2C0_SDA_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_I2C0_SDA_PIN +#ifdef ES_PIN_GPIO_B_7 +#define ES_I2C0_SDA_PIN ES_PIN_GPIO_B_7 +#endif +#endif + +#ifndef ES_I2C0_SDA_GPIO_FUNC +#define ES_I2C0_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SDA_GPIO_PORT +#define ES_I2C0_SDA_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SDA_GPIO_PIN +#define ES_I2C0_SDA_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_I2C0_SDA_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_I2C0_SDA_PIN ES_PIN_GPIO_B_9 +#endif +#endif + +#ifndef ES_I2C1_SDA_GPIO_FUNC +#define ES_I2C1_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SDA_GPIO_PORT +#define ES_I2C1_SDA_GPIO_PORT GPIOA +#endif +#ifndef ES_I2C1_SDA_GPIO_PIN +#define ES_I2C1_SDA_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_I2C1_SDA_PIN +#ifdef ES_PIN_GPIO_A_6 +#define ES_I2C1_SDA_PIN ES_PIN_GPIO_A_6 +#endif +#endif + +#ifndef ES_I2C1_SDA_GPIO_FUNC +#define ES_I2C1_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SDA_GPIO_PORT +#define ES_I2C1_SDA_GPIO_PORT GPIOH +#endif +#ifndef ES_I2C1_SDA_GPIO_PIN +#define ES_I2C1_SDA_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_I2C1_SDA_PIN +#ifdef ES_PIN_GPIO_H_1 +#define ES_I2C1_SDA_PIN ES_PIN_GPIO_H_1 +#endif +#endif + +#ifndef ES_I2C1_SDA_GPIO_FUNC +#define ES_I2C1_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SDA_GPIO_PORT +#define ES_I2C1_SDA_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C1_SDA_GPIO_PIN +#define ES_I2C1_SDA_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_I2C1_SDA_PIN +#ifdef ES_PIN_GPIO_B_11 +#define ES_I2C1_SDA_PIN ES_PIN_GPIO_B_11 +#endif +#endif + + +/* SPI_MISO */ + + +#ifndef ES_SPI0_MISO_GPIO_FUNC +#define ES_SPI0_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MISO_GPIO_PORT +#define ES_SPI0_MISO_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI0_MISO_GPIO_PIN +#define ES_SPI0_MISO_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI0_MISO_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_SPI0_MISO_PIN ES_PIN_GPIO_B_4 +#endif +#endif + +#ifndef ES_SPI0_MISO_GPIO_FUNC +#define ES_SPI0_MISO_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_MISO_GPIO_PORT +#define ES_SPI0_MISO_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_MISO_GPIO_PIN +#define ES_SPI0_MISO_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_SPI0_MISO_PIN +#ifdef ES_PIN_GPIO_A_6 +#define ES_SPI0_MISO_PIN ES_PIN_GPIO_A_6 +#endif +#endif + +#ifndef ES_SPI0_MISO_GPIO_FUNC +#define ES_SPI0_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MISO_GPIO_PORT +#define ES_SPI0_MISO_GPIO_PORT GPIOD +#endif +#ifndef ES_SPI0_MISO_GPIO_PIN +#define ES_SPI0_MISO_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI0_MISO_PIN +#ifdef ES_PIN_GPIO_D_4 +#define ES_SPI0_MISO_PIN ES_PIN_GPIO_D_4 +#endif +#endif + +#ifndef ES_SPI1_MISO_GPIO_FUNC +#define ES_SPI1_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MISO_GPIO_PORT +#define ES_SPI1_MISO_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_MISO_GPIO_PIN +#define ES_SPI1_MISO_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_SPI1_MISO_PIN +#ifdef ES_PIN_GPIO_C_2 +#define ES_SPI1_MISO_PIN ES_PIN_GPIO_C_2 +#endif +#endif + +#ifndef ES_SPI1_MISO_GPIO_FUNC +#define ES_SPI1_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MISO_GPIO_PORT +#define ES_SPI1_MISO_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_MISO_GPIO_PIN +#define ES_SPI1_MISO_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_SPI1_MISO_PIN +#ifdef ES_PIN_GPIO_B_14 +#define ES_SPI1_MISO_PIN ES_PIN_GPIO_B_14 +#endif +#endif + + +/* SPI_MOSI */ + + +#ifndef ES_SPI0_MOSI_GPIO_FUNC +#define ES_SPI0_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MOSI_GPIO_PORT +#define ES_SPI0_MOSI_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI0_MOSI_GPIO_PIN +#define ES_SPI0_MOSI_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_SPI0_MOSI_PIN +#ifdef ES_PIN_GPIO_B_5 +#define ES_SPI0_MOSI_PIN ES_PIN_GPIO_B_5 +#endif +#endif + +#ifndef ES_SPI0_MOSI_GPIO_FUNC +#define ES_SPI0_MOSI_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_MOSI_GPIO_PORT +#define ES_SPI0_MOSI_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_MOSI_GPIO_PIN +#define ES_SPI0_MOSI_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_SPI0_MOSI_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_SPI0_MOSI_PIN ES_PIN_GPIO_A_7 +#endif +#endif + + +#ifndef ES_SPI0_MOSI_GPIO_FUNC +#define ES_SPI0_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MOSI_GPIO_PORT +#define ES_SPI0_MOSI_GPIO_PORT GPIOD +#endif +#ifndef ES_SPI0_MOSI_GPIO_PIN +#define ES_SPI0_MOSI_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_SPI0_MOSI_PIN +#ifdef ES_PIN_GPIO_D_7 +#define ES_SPI0_MOSI_PIN ES_PIN_GPIO_D_7 +#endif +#endif + +#ifndef ES_SPI1_MOSI_GPIO_FUNC +#define ES_SPI1_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MOSI_GPIO_PORT +#define ES_SPI1_MOSI_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_MOSI_GPIO_PIN +#define ES_SPI1_MOSI_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_SPI1_MOSI_PIN +#ifdef ES_PIN_GPIO_B_15 +#define ES_SPI1_MOSI_PIN ES_PIN_GPIO_B_15 +#endif +#endif + +#ifndef ES_SPI1_MOSI_GPIO_FUNC +#define ES_SPI1_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MOSI_GPIO_PORT +#define ES_SPI1_MOSI_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_MOSI_GPIO_PIN +#define ES_SPI1_MOSI_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI1_MOSI_PIN +#ifdef ES_PIN_GPIO_C_3 +#define ES_SPI1_MOSI_PIN ES_PIN_GPIO_C_3 +#endif +#endif + + +/* SPI_SCK */ + + +#ifndef ES_SPI0_SCK_GPIO_FUNC +#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_SCK_GPIO_PORT +#define ES_SPI0_SCK_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI0_SCK_GPIO_PIN +#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI0_SCK_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_SPI0_SCK_PIN ES_PIN_GPIO_B_3 +#endif +#endif + +#ifndef ES_SPI0_SCK_GPIO_FUNC +#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_SCK_GPIO_PORT +#define ES_SPI0_SCK_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_SCK_GPIO_PIN +#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_SPI0_SCK_PIN +#ifdef ES_PIN_GPIO_A_5 +#define ES_SPI0_SCK_PIN ES_PIN_GPIO_A_5 +#endif +#endif + +#ifndef ES_SPI0_SCK_GPIO_FUNC +#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_SCK_GPIO_PORT +#define ES_SPI0_SCK_GPIO_PORT GPIOD +#endif +#ifndef ES_SPI0_SCK_GPIO_PIN +#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI0_SCK_PIN +#ifdef ES_PIN_GPIO_D_3 +#define ES_SPI0_SCK_PIN ES_PIN_GPIO_D_3 +#endif +#endif + +#ifndef ES_SPI1_SCK_GPIO_FUNC +#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_SCK_GPIO_PORT +#define ES_SPI1_SCK_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_SCK_GPIO_PIN +#define ES_SPI1_SCK_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_SPI1_SCK_PIN +#ifdef ES_PIN_GPIO_B_13 +#define ES_SPI1_SCK_PIN ES_PIN_GPIO_B_13 +#endif +#endif + +#ifndef ES_SPI1_SCK_GPIO_FUNC +#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_SCK_GPIO_PORT +#define ES_SPI1_SCK_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_SCK_GPIO_PIN +#define ES_SPI1_SCK_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_SPI1_SCK_PIN +#ifdef ES_PIN_GPIO_C_1 +#define ES_SPI1_SCK_PIN ES_PIN_GPIO_C_1 +#endif +#endif + + +/* SPI_NSS */ + + +#ifndef ES_SPI0_NSS_GPIO_FUNC +#define ES_SPI0_NSS_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_NSS_GPIO_PORT +#define ES_SPI0_NSS_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_NSS_GPIO_PIN +#define ES_SPI0_NSS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI0_NSS_PIN +#ifdef ES_PIN_GPIO_A_4 +#define ES_SPI0_NSS_PIN ES_PIN_GPIO_A_4 +#endif +#endif + +#ifndef ES_SPI0_NSS_GPIO_FUNC +#define ES_SPI0_NSS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_NSS_GPIO_PORT +#define ES_SPI0_NSS_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_NSS_GPIO_PIN +#define ES_SPI0_NSS_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_SPI0_NSS_PIN +#ifdef ES_PIN_GPIO_A_15 +#define ES_SPI0_NSS_PIN ES_PIN_GPIO_A_15 +#endif +#endif + +#ifndef ES_SPI1_NSS_GPIO_FUNC +#define ES_SPI1_NSS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_NSS_GPIO_PORT +#define ES_SPI1_NSS_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_NSS_GPIO_PIN +#define ES_SPI1_NSS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_SPI1_NSS_PIN +#ifdef ES_PIN_GPIO_C_0 +#define ES_SPI1_NSS_PIN ES_PIN_GPIO_C_0 +#endif +#endif + +#ifndef ES_SPI1_NSS_GPIO_FUNC +#define ES_SPI1_NSS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_NSS_GPIO_PORT +#define ES_SPI1_NSS_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_NSS_GPIO_PIN +#define ES_SPI1_NSS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_SPI1_NSS_PIN +#ifdef ES_PIN_GPIO_B_12 +#define ES_SPI1_NSS_PIN ES_PIN_GPIO_B_12 +#endif +#endif + + +/* CAN_TX */ + + +#ifndef ES_CAN0_TX_GPIO_FUNC +#define ES_CAN0_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_CAN0_TX_GPIO_PORT +#define ES_CAN0_TX_GPIO_PORT GPIOA +#endif +#ifndef ES_CAN0_TX_GPIO_PIN +#define ES_CAN0_TX_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_CAN0_TX_PIN +#ifdef ES_PIN_GPIO_A_12 +#define ES_CAN0_TX_PIN ES_PIN_GPIO_A_12 +#endif +#endif + +#ifndef ES_CAN0_TX_GPIO_FUNC +#define ES_CAN0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_CAN0_TX_GPIO_PORT +#define ES_CAN0_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_CAN0_TX_GPIO_PIN +#define ES_CAN0_TX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_CAN0_TX_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_CAN0_TX_PIN ES_PIN_GPIO_B_9 +#endif +#endif + + +/* CAN_RX */ + + +#ifndef ES_CAN0_RX_GPIO_FUNC +#define ES_CAN0_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_CAN0_RX_GPIO_PORT +#define ES_CAN0_RX_GPIO_PORT GPIOA +#endif +#ifndef ES_CAN0_RX_GPIO_PIN +#define ES_CAN0_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_CAN0_RX_PIN +#ifdef ES_PIN_GPIO_A_11 +#define ES_CAN0_RX_PIN ES_PIN_GPIO_A_11 +#endif +#endif + +#ifndef ES_CAN0_RX_GPIO_FUNC +#define ES_CAN0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_CAN0_RX_GPIO_PORT +#define ES_CAN0_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_CAN0_RX_GPIO_PIN +#define ES_CAN0_RX_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_CAN0_RX_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_CAN0_RX_PIN ES_PIN_GPIO_B_8 +#endif +#endif + + +/* AD16C4T_CH1 */ + + +#ifndef ES_AD16C4T0_CH1_GPIO_FUNC +#define ES_AD16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PORT +#define ES_AD16C4T0_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PIN +#define ES_AD16C4T0_CH1_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_AD16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_A_8 +#define ES_AD16C4T0_CH1_PIN ES_PIN_GPIO_A_8 +#endif +#endif + +#ifndef ES_AD16C4T0_CH1_GPIO_FUNC +#define ES_AD16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PORT +#define ES_AD16C4T0_CH1_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PIN +#define ES_AD16C4T0_CH1_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_AD16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_E_9 +#define ES_AD16C4T0_CH1_PIN ES_PIN_GPIO_E_9 +#endif +#endif + + +/* AD16C4T_CH2 */ + + +#ifndef ES_AD16C4T0_CH2_GPIO_FUNC +#define ES_AD16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2_GPIO_PORT +#define ES_AD16C4T0_CH2_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_CH2_GPIO_PIN +#define ES_AD16C4T0_CH2_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_AD16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_A_9 +#define ES_AD16C4T0_CH2_PIN ES_PIN_GPIO_A_9 +#endif +#endif + +#ifndef ES_AD16C4T0_CH2_GPIO_FUNC +#define ES_AD16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2_GPIO_PORT +#define ES_AD16C4T0_CH2_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH2_GPIO_PIN +#define ES_AD16C4T0_CH2_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_AD16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_E_11 +#define ES_AD16C4T0_CH2_PIN ES_PIN_GPIO_E_11 +#endif +#endif + + +/* AD16C4T_CH3 */ + + +#ifndef ES_AD16C4T0_CH3_GPIO_FUNC +#define ES_AD16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3_GPIO_PORT +#define ES_AD16C4T0_CH3_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_CH3_GPIO_PIN +#define ES_AD16C4T0_CH3_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_AD16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_A_10 +#define ES_AD16C4T0_CH3_PIN ES_PIN_GPIO_A_10 +#endif +#endif + +#ifndef ES_AD16C4T0_CH3_GPIO_FUNC +#define ES_AD16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3_GPIO_PORT +#define ES_AD16C4T0_CH3_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH3_GPIO_PIN +#define ES_AD16C4T0_CH3_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_AD16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_E_13 +#define ES_AD16C4T0_CH3_PIN ES_PIN_GPIO_E_13 +#endif +#endif + + +/* AD16C4T_CH4 */ + + +#ifndef ES_AD16C4T0_CH4_GPIO_FUNC +#define ES_AD16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH4_GPIO_PORT +#define ES_AD16C4T0_CH4_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH4_GPIO_PIN +#define ES_AD16C4T0_CH4_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_AD16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_E_14 +#define ES_AD16C4T0_CH4_PIN ES_PIN_GPIO_E_14 +#endif +#endif + +#ifndef ES_AD16C4T0_CH4_GPIO_FUNC +#define ES_AD16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH4_GPIO_PORT +#define ES_AD16C4T0_CH4_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_CH4_GPIO_PIN +#define ES_AD16C4T0_CH4_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_AD16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_A_11 +#define ES_AD16C4T0_CH4_PIN ES_PIN_GPIO_A_11 +#endif +#endif + + +/* AD16C4T_CH1N */ + + +#ifndef ES_AD16C4T0_CH1N_GPIO_FUNC +#define ES_AD16C4T0_CH1N_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PORT +#define ES_AD16C4T0_CH1N_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PIN +#define ES_AD16C4T0_CH1N_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_AD16C4T0_CH1N_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_AD16C4T0_CH1N_PIN ES_PIN_GPIO_A_7 +#endif +#endif + +#ifndef ES_AD16C4T0_CH1N_GPIO_FUNC +#define ES_AD16C4T0_CH1N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PORT +#define ES_AD16C4T0_CH1N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PIN +#define ES_AD16C4T0_CH1N_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_AD16C4T0_CH1N_PIN +#ifdef ES_PIN_GPIO_B_13 +#define ES_AD16C4T0_CH1N_PIN ES_PIN_GPIO_B_13 +#endif +#endif + +#ifndef ES_AD16C4T0_CH1N_GPIO_FUNC +#define ES_AD16C4T0_CH1N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PORT +#define ES_AD16C4T0_CH1N_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PIN +#define ES_AD16C4T0_CH1N_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_AD16C4T0_CH1N_PIN +#ifdef ES_PIN_GPIO_E_8 +#define ES_AD16C4T0_CH1N_PIN ES_PIN_GPIO_E_8 +#endif +#endif + + +/* AD16C4T_CH2N */ + + +#ifndef ES_AD16C4T0_CH2N_GPIO_FUNC +#define ES_AD16C4T0_CH2N_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PORT +#define ES_AD16C4T0_CH2N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PIN +#define ES_AD16C4T0_CH2N_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_AD16C4T0_CH2N_PIN +#ifdef ES_PIN_GPIO_B_0 +#define ES_AD16C4T0_CH2N_PIN ES_PIN_GPIO_B_0 +#endif +#endif + +#ifndef ES_AD16C4T0_CH2N_GPIO_FUNC +#define ES_AD16C4T0_CH2N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PORT +#define ES_AD16C4T0_CH2N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PIN +#define ES_AD16C4T0_CH2N_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_AD16C4T0_CH2N_PIN +#ifdef ES_PIN_GPIO_B_14 +#define ES_AD16C4T0_CH2N_PIN ES_PIN_GPIO_B_14 +#endif +#endif + +#ifndef ES_AD16C4T0_CH2N_GPIO_FUNC +#define ES_AD16C4T0_CH2N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PORT +#define ES_AD16C4T0_CH2N_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PIN +#define ES_AD16C4T0_CH2N_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_AD16C4T0_CH2N_PIN +#ifdef ES_PIN_GPIO_E_10 +#define ES_AD16C4T0_CH2N_PIN ES_PIN_GPIO_E_10 +#endif +#endif + + +/* AD16C4T_CH3N */ + + +#ifndef ES_AD16C4T0_CH3N_GPIO_FUNC +#define ES_AD16C4T0_CH3N_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PORT +#define ES_AD16C4T0_CH3N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PIN +#define ES_AD16C4T0_CH3N_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_AD16C4T0_CH3N_PIN +#ifdef ES_PIN_GPIO_B_1 +#define ES_AD16C4T0_CH3N_PIN ES_PIN_GPIO_B_1 +#endif +#endif + +#ifndef ES_AD16C4T0_CH3N_GPIO_FUNC +#define ES_AD16C4T0_CH3N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PORT +#define ES_AD16C4T0_CH3N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PIN +#define ES_AD16C4T0_CH3N_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_AD16C4T0_CH3N_PIN +#ifdef ES_PIN_GPIO_B_15 +#define ES_AD16C4T0_CH3N_PIN ES_PIN_GPIO_B_15 +#endif +#endif + +#ifndef ES_AD16C4T0_CH3N_GPIO_FUNC +#define ES_AD16C4T0_CH3N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PORT +#define ES_AD16C4T0_CH3N_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PIN +#define ES_AD16C4T0_CH3N_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_AD16C4T0_CH3N_PIN +#ifdef ES_PIN_GPIO_E_12 +#define ES_AD16C4T0_CH3N_PIN ES_PIN_GPIO_E_12 +#endif +#endif + + +/* AD16C4T_CH4N */ + + + +/* AD16C4T_ET */ + + +#ifndef ES_AD16C4T0_ET_GPIO_FUNC +#define ES_AD16C4T0_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_ET_GPIO_PORT +#define ES_AD16C4T0_ET_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_ET_GPIO_PIN +#define ES_AD16C4T0_ET_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_AD16C4T0_ET_PIN +#ifdef ES_PIN_GPIO_A_12 +#define ES_AD16C4T0_ET_PIN ES_PIN_GPIO_A_12 +#endif +#endif + +#ifndef ES_AD16C4T0_ET_GPIO_FUNC +#define ES_AD16C4T0_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_ET_GPIO_PORT +#define ES_AD16C4T0_ET_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_ET_GPIO_PIN +#define ES_AD16C4T0_ET_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_AD16C4T0_ET_PIN +#ifdef ES_PIN_GPIO_E_7 +#define ES_AD16C4T0_ET_PIN ES_PIN_GPIO_E_7 +#endif +#endif + + +/* GP32C4T_CH1 */ + + + +/* GP32C4T_CH2 */ + + + +/* GP32C4T_CH3 */ + + + +/* GP32C4T_CH4 */ + + + +/* GP32C4T_ET */ + + + +/* GP16C4T_CH1 */ + + +#ifndef ES_GP16C4T0_CH1_GPIO_FUNC +#define ES_GP16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PORT +#define ES_GP16C4T0_CH1_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PIN +#define ES_GP16C4T0_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_GP16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_B_6 +#define ES_GP16C4T0_CH1_PIN ES_PIN_GPIO_B_6 +#endif +#endif + +#ifndef ES_GP16C4T0_CH1_GPIO_FUNC +#define ES_GP16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PORT +#define ES_GP16C4T0_CH1_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PIN +#define ES_GP16C4T0_CH1_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_GP16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_D_12 +#define ES_GP16C4T0_CH1_PIN ES_PIN_GPIO_D_12 +#endif +#endif + + +/* GP16C4T_CH2 */ + + +#ifndef ES_GP16C4T0_CH2_GPIO_FUNC +#define ES_GP16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PORT +#define ES_GP16C4T0_CH2_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PIN +#define ES_GP16C4T0_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_B_7 +#define ES_GP16C4T0_CH2_PIN ES_PIN_GPIO_B_7 +#endif +#endif + +#ifndef ES_GP16C4T0_CH2_GPIO_FUNC +#define ES_GP16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PORT +#define ES_GP16C4T0_CH2_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PIN +#define ES_GP16C4T0_CH2_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_GP16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_D_13 +#define ES_GP16C4T0_CH2_PIN ES_PIN_GPIO_D_13 +#endif +#endif + + +/* GP16C4T_CH3 */ + + +#ifndef ES_GP16C4T0_CH3_GPIO_FUNC +#define ES_GP16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PORT +#define ES_GP16C4T0_CH3_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PIN +#define ES_GP16C4T0_CH3_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_GP16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_D_14 +#define ES_GP16C4T0_CH3_PIN ES_PIN_GPIO_D_14 +#endif +#endif + +#ifndef ES_GP16C4T0_CH3_GPIO_FUNC +#define ES_GP16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PORT +#define ES_GP16C4T0_CH3_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PIN +#define ES_GP16C4T0_CH3_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_GP16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_GP16C4T0_CH3_PIN ES_PIN_GPIO_B_8 +#endif +#endif + + +/* GP16C4T_CH4 */ + + +#ifndef ES_GP16C4T0_CH4_GPIO_FUNC +#define ES_GP16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PORT +#define ES_GP16C4T0_CH4_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PIN +#define ES_GP16C4T0_CH4_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_GP16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_GP16C4T0_CH4_PIN ES_PIN_GPIO_B_9 +#endif +#endif + +#ifndef ES_GP16C4T0_CH4_GPIO_FUNC +#define ES_GP16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PORT +#define ES_GP16C4T0_CH4_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PIN +#define ES_GP16C4T0_CH4_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_GP16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_D_15 +#define ES_GP16C4T0_CH4_PIN ES_PIN_GPIO_D_15 +#endif +#endif + + +/* GP16C4T_ET */ + + +#ifndef ES_GP16C4T0_ET_GPIO_FUNC +#define ES_GP16C4T0_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_ET_GPIO_PORT +#define ES_GP16C4T0_ET_GPIO_PORT GPIOE +#endif +#ifndef ES_GP16C4T0_ET_GPIO_PIN +#define ES_GP16C4T0_ET_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_GP16C4T0_ET_PIN +#ifdef ES_PIN_GPIO_E_0 +#define ES_GP16C4T0_ET_PIN ES_PIN_GPIO_E_0 +#endif +#endif + + +/* GP16C2T_CH1 */ + + +#ifndef ES_GP16C2T0_CH1_GPIO_FUNC +#define ES_GP16C2T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C2T0_CH1_GPIO_PORT +#define ES_GP16C2T0_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C2T0_CH1_GPIO_PIN +#define ES_GP16C2T0_CH1_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_GP16C2T0_CH1_PIN +#ifdef ES_PIN_GPIO_A_15 +#define ES_GP16C2T0_CH1_PIN ES_PIN_GPIO_A_15 +#endif +#endif + +#ifndef ES_GP16C2T0_CH1_GPIO_FUNC +#define ES_GP16C2T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C2T0_CH1_GPIO_PORT +#define ES_GP16C2T0_CH1_GPIO_PORT GPIOF +#endif +#ifndef ES_GP16C2T0_CH1_GPIO_PIN +#define ES_GP16C2T0_CH1_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP16C2T0_CH1_PIN +#ifdef ES_PIN_GPIO_F_7 +#define ES_GP16C2T0_CH1_PIN ES_PIN_GPIO_F_7 +#endif +#endif + +#ifndef ES_GP16C2T1_CH1_GPIO_FUNC +#define ES_GP16C2T1_CH1_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP16C2T1_CH1_GPIO_PORT +#define ES_GP16C2T1_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C2T1_CH1_GPIO_PIN +#define ES_GP16C2T1_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_GP16C2T1_CH1_PIN +#ifdef ES_PIN_GPIO_A_6 +#define ES_GP16C2T1_CH1_PIN ES_PIN_GPIO_A_6 +#endif +#endif + +#ifndef ES_GP16C2T1_CH1_GPIO_FUNC +#define ES_GP16C2T1_CH1_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP16C2T1_CH1_GPIO_PORT +#define ES_GP16C2T1_CH1_GPIO_PORT GPIOC +#endif +#ifndef ES_GP16C2T1_CH1_GPIO_PIN +#define ES_GP16C2T1_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_GP16C2T1_CH1_PIN +#ifdef ES_PIN_GPIO_C_6 +#define ES_GP16C2T1_CH1_PIN ES_PIN_GPIO_C_6 +#endif +#endif + +#ifndef ES_GP16C2T1_CH1_GPIO_FUNC +#define ES_GP16C2T1_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C2T1_CH1_GPIO_PORT +#define ES_GP16C2T1_CH1_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C2T1_CH1_GPIO_PIN +#define ES_GP16C2T1_CH1_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_GP16C2T1_CH1_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_GP16C2T1_CH1_PIN ES_PIN_GPIO_B_4 +#endif +#endif + + +/* GP16C2T_CH2 */ + + +#ifndef ES_GP16C2T0_CH2_GPIO_FUNC +#define ES_GP16C2T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C2T0_CH2_GPIO_PORT +#define ES_GP16C2T0_CH2_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C2T0_CH2_GPIO_PIN +#define ES_GP16C2T0_CH2_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_GP16C2T0_CH2_PIN +#ifdef ES_PIN_GPIO_A_1 +#define ES_GP16C2T0_CH2_PIN ES_PIN_GPIO_A_1 +#endif +#endif + +#ifndef ES_GP16C2T0_CH2_GPIO_FUNC +#define ES_GP16C2T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C2T0_CH2_GPIO_PORT +#define ES_GP16C2T0_CH2_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C2T0_CH2_GPIO_PIN +#define ES_GP16C2T0_CH2_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_GP16C2T0_CH2_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_GP16C2T0_CH2_PIN ES_PIN_GPIO_B_3 +#endif +#endif + +#ifndef ES_GP16C2T1_CH2_GPIO_FUNC +#define ES_GP16C2T1_CH2_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP16C2T1_CH2_GPIO_PORT +#define ES_GP16C2T1_CH2_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C2T1_CH2_GPIO_PIN +#define ES_GP16C2T1_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP16C2T1_CH2_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_GP16C2T1_CH2_PIN ES_PIN_GPIO_A_7 +#endif +#endif + +#ifndef ES_GP16C2T1_CH2_GPIO_FUNC +#define ES_GP16C2T1_CH2_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP16C2T1_CH2_GPIO_PORT +#define ES_GP16C2T1_CH2_GPIO_PORT GPIOC +#endif +#ifndef ES_GP16C2T1_CH2_GPIO_PIN +#define ES_GP16C2T1_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP16C2T1_CH2_PIN +#ifdef ES_PIN_GPIO_C_7 +#define ES_GP16C2T1_CH2_PIN ES_PIN_GPIO_C_7 +#endif +#endif + +#ifndef ES_GP16C2T1_CH2_GPIO_FUNC +#define ES_GP16C2T1_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C2T1_CH2_GPIO_PORT +#define ES_GP16C2T1_CH2_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C2T1_CH2_GPIO_PIN +#define ES_GP16C2T1_CH2_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_GP16C2T1_CH2_PIN +#ifdef ES_PIN_GPIO_B_5 +#define ES_GP16C2T1_CH2_PIN ES_PIN_GPIO_B_5 +#endif +#endif + + +/* GP16C2T_CH1N */ + + +#ifndef ES_GP16C2T0_CH1N_GPIO_FUNC +#define ES_GP16C2T0_CH1N_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_GP16C2T0_CH1N_GPIO_PORT +#define ES_GP16C2T0_CH1N_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C2T0_CH1N_GPIO_PIN +#define ES_GP16C2T0_CH1N_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_GP16C2T0_CH1N_PIN +#ifdef ES_PIN_GPIO_A_2 +#define ES_GP16C2T0_CH1N_PIN ES_PIN_GPIO_A_2 +#endif +#endif + +#ifndef ES_GP16C2T0_CH1N_GPIO_FUNC +#define ES_GP16C2T0_CH1N_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_GP16C2T0_CH1N_GPIO_PORT +#define ES_GP16C2T0_CH1N_GPIO_PORT GPIOC +#endif +#ifndef ES_GP16C2T0_CH1N_GPIO_PIN +#define ES_GP16C2T0_CH1N_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_GP16C2T0_CH1N_PIN +#ifdef ES_PIN_GPIO_C_10 +#define ES_GP16C2T0_CH1N_PIN ES_PIN_GPIO_C_10 +#endif +#endif + +#ifndef ES_GP16C2T1_CH1N_GPIO_FUNC +#define ES_GP16C2T1_CH1N_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_GP16C2T1_CH1N_GPIO_PORT +#define ES_GP16C2T1_CH1N_GPIO_PORT GPIOC +#endif +#ifndef ES_GP16C2T1_CH1N_GPIO_PIN +#define ES_GP16C2T1_CH1N_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_GP16C2T1_CH1N_PIN +#ifdef ES_PIN_GPIO_C_4 +#define ES_GP16C2T1_CH1N_PIN ES_PIN_GPIO_C_4 +#endif +#endif + +#ifndef ES_GP16C2T1_CH1N_GPIO_FUNC +#define ES_GP16C2T1_CH1N_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_GP16C2T1_CH1N_GPIO_PORT +#define ES_GP16C2T1_CH1N_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C2T1_CH1N_GPIO_PIN +#define ES_GP16C2T1_CH1N_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_GP16C2T1_CH1N_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_GP16C2T1_CH1N_PIN ES_PIN_GPIO_B_8 +#endif +#endif + + +/* GP16C2T_CH2N */ + + + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_pm.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_pm.h new file mode 100644 index 0000000000..580268312c --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_pm.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_PM_H__ +#define __ES_CONF_INFO_PM_H__ + +#include +#include + +#define ES_PMU_SAVE_LOAD_UART + +/* PM 配置 */ + + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_pwm.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_pwm.h new file mode 100644 index 0000000000..bb0c034da9 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_pwm.h @@ -0,0 +1,72 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_PWM_H__ +#define __ES_CONF_INFO_PWM_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + + +#define ES_C_PWM_OC_POL_HIGH TIMER_OC_POLARITY_HIGH +#define ES_C_PWM_OC_POL_LOW TIMER_OC_POLARITY_LOW + +#define ES_C_PWM_OC_MODE_PWM1 TIMER_OC_MODE_PWM1 +#define ES_C_PWM_OC_MODE_PWM2 TIMER_OC_MODE_PWM2 + + + +/* PWM 配置 */ + + +/* codes_main */ + + + +#define ES_PWM_OC_POLARITY ES_C_PWM_OC_POL_HIGH +#define ES_PWM_OC_MODE ES_C_PWM_OC_MODE_PWM1 + +#ifndef ES_PWM_OC_POLARITY +#define ES_PWM_OC_POLARITY ES_C_PWM_OC_POL_HIGH +#endif +#ifndef ES_PWM_OC_MODE +#define ES_PWM_OC_MODE ES_C_PWM_OC_MODE_PWM2 +#endif + +#ifndef ES_DEVICE_NAME_AD16C4T0_PWM +#define ES_DEVICE_NAME_AD16C4T0_PWM "pwm0" +#endif +#ifndef ES_DEVICE_NAME_GP16C4T0_PWM +#define ES_DEVICE_NAME_GP16C4T0_PWM "pwm1" +#endif +#ifndef ES_DEVICE_NAME_GP16C2T0_PWM +#define ES_DEVICE_NAME_GP16C2T0_PWM "pwm2" +#endif +#ifndef ES_DEVICE_NAME_GP16C2T1_PWM +#define ES_DEVICE_NAME_GP16C2T1_PWM "pwm3" +#endif + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_rtc.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_rtc.h new file mode 100644 index 0000000000..2aa8faf9d7 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_rtc.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_RTC_H__ +#define __ES_CONF_INFO_RTC_H__ + +#include +#include + +/* RTC 配置 */ + +#define ES_C_RTC_SOURCE_LRC RTC_SOURCE_LRC +#define ES_C_RTC_SOURCE_LOSC RTC_SOURCE_LOSC + +#define ES_RTC_CLK_SOURCE ES_C_RTC_SOURCE_LOSC + + + + +/* codes_main */ + + +#ifndef ES_DEVICE_NAME_RTC +#define ES_DEVICE_NAME_RTC "rtc" +#endif + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_select.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_select.h new file mode 100644 index 0000000000..47ac7c4e6a --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_select.h @@ -0,0 +1,44 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_SELECT_H__ +#define __ES_CONF_INFO_SELECT_H__ + + +#define ES_C_ENABLE 1 +#define ES_C_DISABLE 0 + + +/* codes_main */ +//#define ES_USE_ASSERT ES_C_ENABLE + +#ifndef ES_USE_ASSERT +#define ES_USE_ASSERT ES_C_DISABLE +#endif + + +#if ES_USE_ASSERT + #define USE_ASSERT +#endif + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_spi.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_spi.h new file mode 100644 index 0000000000..182bc4c44c --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_spi.h @@ -0,0 +1,132 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_SPI_H__ +#define __ES_CONF_INFO_SPI_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + +/* SPI 配置 */ + +#define SPI_BUS_CONFIG(_CONF_,_I_) do{_CONF_.mode = 0U; \ + _CONF_.mode |= ( ES_SPI##_I_##_MASTER_SLAVE | \ + ES_SPI##_I_##_WIRE_3_4 | \ + ES_SPI##_I_##_CPHA_1_2 | \ + ES_SPI##_I_##_CPOL_H_L | \ + ES_SPI##_I_##_CS | \ + ES_SPI##_I_##_M_L_SB ); \ + _CONF_.data_width = ES_SPI##_I_##_DATA_W; \ + _CONF_.max_hz = ES_SPI##_I_##_MAX_HZ; \ + }while(0) + + +// spi_config.mode &= ~RT_SPI_SLAVE; /* 主机模式 */ +// spi_config.mode &= ~RT_SPI_3WIRE; /* 4线,双向传输 */ +// spi_config.mode |= RT_SPI_CPHA; /* 第二边沿采样 */ +// spi_config.mode |= RT_SPI_CPOL; /* 空闲高电平 */ +// spi_config.mode |= RT_SPI_NO_CS; /* 禁用软件从机选择管理 */ +// spi_config.mode |= RT_SPI_MSB; /* 高位在前 */ +// spi_config.data_width = 8; /* 数据长度:8 */ +// spi_config.max_hz = 2000000; /* 最快时钟频率 */ + +#define ES_C_SPI_CLK_POL_HIGH RT_SPI_CPOL +#define ES_C_SPI_CLK_POL_LOW !RT_SPI_CPOL + +#define ES_C_SPI_CLK_PHA_FIRST !RT_SPI_CPHA +#define ES_C_SPI_CLK_PHA_SECOND RT_SPI_CPHA + +#define ES_C_SPI_MSB RT_SPI_MSB +#define ES_C_SPI_LSB RT_SPI_LSB + +#define ES_C_SPI_CS_LOW_LEVEL 0 +#define ES_C_SPI_CS_HIGH_LEVEL 1 + +/* codes_main */ + + +#ifndef ES_DEVICE_NAME_SPI0_BUS +#define ES_DEVICE_NAME_SPI0_BUS "spi0" +#endif +#ifndef ES_DEVICE_NAME_SPI0_DEV0 +#define ES_DEVICE_NAME_SPI0_DEV0 "spi00" +#endif + +#ifndef ES_DEVICE_NAME_SPI1_BUS +#define ES_DEVICE_NAME_SPI1_BUS "spi1" +#endif +#ifndef ES_DEVICE_NAME_SPI1_DEV0 +#define ES_DEVICE_NAME_SPI1_DEV0 "spi10" +#endif + + +#define ES_SPI_CS_LEVEL ES_C_SPI_CS_LOW_LEVEL + +#ifndef ES_SPI0_CPHA_1_2 +#define ES_SPI0_CPHA_1_2 ES_C_SPI_CLK_PHA_SECOND +#endif +#ifndef ES_SPI0_CPOL_H_L +#define ES_SPI0_CPOL_H_L ES_C_SPI_CLK_POL_HIGH +#endif +#ifndef ES_SPI0_M_L_SB +#define ES_SPI0_M_L_SB RT_SPI_MSB +#endif +#ifndef ES_SPI0_MAX_HZ +#define ES_SPI0_MAX_HZ 2000000 +#endif +#ifndef ES_SPI0_NSS_PIN +#define ES_SPI0_NSS_PIN 0xFFFFFFFF +#endif + +#ifndef ES_SPI1_CPHA_1_2 +#define ES_SPI1_CPHA_1_2 ES_C_SPI_CLK_PHA_SECOND +#endif +#ifndef ES_SPI1_CPOL_H_L +#define ES_SPI1_CPOL_H_L ES_C_SPI_CLK_POL_HIGH +#endif +#ifndef ES_SPI1_M_L_SB +#define ES_SPI1_M_L_SB RT_SPI_MSB +#endif +#ifndef ES_SPI1_MAX_HZ +#define ES_SPI1_MAX_HZ 2000000 +#endif +#ifndef ES_SPI1_NSS_PIN +#define ES_SPI1_NSS_PIN 0xFFFFFFFF +#endif + + + +#define ES_SPI0_MASTER_SLAVE !RT_SPI_SLAVE +#define ES_SPI0_WIRE_3_4 !RT_SPI_3WIRE +#define ES_SPI0_CS RT_SPI_NO_CS +#define ES_SPI0_DATA_W 8 + +#define ES_SPI1_MASTER_SLAVE !RT_SPI_SLAVE +#define ES_SPI1_WIRE_3_4 !RT_SPI_3WIRE +#define ES_SPI1_CS RT_SPI_NO_CS +#define ES_SPI1_DATA_W 8 + + +#endif diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_uart.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_uart.h new file mode 100644 index 0000000000..2dd32aa220 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_uart.h @@ -0,0 +1,206 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_UART_H__ +#define __ES_CONF_INFO_UART_H__ + +#include "es_conf_info_map.h" +#include +#include +#include +#include + + + +#define ES_C_UART_PARITY_NONE PARITY_NONE +#define ES_C_UART_PARITY_ODD PARITY_ODD +#define ES_C_UART_PARITY_EVEN PARITY_EVEN + +#define ES_C_UART_STOP_1 STOP_BITS_1 +#define ES_C_UART_STOP_2 STOP_BITS_2 + + +/* UART 配置 */ + +/* codes_main */ + + + +#ifndef ES_DEVICE_NAME_UART0 +#define ES_DEVICE_NAME_UART0 "uart0" +#endif +#ifndef ES_DEVICE_NAME_UART1 +#define ES_DEVICE_NAME_UART1 "uart1" +#endif +#ifndef ES_DEVICE_NAME_UART2 +#define ES_DEVICE_NAME_UART2 "uart2" +#endif +#ifndef ES_DEVICE_NAME_UART3 +#define ES_DEVICE_NAME_UART3 "uart3" +#endif +#ifndef ES_DEVICE_NAME_USART0 +#define ES_DEVICE_NAME_USART0 "usart0" +#endif +#ifndef ES_DEVICE_NAME_USART1 +#define ES_DEVICE_NAME_USART1 "usart1" +#endif + +#ifndef ES_CONF_UART0_BAUD_RATE +#define ES_CONF_UART0_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART0_PARITY +#define ES_CONF_UART0_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART0_STOP_BITS +#define ES_CONF_UART0_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART1_BAUD_RATE +#define ES_CONF_UART1_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART1_PARITY +#define ES_CONF_UART1_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART1_STOP_BITS +#define ES_CONF_UART1_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART2_BAUD_RATE +#define ES_CONF_UART2_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART2_PARITY +#define ES_CONF_UART2_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART2_STOP_BITS +#define ES_CONF_UART2_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART3_BAUD_RATE +#define ES_CONF_UART3_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART3_PARITY +#define ES_CONF_UART3_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART3_STOP_BITS +#define ES_CONF_UART3_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_USART0_BAUD_RATE +#define ES_CONF_USART0_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_USART0_PARITY +#define ES_CONF_USART0_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_USART0_STOP_BITS +#define ES_CONF_USART0_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_USART1_BAUD_RATE +#define ES_CONF_USART1_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_USART1_PARITY +#define ES_CONF_USART1_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_USART1_STOP_BITS +#define ES_CONF_USART1_STOP_BITS ES_C_UART_STOP_1 +#endif + + +#define ES_UART0_CONFIG \ +{ \ + ES_CONF_UART0_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART0_STOP_BITS, \ + ES_CONF_UART0_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART1_CONFIG \ +{ \ + ES_CONF_UART1_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART1_STOP_BITS, \ + ES_CONF_UART1_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART2_CONFIG \ +{ \ + ES_CONF_UART2_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART2_STOP_BITS, \ + ES_CONF_UART2_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART3_CONFIG \ +{ \ + ES_CONF_UART3_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART3_STOP_BITS, \ + ES_CONF_UART3_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_USART0_CONFIG \ +{ \ + ES_CONF_USART0_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_USART0_STOP_BITS, \ + ES_CONF_USART0_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_USART1_CONFIG \ +{ \ + ES_CONF_USART1_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_USART1_STOP_BITS, \ + ES_CONF_USART1_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + +#endif diff --git a/bsp/essemi/es32f0654/drivers/Kconfig b/bsp/essemi/es32f0654/drivers/Kconfig index 3c3cf9e9e5..75d678805d 100644 --- a/bsp/essemi/es32f0654/drivers/Kconfig +++ b/bsp/essemi/es32f0654/drivers/Kconfig @@ -6,129 +6,7 @@ menu "Hardware Drivers Config" select RT_USING_PIN default y - menu "UART Drivers" - config BSP_USING_UART0 - bool "Enable UART0 PB10/PB11(T/R)" - select RT_USING_SERIAL - default n - - config BSP_USING_UART1 - bool "Enable UART1 PC10/PC11(T/R)" - select RT_USING_SERIAL - default n - - config BSP_USING_UART2 - bool "Enable UART2 PC12/PD02(T/R)" - select RT_USING_SERIAL - default y - depends on !BSP_USING_HWTIMER1 - - config BSP_USING_UART3 - bool "Enable UART3 PC04/PC05(T/R)" - select RT_USING_SERIAL - default n - depends on !BSP_USING_HWTIMER2 - endmenu - - menu "SPI Drivers" - config BSP_USING_SPI0 - bool "Enable SPI0 BUS PB03/PB04/PB05(CLK/MISO/MOSI)" - select RT_USING_SPI - select RT_USING_PIN - default n - - config BSP_USING_SPI1 - bool "Enable SPI1 BUS PB13/PB14/PB15(CLK/MISO/MOSI)" - select RT_USING_SPI - select RT_USING_PIN - default n - endmenu - - menu "I2C Drivers" - config BSP_USING_I2C0 - bool "Enable I2C0 BUS PB08/PB09(SCL/SDA)" - select RT_USING_I2C - default n - - config BSP_USING_I2C1 - bool "Enable I2C1 BUS PB10/PB11(SCL/SDA)" - select RT_USING_I2C - default n - endmenu - - menu "CAN Drivers" - config BSP_USING_CAN - bool "Enable CAN BUS PA11/PA12(RX/TX)" - select RT_USING_CAN - default n - endmenu - - menu "PWM Drivers" - config BSP_USING_PWM0 - bool "Using PWM0 PA08/PA09/PA10/PA11" - select RT_USING_PWM - default n - - config BSP_USING_PWM1 - bool "Using PWM1 PB06/PB07/PB08/PB09" - select RT_USING_PWM - default n - - config BSP_USING_PWM2 - bool "Using PWM2 PA00/PA01" - select RT_USING_PWM - default n - - config BSP_USING_PWM3 - bool "Using PWM3 PC06/PC07" - select RT_USING_PWM - default n - endmenu - - menu "HWtimer Drivers" - config BSP_USING_HWTIMER0 - bool "Using timer0" - select RT_USING_HWTIMER - default n - - config BSP_USING_HWTIMER1 - bool "Using timer1" - select RT_USING_HWTIMER - default n - depends on !BSP_USING_UART2 - - config BSP_USING_HWTIMER2 - bool "Using timer2" - select RT_USING_HWTIMER - default n - depends on !BSP_USING_UART3 - - config BSP_USING_HWTIMER3 - bool "Using timer3" - select RT_USING_HWTIMER - default n - endmenu - - menu "RTC Drivers" - config BSP_USING_RTC - bool "Using RTC" - select RT_USING_RTC - default n - endmenu - - menu "PM Drivers" - config BSP_USING_PM - bool "Using PM" - select RT_USING_PM - default n - endmenu - - menu "ADC Drivers" - config BSP_USING_ADC - bool "Using ADC" - select RT_USING_ADC - default n - endmenu + source "drivers/ES/Kconfig" endmenu @@ -137,11 +15,21 @@ menu "Hardware Drivers Config" config BSP_USING_SPI_FLASH bool "Enable SPI FLASH (W25Q64 spi0)" select BSP_USING_SPI - select BSP_USING_SPI0 select RT_USING_SFUD select RT_SFUD_USING_SFDP default n +if BSP_USING_SPI_FLASH + + config ES_DEVICE_NAME_SPI_DEV + string "The name of spi device (registered)" + default "spi00" + + config ES_DEVICE_NAME_SPI_FALSH_DEV + string "The name of spi flash device" + default "W25Q64" +endif + endmenu menu "Offboard Peripheral Drivers" @@ -163,13 +51,17 @@ menu "Hardware Drivers Config" bool "BSP_USING_EXAMPLE_I2C" default n + config BSP_USING_EXAMPLE_I2C_E2PROM + bool "BSP_USING_EXAMPLE_I2C_E2PROM" + default n + config BSP_USING_EXAMPLE_LED_BLINK bool "BSP_USING_EXAMPLE_LED_BLINK" - default y + default n config BSP_USING_EXAMPLE_PIN_BEEP bool "BSP_USING_EXAMPLE_PIN_BEEP" - default y + default n config BSP_USING_EXAMPLE_PWM_LED bool "BSP_USING_EXAMPLE_PWM_LED" @@ -185,7 +77,7 @@ menu "Hardware Drivers Config" config BSP_USING_EXAMPLE_UART bool "BSP_USING_EXAMPLE_UART" - default y + default n config BSP_USING_EXAMPLE_CAN bool "BSP_USING_EXAMPLE_CAN" diff --git a/bsp/essemi/es32f0654/drivers/SConscript b/bsp/essemi/es32f0654/drivers/SConscript index 280c6f5c90..0e34f50b2f 100644 --- a/bsp/essemi/es32f0654/drivers/SConscript +++ b/bsp/essemi/es32f0654/drivers/SConscript @@ -14,7 +14,10 @@ if GetDepend('RT_USING_PIN'): src += ['drv_gpio.c'] # add serial driver code -if GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART1') or GetDepend('BSP_USING_UART2') or GetDepend('BSP_USING_UART3'): +if GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART1') or GetDepend('BSP_USING_UART2') or GetDepend('BSP_USING_UART3') or \ + GetDepend('BSP_USING_UART4') or GetDepend('BSP_USING_UART5') or \ + GetDepend('BSP_USING_USART0') or GetDepend('BSP_USING_USART1') or GetDepend('BSP_USING_USART2') or GetDepend('BSP_USING_USART3') or \ + GetDepend('BSP_USING_USART4') or GetDepend('BSP_USING_USART5'): src += ['drv_uart.c'] # add spi driver code @@ -26,40 +29,50 @@ if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'): src += ['drv_i2c.c'] # add can driver code -if GetDepend('BSP_USING_CAN'): +if GetDepend('BSP_USING_CAN') or GetDepend('BSP_USING_CAN0') or GetDepend('RT_USING_CAN'): src += ['drv_can.c'] -# add spi flash driver code -if GetDepend('BSP_USING_SPI_FLASH'): - src += ['drv_spiflash.c'] -# add pwm driver code -if GetDepend('BSP_USING_PWM0') or GetDepend('BSP_USING_PWM1') or GetDepend('BSP_USING_PWM2') or GetDepend('BSP_USING_PWM3'): - src += ['drv_pwm.c'] - -# add hwtimer driver code -if GetDepend('BSP_USING_HWTIMER0') or GetDepend('BSP_USING_HWTIMER1') or GetDepend('BSP_USING_HWTIMER2') or GetDepend('BSP_USING_HWTIMER3'): - src += ['drv_hwtimer.c'] +# add adc driver code +if GetDepend(['BSP_USING_ADC0']) or GetDepend('BSP_USING_ADC'): + src += ['drv_adc.c'] # add rtc driver code if GetDepend(['BSP_USING_RTC']): src += ['drv_rtc.c'] +# add spi flash driver code +if GetDepend('BSP_USING_SPI_FLASH'): + src += ['drv_spiflash.c'] + +# add hwtimer driver code +if GetDepend('BSP_USING_AD16C4T0_HWTIMER') or GetDepend('BSP_USING_AD16C4T1_HWTIMER') or \ + GetDepend('BSP_USING_GP32C4T0_HWTIMER') or GetDepend('BSP_USING_GP32C4T1_HWTIMER') or \ + GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ + GetDepend('BSP_USING_GP16C2T0_HWTIMER') or GetDepend('BSP_USING_GP16C2T1_HWTIMER') or \ + GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ + GetDepend('BSP_USING_BS16T0_HWTIMER') or GetDepend('BSP_USING_BS16T1_HWTIMERIMER') or \ + GetDepend('BSP_USING_BS16T2_HWTIMER') or GetDepend('BSP_USING_BS16T3_HWTIMER'): + src += ['drv_hwtimer.c'] + +# add pwm driver code +if GetDepend('BSP_USING_AD16C4T0_PWM') or GetDepend('BSP_USING_AD16C4T1_PWM') or \ + GetDepend('BSP_USING_GP16C4T0_PWM') or GetDepend('BSP_USING_GP16C4T1_PWM') or \ + GetDepend('BSP_USING_GP16C2T0__PWM') or GetDepend('BSP_USING_GP16C2T1_PWM') or \ + GetDepend('BSP_USING_GP32C4T0_PWM') or GetDepend('BSP_USING_GP32C4T1_PWM') or \ + GetDepend('BSP_USING_GP16C4T0_PWM') or GetDepend('BSP_USING_GP16C4T1_PWM'): + src += ['drv_pwm.c'] + # add pm driver code if GetDepend(['BSP_USING_PM']): src += ['drv_pm.c'] - -# add adc driver code -if GetDepend(['BSP_USING_ADC']): - src += ['drv_adc.c'] - CPPPATH = [cwd] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) objs = objs + group src = [] cwd = GetCurrentDir() -include_path = [cwd] +include_path = [cwd + '/ES'] if GetDepend('BSP_USING_EXAMPLE_ADC_VOL'): src += ['bsp_driver_example/adc_vol_sample.c'] @@ -70,6 +83,9 @@ if GetDepend('BSP_USING_EXAMPLE_HWTIMER'): if GetDepend('BSP_USING_EXAMPLE_I2C'): src += ['bsp_driver_example/i2c_sample.c'] +if GetDepend('BSP_USING_EXAMPLE_I2C_E2PROM'): + src += ['bsp_driver_example/i2c_e2_sample.c'] + if GetDepend('BSP_USING_EXAMPLE_LED_BLINK'): src += ['bsp_driver_example/led_blink_sample.c'] diff --git a/bsp/essemi/es32f0654/drivers/board.c b/bsp/essemi/es32f0654/drivers/board.c index 94b259e485..7411168324 100644 --- a/bsp/essemi/es32f0654/drivers/board.c +++ b/bsp/essemi/es32f0654/drivers/board.c @@ -1,12 +1,25 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes * 2019-01-23 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include @@ -14,7 +27,6 @@ #include "board.h" #include "drv_uart.h" #include "drv_gpio.h" -#include #include /** @@ -43,11 +55,65 @@ void NVIC_Configuration(void) *******************************************************************************/ void SystemClock_Config(void) { - /* hosc 12MHz, from hosc/3 pll to 48MHz */ - ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_48M); + SYSCFG_UNLOCK(); +#if ES_CMU_LRC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_LRCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_LRCEN_MSK); +#endif /*ES_CMU_LRC_EN*/ + +#if ES_CMU_LOSC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_LOSCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_LOSCEN_MSK); +#endif /*ES_CMU_LOSC_EN*/ + +#if ES_CMU_HRC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_HRCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_HRCEN_MSK); +#endif /*ES_CMU_HRC_EN*/ + +#if ES_CMU_HOSC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_HOSCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_HOSCEN_MSK); +#endif /*ES_CMU_HOSC_EN*/ - /* MCLK 48MHz*/ - ald_cmu_clock_config(CMU_CLOCK_PLL1, 48000000); + SYSCFG_LOCK(); + +#if ES_CMU_PLL1_EN + /*PLL的源必须是4M*/ + ald_cmu_pll1_config(ES_PLL1_REFER_CLK, ES_PLL1_OUT_CLK); + + #if ES_CMU_PLL1_SAFE_EN + ald_cmu_pll_safe_config(ENABLE); + #else + ald_cmu_pll_safe_config(DISABLE); + #endif + +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_PLL1EN_MSK); +#endif /*ES_CMU_PLL1_EN*/ + + ald_cmu_clock_config(ES_SYS_CLK_SOURSE, ES_SYS_CLK); + + ald_cmu_div_config(CMU_SYS,ES_CMU_SYS_DIV); + ald_cmu_div_config(CMU_HCLK_1,ES_CMU_HCLK_1_DIV); + ald_cmu_div_config(CMU_PCLK_1,ES_CMU_PCLK_1_DIV); + ald_cmu_div_config(CMU_PCLK_2,ES_CMU_PCLK_2_DIV); + + ald_cmu_perh_clock_config(CMU_PERH_ALL, ENABLE); + +/*低功耗时钟使能*/ +#ifdef RT_USING_PM + SYSCFG_UNLOCK(); + SET_BIT(CMU->LPENR, CMU_LPENR_LRCEN_MSK); + SET_BIT(CMU->LPENR, CMU_LPENR_LOSCEN_MSK); + SET_BIT(CMU->LPENR, CMU_LPENR_HRCEN_MSK); + SET_BIT(CMU->LPENR, CMU_LPENR_HOSCEN_MSK); + SYSCFG_LOCK(); +#endif } /******************************************************************************* @@ -71,13 +137,22 @@ void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - + ald_inc_tick(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); } +/** + * This is the cmu interrupt service. + * + */ +void CMU_Handler(void) +{ + ald_cmu_irq_handler(); +} + /*@}*/ /** * This function will initial ES32F0 board. diff --git a/bsp/essemi/es32f0654/drivers/board.h b/bsp/essemi/es32f0654/drivers/board.h index 5b969142ac..a6fdd9e909 100644 --- a/bsp/essemi/es32f0654/drivers/board.h +++ b/bsp/essemi/es32f0654/drivers/board.h @@ -1,11 +1,24 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2019-01-23 wangyq the first version + * 2019-01-23 wangyq the first version + * 2021-04-20 liuhy the second version */ // <<< Use Configuration Wizard in Context Menu >>> @@ -13,6 +26,7 @@ #define __BOARD_H__ #include +#include "es_conf_info_cmu.h" #define ES32F0_SRAM_SIZE 0x8000 #define ES32F0_SRAM_END (0x20000000 + ES32F0_SRAM_SIZE) diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/adc_vol_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/adc_vol_sample.c index 19eed3f35d..7d67c94070 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/adc_vol_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/adc_vol_sample.c @@ -18,6 +18,9 @@ #include #include + +#ifdef RT_USING_ADC + #define ADC_DEV_NAME "adc0" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL 5 /* PA1 ADC 通道 */ #define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/ @@ -55,3 +58,5 @@ static int adc_vol_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/can_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/can_sample.c index 4c16d1d555..17f8f2007f 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/can_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/can_sample.c @@ -18,7 +18,9 @@ #include #include "rtdevice.h" -#define CAN_DEV_NAME "can" /* CAN 设备名称 */ +#ifdef RT_USING_CAN + +#define CAN_DEV_NAME "can0" /* CAN 设备名称 */ static struct rt_semaphore rx_sem; /* 用于接收消息的信号量 */ static rt_device_t can_dev; /* CAN 设备句柄 */ @@ -142,3 +144,5 @@ int can_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(can_sample, can device sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/hwtimer_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/hwtimer_sample.c index e2e39664f3..cc0b790643 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/hwtimer_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/hwtimer_sample.c @@ -17,7 +17,9 @@ #include #include -#define HWTIMER_DEV_NAME "timer0" /* 定时器名称 */ +#ifdef RT_USING_HWTIMER + +#define HWTIMER_DEV_NAME "timer1" /* 定时器名称 */ /* 定时器超时回调函数 */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) @@ -83,3 +85,5 @@ static int hwtimer_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_e2_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_e2_sample.c new file mode 100644 index 0000000000..3bfd005e67 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_e2_sample.c @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Change Logs: + * Date Author Notes + * 2020-12-15 liuhy first implementation. + */ +/* + * 程序清单:这是一个 I2C 设备使用例程 + * 例程导出了 i2c_e2_sample 命令到控制终端 + * 命令调用格式:i2c_e2_sample + * 命令解释:使用默认的I2C总线设备i2c0 + * 程序功能:通过 I2C 设备写读e2prom,ST24C04WP。 +*/ + +/*ST24C04WP 有2个Block :Block0 的从机地址为:0x50,Block1 的从机地址为:0x51 + 一个Block有 256字节,一页16字节,写只可在一页内(超过一页的范围后,会回到页的开始),读无页限制*/ +#include +#include + +#ifdef RT_USING_I2C + +#define I2C_BUS_NAME "i2c0" /*I2C总线设备名称 */ +#define SLAVE_ADDR 0x50 /*从机地址*/ +#define MEM_ADDR 0x00 /*从机的起始储存地址,范围:0x00到0xEF(例程写读范围:2页)*/ +#define ADDR_LEN 1 /*定义从机储存地址的长度,默认8位,1字节*/ +#define STR_LEN 16 /*接收发送的页数据长度 ,最大16*/ + +static rt_uint8_t mem_addr,rx_buffer[33] = { 0U }; /*读两页,需要32字节,字符串结束'\0'*/ +/*第一个字节' '用来放 E2PROM 的内存地址,最后一个字节'\0'作为子串的结束,不存入e2prom*/ +static rt_uint8_t tx_buffer1[STR_LEN + ADDR_LEN + 1] = " e2prom example !\0"; +static rt_uint8_t tx_buffer2[STR_LEN + ADDR_LEN + 1] = " ABCDEFGH12345678\0"; + +static void i2c_e2_sample(int argc, char *argv[]) +{ + struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ + struct rt_i2c_msg i2c_msg[2]; /* I2C消息 */ + rt_size_t s_stat; + + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C_BUS_NAME); /* 通过名字获取I2C总线设备的句柄 */ + + if( i2c_bus == RT_NULL) + { + rt_kprintf("can't find i2c device :%s !\n",I2C_BUS_NAME); + return; + } + + /*写T24C04WP + 如果 (MEM_ADDR & 0x0F) + STR_LEN <= 16, 写的范围为:(MEM_ADDR , MEM_ADDR + STR_LEN ) + (0x10 + MEM_ADDR , 0x10 + MEM_ADDR + STR_LEN ) + 如果 (MEM_ADDR & 0x0F) + STR_LEN > 16, 超出范围的部分会在页内循环写。*/ + tx_buffer1[0] = MEM_ADDR; + + /*初始化消息*/ + i2c_msg[0].addr = SLAVE_ADDR; /* 从机地址 */ + i2c_msg[0].len = ADDR_LEN + STR_LEN ; /* 写入的长度,地址+数据 */ + i2c_msg[0].buf = tx_buffer1; /* 待写入第一段数据 */ + i2c_msg[0].flags = RT_I2C_WR; /* I2C写 */ + s_stat = rt_i2c_transfer(i2c_bus,i2c_msg,1); /* 写入第一段数据 */ + + if( s_stat == 1 )rt_kprintf("write successful. \nmessage: %s\n",&tx_buffer1[1]); + else rt_kprintf("device %s write fail \n",I2C_BUS_NAME); + + tx_buffer2[0] = MEM_ADDR + 0x10; /*加一页*/ + i2c_msg[0].buf = tx_buffer2; /* 待写入第二段数据 */ + s_stat = rt_i2c_transfer(i2c_bus,i2c_msg,1); /* 写入第二段数据 */ + + if( s_stat == 1 )rt_kprintf("write successful. \nmessage: %s\n",&tx_buffer2[1]); + else rt_kprintf("device %s write fail \n",I2C_BUS_NAME); + + /*读T24C04WP 读2页的数据。读数据需要2条消息:第一条消息:发送读取的地址。 + 第二条消息:读取具体的数据。*/ + + mem_addr = MEM_ADDR & 0xF0; /*从页的开始读*/ + + i2c_msg[0].len = ADDR_LEN; + i2c_msg[0].buf = &mem_addr; + + i2c_msg[1].addr = SLAVE_ADDR; /* 从机地址 */ + i2c_msg[1].len = 32; /* 读取的数据长度:2*16 */ + i2c_msg[1].buf = rx_buffer; /* 数据存放地址 */ + i2c_msg[1].flags = RT_I2C_RD; /* I2C读 */ + s_stat = rt_i2c_transfer(i2c_bus,i2c_msg,2); /* 读已写的2页 */ + + if( s_stat == 2 )rt_kprintf(" read successful \n messege : %s \n",rx_buffer); + else + rt_kprintf("read fail \n"); + + return; + +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(i2c_e2_sample, i2c e2prom sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_sample.c index 2d386433c6..c8a666609d 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_sample.c @@ -1,7 +1,19 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes @@ -11,14 +23,16 @@ * 程序清单:这是一个 I2C 设备使用例程 * 例程导出了 i2c_io_sample 命令到控制终端 * 命令调用格式:i2c_io_sample - * 命令解释:使用默认的I2C总线设备 + * 命令解释:使用默认的I2C总线设备i2c0 * 程序功能:通过 I2C 设备接收数据并打印,然后将接收的字符加1输出。 */ #include #include -#define I2C_BUS_NAME "i2c1" /* I2C总线设备名称 */ +#ifdef RT_USING_I2C + +#define I2C_BUS_NAME "i2c0" /* I2C总线设备名称 */ #define SLAVE_ADDR 0x2D /* 从机地址 */ #define STR_LEN 16 /* 接收发送的数据长度 */ @@ -95,3 +109,5 @@ static void i2c_io_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(i2c_io_sample, i2c io sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/pm_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/pm_sample.c index f7287e36ac..78358e421c 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/pm_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/pm_sample.c @@ -1,7 +1,19 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes @@ -11,15 +23,18 @@ * 程序清单:这是一个 pm睡眠唤醒的使用例程 * 例程导出了 pm_sample 命令到控制终端 * 命令调用格式:pm_sample - * 命令解释:进入不同的睡眠模式,然后用按键唤醒 + * 命令解释:进入不同的睡眠模式,然后用按键唤醒。 * 程序功能:通过串口输出字符串,告知进入睡眠和唤醒睡眠的情况。 + * 注意:进入睡眠前,如果有中断挂起(SYSTICK、UART、EXTI等),睡眠将被瞬间唤醒。 */ #include #include + +#ifdef RT_USING_PM #define PM_NAME "pm" /* 设备名称 */ -#define WAKE_UP_PIN 18 /* 唤醒源 */ +#define WAKE_UP_PIN 19 /* 唤醒源 */ #define SLEEP_TIMES 12 /* 进入睡眠次数,轮流进入不同的睡眠模式,包括无睡眠模式 */ @@ -65,8 +80,9 @@ void sleep_in_out_callback(rt_uint8_t event, rt_uint8_t mode, void *data) break; /*睡眠唤醒后*/ case RT_PM_EXIT_SLEEP: g_pm_data.flag = 0; /*睡眠唤醒后*/ + /*从深睡眠唤醒后,等待UART时钟未恢复稳定,输出可能丢失*/ rt_kprintf("\n\rEXIT\n\r"); - rt_pm_release(mode); /*释放休眠模式*/ + rt_pm_request(PM_SLEEP_MODE_NONE); /*进无休眠模式*/ return; default: break; @@ -125,6 +141,9 @@ static void pm_test(void *parameter) g_pm_data.flag = 2; } + + /*彻底释放无休眠模式*/ + rt_pm_release_all(PM_SLEEP_MODE_NONE); /*请求选择的休眠模式*/ rt_pm_request(in_mode[i%6]); @@ -137,15 +156,21 @@ static void pm_test(void *parameter) rt_thread_mdelay(500); } - /*释放选择的休眠模式*/ - rt_pm_release(in_mode[i%6]); + /*释放选择的休眠模式 ,彻底释放*/ + rt_pm_release_all(in_mode[i%6]); i++; } - /*清除回调函数和私有数据*/ + + /*切换为无睡眠模式*/ + rt_pm_request(PM_SLEEP_MODE_NONE); + + /*清除回调函数和私有数据*/ rt_pm_notify_set(RT_NULL,RT_NULL); - rt_kprintf("thread pm_test close\n\r"); + + rt_kprintf("thread pm_test close\n\r"); + } /*按键唤醒的回调函数*/ @@ -181,3 +206,5 @@ static int pm_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pm_sample, pm sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/pwm_led_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/pwm_led_sample.c index ce1573aa55..23ecfd227e 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/pwm_led_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/pwm_led_sample.c @@ -17,9 +17,12 @@ #include #include + +#ifdef RT_USING_PWM + #define LED_PIN_NUM 16 /* LED PIN脚编号,查看驱动文件drv_gpio.c确定 */ #define PWM_DEV_NAME "pwm1" /* PWM设备名称 */ -#define PWM_DEV_CHANNEL 4 /* PB9 PWM通道 */ +#define PWM_DEV_CHANNEL 1 /* PA8 PWM通道 */ struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ @@ -70,3 +73,6 @@ static int pwm_led_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_led_sample, pwm sample); + +#endif + diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/rtc_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/rtc_sample.c index 711a3a0ebb..6f732806f5 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/rtc_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/rtc_sample.c @@ -17,6 +17,8 @@ #include #include +#ifdef RT_USING_RTC + static int rtc_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; @@ -49,3 +51,5 @@ static int rtc_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(rtc_sample, rtc sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/bsp_driver_example/spi_sample.c b/bsp/essemi/es32f0654/drivers/bsp_driver_example/spi_sample.c index 994888cdb0..6f6e730288 100644 --- a/bsp/essemi/es32f0654/drivers/bsp_driver_example/spi_sample.c +++ b/bsp/essemi/es32f0654/drivers/bsp_driver_example/spi_sample.c @@ -1,7 +1,19 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes @@ -17,13 +29,14 @@ #include #include +#ifdef RT_USING_SPI + #define SPI_DEVICE_NAME "spi00" #define BUF_LEN 16 static void spi_io_sample(int argc, char *argv[]) { struct rt_spi_device * spi_dev; /* spi设备的句柄 */ - struct rt_spi_configuration spi_config; rt_uint8_t i,buffer[BUF_LEN] = { 0U }; rt_err_t s_stat; rt_err_t result; @@ -37,23 +50,8 @@ static void spi_io_sample(int argc, char *argv[]) return; } - - /* 清空配置结构体 */ - rt_memset(&spi_config,0,sizeof(struct rt_spi_configuration)); - - spi_config.mode &= ~RT_SPI_SLAVE; /* 主机模式 */ - spi_config.mode &= ~RT_SPI_3WIRE; /* 4线,双向传输 */ - spi_config.mode |= RT_SPI_CPHA; /* 第二边沿采样 */ - spi_config.mode |= RT_SPI_CPOL; /* 空闲高电平 */ - spi_config.mode |= RT_SPI_NO_CS; /* 禁用软件从机选择管理 */ - spi_config.mode |= RT_SPI_MSB; /* 高位在前 */ - - spi_config.data_width = 8; /* 数据长度:8 */ - - spi_config.max_hz = 2000000; /* 最快时钟频率 */ - /* 配置SPI设备 */ - s_stat = rt_spi_configure(spi_dev,&spi_config); + s_stat = rt_spi_configure(spi_dev,&(spi_dev->config)); if(s_stat != RT_EOK) { @@ -150,3 +148,5 @@ static void spi_io_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(spi_io_sample, spi sample); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/drv_adc.c b/bsp/essemi/es32f0654/drivers/drv_adc.c index bc26b05802..bb1575c4a0 100644 --- a/bsp/essemi/es32f0654/drivers/drv_adc.c +++ b/bsp/essemi/es32f0654/drivers/drv_adc.c @@ -1,12 +1,25 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes * 2019-04-03 wangyq the first version * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include @@ -59,77 +72,69 @@ static adc_channel_t es32f0_adc_get_channel(rt_uint32_t channel) { case 0: es32f0_channel = ADC_CHANNEL_0; - ald_gpio_init(GPIOC, GPIO_PIN_0, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH0_GPIO, ES_GPIO_ADC_CH0_PIN, &gpio_initstruct); break; case 1: es32f0_channel = ADC_CHANNEL_1; - ald_gpio_init(GPIOC, GPIO_PIN_1, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH1_GPIO, ES_GPIO_ADC_CH1_PIN, &gpio_initstruct); break; case 2: es32f0_channel = ADC_CHANNEL_2; - ald_gpio_init(GPIOC, GPIO_PIN_2, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH2_GPIO, ES_GPIO_ADC_CH2_PIN, &gpio_initstruct); break; case 3: es32f0_channel = ADC_CHANNEL_3; - ald_gpio_init(GPIOC, GPIO_PIN_3, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH3_GPIO, ES_GPIO_ADC_CH3_PIN, &gpio_initstruct); break; case 4: es32f0_channel = ADC_CHANNEL_4; - ald_gpio_init(GPIOA, GPIO_PIN_0, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH4_GPIO, ES_GPIO_ADC_CH4_PIN, &gpio_initstruct); break; case 5: es32f0_channel = ADC_CHANNEL_5; - ald_gpio_init(GPIOA, GPIO_PIN_1, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH5_GPIO, ES_GPIO_ADC_CH5_PIN, &gpio_initstruct); break; case 6: es32f0_channel = ADC_CHANNEL_6; - ald_gpio_init(GPIOA, GPIO_PIN_2, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH6_GPIO, ES_GPIO_ADC_CH6_PIN, &gpio_initstruct); break; case 7: es32f0_channel = ADC_CHANNEL_7; - ald_gpio_init(GPIOA, GPIO_PIN_3, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH7_GPIO, ES_GPIO_ADC_CH7_PIN, &gpio_initstruct); break; case 8: es32f0_channel = ADC_CHANNEL_8; - ald_gpio_init(GPIOA, GPIO_PIN_4, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH8_GPIO, ES_GPIO_ADC_CH8_PIN, &gpio_initstruct); break; case 9: es32f0_channel = ADC_CHANNEL_9; - ald_gpio_init(GPIOA, GPIO_PIN_5, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH9_GPIO, ES_GPIO_ADC_CH9_PIN, &gpio_initstruct); break; case 10: es32f0_channel = ADC_CHANNEL_10; - ald_gpio_init(GPIOA, GPIO_PIN_6, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH10_GPIO, ES_GPIO_ADC_CH10_PIN, &gpio_initstruct); break; case 11: es32f0_channel = ADC_CHANNEL_11; - ald_gpio_init(GPIOA, GPIO_PIN_7, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH11_GPIO, ES_GPIO_ADC_CH11_PIN, &gpio_initstruct); break; case 12: es32f0_channel = ADC_CHANNEL_12; - ald_gpio_init(GPIOC, GPIO_PIN_4, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH12_GPIO, ES_GPIO_ADC_CH12_PIN, &gpio_initstruct); break; case 13: es32f0_channel = ADC_CHANNEL_13; - ald_gpio_init(GPIOC, GPIO_PIN_5, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH13_GPIO, ES_GPIO_ADC_CH13_PIN, &gpio_initstruct); break; case 14: es32f0_channel = ADC_CHANNEL_14; - ald_gpio_init(GPIOB, GPIO_PIN_0, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH14_GPIO, ES_GPIO_ADC_CH14_PIN, &gpio_initstruct); break; case 15: es32f0_channel = ADC_CHANNEL_15; - ald_gpio_init(GPIOB, GPIO_PIN_1, &gpio_initstruct); - break; - case 16: - es32f0_channel = ADC_CHANNEL_16; - break; - case 17: - es32f0_channel = ADC_CHANNEL_17; - break; - case 18: - es32f0_channel = ADC_CHANNEL_18; + ald_gpio_init(ES_GPIO_ADC_CH15_GPIO, ES_GPIO_ADC_CH15_PIN, &gpio_initstruct); break; + default: break; } @@ -148,6 +153,9 @@ static rt_err_t es32f0_get_adc_value(struct rt_adc_device *device, rt_uint32_t c /* config adc channel */ nm_config.ch = es32f0_adc_get_channel(channel); nm_config.idx = ADC_NCH_IDX_1; + +/*aaabbbccc*/ + nm_config.samp = ES_ADC0_NCH_SAMPLETIME; nm_config.samp = ADC_SAMPLETIME_4; ald_adc_normal_channel_config(_hadc, &nm_config); @@ -168,24 +176,34 @@ static const struct rt_adc_ops es32f0_adc_ops = int rt_hw_adc_init(void) { int result = RT_EOK; + + adc_handle_t _h_adc; + + _h_adc.init.scan = DISABLE; + _h_adc.init.cont = DISABLE; + _h_adc.init.disc = ADC_ALL_DISABLE; + _h_adc.init.disc_nr = ADC_DISC_NR_1; + _h_adc.init.nche_sel = ADC_NCHESEL_MODE_ALL; + _h_adc.init.n_ref = ADC_NEG_REF_VSS; + _h_adc.init.p_ref = ADC_POS_REF_VDD; + _h_adc.init.nch_nr = ADC_NCH_NR_16; + +#ifdef BSP_USING_ADC0 + static adc_handle_t _h_adc0; - - /* adc function initialization */ + + _h_adc0.init = _h_adc.init; + _h_adc0.perh = ADC0; - _h_adc0.init.align = ADC_DATAALIGN_RIGHT; - _h_adc0.init.scan = DISABLE; - _h_adc0.init.cont = DISABLE; - _h_adc0.init.disc = ADC_ALL_DISABLE; - _h_adc0.init.disc_nr = ADC_DISC_NR_1; - _h_adc0.init.data_bit = ADC_CONV_BIT_12; - _h_adc0.init.div = ADC_CKDIV_128; - _h_adc0.init.nche_sel = ADC_NCHESEL_MODE_ALL; - _h_adc0.init.n_ref = ADC_NEG_REF_VSS; - _h_adc0.init.p_ref = ADC_POS_REF_VDD; + _h_adc0.init.align = ES_ADC0_ALIGN; + _h_adc0.init.data_bit = ES_ADC0_DATA_BIT; + _h_adc0.init.div = ES_ADC0_CLK_DIV; ald_adc_init(&_h_adc0); - - rt_hw_adc_register(&_device_adc0, "adc0", &es32f0_adc_ops, &_h_adc0); - + + result = rt_hw_adc_register(&_device_adc0, ES_DEVICE_NAME_ADC0, &es32f0_adc_ops, &_h_adc0); + +#endif /*BSP_USING_ADC0*/ + return result; } INIT_BOARD_EXPORT(rt_hw_adc_init); diff --git a/bsp/essemi/es32f0654/drivers/drv_adc.h b/bsp/essemi/es32f0654/drivers/drv_adc.h index eaddd67407..fa51cdbb21 100644 --- a/bsp/essemi/es32f0654/drivers/drv_adc.h +++ b/bsp/essemi/es32f0654/drivers/drv_adc.h @@ -3,14 +3,29 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-04-03 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_ADC_H__ #define DRV_ADC_H__ +#include "es_conf_info_adc.h" + int rt_hw_adc_init(void); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_can.c b/bsp/essemi/es32f0654/drivers/drv_can.c index cefddd997c..7c73acd0cf 100644 --- a/bsp/essemi/es32f0654/drivers/drv_can.c +++ b/bsp/essemi/es32f0654/drivers/drv_can.c @@ -1,51 +1,94 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2019-11-09 wangyq the first version + * 2019-11-09 wangyq the first version + * 2021-04-20 liuhy the second version */ #include "drv_can.h" -#ifdef BSP_USING_CAN +#ifdef RT_USING_CAN + static struct es32f0_can can; -/* attention !!! baud calculation example: Pclk / ((sjw + seg1 + seg2) * psc) 48 / ((1 + 3 + 2) * 8) = 1MHz */ -static const struct es32f0_baud_rate_tab can_baud_rate_tab[] = -{ - {CAN1MBaud, 8}, - {CAN800kBaud, 10}, - {CAN500kBaud, 16}, - {CAN250kBaud, 32}, - {CAN125kBaud, 64}, - {CAN100kBaud, 80}, - {CAN50kBaud, 160}, - {CAN20kBaud, 400}, - {CAN10kBaud, 800} -}; -static rt_uint32_t get_can_baud_index(rt_uint32_t baud) -{ - rt_uint32_t len, index; - - len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]); - for (index = 0; index < len; index++) +static rt_uint32_t get_can_baud_index(rt_uint32_t baud,can_init_t * init) +{ +/* attention !!! baud calculation example: Pclk / ((1 + seg1 + seg2) * psc) Pclk=48 / ((1 + seg1=3 + seg2=2) * 8) = 1MHz */ + double target,temp,min; + uint32_t i,j,j_max,near = 0; + target = (double)(ald_cmu_get_pclk1_clock()); + target/= baud; /*1*/ + + min = 0xFFFFFFFF; + + for(i = 1 + 16 + 8 ;i > 2;i--) /*SYNC_SEG + SEG1 + SEG2*/ { - if (can_baud_rate_tab[index].baud_rate == baud) - return index; + j_max = target/i/(0.98) + 1; /*СΧ*/ + j_max = (j_max > 1024) ? (1024) : (j_max); + + for(j = target/i/1.02 ;j < j_max;j++) + { + temp = target/i/j; /*2*/ + temp = (temp > 1) ? (temp - 1) : (1 - temp); + temp+= ((1.0 * i * j) / 0xFFFFFFFF) ; + + if(temp < min) + { + if(temp > 0.000001) + { + near = (i<<16) + j; + min = temp; + } + else + { + init->seg1 = (can_seg1_t)((i - 1)*2/3-1); + init->seg2 = (can_seg2_t)(i - init->seg1 - 1 - 1 - 1); + init->psc = j; + + return 0; + } + } + } } - return 0; /* default baud is CAN1MBaud */ + if(min < 0.01) + { + i = near>>16; + j = near % (1<<16); + init->seg1 = (can_seg1_t)((i - 1)*2/3-1); + init->seg2 = (can_seg2_t)(i - init->seg1 - 1 - 1 - 1); + init->psc = j; + + return 0; + } + else + { + return 1; + } } + static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configure *cfg) { struct es32f0_can *drv_can; - rt_uint32_t baud_index; RT_ASSERT(can_device); RT_ASSERT(cfg); @@ -56,7 +99,7 @@ static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configu drv_can->CanHandle.init.ttcm = DISABLE; drv_can->CanHandle.init.abom = ENABLE; drv_can->CanHandle.init.awk = DISABLE; - drv_can->CanHandle.init.artx = DISABLE; + drv_can->CanHandle.init.artx = (type_func_t)ES_CAN0_AUTO_BAN_RE_T; drv_can->CanHandle.init.rfom = DISABLE; drv_can->CanHandle.init.txmp = ENABLE; @@ -75,12 +118,20 @@ static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configu drv_can->CanHandle.init.mode = CAN_MODE_SILENT_LOOPBACK; break; } + /*ò*/ + if(get_can_baud_index(cfg->baud_rate,&(drv_can->CanHandle.init))) + { + return -RT_ERROR; + } + drv_can->CanHandle.init.sjw = (can_sjw_t)(cfg->reserved); + + /* init can */ - baud_index = get_can_baud_index(cfg->baud_rate); - drv_can->CanHandle.init.sjw = CAN_SJW_1; - drv_can->CanHandle.init.seg1 = CAN_SEG1_3; - drv_can->CanHandle.init.seg2 = CAN_SEG2_2; - drv_can->CanHandle.init.psc = can_baud_rate_tab[baud_index].config_data; + // baud_index = get_can_baud_index(cfg->baud_rate); + //drv_can->CanHandle.init.sjw = CAN_SJW_1; + // drv_can->CanHandle.init.seg1 = CAN_SEG1_3; + // drv_can->CanHandle.init.seg2 = CAN_SEG2_2; + // drv_can->CanHandle.init.psc = can_baud_rate_tab[baud_index].config_data; /* init can */ if (ald_can_init(&drv_can->CanHandle) != OK) { @@ -96,7 +147,10 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar { rt_uint32_t argval; struct es32f0_can *drv_can; + +#ifdef RT_CAN_USING_HDR struct rt_can_filter_config *filter_cfg; +#endif RT_ASSERT(can_device != RT_NULL); drv_can = (struct es32f0_can *)can_device->parent.user_data; @@ -108,8 +162,12 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar argval = (rt_uint32_t) arg; if (argval == RT_DEVICE_FLAG_INT_RX) { - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_FP0 | CAN_IT_FF0 | CAN_IT_FOV0 | - CAN_IT_FP1 | CAN_IT_FF1 | CAN_IT_FOV1), DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, DISABLE); } else if (argval == RT_DEVICE_FLAG_INT_TX) { @@ -117,8 +175,11 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar } else if (argval == RT_DEVICE_CAN_INT_ERR) { - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_WARN | CAN_IT_PERR | CAN_IT_BOF | - CAN_IT_PRERR | CAN_IT_ERR), DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, DISABLE); } break; case RT_DEVICE_CTRL_SET_INT: @@ -127,8 +188,14 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar { NVIC_SetPriority(CAN0_IRQn, 1); NVIC_EnableIRQ(CAN0_IRQn); - - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_FP0 | CAN_IT_FP1), ENABLE); + + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, ENABLE); + } else if (argval == RT_DEVICE_FLAG_INT_TX) { @@ -141,11 +208,16 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar { NVIC_SetPriority(CAN0_IRQn, 1); NVIC_EnableIRQ(CAN0_IRQn); - - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_WARN | CAN_IT_PERR | CAN_IT_BOF | - CAN_IT_PRERR | CAN_IT_ERR), ENABLE); + + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, ENABLE); + } break; +#ifdef RT_CAN_USING_HDR case RT_CAN_CMD_SET_FILTER: if (RT_NULL == arg) { @@ -157,8 +229,55 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar filter_cfg = (struct rt_can_filter_config *)arg; /* get default filter */ for (int i = 0; i < filter_cfg->count; i++) - { - drv_can->FilterConfig.number = filter_cfg->items[i].hdr; + { + + /*ĬϹ˱ж*/ + if(filter_cfg->items[i].hdr < drv_can->device.config.maxhdr) + drv_can->FilterConfig.number = filter_cfg->items[i].hdr; + else + drv_can->FilterConfig.number = ES_C_CAN_DEFAULT_FILTER_NUMBER; + + if(filter_cfg->items[i].mode) + { + /*ʶбģʽ ƥ idƥΪյid = õid + = õmask ͨ*/ + /*չ֡*/ + if(filter_cfg->items[i].ide) + { +// filter_cfg->items[i].id = filter_cfg->items[i].id ; /*id 29 λ*/ + filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 3) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)); + } + else /*׼֡*/ + { + filter_cfg->items[i].id = (filter_cfg->items[i].id << 18); + filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 21) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)); + } + } + else + { + /*ʶģʽ*/ + /*չ֡*/ + if(filter_cfg->items[i].ide) + { + filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<3; + } + else /*׼֡*/ + { + filter_cfg->items[i].id = (filter_cfg->items[i].id)<<18; + filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<21; + } + +#if ES_C_CAN_FILTER_FRAME_TYPE + /*ƥ*/ + filter_cfg->items[i].mask |= 0x6; +#endif + + } + drv_can->FilterConfig.id_high = (filter_cfg->items[i].id >> 13) & 0xFFFF; drv_can->FilterConfig.id_low = ((filter_cfg->items[i].id << 3) | (filter_cfg->items[i].ide << 2) | @@ -171,6 +290,8 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar } } break; + +#endif case RT_CAN_CMD_SET_MODE: argval = (rt_uint32_t) arg; if (argval != RT_CAN_MODE_NORMAL && @@ -188,18 +309,7 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar break; case RT_CAN_CMD_SET_BAUD: argval = (rt_uint32_t) arg; - if (argval != CAN1MBaud && - argval != CAN800kBaud && - argval != CAN500kBaud && - argval != CAN250kBaud && - argval != CAN125kBaud && - argval != CAN100kBaud && - argval != CAN50kBaud && - argval != CAN20kBaud && - argval != CAN10kBaud) - { - return -RT_ERROR; - } + if (argval != drv_can->device.config.baud_rate) { drv_can->device.config.baud_rate = argval; @@ -423,8 +533,11 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) /* RX interrupt */ else { + if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO0) != 0) + { /* save to user list */ rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } /* Clear FIFO0 rx Flag */ SET_BIT(h_can->perh->RXF0, CAN_RXF0_FREE_MSK); @@ -441,8 +554,11 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) /* RX interrupt */ else { + if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO1) != 0) + { /* save to user list */ rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } /* Clear FIFO0 rx Flag */ SET_BIT(h_can->perh->RXF1, CAN_RXF1_FREE_MSK); @@ -549,20 +665,12 @@ void CAN0_Handler(void) can.device.status.errcode = errtype & 0x07; h_can->perh->IFC |= CAN_IFC_ERRIFC_MSK; } - rt_interrupt_leave(); } int rt_hw_can_init(void) { gpio_init_t h_gpio; - struct can_configure config = CANDEFAULTCONFIG; - - config.privmode = RT_CAN_MODE_NOPRIV; - config.ticks = 50; -#ifdef RT_CAN_USING_HDR - config.maxhdr = 14; -#endif /* Initialize can common pin */ h_gpio.odos = GPIO_PUSH_PULL; @@ -570,15 +678,22 @@ int rt_hw_can_init(void) h_gpio.odrv = GPIO_OUT_DRIVE_NORMAL; h_gpio.flt = GPIO_FILTER_DISABLE; h_gpio.type = GPIO_TYPE_TTL; - h_gpio.func = GPIO_FUNC_4; +#if defined(ES_CAN0_RX_GPIO_FUNC)&&defined(ES_CAN0_RX_GPIO_PORT)&&defined(ES_CAN0_RX_GPIO_PIN) /* Initialize can rx pin */ - h_gpio.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOA, GPIO_PIN_11, &h_gpio); - + h_gpio.mode = GPIO_MODE_INPUT; + h_gpio.func = ES_CAN0_RX_GPIO_FUNC; + ald_gpio_init(ES_CAN0_RX_GPIO_PORT, ES_CAN0_RX_GPIO_PIN, &h_gpio); +#endif + + +#if defined(ES_CAN0_TX_GPIO_FUNC)&&defined(ES_CAN0_TX_GPIO_PORT)&&defined(ES_CAN0_TX_GPIO_PIN) /* Initialize can tx pin */ - h_gpio.mode = GPIO_MODE_OUTPUT; - ald_gpio_init(GPIOA, GPIO_PIN_12, &h_gpio); + h_gpio.mode = GPIO_MODE_OUTPUT; + h_gpio.func = ES_CAN0_TX_GPIO_FUNC; + ald_gpio_init(ES_CAN0_TX_GPIO_PORT, ES_CAN0_TX_GPIO_PIN, &h_gpio); +#endif + /* config default filter */ can_filter_t filter = {0}; @@ -587,15 +702,21 @@ int rt_hw_can_init(void) filter.mask_id_high = 0x0000; filter.mask_id_low = 0x0000; filter.fifo = CAN_FILTER_FIFO0; - filter.number = 0; + filter.number = ES_C_CAN_DEFAULT_FILTER_NUMBER; filter.mode = CAN_FILTER_MODE_MASK; filter.scale = CAN_FILTER_SCALE_32; filter.active = ENABLE; can.FilterConfig = filter; - can.device.config = config; + can.device.config = (struct can_configure)ES_CAN0_CONFIG; +#ifdef RT_CAN_USING_HDR + can.device.config.maxhdr = 14; +#endif + can.device.config.privmode = RT_CAN_MODE_NOPRIV; + can.device.config.ticks = 50; + can.device.config.reserved = ES_CAN0_SJW; /* register CAN1 device */ - rt_hw_can_register(&can.device, "can", &_can_ops, &can); + rt_hw_can_register(&can.device, ES_DEVICE_NAME_CAN0, &_can_ops, &can); return 0; } diff --git a/bsp/essemi/es32f0654/drivers/drv_can.h b/bsp/essemi/es32f0654/drivers/drv_can.h index 798a3a8653..c89f2bb2ae 100644 --- a/bsp/essemi/es32f0654/drivers/drv_can.h +++ b/bsp/essemi/es32f0654/drivers/drv_can.h @@ -3,9 +3,22 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-11-09 wangyq the first version + * 2019-11-09 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_CAN_H__ @@ -14,16 +27,9 @@ #include #include #include +#include "es_conf_info_can.h" -#include -#include - -struct es32f0_baud_rate_tab -{ - rt_uint32_t baud_rate; - rt_uint32_t config_data; -}; - +#ifdef RT_USING_CAN /* es32f0 can device */ struct es32f0_can { @@ -34,4 +40,5 @@ struct es32f0_can int rt_hw_can_init(void); +#endif #endif /*DRV_CAN_H__ */ diff --git a/bsp/essemi/es32f0654/drivers/drv_gpio.c b/bsp/essemi/es32f0654/drivers/drv_gpio.c index 142fcce7fc..00050866e5 100644 --- a/bsp/essemi/es32f0654/drivers/drv_gpio.c +++ b/bsp/essemi/es32f0654/drivers/drv_gpio.c @@ -1,103 +1,34 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes * 2019-01-23 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ -#include -#include #include "board.h" #include "drv_gpio.h" -#include -#include + +/*管脚映射在 es_conf_info_map.h 的 pins[] 中*/ #ifdef RT_USING_PIN -#define __ES32F0_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_PIN_##gpio_index} -#define __ES32F0_PIN_DEFAULT {-1, 0, 0} - -/* ES32F0 GPIO driver */ -struct pin_index -{ - int index; - GPIO_TypeDef *gpio; - uint32_t pin; -}; - -static const struct pin_index pins[] = -{ - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN(2, C, 13), - __ES32F0_PIN(3, C, 14), - __ES32F0_PIN(4, C, 15), - __ES32F0_PIN(5, H, 0), - __ES32F0_PIN(6, H, 1), - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN(8, C, 0), - __ES32F0_PIN(9, C, 1), - __ES32F0_PIN(10, C, 2), - __ES32F0_PIN(11, C, 3), - __ES32F0_PIN(12, H, 3), - __ES32F0_PIN(13, H, 4), - __ES32F0_PIN(14, A, 0), - __ES32F0_PIN(15, A, 1), - __ES32F0_PIN(16, A, 2), - __ES32F0_PIN(17, A, 3), - __ES32F0_PIN(18, F, 0), - __ES32F0_PIN(19, F, 1), - __ES32F0_PIN(20, A, 4), - __ES32F0_PIN(21, A, 5), - __ES32F0_PIN(22, A, 6), - __ES32F0_PIN(23, A, 7), - __ES32F0_PIN(24, C, 4), - __ES32F0_PIN(25, C, 5), - __ES32F0_PIN(26, B, 0), - __ES32F0_PIN(27, B, 1), - __ES32F0_PIN(28, B, 2), - __ES32F0_PIN(29, B, 10), - __ES32F0_PIN(30, B, 11), - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN(33, B, 12), - __ES32F0_PIN(34, B, 13), - __ES32F0_PIN(35, B, 14), - __ES32F0_PIN(36, B, 15), - __ES32F0_PIN(37, C, 6), - __ES32F0_PIN(38, C, 7), - __ES32F0_PIN(39, C, 8), - __ES32F0_PIN(40, C, 9), - __ES32F0_PIN(41, A, 8), - __ES32F0_PIN(42, A, 9), - __ES32F0_PIN(43, A, 10), - __ES32F0_PIN(44, A, 11), - __ES32F0_PIN(45, A, 12), - __ES32F0_PIN(46, A, 13), - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN(49, A, 14), - __ES32F0_PIN(50, A, 15), - __ES32F0_PIN(51, C, 10), - __ES32F0_PIN(52, C, 11), - __ES32F0_PIN(53, C, 12), - __ES32F0_PIN(54, D, 2), - __ES32F0_PIN(55, B, 3), - __ES32F0_PIN(56, B, 4), - __ES32F0_PIN(57, B, 5), - __ES32F0_PIN(58, B, 6), - __ES32F0_PIN(59, B, 7), - __ES32F0_PIN(60, H, 2), - __ES32F0_PIN(61, B, 8), - __ES32F0_PIN(62, B, 9), - __ES32F0_PIN_DEFAULT, - __ES32F0_PIN_DEFAULT, -}; - struct pin_irq_map { rt_uint16_t pinbit; @@ -143,6 +74,150 @@ struct rt_pin_irq_hdr pin_irq_hdr_tab[] = { -1, 0, RT_NULL, RT_NULL}, }; +#ifdef ES_CONF_EXTI_IRQ_0 + +RT_WEAK void irq_pin0_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 0\r\n"); +} +#endif + +#ifdef ES_CONF_EXTI_IRQ_1 + +RT_WEAK void irq_pin1_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 1\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_2 + + RT_WEAK void irq_pin2_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 2\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_3 + +RT_WEAK void irq_pin3_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 3\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_4 + +RT_WEAK void irq_pin4_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 4\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_5 + +RT_WEAK void irq_pin5_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 5\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_6 + +RT_WEAK void irq_pin6_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 6\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_7 + +RT_WEAK void irq_pin7_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 7\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_8 + +RT_WEAK void irq_pin8_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 8\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_9 + +RT_WEAK void irq_pin9_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 9\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_10 + +RT_WEAK void irq_pin10_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 10\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_11 + +RT_WEAK void irq_pin11_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 11\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_12 + +RT_WEAK void irq_pin12_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 12\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_13 + +RT_WEAK void irq_pin13_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 13\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_14 + +RT_WEAK void irq_pin14_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 14\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_15 + +RT_WEAK void irq_pin15_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 15\r\n"); +} + +#endif + + #define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) const struct pin_index *get_pin(uint8_t pin) { @@ -408,18 +483,9 @@ const static struct rt_pin_ops _es32f0_pin_ops = es32f0_pin_attach_irq, es32f0_pin_detach_irq, es32f0_pin_irq_enable, - RT_NULL, + /*RT_NULL,*/ }; -int rt_hw_pin_init(void) -{ - int result; - ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE); - result = rt_device_pin_register("pin", &_es32f0_pin_ops, RT_NULL); - return result; -} -INIT_BOARD_EXPORT(rt_hw_pin_init); - rt_inline void pin_irq_hdr(uint16_t GPIO_Pin) { uint16_t irqno; @@ -488,4 +554,44 @@ void EXTI12_15_Handler(void) rt_interrupt_leave(); } +int rt_hw_pin_init(void) +{ + int result; + + +#ifdef ES_INIT_GPIOS + + rt_size_t i,gpio_conf_num = sizeof(gpio_conf_all) / sizeof(gpio_conf_t); + +#endif + + ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE); + + result = rt_device_pin_register(ES_DEVICE_NAME_PIN, &_es32f0_pin_ops, RT_NULL); + + if(result != RT_EOK)return result; + +#ifdef ES_INIT_GPIOS + + for(i = 0;i < gpio_conf_num;i++) + { + rt_pin_mode( gpio_conf_all[i].pin,gpio_conf_all[i].pin_mode); + + if((gpio_conf_all[i].pin_mode == ES_C_GPIO_MODE_OUTPUT)||(gpio_conf_all[i].pin_mode == ES_C_GPIO_MODE_OUTPUT_OD)) + rt_pin_write(gpio_conf_all[i].pin,gpio_conf_all[i].pin_level); + + if(!gpio_conf_all[i].irq_en)continue; + + rt_pin_attach_irq(gpio_conf_all[i].pin, gpio_conf_all[i].irq_mode, gpio_conf_all[i].callback, RT_NULL); + rt_pin_irq_enable(gpio_conf_all[i].pin, gpio_conf_all[i].irq_en); + } + +#endif + + + + return result; +} +INIT_BOARD_EXPORT(rt_hw_pin_init); + #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_gpio.h b/bsp/essemi/es32f0654/drivers/drv_gpio.h index 3032af51ba..b0b68714d3 100644 --- a/bsp/essemi/es32f0654/drivers/drv_gpio.h +++ b/bsp/essemi/es32f0654/drivers/drv_gpio.h @@ -3,14 +3,29 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-01-23 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_GPIO_H__ #define DRV_GPIO_H__ +#include "es_conf_info_gpio.h" + int rt_hw_pin_init(void); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_hwtimer.c b/bsp/essemi/es32f0654/drivers/drv_hwtimer.c index 4d7614a323..83d3d9c87a 100644 --- a/bsp/essemi/es32f0654/drivers/drv_hwtimer.c +++ b/bsp/essemi/es32f0654/drivers/drv_hwtimer.c @@ -1,21 +1,33 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes * 2019-3-19 wangyq the first version * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include #include #include -#include -#include -#include +#include + #ifdef RT_USING_HWTIMER @@ -26,93 +38,172 @@ struct es32f0_hwtimer_dev IRQn_Type IRQn; }; -#ifdef BSP_USING_HWTIMER0 -static struct es32f0_hwtimer_dev hwtimer0; +#ifdef BSP_USING_AD16C4T0_HWTIMER +static struct es32f0_hwtimer_dev ad16c4t0_hwtimer; + +static struct rt_hwtimer_info ad16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_AD16C4T0_HWTIMER_MODE +}; + +void AD16C4T0_BRK_UP_TRIG_COM_Handler(void) +{ + ald_timer_clear_flag_status(ad16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&ad16c4t0_hwtimer.parent); +} + +#endif + +#ifdef BSP_USING_GP16C4T0_HWTIMER + +static struct es32f0_hwtimer_dev gp16c4t0_hwtimer; + +static struct rt_hwtimer_info gp16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C4T0_HWTIMER_MODE +}; + +void GP16C4T0_LCD_Handler(void) +{ + ald_timer_clear_flag_status(gp16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp16c4t0_hwtimer.parent); +} + +#endif + +#ifdef BSP_USING_GP16C2T0_HWTIMER + +static struct es32f0_hwtimer_dev gp16c2t0_hwtimer; + +static struct rt_hwtimer_info gp16c2t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C2T0_HWTIMER_MODE +}; + +void GP16C2T0_Handler(void) +{ + ald_timer_clear_flag_status(gp16c2t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp16c2t0_hwtimer.parent); +} + +#endif + +#ifdef BSP_USING_GP16C2T1_HWTIMER + +static struct es32f0_hwtimer_dev gp16c2t1_hwtimer; + +static struct rt_hwtimer_info gp16c2t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C2T1_HWTIMER_MODE +}; + +void GP16C2T1_Handler(void) +{ + ald_timer_clear_flag_status(gp16c2t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp16c2t1_hwtimer.parent); +} + +#endif + +#ifdef BSP_USING_BS16T0_HWTIMER + +static struct es32f0_hwtimer_dev bs16t0_hwtimer; + +static struct rt_hwtimer_info bs16t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T0_HWTIMER_MODE +}; void BS16T0_Handler(void) { - ald_timer_clear_flag_status(hwtimer0.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&hwtimer0.parent); - - if (HWTIMER_MODE_ONESHOT == hwtimer0.parent.mode) - { - ald_timer_base_stop(hwtimer0.hwtimer_periph); - } + ald_timer_clear_flag_status(bs16t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&bs16t0_hwtimer.parent); } + #endif -#ifdef BSP_USING_HWTIMER1 -static struct es32f0_hwtimer_dev hwtimer1; -/* can not use when UART2 Handler is enabled */ +#ifdef BSP_USING_BS16T1_HWTIMER + +static struct es32f0_hwtimer_dev bs16t1_hwtimer; + +static struct rt_hwtimer_info bs16t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T1_HWTIMER_MODE +}; + void BS16T1_UART2_Handler(void) { - /* if BS16T1 it */ - if (ald_timer_get_it_status(hwtimer1.hwtimer_periph, TIMER_IT_UPDATE) && - ald_timer_get_flag_status(hwtimer1.hwtimer_periph, TIMER_FLAG_UPDATE)) - { - ald_timer_clear_flag_status(hwtimer1.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&hwtimer1.parent); - - if (HWTIMER_MODE_ONESHOT == hwtimer1.parent.mode) - { - ald_timer_base_stop(hwtimer1.hwtimer_periph); - } - } + ald_timer_clear_flag_status(bs16t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&bs16t1_hwtimer.parent); } + #endif -#ifdef BSP_USING_HWTIMER2 -static struct es32f0_hwtimer_dev hwtimer2; -/* can not use when UART3 Handler is enabled */ +#ifdef BSP_USING_BS16T2_HWTIMER + +static struct es32f0_hwtimer_dev bs16t2_hwtimer; + +static struct rt_hwtimer_info bs16t2_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T2_HWTIMER_MODE +}; + void BS16T2_UART3_Handler(void) { - /* if BS16T2 it */ - if (ald_timer_get_it_status(hwtimer2.hwtimer_periph, TIMER_IT_UPDATE) && - ald_timer_get_flag_status(hwtimer2.hwtimer_periph, TIMER_FLAG_UPDATE)) - { - ald_timer_clear_flag_status(hwtimer2.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&hwtimer2.parent); - - if (HWTIMER_MODE_ONESHOT == hwtimer2.parent.mode) - { - ald_timer_base_stop(hwtimer2.hwtimer_periph); - } - } + ald_timer_clear_flag_status(bs16t2_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&bs16t2_hwtimer.parent); } + #endif -#ifdef BSP_USING_HWTIMER3 -static struct es32f0_hwtimer_dev hwtimer3; -/* can not use when DAC0 Handler is enabled */ +#ifdef BSP_USING_BS16T3_HWTIMER + +static struct es32f0_hwtimer_dev bs16t3_hwtimer; + +static struct rt_hwtimer_info bs16t3_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T3_HWTIMER_MODE +}; + void BS16T3_DAC0_Handler(void) { - /* if BS16T3 it */ - if (ald_timer_get_it_status(hwtimer3.hwtimer_periph, TIMER_IT_UPDATE) && - ald_timer_get_flag_status(hwtimer3.hwtimer_periph, TIMER_FLAG_UPDATE)) - { - ald_timer_clear_flag_status(hwtimer3.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&hwtimer3.parent); - - if (HWTIMER_MODE_ONESHOT == hwtimer3.parent.mode) - { - ald_timer_base_stop(hwtimer3.hwtimer_periph); - } - } + ald_timer_clear_flag_status(bs16t3_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&bs16t3_hwtimer.parent); } -#endif -static struct rt_hwtimer_info es32f0_hwtimer_info = -{ - 48000000, /* maximum count frequency */ - 1, /* minimum count frequency */ - 65535, /* counter maximum value */ - HWTIMER_CNTMODE_UP -}; +#endif static void es32f0_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) { struct es32f0_hwtimer_dev *hwtimer = (struct es32f0_hwtimer_dev *)timer->parent.user_data; + struct rt_hwtimer_info *hwtimer_info = (struct rt_hwtimer_info *)timer->info; + + RT_ASSERT(hwtimer != RT_NULL); if (1 == state) @@ -121,9 +212,10 @@ static void es32f0_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) ald_timer_interrupt_config(hwtimer->hwtimer_periph, TIMER_IT_UPDATE, ENABLE); NVIC_EnableIRQ(hwtimer->IRQn); } - hwtimer->parent.freq = ald_cmu_get_pclk1_clock(); - es32f0_hwtimer_info.maxfreq = ald_cmu_get_pclk1_clock(); - es32f0_hwtimer_info.minfreq = ald_cmu_get_pclk1_clock(); + + hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); + hwtimer_info->maxfreq = hwtimer->parent.freq; + hwtimer_info->minfreq = (hwtimer->parent.freq)/0xFFFF; } static rt_err_t es32f0_hwtimer_start(rt_hwtimer_t *timer, @@ -175,10 +267,37 @@ static rt_err_t es32f0_hwtimer_control(rt_hwtimer_t *timer, { case HWTIMER_CTRL_FREQ_SET: freq = *(rt_uint32_t *)args; - if (freq != ald_cmu_get_pclk1_clock()) - { - ret = -RT_ERROR; + + ret = -RT_ERROR; + + if(freq) + { + double temp,target; + temp = (double)ald_cmu_get_pclk1_clock(); + target = temp/freq; + + if(target < 0x10001) /*Ƶ = max(PRES)+1*/ + { + temp = target - (int)(target); + + if((temp > 0.998)&&(target < 0x10000)) + { + hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target; + ret = RT_EOK; + } + if((temp < 0.002)&&(target >= 0x1)) + { + hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target - 1; + ret = RT_EOK; + } + + } + + if(ret == RT_EOK) /*Ϣ*/ + hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); + } + break; case HWTIMER_CTRL_STOP: @@ -206,46 +325,127 @@ int rt_hw_hwtimer_init(void) { rt_err_t ret = RT_EOK; -#ifdef BSP_USING_HWTIMER0 - static timer_handle_t _hwtimer_periph0; - _hwtimer_periph0.perh = BS16T0; - hwtimer0.IRQn = BS16T0_IRQn; - hwtimer0.hwtimer_periph = &_hwtimer_periph0; - hwtimer0.parent.info = &es32f0_hwtimer_info; - hwtimer0.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer0.parent, "timer0", &hwtimer0); +#ifdef BSP_USING_AD16C4T0_HWTIMER + static timer_handle_t ad16c4t0_hwtimer_periph; + + ad16c4t0_hwtimer_periph.perh = AD16C4T0; + ad16c4t0_hwtimer.IRQn = AD16C4T0_BRK_UP_TRIG_COM_IRQn; + + ad16c4t0_hwtimer_periph.init.prescaler = ES_AD16C4T0_HWTIMER_PRES - 1; + ad16c4t0_hwtimer_periph.init.mode = ( ES_AD16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + ad16c4t0_hwtimer.hwtimer_periph = &ad16c4t0_hwtimer_periph; + + ad16c4t0_hwtimer.parent.info = &ad16c4t0_info; + ad16c4t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&ad16c4t0_hwtimer.parent, ES_DEVICE_NAME_AD16C4T0_HWTIMER, &ad16c4t0_hwtimer); #endif -#ifdef BSP_USING_HWTIMER1 - static timer_handle_t _hwtimer_periph1; - _hwtimer_periph1.perh = BS16T1; - hwtimer1.IRQn = BS16T1_UART2_IRQn; - hwtimer1.hwtimer_periph = &_hwtimer_periph1; - hwtimer1.parent.info = &es32f0_hwtimer_info; - hwtimer1.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer1.parent, "timer1", &hwtimer1); +#ifdef BSP_USING_GP16C4T0_HWTIMER + static timer_handle_t gp16c4t0_hwtimer_periph; + + gp16c4t0_hwtimer_periph.perh = GP16C4T0; + gp16c4t0_hwtimer.IRQn = GP16C4T0_LCD_IRQn; + + gp16c4t0_hwtimer_periph.init.prescaler = ES_GP16C4T0_HWTIMER_PRES - 1; + gp16c4t0_hwtimer_periph.init.mode = ( ES_GP16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t0_hwtimer.hwtimer_periph = &gp16c4t0_hwtimer_periph; + + gp16c4t0_hwtimer.parent.info = &gp16c4t0_info; + gp16c4t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp16c4t0_hwtimer.parent, ES_DEVICE_NAME_GP16C4T0_HWTIMER, &gp16c4t0_hwtimer); #endif -#ifdef BSP_USING_HWTIMER2 - static timer_handle_t _hwtimer_periph2; - _hwtimer_periph2.perh = BS16T2; - hwtimer2.IRQn = BS16T2_UART3_IRQn; - hwtimer2.hwtimer_periph = &_hwtimer_periph2; - hwtimer2.parent.info = &es32f0_hwtimer_info; - hwtimer2.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer2.parent, "timer2", &hwtimer2); +#ifdef BSP_USING_GP16C2T0_HWTIMER + static timer_handle_t gp16c2t0_hwtimer_periph; + + gp16c2t0_hwtimer_periph.perh = GP16C2T0; + gp16c2t0_hwtimer.IRQn = GP16C2T0_IRQn; + + gp16c2t0_hwtimer_periph.init.prescaler = ES_GP16C2T0_HWTIMER_PRES - 1; + gp16c2t0_hwtimer_periph.init.mode = ( ES_GP16C2T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c2t0_hwtimer.hwtimer_periph = &gp16c2t0_hwtimer_periph; + + gp16c2t0_hwtimer.parent.info = &gp16c2t0_info; + gp16c2t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp16c2t0_hwtimer.parent, ES_DEVICE_NAME_GP16C2T0_HWTIMER, &gp16c2t0_hwtimer); #endif -#ifdef BSP_USING_HWTIMER3 - static timer_handle_t _hwtimer_periph3; - _hwtimer_periph3.perh = BS16T3; - hwtimer3.IRQn = BS16T3_DAC0_IRQn; - hwtimer3.hwtimer_periph = &_hwtimer_periph3; - hwtimer3.parent.info = &es32f0_hwtimer_info; - hwtimer3.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer3.parent, "timer3", &hwtimer3); +#ifdef BSP_USING_GP16C2T1_HWTIMER + static timer_handle_t gp16c2t1_hwtimer_periph; + + gp16c2t1_hwtimer_periph.perh = GP16C2T1; + gp16c2t1_hwtimer.IRQn = GP16C2T1_IRQn; + + gp16c2t1_hwtimer_periph.init.prescaler = ES_GP16C2T1_HWTIMER_PRES - 1; + gp16c2t1_hwtimer_periph.init.mode = ( ES_GP16C2T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c2t1_hwtimer.hwtimer_periph = &gp16c2t1_hwtimer_periph; + + gp16c2t1_hwtimer.parent.info = &gp16c2t1_info; + gp16c2t1_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp16c2t1_hwtimer.parent, ES_DEVICE_NAME_GP16C2T1_HWTIMER, &gp16c2t1_hwtimer); #endif +#ifdef BSP_USING_BS16T0_HWTIMER + static timer_handle_t bs16t0_hwtimer_periph; + + bs16t0_hwtimer_periph.perh = BS16T0; + bs16t0_hwtimer.IRQn = BS16T0_IRQn; + + bs16t0_hwtimer_periph.init.prescaler = ES_BS16T0_HWTIMER_PRES - 1; + bs16t0_hwtimer_periph.init.mode = ( ES_BS16T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t0_hwtimer.hwtimer_periph = &bs16t0_hwtimer_periph; + + bs16t0_hwtimer.parent.info = &bs16t0_info; + bs16t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&bs16t0_hwtimer.parent, ES_DEVICE_NAME_BS16T0_HWTIMER, &bs16t0_hwtimer); +#endif + +#ifdef BSP_USING_BS16T1_HWTIMER + static timer_handle_t bs16t1_hwtimer_periph; + + bs16t1_hwtimer_periph.perh = BS16T1; + bs16t1_hwtimer.IRQn = BS16T1_UART2_IRQn; + + bs16t1_hwtimer_periph.init.prescaler = ES_BS16T1_HWTIMER_PRES - 1; + bs16t1_hwtimer_periph.init.mode = ( ES_BS16T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t1_hwtimer.hwtimer_periph = &bs16t1_hwtimer_periph; + + bs16t1_hwtimer.parent.info = &bs16t1_info; + bs16t1_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&bs16t1_hwtimer.parent, ES_DEVICE_NAME_BS16T1_HWTIMER, &bs16t1_hwtimer); +#endif + +#ifdef BSP_USING_BS16T2_HWTIMER + static timer_handle_t bs16t2_hwtimer_periph; + + bs16t2_hwtimer_periph.perh = BS16T2; + bs16t2_hwtimer.IRQn = BS16T2_UART3_IRQn; + + bs16t2_hwtimer_periph.init.prescaler = ES_BS16T2_HWTIMER_PRES - 1; + bs16t2_hwtimer_periph.init.mode = ( ES_BS16T2_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t2_hwtimer.hwtimer_periph = &bs16t2_hwtimer_periph; + + bs16t2_hwtimer.parent.info = &bs16t2_info; + bs16t2_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&bs16t2_hwtimer.parent, ES_DEVICE_NAME_BS16T2_HWTIMER, &bs16t2_hwtimer); +#endif + +#ifdef BSP_USING_BS16T3_HWTIMER + static timer_handle_t bs16t3_hwtimer_periph; + + bs16t3_hwtimer_periph.perh = BS16T3; + bs16t3_hwtimer.IRQn = BS16T3_DAC0_IRQn; + + bs16t3_hwtimer_periph.init.prescaler = ES_BS16T3_HWTIMER_PRES - 1; + bs16t3_hwtimer_periph.init.mode = ( ES_BS16T3_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t3_hwtimer.hwtimer_periph = &bs16t3_hwtimer_periph; + + bs16t3_hwtimer.parent.info = &bs16t3_info; + bs16t3_hwtimer.parent.ops = &es32f0_hwtimer_ops; + ret = rt_device_hwtimer_register(&bs16t3_hwtimer.parent, ES_DEVICE_NAME_BS16T3_HWTIMER, &bs16t3_hwtimer); +#endif + + return ret; } INIT_BOARD_EXPORT(rt_hw_hwtimer_init); diff --git a/bsp/essemi/es32f0654/drivers/drv_hwtimer.h b/bsp/essemi/es32f0654/drivers/drv_hwtimer.h index e18d580fbd..46e307a5c3 100644 --- a/bsp/essemi/es32f0654/drivers/drv_hwtimer.h +++ b/bsp/essemi/es32f0654/drivers/drv_hwtimer.h @@ -3,14 +3,28 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-3-19 wangyq the first version + * 2019-3-19 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_HWTIMER_H__ #define DRV_HWTIMER_H__ +#include "es_conf_info_hwtimer.h" int rt_hw_hwtimer_init(void); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_i2c.c b/bsp/essemi/es32f0654/drivers/drv_i2c.c index 399e1427ef..1109b7f641 100644 --- a/bsp/essemi/es32f0654/drivers/drv_i2c.c +++ b/bsp/essemi/es32f0654/drivers/drv_i2c.c @@ -1,8 +1,19 @@ /* - * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-01-24 wangyq the first version @@ -10,19 +21,24 @@ * 2020-12-15 liuhy update libraries */ +#include #include #include -#include #include "board.h" #include "drv_i2c.h" -#include -#include + #ifdef RT_USING_I2C #define TIMEOUT 0x0FFF /* I2C struct definition */ -static i2c_handle_t _h_i2c0, _h_i2c1; +#ifdef BSP_USING_I2C0 + static i2c_handle_t _h_i2c0; +#endif + +#ifdef BSP_USING_I2C1 + static i2c_handle_t _h_i2c1; +#endif static void _i2c_init(void) { @@ -38,35 +54,55 @@ static void _i2c_init(void) gpio_instruct.func = GPIO_FUNC_5; #ifdef BSP_USING_I2C0 + +#if defined(ES_I2C0_SCL_GPIO_FUNC)&&defined(ES_I2C0_SCL_GPIO_PORT)&&defined(ES_I2C0_SCL_GPIO_PIN) + gpio_instruct.func = ES_I2C0_SCL_GPIO_FUNC; + ald_gpio_init(ES_I2C0_SCL_GPIO_PORT, ES_I2C0_SCL_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_I2C0_SDA_GPIO_FUNC)&&defined(ES_I2C0_SDA_GPIO_PORT)&&defined(ES_I2C0_SDA_GPIO_PIN) + gpio_instruct.func = ES_I2C0_SDA_GPIO_FUNC; + ald_gpio_init(ES_I2C0_SDA_GPIO_PORT, ES_I2C0_SDA_GPIO_PIN, &gpio_instruct); +#endif + /* Initialize I2C Function */ _h_i2c0.perh = I2C0; - _h_i2c0.init.clk_speed = 100000; _h_i2c0.init.duty = I2C_DUTYCYCLE_2; - _h_i2c0.init.own_addr1 = 0x0A; - _h_i2c0.init.addr_mode = I2C_ADDR_7BIT; - _h_i2c0.init.general_call = I2C_GENERALCALL_DISABLE; - _h_i2c0.init.no_stretch = I2C_NOSTRETCH_ENABLE; + _h_i2c0.init.clk_speed = ES_I2C0_CLK_SPEED; + _h_i2c0.init.own_addr1 = ES_I2C0_OWN_ADDR1; + _h_i2c0.init.addr_mode = ES_I2C0_ADDR_MODE; + _h_i2c0.init.general_call = ES_I2C0_GENERAL_CALL; + _h_i2c0.init.no_stretch = ES_I2C0_STRETCH; ald_i2c_reset(&_h_i2c0); ald_i2c_init(&_h_i2c0); - /* I2C0_SCL->PB8, I2C0_SDA->PB9 */ - ald_gpio_init(GPIOB, GPIO_PIN_8 | GPIO_PIN_9, &gpio_instruct); + #endif #ifdef BSP_USING_I2C1 + +#if defined(ES_I2C1_SDA_GPIO_FUNC)&&defined(ES_I2C1_SDA_GPIO_PORT)&&defined(ES_I2C1_SDA_GPIO_PIN) + gpio_instruct.func = ES_I2C1_SDA_GPIO_FUNC; + ald_gpio_init(ES_I2C1_SDA_GPIO_PORT, ES_I2C1_SDA_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_I2C1_SDA_GPIO_FUNC)&&defined(ES_I2C1_SDA_GPIO_PORT)&&defined(ES_I2C1_SDA_GPIO_PIN) + gpio_instruct.func = ES_I2C1_SDA_GPIO_FUNC; + ald_gpio_init(ES_I2C1_SDA_GPIO_PORT, ES_I2C1_SDA_GPIO_PIN, &gpio_instruct); +#endif + /* Initialize i2c function */ _h_i2c1.perh = I2C1; - _h_i2c1.init.clk_speed = 100000; - _h_i2c1.init.duty = I2C_DUTYCYCLE_2; - _h_i2c1.init.own_addr1 = 0xA0; - _h_i2c1.init.addr_mode = I2C_ADDR_7BIT; - _h_i2c1.init.general_call = I2C_GENERALCALL_DISABLE; - _h_i2c1.init.no_stretch = I2C_NOSTRETCH_ENABLE; - + _h_i2c1.init.duty = I2C_DUTYCYCLE_2; + _h_i2c1.init.clk_speed = ES_I2C1_CLK_SPEED; + _h_i2c1.init.own_addr1 = ES_I2C1_OWN_ADDR1; + _h_i2c1.init.addr_mode = ES_I2C1_ADDR_MODE; + _h_i2c1.init.general_call = ES_I2C1_GENERAL_CALL; + _h_i2c1.init.no_stretch = ES_I2C1_STRETCH; + ald_i2c_reset(&_h_i2c1); ald_i2c_init(&_h_i2c1); - /* I2C1_SCL->PB10, I2C1_SDA->PB11 */ - ald_gpio_init(GPIOB, GPIO_PIN_10 | GPIO_PIN_11, &gpio_instruct); + #endif } @@ -116,6 +152,8 @@ const struct rt_i2c_bus_device_ops es32f0_i2c_ops = int rt_hw_i2c_init(void) { + int result = RT_EOK; + _i2c_init(); #ifdef BSP_USING_I2C0 @@ -124,16 +162,25 @@ int rt_hw_i2c_init(void) rt_memset((void *)&_i2c_device0, 0, sizeof(struct rt_i2c_bus_device)); _i2c_device0.ops = &es32f0_i2c_ops; _i2c_device0.priv = &_h_i2c0; - rt_i2c_bus_device_register(&_i2c_device0, "i2c0"); + result = rt_i2c_bus_device_register(&_i2c_device0, ES_DEVICE_NAME_I2C0); + if (result != RT_EOK) + { + return result; + } #endif #ifdef BSP_USING_I2C1 /* define i2c Instance */ static struct rt_i2c_bus_device _i2c_device1; rt_memset((void *)&_i2c_device1, 0, sizeof(struct rt_i2c_bus_device)); + _i2c_device1.ops = &es32f0_i2c_ops; _i2c_device1.priv = &_h_i2c1; - rt_i2c_bus_device_register(&_i2c_device1, "i2c1"); + rt_i2c_bus_device_register(&_i2c_device1, ES_DEVICE_NAME_I2C1); + if (result != RT_EOK) + { + return result; + } #endif return RT_EOK; diff --git a/bsp/essemi/es32f0654/drivers/drv_i2c.h b/bsp/essemi/es32f0654/drivers/drv_i2c.h index 84c32561c8..b5cc316ee7 100644 --- a/bsp/essemi/es32f0654/drivers/drv_i2c.h +++ b/bsp/essemi/es32f0654/drivers/drv_i2c.h @@ -1,16 +1,31 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2019-01-24 wangyq the first version + * 2019-01-24 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_I2C_H__ #define DRV_I2C_H__ +#include "es_conf_info_i2c.h" + int rt_hw_i2c_init(void); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_pm.c b/bsp/essemi/es32f0654/drivers/drv_pm.c index 669514c7b8..c1b4c41237 100644 --- a/bsp/essemi/es32f0654/drivers/drv_pm.c +++ b/bsp/essemi/es32f0654/drivers/drv_pm.c @@ -3,20 +3,30 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-04-08 wangyq the first version * 2019-11-01 wangyq adapt to the new power management interface + * 2020-12-15 liuhy the first version */ -#include -#include -#include -#include -#include +#include "drv_pm.h" #ifdef RT_USING_PM + static void uart_console_reconfig(void) { struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; @@ -24,26 +34,14 @@ static void uart_console_reconfig(void) rt_device_control(rt_console_get_device(), RT_DEVICE_CTRL_CONFIG, &config); } -static void delay(void) -{ - long i; - rt_base_t level; - - level = rt_hw_interrupt_disable(); - i = 0; - do{ - i++; - } - while (i < 10000); - - rt_hw_interrupt_enable(level); -} - /** - * This function will put ES32F033x into sleep mode. + * This function will put ES32F065x into sleep mode. * * @param pm pointer to power manage structure */ + + +/* 注意:进入睡眠前,如果有中断挂起(SYSTICK、PENDSV、UART、EXTI等),睡眠将被瞬间唤醒。*/ static void sleep(struct rt_pm *pm, uint8_t mode) { switch (mode) @@ -52,31 +50,26 @@ static void sleep(struct rt_pm *pm, uint8_t mode) break; case PM_SLEEP_MODE_IDLE: - //__WFI(); break; case PM_SLEEP_MODE_LIGHT: /* Enter SLEEP Mode, Main regulator is ON */ ald_pmu_stop1_enter(); - delay(); break; - case PM_SLEEP_MODE_DEEP: - /* Enter STOP 2 mode */ + case PM_SLEEP_MODE_DEEP: + /* Enter STOP 2 mode */ ald_pmu_stop2_enter(); - delay(); break; case PM_SLEEP_MODE_STANDBY: - /* Enter STANDBY mode */ + /* Enter STANDBY mode */ ald_pmu_stop2_enter(); - delay(); break; case PM_SLEEP_MODE_SHUTDOWN: - /* Enter SHUTDOWNN mode */ + /* Enter SHUTDOWNN mode */ ald_pmu_stop2_enter(); - delay(); break; default: diff --git a/bsp/essemi/es32f0654/drivers/drv_pm.h b/bsp/essemi/es32f0654/drivers/drv_pm.h index a4f6cc84ee..e43ba09c26 100644 --- a/bsp/essemi/es32f0654/drivers/drv_pm.h +++ b/bsp/essemi/es32f0654/drivers/drv_pm.h @@ -3,7 +3,20 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: + * Date Author Notes * 2019-04-01 wangyq the first version */ @@ -11,6 +24,12 @@ #ifndef DRV_PM_H__ #define DRV_PM_H__ +#include +#include +#include +#include "es_conf_info_pm.h" +#include + int rt_hw_pm_init(void); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_pwm.c b/bsp/essemi/es32f0654/drivers/drv_pwm.c index d324e2bbbb..59e8494241 100644 --- a/bsp/essemi/es32f0654/drivers/drv_pwm.c +++ b/bsp/essemi/es32f0654/drivers/drv_pwm.c @@ -3,28 +3,33 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-03-11 wangyq the first version * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include #include #include -#include -#include -#include +#include "es_conf_info_pwm.h" -static void pwm_set_freq(timer_handle_t *timer_initstruct, uint32_t ns) -{ - uint64_t _arr = (uint64_t)ald_cmu_get_pclk1_clock() * ns / 1000000000 / - (timer_initstruct->init.prescaler + 1); - WRITE_REG(timer_initstruct->perh->AR, (uint32_t)_arr); - timer_initstruct->init.period = (uint32_t)_arr; -} +#ifdef RT_USING_PWM static void pwm_set_duty(timer_handle_t *timer_initstruct, timer_channel_t ch, uint32_t ns) { @@ -44,7 +49,8 @@ static void pwm_set_duty(timer_handle_t *timer_initstruct, timer_channel_t ch, u static rt_err_t es32f0_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) { rt_err_t ret = RT_EOK; - uint32_t _ccep; + uint64_t _arr,bus_speed,tmp; + uint32_t _maxcnt,_ccep_ch_en = 0U; timer_channel_t pwm_channel; timer_oc_init_t tim_ocinit; timer_handle_t *timer_initstruct = (timer_handle_t *)device->parent.user_data; @@ -52,39 +58,30 @@ static rt_err_t es32f0_pwm_control(struct rt_device_pwm *device, int cmd, void * RT_ASSERT(timer_initstruct != RT_NULL); - tim_ocinit.oc_mode = TIMER_OC_MODE_PWM1; - tim_ocinit.oc_polarity = TIMER_OC_POLARITY_HIGH; - tim_ocinit.oc_fast_en = DISABLE; - tim_ocinit.ocn_polarity = TIMER_OCN_POLARITY_HIGH; - tim_ocinit.ocn_idle = TIMER_OCN_IDLE_RESET; - tim_ocinit.oc_idle = TIMER_OC_IDLE_RESET; - /* select pwm output channel */ if (1 == cfg->channel) { pwm_channel = TIMER_CHANNEL_1; + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC1EN_MSK; } - else if (2 == cfg->channel) + else if (2 == cfg->channel) { pwm_channel = TIMER_CHANNEL_2; + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC2EN_MSK; } - else if (3 == cfg->channel) + else if (3 == cfg->channel) { - if (timer_initstruct->perh == GP16C2T0 || timer_initstruct->perh == GP16C2T1) - return RT_EINVAL; pwm_channel = TIMER_CHANNEL_3; + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC3EN_MSK; } - else if (4 == cfg->channel) + else if (4 == cfg->channel) { - if (timer_initstruct->perh == GP16C2T0 || timer_initstruct->perh == GP16C2T1) - return RT_EINVAL; pwm_channel = TIMER_CHANNEL_4; + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC4EN_MSK; } else - { return RT_EINVAL; - } - + switch (cmd) { case PWM_CMD_ENABLE: @@ -96,19 +93,44 @@ static rt_err_t es32f0_pwm_control(struct rt_device_pwm *device, int cmd, void * break; case PWM_CMD_SET: - _ccep = timer_initstruct->perh->CCEP; - /* count registers max 0xFFFF, auto adjust prescaler */ + + /*当通道没开的时候:关通道,设置输出模式和极性,初始化通道*/ + if(!_ccep_ch_en) + { + tim_ocinit.oc_mode = ES_PWM_OC_MODE; + tim_ocinit.oc_polarity = ES_PWM_OC_POLARITY; + tim_ocinit.oc_fast_en = DISABLE; + tim_ocinit.ocn_polarity = TIMER_OCN_POLARITY_HIGH; + tim_ocinit.ocn_idle = TIMER_OCN_IDLE_RESET; + tim_ocinit.oc_idle = TIMER_OC_IDLE_RESET; + ald_timer_oc_config_channel(timer_initstruct, &tim_ocinit, pwm_channel); + } + + bus_speed = (uint64_t)ald_cmu_get_pclk1_clock(); + + /*外设的计数器最大值*/ + _maxcnt = 0xFFFF; + + /*当最大分频 <= _maxcnt时:估计大概的分频,加快速度 */ + tmp = bus_speed * (cfg->period)/1000000000/_maxcnt; + timer_initstruct->init.prescaler = (tmp > 2U) ? (tmp - 2U) : 0U ; /*bus_speed < 500000000*/ + + /* count registers max , auto adjust prescaler */ do { - pwm_set_freq(timer_initstruct, cfg->period); - timer_initstruct->init.prescaler ++; + _arr = bus_speed * (cfg->period) / 1000000000 /(++timer_initstruct->init.prescaler); + } - while (timer_initstruct->init.period > 0xFFFF); + while (_arr > _maxcnt); + + WRITE_REG(timer_initstruct->perh->AR, (uint32_t)_arr); + timer_initstruct->init.period = (uint32_t)_arr; + /* update prescaler */ WRITE_REG(timer_initstruct->perh->PRES, --timer_initstruct->init.prescaler); - ald_timer_oc_config_channel(timer_initstruct, &tim_ocinit, pwm_channel); + pwm_set_duty(timer_initstruct, pwm_channel, cfg->pulse); - timer_initstruct->perh->CCEP = _ccep; + break; case PWM_CMD_GET: @@ -139,74 +161,124 @@ int rt_hw_pwm_init(void) gpio_initstructure.flt = GPIO_FILTER_DISABLE; gpio_initstructure.type = GPIO_TYPE_TTL; -#ifdef BSP_USING_PWM0 /* 4 channels */ - static struct rt_device_pwm pwm_dev0; - static timer_handle_t timer_initstruct0; +#ifdef BSP_USING_AD16C4T0_PWM /* 4 channels */ + static struct rt_device_pwm ad16c4t0_pwm_dev; + static timer_handle_t ad16c4t0_timer_initstruct; - timer_initstruct0.perh = AD16C4T0; - ald_timer_pwm_init(&timer_initstruct0); + ad16c4t0_timer_initstruct.perh = AD16C4T0; + ald_timer_pwm_init(&ad16c4t0_timer_initstruct); /* gpio initialization */ - gpio_initstructure.func = GPIO_FUNC_2; - ald_gpio_init(GPIOA, GPIO_PIN_8, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_9, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_10, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_11, &gpio_initstructure); - ret = rt_device_pwm_register(&pwm_dev0, "pwm0", &es32f0_pwm_ops, - &timer_initstruct0); +#if defined(ES_AD16C4T0_CH1_GPIO_FUNC)&&defined(ES_AD16C4T0_CH1_GPIO_PORT)&&defined(ES_AD16C4T0_CH1_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T0_CH1_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH1_GPIO_PORT, ES_AD16C4T0_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T0_CH2_GPIO_FUNC)&&defined(ES_AD16C4T0_CH2_GPIO_PORT)&&defined(ES_AD16C4T0_CH2_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T0_CH2_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH2_GPIO_PORT, ES_AD16C4T0_CH2_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T0_CH3_GPIO_FUNC)&&defined(ES_AD16C4T0_CH3_GPIO_PORT)&&defined(ES_AD16C4T0_CH3_GPIO_FUNC) + gpio_initstructure.func = ES_AD16C4T0_CH3_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH3_GPIO_PORT, ES_AD16C4T0_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T0_CH4_GPIO_FUNC)&&defined(ES_AD16C4T0_CH4_GPIO_PORT)&&defined(ES_AD16C4T0_CH4_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T0_CH4_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH4_GPIO_PORT, ES_AD16C4T0_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&ad16c4t0_pwm_dev, ES_DEVICE_NAME_AD16C4T0_PWM, &es32f0_pwm_ops, + &ad16c4t0_timer_initstruct); #endif -#ifdef BSP_USING_PWM1 /* 4 channels */ - static struct rt_device_pwm pwm_dev1; - static timer_handle_t timer_initstruct1; +#ifdef BSP_USING_GP16C4T0_PWM /* 4 channels */ + static struct rt_device_pwm gp16c4t0_pwm_dev; + static timer_handle_t gp16c4t0_timer_initstruct; - timer_initstruct1.perh = GP16C4T0; - ald_timer_pwm_init(&timer_initstruct1); + gp16c4t0_timer_initstruct.perh = GP16C4T0; + ald_timer_pwm_init(&gp16c4t0_timer_initstruct); /* gpio initialization */ - gpio_initstructure.func = GPIO_FUNC_2; - ald_gpio_init(GPIOB, GPIO_PIN_6, &gpio_initstructure); - ald_gpio_init(GPIOB, GPIO_PIN_7, &gpio_initstructure); - ald_gpio_init(GPIOB, GPIO_PIN_8, &gpio_initstructure); - ald_gpio_init(GPIOB, GPIO_PIN_9, &gpio_initstructure); + +#if defined(ES_GP16C4T0_CH1_GPIO_FUNC)&&defined(ES_GP16C4T0_CH1_GPIO_PORT)&&defined(ES_GP16C4T0_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH1_GPIO_PORT, ES_GP16C4T0_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T0_CH2_GPIO_FUNC)&&defined(ES_GP16C4T0_CH2_GPIO_PORT)&&defined(ES_GP16C4T0_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH2_GPIO_PORT, ES_GP16C4T0_CH2_GPIO_PIN, &gpio_initstructure); +#endif - ret = rt_device_pwm_register(&pwm_dev1, "pwm1", &es32f0_pwm_ops, - &timer_initstruct1); +#if defined(ES_GP16C4T0_CH3_GPIO_FUNC)&&defined(ES_GP16C4T0_CH3_GPIO_PORT)&&defined(ES_GP16C4T0_CH3_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH3_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH3_GPIO_PORT, ES_GP16C4T0_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T0_CH4_GPIO_FUNC)&&defined(ES_GP16C4T0_CH4_GPIO_PORT)&&defined(ES_GP16C4T0_CH4_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH4_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH4_GPIO_PORT, ES_GP16C4T0_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&gp16c4t0_pwm_dev, ES_DEVICE_NAME_GP16C4T0_PWM, &es32f0_pwm_ops, + &gp16c4t0_timer_initstruct); #endif -#ifdef BSP_USING_PWM2 /* 2 channels */ - static struct rt_device_pwm pwm_dev2; - static timer_handle_t timer_initstruct2; - timer_initstruct2.perh = GP16C2T0; - ald_timer_pwm_init(&timer_initstruct2); +#ifdef BSP_USING_GP16C2T0_PWM /* 2 channels */ + static struct rt_device_pwm gp16c2t0_pwm_dev; + static timer_handle_t gp16c2t0_timer_initstruct; + + gp16c2t0_timer_initstruct.perh = GP16C2T0; + ald_timer_pwm_init(&gp16c2t0_timer_initstruct); /* gpio initialization */ - gpio_initstructure.func = GPIO_FUNC_2; - ald_gpio_init(GPIOA, GPIO_PIN_0, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_1, &gpio_initstructure); + +#if defined(ES_GP16C2T0_CH1_GPIO_FUNC)&&defined(ES_GP16C2T0_CH1_GPIO_PORT)&&defined(ES_GP16C2T0_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP16C2T0_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP16C2T0_CH1_GPIO_PORT, ES_GP16C2T0_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C2T0_CH2_GPIO_FUNC)&&defined(ES_GP16C2T0_CH2_GPIO_PORT)&&defined(ES_GP16C2T0_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP16C2T0_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP16C2T0_CH2_GPIO_PORT, ES_GP16C2T0_CH2_GPIO_PIN, &gpio_initstructure); +#endif - ret = rt_device_pwm_register(&pwm_dev2, "pwm2", &es32f0_pwm_ops, - &timer_initstruct2); + ret = rt_device_pwm_register(&gp16c2t0_pwm_dev, ES_DEVICE_NAME_GP16C2T0_PWM, &es32f0_pwm_ops, + &gp16c2t0_timer_initstruct); #endif -#ifdef BSP_USING_PWM3 /* 2 channels */ - static struct rt_device_pwm pwm_dev3; - static timer_handle_t timer_initstruct3; - timer_initstruct3.perh = GP16C2T1; - ald_timer_pwm_init(&timer_initstruct3); +#ifdef BSP_USING_GP16C2T1_PWM /* 2 channels */ + static struct rt_device_pwm gp16c2t1_pwm_dev; + static timer_handle_t gp16c2t1_timer_initstruct; + + gp16c2t1_timer_initstruct.perh = GP16C2T1; + ald_timer_pwm_init(&gp16c2t1_timer_initstruct); /* gpio initialization */ - gpio_initstructure.func = GPIO_FUNC_3; - ald_gpio_init(GPIOC, GPIO_PIN_6, &gpio_initstructure); - ald_gpio_init(GPIOC, GPIO_PIN_7, &gpio_initstructure); + +#if defined(ES_GP16C2T1_CH1_GPIO_FUNC)&&defined(ES_GP16C2T1_CH1_GPIO_PORT)&&defined(ES_GP16C2T1_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP16C2T1_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP16C2T1_CH1_GPIO_PORT, ES_GP16C2T1_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C2T1_CH2_GPIO_FUNC)&&defined(ES_GP16C2T1_CH2_GPIO_PORT)&&defined(ES_GP16C2T1_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP16C2T1_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP16C2T1_CH2_GPIO_PORT, ES_GP16C2T1_CH2_GPIO_PIN, &gpio_initstructure); +#endif - ret = rt_device_pwm_register(&pwm_dev3, "pwm3", &es32f0_pwm_ops, - &timer_initstruct3); + ret = rt_device_pwm_register(&gp16c2t1_pwm_dev, ES_DEVICE_NAME_GP16C2T1_PWM, &es32f0_pwm_ops, + &gp16c2t1_timer_initstruct); #endif + + return ret; } INIT_DEVICE_EXPORT(rt_hw_pwm_init); + +#endif diff --git a/bsp/essemi/es32f0654/drivers/drv_pwm.h b/bsp/essemi/es32f0654/drivers/drv_pwm.h index f4fcfe7cff..3383e7ba1c 100644 --- a/bsp/essemi/es32f0654/drivers/drv_pwm.h +++ b/bsp/essemi/es32f0654/drivers/drv_pwm.h @@ -3,6 +3,18 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-03-11 wangyq the first version diff --git a/bsp/essemi/es32f0654/drivers/drv_rtc.c b/bsp/essemi/es32f0654/drivers/drv_rtc.c index cab5b8b61b..ee7589090b 100644 --- a/bsp/essemi/es32f0654/drivers/drv_rtc.c +++ b/bsp/essemi/es32f0654/drivers/drv_rtc.c @@ -3,26 +3,38 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-03-22 wangyq the first version * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include -#include +#include #include #include #include "board.h" -#include "drv_rtc.h" -#include -#include +#include "drv_rtc.h" #ifdef RT_USING_RTC static void __rtc_init(rtc_init_t *init) { + assert_param(IS_RTC_HOUR_FORMAT(init->hour_format)); assert_param(IS_RTC_OUTPUT_SEL(init->output)); assert_param(IS_RTC_OUTPUT_POLARITY(init->output_polarity)); @@ -117,10 +129,16 @@ int rt_hw_rtc_init(void) rt_err_t ret = RT_EOK; static struct rt_device rtc_dev; rtc_init_t rtc_initstruct; + + /* enable clk */ + ald_rtc_source_select(ES_RTC_CLK_SOURCE); - /* enable external 32.768kHz */ - CMU_LOSC_ENABLE(); - ald_cmu_losc_safe_config(ENABLE); + if(ES_RTC_CLK_SOURCE == ES_C_RTC_SOURCE_LOSC) + { + CMU_LOSC_ENABLE(); + ald_cmu_losc_safe_config(ENABLE); + } + /* set default time */ RTC_UNLOCK(); WRITE_REG(RTC->TIME, 0x134251); @@ -131,6 +149,8 @@ int rt_hw_rtc_init(void) rtc_initstruct.asynch_pre_div = 0; rtc_initstruct.synch_pre_div = 32767; rtc_initstruct.output = RTC_OUTPUT_DISABLE; + rtc_initstruct.output_polarity = RTC_OUTPUT_POLARITY_HIGH; + __rtc_init(&rtc_initstruct); rtc_dev.type = RT_Device_Class_RTC; @@ -150,7 +170,7 @@ int rt_hw_rtc_init(void) rtc_dev.user_data = RTC; - ret = rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR); + ret = rt_device_register(&rtc_dev, ES_DEVICE_NAME_RTC, RT_DEVICE_FLAG_RDWR); return ret; } diff --git a/bsp/essemi/es32f0654/drivers/drv_rtc.h b/bsp/essemi/es32f0654/drivers/drv_rtc.h index fe0264fb51..76e5b24d85 100644 --- a/bsp/essemi/es32f0654/drivers/drv_rtc.h +++ b/bsp/essemi/es32f0654/drivers/drv_rtc.h @@ -3,14 +3,28 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-03-22 wangyq the first version + * 2019-03-22 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_RTC_H__ #define DRV_RTC_H__ +#include "es_conf_info_rtc.h" int rt_hw_rtc_init(void); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_spi.c b/bsp/essemi/es32f0654/drivers/drv_spi.c index dd37691125..6ea5c1a705 100644 --- a/bsp/essemi/es32f0654/drivers/drv_spi.c +++ b/bsp/essemi/es32f0654/drivers/drv_spi.c @@ -3,11 +3,23 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-01-24 wangyq the first version * 2019-11-01 wangyq update libraries - * 2020-12-15 liuhy update libraries + * 2021-04-20 liuhy the second version */ #include @@ -16,9 +28,7 @@ #include #include "board.h" #include "drv_spi.h" -#include -#include -#include + #ifdef RT_USING_SPI @@ -30,6 +40,9 @@ rt_err_t spi_configure(struct rt_spi_device *device, spi_handle_t *hspi; hspi = (spi_handle_t *)device->bus->parent.user_data; + hspi->init.ss_en = DISABLE; + hspi->init.crc_calc = DISABLE; + /* config spi mode */ if (cfg->mode & RT_SPI_SLAVE) { @@ -64,6 +77,16 @@ rt_err_t spi_configure(struct rt_spi_device *device, { hspi->init.phase = SPI_CPHA_FIRST; } + + if (cfg->mode & RT_SPI_MSB) + { + hspi->init.first_bit = SPI_FIRSTBIT_MSB; + } + else + { + hspi->init.first_bit = SPI_FIRSTBIT_LSB; + } + if (cfg->mode & RT_SPI_CPOL) { hspi->init.polarity = SPI_CPOL_HIGH; @@ -72,6 +95,7 @@ rt_err_t spi_configure(struct rt_spi_device *device, { hspi->init.polarity = SPI_CPOL_LOW; } + if (cfg->mode & RT_SPI_NO_CS) { hspi->init.ss_en = DISABLE; @@ -150,74 +174,54 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * hspi = (spi_handle_t *)device->bus->parent.user_data; cs = device->parent.user_data; + + if (message->cs_take) + { + rt_pin_write(cs->pin, ES_SPI_CS_LEVEL); + } if(message->send_buf != RT_NULL || message->recv_buf != RT_NULL) { /* send & receive */ if ((message->send_buf != RT_NULL) && (message->recv_buf != RT_NULL)) { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } res = ald_spi_send_recv(hspi, (rt_uint8_t *)message->send_buf, (rt_uint8_t *)message->recv_buf, (rt_int32_t)message->length, SPITIMEOUT); - if (message->cs_release) - { - rt_pin_write(cs->pin, 1); - } - if (res != RT_EOK) - return RT_ERROR; } else { /* only send data */ if (message->recv_buf == RT_NULL) { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } res = ald_spi_send(hspi, (rt_uint8_t *)message->send_buf, (rt_int32_t)message->length, SPITIMEOUT); - if (message->cs_release) - { - rt_pin_write(cs->pin, 1); - } - if (res != RT_EOK) - return RT_ERROR; } /* only receive data */ if (message->send_buf == RT_NULL) { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } res = ald_spi_recv(hspi, (rt_uint8_t *)message->recv_buf, (rt_int32_t)message->length, SPITIMEOUT); - if (message->cs_release) - { - rt_pin_write(cs->pin, 1); - } - if (res != RT_EOK) - return RT_ERROR; } } - + + if (message->cs_release) + { + rt_pin_write(cs->pin, !ES_SPI_CS_LEVEL); + } + + if (res != RT_EOK) + return RT_ERROR; + else + return message->length; + } else { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } - + if (message->cs_release) { - rt_pin_write(cs->pin, 1); + rt_pin_write(cs->pin, !ES_SPI_CS_LEVEL); } return RT_EOK; } - return message->length; } @@ -230,6 +234,7 @@ const struct rt_spi_ops es32f0_spi_ops = rt_err_t es32f0_spi_device_attach(rt_uint32_t pin, const char *bus_name, const char *device_name) { + int result; /* define spi Instance */ struct rt_spi_device *spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); RT_ASSERT(spi_device != RT_NULL); @@ -238,7 +243,17 @@ rt_err_t es32f0_spi_device_attach(rt_uint32_t pin, const char *bus_name, const c cs_pin->pin = pin; rt_pin_mode(pin, PIN_MODE_OUTPUT); rt_pin_write(pin, 1); - return rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin); + + result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin); + +#ifdef BSP_USING_SPI0 + if(!(strcmp(bus_name,ES_DEVICE_NAME_SPI0_BUS)))SPI_BUS_CONFIG(spi_device->config,0); +#endif +#ifdef BSP_USING_SPI1 + if(!(strcmp(bus_name,ES_DEVICE_NAME_SPI1_BUS)))SPI_BUS_CONFIG(spi_device->config,1); +#endif + + return result; } #ifdef BSP_USING_SPI0 @@ -259,77 +274,84 @@ int rt_hw_spi_init(void) spi_handle_t *spi; gpio_init_t gpio_instruct; + gpio_instruct.odos = GPIO_PUSH_PULL; + gpio_instruct.type = GPIO_TYPE_CMOS; + gpio_instruct.flt = GPIO_FILTER_DISABLE; + gpio_instruct.odrv = GPIO_OUT_DRIVE_NORMAL; #ifdef BSP_USING_SPI0 _spi0.perh = SPI0; spi_bus = &_spi_bus0; spi = &_spi0; - rt_device_t spi_bus_dev0; /* SPI0 gpio init */ - gpio_instruct.mode = GPIO_MODE_OUTPUT; - gpio_instruct.odos = GPIO_PUSH_PULL; - gpio_instruct.func = GPIO_FUNC_4; - gpio_instruct.type = GPIO_TYPE_CMOS; - gpio_instruct.flt = GPIO_FILTER_DISABLE; + gpio_instruct.mode = GPIO_MODE_OUTPUT; - /* PB3->SPI0_SCK, PB5->SPI0_MOSI */ - ald_gpio_init(GPIOB, GPIO_PIN_3 | GPIO_PIN_5, &gpio_instruct); +#if defined(ES_SPI0_SCK_GPIO_FUNC)&&defined(ES_SPI0_SCK_GPIO_PORT)&&defined(ES_SPI0_SCK_GPIO_PIN) + gpio_instruct.func = ES_SPI0_SCK_GPIO_FUNC; + ald_gpio_init(ES_SPI0_SCK_GPIO_PORT, ES_SPI0_SCK_GPIO_PIN, &gpio_instruct); +#endif - /* PB4->SPI0_MISO */ - gpio_instruct.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_4, &gpio_instruct); +#if defined(ES_SPI0_MOSI_GPIO_FUNC)&&defined(ES_SPI0_MOSI_GPIO_PORT)&&defined(ES_SPI0_MOSI_GPIO_PIN) + gpio_instruct.func = ES_SPI0_MOSI_GPIO_FUNC; + ald_gpio_init(ES_SPI0_MOSI_GPIO_PORT, ES_SPI0_MOSI_GPIO_PIN, &gpio_instruct); +#endif + + gpio_instruct.mode = GPIO_MODE_INPUT; + +#if defined(ES_SPI0_MISO_GPIO_FUNC)&&defined(ES_SPI0_MISO_GPIO_PORT)&&defined(ES_SPI0_MISO_GPIO_PIN) + gpio_instruct.func = ES_SPI0_MISO_GPIO_FUNC; + ald_gpio_init(ES_SPI0_MISO_GPIO_PORT, ES_SPI0_MISO_GPIO_PIN, &gpio_instruct); +#endif spi_bus->parent.user_data = spi; - result = rt_spi_bus_register(spi_bus, "spi0", &es32f0_spi_ops); + result = rt_spi_bus_register(spi_bus, ES_DEVICE_NAME_SPI0_BUS, &es32f0_spi_ops); if (result != RT_EOK) { return result; } - rt_device_register(spi_bus_dev0, "spi00", RT_DEVICE_FLAG_RDWR); - - /* SPI0_NSS = PA15 = PIN 50 */ - result = es32f0_spi_device_attach(50, "spi0", "spi00"); + result = es32f0_spi_device_attach(ES_SPI0_NSS_PIN, ES_DEVICE_NAME_SPI0_BUS, ES_DEVICE_NAME_SPI0_DEV0); if (result != RT_EOK) { return result; } - + #endif #ifdef BSP_USING_SPI1 _spi1.perh = SPI1; spi_bus = &_spi_bus1; spi = &_spi1; - rt_device_t spi_bus_dev0; /* SPI1 gpio init */ - gpio_instruct.mode = GPIO_MODE_OUTPUT; - gpio_instruct.odos = GPIO_PUSH_PULL; - gpio_instruct.func = GPIO_FUNC_4; - gpio_instruct.type = GPIO_TYPE_CMOS; - gpio_instruct.flt = GPIO_FILTER_DISABLE; - - /* PB13->SPI1_SCK, PB15->SPI1_MOSI */ - ald_gpio_init(GPIOB, GPIO_PIN_13 | GPIO_PIN_15, &gpio_instruct); - - /* PB14->SPI1_MISO */ - gpio_instruct.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_14, &gpio_instruct); + gpio_instruct.mode = GPIO_MODE_OUTPUT; + +#if defined(ES_SPI1_SCK_GPIO_FUNC)&&defined(ES_SPI1_SCK_GPIO_PORT)&&defined(ES_SPI1_SCK_GPIO_PIN) + gpio_instruct.func = ES_SPI1_SCK_GPIO_FUNC; + ald_gpio_init(ES_SPI1_SCK_GPIO_PORT, ES_SPI1_SCK_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_SPI1_MOSI_GPIO_FUNC)&&defined(ES_SPI1_MOSI_GPIO_PORT)&&defined(ES_SPI1_MOSI_GPIO_PIN) + gpio_instruct.func = ES_SPI1_MOSI_GPIO_FUNC; + ald_gpio_init(ES_SPI1_MOSI_GPIO_PORT, ES_SPI1_MOSI_GPIO_PIN, &gpio_instruct); +#endif + + gpio_instruct.mode = GPIO_MODE_INPUT; + +#if defined(ES_SPI1_MISO_GPIO_FUNC)&&defined(ES_SPI1_MISO_GPIO_PORT)&&defined(ES_SPI1_MISO_GPIO_PIN) + gpio_instruct.func = ES_SPI1_MISO_GPIO_FUNC; + ald_gpio_init(ES_SPI1_MISO_GPIO_PORT, ES_SPI1_MISO_GPIO_PIN, &gpio_instruct); +#endif spi_bus->parent.user_data = spi; - result = rt_spi_bus_register(spi_bus, "spi1", &es32f0_spi_ops); + result = rt_spi_bus_register(spi_bus, ES_DEVICE_NAME_SPI1_BUS, &es32f0_spi_ops); if (result != RT_EOK) { return result; } - rt_device_register(spi_bus_dev0, "spi10", RT_DEVICE_FLAG_RDWR); - - /* SPI1_NSS = PC00 = PIN 8 */ - result = es32f0_spi_device_attach(8, "spi1", "spi10"); - + result = es32f0_spi_device_attach((ES_SPI1_NSS_PIN, ES_DEVICE_NAME_SPI1_BUS, ES_DEVICE_NAME_SPI1_DEV0); if (result != RT_EOK) { return result; diff --git a/bsp/essemi/es32f0654/drivers/drv_spi.h b/bsp/essemi/es32f0654/drivers/drv_spi.h index 991ff35c7a..df7932d570 100644 --- a/bsp/essemi/es32f0654/drivers/drv_spi.h +++ b/bsp/essemi/es32f0654/drivers/drv_spi.h @@ -3,9 +3,22 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-01-24 wangyq the first version + * 2019-01-24 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_SPI_H__ @@ -14,6 +27,8 @@ #include #include #include + +#include "es_conf_info_spi.h" struct es32f0_hw_spi_cs { diff --git a/bsp/essemi/es32f0654/drivers/drv_spiflash.c b/bsp/essemi/es32f0654/drivers/drv_spiflash.c index c84fe1be78..d8176257d1 100644 --- a/bsp/essemi/es32f0654/drivers/drv_spiflash.c +++ b/bsp/essemi/es32f0654/drivers/drv_spiflash.c @@ -9,18 +9,20 @@ * 2019-11-01 wangyq update libraries */ +#include "board.h" #include + +#if defined(BSP_USING_SPI_FLASH) + #include "spi_flash.h" #include "drv_spiflash.h" #include "spi_flash_sfud.h" #include "drv_spi.h" -#if defined(BSP_USING_SPI_FLASH) int rt_hw_spi_flash_init(void) { - es32f0_spi_device_attach(50, "spi0", "spi00"); - - if (RT_NULL == rt_sfud_flash_probe("W25Q64", "spi00")) + + if (RT_NULL == rt_sfud_flash_probe(ES_DEVICE_NAME_SPI_FALSH_DEV, ES_DEVICE_NAME_SPI_DEV)) { return -RT_ERROR; }; diff --git a/bsp/essemi/es32f0654/drivers/drv_uart.c b/bsp/essemi/es32f0654/drivers/drv_uart.c index 4ebd18f826..45f42eed78 100644 --- a/bsp/essemi/es32f0654/drivers/drv_uart.c +++ b/bsp/essemi/es32f0654/drivers/drv_uart.c @@ -3,19 +3,30 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-01-23 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include #include #include "board.h" -#include "drv_uart.h" -#include -#include +#include "es_conf_info_uart.h" #ifdef RT_USING_SERIAL @@ -24,151 +35,13 @@ struct es32_uart { uart_handle_t huart; IRQn_Type irq; -}; +}; -static rt_err_t es32f0x_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +/* es32 usart driver */ +struct es32_usart { - gpio_init_t gpio_initstructure; - struct es32_uart *uart; - RT_ASSERT(serial != RT_NULL); - RT_ASSERT(cfg != RT_NULL); - uart = (struct es32_uart *)serial->parent.user_data; - - /* Initialize tx pin */ - gpio_initstructure.mode = GPIO_MODE_OUTPUT; - gpio_initstructure.odos = GPIO_PUSH_PULL; - gpio_initstructure.pupd = GPIO_PUSH_UP; - gpio_initstructure.odrv = GPIO_OUT_DRIVE_NORMAL; - gpio_initstructure.flt = GPIO_FILTER_DISABLE; - gpio_initstructure.type = GPIO_TYPE_TTL; - -#ifdef BSP_USING_UART0 - gpio_initstructure.func = GPIO_FUNC_3; - ald_gpio_init(GPIOB, GPIO_PIN_10, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_11, &gpio_initstructure); -#endif /* uart0 gpio init */ - -#ifdef BSP_USING_UART1 - gpio_initstructure.func = GPIO_FUNC_3; - ald_gpio_init(GPIOC, GPIO_PIN_10, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOC, GPIO_PIN_11, &gpio_initstructure); -#endif /* uart1 gpio init */ - -#ifdef BSP_USING_UART2 - gpio_initstructure.func = GPIO_FUNC_5; - ald_gpio_init(GPIOC, GPIO_PIN_12, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOD, GPIO_PIN_2, &gpio_initstructure); -#endif /* uart2 gpio init */ - -#ifdef BSP_USING_UART3 - gpio_initstructure.func = GPIO_FUNC_4; - ald_gpio_init(GPIOC, GPIO_PIN_4, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOC, GPIO_PIN_5, &gpio_initstructure); -#endif /* uart3 gpio init */ - - uart->huart.init.mode = UART_MODE_UART; - uart->huart.init.baud = cfg->baud_rate; - uart->huart.init.word_length = (uart_word_length_t)(cfg->data_bits - 5); - uart->huart.init.parity = (uart_parity_t)(cfg->parity == PARITY_EVEN ? UART_PARITY_EVEN : cfg->parity); - uart->huart.init.fctl = UART_HW_FLOW_CTL_DISABLE; - ald_uart_init(&uart->huart); - - if (cfg->bit_order == BIT_ORDER_MSB) - { - UART_MSB_FIRST_ENABLE(&uart->huart); - } - else - { - UART_MSB_FIRST_DISABLE(&uart->huart); - } - - if (cfg->invert == NRZ_INVERTED) - { - UART_DATA_INV_ENABLE(&uart->huart); - } - else - { - UART_DATA_INV_DISABLE(&uart->huart); - } - - /* enable rx int */ - ald_uart_interrupt_config(&uart->huart, UART_IT_RXRD, ENABLE); - - return RT_EOK; -} - -static rt_err_t es32f0x_control(struct rt_serial_device *serial, int cmd, void *arg) -{ - struct es32_uart *uart; - RT_ASSERT(serial != RT_NULL); - - uart = (struct es32_uart *)serial->parent.user_data; - switch (cmd) - { - case RT_DEVICE_CTRL_CLR_INT: - /* disable rx irq */ - NVIC_DisableIRQ(uart->irq); - /* disable interrupt */ - ald_uart_interrupt_config(&uart->huart, UART_IT_RXRD, DISABLE); - break; - - case RT_DEVICE_CTRL_SET_INT: - /* enable rx irq */ - NVIC_EnableIRQ(uart->irq); - /* enable interrupt */ - ald_uart_interrupt_config(&uart->huart, UART_IT_RXRD, ENABLE); - break; - } - - return RT_EOK; -} - -static int es32f0x_putc(struct rt_serial_device *serial, char c) -{ - struct es32_uart *uart; - RT_ASSERT(serial != RT_NULL); - uart = (struct es32_uart *)serial->parent.user_data; - - while (!(uart->huart.perh->SR & 0x40)) ; - WRITE_REG(uart->huart.perh->TBR, c); - - return 1; -} - -static int es32f0x_getc(struct rt_serial_device *serial) -{ - int ch = -1; - struct es32_uart *uart; - - RT_ASSERT(serial != RT_NULL); - uart = (struct es32_uart *)serial->parent.user_data; - - if (uart->huart.perh->SR & 0x01) - { - ch = (uint8_t)(uart->huart.perh->RBR & 0xFF); - } - - return ch; -} - -static const struct rt_uart_ops es32f0x_uart_ops = -{ - es32f0x_configure, - es32f0x_control, - es32f0x_putc, - es32f0x_getc, + usart_handle_t huart; + IRQn_Type irq; }; #ifdef BSP_USING_UART0 @@ -266,19 +139,380 @@ void BS16T2_UART3_Handler(void) rt_interrupt_leave(); } #endif /* BSP_USING_UART3 */ + +#ifdef BSP_USING_USART0 +/* USART0 device driver structure */ +struct es32_usart usart0 = +{ + {USART0}, + USART0_IRQn +}; + +struct rt_serial_device serial4; + +void USART0_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + if (USART0->STAT & USART_FLAG_RXNE) + { + rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_USART0 */ + +#ifdef BSP_USING_USART1 +/* USART1 device driver structure */ +struct es32_usart usart1 = +{ + {USART1}, + USART1_IRQn +}; + +struct rt_serial_device serial5; + +void USART1_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + if (USART1->STAT & USART_FLAG_RXNE) + { + rt_hw_serial_isr(&serial5, RT_SERIAL_EVENT_RX_IND); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_USART1 */ + +static rt_err_t es32f0x_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + gpio_init_t gpio_initstructure; + struct es32_uart *uart; + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + uart = (struct es32_uart *)serial->parent.user_data; + + /* Initialize tx pin */ + gpio_initstructure.mode = GPIO_MODE_OUTPUT; + gpio_initstructure.odos = GPIO_PUSH_PULL; + gpio_initstructure.pupd = GPIO_PUSH_UP; + gpio_initstructure.odrv = GPIO_OUT_DRIVE_NORMAL; + gpio_initstructure.flt = GPIO_FILTER_DISABLE; + gpio_initstructure.type = GPIO_TYPE_TTL; + + if((uint32_t)(uart->huart.perh) > (uint32_t)UART3) /*根据外设物理地址区分UART和USART*/ + { + /*USART*/ + struct es32_usart *usart= (struct es32_usart *)serial->parent.user_data; + +#ifdef BSP_USING_USART0 + if(usart == (&usart0)) + { +#if defined(ES_USART0_TX_GPIO_FUNC)&&defined(ES_USART0_TX_GPIO_PORT)&&defined(ES_USART0_TX_GPIO_PIN) + gpio_initstructure.func = ES_USART0_TX_GPIO_FUNC; + ald_gpio_init(ES_USART0_TX_GPIO_PORT, ES_USART0_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_USART0_RX_GPIO_FUNC)&&defined(ES_USART0_RX_GPIO_PORT)&&defined(ES_USART0_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_USART0_RX_GPIO_FUNC; + ald_gpio_init(ES_USART0_RX_GPIO_PORT, ES_USART0_RX_GPIO_PIN, &gpio_initstructure); +#endif + ald_cmu_perh_clock_config(CMU_PERH_USART0, ENABLE); + } + +#endif /* usart0 gpio init */ + +#ifdef BSP_USING_USART1 + if(usart == (&usart1)) + { +#if defined(ES_USART1_TX_GPIO_FUNC)&&defined(ES_USART1_TX_GPIO_PORT)&&defined(ES_USART1_TX_GPIO_PIN) + gpio_initstructure.func = ES_USART1_TX_GPIO_FUNC; + ald_gpio_init(ES_USART1_TX_GPIO_PORT, ES_USART1_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_USART1_RX_GPIO_FUNC)&&defined(ES_USART1_RX_GPIO_PORT)&&defined(ES_USART1_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_USART1_RX_GPIO_FUNC; + ald_gpio_init(ES_USART1_RX_GPIO_PORT, ES_USART1_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_USART1, ENABLE); + } +#endif /* usart1 gpio init */ + + usart->huart.init.mode = USART_MODE_TX_RX; + usart->huart.init.baud = cfg->baud_rate; + usart->huart.init.word_length = (usart_word_length_t)(cfg->data_bits - 8); + usart->huart.init.stop_bits = ((cfg->stop_bits == STOP_BITS_1) ? USART_STOP_BITS_1 : USART_STOP_BITS_2); + usart->huart.init.parity = (usart_parity_t)(cfg->parity == PARITY_NONE ? cfg->parity : (4 - cfg->parity) ); + usart->huart.init.fctl = USART_HW_FLOW_CTL_NONE; + + ald_usart_init(&usart->huart); + + /* + BIT_ORDER_LSB BIT_ORDER_MSB + NRZ_NORMAL NRZ_INVERTED + 无相关寄存器*/ + + /* enable rx int */ + ald_usart_interrupt_config(&usart->huart, USART_IT_RXNE, ENABLE); + + } + else + { + /*UART*/ + +#ifdef BSP_USING_UART0 + if(uart == (&uart0)) + { +#if defined(ES_UART0_TX_GPIO_FUNC)&&defined(ES_UART0_TX_GPIO_PORT)&&defined(ES_UART0_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART0_TX_GPIO_FUNC; + ald_gpio_init(ES_UART0_TX_GPIO_PORT, ES_UART0_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART0_RX_GPIO_FUNC)&&defined(ES_UART0_RX_GPIO_PORT)&&defined(ES_UART0_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART0_RX_GPIO_FUNC; + ald_gpio_init(ES_UART0_RX_GPIO_PORT, ES_UART0_RX_GPIO_PIN, &gpio_initstructure); +#endif + ald_cmu_perh_clock_config(CMU_PERH_UART0, ENABLE); + } + +#endif /* uart0 gpio init */ + +#ifdef BSP_USING_UART1 + if(uart == (&uart1)) + { +#if defined(ES_UART1_TX_GPIO_FUNC)&&defined(ES_UART1_TX_GPIO_PORT)&&defined(ES_UART1_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART1_TX_GPIO_FUNC; + ald_gpio_init(ES_UART1_TX_GPIO_PORT, ES_UART1_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART1_RX_GPIO_FUNC)&&defined(ES_UART1_RX_GPIO_PORT)&&defined(ES_UART1_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART1_RX_GPIO_FUNC; + ald_gpio_init(ES_UART1_RX_GPIO_PORT, ES_UART1_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART1, ENABLE); + } +#endif /* uart1 gpio init */ + +#ifdef BSP_USING_UART2 + if(uart == (&uart2)) + { +#if defined(ES_UART2_TX_GPIO_FUNC)&&defined(ES_UART2_TX_GPIO_PORT)&&defined(ES_UART2_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART2_TX_GPIO_FUNC; + ald_gpio_init(ES_UART2_TX_GPIO_PORT, ES_UART2_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART2_RX_GPIO_FUNC)&&defined(ES_UART2_RX_GPIO_PORT)&&defined(ES_UART2_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART2_RX_GPIO_FUNC; + ald_gpio_init(ES_UART2_RX_GPIO_PORT, ES_UART2_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART2, ENABLE); + } +#endif /* uart2 gpio init */ + +#ifdef BSP_USING_UART3 + if(uart == (&uart3)) + { +#if defined(ES_UART3_TX_GPIO_FUNC)&&defined(ES_UART3_TX_GPIO_PORT)&&defined(ES_UART3_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART3_TX_GPIO_FUNC; + ald_gpio_init(ES_UART3_TX_GPIO_PORT, ES_UART3_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART3_RX_GPIO_FUNC)&&defined(ES_UART3_RX_GPIO_PORT)&&defined(ES_UART3_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART3_RX_GPIO_FUNC; + ald_gpio_init(ES_UART3_RX_GPIO_PORT, ES_UART3_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART3, ENABLE); + } +#endif /* uart3 gpio init */ + + uart->huart.init.mode = UART_MODE_UART; + uart->huart.init.baud = cfg->baud_rate; + uart->huart.init.word_length = (uart_word_length_t)(cfg->data_bits - 5); + uart->huart.init.stop_bits = (uart_stop_bits_t)cfg->stop_bits; + uart->huart.init.parity = (uart_parity_t)(cfg->parity == PARITY_EVEN ? UART_PARITY_EVEN : cfg->parity); + uart->huart.init.fctl = UART_HW_FLOW_CTL_DISABLE; + + ald_uart_init(&uart->huart); + + if (cfg->bit_order == BIT_ORDER_MSB) + { + UART_MSB_FIRST_ENABLE(&uart->huart); + } + else + { + UART_MSB_FIRST_DISABLE(&uart->huart); + } + + if (cfg->invert == NRZ_INVERTED) + { + UART_DATA_INV_ENABLE(&uart->huart); + } + else + { + UART_DATA_INV_DISABLE(&uart->huart); + } + + /* enable rx int */ + ald_uart_interrupt_config(&uart->huart, UART_IT_RXRD, ENABLE); + + } + + + return RT_EOK; +} + +static rt_err_t es32f0x_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct es32_uart *uart; + RT_ASSERT(serial != RT_NULL); + + uart = (struct es32_uart *)serial->parent.user_data; + + if((uint32_t)(uart->huart.perh) > (uint32_t)UART3) /*根据外设物理地址区分UART和USART*/ + { + /*USART*/ + struct es32_usart *usart= (struct es32_usart *)serial->parent.user_data; + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + NVIC_DisableIRQ(usart->irq); + /* disable interrupt */ + ald_usart_interrupt_config(&usart->huart, USART_IT_RXNE, DISABLE); + break; + + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + NVIC_EnableIRQ(usart->irq); + /* enable interrupt */ + ald_usart_interrupt_config(&usart->huart, USART_IT_RXNE, ENABLE); + break; + } + + } + else + { + /*UART*/ + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + NVIC_DisableIRQ(uart->irq); + /* disable interrupt */ + ald_uart_interrupt_config(&uart->huart, UART_IT_RXRD, DISABLE); + break; + + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + NVIC_EnableIRQ(uart->irq); + /* enable interrupt */ + ald_uart_interrupt_config(&uart->huart, UART_IT_RXRD, ENABLE); + break; + } + } + + + return RT_EOK; +} + +static int es32f0x_putc(struct rt_serial_device *serial, char c) +{ + struct es32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct es32_uart *)serial->parent.user_data; + + if((uint32_t)(uart->huart.perh) > (uint32_t)UART3) /*根据外设物理地址区分UART和USART*/ + { + /*USART*/ + struct es32_usart *usart= (struct es32_usart *)serial->parent.user_data; + while (!(usart->huart.perh->STAT & USART_STAT_TXEMPIF_MSK)) ; + WRITE_REG(usart->huart.perh->DATA, c); + } + else + { + /*UART*/ + while (!(uart->huart.perh->SR & 0x40)) ; + WRITE_REG(uart->huart.perh->TBR, c); + } + + return 1; +} + +static int es32f0x_getc(struct rt_serial_device *serial) +{ + int ch = -1; + struct es32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + uart = (struct es32_uart *)serial->parent.user_data; + + if((uint32_t)(uart->huart.perh) > (uint32_t)UART3) /*根据外设物理地址区分UART和USART*/ + { + /*USART*/ + struct es32_usart *usart= (struct es32_usart *)serial->parent.user_data; + if (usart->huart.perh->STAT & USART_STAT_RXNEIF_MSK) + { + ch = (uint8_t)(usart->huart.perh->DATA & 0xFF); + } + } + else + { + /*UART*/ + if (uart->huart.perh->SR & 0x01) + { + ch = (uint8_t)(uart->huart.perh->RBR & 0xFF); + } + } + + return ch; +} + +static const struct rt_uart_ops es32f0x_uart_ops = +{ + es32f0x_configure, + es32f0x_control, + es32f0x_putc, + es32f0x_getc, +}; int rt_hw_uart_init(void) { +#if (defined(BSP_USING_UART0)||defined(BSP_USING_UART1)||defined(BSP_USING_UART2)||defined(BSP_USING_UART3)) struct es32_uart *uart; - struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; +#endif +#if (defined(BSP_USING_USART0)||defined(BSP_USING_USART1)) + struct es32_usart *usart; +#endif #ifdef BSP_USING_UART0 uart = &uart0; serial0.ops = &es32f0x_uart_ops; - serial0.config = config; + serial0.config = (struct serial_configure)ES_UART0_CONFIG; /* register UART0 device */ - rt_hw_serial_register(&serial0, "uart0", + rt_hw_serial_register(&serial0, ES_DEVICE_NAME_UART0, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART0 */ @@ -286,10 +520,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART1 uart = &uart1; serial1.ops = &es32f0x_uart_ops; - serial1.config = config; + serial1.config = (struct serial_configure)ES_UART1_CONFIG; /* register UART1 device */ - rt_hw_serial_register(&serial1, "uart1", + rt_hw_serial_register(&serial1, ES_DEVICE_NAME_UART1, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART1 */ @@ -297,10 +531,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART2 uart = &uart2; serial2.ops = &es32f0x_uart_ops; - serial2.config = config; + serial2.config = (struct serial_configure)ES_UART2_CONFIG; /* register UART2 device */ - rt_hw_serial_register(&serial2, "uart2", + rt_hw_serial_register(&serial2, ES_DEVICE_NAME_UART2, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART2 */ @@ -308,14 +542,35 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART3 uart = &uart3; serial3.ops = &es32f0x_uart_ops; - serial3.config = config; + serial3.config = (struct serial_configure)ES_UART3_CONFIG; /* register UART3 device */ - rt_hw_serial_register(&serial3, "uart3", + rt_hw_serial_register(&serial3, ES_DEVICE_NAME_UART3, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART3 */ + +#ifdef BSP_USING_USART0 + usart = &usart0; + serial4.ops = &es32f0x_uart_ops; + serial4.config = (struct serial_configure)ES_USART0_CONFIG; + /* register USART0 device */ + rt_hw_serial_register(&serial4, ES_DEVICE_NAME_USART0, + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + usart); +#endif /* BSP_USING_USART0 */ + +#ifdef BSP_USING_USART1 + usart = &usart1; + serial5.ops = &es32f0x_uart_ops; + serial5.config = (struct serial_configure)ES_USART1_CONFIG; + + /* register USART1 device */ + rt_hw_serial_register(&serial5, ES_DEVICE_NAME_USART1, + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + usart); +#endif /* BSP_USING_USART1 */ return 0; } INIT_BOARD_EXPORT(rt_hw_uart_init); diff --git a/bsp/essemi/es32f0654/drivers/drv_uart.h b/bsp/essemi/es32f0654/drivers/drv_uart.h index e68d67ca1e..a7eb0de41d 100644 --- a/bsp/essemi/es32f0654/drivers/drv_uart.h +++ b/bsp/essemi/es32f0654/drivers/drv_uart.h @@ -3,6 +3,18 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-01-23 wangyq the first version diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_acmp.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_acmp.h index 2bbe7437d0..535d7c2770 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_acmp.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_acmp.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_adc.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_adc.h index b5f9532f8d..efad62ab26 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_adc.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_adc.h @@ -9,6 +9,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ****************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_bkpc.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_bkpc.h index cbaa1c88f8..038ddf635b 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_bkpc.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_bkpc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_calc.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_calc.h index 283417d843..870c5b536d 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_calc.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_calc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_can.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_can.h index 196094eaaa..04a5d5ef5e 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_can.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_can.h @@ -10,6 +10,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ****************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_cmu.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_cmu.h index 648b3c2b50..314c585a8a 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_cmu.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_cmu.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_conf.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_conf.h index 2a91282ab6..673782173a 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_conf.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_conf.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crc.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crc.h index 3ea24ea927..d40e22fcf9 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crc.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crypt.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crypt.h index 483c15a31e..00be4131f3 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crypt.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_crypt.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dbgc.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dbgc.h index 3f695b7e8f..a4e2d75621 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dbgc.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dbgc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dma.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dma.h index 1fbebd56bf..4d7f6b9787 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dma.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_dma.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_flash.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_flash.h index 8858b8b707..ad3148382f 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_flash.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_flash.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_gpio.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_gpio.h index 336c90f977..01df5fd138 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_gpio.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_gpio.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_i2c.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_i2c.h index f421ff168e..27527104ba 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_i2c.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_i2c.h @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_iap.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_iap.h index a777fca4a9..2fa6a4f6ec 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_iap.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_iap.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pis.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pis.h index c17b03cfd9..5b63193f46 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pis.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pis.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pmu.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pmu.h index 264c185b81..be93e204ba 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pmu.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_pmu.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rmu.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rmu.h index 164ebb5e3f..6cc63fab8a 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rmu.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rmu.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rtc.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rtc.h index dd5d8ad7ee..fbb6799c17 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rtc.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_rtc.h @@ -10,6 +10,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_smartcard.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_smartcard.h index 74401fecc1..291908e6d5 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_smartcard.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_smartcard.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_spi.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_spi.h index 1a7c7c7e5e..5820deadf2 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_spi.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_spi.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_syscfg.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_syscfg.h index 35844c887e..3df2492432 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_syscfg.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_syscfg.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_timer.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_timer.h index 538fc0ca0b..e6f4986947 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_timer.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_timer.h @@ -12,6 +12,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_trng.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_trng.h index 635cb1a90a..202e6f2af8 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_trng.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_trng.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_tsense.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_tsense.h index 410dcb7ff6..dc78ce56cc 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_tsense.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_tsense.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_uart.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_uart.h index 10a351ca19..a240a91b36 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_uart.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_uart.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_usart.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_usart.h index 4f30e2c2a4..b3cd4bf421 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_usart.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_usart.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_wdt.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_wdt.h index 619f777324..2473a8ebb2 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_wdt.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/ald_wdt.h @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/type.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/type.h index 54082f3f21..a892c69bd4 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/type.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/type.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ @@ -22,6 +36,7 @@ extern "C" { #endif #include +#include "es_conf_info_select.h" #if defined (__CC_ARM) diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/utils.h b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/utils.h index 5ad1dc36a7..165cec6306 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/utils.h +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Include/utils.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_acmp.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_acmp.c index e480de1697..cec11372c3 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_acmp.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_acmp.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_adc.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_adc.c index 7f1f522c7a..bf0215740b 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_adc.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_adc.c @@ -24,6 +24,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_bkpc.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_bkpc.c index a3852bdb22..b459fba045 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_bkpc.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_bkpc.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_calc.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_calc.c index ec2400453d..2196ffb99f 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_calc.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_calc.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_can.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_can.c index fb551abdf1..b665165077 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_can.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_can.c @@ -14,6 +14,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_cmu.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_cmu.c index e43b12c7d1..b6473dc432 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_cmu.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_cmu.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crc.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crc.c index bf6fde037c..2a69489158 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crc.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crc.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crypt.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crypt.c index ff8f92d9d5..1381bd416f 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crypt.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_crypt.c @@ -12,6 +12,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_dma.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_dma.c index f3c125578d..080dff3045 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_dma.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_dma.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash.c index 44d25a7f76..224843cb01 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash.c @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #include "ald_flash.h" diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash_ext.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash_ext.c index 44e8fe7d9c..4087b71b01 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash_ext.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_flash_ext.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * ********************************************************************************* diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_gpio.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_gpio.c index 08366e9350..153a21d8a6 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_gpio.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_gpio.c @@ -16,6 +16,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_i2c.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_i2c.c index 82faa31502..a442d73428 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_i2c.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_i2c.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * @verbatim ============================================================================== ##### How to use this driver ##### diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_iap.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_iap.c index ccb9b5170b..61cee32739 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_iap.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_iap.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pis.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pis.c index d9067499ea..c83907e0c2 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pis.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pis.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pmu.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pmu.c index f8b4b94e27..976bae4334 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pmu.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_pmu.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rmu.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rmu.c index 2b04f2719c..ec2ec312b6 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rmu.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rmu.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rtc.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rtc.c index 7391045a62..4863178005 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rtc.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_rtc.c @@ -18,6 +18,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_smartcard.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_smartcard.c index 2b3552ab77..5a18e4ed27 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_smartcard.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_smartcard.c @@ -16,6 +16,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_spi.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_spi.c index f756f6785d..fd154c6c73 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_spi.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_spi.c @@ -17,6 +17,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_timer.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_timer.c index dc0a285368..77d3b14c8f 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_timer.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_timer.c @@ -12,6 +12,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_trng.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_trng.c index 8e4d13a4d0..81a62e6127 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_trng.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_trng.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_tsense.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_tsense.c index 5fcd8311f1..9200f5a33f 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_tsense.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_tsense.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_uart.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_uart.c index 59c2489bfa..3a13a5ea04 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_uart.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_uart.c @@ -17,6 +17,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_usart.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_usart.c index 1e9ed5c501..8c9c2ef8f1 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_usart.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_usart.c @@ -17,6 +17,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_wdt.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_wdt.c index d19a0397ab..fe21244fe7 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_wdt.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/ald_wdt.c @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/utils.c b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/utils.c index e406c53afc..e74f9d3f7f 100644 --- a/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/utils.c +++ b/bsp/essemi/es32f0654/libraries/ES32F065x_ALD_StdPeriph_Driver/Source/utils.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f0654/project.uvprojx b/bsp/essemi/es32f0654/project.uvprojx index 70c93b4c8e..569397deb8 100644 --- a/bsp/essemi/es32f0654/project.uvprojx +++ b/bsp/essemi/es32f0654/project.uvprojx @@ -336,9 +336,9 @@ 0 - ES32F065x + ES32F065x, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND - applications;.;drivers;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\include;drivers;..\..\..\components\finsh;.;..\..\..\include;libraries\CMSIS\Device\EastSoft\ES32F065x\Include;libraries\CMSIS\Include;libraries\ES32F065x_ALD_StdPeriph_Driver\Include + applications;.;drivers\ES;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;drivers;..\..\..\components\finsh;.;..\..\..\include;..\..\..\components\libc\compilers\common;libraries\CMSIS\Device\EastSoft\ES32F065x\Include;libraries\CMSIS\Include;libraries\ES32F065x_ALD_StdPeriph_Driver\Include @@ -390,8 +390,13 @@ - cpu + CPU + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + backtrace.c 1 @@ -403,168 +408,34 @@ ..\..\..\libcpu\arm\common\div0.c - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S cpuport.c 1 ..\..\..\libcpu\arm\cortex-m0\cpuport.c - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m0\context_rvds.S - DeviceDrivers - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - pin.c 1 ..\..\..\components\drivers\misc\pin.c - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - serial.c 1 ..\..\..\components\drivers\serial\serial.c - spi_core.c + waitqueue.c 1 - ..\..\..\components\drivers\spi\spi_core.c - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - completion.c - 1 - ..\..\..\components\drivers\src\completion.c - - - dataqueue.c - 1 - ..\..\..\components\drivers\src\dataqueue.c + ..\..\..\components\drivers\src\waitqueue.c pipe.c @@ -572,9 +443,9 @@ ..\..\..\components\drivers\src\pipe.c - ringblk_buf.c + dataqueue.c 1 - ..\..\..\components\drivers\src\ringblk_buf.c + ..\..\..\components\drivers\src\dataqueue.c ringbuffer.c @@ -582,25 +453,25 @@ ..\..\..\components\drivers\src\ringbuffer.c - waitqueue.c + ringblk_buf.c 1 - ..\..\..\components\drivers\src\waitqueue.c + ..\..\..\components\drivers\src\ringblk_buf.c workqueue.c 1 ..\..\..\components\drivers\src\workqueue.c + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + Drivers - - board.c - 1 - drivers\board.c - drv_gpio.c 1 @@ -611,6 +482,11 @@ 1 drivers\drv_uart.c + + board.c + 1 + drivers\board.c + @@ -621,30 +497,25 @@ 1 ..\..\..\components\finsh\shell.c - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - msh.c 1 ..\..\..\components\finsh\msh.c + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + Kernel - clock.c + ipc.c 1 - ..\..\..\src\clock.c - - - components.c - 1 - ..\..\..\src\components.c + ..\..\..\src\ipc.c device.c @@ -652,19 +523,9 @@ ..\..\..\src\device.c - idle.c + object.c 1 - ..\..\..\src\idle.c - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - irq.c - 1 - ..\..\..\src\irq.c + ..\..\..\src\object.c kservice.c @@ -672,9 +533,29 @@ ..\..\..\src\kservice.c - mem.c + scheduler.c 1 - ..\..\..\src\mem.c + ..\..\..\src\scheduler.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + components.c + 1 + ..\..\..\src\components.c + + + timer.c + 1 + ..\..\..\src\timer.c mempool.c @@ -682,19 +563,9 @@ ..\..\..\src\mempool.c - object.c + mem.c 1 - ..\..\..\src\object.c - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - signal.c - 1 - ..\..\..\src\signal.c + ..\..\..\src\mem.c thread.c @@ -702,20 +573,155 @@ ..\..\..\src\thread.c - timer.c + clock.c 1 - ..\..\..\src\timer.c + ..\..\..\src\clock.c + + + + + libc + + + time.c + 1 + ..\..\..\components\libc\compilers\common\time.c Libraries + + ald_dma.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_dma.c + + + ald_crc.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_crc.c + + + utils.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\utils.c + + + ald_flash_ext.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_flash_ext.c + + + ald_trng.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_trng.c + + + ald_pmu.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_pmu.c + + + ald_i2c.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_i2c.c + + + ald_can.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_can.c + + + ald_crypt.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_crypt.c + + + ald_spi.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_spi.c + + + ald_rtc.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_rtc.c + + + ald_iap.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_iap.c + + + startup_es32f065x.s + 2 + libraries\CMSIS\Device\EastSoft\ES32F065x\Startup\keil\startup_es32f065x.s + + + ald_usart.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_usart.c + + + ald_uart.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_uart.c + + + ald_tsense.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_tsense.c + + + ald_wdt.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_wdt.c + + + ald_flash.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_flash.c + + + ald_smartcard.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_smartcard.c + + + ald_pis.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_pis.c + + + ald_cmu.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_cmu.c + + + ald_rmu.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_rmu.c + ald_acmp.c 1 libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_acmp.c + + ald_calc.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_calc.c + + + ald_gpio.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_gpio.c + + + ald_timer.c + 1 + libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_timer.c + ald_adc.c 1 @@ -726,131 +732,6 @@ 1 libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_bkpc.c - - ald_calc.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_calc.c - - - ald_can.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_can.c - - - ald_cmu.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_cmu.c - - - ald_crc.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_crc.c - - - ald_crypt.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_crypt.c - - - ald_dma.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_dma.c - - - ald_flash.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_flash.c - - - ald_flash_ext.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_flash_ext.c - - - ald_gpio.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_gpio.c - - - ald_i2c.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_i2c.c - - - ald_iap.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_iap.c - - - ald_pis.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_pis.c - - - ald_pmu.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_pmu.c - - - ald_rmu.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_rmu.c - - - ald_rtc.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_rtc.c - - - ald_smartcard.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_smartcard.c - - - ald_spi.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_spi.c - - - ald_timer.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_timer.c - - - ald_trng.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_trng.c - - - ald_tsense.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_tsense.c - - - ald_uart.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_uart.c - - - ald_usart.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_usart.c - - - ald_wdt.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\ald_wdt.c - - - utils.c - 1 - libraries\ES32F065x_ALD_StdPeriph_Driver\Source\utils.c - - - startup_es32f065x.s - 2 - libraries\CMSIS\Device\EastSoft\ES32F065x\Startup\keil\startup_es32f065x.s - diff --git a/bsp/essemi/es32f0654/rtconfig.h b/bsp/essemi/es32f0654/rtconfig.h index 3a173aaa59..9b50643265 100644 --- a/bsp/essemi/es32f0654/rtconfig.h +++ b/bsp/essemi/es32f0654/rtconfig.h @@ -76,16 +76,7 @@ #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_CAN -#define RT_USING_HWTIMER -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS #define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_PM -#define RT_USING_RTC -#define RT_USING_SPI /* Using USB */ diff --git a/bsp/essemi/es32f369x/.config b/bsp/essemi/es32f369x/.config index af456dc765..5e47c69c47 100644 --- a/bsp/essemi/es32f369x/.config +++ b/bsp/essemi/es32f369x/.config @@ -19,8 +19,9 @@ CONFIG_RT_USING_OVERFLOW_CHECK=y CONFIG_RT_USING_HOOK=y CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 -CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_IDLE_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_KSERVICE_USING_STDLIB is not set CONFIG_RT_DEBUG=y CONFIG_RT_DEBUG_COLOR=y # CONFIG_RT_DEBUG_INIT_CONFIG is not set @@ -42,7 +43,7 @@ CONFIG_RT_USING_MUTEX=y CONFIG_RT_USING_EVENT=y CONFIG_RT_USING_MAILBOX=y CONFIG_RT_USING_MESSAGEQUEUE=y -# CONFIG_RT_USING_SIGNALS is not set +CONFIG_RT_USING_SIGNALS=y # # Memory Management @@ -52,6 +53,7 @@ CONFIG_RT_USING_MEMPOOL=y # CONFIG_RT_USING_NOHEAP is not set CONFIG_RT_USING_SMALL_MEM=y # CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_USERHEAP is not set # CONFIG_RT_USING_MEMTRACE is not set CONFIG_RT_USING_HEAP=y @@ -114,31 +116,21 @@ CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y # CONFIG_RT_SERIAL_USING_DMA is not set CONFIG_RT_SERIAL_RB_BUFSZ=64 -CONFIG_RT_USING_CAN=y -# CONFIG_RT_CAN_USING_HDR is not set -CONFIG_RT_USING_HWTIMER=y +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER 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_I2C is not set +# CONFIG_RT_USING_PHY is not set CONFIG_RT_USING_PIN=y -CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set -CONFIG_RT_USING_PWM=y +# CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set -CONFIG_RT_USING_PM=y -CONFIG_RT_USING_RTC=y -# CONFIG_RT_USING_ALARM is not set -# CONFIG_RT_USING_SOFT_RTC 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=y -# CONFIG_RT_USING_QSPI is not set -# CONFIG_RT_USING_SPI_MSD is not set -# CONFIG_RT_USING_SFUD is not set -# CONFIG_RT_USING_ENC28J60 is not set -# CONFIG_RT_USING_SPI_WIFI 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 @@ -159,7 +151,7 @@ CONFIG_RT_USING_SPI=y # # CONFIG_RT_USING_LIBC is not set # CONFIG_RT_USING_PTHREADS is not set -# CONFIG_RT_LIBC_USING_TIME is not set +CONFIG_RT_LIBC_USING_TIME=y # # Network @@ -305,6 +297,8 @@ CONFIG_RT_USING_SPI=y # CONFIG_PKG_USING_WAVPLAYER is not set # CONFIG_PKG_USING_TJPGD is not set # CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set # # tools packages @@ -319,6 +313,7 @@ CONFIG_RT_USING_SPI=y # 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 @@ -326,6 +321,10 @@ CONFIG_RT_USING_SPI=y # 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 # # system packages @@ -352,7 +351,16 @@ CONFIG_RT_USING_SPI=y # CONFIG_PKG_USING_RAMDISK is not set # CONFIG_PKG_USING_MININI is not set # CONFIG_PKG_USING_QBOOT is not set + +# +# 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 # CONFIG_PKG_USING_PPOOL is not set # @@ -408,6 +416,10 @@ CONFIG_RT_USING_SPI=y # 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_NES is not set # # miscellaneous packages @@ -417,6 +429,7 @@ CONFIG_RT_USING_SPI=y # 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_MULTIBUTTON is not set # CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set # CONFIG_PKG_USING_CANFESTIVAL is not set @@ -437,17 +450,23 @@ CONFIG_RT_USING_SPI=y # CONFIG_PKG_USING_PERIPHERAL_SAMPLES 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_NNOM is not set # CONFIG_PKG_USING_LIBANN is not set # CONFIG_PKG_USING_ELAPACK is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set # CONFIG_PKG_USING_VT100 is not set -# CONFIG_PKG_USING_TETRIS is not set # CONFIG_PKG_USING_ULAPACK is not set # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set + +# +# games: games run on RT-Thread console +# # 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_LWGPS is not set # CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set CONFIG_SOC_ES32F3696LT=y @@ -487,12 +506,13 @@ CONFIG_BSP_USING_UART0=y # # CAN Drivers # -# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_CAN0 is not set # # ADC Drivers # -# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ADC0 is not set +# CONFIG_BSP_USING_ADC1 is not set # # RTC Drivers @@ -500,16 +520,26 @@ CONFIG_BSP_USING_UART0=y # CONFIG_BSP_USING_RTC is not set # -# HWtimer Drivers +# HWTIMER Drivers # -# CONFIG_BSP_USING_HWTIMER0 is not set -# CONFIG_BSP_USING_HWTIMER1 is not set +# CONFIG_BSP_USING_AD16C4T0_HWTIMER is not set +# CONFIG_BSP_USING_AD16C4T1_HWTIMER is not set +# CONFIG_BSP_USING_GP32C4T0_HWTIMER is not set +# CONFIG_BSP_USING_GP32C4T1_HWTIMER is not set +# CONFIG_BSP_USING_GP16C4T0_HWTIMER is not set +# CONFIG_BSP_USING_GP16C4T1_HWTIMER is not set +# CONFIG_BSP_USING_BS16T0_HWTIMER is not set +# CONFIG_BSP_USING_BS16T1_HWTIMER is not set # # PWM Drivers # -# CONFIG_BSP_USING_PWM0 is not set -# CONFIG_BSP_USING_PWM1 is not set +# CONFIG_BSP_USING_AD16C4T0_PWM is not set +# CONFIG_BSP_USING_AD16C4T1_PWM is not set +# CONFIG_BSP_USING_GP32C4T0_PWM is not set +# CONFIG_BSP_USING_GP32C4T1_PWM is not set +# CONFIG_BSP_USING_GP16C4T0_PWM is not set +# CONFIG_BSP_USING_GP16C4T1_PWM is not set # # PM Drivers diff --git a/bsp/essemi/es32f369x/drivers/ES/Kconfig b/bsp/essemi/es32f369x/drivers/ES/Kconfig new file mode 100644 index 0000000000..9ba55d110e --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/Kconfig @@ -0,0 +1,197 @@ +menu "UART Drivers" + + config BSP_USING_UART0 + bool "Register UART0 " + select RT_USING_SERIAL + default y + + config BSP_USING_UART1 + bool "Register UART1 " + select RT_USING_SERIAL + default n + + config BSP_USING_UART2 + bool "Register UART2 " + select RT_USING_SERIAL + default n + + config BSP_USING_UART3 + bool "Register UART3 " + select RT_USING_SERIAL + default n + + config BSP_USING_UART4 + bool "Register UART4 " + select RT_USING_SERIAL + default n + + config BSP_USING_UART5 + bool "Register UART5 " + select RT_USING_SERIAL + default n + +endmenu + +menu "SPI Drivers" + + config BSP_USING_SPI0 + bool "Register SPI0 " + select RT_USING_SPI + select RT_USING_PIN + default n + + config BSP_USING_SPI1 + bool "Register SPI1 " + select RT_USING_SPI + select RT_USING_PIN + default n + + config BSP_USING_SPI2 + bool "Register SPI2 " + select RT_USING_SPI + select RT_USING_PIN + default n + +endmenu + +menu "I2C Drivers" + + config BSP_USING_I2C0 + bool "Register I2C0 " + select RT_USING_I2C + default n + + config BSP_USING_I2C1 + bool "Register I2C1 " + select RT_USING_I2C + default n + +endmenu + +menu "CAN Drivers" + + config BSP_USING_CAN0 + bool "Register CAN0 " + select RT_USING_CAN + select RT_CAN_USING_HDR + select BSP_USING_CAN + default n + +endmenu + +menu "ADC Drivers" + + config BSP_USING_ADC0 + bool "Register ADC0 " + select RT_USING_ADC + default n + + config BSP_USING_ADC1 + bool "Register ADC1 " + select RT_USING_ADC + default n + +endmenu + +menu "RTC Drivers" + + config BSP_USING_RTC + bool "Register RTC " + select RT_USING_RTC + default n + +endmenu + +menu "HWTIMER Drivers" + + config BSP_USING_AD16C4T0_HWTIMER + bool "Register HWTIMER0 " + select RT_USING_HWTIMER + default n + + config BSP_USING_AD16C4T1_HWTIMER + bool "Register HWTIMER1 " + select RT_USING_HWTIMER + default n + + config BSP_USING_GP32C4T0_HWTIMER + bool "Register HWTIMER2 " + select RT_USING_HWTIMER + default n + + config BSP_USING_GP32C4T1_HWTIMER + bool "Register HWTIMER3 " + select RT_USING_HWTIMER + default n + + config BSP_USING_GP16C4T0_HWTIMER + bool "Register HWTIMER4 " + select RT_USING_HWTIMER + default n + + config BSP_USING_GP16C4T1_HWTIMER + bool "Register HWTIMER5 " + select RT_USING_HWTIMER + default n + + config BSP_USING_BS16T0_HWTIMER + bool "Register HWTIMER6 " + select RT_USING_HWTIMER + default n + + config BSP_USING_BS16T1_HWTIMER + bool "Register HWTIMER7 " + select RT_USING_HWTIMER + default n + +endmenu + +menu "PWM Drivers" + + config BSP_USING_AD16C4T0_PWM + bool "Register PWM0 " + select RT_USING_PWM + default n + depends on !BSP_USING_AD16C4T0_HWTIMER + + config BSP_USING_AD16C4T1_PWM + bool "Register PWM1 " + select RT_USING_PWM + default n + depends on !BSP_USING_AD16C4T1_HWTIMER + + config BSP_USING_GP32C4T0_PWM + bool "Register PWM2 " + select RT_USING_PWM + default n + depends on !BSP_USING_GP32C4T0_HWTIMER + + config BSP_USING_GP32C4T1_PWM + bool "Register PWM3 " + select RT_USING_PWM + default n + depends on !BSP_USING_GP32C4T1_HWTIMER + + config BSP_USING_GP16C4T0_PWM + bool "Register PWM4 " + select RT_USING_PWM + default n + depends on !BSP_USING_GP16C4T0_HWTIMER + + config BSP_USING_GP16C4T1_PWM + bool "Register PWM5 " + select RT_USING_PWM + default n + depends on !BSP_USING_GP16C4T1_HWTIMER + +endmenu + +menu "PM Drivers" + + config BSP_USING_PM + bool "Register PM " + select RT_USING_PM + default n + +endmenu + diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_adc.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_adc.h new file mode 100644 index 0000000000..772f7a0df0 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_adc.h @@ -0,0 +1,97 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_ADC_H__ +#define __ES_CONF_INFO_ADC_H__ + +#include "es_conf_info_map.h" + +#include + + +#define ES_C_ADC_CLK_DIV_1 ADC_CKDIV_1 +#define ES_C_ADC_CLK_DIV_2 ADC_CKDIV_2 +#define ES_C_ADC_CLK_DIV_4 ADC_CKDIV_4 +#define ES_C_ADC_CLK_DIV_8 ADC_CKDIV_8 +#define ES_C_ADC_CLK_DIV_16 ADC_CKDIV_16 +#define ES_C_ADC_CLK_DIV_32 ADC_CKDIV_32 +#define ES_C_ADC_CLK_DIV_64 ADC_CKDIV_64 +#define ES_C_ADC_CLK_DIV_128 ADC_CKDIV_128 + +#define ES_C_ADC_ALIGN_RIGHT ADC_DATAALIGN_RIGHT +#define ES_C_ADC_ALIGN_LEFT ADC_DATAALIGN_LEFT + +#define ES_C_ADC_CONV_BIT_6 ADC_CONV_BIT_6 +#define ES_C_ADC_CONV_BIT_8 ADC_CONV_BIT_8 +#define ES_C_ADC_CONV_BIT_10 ADC_CONV_BIT_10 +#define ES_C_ADC_CONV_BIT_12 ADC_CONV_BIT_12 + +#define ES_C_ADC_SAMPLE_TIME_1 ADC_SAMPLETIME_1 +#define ES_C_ADC_SAMPLE_TIME_2 ADC_SAMPLETIME_2 +#define ES_C_ADC_SAMPLE_TIME_4 ADC_SAMPLETIME_4 +#define ES_C_ADC_SAMPLE_TIME_15 ADC_SAMPLETIME_15 + +/* ADC 配置 */ + +/* codes_main */ + + +#define ES_ADC0_ALIGN ES_C_ADC_ALIGN_RIGHT +#define ES_ADC1_ALIGN ES_C_ADC_ALIGN_RIGHT +#define ES_ADC1_DATA_BIT ES_C_ADC_CONV_BIT_12 +#define ES_ADC0_DATA_BIT ES_C_ADC_CONV_BIT_12 + +#ifndef ES_DEVICE_NAME_ADC0 +#define ES_DEVICE_NAME_ADC0 "adc0" +#endif +#ifndef ES_DEVICE_NAME_ADC1 +#define ES_DEVICE_NAME_ADC1 "adc1" +#endif + +#ifndef ES_ADC0_CLK_DIV +#define ES_ADC0_CLK_DIV ES_C_ADC_CLK_DIV_128 +#endif +#ifndef ES_ADC0_ALIGN +#define ES_ADC0_ALIGN ES_C_ADC_ALIGN_RIGHT +#endif +#ifndef ES_ADC0_DATA_BIT +#define ES_ADC0_DATA_BIT ES_C_ADC_CONV_BIT_12 +#endif +#ifndef ES_ADC0_NCH_SAMPLETIME +#define ES_ADC0_NCH_SAMPLETIME ES_C_ADC_SAMPLE_TIME_4 +#endif + +#ifndef ES_ADC1_CLK_DIV +#define ES_ADC1_CLK_DIV ES_C_ADC_CLK_DIV_128 +#endif +#ifndef ES_ADC1_ALIGN +#define ES_ADC1_ALIGN ES_C_ADC_ALIGN_RIGHT +#endif +#ifndef ES_ADC1_DATA_BIT +#define ES_ADC1_DATA_BIT ES_C_ADC_CONV_BIT_12 +#endif +#ifndef ES_ADC1_NCH_SAMPLETIME +#define ES_ADC1_NCH_SAMPLETIME ES_C_ADC_SAMPLE_TIME_4 +#endif + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_can.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_can.h new file mode 100644 index 0000000000..46df1ed054 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_can.h @@ -0,0 +1,73 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_CAN_H__ +#define __ES_CONF_INFO_CAN_H__ + +#include "es_conf_info_map.h" +#include +#include + + +/*默认的CAN硬件过滤器的编号 0 */ +#define ES_C_CAN_DEFAULT_FILTER_NUMBER 0 + +/*硬件过滤器,过滤帧类型*/ +#define ES_C_CAN_FILTER_FRAME_TYPE 0 + + +#define ES_C_CAN_SJW_NUM_1 CAN_SJW_1 +#define ES_C_CAN_SJW_NUM_2 CAN_SJW_2 +#define ES_C_CAN_SJW_NUM_3 CAN_SJW_3 +#define ES_C_CAN_SJW_NUM_4 CAN_SJW_4 + + + +/* CAN 配置 */ + +/* codes_main */ + + + +#ifndef ES_DEVICE_NAME_CAN0 +#define ES_DEVICE_NAME_CAN0 "can0" +#endif + +#ifndef ES_CAN0_AUTO_BAN_RE_T +#define ES_CAN0_AUTO_BAN_RE_T ES_C_ENABLE +#endif +#ifndef ES_CAN0_SPEED +#define ES_CAN0_SPEED 1000000 +#endif +#ifndef ES_CAN0_SJW +#define ES_CAN0_SJW ES_C_CAN_SJW_NUM_4 +#endif + +#define ES_CAN0_CONFIG \ +{ \ + ES_CAN0_SPEED, \ + RT_CANMSG_BOX_SZ, \ + RT_CANSND_BOX_NUM, \ + RT_CAN_MODE_NORMAL, \ +}; +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_cmu.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_cmu.h new file mode 100644 index 0000000000..1c5e6a829a --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_cmu.h @@ -0,0 +1,89 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_CMU_H__ +#define __ES_CONF_INFO_CMU_H__ + + +#include + + +/* 时钟树 配置 */ + +#define ES_C_MUL_9 CMU_PLL1_OUTPUT_36M +#define ES_C_MUL_12 CMU_PLL1_OUTPUT_48M +#define ES_C_MUL_18 CMU_PLL1_OUTPUT_72M +#define ES_C_MUL_24 CMU_PLL1_OUTPUT_96M + +#define ES_C_DIV_1 CMU_DIV_1 +#define ES_C_DIV_2 CMU_DIV_2 +#define ES_C_DIV_4 CMU_DIV_4 +#define ES_C_DIV_8 CMU_DIV_8 +#define ES_C_DIV_16 CMU_DIV_16 +#define ES_C_DIV_32 CMU_DIV_32 +#define ES_C_DIV_64 CMU_DIV_64 +#define ES_C_DIV_128 CMU_DIV_128 +#define ES_C_DIV_256 CMU_DIV_256 +#define ES_C_DIV_512 CMU_DIV_512 +#define ES_C_DIV_1024 CMU_DIV_1024 +#define ES_C_DIV_2048 CMU_DIV_2048 +#define ES_C_DIV_4096 CMU_DIV_4096 + +#define ES_C_HOSC_DIV_1 CMU_PLL1_INPUT_HOSC +#define ES_C_HOSC_DIV_2 CMU_PLL1_INPUT_HOSC_2 +#define ES_C_HOSC_DIV_3 CMU_PLL1_INPUT_HOSC_3 +#define ES_C_HOSC_DIV_4 CMU_PLL1_INPUT_HOSC_4 +#define ES_C_HOSC_DIV_5 CMU_PLL1_INPUT_HOSC_5 +#define ES_C_HOSC_DIV_6 CMU_PLL1_INPUT_HOSC_6 +#define ES_C_HRC_DIV_6 CMU_PLL1_INPUT_HRC_6 + + + + + +#define ES_PLL1_REFER_CLK ES_C_HOSC_DIV_3 +#define ES_PLL1_OUT_CLK ES_C_MUL_18 +#define ES_CMU_PLL1_EN ES_C_ENABLE +#define ES_CMU_PLL1_SAFE_EN ES_C_DISABLE +#define ES_CMU_LOSC_EN ES_C_ENABLE +#define ES_CMU_LRC_EN ES_C_ENABLE +#define ES_CMU_HOSC_EN ES_C_ENABLE +#define ES_CMU_HRC_EN ES_C_ENABLE +#define ES_CMU_SYS_DIV ES_C_DIV_1 +#define ES_CMU_HCLK_1_DIV ES_C_DIV_2 +#define ES_CMU_HCLK_2_DIV ES_C_DIV_2 +#define ES_CMU_PCLK_1_DIV ES_C_DIV_2 +#define ES_CMU_PCLK_2_DIV ES_C_DIV_4 +#define ES_SYS_CLK_SOURSE CMU_CLOCK_PLL1 +#define ES_PLL_CLK 72000000 +#define ES_SYS_SOURCE_CLK 72000000 +#define ES_SYS_CLK 72000000 +#define ES_PCLK1_CLK 36000000 +#define ES_PCLK2_CLK 18000000 +#define ES_HCLK1_CLK 36000000 +#define ES_HCLK2_CLK 36000000 +#define ES_CMU_EXTERN_CLK_LOSC 32768 +#define ES_CMU_EXTERN_CLK_HOSC 12000000 + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_gpio.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_gpio.h new file mode 100644 index 0000000000..7748e5fda2 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_gpio.h @@ -0,0 +1,5157 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_GPIO_H__ +#define __ES_CONF_INFO_GPIO_H__ + +#include "es_conf_info_map.h" + +#include +#include +#include + +/* GPIO 配置 */ + +typedef struct { + uint8_t pin; + uint8_t pin_mode; + uint8_t pin_level; + uint8_t irq_en; + uint8_t irq_mode; + void (*callback)(void *arg); +} gpio_conf_t; + +/*参数的定义*/ + +#define ES_C_GPIO_LEVEL_HIGH PIN_HIGH +#define ES_C_GPIO_LEVEL_LOW PIN_LOW + +#define ES_C_GPIO_MODE_OUTPUT PIN_MODE_OUTPUT +#define ES_C_GPIO_MODE_INPUT PIN_MODE_INPUT +#define ES_C_GPIO_MODE_INPUT_PULLUP PIN_MODE_INPUT_PULLUP +#define ES_C_GPIO_MODE_INPUT_PULLDOWN PIN_MODE_INPUT_PULLDOWN +#define ES_C_GPIO_MODE_OUTPUT_OD PIN_MODE_OUTPUT_OD + +#define ES_C_GPIO_IRQ_ENABLE PIN_IRQ_ENABLE +#define ES_C_GPIO_IRQ_DISABLE PIN_IRQ_DISABLE + +#define ES_C_GPIO_IRQ_MODE_FALL PIN_IRQ_MODE_FALLING +#define ES_C_GPIO_IRQ_MODE_RISE PIN_IRQ_MODE_RISING +#define ES_C_GPIO_IRQ_MODE_R_F PIN_IRQ_MODE_RISING_FALLING + + + + + +/* codes_main */ + + + + +#ifndef ES_DEVICE_NAME_PIN +#define ES_DEVICE_NAME_PIN "pin" +#endif + +/*GPIO外部中断回调函数控制需要,补充是否中断*/ +#if 11111 + +#ifndef ES_INIT_GPIO_A_0_IRQ_EN +#define ES_INIT_GPIO_A_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_1_IRQ_EN +#define ES_INIT_GPIO_A_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_2_IRQ_EN +#define ES_INIT_GPIO_A_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_3_IRQ_EN +#define ES_INIT_GPIO_A_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_4_IRQ_EN +#define ES_INIT_GPIO_A_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_5_IRQ_EN +#define ES_INIT_GPIO_A_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_6_IRQ_EN +#define ES_INIT_GPIO_A_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_7_IRQ_EN +#define ES_INIT_GPIO_A_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_8_IRQ_EN +#define ES_INIT_GPIO_A_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_9_IRQ_EN +#define ES_INIT_GPIO_A_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_10_IRQ_EN +#define ES_INIT_GPIO_A_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_11_IRQ_EN +#define ES_INIT_GPIO_A_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_12_IRQ_EN +#define ES_INIT_GPIO_A_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_13_IRQ_EN +#define ES_INIT_GPIO_A_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_14_IRQ_EN +#define ES_INIT_GPIO_A_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_A_15_IRQ_EN +#define ES_INIT_GPIO_A_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_0_IRQ_EN +#define ES_INIT_GPIO_B_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_1_IRQ_EN +#define ES_INIT_GPIO_B_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_2_IRQ_EN +#define ES_INIT_GPIO_B_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_3_IRQ_EN +#define ES_INIT_GPIO_B_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_4_IRQ_EN +#define ES_INIT_GPIO_B_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_5_IRQ_EN +#define ES_INIT_GPIO_B_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_6_IRQ_EN +#define ES_INIT_GPIO_B_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_7_IRQ_EN +#define ES_INIT_GPIO_B_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_8_IRQ_EN +#define ES_INIT_GPIO_B_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_9_IRQ_EN +#define ES_INIT_GPIO_B_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_10_IRQ_EN +#define ES_INIT_GPIO_B_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_11_IRQ_EN +#define ES_INIT_GPIO_B_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_12_IRQ_EN +#define ES_INIT_GPIO_B_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_13_IRQ_EN +#define ES_INIT_GPIO_B_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_14_IRQ_EN +#define ES_INIT_GPIO_B_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_B_15_IRQ_EN +#define ES_INIT_GPIO_B_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_0_IRQ_EN +#define ES_INIT_GPIO_C_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_1_IRQ_EN +#define ES_INIT_GPIO_C_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_2_IRQ_EN +#define ES_INIT_GPIO_C_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_3_IRQ_EN +#define ES_INIT_GPIO_C_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_4_IRQ_EN +#define ES_INIT_GPIO_C_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_5_IRQ_EN +#define ES_INIT_GPIO_C_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_6_IRQ_EN +#define ES_INIT_GPIO_C_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_7_IRQ_EN +#define ES_INIT_GPIO_C_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_8_IRQ_EN +#define ES_INIT_GPIO_C_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_9_IRQ_EN +#define ES_INIT_GPIO_C_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_10_IRQ_EN +#define ES_INIT_GPIO_C_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_11_IRQ_EN +#define ES_INIT_GPIO_C_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_12_IRQ_EN +#define ES_INIT_GPIO_C_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_13_IRQ_EN +#define ES_INIT_GPIO_C_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_14_IRQ_EN +#define ES_INIT_GPIO_C_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_C_15_IRQ_EN +#define ES_INIT_GPIO_C_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_0_IRQ_EN +#define ES_INIT_GPIO_D_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_1_IRQ_EN +#define ES_INIT_GPIO_D_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_2_IRQ_EN +#define ES_INIT_GPIO_D_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_3_IRQ_EN +#define ES_INIT_GPIO_D_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_4_IRQ_EN +#define ES_INIT_GPIO_D_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_5_IRQ_EN +#define ES_INIT_GPIO_D_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_6_IRQ_EN +#define ES_INIT_GPIO_D_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_7_IRQ_EN +#define ES_INIT_GPIO_D_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_8_IRQ_EN +#define ES_INIT_GPIO_D_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_9_IRQ_EN +#define ES_INIT_GPIO_D_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_10_IRQ_EN +#define ES_INIT_GPIO_D_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_11_IRQ_EN +#define ES_INIT_GPIO_D_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_12_IRQ_EN +#define ES_INIT_GPIO_D_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_13_IRQ_EN +#define ES_INIT_GPIO_D_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_14_IRQ_EN +#define ES_INIT_GPIO_D_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_D_15_IRQ_EN +#define ES_INIT_GPIO_D_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_0_IRQ_EN +#define ES_INIT_GPIO_E_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_1_IRQ_EN +#define ES_INIT_GPIO_E_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_2_IRQ_EN +#define ES_INIT_GPIO_E_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_3_IRQ_EN +#define ES_INIT_GPIO_E_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_4_IRQ_EN +#define ES_INIT_GPIO_E_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_5_IRQ_EN +#define ES_INIT_GPIO_E_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_6_IRQ_EN +#define ES_INIT_GPIO_E_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_7_IRQ_EN +#define ES_INIT_GPIO_E_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_8_IRQ_EN +#define ES_INIT_GPIO_E_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_9_IRQ_EN +#define ES_INIT_GPIO_E_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_10_IRQ_EN +#define ES_INIT_GPIO_E_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_11_IRQ_EN +#define ES_INIT_GPIO_E_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_12_IRQ_EN +#define ES_INIT_GPIO_E_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_13_IRQ_EN +#define ES_INIT_GPIO_E_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_14_IRQ_EN +#define ES_INIT_GPIO_E_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_E_15_IRQ_EN +#define ES_INIT_GPIO_E_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_0_IRQ_EN +#define ES_INIT_GPIO_F_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_1_IRQ_EN +#define ES_INIT_GPIO_F_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_2_IRQ_EN +#define ES_INIT_GPIO_F_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_3_IRQ_EN +#define ES_INIT_GPIO_F_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_4_IRQ_EN +#define ES_INIT_GPIO_F_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_5_IRQ_EN +#define ES_INIT_GPIO_F_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_6_IRQ_EN +#define ES_INIT_GPIO_F_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_7_IRQ_EN +#define ES_INIT_GPIO_F_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_8_IRQ_EN +#define ES_INIT_GPIO_F_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_9_IRQ_EN +#define ES_INIT_GPIO_F_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_10_IRQ_EN +#define ES_INIT_GPIO_F_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_11_IRQ_EN +#define ES_INIT_GPIO_F_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_12_IRQ_EN +#define ES_INIT_GPIO_F_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_13_IRQ_EN +#define ES_INIT_GPIO_F_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_14_IRQ_EN +#define ES_INIT_GPIO_F_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_F_15_IRQ_EN +#define ES_INIT_GPIO_F_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_0_IRQ_EN +#define ES_INIT_GPIO_G_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_1_IRQ_EN +#define ES_INIT_GPIO_G_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_2_IRQ_EN +#define ES_INIT_GPIO_G_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_3_IRQ_EN +#define ES_INIT_GPIO_G_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_4_IRQ_EN +#define ES_INIT_GPIO_G_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_5_IRQ_EN +#define ES_INIT_GPIO_G_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_6_IRQ_EN +#define ES_INIT_GPIO_G_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_7_IRQ_EN +#define ES_INIT_GPIO_G_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_8_IRQ_EN +#define ES_INIT_GPIO_G_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_9_IRQ_EN +#define ES_INIT_GPIO_G_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_10_IRQ_EN +#define ES_INIT_GPIO_G_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_11_IRQ_EN +#define ES_INIT_GPIO_G_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_12_IRQ_EN +#define ES_INIT_GPIO_G_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_13_IRQ_EN +#define ES_INIT_GPIO_G_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_14_IRQ_EN +#define ES_INIT_GPIO_G_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_G_15_IRQ_EN +#define ES_INIT_GPIO_G_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_0_IRQ_EN +#define ES_INIT_GPIO_H_0_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_1_IRQ_EN +#define ES_INIT_GPIO_H_1_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_2_IRQ_EN +#define ES_INIT_GPIO_H_2_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_3_IRQ_EN +#define ES_INIT_GPIO_H_3_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_4_IRQ_EN +#define ES_INIT_GPIO_H_4_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_5_IRQ_EN +#define ES_INIT_GPIO_H_5_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_6_IRQ_EN +#define ES_INIT_GPIO_H_6_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_7_IRQ_EN +#define ES_INIT_GPIO_H_7_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_8_IRQ_EN +#define ES_INIT_GPIO_H_8_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_9_IRQ_EN +#define ES_INIT_GPIO_H_9_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_10_IRQ_EN +#define ES_INIT_GPIO_H_10_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_11_IRQ_EN +#define ES_INIT_GPIO_H_11_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_12_IRQ_EN +#define ES_INIT_GPIO_H_12_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_13_IRQ_EN +#define ES_INIT_GPIO_H_13_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_14_IRQ_EN +#define ES_INIT_GPIO_H_14_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#ifndef ES_INIT_GPIO_H_15_IRQ_EN +#define ES_INIT_GPIO_H_15_IRQ_EN ES_C_GPIO_IRQ_DISABLE +#endif + +#endif //11111 + + + +/*是否需要 GPIO外部中断回调函数 (控制函数本体+声明)*/ +#if 11111 + +#if (ES_INIT_GPIO_A_0_IRQ_EN)||(ES_INIT_GPIO_B_0_IRQ_EN)||(ES_INIT_GPIO_C_0_IRQ_EN)||(ES_INIT_GPIO_D_0_IRQ_EN)|| \ + (ES_INIT_GPIO_E_0_IRQ_EN)||(ES_INIT_GPIO_F_0_IRQ_EN)||(ES_INIT_GPIO_G_0_IRQ_EN)||(ES_INIT_GPIO_H_0_IRQ_EN) +#define ES_CONF_EXTI_IRQ_0 +#endif + +#if (ES_INIT_GPIO_A_1_IRQ_EN)||(ES_INIT_GPIO_B_1_IRQ_EN)||(ES_INIT_GPIO_C_1_IRQ_EN)||(ES_INIT_GPIO_D_1_IRQ_EN)|| \ + (ES_INIT_GPIO_E_1_IRQ_EN)||(ES_INIT_GPIO_F_1_IRQ_EN)||(ES_INIT_GPIO_G_1_IRQ_EN)||(ES_INIT_GPIO_H_1_IRQ_EN) +#define ES_CONF_EXTI_IRQ_1 +#endif + +#if (ES_INIT_GPIO_A_2_IRQ_EN)||(ES_INIT_GPIO_B_2_IRQ_EN)||(ES_INIT_GPIO_C_2_IRQ_EN)||(ES_INIT_GPIO_D_2_IRQ_EN)|| \ + (ES_INIT_GPIO_E_2_IRQ_EN)||(ES_INIT_GPIO_F_2_IRQ_EN)||(ES_INIT_GPIO_G_2_IRQ_EN)||(ES_INIT_GPIO_H_2_IRQ_EN) +#define ES_CONF_EXTI_IRQ_2 +#endif + +#if (ES_INIT_GPIO_A_3_IRQ_EN)||(ES_INIT_GPIO_B_3_IRQ_EN)||(ES_INIT_GPIO_C_3_IRQ_EN)||(ES_INIT_GPIO_D_3_IRQ_EN)|| \ + (ES_INIT_GPIO_E_3_IRQ_EN)||(ES_INIT_GPIO_F_3_IRQ_EN)||(ES_INIT_GPIO_G_3_IRQ_EN)||(ES_INIT_GPIO_H_3_IRQ_EN) +#define ES_CONF_EXTI_IRQ_3 +#endif + +#if (ES_INIT_GPIO_A_4_IRQ_EN)||(ES_INIT_GPIO_B_4_IRQ_EN)||(ES_INIT_GPIO_C_4_IRQ_EN)||(ES_INIT_GPIO_D_4_IRQ_EN)|| \ + (ES_INIT_GPIO_E_4_IRQ_EN)||(ES_INIT_GPIO_F_4_IRQ_EN)||(ES_INIT_GPIO_G_4_IRQ_EN)||(ES_INIT_GPIO_H_4_IRQ_EN) +#define ES_CONF_EXTI_IRQ_4 +#endif + +#if (ES_INIT_GPIO_A_5_IRQ_EN)||(ES_INIT_GPIO_B_5_IRQ_EN)||(ES_INIT_GPIO_C_5_IRQ_EN)||(ES_INIT_GPIO_D_5_IRQ_EN)|| \ + (ES_INIT_GPIO_E_5_IRQ_EN)||(ES_INIT_GPIO_F_5_IRQ_EN)||(ES_INIT_GPIO_G_5_IRQ_EN)||(ES_INIT_GPIO_H_5_IRQ_EN) +#define ES_CONF_EXTI_IRQ_5 +#endif + +#if (ES_INIT_GPIO_A_6_IRQ_EN)||(ES_INIT_GPIO_B_6_IRQ_EN)||(ES_INIT_GPIO_C_6_IRQ_EN)||(ES_INIT_GPIO_D_6_IRQ_EN)|| \ + (ES_INIT_GPIO_E_6_IRQ_EN)||(ES_INIT_GPIO_F_6_IRQ_EN)||(ES_INIT_GPIO_G_6_IRQ_EN)||(ES_INIT_GPIO_H_6_IRQ_EN) +#define ES_CONF_EXTI_IRQ_6 +#endif + +#if (ES_INIT_GPIO_A_7_IRQ_EN)||(ES_INIT_GPIO_B_7_IRQ_EN)||(ES_INIT_GPIO_C_7_IRQ_EN)||(ES_INIT_GPIO_D_7_IRQ_EN)|| \ + (ES_INIT_GPIO_E_7_IRQ_EN)||(ES_INIT_GPIO_F_7_IRQ_EN)||(ES_INIT_GPIO_G_7_IRQ_EN)||(ES_INIT_GPIO_H_7_IRQ_EN) +#define ES_CONF_EXTI_IRQ_7 +#endif + +#if (ES_INIT_GPIO_A_8_IRQ_EN)||(ES_INIT_GPIO_B_8_IRQ_EN)||(ES_INIT_GPIO_C_8_IRQ_EN)||(ES_INIT_GPIO_D_8_IRQ_EN)|| \ + (ES_INIT_GPIO_E_8_IRQ_EN)||(ES_INIT_GPIO_F_8_IRQ_EN)||(ES_INIT_GPIO_G_8_IRQ_EN)||(ES_INIT_GPIO_H_8_IRQ_EN) +#define ES_CONF_EXTI_IRQ_8 +#endif + +#if (ES_INIT_GPIO_A_9_IRQ_EN)||(ES_INIT_GPIO_B_9_IRQ_EN)||(ES_INIT_GPIO_C_9_IRQ_EN)||(ES_INIT_GPIO_D_9_IRQ_EN)|| \ + (ES_INIT_GPIO_E_9_IRQ_EN)||(ES_INIT_GPIO_F_9_IRQ_EN)||(ES_INIT_GPIO_G_9_IRQ_EN)||(ES_INIT_GPIO_H_9_IRQ_EN) +#define ES_CONF_EXTI_IRQ_9 +#endif + +#if (ES_INIT_GPIO_A_10_IRQ_EN)||(ES_INIT_GPIO_B_10_IRQ_EN)||(ES_INIT_GPIO_C_10_IRQ_EN)||(ES_INIT_GPIO_D_10_IRQ_EN)|| \ + (ES_INIT_GPIO_E_10_IRQ_EN)||(ES_INIT_GPIO_F_10_IRQ_EN)||(ES_INIT_GPIO_G_10_IRQ_EN)||(ES_INIT_GPIO_H_10_IRQ_EN) +#define ES_CONF_EXTI_IRQ_10 +#endif + +#if (ES_INIT_GPIO_A_11_IRQ_EN)||(ES_INIT_GPIO_B_11_IRQ_EN)||(ES_INIT_GPIO_C_11_IRQ_EN)||(ES_INIT_GPIO_D_11_IRQ_EN)|| \ + (ES_INIT_GPIO_E_11_IRQ_EN)||(ES_INIT_GPIO_F_11_IRQ_EN)||(ES_INIT_GPIO_G_11_IRQ_EN)||(ES_INIT_GPIO_H_11_IRQ_EN) +#define ES_CONF_EXTI_IRQ_11 +#endif + +#if (ES_INIT_GPIO_A_12_IRQ_EN)||(ES_INIT_GPIO_B_12_IRQ_EN)||(ES_INIT_GPIO_C_12_IRQ_EN)||(ES_INIT_GPIO_D_12_IRQ_EN)|| \ + (ES_INIT_GPIO_E_12_IRQ_EN)||(ES_INIT_GPIO_F_12_IRQ_EN)||(ES_INIT_GPIO_G_12_IRQ_EN)||(ES_INIT_GPIO_H_12_IRQ_EN) +#define ES_CONF_EXTI_IRQ_12 +#endif + +#if (ES_INIT_GPIO_A_13_IRQ_EN)||(ES_INIT_GPIO_B_13_IRQ_EN)||(ES_INIT_GPIO_C_13_IRQ_EN)||(ES_INIT_GPIO_D_13_IRQ_EN)|| \ + (ES_INIT_GPIO_E_13_IRQ_EN)||(ES_INIT_GPIO_F_13_IRQ_EN)||(ES_INIT_GPIO_G_13_IRQ_EN)||(ES_INIT_GPIO_H_13_IRQ_EN) +#define ES_CONF_EXTI_IRQ_13 +#endif + +#if (ES_INIT_GPIO_A_14_IRQ_EN)||(ES_INIT_GPIO_B_14_IRQ_EN)||(ES_INIT_GPIO_C_14_IRQ_EN)||(ES_INIT_GPIO_D_14_IRQ_EN)|| \ + (ES_INIT_GPIO_E_14_IRQ_EN)||(ES_INIT_GPIO_F_14_IRQ_EN)||(ES_INIT_GPIO_G_14_IRQ_EN)||(ES_INIT_GPIO_H_14_IRQ_EN) +#define ES_CONF_EXTI_IRQ_14 +#endif + +#if (ES_INIT_GPIO_A_15_IRQ_EN)||(ES_INIT_GPIO_B_15_IRQ_EN)||(ES_INIT_GPIO_C_15_IRQ_EN)||(ES_INIT_GPIO_D_15_IRQ_EN)|| \ + (ES_INIT_GPIO_E_15_IRQ_EN)||(ES_INIT_GPIO_F_15_IRQ_EN)||(ES_INIT_GPIO_G_15_IRQ_EN)||(ES_INIT_GPIO_H_15_IRQ_EN) +#define ES_CONF_EXTI_IRQ_15 +#endif + +#endif //11111 + + +/*GPIO外部中断 声明*/ +#if 11111 + +#ifdef ES_CONF_EXTI_IRQ_0 +void irq_pin0_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_1 +void irq_pin1_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_2 +void irq_pin2_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_3 +void irq_pin3_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_4 +void irq_pin4_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_5 +void irq_pin5_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_6 +void irq_pin6_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_7 +void irq_pin7_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_8 +void irq_pin8_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_9 +void irq_pin9_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_10 +void irq_pin10_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_11 +void irq_pin11_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_12 +void irq_pin12_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_13 +void irq_pin13_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_14 +void irq_pin14_callback(void* arg); +#endif + +#ifdef ES_CONF_EXTI_IRQ_15 +void irq_pin15_callback(void* arg); +#endif + + +#endif //11111 + + + + +/*是否有配置的管脚*/ +#if defined(ES_INIT_PIN_GPIO_A_0) || defined(ES_INIT_PIN_GPIO_A_1) || defined(ES_INIT_PIN_GPIO_A_2) || defined(ES_INIT_PIN_GPIO_A_3) || \ + defined(ES_INIT_PIN_GPIO_A_4) || defined(ES_INIT_PIN_GPIO_A_5) || defined(ES_INIT_PIN_GPIO_A_6) || defined(ES_INIT_PIN_GPIO_A_7) || \ + defined(ES_INIT_PIN_GPIO_A_8) || defined(ES_INIT_PIN_GPIO_A_9) || defined(ES_INIT_PIN_GPIO_A_10) || defined(ES_INIT_PIN_GPIO_A_11) || \ + defined(ES_INIT_PIN_GPIO_A_12) || defined(ES_INIT_PIN_GPIO_A_13) || defined(ES_INIT_PIN_GPIO_A_14) || defined(ES_INIT_PIN_GPIO_A_15) || \ + defined(ES_INIT_PIN_GPIO_B_0) || defined(ES_INIT_PIN_GPIO_B_1) || defined(ES_INIT_PIN_GPIO_B_2) || defined(ES_INIT_PIN_GPIO_B_3) || \ + defined(ES_INIT_PIN_GPIO_B_4) || defined(ES_INIT_PIN_GPIO_B_5) || defined(ES_INIT_PIN_GPIO_B_6) || defined(ES_INIT_PIN_GPIO_B_7) || \ + defined(ES_INIT_PIN_GPIO_B_8) || defined(ES_INIT_PIN_GPIO_B_9) || defined(ES_INIT_PIN_GPIO_B_10) || defined(ES_INIT_PIN_GPIO_B_11) || \ + defined(ES_INIT_PIN_GPIO_B_12) || defined(ES_INIT_PIN_GPIO_B_13) || defined(ES_INIT_PIN_GPIO_B_14) || defined(ES_INIT_PIN_GPIO_B_15) || \ + defined(ES_INIT_PIN_GPIO_C_0) || defined(ES_INIT_PIN_GPIO_C_1) || defined(ES_INIT_PIN_GPIO_C_2) || defined(ES_INIT_PIN_GPIO_C_3) || \ + defined(ES_INIT_PIN_GPIO_C_4) || defined(ES_INIT_PIN_GPIO_C_5) || defined(ES_INIT_PIN_GPIO_C_6) || defined(ES_INIT_PIN_GPIO_C_7) || \ + defined(ES_INIT_PIN_GPIO_C_8) || defined(ES_INIT_PIN_GPIO_C_9) || defined(ES_INIT_PIN_GPIO_C_10) || defined(ES_INIT_PIN_GPIO_C_11) || \ + defined(ES_INIT_PIN_GPIO_C_12) || defined(ES_INIT_PIN_GPIO_C_13) || defined(ES_INIT_PIN_GPIO_C_14) || defined(ES_INIT_PIN_GPIO_C_15) || \ + defined(ES_INIT_PIN_GPIO_D_0) || defined(ES_INIT_PIN_GPIO_D_1) || defined(ES_INIT_PIN_GPIO_D_2) || defined(ES_INIT_PIN_GPIO_D_3) || \ + defined(ES_INIT_PIN_GPIO_D_4) || defined(ES_INIT_PIN_GPIO_D_5) || defined(ES_INIT_PIN_GPIO_D_6) || defined(ES_INIT_PIN_GPIO_D_7) || \ + defined(ES_INIT_PIN_GPIO_D_8) || defined(ES_INIT_PIN_GPIO_D_9) || defined(ES_INIT_PIN_GPIO_D_10) || defined(ES_INIT_PIN_GPIO_D_11) || \ + defined(ES_INIT_PIN_GPIO_D_12) || defined(ES_INIT_PIN_GPIO_D_13) || defined(ES_INIT_PIN_GPIO_D_14) || defined(ES_INIT_PIN_GPIO_D_15) || \ + defined(ES_INIT_PIN_GPIO_E_0) || defined(ES_INIT_PIN_GPIO_E_1) || defined(ES_INIT_PIN_GPIO_E_2) || defined(ES_INIT_PIN_GPIO_E_3) || \ + defined(ES_INIT_PIN_GPIO_E_4) || defined(ES_INIT_PIN_GPIO_E_5) || defined(ES_INIT_PIN_GPIO_E_6) || defined(ES_INIT_PIN_GPIO_E_7) || \ + defined(ES_INIT_PIN_GPIO_E_8) || defined(ES_INIT_PIN_GPIO_E_9) || defined(ES_INIT_PIN_GPIO_E_10) || defined(ES_INIT_PIN_GPIO_E_11) || \ + defined(ES_INIT_PIN_GPIO_E_12) || defined(ES_INIT_PIN_GPIO_E_13) || defined(ES_INIT_PIN_GPIO_E_14) || defined(ES_INIT_PIN_GPIO_E_15) || \ + defined(ES_INIT_PIN_GPIO_F_0) || defined(ES_INIT_PIN_GPIO_F_1) || defined(ES_INIT_PIN_GPIO_F_2) || defined(ES_INIT_PIN_GPIO_F_3) || \ + defined(ES_INIT_PIN_GPIO_F_4) || defined(ES_INIT_PIN_GPIO_F_5) || defined(ES_INIT_PIN_GPIO_F_6) || defined(ES_INIT_PIN_GPIO_F_7) || \ + defined(ES_INIT_PIN_GPIO_F_8) || defined(ES_INIT_PIN_GPIO_F_9) || defined(ES_INIT_PIN_GPIO_F_10) || defined(ES_INIT_PIN_GPIO_F_11) || \ + defined(ES_INIT_PIN_GPIO_F_12) || defined(ES_INIT_PIN_GPIO_F_13) || defined(ES_INIT_PIN_GPIO_F_14) || defined(ES_INIT_PIN_GPIO_F_15) || \ + defined(ES_INIT_PIN_GPIO_G_0) || defined(ES_INIT_PIN_GPIO_G_1) || defined(ES_INIT_PIN_GPIO_G_2) || defined(ES_INIT_PIN_GPIO_G_3) || \ + defined(ES_INIT_PIN_GPIO_G_4) || defined(ES_INIT_PIN_GPIO_G_5) || defined(ES_INIT_PIN_GPIO_G_6) || defined(ES_INIT_PIN_GPIO_G_7) || \ + defined(ES_INIT_PIN_GPIO_G_8) || defined(ES_INIT_PIN_GPIO_G_9) || defined(ES_INIT_PIN_GPIO_G_10) || defined(ES_INIT_PIN_GPIO_G_11) || \ + defined(ES_INIT_PIN_GPIO_G_12) || defined(ES_INIT_PIN_GPIO_G_13) || defined(ES_INIT_PIN_GPIO_G_14) || defined(ES_INIT_PIN_GPIO_G_15) || \ + defined(ES_INIT_PIN_GPIO_H_0) || defined(ES_INIT_PIN_GPIO_H_1) || defined(ES_INIT_PIN_GPIO_H_2) || defined(ES_INIT_PIN_GPIO_H_3) || \ + defined(ES_INIT_PIN_GPIO_H_4) || defined(ES_INIT_PIN_GPIO_H_5) || defined(ES_INIT_PIN_GPIO_H_6) || defined(ES_INIT_PIN_GPIO_H_7) || \ + defined(ES_INIT_PIN_GPIO_H_8) || defined(ES_INIT_PIN_GPIO_H_9) || defined(ES_INIT_PIN_GPIO_H_10) || defined(ES_INIT_PIN_GPIO_H_11) || \ + defined(ES_INIT_PIN_GPIO_H_12) || defined(ES_INIT_PIN_GPIO_H_13) || defined(ES_INIT_PIN_GPIO_H_14) || defined(ES_INIT_PIN_GPIO_H_15) + +#define ES_INIT_GPIOS + +#endif + + +#ifdef ES_INIT_GPIOS + +static gpio_conf_t gpio_conf_all[] = +{ + +#ifdef ES_INIT_PIN_GPIO_A_0 + + { + ES_PIN_GPIO_A_0 , + +#ifdef ES_INIT_GPIO_A_0_MODE + ES_INIT_GPIO_A_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_0_LEVEL + ES_INIT_GPIO_A_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_0_IRQ_MODE + ES_INIT_GPIO_A_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_1 + + { + ES_PIN_GPIO_A_1 , + +#ifdef ES_INIT_GPIO_A_1_MODE + ES_INIT_GPIO_A_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_1_LEVEL + ES_INIT_GPIO_A_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_1_IRQ_MODE + ES_INIT_GPIO_A_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_2 + + { + ES_PIN_GPIO_A_2 , + +#ifdef ES_INIT_GPIO_A_2_MODE + ES_INIT_GPIO_A_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_2_LEVEL + ES_INIT_GPIO_A_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_2_IRQ_MODE + ES_INIT_GPIO_A_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_3 + + { + ES_PIN_GPIO_A_3 , + +#ifdef ES_INIT_GPIO_A_3_MODE + ES_INIT_GPIO_A_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_3_LEVEL + ES_INIT_GPIO_A_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_3_IRQ_MODE + ES_INIT_GPIO_A_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_4 + + { + ES_PIN_GPIO_A_4 , + +#ifdef ES_INIT_GPIO_A_4_MODE + ES_INIT_GPIO_A_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_4_LEVEL + ES_INIT_GPIO_A_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_4_IRQ_MODE + ES_INIT_GPIO_A_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_5 + + { + ES_PIN_GPIO_A_5 , + +#ifdef ES_INIT_GPIO_A_5_MODE + ES_INIT_GPIO_A_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_5_LEVEL + ES_INIT_GPIO_A_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_5_IRQ_MODE + ES_INIT_GPIO_A_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_6 + + { + ES_PIN_GPIO_A_6 , + +#ifdef ES_INIT_GPIO_A_6_MODE + ES_INIT_GPIO_A_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_6_LEVEL + ES_INIT_GPIO_A_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_6_IRQ_MODE + ES_INIT_GPIO_A_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_7 + + { + ES_PIN_GPIO_A_7 , + +#ifdef ES_INIT_GPIO_A_7_MODE + ES_INIT_GPIO_A_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_7_LEVEL + ES_INIT_GPIO_A_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_7_IRQ_MODE + ES_INIT_GPIO_A_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_8 + + { + ES_PIN_GPIO_A_8 , + +#ifdef ES_INIT_GPIO_A_8_MODE + ES_INIT_GPIO_A_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_8_LEVEL + ES_INIT_GPIO_A_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_8_IRQ_MODE + ES_INIT_GPIO_A_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_9 + + { + ES_PIN_GPIO_A_9 , + +#ifdef ES_INIT_GPIO_A_9_MODE + ES_INIT_GPIO_A_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_9_LEVEL + ES_INIT_GPIO_A_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_9_IRQ_MODE + ES_INIT_GPIO_A_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_10 + + { + ES_PIN_GPIO_A_10 , + +#ifdef ES_INIT_GPIO_A_10_MODE + ES_INIT_GPIO_A_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_10_LEVEL + ES_INIT_GPIO_A_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_10_IRQ_MODE + ES_INIT_GPIO_A_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_11 + + { + ES_PIN_GPIO_A_11 , + +#ifdef ES_INIT_GPIO_A_11_MODE + ES_INIT_GPIO_A_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_11_LEVEL + ES_INIT_GPIO_A_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_11_IRQ_MODE + ES_INIT_GPIO_A_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_12 + + { + ES_PIN_GPIO_A_12 , + +#ifdef ES_INIT_GPIO_A_12_MODE + ES_INIT_GPIO_A_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_12_LEVEL + ES_INIT_GPIO_A_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_12_IRQ_MODE + ES_INIT_GPIO_A_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_13 + + { + ES_PIN_GPIO_A_13 , + +#ifdef ES_INIT_GPIO_A_13_MODE + ES_INIT_GPIO_A_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_13_LEVEL + ES_INIT_GPIO_A_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_13_IRQ_MODE + ES_INIT_GPIO_A_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_14 + + { + ES_PIN_GPIO_A_14 , + +#ifdef ES_INIT_GPIO_A_14_MODE + ES_INIT_GPIO_A_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_14_LEVEL + ES_INIT_GPIO_A_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_14_IRQ_MODE + ES_INIT_GPIO_A_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_A_15 + + { + ES_PIN_GPIO_A_15 , + +#ifdef ES_INIT_GPIO_A_15_MODE + ES_INIT_GPIO_A_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_A_15_LEVEL + ES_INIT_GPIO_A_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_A_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_A_15_IRQ_MODE + ES_INIT_GPIO_A_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_A_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_0 + + { + ES_PIN_GPIO_B_0 , + +#ifdef ES_INIT_GPIO_B_0_MODE + ES_INIT_GPIO_B_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_0_LEVEL + ES_INIT_GPIO_B_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_0_IRQ_MODE + ES_INIT_GPIO_B_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_1 + + { + ES_PIN_GPIO_B_1 , + +#ifdef ES_INIT_GPIO_B_1_MODE + ES_INIT_GPIO_B_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_1_LEVEL + ES_INIT_GPIO_B_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_1_IRQ_MODE + ES_INIT_GPIO_B_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_2 + + { + ES_PIN_GPIO_B_2 , + +#ifdef ES_INIT_GPIO_B_2_MODE + ES_INIT_GPIO_B_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_2_LEVEL + ES_INIT_GPIO_B_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_2_IRQ_MODE + ES_INIT_GPIO_B_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_3 + + { + ES_PIN_GPIO_B_3 , + +#ifdef ES_INIT_GPIO_B_3_MODE + ES_INIT_GPIO_B_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_3_LEVEL + ES_INIT_GPIO_B_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_3_IRQ_MODE + ES_INIT_GPIO_B_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_4 + + { + ES_PIN_GPIO_B_4 , + +#ifdef ES_INIT_GPIO_B_4_MODE + ES_INIT_GPIO_B_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_4_LEVEL + ES_INIT_GPIO_B_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_4_IRQ_MODE + ES_INIT_GPIO_B_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_5 + + { + ES_PIN_GPIO_B_5 , + +#ifdef ES_INIT_GPIO_B_5_MODE + ES_INIT_GPIO_B_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_5_LEVEL + ES_INIT_GPIO_B_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_5_IRQ_MODE + ES_INIT_GPIO_B_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_6 + + { + ES_PIN_GPIO_B_6 , + +#ifdef ES_INIT_GPIO_B_6_MODE + ES_INIT_GPIO_B_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_6_LEVEL + ES_INIT_GPIO_B_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_6_IRQ_MODE + ES_INIT_GPIO_B_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_7 + + { + ES_PIN_GPIO_B_7 , + +#ifdef ES_INIT_GPIO_B_7_MODE + ES_INIT_GPIO_B_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_7_LEVEL + ES_INIT_GPIO_B_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_7_IRQ_MODE + ES_INIT_GPIO_B_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_8 + + { + ES_PIN_GPIO_B_8 , + +#ifdef ES_INIT_GPIO_B_8_MODE + ES_INIT_GPIO_B_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_8_LEVEL + ES_INIT_GPIO_B_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_8_IRQ_MODE + ES_INIT_GPIO_B_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_9 + + { + ES_PIN_GPIO_B_9 , + +#ifdef ES_INIT_GPIO_B_9_MODE + ES_INIT_GPIO_B_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_9_LEVEL + ES_INIT_GPIO_B_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_9_IRQ_MODE + ES_INIT_GPIO_B_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_10 + + { + ES_PIN_GPIO_B_10 , + +#ifdef ES_INIT_GPIO_B_10_MODE + ES_INIT_GPIO_B_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_10_LEVEL + ES_INIT_GPIO_B_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_10_IRQ_MODE + ES_INIT_GPIO_B_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_11 + + { + ES_PIN_GPIO_B_11 , + +#ifdef ES_INIT_GPIO_B_11_MODE + ES_INIT_GPIO_B_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_11_LEVEL + ES_INIT_GPIO_B_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_11_IRQ_MODE + ES_INIT_GPIO_B_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_12 + + { + ES_PIN_GPIO_B_12 , + +#ifdef ES_INIT_GPIO_B_12_MODE + ES_INIT_GPIO_B_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_12_LEVEL + ES_INIT_GPIO_B_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_12_IRQ_MODE + ES_INIT_GPIO_B_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_13 + + { + ES_PIN_GPIO_B_13 , + +#ifdef ES_INIT_GPIO_B_13_MODE + ES_INIT_GPIO_B_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_13_LEVEL + ES_INIT_GPIO_B_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_13_IRQ_MODE + ES_INIT_GPIO_B_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_14 + + { + ES_PIN_GPIO_B_14 , + +#ifdef ES_INIT_GPIO_B_14_MODE + ES_INIT_GPIO_B_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_14_LEVEL + ES_INIT_GPIO_B_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_14_IRQ_MODE + ES_INIT_GPIO_B_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_B_15 + + { + ES_PIN_GPIO_B_15 , + +#ifdef ES_INIT_GPIO_B_15_MODE + ES_INIT_GPIO_B_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_B_15_LEVEL + ES_INIT_GPIO_B_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_B_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_B_15_IRQ_MODE + ES_INIT_GPIO_B_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_B_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_0 + + { + ES_PIN_GPIO_C_0 , + +#ifdef ES_INIT_GPIO_C_0_MODE + ES_INIT_GPIO_C_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_0_LEVEL + ES_INIT_GPIO_C_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_0_IRQ_MODE + ES_INIT_GPIO_C_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_1 + + { + ES_PIN_GPIO_C_1 , + +#ifdef ES_INIT_GPIO_C_1_MODE + ES_INIT_GPIO_C_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_1_LEVEL + ES_INIT_GPIO_C_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_1_IRQ_MODE + ES_INIT_GPIO_C_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_2 + + { + ES_PIN_GPIO_C_2 , + +#ifdef ES_INIT_GPIO_C_2_MODE + ES_INIT_GPIO_C_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_2_LEVEL + ES_INIT_GPIO_C_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_2_IRQ_MODE + ES_INIT_GPIO_C_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_3 + + { + ES_PIN_GPIO_C_3 , + +#ifdef ES_INIT_GPIO_C_3_MODE + ES_INIT_GPIO_C_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_3_LEVEL + ES_INIT_GPIO_C_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_3_IRQ_MODE + ES_INIT_GPIO_C_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_4 + + { + ES_PIN_GPIO_C_4 , + +#ifdef ES_INIT_GPIO_C_4_MODE + ES_INIT_GPIO_C_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_4_LEVEL + ES_INIT_GPIO_C_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_4_IRQ_MODE + ES_INIT_GPIO_C_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_5 + + { + ES_PIN_GPIO_C_5 , + +#ifdef ES_INIT_GPIO_C_5_MODE + ES_INIT_GPIO_C_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_5_LEVEL + ES_INIT_GPIO_C_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_5_IRQ_MODE + ES_INIT_GPIO_C_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_6 + + { + ES_PIN_GPIO_C_6 , + +#ifdef ES_INIT_GPIO_C_6_MODE + ES_INIT_GPIO_C_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_6_LEVEL + ES_INIT_GPIO_C_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_6_IRQ_MODE + ES_INIT_GPIO_C_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_7 + + { + ES_PIN_GPIO_C_7 , + +#ifdef ES_INIT_GPIO_C_7_MODE + ES_INIT_GPIO_C_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_7_LEVEL + ES_INIT_GPIO_C_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_7_IRQ_MODE + ES_INIT_GPIO_C_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_8 + + { + ES_PIN_GPIO_C_8 , + +#ifdef ES_INIT_GPIO_C_8_MODE + ES_INIT_GPIO_C_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_8_LEVEL + ES_INIT_GPIO_C_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_8_IRQ_MODE + ES_INIT_GPIO_C_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_9 + + { + ES_PIN_GPIO_C_9 , + +#ifdef ES_INIT_GPIO_C_9_MODE + ES_INIT_GPIO_C_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_9_LEVEL + ES_INIT_GPIO_C_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_9_IRQ_MODE + ES_INIT_GPIO_C_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_10 + + { + ES_PIN_GPIO_C_10 , + +#ifdef ES_INIT_GPIO_C_10_MODE + ES_INIT_GPIO_C_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_10_LEVEL + ES_INIT_GPIO_C_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_10_IRQ_MODE + ES_INIT_GPIO_C_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_11 + + { + ES_PIN_GPIO_C_11 , + +#ifdef ES_INIT_GPIO_C_11_MODE + ES_INIT_GPIO_C_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_11_LEVEL + ES_INIT_GPIO_C_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_11_IRQ_MODE + ES_INIT_GPIO_C_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_12 + + { + ES_PIN_GPIO_C_12 , + +#ifdef ES_INIT_GPIO_C_12_MODE + ES_INIT_GPIO_C_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_12_LEVEL + ES_INIT_GPIO_C_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_12_IRQ_MODE + ES_INIT_GPIO_C_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_13 + + { + ES_PIN_GPIO_C_13 , + +#ifdef ES_INIT_GPIO_C_13_MODE + ES_INIT_GPIO_C_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_13_LEVEL + ES_INIT_GPIO_C_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_13_IRQ_MODE + ES_INIT_GPIO_C_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_14 + + { + ES_PIN_GPIO_C_14 , + +#ifdef ES_INIT_GPIO_C_14_MODE + ES_INIT_GPIO_C_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_14_LEVEL + ES_INIT_GPIO_C_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_14_IRQ_MODE + ES_INIT_GPIO_C_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_C_15 + + { + ES_PIN_GPIO_C_15 , + +#ifdef ES_INIT_GPIO_C_15_MODE + ES_INIT_GPIO_C_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_C_15_LEVEL + ES_INIT_GPIO_C_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_C_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_C_15_IRQ_MODE + ES_INIT_GPIO_C_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_C_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_0 + + { + ES_PIN_GPIO_D_0 , + +#ifdef ES_INIT_GPIO_D_0_MODE + ES_INIT_GPIO_D_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_0_LEVEL + ES_INIT_GPIO_D_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_0_IRQ_MODE + ES_INIT_GPIO_D_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_1 + + { + ES_PIN_GPIO_D_1 , + +#ifdef ES_INIT_GPIO_D_1_MODE + ES_INIT_GPIO_D_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_1_LEVEL + ES_INIT_GPIO_D_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_1_IRQ_MODE + ES_INIT_GPIO_D_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_2 + + { + ES_PIN_GPIO_D_2 , + +#ifdef ES_INIT_GPIO_D_2_MODE + ES_INIT_GPIO_D_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_2_LEVEL + ES_INIT_GPIO_D_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_2_IRQ_MODE + ES_INIT_GPIO_D_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_3 + + { + ES_PIN_GPIO_D_3 , + +#ifdef ES_INIT_GPIO_D_3_MODE + ES_INIT_GPIO_D_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_3_LEVEL + ES_INIT_GPIO_D_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_3_IRQ_MODE + ES_INIT_GPIO_D_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_4 + + { + ES_PIN_GPIO_D_4 , + +#ifdef ES_INIT_GPIO_D_4_MODE + ES_INIT_GPIO_D_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_4_LEVEL + ES_INIT_GPIO_D_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_4_IRQ_MODE + ES_INIT_GPIO_D_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_5 + + { + ES_PIN_GPIO_D_5 , + +#ifdef ES_INIT_GPIO_D_5_MODE + ES_INIT_GPIO_D_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_5_LEVEL + ES_INIT_GPIO_D_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_5_IRQ_MODE + ES_INIT_GPIO_D_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_6 + + { + ES_PIN_GPIO_D_6 , + +#ifdef ES_INIT_GPIO_D_6_MODE + ES_INIT_GPIO_D_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_6_LEVEL + ES_INIT_GPIO_D_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_6_IRQ_MODE + ES_INIT_GPIO_D_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_7 + + { + ES_PIN_GPIO_D_7 , + +#ifdef ES_INIT_GPIO_D_7_MODE + ES_INIT_GPIO_D_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_7_LEVEL + ES_INIT_GPIO_D_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_7_IRQ_MODE + ES_INIT_GPIO_D_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_8 + + { + ES_PIN_GPIO_D_8 , + +#ifdef ES_INIT_GPIO_D_8_MODE + ES_INIT_GPIO_D_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_8_LEVEL + ES_INIT_GPIO_D_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_8_IRQ_MODE + ES_INIT_GPIO_D_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_9 + + { + ES_PIN_GPIO_D_9 , + +#ifdef ES_INIT_GPIO_D_9_MODE + ES_INIT_GPIO_D_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_9_LEVEL + ES_INIT_GPIO_D_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_9_IRQ_MODE + ES_INIT_GPIO_D_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_10 + + { + ES_PIN_GPIO_D_10 , + +#ifdef ES_INIT_GPIO_D_10_MODE + ES_INIT_GPIO_D_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_10_LEVEL + ES_INIT_GPIO_D_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_10_IRQ_MODE + ES_INIT_GPIO_D_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_11 + + { + ES_PIN_GPIO_D_11 , + +#ifdef ES_INIT_GPIO_D_11_MODE + ES_INIT_GPIO_D_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_11_LEVEL + ES_INIT_GPIO_D_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_11_IRQ_MODE + ES_INIT_GPIO_D_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_12 + + { + ES_PIN_GPIO_D_12 , + +#ifdef ES_INIT_GPIO_D_12_MODE + ES_INIT_GPIO_D_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_12_LEVEL + ES_INIT_GPIO_D_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_12_IRQ_MODE + ES_INIT_GPIO_D_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_13 + + { + ES_PIN_GPIO_D_13 , + +#ifdef ES_INIT_GPIO_D_13_MODE + ES_INIT_GPIO_D_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_13_LEVEL + ES_INIT_GPIO_D_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_13_IRQ_MODE + ES_INIT_GPIO_D_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_14 + + { + ES_PIN_GPIO_D_14 , + +#ifdef ES_INIT_GPIO_D_14_MODE + ES_INIT_GPIO_D_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_14_LEVEL + ES_INIT_GPIO_D_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_14_IRQ_MODE + ES_INIT_GPIO_D_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_D_15 + + { + ES_PIN_GPIO_D_15 , + +#ifdef ES_INIT_GPIO_D_15_MODE + ES_INIT_GPIO_D_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_D_15_LEVEL + ES_INIT_GPIO_D_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_D_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_D_15_IRQ_MODE + ES_INIT_GPIO_D_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_D_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_0 + + { + ES_PIN_GPIO_E_0 , + +#ifdef ES_INIT_GPIO_E_0_MODE + ES_INIT_GPIO_E_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_0_LEVEL + ES_INIT_GPIO_E_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_0_IRQ_MODE + ES_INIT_GPIO_E_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_1 + + { + ES_PIN_GPIO_E_1 , + +#ifdef ES_INIT_GPIO_E_1_MODE + ES_INIT_GPIO_E_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_1_LEVEL + ES_INIT_GPIO_E_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_1_IRQ_MODE + ES_INIT_GPIO_E_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_2 + + { + ES_PIN_GPIO_E_2 , + +#ifdef ES_INIT_GPIO_E_2_MODE + ES_INIT_GPIO_E_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_2_LEVEL + ES_INIT_GPIO_E_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_2_IRQ_MODE + ES_INIT_GPIO_E_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_3 + + { + ES_PIN_GPIO_E_3 , + +#ifdef ES_INIT_GPIO_E_3_MODE + ES_INIT_GPIO_E_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_3_LEVEL + ES_INIT_GPIO_E_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_3_IRQ_MODE + ES_INIT_GPIO_E_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_4 + + { + ES_PIN_GPIO_E_4 , + +#ifdef ES_INIT_GPIO_E_4_MODE + ES_INIT_GPIO_E_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_4_LEVEL + ES_INIT_GPIO_E_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_4_IRQ_MODE + ES_INIT_GPIO_E_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_5 + + { + ES_PIN_GPIO_E_5 , + +#ifdef ES_INIT_GPIO_E_5_MODE + ES_INIT_GPIO_E_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_5_LEVEL + ES_INIT_GPIO_E_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_5_IRQ_MODE + ES_INIT_GPIO_E_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_6 + + { + ES_PIN_GPIO_E_6 , + +#ifdef ES_INIT_GPIO_E_6_MODE + ES_INIT_GPIO_E_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_6_LEVEL + ES_INIT_GPIO_E_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_6_IRQ_MODE + ES_INIT_GPIO_E_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_7 + + { + ES_PIN_GPIO_E_7 , + +#ifdef ES_INIT_GPIO_E_7_MODE + ES_INIT_GPIO_E_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_7_LEVEL + ES_INIT_GPIO_E_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_7_IRQ_MODE + ES_INIT_GPIO_E_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_8 + + { + ES_PIN_GPIO_E_8 , + +#ifdef ES_INIT_GPIO_E_8_MODE + ES_INIT_GPIO_E_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_8_LEVEL + ES_INIT_GPIO_E_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_8_IRQ_MODE + ES_INIT_GPIO_E_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_9 + + { + ES_PIN_GPIO_E_9 , + +#ifdef ES_INIT_GPIO_E_9_MODE + ES_INIT_GPIO_E_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_9_LEVEL + ES_INIT_GPIO_E_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_9_IRQ_MODE + ES_INIT_GPIO_E_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_10 + + { + ES_PIN_GPIO_E_10 , + +#ifdef ES_INIT_GPIO_E_10_MODE + ES_INIT_GPIO_E_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_10_LEVEL + ES_INIT_GPIO_E_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_10_IRQ_MODE + ES_INIT_GPIO_E_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_11 + + { + ES_PIN_GPIO_E_11 , + +#ifdef ES_INIT_GPIO_E_11_MODE + ES_INIT_GPIO_E_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_11_LEVEL + ES_INIT_GPIO_E_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_11_IRQ_MODE + ES_INIT_GPIO_E_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_12 + + { + ES_PIN_GPIO_E_12 , + +#ifdef ES_INIT_GPIO_E_12_MODE + ES_INIT_GPIO_E_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_12_LEVEL + ES_INIT_GPIO_E_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_12_IRQ_MODE + ES_INIT_GPIO_E_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_13 + + { + ES_PIN_GPIO_E_13 , + +#ifdef ES_INIT_GPIO_E_13_MODE + ES_INIT_GPIO_E_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_13_LEVEL + ES_INIT_GPIO_E_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_13_IRQ_MODE + ES_INIT_GPIO_E_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_14 + + { + ES_PIN_GPIO_E_14 , + +#ifdef ES_INIT_GPIO_E_14_MODE + ES_INIT_GPIO_E_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_14_LEVEL + ES_INIT_GPIO_E_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_14_IRQ_MODE + ES_INIT_GPIO_E_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_E_15 + + { + ES_PIN_GPIO_E_15 , + +#ifdef ES_INIT_GPIO_E_15_MODE + ES_INIT_GPIO_E_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_E_15_LEVEL + ES_INIT_GPIO_E_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_E_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_E_15_IRQ_MODE + ES_INIT_GPIO_E_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_E_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_0 + + { + ES_PIN_GPIO_F_0 , + +#ifdef ES_INIT_GPIO_F_0_MODE + ES_INIT_GPIO_F_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_0_LEVEL + ES_INIT_GPIO_F_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_0_IRQ_MODE + ES_INIT_GPIO_F_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_1 + + { + ES_PIN_GPIO_F_1 , + +#ifdef ES_INIT_GPIO_F_1_MODE + ES_INIT_GPIO_F_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_1_LEVEL + ES_INIT_GPIO_F_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_1_IRQ_MODE + ES_INIT_GPIO_F_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_2 + + { + ES_PIN_GPIO_F_2 , + +#ifdef ES_INIT_GPIO_F_2_MODE + ES_INIT_GPIO_F_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_2_LEVEL + ES_INIT_GPIO_F_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_2_IRQ_MODE + ES_INIT_GPIO_F_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_3 + + { + ES_PIN_GPIO_F_3 , + +#ifdef ES_INIT_GPIO_F_3_MODE + ES_INIT_GPIO_F_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_3_LEVEL + ES_INIT_GPIO_F_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_3_IRQ_MODE + ES_INIT_GPIO_F_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_4 + + { + ES_PIN_GPIO_F_4 , + +#ifdef ES_INIT_GPIO_F_4_MODE + ES_INIT_GPIO_F_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_4_LEVEL + ES_INIT_GPIO_F_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_4_IRQ_MODE + ES_INIT_GPIO_F_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_5 + + { + ES_PIN_GPIO_F_5 , + +#ifdef ES_INIT_GPIO_F_5_MODE + ES_INIT_GPIO_F_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_5_LEVEL + ES_INIT_GPIO_F_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_5_IRQ_MODE + ES_INIT_GPIO_F_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_6 + + { + ES_PIN_GPIO_F_6 , + +#ifdef ES_INIT_GPIO_F_6_MODE + ES_INIT_GPIO_F_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_6_LEVEL + ES_INIT_GPIO_F_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_6_IRQ_MODE + ES_INIT_GPIO_F_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_7 + + { + ES_PIN_GPIO_F_7 , + +#ifdef ES_INIT_GPIO_F_7_MODE + ES_INIT_GPIO_F_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_7_LEVEL + ES_INIT_GPIO_F_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_7_IRQ_MODE + ES_INIT_GPIO_F_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_8 + + { + ES_PIN_GPIO_F_8 , + +#ifdef ES_INIT_GPIO_F_8_MODE + ES_INIT_GPIO_F_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_8_LEVEL + ES_INIT_GPIO_F_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_8_IRQ_MODE + ES_INIT_GPIO_F_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_9 + + { + ES_PIN_GPIO_F_9 , + +#ifdef ES_INIT_GPIO_F_9_MODE + ES_INIT_GPIO_F_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_9_LEVEL + ES_INIT_GPIO_F_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_9_IRQ_MODE + ES_INIT_GPIO_F_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_10 + + { + ES_PIN_GPIO_F_10 , + +#ifdef ES_INIT_GPIO_F_10_MODE + ES_INIT_GPIO_F_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_10_LEVEL + ES_INIT_GPIO_F_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_10_IRQ_MODE + ES_INIT_GPIO_F_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_11 + + { + ES_PIN_GPIO_F_11 , + +#ifdef ES_INIT_GPIO_F_11_MODE + ES_INIT_GPIO_F_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_11_LEVEL + ES_INIT_GPIO_F_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_11_IRQ_MODE + ES_INIT_GPIO_F_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_12 + + { + ES_PIN_GPIO_F_12 , + +#ifdef ES_INIT_GPIO_F_12_MODE + ES_INIT_GPIO_F_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_12_LEVEL + ES_INIT_GPIO_F_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_12_IRQ_MODE + ES_INIT_GPIO_F_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_13 + + { + ES_PIN_GPIO_F_13 , + +#ifdef ES_INIT_GPIO_F_13_MODE + ES_INIT_GPIO_F_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_13_LEVEL + ES_INIT_GPIO_F_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_13_IRQ_MODE + ES_INIT_GPIO_F_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_14 + + { + ES_PIN_GPIO_F_14 , + +#ifdef ES_INIT_GPIO_F_14_MODE + ES_INIT_GPIO_F_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_14_LEVEL + ES_INIT_GPIO_F_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_14_IRQ_MODE + ES_INIT_GPIO_F_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_F_15 + + { + ES_PIN_GPIO_F_15 , + +#ifdef ES_INIT_GPIO_F_15_MODE + ES_INIT_GPIO_F_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_F_15_LEVEL + ES_INIT_GPIO_F_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_F_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_F_15_IRQ_MODE + ES_INIT_GPIO_F_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_F_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_0 + + { + ES_PIN_GPIO_G_0 , + +#ifdef ES_INIT_GPIO_G_0_MODE + ES_INIT_GPIO_G_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_0_LEVEL + ES_INIT_GPIO_G_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_0_IRQ_MODE + ES_INIT_GPIO_G_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_1 + + { + ES_PIN_GPIO_G_1 , + +#ifdef ES_INIT_GPIO_G_1_MODE + ES_INIT_GPIO_G_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_1_LEVEL + ES_INIT_GPIO_G_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_1_IRQ_MODE + ES_INIT_GPIO_G_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_2 + + { + ES_PIN_GPIO_G_2 , + +#ifdef ES_INIT_GPIO_G_2_MODE + ES_INIT_GPIO_G_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_2_LEVEL + ES_INIT_GPIO_G_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_2_IRQ_MODE + ES_INIT_GPIO_G_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_3 + + { + ES_PIN_GPIO_G_3 , + +#ifdef ES_INIT_GPIO_G_3_MODE + ES_INIT_GPIO_G_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_3_LEVEL + ES_INIT_GPIO_G_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_3_IRQ_MODE + ES_INIT_GPIO_G_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_4 + + { + ES_PIN_GPIO_G_4 , + +#ifdef ES_INIT_GPIO_G_4_MODE + ES_INIT_GPIO_G_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_4_LEVEL + ES_INIT_GPIO_G_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_4_IRQ_MODE + ES_INIT_GPIO_G_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_5 + + { + ES_PIN_GPIO_G_5 , + +#ifdef ES_INIT_GPIO_G_5_MODE + ES_INIT_GPIO_G_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_5_LEVEL + ES_INIT_GPIO_G_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_5_IRQ_MODE + ES_INIT_GPIO_G_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_6 + + { + ES_PIN_GPIO_G_6 , + +#ifdef ES_INIT_GPIO_G_6_MODE + ES_INIT_GPIO_G_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_6_LEVEL + ES_INIT_GPIO_G_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_6_IRQ_MODE + ES_INIT_GPIO_G_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_7 + + { + ES_PIN_GPIO_G_7 , + +#ifdef ES_INIT_GPIO_G_7_MODE + ES_INIT_GPIO_G_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_7_LEVEL + ES_INIT_GPIO_G_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_7_IRQ_MODE + ES_INIT_GPIO_G_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_8 + + { + ES_PIN_GPIO_G_8 , + +#ifdef ES_INIT_GPIO_G_8_MODE + ES_INIT_GPIO_G_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_8_LEVEL + ES_INIT_GPIO_G_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_8_IRQ_MODE + ES_INIT_GPIO_G_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_9 + + { + ES_PIN_GPIO_G_9 , + +#ifdef ES_INIT_GPIO_G_9_MODE + ES_INIT_GPIO_G_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_9_LEVEL + ES_INIT_GPIO_G_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_9_IRQ_MODE + ES_INIT_GPIO_G_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_10 + + { + ES_PIN_GPIO_G_10 , + +#ifdef ES_INIT_GPIO_G_10_MODE + ES_INIT_GPIO_G_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_10_LEVEL + ES_INIT_GPIO_G_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_10_IRQ_MODE + ES_INIT_GPIO_G_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_11 + + { + ES_PIN_GPIO_G_11 , + +#ifdef ES_INIT_GPIO_G_11_MODE + ES_INIT_GPIO_G_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_11_LEVEL + ES_INIT_GPIO_G_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_11_IRQ_MODE + ES_INIT_GPIO_G_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_12 + + { + ES_PIN_GPIO_G_12 , + +#ifdef ES_INIT_GPIO_G_12_MODE + ES_INIT_GPIO_G_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_12_LEVEL + ES_INIT_GPIO_G_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_12_IRQ_MODE + ES_INIT_GPIO_G_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_13 + + { + ES_PIN_GPIO_G_13 , + +#ifdef ES_INIT_GPIO_G_13_MODE + ES_INIT_GPIO_G_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_13_LEVEL + ES_INIT_GPIO_G_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_13_IRQ_MODE + ES_INIT_GPIO_G_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_14 + + { + ES_PIN_GPIO_G_14 , + +#ifdef ES_INIT_GPIO_G_14_MODE + ES_INIT_GPIO_G_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_14_LEVEL + ES_INIT_GPIO_G_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_14_IRQ_MODE + ES_INIT_GPIO_G_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_G_15 + + { + ES_PIN_GPIO_G_15 , + +#ifdef ES_INIT_GPIO_G_15_MODE + ES_INIT_GPIO_G_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_G_15_LEVEL + ES_INIT_GPIO_G_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_G_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_G_15_IRQ_MODE + ES_INIT_GPIO_G_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_G_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_0 + + { + ES_PIN_GPIO_H_0 , + +#ifdef ES_INIT_GPIO_H_0_MODE + ES_INIT_GPIO_H_0_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_0_LEVEL + ES_INIT_GPIO_H_0_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_0_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_0_IRQ_MODE + ES_INIT_GPIO_H_0_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_0_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin0_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_1 + + { + ES_PIN_GPIO_H_1 , + +#ifdef ES_INIT_GPIO_H_1_MODE + ES_INIT_GPIO_H_1_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_1_LEVEL + ES_INIT_GPIO_H_1_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_1_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_1_IRQ_MODE + ES_INIT_GPIO_H_1_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_1_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin1_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_2 + + { + ES_PIN_GPIO_H_2 , + +#ifdef ES_INIT_GPIO_H_2_MODE + ES_INIT_GPIO_H_2_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_2_LEVEL + ES_INIT_GPIO_H_2_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_2_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_2_IRQ_MODE + ES_INIT_GPIO_H_2_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_2_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin2_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_3 + + { + ES_PIN_GPIO_H_3 , + +#ifdef ES_INIT_GPIO_H_3_MODE + ES_INIT_GPIO_H_3_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_3_LEVEL + ES_INIT_GPIO_H_3_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_3_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_3_IRQ_MODE + ES_INIT_GPIO_H_3_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_3_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin3_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_4 + + { + ES_PIN_GPIO_H_4 , + +#ifdef ES_INIT_GPIO_H_4_MODE + ES_INIT_GPIO_H_4_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_4_LEVEL + ES_INIT_GPIO_H_4_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_4_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_4_IRQ_MODE + ES_INIT_GPIO_H_4_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_4_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin4_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_5 + + { + ES_PIN_GPIO_H_5 , + +#ifdef ES_INIT_GPIO_H_5_MODE + ES_INIT_GPIO_H_5_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_5_LEVEL + ES_INIT_GPIO_H_5_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_5_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_5_IRQ_MODE + ES_INIT_GPIO_H_5_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_5_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin5_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_6 + + { + ES_PIN_GPIO_H_6 , + +#ifdef ES_INIT_GPIO_H_6_MODE + ES_INIT_GPIO_H_6_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_6_LEVEL + ES_INIT_GPIO_H_6_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_6_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_6_IRQ_MODE + ES_INIT_GPIO_H_6_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_6_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin6_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_7 + + { + ES_PIN_GPIO_H_7 , + +#ifdef ES_INIT_GPIO_H_7_MODE + ES_INIT_GPIO_H_7_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_7_LEVEL + ES_INIT_GPIO_H_7_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_7_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_7_IRQ_MODE + ES_INIT_GPIO_H_7_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_7_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin7_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_8 + + { + ES_PIN_GPIO_H_8 , + +#ifdef ES_INIT_GPIO_H_8_MODE + ES_INIT_GPIO_H_8_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_8_LEVEL + ES_INIT_GPIO_H_8_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_8_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_8_IRQ_MODE + ES_INIT_GPIO_H_8_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_8_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin8_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_9 + + { + ES_PIN_GPIO_H_9 , + +#ifdef ES_INIT_GPIO_H_9_MODE + ES_INIT_GPIO_H_9_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_9_LEVEL + ES_INIT_GPIO_H_9_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_9_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_9_IRQ_MODE + ES_INIT_GPIO_H_9_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_9_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin9_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_10 + + { + ES_PIN_GPIO_H_10 , + +#ifdef ES_INIT_GPIO_H_10_MODE + ES_INIT_GPIO_H_10_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_10_LEVEL + ES_INIT_GPIO_H_10_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_10_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_10_IRQ_MODE + ES_INIT_GPIO_H_10_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_10_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin10_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_11 + + { + ES_PIN_GPIO_H_11 , + +#ifdef ES_INIT_GPIO_H_11_MODE + ES_INIT_GPIO_H_11_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_11_LEVEL + ES_INIT_GPIO_H_11_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_11_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_11_IRQ_MODE + ES_INIT_GPIO_H_11_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_11_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin11_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_12 + + { + ES_PIN_GPIO_H_12 , + +#ifdef ES_INIT_GPIO_H_12_MODE + ES_INIT_GPIO_H_12_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_12_LEVEL + ES_INIT_GPIO_H_12_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_12_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_12_IRQ_MODE + ES_INIT_GPIO_H_12_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_12_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin12_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_13 + + { + ES_PIN_GPIO_H_13 , + +#ifdef ES_INIT_GPIO_H_13_MODE + ES_INIT_GPIO_H_13_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_13_LEVEL + ES_INIT_GPIO_H_13_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_13_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_13_IRQ_MODE + ES_INIT_GPIO_H_13_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_13_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin13_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_14 + + { + ES_PIN_GPIO_H_14 , + +#ifdef ES_INIT_GPIO_H_14_MODE + ES_INIT_GPIO_H_14_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_14_LEVEL + ES_INIT_GPIO_H_14_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_14_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_14_IRQ_MODE + ES_INIT_GPIO_H_14_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_14_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin14_callback , +#else + RT_NULL , +#endif + }, + +#endif + +#ifdef ES_INIT_PIN_GPIO_H_15 + + { + ES_PIN_GPIO_H_15 , + +#ifdef ES_INIT_GPIO_H_15_MODE + ES_INIT_GPIO_H_15_MODE , +#else + ES_C_GPIO_MODE_OUTPUT , +#endif + +#ifdef ES_INIT_GPIO_H_15_LEVEL + ES_INIT_GPIO_H_15_LEVEL , +#else + ES_C_GPIO_LEVEL_HIGH , +#endif + + ES_INIT_GPIO_H_15_IRQ_EN , + +#ifdef ES_INIT_GPIO_H_15_IRQ_MODE + ES_INIT_GPIO_H_15_IRQ_MODE , +#else + ES_C_GPIO_IRQ_MODE_RISE , +#endif + +#if (ES_INIT_GPIO_H_15_IRQ_EN == ES_C_GPIO_IRQ_ENABLE) + irq_pin15_callback , +#else + RT_NULL , +#endif + }, + +#endif + + + +}; + +#endif + + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h new file mode 100644 index 0000000000..f71afb3b95 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h @@ -0,0 +1,102 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_HWTIMER_H__ +#define __ES_CONF_INFO_HWTIMER_H__ + +#include +#include + +#define ES_C_HWTIMER_MODE_UP HWTIMER_CNTMODE_UP +#define ES_C_HWTIMER_MODE_DOWN HWTIMER_CNTMODE_DW + +/* HWTIMER 配置 */ + +/* codes_main */ + + + +#ifndef ES_AD16C4T0_HWTIMER_MODE +#define ES_AD16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_AD16C4T1_HWTIMER_MODE +#define ES_AD16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_GP32C4T0_HWTIMER_MODE +#define ES_GP32C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_GP32C4T1_HWTIMER_MODE +#define ES_GP32C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_GP16C4T0_HWTIMER_MODE +#define ES_GP16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_GP16C4T1_HWTIMER_MODE +#define ES_GP16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_BS16T0_HWTIMER_MODE +#define ES_BS16T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif +#ifndef ES_BS16T1_HWTIMER_MODE +#define ES_BS16T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#endif + + + + +#define ES_AD16C4T0_HWTIMER_PRES 1 +#define ES_AD16C4T1_HWTIMER_PRES 1 +#define ES_GP16C4T0_HWTIMER_PRES 1 +#define ES_GP16C4T1_HWTIMER_PRES 1 +#define ES_GP32C4T0_HWTIMER_PRES 1 +#define ES_GP32C4T1_HWTIMER_PRES 1 +#define ES_BS16T0_HWTIMER_PRES 1 +#define ES_BS16T1_HWTIMER_PRES 1 + +#ifndef ES_DEVICE_NAME_AD16C4T0_HWTIMER +#define ES_DEVICE_NAME_AD16C4T0_HWTIMER "timer0" +#endif +#ifndef ES_DEVICE_NAME_AD16C4T1_HWTIMER +#define ES_DEVICE_NAME_AD16C4T1_HWTIMER "timer1" +#endif +#ifndef ES_DEVICE_NAME_GP32C4T0_HWTIMER +#define ES_DEVICE_NAME_GP32C4T0_HWTIMER "timer2" +#endif +#ifndef ES_DEVICE_NAME_GP32C4T1_HWTIMER +#define ES_DEVICE_NAME_GP32C4T1_HWTIMER "timer3" +#endif +#ifndef ES_DEVICE_NAME_GP16C4T0_HWTIMER +#define ES_DEVICE_NAME_GP16C4T0_HWTIMER "timer4" +#endif +#ifndef ES_DEVICE_NAME_GP16C4T1_HWTIMER +#define ES_DEVICE_NAME_GP16C4T1_HWTIMER "timer5" +#endif +#ifndef ES_DEVICE_NAME_BS16T0_HWTIMER +#define ES_DEVICE_NAME_BS16T0_HWTIMER "timer6" +#endif +#ifndef ES_DEVICE_NAME_BS16T1_HWTIMER +#define ES_DEVICE_NAME_BS16T1_HWTIMER "timer7" +#endif + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_i2c.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_i2c.h new file mode 100644 index 0000000000..65310fce01 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_i2c.h @@ -0,0 +1,95 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_I2C_H__ +#define __ES_CONF_INFO_I2C_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + +#define ES_C_I2C_STRETCH I2C_NOSTRETCH_DISABLE +#define ES_C_I2C_NO_STRETCH I2C_NOSTRETCH_ENABLE + +#define ES_C_I2C_GENERALCALL I2C_GENERALCALL_ENABLE +#define ES_C_I2C_NO_GENERALCALL I2C_GENERALCALL_DISABLE + + +#define ES_C_I2C_ADDR_7_MODE I2C_ADDR_7BIT +#define ES_C_I2C_ADDR_10_MODE I2C_ADDR_10BIT + + +/* I2C 配置 */ + + + +/* codes_main */ + + + + + +#ifndef ES_DEVICE_NAME_I2C0 +#define ES_DEVICE_NAME_I2C0 "i2c0" +#endif + +#ifndef ES_DEVICE_NAME_I2C1 +#define ES_DEVICE_NAME_I2C1 "i2c1" +#endif + +#ifndef ES_I2C0_CLK_SPEED +#define ES_I2C0_CLK_SPEED 100000 +#endif +#ifndef ES_I2C0_OWN_ADDR1 +#define ES_I2C0_OWN_ADDR1 0x20 +#endif +#ifndef ES_I2C0_GENERAL_CALL +#define ES_I2C0_GENERAL_CALL ES_C_I2C_NO_GENERALCALL +#endif +#ifndef ES_I2C0_STRETCH +#define ES_I2C0_STRETCH ES_C_I2C_STRETCH +#endif +#ifndef ES_I2C0_ADDR_MODE +#define ES_I2C0_ADDR_MODE ES_C_I2C_ADDR_7_MODE +#endif + +#ifndef ES_I2C1_CLK_SPEED +#define ES_I2C1_CLK_SPEED 100000 +#endif +#ifndef ES_I2C1_OWN_ADDR1 +#define ES_I2C1_OWN_ADDR1 0x20 +#endif +#ifndef ES_I2C1_GENERAL_CALL +#define ES_I2C1_GENERAL_CALL ES_C_I2C_NO_GENERALCALL +#endif +#ifndef ES_I2C1_STRETCH +#define ES_I2C1_STRETCH ES_C_I2C_STRETCH +#endif +#ifndef ES_I2C1_ADDR_MODE +#define ES_I2C1_ADDR_MODE ES_C_I2C_ADDR_7_MODE +#endif + + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_map.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_map.h new file mode 100644 index 0000000000..f25123227b --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_map.h @@ -0,0 +1,2876 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __es_conf_info_map_H__ +#define __es_conf_info_map_H__ + +#include + + + +#define __ES_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_PIN_##gpio_index} +#define __ES_PIN_DEFAULT {-1, 0, 0} + +struct pin_index +{ + int index; + GPIO_TypeDef *gpio; + uint32_t pin; +}; + + +#define ES_GPIO_ADC_CH0_GPIO GPIOC +#define ES_GPIO_ADC_CH1_GPIO GPIOC +#define ES_GPIO_ADC_CH2_GPIO GPIOC +#define ES_GPIO_ADC_CH3_GPIO GPIOC +#define ES_GPIO_ADC_CH4_GPIO GPIOA +#define ES_GPIO_ADC_CH5_GPIO GPIOA +#define ES_GPIO_ADC_CH6_GPIO GPIOA +#define ES_GPIO_ADC_CH7_GPIO GPIOA +#define ES_GPIO_ADC_CH8_GPIO GPIOA +#define ES_GPIO_ADC_CH9_GPIO GPIOA +#define ES_GPIO_ADC_CH10_GPIO GPIOA +#define ES_GPIO_ADC_CH11_GPIO GPIOA +#define ES_GPIO_ADC_CH12_GPIO GPIOC +#define ES_GPIO_ADC_CH13_GPIO GPIOC +#define ES_GPIO_ADC_CH14_GPIO GPIOB +#define ES_GPIO_ADC_CH15_GPIO GPIOB + +#define ES_GPIO_ADC_CH0_PIN GPIO_PIN_0 +#define ES_GPIO_ADC_CH1_PIN GPIO_PIN_1 +#define ES_GPIO_ADC_CH2_PIN GPIO_PIN_2 +#define ES_GPIO_ADC_CH3_PIN GPIO_PIN_3 +#define ES_GPIO_ADC_CH4_PIN GPIO_PIN_0 +#define ES_GPIO_ADC_CH5_PIN GPIO_PIN_1 +#define ES_GPIO_ADC_CH6_PIN GPIO_PIN_2 +#define ES_GPIO_ADC_CH7_PIN GPIO_PIN_3 +#define ES_GPIO_ADC_CH8_PIN GPIO_PIN_4 +#define ES_GPIO_ADC_CH9_PIN GPIO_PIN_5 +#define ES_GPIO_ADC_CH10_PIN GPIO_PIN_6 +#define ES_GPIO_ADC_CH11_PIN GPIO_PIN_7 +#define ES_GPIO_ADC_CH12_PIN GPIO_PIN_4 +#define ES_GPIO_ADC_CH13_PIN GPIO_PIN_5 +#define ES_GPIO_ADC_CH14_PIN GPIO_PIN_0 +#define ES_GPIO_ADC_CH15_PIN GPIO_PIN_1 + + + +static const struct pin_index pins[] = +{ + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(2, C, 13), + __ES_PIN(3, C, 14), + __ES_PIN(4, C, 15), + __ES_PIN(5, H, 0), + __ES_PIN(6, H, 1), + __ES_PIN_DEFAULT, + __ES_PIN(8, C, 0), + __ES_PIN(9, C, 1), + __ES_PIN(10, C, 2), + __ES_PIN(11, C, 3), + __ES_PIN(12, H, 3), + __ES_PIN(13, H, 4), + __ES_PIN(14, A, 0), + __ES_PIN(15, A, 1), + __ES_PIN(16, A, 2), + __ES_PIN(17, A, 3), + __ES_PIN(18, F, 0), + __ES_PIN(19, F, 1), + __ES_PIN(20, A, 4), + __ES_PIN(21, A, 5), + __ES_PIN(22, A, 6), + __ES_PIN(23, A, 7), + __ES_PIN(24, C, 4), + __ES_PIN(25, C, 5), + __ES_PIN(26, B, 0), + __ES_PIN(27, B, 1), + __ES_PIN(28, B, 2), + __ES_PIN(29, B, 10), + __ES_PIN(30, B, 11), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(33, B, 12), + __ES_PIN(34, B, 13), + __ES_PIN(35, B, 14), + __ES_PIN(36, B, 15), + __ES_PIN(37, C, 6), + __ES_PIN(38, C, 7), + __ES_PIN(39, C, 8), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(46, A, 13), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, + __ES_PIN(49, A, 14), + __ES_PIN(50, A, 15), + __ES_PIN(51, C, 10), + __ES_PIN(52, C, 11), + __ES_PIN(53, C, 12), + __ES_PIN(54, D, 2), + __ES_PIN(55, B, 3), + __ES_PIN(56, B, 4), + __ES_PIN(57, B, 5), + __ES_PIN(58, B, 6), + __ES_PIN(59, B, 7), + __ES_PIN(60, H, 2), + __ES_PIN(61, B, 8), + __ES_PIN(62, B, 9), + __ES_PIN_DEFAULT, + __ES_PIN_DEFAULT, +}; + +#define ES_PIN_GPIO_C_13 2 +#define ES_PIN_GPIO_C_14 3 +#define ES_PIN_GPIO_C_15 4 +#define ES_PIN_GPIO_H_0 5 +#define ES_PIN_GPIO_H_1 6 +#define ES_PIN_GPIO_C_0 8 +#define ES_PIN_GPIO_C_1 9 +#define ES_PIN_GPIO_C_2 10 +#define ES_PIN_GPIO_C_3 11 +#define ES_PIN_GPIO_H_3 12 +#define ES_PIN_GPIO_H_4 13 +#define ES_PIN_GPIO_A_0 14 +#define ES_PIN_GPIO_A_1 15 +#define ES_PIN_GPIO_A_2 16 +#define ES_PIN_GPIO_A_3 17 +#define ES_PIN_GPIO_F_0 18 +#define ES_PIN_GPIO_F_1 19 +#define ES_PIN_GPIO_A_4 20 +#define ES_PIN_GPIO_A_5 21 +#define ES_PIN_GPIO_A_6 22 +#define ES_PIN_GPIO_A_7 23 +#define ES_PIN_GPIO_C_4 24 +#define ES_PIN_GPIO_C_5 25 +#define ES_PIN_GPIO_B_0 26 +#define ES_PIN_GPIO_B_1 27 +#define ES_PIN_GPIO_B_2 28 +#define ES_PIN_GPIO_B_10 29 +#define ES_PIN_GPIO_B_11 30 +#define ES_PIN_GPIO_B_12 33 +#define ES_PIN_GPIO_B_13 34 +#define ES_PIN_GPIO_B_14 35 +#define ES_PIN_GPIO_B_15 36 +#define ES_PIN_GPIO_C_6 37 +#define ES_PIN_GPIO_C_7 38 +#define ES_PIN_GPIO_C_8 39 +#define ES_PIN_GPIO_A_13 46 +#define ES_PIN_GPIO_A_14 49 +#define ES_PIN_GPIO_A_15 50 +#define ES_PIN_GPIO_C_10 51 +#define ES_PIN_GPIO_C_11 52 +#define ES_PIN_GPIO_C_12 53 +#define ES_PIN_GPIO_D_2 54 +#define ES_PIN_GPIO_B_3 55 +#define ES_PIN_GPIO_B_4 56 +#define ES_PIN_GPIO_B_5 57 +#define ES_PIN_GPIO_B_6 58 +#define ES_PIN_GPIO_B_7 59 +#define ES_PIN_GPIO_H_2 60 +#define ES_PIN_GPIO_B_8 61 +#define ES_PIN_GPIO_B_9 62 + + + +/* UART_TX */ + + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_B_10 +#define ES_UART0_TX_PIN ES_PIN_GPIO_B_10 +#endif +#endif + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOH +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_H_0 +#define ES_UART0_TX_PIN ES_PIN_GPIO_H_0 +#endif +#endif + +#ifndef ES_UART0_TX_GPIO_FUNC +#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_TX_GPIO_PORT +#define ES_UART0_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_TX_GPIO_PIN +#define ES_UART0_TX_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_UART0_TX_PIN +#ifdef ES_PIN_GPIO_D_8 +#define ES_UART0_TX_PIN ES_PIN_GPIO_D_8 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_C_0 +#define ES_UART1_TX_PIN ES_PIN_GPIO_C_0 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_A_13 +#define ES_UART1_TX_PIN ES_PIN_GPIO_A_13 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_C_10 +#define ES_UART1_TX_PIN ES_PIN_GPIO_C_10 +#endif +#endif + +#ifndef ES_UART1_TX_GPIO_FUNC +#define ES_UART1_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_TX_GPIO_PORT +#define ES_UART1_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART1_TX_GPIO_PIN +#define ES_UART1_TX_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART1_TX_PIN +#ifdef ES_PIN_GPIO_D_5 +#define ES_UART1_TX_PIN ES_PIN_GPIO_D_5 +#endif +#endif + +#ifndef ES_UART2_TX_GPIO_FUNC +#define ES_UART2_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_TX_GPIO_PORT +#define ES_UART2_TX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_TX_GPIO_PIN +#define ES_UART2_TX_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART2_TX_PIN +#ifdef ES_PIN_GPIO_E_2 +#define ES_UART2_TX_PIN ES_PIN_GPIO_E_2 +#endif +#endif + +#ifndef ES_UART2_TX_GPIO_FUNC +#define ES_UART2_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_TX_GPIO_PORT +#define ES_UART2_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART2_TX_GPIO_PIN +#define ES_UART2_TX_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART2_TX_PIN +#ifdef ES_PIN_GPIO_C_12 +#define ES_UART2_TX_PIN ES_PIN_GPIO_C_12 +#endif +#endif + +#ifndef ES_UART2_TX_GPIO_FUNC +#define ES_UART2_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_TX_GPIO_PORT +#define ES_UART2_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART2_TX_GPIO_PIN +#define ES_UART2_TX_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART2_TX_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_UART2_TX_PIN ES_PIN_GPIO_B_3 +#endif +#endif + +#ifndef ES_UART3_TX_GPIO_FUNC +#define ES_UART3_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_TX_GPIO_PORT +#define ES_UART3_TX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART3_TX_GPIO_PIN +#define ES_UART3_TX_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART3_TX_PIN +#ifdef ES_PIN_GPIO_C_4 +#define ES_UART3_TX_PIN ES_PIN_GPIO_C_4 +#endif +#endif + +#ifndef ES_UART3_TX_GPIO_FUNC +#define ES_UART3_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_TX_GPIO_PORT +#define ES_UART3_TX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_TX_GPIO_PIN +#define ES_UART3_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART3_TX_PIN +#ifdef ES_PIN_GPIO_E_10 +#define ES_UART3_TX_PIN ES_PIN_GPIO_E_10 +#endif +#endif + +#ifndef ES_UART3_TX_GPIO_FUNC +#define ES_UART3_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_TX_GPIO_PORT +#define ES_UART3_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART3_TX_GPIO_PIN +#define ES_UART3_TX_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_UART3_TX_PIN +#ifdef ES_PIN_GPIO_D_14 +#define ES_UART3_TX_PIN ES_PIN_GPIO_D_14 +#endif +#endif + +#ifndef ES_UART4_TX_GPIO_FUNC +#define ES_UART4_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART4_TX_GPIO_PORT +#define ES_UART4_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART4_TX_GPIO_PIN +#define ES_UART4_TX_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_UART4_TX_PIN +#ifdef ES_PIN_GPIO_B_6 +#define ES_UART4_TX_PIN ES_PIN_GPIO_B_6 +#endif +#endif + +#ifndef ES_UART4_TX_GPIO_FUNC +#define ES_UART4_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART4_TX_GPIO_PORT +#define ES_UART4_TX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_TX_GPIO_PIN +#define ES_UART4_TX_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART4_TX_PIN +#ifdef ES_PIN_GPIO_E_10 +#define ES_UART4_TX_PIN ES_PIN_GPIO_E_10 +#endif +#endif + +#ifndef ES_UART5_TX_GPIO_FUNC +#define ES_UART5_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART5_TX_GPIO_PORT +#define ES_UART5_TX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART5_TX_GPIO_PIN +#define ES_UART5_TX_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART5_TX_PIN +#ifdef ES_PIN_GPIO_A_2 +#define ES_UART5_TX_PIN ES_PIN_GPIO_A_2 +#endif +#endif + +#ifndef ES_UART5_TX_GPIO_FUNC +#define ES_UART5_TX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART5_TX_GPIO_PORT +#define ES_UART5_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART5_TX_GPIO_PIN +#define ES_UART5_TX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_UART5_TX_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_UART5_TX_PIN ES_PIN_GPIO_B_9 +#endif +#endif + +#ifndef ES_UART5_TX_GPIO_FUNC +#define ES_UART5_TX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART5_TX_GPIO_PORT +#define ES_UART5_TX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART5_TX_GPIO_PIN +#define ES_UART5_TX_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART5_TX_PIN +#ifdef ES_PIN_GPIO_D_5 +#define ES_UART5_TX_PIN ES_PIN_GPIO_D_5 +#endif +#endif + + +/* UART_RX */ + + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_B_11 +#define ES_UART0_RX_PIN ES_PIN_GPIO_B_11 +#endif +#endif + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOH +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_H_1 +#define ES_UART0_RX_PIN ES_PIN_GPIO_H_1 +#endif +#endif + +#ifndef ES_UART0_RX_GPIO_FUNC +#define ES_UART0_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_RX_GPIO_PORT +#define ES_UART0_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_RX_GPIO_PIN +#define ES_UART0_RX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_UART0_RX_PIN +#ifdef ES_PIN_GPIO_D_9 +#define ES_UART0_RX_PIN ES_PIN_GPIO_D_9 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_C_1 +#define ES_UART1_RX_PIN ES_PIN_GPIO_C_1 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_A_14 +#define ES_UART1_RX_PIN ES_PIN_GPIO_A_14 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_C_11 +#define ES_UART1_RX_PIN ES_PIN_GPIO_C_11 +#endif +#endif + +#ifndef ES_UART1_RX_GPIO_FUNC +#define ES_UART1_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RX_GPIO_PORT +#define ES_UART1_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART1_RX_GPIO_PIN +#define ES_UART1_RX_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_UART1_RX_PIN +#ifdef ES_PIN_GPIO_D_6 +#define ES_UART1_RX_PIN ES_PIN_GPIO_D_6 +#endif +#endif + +#ifndef ES_UART2_RX_GPIO_FUNC +#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_RX_GPIO_PORT +#define ES_UART2_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART2_RX_GPIO_PIN +#define ES_UART2_RX_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART2_RX_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_UART2_RX_PIN ES_PIN_GPIO_B_4 +#endif +#endif + +#ifndef ES_UART2_RX_GPIO_FUNC +#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_RX_GPIO_PORT +#define ES_UART2_RX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_RX_GPIO_PIN +#define ES_UART2_RX_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART2_RX_PIN +#ifdef ES_PIN_GPIO_E_3 +#define ES_UART2_RX_PIN ES_PIN_GPIO_E_3 +#endif +#endif + +#ifndef ES_UART2_RX_GPIO_FUNC +#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_RX_GPIO_PORT +#define ES_UART2_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART2_RX_GPIO_PIN +#define ES_UART2_RX_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART2_RX_PIN +#ifdef ES_PIN_GPIO_D_2 +#define ES_UART2_RX_PIN ES_PIN_GPIO_D_2 +#endif +#endif + +#ifndef ES_UART3_RX_GPIO_FUNC +#define ES_UART3_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_RX_GPIO_PORT +#define ES_UART3_RX_GPIO_PORT GPIOC +#endif +#ifndef ES_UART3_RX_GPIO_PIN +#define ES_UART3_RX_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART3_RX_PIN +#ifdef ES_PIN_GPIO_C_5 +#define ES_UART3_RX_PIN ES_PIN_GPIO_C_5 +#endif +#endif + +#ifndef ES_UART3_RX_GPIO_FUNC +#define ES_UART3_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_RX_GPIO_PORT +#define ES_UART3_RX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_RX_GPIO_PIN +#define ES_UART3_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART3_RX_PIN +#ifdef ES_PIN_GPIO_E_11 +#define ES_UART3_RX_PIN ES_PIN_GPIO_E_11 +#endif +#endif + +#ifndef ES_UART3_RX_GPIO_FUNC +#define ES_UART3_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_RX_GPIO_PORT +#define ES_UART3_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART3_RX_GPIO_PIN +#define ES_UART3_RX_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART3_RX_PIN +#ifdef ES_PIN_GPIO_D_13 +#define ES_UART3_RX_PIN ES_PIN_GPIO_D_13 +#endif +#endif + +#ifndef ES_UART4_RX_GPIO_FUNC +#define ES_UART4_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART4_RX_GPIO_PORT +#define ES_UART4_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART4_RX_GPIO_PIN +#define ES_UART4_RX_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_UART4_RX_PIN +#ifdef ES_PIN_GPIO_B_7 +#define ES_UART4_RX_PIN ES_PIN_GPIO_B_7 +#endif +#endif + +#ifndef ES_UART4_RX_GPIO_FUNC +#define ES_UART4_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART4_RX_GPIO_PORT +#define ES_UART4_RX_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_RX_GPIO_PIN +#define ES_UART4_RX_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART4_RX_PIN +#ifdef ES_PIN_GPIO_E_11 +#define ES_UART4_RX_PIN ES_PIN_GPIO_E_11 +#endif +#endif + +#ifndef ES_UART5_RX_GPIO_FUNC +#define ES_UART5_RX_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART5_RX_GPIO_PORT +#define ES_UART5_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_UART5_RX_GPIO_PIN +#define ES_UART5_RX_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_UART5_RX_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_UART5_RX_PIN ES_PIN_GPIO_B_8 +#endif +#endif + +#ifndef ES_UART5_RX_GPIO_FUNC +#define ES_UART5_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART5_RX_GPIO_PORT +#define ES_UART5_RX_GPIO_PORT GPIOA +#endif +#ifndef ES_UART5_RX_GPIO_PIN +#define ES_UART5_RX_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART5_RX_PIN +#ifdef ES_PIN_GPIO_A_3 +#define ES_UART5_RX_PIN ES_PIN_GPIO_A_3 +#endif +#endif + +#ifndef ES_UART5_RX_GPIO_FUNC +#define ES_UART5_RX_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART5_RX_GPIO_PORT +#define ES_UART5_RX_GPIO_PORT GPIOD +#endif +#ifndef ES_UART5_RX_GPIO_PIN +#define ES_UART5_RX_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_UART5_RX_PIN +#ifdef ES_PIN_GPIO_D_6 +#define ES_UART5_RX_PIN ES_PIN_GPIO_D_6 +#endif +#endif + + +/* UART_RTS */ + + +#ifndef ES_UART0_RTS_GPIO_FUNC +#define ES_UART0_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_RTS_GPIO_PORT +#define ES_UART0_RTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_RTS_GPIO_PIN +#define ES_UART0_RTS_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_UART0_RTS_PIN +#ifdef ES_PIN_GPIO_B_14 +#define ES_UART0_RTS_PIN ES_PIN_GPIO_B_14 +#endif +#endif + +#ifndef ES_UART0_RTS_GPIO_FUNC +#define ES_UART0_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_RTS_GPIO_PORT +#define ES_UART0_RTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_RTS_GPIO_PIN +#define ES_UART0_RTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART0_RTS_PIN +#ifdef ES_PIN_GPIO_D_12 +#define ES_UART0_RTS_PIN ES_PIN_GPIO_D_12 +#endif +#endif + +#ifndef ES_UART1_RTS_GPIO_FUNC +#define ES_UART1_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RTS_GPIO_PORT +#define ES_UART1_RTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RTS_GPIO_PIN +#define ES_UART1_RTS_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART1_RTS_PIN +#ifdef ES_PIN_GPIO_C_3 +#define ES_UART1_RTS_PIN ES_PIN_GPIO_C_3 +#endif +#endif + +#ifndef ES_UART1_RTS_GPIO_FUNC +#define ES_UART1_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_RTS_GPIO_PORT +#define ES_UART1_RTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_RTS_GPIO_PIN +#define ES_UART1_RTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART1_RTS_PIN +#ifdef ES_PIN_GPIO_C_12 +#define ES_UART1_RTS_PIN ES_PIN_GPIO_C_12 +#endif +#endif + +#ifndef ES_UART2_RTS_GPIO_FUNC +#define ES_UART2_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_RTS_GPIO_PORT +#define ES_UART2_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_RTS_GPIO_PIN +#define ES_UART2_RTS_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_UART2_RTS_PIN +#ifdef ES_PIN_GPIO_E_5 +#define ES_UART2_RTS_PIN ES_PIN_GPIO_E_5 +#endif +#endif + +#ifndef ES_UART2_RTS_GPIO_FUNC +#define ES_UART2_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_RTS_GPIO_PORT +#define ES_UART2_RTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART2_RTS_GPIO_PIN +#define ES_UART2_RTS_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_UART2_RTS_PIN +#ifdef ES_PIN_GPIO_C_10 +#define ES_UART2_RTS_PIN ES_PIN_GPIO_C_10 +#endif +#endif + +#ifndef ES_UART3_RTS_GPIO_FUNC +#define ES_UART3_RTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_RTS_GPIO_PORT +#define ES_UART3_RTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART3_RTS_GPIO_PIN +#define ES_UART3_RTS_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART3_RTS_PIN +#ifdef ES_PIN_GPIO_B_1 +#define ES_UART3_RTS_PIN ES_PIN_GPIO_B_1 +#endif +#endif + +#ifndef ES_UART3_RTS_GPIO_FUNC +#define ES_UART3_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_RTS_GPIO_PORT +#define ES_UART3_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_RTS_GPIO_PIN +#define ES_UART3_RTS_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART3_RTS_PIN +#ifdef ES_PIN_GPIO_E_13 +#define ES_UART3_RTS_PIN ES_PIN_GPIO_E_13 +#endif +#endif + +#ifndef ES_UART4_RTS_GPIO_FUNC +#define ES_UART4_RTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART4_RTS_GPIO_PORT +#define ES_UART4_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_RTS_GPIO_PIN +#define ES_UART4_RTS_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART4_RTS_PIN +#ifdef ES_PIN_GPIO_E_13 +#define ES_UART4_RTS_PIN ES_PIN_GPIO_E_13 +#endif +#endif + +#ifndef ES_UART4_RTS_GPIO_FUNC +#define ES_UART4_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART4_RTS_GPIO_PORT +#define ES_UART4_RTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_RTS_GPIO_PIN +#define ES_UART4_RTS_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART4_RTS_PIN +#ifdef ES_PIN_GPIO_E_1 +#define ES_UART4_RTS_PIN ES_PIN_GPIO_E_1 +#endif +#endif + +#ifndef ES_UART5_RTS_GPIO_FUNC +#define ES_UART5_RTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART5_RTS_GPIO_PORT +#define ES_UART5_RTS_GPIO_PORT GPIOA +#endif +#ifndef ES_UART5_RTS_GPIO_PIN +#define ES_UART5_RTS_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_UART5_RTS_PIN +#ifdef ES_PIN_GPIO_A_1 +#define ES_UART5_RTS_PIN ES_PIN_GPIO_A_1 +#endif +#endif + +#ifndef ES_UART5_RTS_GPIO_FUNC +#define ES_UART5_RTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART5_RTS_GPIO_PORT +#define ES_UART5_RTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART5_RTS_GPIO_PIN +#define ES_UART5_RTS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART5_RTS_PIN +#ifdef ES_PIN_GPIO_D_4 +#define ES_UART5_RTS_PIN ES_PIN_GPIO_D_4 +#endif +#endif + + +/* UART_CTS */ + + +#ifndef ES_UART0_CTS_GPIO_FUNC +#define ES_UART0_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART0_CTS_GPIO_PORT +#define ES_UART0_CTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART0_CTS_GPIO_PIN +#define ES_UART0_CTS_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_UART0_CTS_PIN +#ifdef ES_PIN_GPIO_B_13 +#define ES_UART0_CTS_PIN ES_PIN_GPIO_B_13 +#endif +#endif + +#ifndef ES_UART0_CTS_GPIO_FUNC +#define ES_UART0_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART0_CTS_GPIO_PORT +#define ES_UART0_CTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART0_CTS_GPIO_PIN +#define ES_UART0_CTS_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART0_CTS_PIN +#ifdef ES_PIN_GPIO_D_11 +#define ES_UART0_CTS_PIN ES_PIN_GPIO_D_11 +#endif +#endif + +#ifndef ES_UART1_CTS_GPIO_FUNC +#define ES_UART1_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_CTS_GPIO_PORT +#define ES_UART1_CTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART1_CTS_GPIO_PIN +#define ES_UART1_CTS_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART1_CTS_PIN +#ifdef ES_PIN_GPIO_C_2 +#define ES_UART1_CTS_PIN ES_PIN_GPIO_C_2 +#endif +#endif + +#ifndef ES_UART1_CTS_GPIO_FUNC +#define ES_UART1_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART1_CTS_GPIO_PORT +#define ES_UART1_CTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART1_CTS_GPIO_PIN +#define ES_UART1_CTS_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_UART1_CTS_PIN +#ifdef ES_PIN_GPIO_D_2 +#define ES_UART1_CTS_PIN ES_PIN_GPIO_D_2 +#endif +#endif + +#ifndef ES_UART2_CTS_GPIO_FUNC +#define ES_UART2_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART2_CTS_GPIO_PORT +#define ES_UART2_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART2_CTS_GPIO_PIN +#define ES_UART2_CTS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART2_CTS_PIN +#ifdef ES_PIN_GPIO_E_4 +#define ES_UART2_CTS_PIN ES_PIN_GPIO_E_4 +#endif +#endif + +#ifndef ES_UART2_CTS_GPIO_FUNC +#define ES_UART2_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART2_CTS_GPIO_PORT +#define ES_UART2_CTS_GPIO_PORT GPIOC +#endif +#ifndef ES_UART2_CTS_GPIO_PIN +#define ES_UART2_CTS_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_UART2_CTS_PIN +#ifdef ES_PIN_GPIO_C_11 +#define ES_UART2_CTS_PIN ES_PIN_GPIO_C_11 +#endif +#endif + +#ifndef ES_UART3_CTS_GPIO_FUNC +#define ES_UART3_CTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART3_CTS_GPIO_PORT +#define ES_UART3_CTS_GPIO_PORT GPIOB +#endif +#ifndef ES_UART3_CTS_GPIO_PIN +#define ES_UART3_CTS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART3_CTS_PIN +#ifdef ES_PIN_GPIO_B_0 +#define ES_UART3_CTS_PIN ES_PIN_GPIO_B_0 +#endif +#endif + +#ifndef ES_UART3_CTS_GPIO_FUNC +#define ES_UART3_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART3_CTS_GPIO_PORT +#define ES_UART3_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART3_CTS_GPIO_PIN +#define ES_UART3_CTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART3_CTS_PIN +#ifdef ES_PIN_GPIO_E_12 +#define ES_UART3_CTS_PIN ES_PIN_GPIO_E_12 +#endif +#endif + +#ifndef ES_UART4_CTS_GPIO_FUNC +#define ES_UART4_CTS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART4_CTS_GPIO_PORT +#define ES_UART4_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_CTS_GPIO_PIN +#define ES_UART4_CTS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_UART4_CTS_PIN +#ifdef ES_PIN_GPIO_E_12 +#define ES_UART4_CTS_PIN ES_PIN_GPIO_E_12 +#endif +#endif + +#ifndef ES_UART4_CTS_GPIO_FUNC +#define ES_UART4_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART4_CTS_GPIO_PORT +#define ES_UART4_CTS_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_CTS_GPIO_PIN +#define ES_UART4_CTS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART4_CTS_PIN +#ifdef ES_PIN_GPIO_E_0 +#define ES_UART4_CTS_PIN ES_PIN_GPIO_E_0 +#endif +#endif + +#ifndef ES_UART5_CTS_GPIO_FUNC +#define ES_UART5_CTS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART5_CTS_GPIO_PORT +#define ES_UART5_CTS_GPIO_PORT GPIOA +#endif +#ifndef ES_UART5_CTS_GPIO_PIN +#define ES_UART5_CTS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART5_CTS_PIN +#ifdef ES_PIN_GPIO_A_0 +#define ES_UART5_CTS_PIN ES_PIN_GPIO_A_0 +#endif +#endif + +#ifndef ES_UART5_CTS_GPIO_FUNC +#define ES_UART5_CTS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART5_CTS_GPIO_PORT +#define ES_UART5_CTS_GPIO_PORT GPIOD +#endif +#ifndef ES_UART5_CTS_GPIO_PIN +#define ES_UART5_CTS_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_UART5_CTS_PIN +#ifdef ES_PIN_GPIO_D_3 +#define ES_UART5_CTS_PIN ES_PIN_GPIO_D_3 +#endif +#endif + + +/* UART_CK */ + + +#ifndef ES_UART4_CK_GPIO_FUNC +#define ES_UART4_CK_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART4_CK_GPIO_PORT +#define ES_UART4_CK_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_CK_GPIO_PIN +#define ES_UART4_CK_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_UART4_CK_PIN +#ifdef ES_PIN_GPIO_E_6 +#define ES_UART4_CK_PIN ES_PIN_GPIO_E_6 +#endif +#endif + +#ifndef ES_UART4_CK_GPIO_FUNC +#define ES_UART4_CK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART4_CK_GPIO_PORT +#define ES_UART4_CK_GPIO_PORT GPIOE +#endif +#ifndef ES_UART4_CK_GPIO_PIN +#define ES_UART4_CK_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_UART4_CK_PIN +#ifdef ES_PIN_GPIO_E_7 +#define ES_UART4_CK_PIN ES_PIN_GPIO_E_7 +#endif +#endif + +#ifndef ES_UART5_CK_GPIO_FUNC +#define ES_UART5_CK_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_UART5_CK_GPIO_PORT +#define ES_UART5_CK_GPIO_PORT GPIOA +#endif +#ifndef ES_UART5_CK_GPIO_PIN +#define ES_UART5_CK_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_UART5_CK_PIN +#ifdef ES_PIN_GPIO_A_4 +#define ES_UART5_CK_PIN ES_PIN_GPIO_A_4 +#endif +#endif + +#ifndef ES_UART5_CK_GPIO_FUNC +#define ES_UART5_CK_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_UART5_CK_GPIO_PORT +#define ES_UART5_CK_GPIO_PORT GPIOD +#endif +#ifndef ES_UART5_CK_GPIO_PIN +#define ES_UART5_CK_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_UART5_CK_PIN +#ifdef ES_PIN_GPIO_D_7 +#define ES_UART5_CK_PIN ES_PIN_GPIO_D_7 +#endif +#endif + +#ifndef ES_UART5_CK_GPIO_FUNC +#define ES_UART5_CK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_UART5_CK_GPIO_PORT +#define ES_UART5_CK_GPIO_PORT GPIOE +#endif +#ifndef ES_UART5_CK_GPIO_PIN +#define ES_UART5_CK_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_UART5_CK_PIN +#ifdef ES_PIN_GPIO_E_0 +#define ES_UART5_CK_PIN ES_PIN_GPIO_E_0 +#endif +#endif + + +/* USART_TX */ + + + +/* USART_RX */ + + + +/* USART_RTS */ + + + +/* USART_CTS */ + + + +/* USART_CK */ + + + +/* I2C_SCL */ + + +#ifndef ES_I2C0_SCL_GPIO_FUNC +#define ES_I2C0_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SCL_GPIO_PORT +#define ES_I2C0_SCL_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SCL_GPIO_PIN +#define ES_I2C0_SCL_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_I2C0_SCL_PIN +#ifdef ES_PIN_GPIO_B_6 +#define ES_I2C0_SCL_PIN ES_PIN_GPIO_B_6 +#endif +#endif + +#ifndef ES_I2C0_SCL_GPIO_FUNC +#define ES_I2C0_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SCL_GPIO_PORT +#define ES_I2C0_SCL_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SCL_GPIO_PIN +#define ES_I2C0_SCL_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_I2C0_SCL_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_I2C0_SCL_PIN ES_PIN_GPIO_B_8 +#endif +#endif + +#ifndef ES_I2C1_SCL_GPIO_FUNC +#define ES_I2C1_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SCL_GPIO_PORT +#define ES_I2C1_SCL_GPIO_PORT GPIOA +#endif +#ifndef ES_I2C1_SCL_GPIO_PIN +#define ES_I2C1_SCL_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_I2C1_SCL_PIN +#ifdef ES_PIN_GPIO_A_5 +#define ES_I2C1_SCL_PIN ES_PIN_GPIO_A_5 +#endif +#endif + +#ifndef ES_I2C1_SCL_GPIO_FUNC +#define ES_I2C1_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SCL_GPIO_PORT +#define ES_I2C1_SCL_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C1_SCL_GPIO_PIN +#define ES_I2C1_SCL_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_I2C1_SCL_PIN +#ifdef ES_PIN_GPIO_B_10 +#define ES_I2C1_SCL_PIN ES_PIN_GPIO_B_10 +#endif +#endif + +#ifndef ES_I2C1_SCL_GPIO_FUNC +#define ES_I2C1_SCL_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SCL_GPIO_PORT +#define ES_I2C1_SCL_GPIO_PORT GPIOH +#endif +#ifndef ES_I2C1_SCL_GPIO_PIN +#define ES_I2C1_SCL_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_I2C1_SCL_PIN +#ifdef ES_PIN_GPIO_H_0 +#define ES_I2C1_SCL_PIN ES_PIN_GPIO_H_0 +#endif +#endif + + +/* I2C_SDA */ + + +#ifndef ES_I2C0_SDA_GPIO_FUNC +#define ES_I2C0_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SDA_GPIO_PORT +#define ES_I2C0_SDA_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SDA_GPIO_PIN +#define ES_I2C0_SDA_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_I2C0_SDA_PIN +#ifdef ES_PIN_GPIO_B_7 +#define ES_I2C0_SDA_PIN ES_PIN_GPIO_B_7 +#endif +#endif + +#ifndef ES_I2C0_SDA_GPIO_FUNC +#define ES_I2C0_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C0_SDA_GPIO_PORT +#define ES_I2C0_SDA_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C0_SDA_GPIO_PIN +#define ES_I2C0_SDA_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_I2C0_SDA_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_I2C0_SDA_PIN ES_PIN_GPIO_B_9 +#endif +#endif + +#ifndef ES_I2C1_SDA_GPIO_FUNC +#define ES_I2C1_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SDA_GPIO_PORT +#define ES_I2C1_SDA_GPIO_PORT GPIOA +#endif +#ifndef ES_I2C1_SDA_GPIO_PIN +#define ES_I2C1_SDA_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_I2C1_SDA_PIN +#ifdef ES_PIN_GPIO_A_6 +#define ES_I2C1_SDA_PIN ES_PIN_GPIO_A_6 +#endif +#endif + +#ifndef ES_I2C1_SDA_GPIO_FUNC +#define ES_I2C1_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SDA_GPIO_PORT +#define ES_I2C1_SDA_GPIO_PORT GPIOB +#endif +#ifndef ES_I2C1_SDA_GPIO_PIN +#define ES_I2C1_SDA_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_I2C1_SDA_PIN +#ifdef ES_PIN_GPIO_B_11 +#define ES_I2C1_SDA_PIN ES_PIN_GPIO_B_11 +#endif +#endif + +#ifndef ES_I2C1_SDA_GPIO_FUNC +#define ES_I2C1_SDA_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_I2C1_SDA_GPIO_PORT +#define ES_I2C1_SDA_GPIO_PORT GPIOH +#endif +#ifndef ES_I2C1_SDA_GPIO_PIN +#define ES_I2C1_SDA_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_I2C1_SDA_PIN +#ifdef ES_PIN_GPIO_H_1 +#define ES_I2C1_SDA_PIN ES_PIN_GPIO_H_1 +#endif +#endif + + +/* SPI_MISO */ + + +#ifndef ES_SPI0_MISO_GPIO_FUNC +#define ES_SPI0_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MISO_GPIO_PORT +#define ES_SPI0_MISO_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI0_MISO_GPIO_PIN +#define ES_SPI0_MISO_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI0_MISO_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_SPI0_MISO_PIN ES_PIN_GPIO_B_4 +#endif +#endif + +#ifndef ES_SPI0_MISO_GPIO_FUNC +#define ES_SPI0_MISO_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_MISO_GPIO_PORT +#define ES_SPI0_MISO_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_MISO_GPIO_PIN +#define ES_SPI0_MISO_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_SPI0_MISO_PIN +#ifdef ES_PIN_GPIO_A_6 +#define ES_SPI0_MISO_PIN ES_PIN_GPIO_A_6 +#endif +#endif + +#ifndef ES_SPI0_MISO_GPIO_FUNC +#define ES_SPI0_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MISO_GPIO_PORT +#define ES_SPI0_MISO_GPIO_PORT GPIOD +#endif +#ifndef ES_SPI0_MISO_GPIO_PIN +#define ES_SPI0_MISO_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI0_MISO_PIN +#ifdef ES_PIN_GPIO_D_4 +#define ES_SPI0_MISO_PIN ES_PIN_GPIO_D_4 +#endif +#endif + +#ifndef ES_SPI1_MISO_GPIO_FUNC +#define ES_SPI1_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MISO_GPIO_PORT +#define ES_SPI1_MISO_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_MISO_GPIO_PIN +#define ES_SPI1_MISO_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_SPI1_MISO_PIN +#ifdef ES_PIN_GPIO_C_2 +#define ES_SPI1_MISO_PIN ES_PIN_GPIO_C_2 +#endif +#endif + +#ifndef ES_SPI1_MISO_GPIO_FUNC +#define ES_SPI1_MISO_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MISO_GPIO_PORT +#define ES_SPI1_MISO_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_MISO_GPIO_PIN +#define ES_SPI1_MISO_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_SPI1_MISO_PIN +#ifdef ES_PIN_GPIO_B_14 +#define ES_SPI1_MISO_PIN ES_PIN_GPIO_B_14 +#endif +#endif + +#ifndef ES_SPI2_MISO_GPIO_FUNC +#define ES_SPI2_MISO_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_SPI2_MISO_GPIO_PORT +#define ES_SPI2_MISO_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI2_MISO_GPIO_PIN +#define ES_SPI2_MISO_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI2_MISO_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_SPI2_MISO_PIN ES_PIN_GPIO_B_4 +#endif +#endif + +#ifndef ES_SPI2_MISO_GPIO_FUNC +#define ES_SPI2_MISO_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_SPI2_MISO_GPIO_PORT +#define ES_SPI2_MISO_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI2_MISO_GPIO_PIN +#define ES_SPI2_MISO_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_SPI2_MISO_PIN +#ifdef ES_PIN_GPIO_B_0 +#define ES_SPI2_MISO_PIN ES_PIN_GPIO_B_0 +#endif +#endif + + +/* SPI_MOSI */ + + +#ifndef ES_SPI0_MOSI_GPIO_FUNC +#define ES_SPI0_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MOSI_GPIO_PORT +#define ES_SPI0_MOSI_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI0_MOSI_GPIO_PIN +#define ES_SPI0_MOSI_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_SPI0_MOSI_PIN +#ifdef ES_PIN_GPIO_B_5 +#define ES_SPI0_MOSI_PIN ES_PIN_GPIO_B_5 +#endif +#endif + +#ifndef ES_SPI0_MOSI_GPIO_FUNC +#define ES_SPI0_MOSI_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_MOSI_GPIO_PORT +#define ES_SPI0_MOSI_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_MOSI_GPIO_PIN +#define ES_SPI0_MOSI_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_SPI0_MOSI_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_SPI0_MOSI_PIN ES_PIN_GPIO_A_7 +#endif +#endif + +#ifndef ES_SPI0_MOSI_GPIO_FUNC +#define ES_SPI0_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_MOSI_GPIO_PORT +#define ES_SPI0_MOSI_GPIO_PORT GPIOD +#endif +#ifndef ES_SPI0_MOSI_GPIO_PIN +#define ES_SPI0_MOSI_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_SPI0_MOSI_PIN +#ifdef ES_PIN_GPIO_D_7 +#define ES_SPI0_MOSI_PIN ES_PIN_GPIO_D_7 +#endif +#endif + +#ifndef ES_SPI1_MOSI_GPIO_FUNC +#define ES_SPI1_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MOSI_GPIO_PORT +#define ES_SPI1_MOSI_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_MOSI_GPIO_PIN +#define ES_SPI1_MOSI_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI1_MOSI_PIN +#ifdef ES_PIN_GPIO_C_3 +#define ES_SPI1_MOSI_PIN ES_PIN_GPIO_C_3 +#endif +#endif + +#ifndef ES_SPI1_MOSI_GPIO_FUNC +#define ES_SPI1_MOSI_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_MOSI_GPIO_PORT +#define ES_SPI1_MOSI_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_MOSI_GPIO_PIN +#define ES_SPI1_MOSI_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_SPI1_MOSI_PIN +#ifdef ES_PIN_GPIO_B_15 +#define ES_SPI1_MOSI_PIN ES_PIN_GPIO_B_15 +#endif +#endif + +#ifndef ES_SPI2_MOSI_GPIO_FUNC +#define ES_SPI2_MOSI_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_SPI2_MOSI_GPIO_PORT +#define ES_SPI2_MOSI_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI2_MOSI_GPIO_PIN +#define ES_SPI2_MOSI_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_SPI2_MOSI_PIN +#ifdef ES_PIN_GPIO_B_5 +#define ES_SPI2_MOSI_PIN ES_PIN_GPIO_B_5 +#endif +#endif + +#ifndef ES_SPI2_MOSI_GPIO_FUNC +#define ES_SPI2_MOSI_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_SPI2_MOSI_GPIO_PORT +#define ES_SPI2_MOSI_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI2_MOSI_GPIO_PIN +#define ES_SPI2_MOSI_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_SPI2_MOSI_PIN +#ifdef ES_PIN_GPIO_B_1 +#define ES_SPI2_MOSI_PIN ES_PIN_GPIO_B_1 +#endif +#endif + + +/* SPI_SCK */ + + +#ifndef ES_SPI0_SCK_GPIO_FUNC +#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_SCK_GPIO_PORT +#define ES_SPI0_SCK_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI0_SCK_GPIO_PIN +#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI0_SCK_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_SPI0_SCK_PIN ES_PIN_GPIO_B_3 +#endif +#endif + +#ifndef ES_SPI0_SCK_GPIO_FUNC +#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_SCK_GPIO_PORT +#define ES_SPI0_SCK_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_SCK_GPIO_PIN +#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_SPI0_SCK_PIN +#ifdef ES_PIN_GPIO_A_5 +#define ES_SPI0_SCK_PIN ES_PIN_GPIO_A_5 +#endif +#endif + +#ifndef ES_SPI0_SCK_GPIO_FUNC +#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_SCK_GPIO_PORT +#define ES_SPI0_SCK_GPIO_PORT GPIOD +#endif +#ifndef ES_SPI0_SCK_GPIO_PIN +#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI0_SCK_PIN +#ifdef ES_PIN_GPIO_D_3 +#define ES_SPI0_SCK_PIN ES_PIN_GPIO_D_3 +#endif +#endif + +#ifndef ES_SPI1_SCK_GPIO_FUNC +#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_SCK_GPIO_PORT +#define ES_SPI1_SCK_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_SCK_GPIO_PIN +#define ES_SPI1_SCK_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_SPI1_SCK_PIN +#ifdef ES_PIN_GPIO_C_1 +#define ES_SPI1_SCK_PIN ES_PIN_GPIO_C_1 +#endif +#endif + +#ifndef ES_SPI1_SCK_GPIO_FUNC +#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_SCK_GPIO_PORT +#define ES_SPI1_SCK_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_SCK_GPIO_PIN +#define ES_SPI1_SCK_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_SPI1_SCK_PIN +#ifdef ES_PIN_GPIO_B_13 +#define ES_SPI1_SCK_PIN ES_PIN_GPIO_B_13 +#endif +#endif + +#ifndef ES_SPI2_SCK_GPIO_FUNC +#define ES_SPI2_SCK_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_SPI2_SCK_GPIO_PORT +#define ES_SPI2_SCK_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI2_SCK_GPIO_PIN +#define ES_SPI2_SCK_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_SPI2_SCK_PIN +#ifdef ES_PIN_GPIO_C_5 +#define ES_SPI2_SCK_PIN ES_PIN_GPIO_C_5 +#endif +#endif + +#ifndef ES_SPI2_SCK_GPIO_FUNC +#define ES_SPI2_SCK_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_SPI2_SCK_GPIO_PORT +#define ES_SPI2_SCK_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI2_SCK_GPIO_PIN +#define ES_SPI2_SCK_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_SPI2_SCK_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_SPI2_SCK_PIN ES_PIN_GPIO_B_3 +#endif +#endif + + +/* SPI_NSS */ + + +#ifndef ES_SPI0_NSS_GPIO_FUNC +#define ES_SPI0_NSS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI0_NSS_GPIO_PORT +#define ES_SPI0_NSS_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_NSS_GPIO_PIN +#define ES_SPI0_NSS_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_SPI0_NSS_PIN +#ifdef ES_PIN_GPIO_A_15 +#define ES_SPI0_NSS_PIN ES_PIN_GPIO_A_15 +#endif +#endif + +#ifndef ES_SPI0_NSS_GPIO_FUNC +#define ES_SPI0_NSS_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_SPI0_NSS_GPIO_PORT +#define ES_SPI0_NSS_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI0_NSS_GPIO_PIN +#define ES_SPI0_NSS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI0_NSS_PIN +#ifdef ES_PIN_GPIO_A_4 +#define ES_SPI0_NSS_PIN ES_PIN_GPIO_A_4 +#endif +#endif + +#ifndef ES_SPI1_NSS_GPIO_FUNC +#define ES_SPI1_NSS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_NSS_GPIO_PORT +#define ES_SPI1_NSS_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI1_NSS_GPIO_PIN +#define ES_SPI1_NSS_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_SPI1_NSS_PIN +#ifdef ES_PIN_GPIO_C_0 +#define ES_SPI1_NSS_PIN ES_PIN_GPIO_C_0 +#endif +#endif + +#ifndef ES_SPI1_NSS_GPIO_FUNC +#define ES_SPI1_NSS_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_SPI1_NSS_GPIO_PORT +#define ES_SPI1_NSS_GPIO_PORT GPIOB +#endif +#ifndef ES_SPI1_NSS_GPIO_PIN +#define ES_SPI1_NSS_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_SPI1_NSS_PIN +#ifdef ES_PIN_GPIO_B_12 +#define ES_SPI1_NSS_PIN ES_PIN_GPIO_B_12 +#endif +#endif + +#ifndef ES_SPI2_NSS_GPIO_FUNC +#define ES_SPI2_NSS_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_SPI2_NSS_GPIO_PORT +#define ES_SPI2_NSS_GPIO_PORT GPIOC +#endif +#ifndef ES_SPI2_NSS_GPIO_PIN +#define ES_SPI2_NSS_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_SPI2_NSS_PIN +#ifdef ES_PIN_GPIO_C_4 +#define ES_SPI2_NSS_PIN ES_PIN_GPIO_C_4 +#endif +#endif + +#ifndef ES_SPI2_NSS_GPIO_FUNC +#define ES_SPI2_NSS_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_SPI2_NSS_GPIO_PORT +#define ES_SPI2_NSS_GPIO_PORT GPIOA +#endif +#ifndef ES_SPI2_NSS_GPIO_PIN +#define ES_SPI2_NSS_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_SPI2_NSS_PIN +#ifdef ES_PIN_GPIO_A_15 +#define ES_SPI2_NSS_PIN ES_PIN_GPIO_A_15 +#endif +#endif + + +/* CAN_TX */ + + +#ifndef ES_CAN0_TX_GPIO_FUNC +#define ES_CAN0_TX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_CAN0_TX_GPIO_PORT +#define ES_CAN0_TX_GPIO_PORT GPIOB +#endif +#ifndef ES_CAN0_TX_GPIO_PIN +#define ES_CAN0_TX_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_CAN0_TX_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_CAN0_TX_PIN ES_PIN_GPIO_B_9 +#endif +#endif + + +/* CAN_RX */ + + +#ifndef ES_CAN0_RX_GPIO_FUNC +#define ES_CAN0_RX_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_CAN0_RX_GPIO_PORT +#define ES_CAN0_RX_GPIO_PORT GPIOB +#endif +#ifndef ES_CAN0_RX_GPIO_PIN +#define ES_CAN0_RX_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_CAN0_RX_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_CAN0_RX_PIN ES_PIN_GPIO_B_8 +#endif +#endif + + +/* AD16C4T_CH1 */ + + +#ifndef ES_AD16C4T0_CH1_GPIO_FUNC +#define ES_AD16C4T0_CH1_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PORT +#define ES_AD16C4T0_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PIN +#define ES_AD16C4T0_CH1_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_AD16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_AD16C4T0_CH1_PIN ES_PIN_GPIO_A_7 +#endif +#endif + +#ifndef ES_AD16C4T0_CH1_GPIO_FUNC +#define ES_AD16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PORT +#define ES_AD16C4T0_CH1_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH1_GPIO_PIN +#define ES_AD16C4T0_CH1_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_AD16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_E_9 +#define ES_AD16C4T0_CH1_PIN ES_PIN_GPIO_E_9 +#endif +#endif + +#ifndef ES_AD16C4T1_CH1_GPIO_FUNC +#define ES_AD16C4T1_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T1_CH1_GPIO_PORT +#define ES_AD16C4T1_CH1_GPIO_PORT GPIOC +#endif +#ifndef ES_AD16C4T1_CH1_GPIO_PIN +#define ES_AD16C4T1_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_AD16C4T1_CH1_PIN +#ifdef ES_PIN_GPIO_C_6 +#define ES_AD16C4T1_CH1_PIN ES_PIN_GPIO_C_6 +#endif +#endif + + +/* AD16C4T_CH2 */ + + +#ifndef ES_AD16C4T0_CH2_GPIO_FUNC +#define ES_AD16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2_GPIO_PORT +#define ES_AD16C4T0_CH2_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH2_GPIO_PIN +#define ES_AD16C4T0_CH2_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_AD16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_E_11 +#define ES_AD16C4T0_CH2_PIN ES_PIN_GPIO_E_11 +#endif +#endif + +#ifndef ES_AD16C4T1_CH2_GPIO_FUNC +#define ES_AD16C4T1_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T1_CH2_GPIO_PORT +#define ES_AD16C4T1_CH2_GPIO_PORT GPIOC +#endif +#ifndef ES_AD16C4T1_CH2_GPIO_PIN +#define ES_AD16C4T1_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_AD16C4T1_CH2_PIN +#ifdef ES_PIN_GPIO_C_7 +#define ES_AD16C4T1_CH2_PIN ES_PIN_GPIO_C_7 +#endif +#endif + + +/* AD16C4T_CH3 */ + + +#ifndef ES_AD16C4T0_CH3_GPIO_FUNC +#define ES_AD16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3_GPIO_PORT +#define ES_AD16C4T0_CH3_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH3_GPIO_PIN +#define ES_AD16C4T0_CH3_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_AD16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_E_13 +#define ES_AD16C4T0_CH3_PIN ES_PIN_GPIO_E_13 +#endif +#endif + +#ifndef ES_AD16C4T1_CH3_GPIO_FUNC +#define ES_AD16C4T1_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T1_CH3_GPIO_PORT +#define ES_AD16C4T1_CH3_GPIO_PORT GPIOC +#endif +#ifndef ES_AD16C4T1_CH3_GPIO_PIN +#define ES_AD16C4T1_CH3_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_AD16C4T1_CH3_PIN +#ifdef ES_PIN_GPIO_C_8 +#define ES_AD16C4T1_CH3_PIN ES_PIN_GPIO_C_8 +#endif +#endif + + +/* AD16C4T_CH4 */ + + +#ifndef ES_AD16C4T0_CH4_GPIO_FUNC +#define ES_AD16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH4_GPIO_PORT +#define ES_AD16C4T0_CH4_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH4_GPIO_PIN +#define ES_AD16C4T0_CH4_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_AD16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_E_14 +#define ES_AD16C4T0_CH4_PIN ES_PIN_GPIO_E_14 +#endif +#endif + + +/* AD16C4T_CH1N */ + + +#ifndef ES_AD16C4T0_CH1N_GPIO_FUNC +#define ES_AD16C4T0_CH1N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PORT +#define ES_AD16C4T0_CH1N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PIN +#define ES_AD16C4T0_CH1N_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_AD16C4T0_CH1N_PIN +#ifdef ES_PIN_GPIO_B_13 +#define ES_AD16C4T0_CH1N_PIN ES_PIN_GPIO_B_13 +#endif +#endif + +#ifndef ES_AD16C4T0_CH1N_GPIO_FUNC +#define ES_AD16C4T0_CH1N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PORT +#define ES_AD16C4T0_CH1N_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH1N_GPIO_PIN +#define ES_AD16C4T0_CH1N_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_AD16C4T0_CH1N_PIN +#ifdef ES_PIN_GPIO_E_8 +#define ES_AD16C4T0_CH1N_PIN ES_PIN_GPIO_E_8 +#endif +#endif + +#ifndef ES_AD16C4T1_CH1N_GPIO_FUNC +#define ES_AD16C4T1_CH1N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T1_CH1N_GPIO_PORT +#define ES_AD16C4T1_CH1N_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T1_CH1N_GPIO_PIN +#define ES_AD16C4T1_CH1N_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_AD16C4T1_CH1N_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_AD16C4T1_CH1N_PIN ES_PIN_GPIO_A_7 +#endif +#endif + + +/* AD16C4T_CH2N */ + + +#ifndef ES_AD16C4T0_CH2N_GPIO_FUNC +#define ES_AD16C4T0_CH2N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PORT +#define ES_AD16C4T0_CH2N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PIN +#define ES_AD16C4T0_CH2N_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_AD16C4T0_CH2N_PIN +#ifdef ES_PIN_GPIO_B_14 +#define ES_AD16C4T0_CH2N_PIN ES_PIN_GPIO_B_14 +#endif +#endif + +#ifndef ES_AD16C4T0_CH2N_GPIO_FUNC +#define ES_AD16C4T0_CH2N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PORT +#define ES_AD16C4T0_CH2N_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH2N_GPIO_PIN +#define ES_AD16C4T0_CH2N_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_AD16C4T0_CH2N_PIN +#ifdef ES_PIN_GPIO_E_10 +#define ES_AD16C4T0_CH2N_PIN ES_PIN_GPIO_E_10 +#endif +#endif + +#ifndef ES_AD16C4T1_CH2N_GPIO_FUNC +#define ES_AD16C4T1_CH2N_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_AD16C4T1_CH2N_GPIO_PORT +#define ES_AD16C4T1_CH2N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T1_CH2N_GPIO_PIN +#define ES_AD16C4T1_CH2N_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_AD16C4T1_CH2N_PIN +#ifdef ES_PIN_GPIO_B_0 +#define ES_AD16C4T1_CH2N_PIN ES_PIN_GPIO_B_0 +#endif +#endif + + +/* AD16C4T_CH3N */ + + +#ifndef ES_AD16C4T0_CH3N_GPIO_FUNC +#define ES_AD16C4T0_CH3N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PORT +#define ES_AD16C4T0_CH3N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PIN +#define ES_AD16C4T0_CH3N_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_AD16C4T0_CH3N_PIN +#ifdef ES_PIN_GPIO_B_15 +#define ES_AD16C4T0_CH3N_PIN ES_PIN_GPIO_B_15 +#endif +#endif + +#ifndef ES_AD16C4T0_CH3N_GPIO_FUNC +#define ES_AD16C4T0_CH3N_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PORT +#define ES_AD16C4T0_CH3N_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_CH3N_GPIO_PIN +#define ES_AD16C4T0_CH3N_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_AD16C4T0_CH3N_PIN +#ifdef ES_PIN_GPIO_E_12 +#define ES_AD16C4T0_CH3N_PIN ES_PIN_GPIO_E_12 +#endif +#endif + +#ifndef ES_AD16C4T1_CH3N_GPIO_FUNC +#define ES_AD16C4T1_CH3N_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_AD16C4T1_CH3N_GPIO_PORT +#define ES_AD16C4T1_CH3N_GPIO_PORT GPIOB +#endif +#ifndef ES_AD16C4T1_CH3N_GPIO_PIN +#define ES_AD16C4T1_CH3N_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_AD16C4T1_CH3N_PIN +#ifdef ES_PIN_GPIO_B_1 +#define ES_AD16C4T1_CH3N_PIN ES_PIN_GPIO_B_1 +#endif +#endif + + +/* AD16C4T_CH4N */ + + + +/* AD16C4T_ET */ + + +#ifndef ES_AD16C4T0_ET_GPIO_FUNC +#define ES_AD16C4T0_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_AD16C4T0_ET_GPIO_PORT +#define ES_AD16C4T0_ET_GPIO_PORT GPIOE +#endif +#ifndef ES_AD16C4T0_ET_GPIO_PIN +#define ES_AD16C4T0_ET_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_AD16C4T0_ET_PIN +#ifdef ES_PIN_GPIO_E_7 +#define ES_AD16C4T0_ET_PIN ES_PIN_GPIO_E_7 +#endif +#endif + +#ifndef ES_AD16C4T1_ET_GPIO_FUNC +#define ES_AD16C4T1_ET_GPIO_FUNC GPIO_FUNC_4 +#endif +#ifndef ES_AD16C4T1_ET_GPIO_PORT +#define ES_AD16C4T1_ET_GPIO_PORT GPIOA +#endif +#ifndef ES_AD16C4T1_ET_GPIO_PIN +#define ES_AD16C4T1_ET_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_AD16C4T1_ET_PIN +#ifdef ES_PIN_GPIO_A_0 +#define ES_AD16C4T1_ET_PIN ES_PIN_GPIO_A_0 +#endif +#endif + + +/* GP32C4T_CH1 */ + + +#ifndef ES_GP32C4T0_CH1_GPIO_FUNC +#define ES_GP32C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH1_GPIO_PORT +#define ES_GP32C4T0_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_CH1_GPIO_PIN +#define ES_GP32C4T0_CH1_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_GP32C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_A_0 +#define ES_GP32C4T0_CH1_PIN ES_PIN_GPIO_A_0 +#endif +#endif + +#ifndef ES_GP32C4T0_CH1_GPIO_FUNC +#define ES_GP32C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH1_GPIO_PORT +#define ES_GP32C4T0_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_CH1_GPIO_PIN +#define ES_GP32C4T0_CH1_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_GP32C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_A_15 +#define ES_GP32C4T0_CH1_PIN ES_PIN_GPIO_A_15 +#endif +#endif + +#ifndef ES_GP32C4T1_CH1_GPIO_FUNC +#define ES_GP32C4T1_CH1_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP32C4T1_CH1_GPIO_PORT +#define ES_GP32C4T1_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T1_CH1_GPIO_PIN +#define ES_GP32C4T1_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_GP32C4T1_CH1_PIN +#ifdef ES_PIN_GPIO_A_6 +#define ES_GP32C4T1_CH1_PIN ES_PIN_GPIO_A_6 +#endif +#endif + +#ifndef ES_GP32C4T1_CH1_GPIO_FUNC +#define ES_GP32C4T1_CH1_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP32C4T1_CH1_GPIO_PORT +#define ES_GP32C4T1_CH1_GPIO_PORT GPIOC +#endif +#ifndef ES_GP32C4T1_CH1_GPIO_PIN +#define ES_GP32C4T1_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_GP32C4T1_CH1_PIN +#ifdef ES_PIN_GPIO_C_6 +#define ES_GP32C4T1_CH1_PIN ES_PIN_GPIO_C_6 +#endif +#endif + +#ifndef ES_GP32C4T1_CH1_GPIO_FUNC +#define ES_GP32C4T1_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T1_CH1_GPIO_PORT +#define ES_GP32C4T1_CH1_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T1_CH1_GPIO_PIN +#define ES_GP32C4T1_CH1_GPIO_PIN GPIO_PIN_4 +#endif + +#ifndef ES_GP32C4T1_CH1_PIN +#ifdef ES_PIN_GPIO_B_4 +#define ES_GP32C4T1_CH1_PIN ES_PIN_GPIO_B_4 +#endif +#endif + + +/* GP32C4T_CH2 */ + + +#ifndef ES_GP32C4T0_CH2_GPIO_FUNC +#define ES_GP32C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH2_GPIO_PORT +#define ES_GP32C4T0_CH2_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_CH2_GPIO_PIN +#define ES_GP32C4T0_CH2_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_GP32C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_A_1 +#define ES_GP32C4T0_CH2_PIN ES_PIN_GPIO_A_1 +#endif +#endif + +#ifndef ES_GP32C4T0_CH2_GPIO_FUNC +#define ES_GP32C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH2_GPIO_PORT +#define ES_GP32C4T0_CH2_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T0_CH2_GPIO_PIN +#define ES_GP32C4T0_CH2_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_GP32C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_B_3 +#define ES_GP32C4T0_CH2_PIN ES_PIN_GPIO_B_3 +#endif +#endif + +#ifndef ES_GP32C4T1_CH2_GPIO_FUNC +#define ES_GP32C4T1_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T1_CH2_GPIO_PORT +#define ES_GP32C4T1_CH2_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T1_CH2_GPIO_PIN +#define ES_GP32C4T1_CH2_GPIO_PIN GPIO_PIN_5 +#endif + +#ifndef ES_GP32C4T1_CH2_PIN +#ifdef ES_PIN_GPIO_B_5 +#define ES_GP32C4T1_CH2_PIN ES_PIN_GPIO_B_5 +#endif +#endif + +#ifndef ES_GP32C4T1_CH2_GPIO_FUNC +#define ES_GP32C4T1_CH2_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP32C4T1_CH2_GPIO_PORT +#define ES_GP32C4T1_CH2_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T1_CH2_GPIO_PIN +#define ES_GP32C4T1_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP32C4T1_CH2_PIN +#ifdef ES_PIN_GPIO_A_7 +#define ES_GP32C4T1_CH2_PIN ES_PIN_GPIO_A_7 +#endif +#endif + +#ifndef ES_GP32C4T1_CH2_GPIO_FUNC +#define ES_GP32C4T1_CH2_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP32C4T1_CH2_GPIO_PORT +#define ES_GP32C4T1_CH2_GPIO_PORT GPIOC +#endif +#ifndef ES_GP32C4T1_CH2_GPIO_PIN +#define ES_GP32C4T1_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP32C4T1_CH2_PIN +#ifdef ES_PIN_GPIO_C_7 +#define ES_GP32C4T1_CH2_PIN ES_PIN_GPIO_C_7 +#endif +#endif + + +/* GP32C4T_CH3 */ + + +#ifndef ES_GP32C4T0_CH3_GPIO_FUNC +#define ES_GP32C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH3_GPIO_PORT +#define ES_GP32C4T0_CH3_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_CH3_GPIO_PIN +#define ES_GP32C4T0_CH3_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_GP32C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_A_2 +#define ES_GP32C4T0_CH3_PIN ES_PIN_GPIO_A_2 +#endif +#endif + +#ifndef ES_GP32C4T0_CH3_GPIO_FUNC +#define ES_GP32C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH3_GPIO_PORT +#define ES_GP32C4T0_CH3_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T0_CH3_GPIO_PIN +#define ES_GP32C4T0_CH3_GPIO_PIN GPIO_PIN_10 +#endif + +#ifndef ES_GP32C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_B_10 +#define ES_GP32C4T0_CH3_PIN ES_PIN_GPIO_B_10 +#endif +#endif + +#ifndef ES_GP32C4T1_CH3_GPIO_FUNC +#define ES_GP32C4T1_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T1_CH3_GPIO_PORT +#define ES_GP32C4T1_CH3_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T1_CH3_GPIO_PIN +#define ES_GP32C4T1_CH3_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_GP32C4T1_CH3_PIN +#ifdef ES_PIN_GPIO_B_0 +#define ES_GP32C4T1_CH3_PIN ES_PIN_GPIO_B_0 +#endif +#endif + +#ifndef ES_GP32C4T1_CH3_GPIO_FUNC +#define ES_GP32C4T1_CH3_GPIO_FUNC GPIO_FUNC_3 +#endif +#ifndef ES_GP32C4T1_CH3_GPIO_PORT +#define ES_GP32C4T1_CH3_GPIO_PORT GPIOC +#endif +#ifndef ES_GP32C4T1_CH3_GPIO_PIN +#define ES_GP32C4T1_CH3_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_GP32C4T1_CH3_PIN +#ifdef ES_PIN_GPIO_C_8 +#define ES_GP32C4T1_CH3_PIN ES_PIN_GPIO_C_8 +#endif +#endif + + +/* GP32C4T_CH4 */ + + +#ifndef ES_GP32C4T0_CH4_GPIO_FUNC +#define ES_GP32C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH4_GPIO_PORT +#define ES_GP32C4T0_CH4_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T0_CH4_GPIO_PIN +#define ES_GP32C4T0_CH4_GPIO_PIN GPIO_PIN_11 +#endif + +#ifndef ES_GP32C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_B_11 +#define ES_GP32C4T0_CH4_PIN ES_PIN_GPIO_B_11 +#endif +#endif + +#ifndef ES_GP32C4T0_CH4_GPIO_FUNC +#define ES_GP32C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T0_CH4_GPIO_PORT +#define ES_GP32C4T0_CH4_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_CH4_GPIO_PIN +#define ES_GP32C4T0_CH4_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_GP32C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_A_3 +#define ES_GP32C4T0_CH4_PIN ES_PIN_GPIO_A_3 +#endif +#endif + +#ifndef ES_GP32C4T1_CH4_GPIO_FUNC +#define ES_GP32C4T1_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T1_CH4_GPIO_PORT +#define ES_GP32C4T1_CH4_GPIO_PORT GPIOB +#endif +#ifndef ES_GP32C4T1_CH4_GPIO_PIN +#define ES_GP32C4T1_CH4_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_GP32C4T1_CH4_PIN +#ifdef ES_PIN_GPIO_B_1 +#define ES_GP32C4T1_CH4_PIN ES_PIN_GPIO_B_1 +#endif +#endif + + +/* GP32C4T_ET */ + + +#ifndef ES_GP32C4T0_ET_GPIO_FUNC +#define ES_GP32C4T0_ET_GPIO_FUNC GPIO_FUNC_6 +#endif +#ifndef ES_GP32C4T0_ET_GPIO_PORT +#define ES_GP32C4T0_ET_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_ET_GPIO_PIN +#define ES_GP32C4T0_ET_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_GP32C4T0_ET_PIN +#ifdef ES_PIN_GPIO_A_0 +#define ES_GP32C4T0_ET_PIN ES_PIN_GPIO_A_0 +#endif +#endif + +#ifndef ES_GP32C4T0_ET_GPIO_FUNC +#define ES_GP32C4T0_ET_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_GP32C4T0_ET_GPIO_PORT +#define ES_GP32C4T0_ET_GPIO_PORT GPIOA +#endif +#ifndef ES_GP32C4T0_ET_GPIO_PIN +#define ES_GP32C4T0_ET_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_GP32C4T0_ET_PIN +#ifdef ES_PIN_GPIO_A_15 +#define ES_GP32C4T0_ET_PIN ES_PIN_GPIO_A_15 +#endif +#endif + +#ifndef ES_GP32C4T1_ET_GPIO_FUNC +#define ES_GP32C4T1_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP32C4T1_ET_GPIO_PORT +#define ES_GP32C4T1_ET_GPIO_PORT GPIOD +#endif +#ifndef ES_GP32C4T1_ET_GPIO_PIN +#define ES_GP32C4T1_ET_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_GP32C4T1_ET_PIN +#ifdef ES_PIN_GPIO_D_2 +#define ES_GP32C4T1_ET_PIN ES_PIN_GPIO_D_2 +#endif +#endif + + +/* GP16C4T_CH1 */ + + +#ifndef ES_GP16C4T0_CH1_GPIO_FUNC +#define ES_GP16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PORT +#define ES_GP16C4T0_CH1_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PIN +#define ES_GP16C4T0_CH1_GPIO_PIN GPIO_PIN_6 +#endif + +#ifndef ES_GP16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_B_6 +#define ES_GP16C4T0_CH1_PIN ES_PIN_GPIO_B_6 +#endif +#endif + +#ifndef ES_GP16C4T0_CH1_GPIO_FUNC +#define ES_GP16C4T0_CH1_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PORT +#define ES_GP16C4T0_CH1_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH1_GPIO_PIN +#define ES_GP16C4T0_CH1_GPIO_PIN GPIO_PIN_12 +#endif + +#ifndef ES_GP16C4T0_CH1_PIN +#ifdef ES_PIN_GPIO_D_12 +#define ES_GP16C4T0_CH1_PIN ES_PIN_GPIO_D_12 +#endif +#endif + +#ifndef ES_GP16C4T1_CH1_GPIO_FUNC +#define ES_GP16C4T1_CH1_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_GP16C4T1_CH1_GPIO_PORT +#define ES_GP16C4T1_CH1_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C4T1_CH1_GPIO_PIN +#define ES_GP16C4T1_CH1_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_GP16C4T1_CH1_PIN +#ifdef ES_PIN_GPIO_A_0 +#define ES_GP16C4T1_CH1_PIN ES_PIN_GPIO_A_0 +#endif +#endif + + +/* GP16C4T_CH2 */ + + +#ifndef ES_GP16C4T0_CH2_GPIO_FUNC +#define ES_GP16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PORT +#define ES_GP16C4T0_CH2_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PIN +#define ES_GP16C4T0_CH2_GPIO_PIN GPIO_PIN_7 +#endif + +#ifndef ES_GP16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_B_7 +#define ES_GP16C4T0_CH2_PIN ES_PIN_GPIO_B_7 +#endif +#endif + +#ifndef ES_GP16C4T0_CH2_GPIO_FUNC +#define ES_GP16C4T0_CH2_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PORT +#define ES_GP16C4T0_CH2_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH2_GPIO_PIN +#define ES_GP16C4T0_CH2_GPIO_PIN GPIO_PIN_13 +#endif + +#ifndef ES_GP16C4T0_CH2_PIN +#ifdef ES_PIN_GPIO_D_13 +#define ES_GP16C4T0_CH2_PIN ES_PIN_GPIO_D_13 +#endif +#endif + +#ifndef ES_GP16C4T1_CH2_GPIO_FUNC +#define ES_GP16C4T1_CH2_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_GP16C4T1_CH2_GPIO_PORT +#define ES_GP16C4T1_CH2_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C4T1_CH2_GPIO_PIN +#define ES_GP16C4T1_CH2_GPIO_PIN GPIO_PIN_1 +#endif + +#ifndef ES_GP16C4T1_CH2_PIN +#ifdef ES_PIN_GPIO_A_1 +#define ES_GP16C4T1_CH2_PIN ES_PIN_GPIO_A_1 +#endif +#endif + + +/* GP16C4T_CH3 */ + + +#ifndef ES_GP16C4T0_CH3_GPIO_FUNC +#define ES_GP16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PORT +#define ES_GP16C4T0_CH3_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PIN +#define ES_GP16C4T0_CH3_GPIO_PIN GPIO_PIN_8 +#endif + +#ifndef ES_GP16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_B_8 +#define ES_GP16C4T0_CH3_PIN ES_PIN_GPIO_B_8 +#endif +#endif + +#ifndef ES_GP16C4T0_CH3_GPIO_FUNC +#define ES_GP16C4T0_CH3_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PORT +#define ES_GP16C4T0_CH3_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH3_GPIO_PIN +#define ES_GP16C4T0_CH3_GPIO_PIN GPIO_PIN_14 +#endif + +#ifndef ES_GP16C4T0_CH3_PIN +#ifdef ES_PIN_GPIO_D_14 +#define ES_GP16C4T0_CH3_PIN ES_PIN_GPIO_D_14 +#endif +#endif + +#ifndef ES_GP16C4T1_CH3_GPIO_FUNC +#define ES_GP16C4T1_CH3_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_GP16C4T1_CH3_GPIO_PORT +#define ES_GP16C4T1_CH3_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C4T1_CH3_GPIO_PIN +#define ES_GP16C4T1_CH3_GPIO_PIN GPIO_PIN_2 +#endif + +#ifndef ES_GP16C4T1_CH3_PIN +#ifdef ES_PIN_GPIO_A_2 +#define ES_GP16C4T1_CH3_PIN ES_PIN_GPIO_A_2 +#endif +#endif + + +/* GP16C4T_CH4 */ + + +#ifndef ES_GP16C4T0_CH4_GPIO_FUNC +#define ES_GP16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PORT +#define ES_GP16C4T0_CH4_GPIO_PORT GPIOB +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PIN +#define ES_GP16C4T0_CH4_GPIO_PIN GPIO_PIN_9 +#endif + +#ifndef ES_GP16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_B_9 +#define ES_GP16C4T0_CH4_PIN ES_PIN_GPIO_B_9 +#endif +#endif + +#ifndef ES_GP16C4T0_CH4_GPIO_FUNC +#define ES_GP16C4T0_CH4_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PORT +#define ES_GP16C4T0_CH4_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T0_CH4_GPIO_PIN +#define ES_GP16C4T0_CH4_GPIO_PIN GPIO_PIN_15 +#endif + +#ifndef ES_GP16C4T0_CH4_PIN +#ifdef ES_PIN_GPIO_D_15 +#define ES_GP16C4T0_CH4_PIN ES_PIN_GPIO_D_15 +#endif +#endif + +#ifndef ES_GP16C4T1_CH4_GPIO_FUNC +#define ES_GP16C4T1_CH4_GPIO_FUNC GPIO_FUNC_5 +#endif +#ifndef ES_GP16C4T1_CH4_GPIO_PORT +#define ES_GP16C4T1_CH4_GPIO_PORT GPIOA +#endif +#ifndef ES_GP16C4T1_CH4_GPIO_PIN +#define ES_GP16C4T1_CH4_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_GP16C4T1_CH4_PIN +#ifdef ES_PIN_GPIO_A_3 +#define ES_GP16C4T1_CH4_PIN ES_PIN_GPIO_A_3 +#endif +#endif + + +/* GP16C4T_ET */ + + +#ifndef ES_GP16C4T0_ET_GPIO_FUNC +#define ES_GP16C4T0_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T0_ET_GPIO_PORT +#define ES_GP16C4T0_ET_GPIO_PORT GPIOE +#endif +#ifndef ES_GP16C4T0_ET_GPIO_PIN +#define ES_GP16C4T0_ET_GPIO_PIN GPIO_PIN_0 +#endif + +#ifndef ES_GP16C4T0_ET_PIN +#ifdef ES_PIN_GPIO_E_0 +#define ES_GP16C4T0_ET_PIN ES_PIN_GPIO_E_0 +#endif +#endif + +#ifndef ES_GP16C4T1_ET_GPIO_FUNC +#define ES_GP16C4T1_ET_GPIO_FUNC GPIO_FUNC_2 +#endif +#ifndef ES_GP16C4T1_ET_GPIO_PORT +#define ES_GP16C4T1_ET_GPIO_PORT GPIOD +#endif +#ifndef ES_GP16C4T1_ET_GPIO_PIN +#define ES_GP16C4T1_ET_GPIO_PIN GPIO_PIN_3 +#endif + +#ifndef ES_GP16C4T1_ET_PIN +#ifdef ES_PIN_GPIO_D_3 +#define ES_GP16C4T1_ET_PIN ES_PIN_GPIO_D_3 +#endif +#endif + + +/* GP16C2T_CH1 */ + + + +/* GP16C2T_CH2 */ + + + +/* GP16C2T_CH1N */ + + + +/* GP16C2T_CH2N */ + + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_pm.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_pm.h new file mode 100644 index 0000000000..580268312c --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_pm.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_PM_H__ +#define __ES_CONF_INFO_PM_H__ + +#include +#include + +#define ES_PMU_SAVE_LOAD_UART + +/* PM 配置 */ + + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_pwm.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_pwm.h new file mode 100644 index 0000000000..86010a80ce --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_pwm.h @@ -0,0 +1,78 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_PWM_H__ +#define __ES_CONF_INFO_PWM_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + + +#define ES_C_PWM_OC_POL_HIGH TIMER_OC_POLARITY_HIGH +#define ES_C_PWM_OC_POL_LOW TIMER_OC_POLARITY_LOW + +#define ES_C_PWM_OC_MODE_PWM1 TIMER_OC_MODE_PWM1 +#define ES_C_PWM_OC_MODE_PWM2 TIMER_OC_MODE_PWM2 + + + +/* PWM 配置 */ + + +/* codes_main */ + + + +#define ES_PWM_OC_POLARITY ES_C_PWM_OC_POL_HIGH +#define ES_PWM_OC_MODE ES_C_PWM_OC_MODE_PWM2 + +#ifndef ES_PWM_OC_POLARITY +#define ES_PWM_OC_POLARITY ES_C_PWM_OC_POL_HIGH +#endif +#ifndef ES_PWM_OC_MODE +#define ES_PWM_OC_MODE ES_C_PWM_OC_MODE_PWM2 +#endif + +#ifndef ES_DEVICE_NAME_AD16C4T0_PWM +#define ES_DEVICE_NAME_AD16C4T0_PWM "pwm0" +#endif +#ifndef ES_DEVICE_NAME_AD16C4T1_PWM +#define ES_DEVICE_NAME_AD16C4T1_PWM "pwm1" +#endif +#ifndef ES_DEVICE_NAME_GP32C4T0_PWM +#define ES_DEVICE_NAME_GP32C4T0_PWM "pwm2" +#endif +#ifndef ES_DEVICE_NAME_GP32C4T1_PWM +#define ES_DEVICE_NAME_GP32C4T1_PWM "pwm3" +#endif +#ifndef ES_DEVICE_NAME_GP16C4T0_PWM +#define ES_DEVICE_NAME_GP16C4T0_PWM "pwm4" +#endif +#ifndef ES_DEVICE_NAME_GP16C4T1_PWM +#define ES_DEVICE_NAME_GP16C4T1_PWM "pwm5" +#endif + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_rtc.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_rtc.h new file mode 100644 index 0000000000..2aa8faf9d7 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_rtc.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_RTC_H__ +#define __ES_CONF_INFO_RTC_H__ + +#include +#include + +/* RTC 配置 */ + +#define ES_C_RTC_SOURCE_LRC RTC_SOURCE_LRC +#define ES_C_RTC_SOURCE_LOSC RTC_SOURCE_LOSC + +#define ES_RTC_CLK_SOURCE ES_C_RTC_SOURCE_LOSC + + + + +/* codes_main */ + + +#ifndef ES_DEVICE_NAME_RTC +#define ES_DEVICE_NAME_RTC "rtc" +#endif + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_select.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_select.h new file mode 100644 index 0000000000..06a28d6fd0 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_select.h @@ -0,0 +1,43 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_SELECT_H__ +#define __ES_CONF_INFO_SELECT_H__ + + +#define ES_C_ENABLE 1 +#define ES_C_DISABLE 0 + + +/* codes_main */ + +#ifndef ES_USE_ASSERT +#define ES_USE_ASSERT ES_C_DISABLE +#endif + + +#if ES_USE_ASSERT + #define USE_ASSERT +#endif + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_spi.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_spi.h new file mode 100644 index 0000000000..c9cf895aeb --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_spi.h @@ -0,0 +1,159 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_SPI_H__ +#define __ES_CONF_INFO_SPI_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + +/* SPI 配置 */ + +#define SPI_BUS_CONFIG(_CONF_,_I_) do{_CONF_.mode = 0U; \ + _CONF_.mode |= ( ES_SPI##_I_##_MASTER_SLAVE | \ + ES_SPI##_I_##_WIRE_3_4 | \ + ES_SPI##_I_##_CPHA_1_2 | \ + ES_SPI##_I_##_CPOL_H_L | \ + ES_SPI##_I_##_CS | \ + ES_SPI##_I_##_M_L_SB ); \ + _CONF_.data_width = ES_SPI##_I_##_DATA_W; \ + _CONF_.max_hz = ES_SPI##_I_##_MAX_HZ; \ + }while(0) + + +// spi_config.mode &= ~RT_SPI_SLAVE; /* 主机模式 */ +// spi_config.mode &= ~RT_SPI_3WIRE; /* 4线,双向传输 */ +// spi_config.mode |= RT_SPI_CPHA; /* 第二边沿采样 */ +// spi_config.mode |= RT_SPI_CPOL; /* 空闲高电平 */ +// spi_config.mode |= RT_SPI_NO_CS; /* 禁用软件从机选择管理 */ +// spi_config.mode |= RT_SPI_MSB; /* 高位在前 */ +// spi_config.data_width = 8; /* 数据长度:8 */ +// spi_config.max_hz = 2000000; /* 最快时钟频率 */ + +#define ES_C_SPI_CLK_POL_HIGH RT_SPI_CPOL +#define ES_C_SPI_CLK_POL_LOW !RT_SPI_CPOL + +#define ES_C_SPI_CLK_PHA_FIRST !RT_SPI_CPHA +#define ES_C_SPI_CLK_PHA_SECOND RT_SPI_CPHA + +#define ES_C_SPI_MSB RT_SPI_MSB +#define ES_C_SPI_LSB RT_SPI_LSB + +#define ES_C_SPI_CS_LOW_LEVEL 0 +#define ES_C_SPI_CS_HIGH_LEVEL 1 + +/* codes_main */ + + +#ifndef ES_DEVICE_NAME_SPI0_BUS +#define ES_DEVICE_NAME_SPI0_BUS "spi0" +#endif +#ifndef ES_DEVICE_NAME_SPI0_DEV0 +#define ES_DEVICE_NAME_SPI0_DEV0 "spi00" +#endif + +#ifndef ES_DEVICE_NAME_SPI1_BUS +#define ES_DEVICE_NAME_SPI1_BUS "spi1" +#endif +#ifndef ES_DEVICE_NAME_SPI1_DEV0 +#define ES_DEVICE_NAME_SPI1_DEV0 "spi10" +#endif + +#ifndef ES_DEVICE_NAME_SPI2_BUS +#define ES_DEVICE_NAME_SPI2_BUS "spi2" +#endif +#ifndef ES_DEVICE_NAME_SPI2_DEV0 +#define ES_DEVICE_NAME_SPI2_DEV0 "spi20" +#endif + + +#define ES_SPI_CS_LEVEL ES_C_SPI_CS_LOW_LEVEL + +#ifndef ES_SPI0_CPHA_1_2 +#define ES_SPI0_CPHA_1_2 ES_C_SPI_CLK_PHA_SECOND +#endif +#ifndef ES_SPI0_CPOL_H_L +#define ES_SPI0_CPOL_H_L ES_C_SPI_CLK_POL_HIGH +#endif +#ifndef ES_SPI0_M_L_SB +#define ES_SPI0_M_L_SB RT_SPI_MSB +#endif +#ifndef ES_SPI0_MAX_HZ +#define ES_SPI0_MAX_HZ 2000000 +#endif +#ifndef ES_SPI0_NSS_PIN +#define ES_SPI0_NSS_PIN 0xFFFFFFFF +#endif + +#ifndef ES_SPI1_CPHA_1_2 +#define ES_SPI1_CPHA_1_2 ES_C_SPI_CLK_PHA_SECOND +#endif +#ifndef ES_SPI1_CPOL_H_L +#define ES_SPI1_CPOL_H_L ES_C_SPI_CLK_POL_HIGH +#endif +#ifndef ES_SPI1_M_L_SB +#define ES_SPI1_M_L_SB RT_SPI_MSB +#endif +#ifndef ES_SPI1_MAX_HZ +#define ES_SPI1_MAX_HZ 2000000 +#endif +#ifndef ES_SPI1_NSS_PIN +#define ES_SPI1_NSS_PIN 0xFFFFFFFF +#endif + +#ifndef ES_SPI2_CPHA_1_2 +#define ES_SPI2_CPHA_1_2 ES_C_SPI_CLK_PHA_SECOND +#endif +#ifndef ES_SPI2_CPOL_H_L +#define ES_SPI2_CPOL_H_L ES_C_SPI_CLK_POL_HIGH +#endif +#ifndef ES_SPI2_M_L_SB +#define ES_SPI2_M_L_SB RT_SPI_MSB +#endif +#ifndef ES_SPI2_MAX_HZ +#define ES_SPI2_MAX_HZ 2000000 +#endif +#ifndef ES_SPI2_NSS_PIN +#define ES_SPI2_NSS_PIN 0xFFFFFFFF +#endif + + +#define ES_SPI0_MASTER_SLAVE !RT_SPI_SLAVE +#define ES_SPI0_WIRE_3_4 !RT_SPI_3WIRE +#define ES_SPI0_CS RT_SPI_NO_CS +#define ES_SPI0_DATA_W 8 + +#define ES_SPI1_MASTER_SLAVE !RT_SPI_SLAVE +#define ES_SPI1_WIRE_3_4 !RT_SPI_3WIRE +#define ES_SPI1_CS RT_SPI_NO_CS +#define ES_SPI1_DATA_W 8 + +#define ES_SPI2_MASTER_SLAVE !RT_SPI_SLAVE +#define ES_SPI2_WIRE_3_4 !RT_SPI_3WIRE +#define ES_SPI2_CS RT_SPI_NO_CS +#define ES_SPI2_DATA_W 8 + + +#endif diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_uart.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_uart.h new file mode 100644 index 0000000000..430cb9f599 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_uart.h @@ -0,0 +1,205 @@ +/* + * Change Logs: + * Date Author Notes + * 2021-04-20 liuhy the first version + * + * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __ES_CONF_INFO_UART_H__ +#define __ES_CONF_INFO_UART_H__ + +#include "es_conf_info_map.h" +#include +#include +#include + + + +#define ES_C_UART_PARITY_NONE PARITY_NONE +#define ES_C_UART_PARITY_ODD PARITY_ODD +#define ES_C_UART_PARITY_EVEN PARITY_EVEN + +#define ES_C_UART_STOP_1 STOP_BITS_1 +#define ES_C_UART_STOP_2 STOP_BITS_2 + + +/* UART 配置 */ + +/* codes_main */ + + + +#ifndef ES_DEVICE_NAME_UART0 +#define ES_DEVICE_NAME_UART0 "uart0" +#endif +#ifndef ES_DEVICE_NAME_UART1 +#define ES_DEVICE_NAME_UART1 "uart1" +#endif +#ifndef ES_DEVICE_NAME_UART2 +#define ES_DEVICE_NAME_UART2 "uart2" +#endif +#ifndef ES_DEVICE_NAME_UART3 +#define ES_DEVICE_NAME_UART3 "uart3" +#endif +#ifndef ES_DEVICE_NAME_UART4 +#define ES_DEVICE_NAME_UART4 "uart4" +#endif +#ifndef ES_DEVICE_NAME_UART5 +#define ES_DEVICE_NAME_UART5 "uart5" +#endif + +#ifndef ES_CONF_UART0_BAUD_RATE +#define ES_CONF_UART0_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART0_PARITY +#define ES_CONF_UART0_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART0_STOP_BITS +#define ES_CONF_UART0_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART1_BAUD_RATE +#define ES_CONF_UART1_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART1_PARITY +#define ES_CONF_UART1_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART1_STOP_BITS +#define ES_CONF_UART1_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART2_BAUD_RATE +#define ES_CONF_UART2_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART2_PARITY +#define ES_CONF_UART2_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART2_STOP_BITS +#define ES_CONF_UART2_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART3_BAUD_RATE +#define ES_CONF_UART3_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART3_PARITY +#define ES_CONF_UART3_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART3_STOP_BITS +#define ES_CONF_UART3_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART4_BAUD_RATE +#define ES_CONF_UART4_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART4_PARITY +#define ES_CONF_UART4_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART4_STOP_BITS +#define ES_CONF_UART4_STOP_BITS ES_C_UART_STOP_1 +#endif + +#ifndef ES_CONF_UART5_BAUD_RATE +#define ES_CONF_UART5_BAUD_RATE 115200 +#endif +#ifndef ES_CONF_UART5_PARITY +#define ES_CONF_UART5_PARITY ES_C_UART_PARITY_NONE +#endif +#ifndef ES_CONF_UART5_STOP_BITS +#define ES_CONF_UART5_STOP_BITS ES_C_UART_STOP_1 +#endif + + +#define ES_UART0_CONFIG \ +{ \ + ES_CONF_UART0_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART0_STOP_BITS, \ + ES_CONF_UART0_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART1_CONFIG \ +{ \ + ES_CONF_UART1_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART1_STOP_BITS, \ + ES_CONF_UART1_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART2_CONFIG \ +{ \ + ES_CONF_UART2_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART2_STOP_BITS, \ + ES_CONF_UART2_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART3_CONFIG \ +{ \ + ES_CONF_UART3_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART3_STOP_BITS, \ + ES_CONF_UART3_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART4_CONFIG \ +{ \ + ES_CONF_UART4_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART4_STOP_BITS, \ + ES_CONF_UART4_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + + +#define ES_UART5_CONFIG \ +{ \ + ES_CONF_UART5_BAUD_RATE, \ + DATA_BITS_8, \ + ES_CONF_UART5_STOP_BITS, \ + ES_CONF_UART5_PARITY, \ + BIT_ORDER_LSB, \ + NRZ_NORMAL, \ + RT_SERIAL_RB_BUFSZ, \ + 0 \ +} + +#endif diff --git a/bsp/essemi/es32f369x/drivers/Kconfig b/bsp/essemi/es32f369x/drivers/Kconfig index 4b42e7e074..75cb7bd164 100644 --- a/bsp/essemi/es32f369x/drivers/Kconfig +++ b/bsp/essemi/es32f369x/drivers/Kconfig @@ -1,139 +1,37 @@ menu "Hardware Drivers Config" + + menu "On-chip Peripheral Drivers" config BSP_USING_GPIO bool "Enable GPIO" select RT_USING_PIN default y - menu "UART Drivers" - config BSP_USING_UART0 - bool "Enable UART0 PB10/PB11(T/R)" - select RT_USING_SERIAL - default n - - config BSP_USING_UART1 - bool "Enable UART1 PC10/PC11(T/R)" - select RT_USING_SERIAL - default n - - config BSP_USING_UART2 - bool "Enable UART2 PC12/PD02(T/R)" - select RT_USING_SERIAL - default y - - config BSP_USING_UART3 - bool "Enable UART3 PC04/PC05(T/R)" - select RT_USING_SERIAL - default n - depends on !BSP_USING_SPI2 - - config BSP_USING_UART4 - bool "Enable UART4 PB06/PB07(T/R)" - select RT_USING_SERIAL - default n - depends on !BSP_USING_I2C0 - depends on !BSP_USING_PWM0 - - config BSP_USING_UART5 - bool "Enable UART5 PB09/PB08(T/R)" - select RT_USING_SERIAL - default n - depends on !BSP_USING_PWM0 - endmenu - - menu "SPI Drivers" - config BSP_USING_SPI0 - bool "Enable SPI0 BUS PB03/PB04/PB05(CLK/MISO/MOSI)" - select RT_USING_SPI - select RT_USING_PIN - default n - - config BSP_USING_SPI1 - bool "Enable SPI1 BUS PC01/PC02/PC03(CLK/MISO/MOSI)" - select RT_USING_SPI - select RT_USING_PIN - default n - - config BSP_USING_SPI2 - bool "Enable SPI2 BUS PC05/PB00/PB01(CLK/MISO/MOSI)" - select RT_USING_SPI - select RT_USING_PIN - default n - depends on !BSP_USING_UART3 - endmenu - - menu "I2C Drivers" - config BSP_USING_I2C0 - bool "Enable I2C0 BUS PB06/PB07(SCL/SDA)" - select RT_USING_I2C - default n - depends on !BSP_USING_PWM0 - - config BSP_USING_I2C1 - bool "Enable I2C1 BUS PA05/PA06(SCL/SDA)" - select RT_USING_I2C - default n - endmenu - - menu "CAN Drivers" - config BSP_USING_CAN - bool "Enable CAN BUS PB08/PB09(RX/TX)" - select RT_USING_CAN - default n - endmenu - - menu "ADC Drivers" - config BSP_USING_ADC - bool "Using ADC" - select RT_USING_ADC - default n - endmenu - - menu "RTC Drivers" - config BSP_USING_RTC - bool "Using RTC" - select RT_USING_RTC - default n - endmenu - - menu "HWtimer Drivers" - config BSP_USING_HWTIMER0 - bool "Using timer0" - select RT_USING_HWTIMER - default n - - config BSP_USING_HWTIMER1 - bool "Using timer1" - select RT_USING_HWTIMER - default n - endmenu - - menu "PWM Drivers" - config BSP_USING_PWM0 - bool "Using PWM0 PB06/PB07/PB08/PB09" - select RT_USING_PWM - default n - depends on !BSP_USING_CAN - depends on !BSP_USING_I2C0 - - config BSP_USING_PWM1 - bool "Using PWM1 PA00/PA01/PA02/PA03" - select RT_USING_PWM - default n - endmenu - - menu "PM Drivers" - config BSP_USING_PM - bool "Using PM" - select RT_USING_PM - default n - endmenu + source "drivers/ES/Kconfig" endmenu menu "Onboard Peripheral Drivers" + config BSP_USING_SPI_FLASH + bool "Enable SPI FLASH (W25Q64 spi0)" + select BSP_USING_SPI + select RT_USING_SFUD + select RT_SFUD_USING_SFDP + default n + +if BSP_USING_SPI_FLASH + + config ES_DEVICE_NAME_SPI_DEV + string "The name of spi device (registered)" + default "spi00" + + config ES_DEVICE_NAME_SPI_FALSH_DEV + string "The name of spi flash device" + default "W25Q64" +endif + endmenu menu "Offboard Peripheral Drivers" @@ -155,13 +53,17 @@ menu "Hardware Drivers Config" bool "BSP_USING_EXAMPLE_I2C" default n + config BSP_USING_EXAMPLE_I2C_E2PROM + bool "BSP_USING_EXAMPLE_I2C_E2PROM" + default n + config BSP_USING_EXAMPLE_LED_BLINK bool "BSP_USING_EXAMPLE_LED_BLINK" - default y + default n config BSP_USING_EXAMPLE_PIN_BEEP bool "BSP_USING_EXAMPLE_PIN_BEEP" - default y + default n config BSP_USING_EXAMPLE_PWM_LED bool "BSP_USING_EXAMPLE_PWM_LED" @@ -177,7 +79,7 @@ menu "Hardware Drivers Config" config BSP_USING_EXAMPLE_UART bool "BSP_USING_EXAMPLE_UART" - default y + default n config BSP_USING_EXAMPLE_CAN bool "BSP_USING_EXAMPLE_CAN" diff --git a/bsp/essemi/es32f369x/drivers/SConscript b/bsp/essemi/es32f369x/drivers/SConscript index 735ebb37be..b39d545e35 100644 --- a/bsp/essemi/es32f369x/drivers/SConscript +++ b/bsp/essemi/es32f369x/drivers/SConscript @@ -15,7 +15,9 @@ if GetDepend('RT_USING_PIN'): # add serial driver code if GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART1') or GetDepend('BSP_USING_UART2') or GetDepend('BSP_USING_UART3') or \ - GetDepend('BSP_USING_UART4') or GetDepend('BSP_USING_UART5'): + GetDepend('BSP_USING_UART4') or GetDepend('BSP_USING_UART5') or \ + GetDepend('BSP_USING_USART0') or GetDepend('BSP_USING_USART1') or GetDepend('BSP_USING_USART2') or GetDepend('BSP_USING_USART3') or \ + GetDepend('BSP_USING_USART4') or GetDepend('BSP_USING_USART5'): src += ['drv_uart.c'] # add spi driver code @@ -27,23 +29,32 @@ if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'): src += ['drv_i2c.c'] # add can driver code -if GetDepend('BSP_USING_CAN'): +if GetDepend('BSP_USING_CAN') or GetDepend('BSP_USING_CAN0') or GetDepend('RT_USING_CAN'): src += ['drv_can.c'] # add adc driver code -if GetDepend(['BSP_USING_ADC']): +if GetDepend(['BSP_USING_ADC0']) or GetDepend('BSP_USING_ADC1'): src += ['drv_adc.c'] # add rtc driver code if GetDepend(['BSP_USING_RTC']): src += ['drv_rtc.c'] +# add spi flash driver code +if GetDepend('BSP_USING_SPI_FLASH'): + src += ['drv_spiflash.c'] + # add hwtimer driver code -if GetDepend('BSP_USING_HWTIMER0') or GetDepend('BSP_USING_HWTIMER1'): +if GetDepend('BSP_USING_AD16C4T0_HWTIMER') or GetDepend('BSP_USING_AD16C4T1_HWTIMER') or \ + GetDepend('BSP_USING_GP32C4T0_HWTIMER') or GetDepend('BSP_USING_GP32C4T1_HWTIMER') or \ + GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ + GetDepend('BSP_USING_BS16T0_HWTIMER') or GetDepend('BSP_USING_BS16T1_HWTIMER'): src += ['drv_hwtimer.c'] # add pwm driver code -if GetDepend('BSP_USING_PWM0') or GetDepend('BSP_USING_PWM1'): +if GetDepend('BSP_USING_AD16C4T0_PWM') or GetDepend('BSP_USING_AD16C4T1_PWM') or \ + GetDepend('BSP_USING_GP32C4T0_PWM') or GetDepend('BSP_USING_GP32C4T1_PWM') or \ + GetDepend('BSP_USING_GP16C4T0_PWM') or GetDepend('BSP_USING_GP16C4T1_PWM'): src += ['drv_pwm.c'] # add pm driver code @@ -56,7 +67,7 @@ objs = objs + group src = [] cwd = GetCurrentDir() -include_path = [cwd] +include_path = [cwd + '/ES'] if GetDepend('BSP_USING_EXAMPLE_ADC_VOL'): src += ['bsp_driver_example/adc_vol_sample.c'] @@ -67,6 +78,9 @@ if GetDepend('BSP_USING_EXAMPLE_HWTIMER'): if GetDepend('BSP_USING_EXAMPLE_I2C'): src += ['bsp_driver_example/i2c_sample.c'] +if GetDepend('BSP_USING_EXAMPLE_I2C_E2PROM'): + src += ['bsp_driver_example/i2c_e2_sample.c'] + if GetDepend('BSP_USING_EXAMPLE_LED_BLINK'): src += ['bsp_driver_example/led_blink_sample.c'] diff --git a/bsp/essemi/es32f369x/drivers/board.c b/bsp/essemi/es32f369x/drivers/board.c index 1c2b834177..ea42df63dc 100644 --- a/bsp/essemi/es32f369x/drivers/board.c +++ b/bsp/essemi/es32f369x/drivers/board.c @@ -1,11 +1,24 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #include @@ -13,7 +26,6 @@ #include "board.h" #include "drv_uart.h" #include "drv_gpio.h" -#include #include /** @@ -42,11 +54,68 @@ void NVIC_Configuration(void) *******************************************************************************/ void SystemClock_Config(void) { - /* hosc 12MHz, from hosc/3 pll to 96MHz */ - ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_96M); - /* SYSCLK 96MHz */ - ald_cmu_clock_config(CMU_CLOCK_PLL1, 96000000); + + SYSCFG_UNLOCK(); +#if ES_CMU_LRC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_LRCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_LRCEN_MSK); +#endif /*ES_CMU_LRC_EN*/ + +#if ES_CMU_LOSC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_LOSCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_LOSCEN_MSK); +#endif /*ES_CMU_LOSC_EN*/ + +#if ES_CMU_HRC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_HRCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_HRCEN_MSK); +#endif /*ES_CMU_HRC_EN*/ + +#if ES_CMU_HOSC_EN + SET_BIT(CMU->CLKENR, CMU_CLKENR_HOSCEN_MSK); +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_HOSCEN_MSK); +#endif /*ES_CMU_HOSC_EN*/ + + SYSCFG_LOCK(); + +#if ES_CMU_PLL1_EN + /*PLL的源必须是4M*/ + ald_cmu_pll1_config(ES_PLL1_REFER_CLK, ES_PLL1_OUT_CLK); + + #if ES_CMU_PLL1_SAFE_EN + ald_cmu_pll_safe_config(ENABLE); + #else + ald_cmu_pll_safe_config(DISABLE); + #endif + +#else + CLEAR_BIT(CMU->CLKENR, CMU_CLKENR_PLL1EN_MSK); +#endif /*ES_CMU_PLL1_EN*/ + + ald_cmu_clock_config(ES_SYS_CLK_SOURSE, ES_SYS_CLK); + + ald_cmu_div_config(CMU_SYS,ES_CMU_SYS_DIV); + ald_cmu_div_config(CMU_HCLK_1,ES_CMU_HCLK_1_DIV); + ald_cmu_div_config(CMU_HCLK_2,ES_CMU_HCLK_2_DIV); + ald_cmu_div_config(CMU_PCLK_1,ES_CMU_PCLK_1_DIV); + ald_cmu_div_config(CMU_PCLK_2,ES_CMU_PCLK_2_DIV); + ald_cmu_perh_clock_config(CMU_PERH_ALL, ENABLE); + +/*低功耗时钟使能*/ +#ifdef RT_USING_PM + SYSCFG_UNLOCK(); + SET_BIT(CMU->LPENR, CMU_LPENR_LRCEN_MSK); + SET_BIT(CMU->LPENR, CMU_LPENR_LOSCEN_MSK); + SET_BIT(CMU->LPENR, CMU_LPENR_HRCEN_MSK); + SET_BIT(CMU->LPENR, CMU_LPENR_HOSCEN_MSK); + SYSCFG_LOCK(); +#endif + } /******************************************************************************* @@ -70,11 +139,21 @@ void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); + ald_inc_tick(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); } +/** + * This is the cmu interrupt service. + * + */ +void CMU_Handler(void) +{ + ald_cmu_irq_handler(); +} + /*@}*/ /** * This function will initial ES32F3 board. diff --git a/bsp/essemi/es32f369x/drivers/board.h b/bsp/essemi/es32f369x/drivers/board.h index 628c2f87fd..640cf44864 100644 --- a/bsp/essemi/es32f369x/drivers/board.h +++ b/bsp/essemi/es32f369x/drivers/board.h @@ -1,11 +1,24 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ // <<< Use Configuration Wizard in Context Menu >>> @@ -13,6 +26,7 @@ #define __BOARD_H__ #include +#include "es_conf_info_cmu.h" #define ES32F3_SRAM_SIZE 0x18000 #define ES32F3_SRAM_END (0x20000000 + ES32F3_SRAM_SIZE) diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/adc_vol_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/adc_vol_sample.c index f9444982d4..9576736bcd 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/adc_vol_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/adc_vol_sample.c @@ -18,11 +18,15 @@ #include #include + +#ifdef RT_USING_ADC + #define ADC_DEV_NAME "adc0" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL 5 /* ADC 通道 5 PA1*/ #define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/ #define CONVERT_BITS (1 << 12) /* 转换位数为12位 */ + static int adc_vol_sample(int argc, char *argv[]) { rt_adc_device_t adc_dev; @@ -55,3 +59,5 @@ static int adc_vol_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/can_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/can_sample.c index bfbd50095e..1133ad8d2b 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/can_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/can_sample.c @@ -18,7 +18,9 @@ #include #include "rtdevice.h" -#define CAN_DEV_NAME "can" /* CAN 设备名称 */ +#ifdef RT_USING_CAN + +#define CAN_DEV_NAME "can0" /* CAN 设备名称 */ static struct rt_semaphore rx_sem; /* 用于接收消息的信号量 */ static rt_device_t can_dev; /* CAN 设备句柄 */ @@ -142,3 +144,5 @@ int can_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(can_sample, can device sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/hwtimer_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/hwtimer_sample.c index e2e39664f3..025b4f26c0 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/hwtimer_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/hwtimer_sample.c @@ -17,6 +17,8 @@ #include #include +#ifdef RT_USING_HWTIMER + #define HWTIMER_DEV_NAME "timer0" /* 定时器名称 */ /* 定时器超时回调函数 */ @@ -83,3 +85,5 @@ static int hwtimer_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_e2_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_e2_sample.c new file mode 100644 index 0000000000..3bfd005e67 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_e2_sample.c @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Change Logs: + * Date Author Notes + * 2020-12-15 liuhy first implementation. + */ +/* + * 程序清单:这是一个 I2C 设备使用例程 + * 例程导出了 i2c_e2_sample 命令到控制终端 + * 命令调用格式:i2c_e2_sample + * 命令解释:使用默认的I2C总线设备i2c0 + * 程序功能:通过 I2C 设备写读e2prom,ST24C04WP。 +*/ + +/*ST24C04WP 有2个Block :Block0 的从机地址为:0x50,Block1 的从机地址为:0x51 + 一个Block有 256字节,一页16字节,写只可在一页内(超过一页的范围后,会回到页的开始),读无页限制*/ +#include +#include + +#ifdef RT_USING_I2C + +#define I2C_BUS_NAME "i2c0" /*I2C总线设备名称 */ +#define SLAVE_ADDR 0x50 /*从机地址*/ +#define MEM_ADDR 0x00 /*从机的起始储存地址,范围:0x00到0xEF(例程写读范围:2页)*/ +#define ADDR_LEN 1 /*定义从机储存地址的长度,默认8位,1字节*/ +#define STR_LEN 16 /*接收发送的页数据长度 ,最大16*/ + +static rt_uint8_t mem_addr,rx_buffer[33] = { 0U }; /*读两页,需要32字节,字符串结束'\0'*/ +/*第一个字节' '用来放 E2PROM 的内存地址,最后一个字节'\0'作为子串的结束,不存入e2prom*/ +static rt_uint8_t tx_buffer1[STR_LEN + ADDR_LEN + 1] = " e2prom example !\0"; +static rt_uint8_t tx_buffer2[STR_LEN + ADDR_LEN + 1] = " ABCDEFGH12345678\0"; + +static void i2c_e2_sample(int argc, char *argv[]) +{ + struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ + struct rt_i2c_msg i2c_msg[2]; /* I2C消息 */ + rt_size_t s_stat; + + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C_BUS_NAME); /* 通过名字获取I2C总线设备的句柄 */ + + if( i2c_bus == RT_NULL) + { + rt_kprintf("can't find i2c device :%s !\n",I2C_BUS_NAME); + return; + } + + /*写T24C04WP + 如果 (MEM_ADDR & 0x0F) + STR_LEN <= 16, 写的范围为:(MEM_ADDR , MEM_ADDR + STR_LEN ) + (0x10 + MEM_ADDR , 0x10 + MEM_ADDR + STR_LEN ) + 如果 (MEM_ADDR & 0x0F) + STR_LEN > 16, 超出范围的部分会在页内循环写。*/ + tx_buffer1[0] = MEM_ADDR; + + /*初始化消息*/ + i2c_msg[0].addr = SLAVE_ADDR; /* 从机地址 */ + i2c_msg[0].len = ADDR_LEN + STR_LEN ; /* 写入的长度,地址+数据 */ + i2c_msg[0].buf = tx_buffer1; /* 待写入第一段数据 */ + i2c_msg[0].flags = RT_I2C_WR; /* I2C写 */ + s_stat = rt_i2c_transfer(i2c_bus,i2c_msg,1); /* 写入第一段数据 */ + + if( s_stat == 1 )rt_kprintf("write successful. \nmessage: %s\n",&tx_buffer1[1]); + else rt_kprintf("device %s write fail \n",I2C_BUS_NAME); + + tx_buffer2[0] = MEM_ADDR + 0x10; /*加一页*/ + i2c_msg[0].buf = tx_buffer2; /* 待写入第二段数据 */ + s_stat = rt_i2c_transfer(i2c_bus,i2c_msg,1); /* 写入第二段数据 */ + + if( s_stat == 1 )rt_kprintf("write successful. \nmessage: %s\n",&tx_buffer2[1]); + else rt_kprintf("device %s write fail \n",I2C_BUS_NAME); + + /*读T24C04WP 读2页的数据。读数据需要2条消息:第一条消息:发送读取的地址。 + 第二条消息:读取具体的数据。*/ + + mem_addr = MEM_ADDR & 0xF0; /*从页的开始读*/ + + i2c_msg[0].len = ADDR_LEN; + i2c_msg[0].buf = &mem_addr; + + i2c_msg[1].addr = SLAVE_ADDR; /* 从机地址 */ + i2c_msg[1].len = 32; /* 读取的数据长度:2*16 */ + i2c_msg[1].buf = rx_buffer; /* 数据存放地址 */ + i2c_msg[1].flags = RT_I2C_RD; /* I2C读 */ + s_stat = rt_i2c_transfer(i2c_bus,i2c_msg,2); /* 读已写的2页 */ + + if( s_stat == 2 )rt_kprintf(" read successful \n messege : %s \n",rx_buffer); + else + rt_kprintf("read fail \n"); + + return; + +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(i2c_e2_sample, i2c e2prom sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_sample.c index 4fd42baf41..c8a666609d 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/i2c_sample.c @@ -1,7 +1,19 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes @@ -18,6 +30,8 @@ #include #include +#ifdef RT_USING_I2C + #define I2C_BUS_NAME "i2c0" /* I2C总线设备名称 */ #define SLAVE_ADDR 0x2D /* 从机地址 */ #define STR_LEN 16 /* 接收发送的数据长度 */ @@ -95,3 +109,5 @@ static void i2c_io_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(i2c_io_sample, i2c io sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/pm_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/pm_sample.c index b886876108..731dca4115 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/pm_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/pm_sample.c @@ -1,7 +1,19 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes @@ -11,18 +23,26 @@ * 程序清单:这是一个 pm睡眠唤醒的使用例程 * 例程导出了 pm_sample 命令到控制终端 * 命令调用格式:pm_sample - * 命令解释:进入不同的睡眠模式,然后用按键唤醒 + * 命令解释:进入不同的睡眠模式,然后用按键唤醒。 * 程序功能:通过串口输出字符串,告知进入睡眠和唤醒睡眠的情况。 + * 注意:进入睡眠前,如果有中断挂起(SYSTICK、UART、EXTI等),睡眠将被瞬间唤醒。 */ #include #include -#include "drv_pm.h" +#include "drv_pm.h" +#include "ald_gpio.h" + + +#ifdef RT_USING_PM #define PM_NAME "pm" /* 设备名称 */ #define WAKE_UP_PIN 51 /* 唤醒源 */ #define SLEEP_TIMES 12 /* 进入睡眠次数,轮流进入不同的睡眠模式,包括无睡眠模式 */ +/*部分芯片进入深度睡眠后,部分外设的部分寄存器可能会丢失*/ +#define SAVE_REG UART0 +#define SAVE_REG_TYPE UART_TypeDef struct pm_callback_t { @@ -64,14 +84,15 @@ void sleep_in_out_callback(rt_uint8_t event, rt_uint8_t mode, void *data) /*进入睡眠前*/ case RT_PM_ENTER_SLEEP: g_pm_data.flag = 1; rt_kprintf("\n\r##%d : ENTER ",g_pm_data.in_fun_times); - save_register(UART0,sizeof(UART_TypeDef),save_load_mem); /*备份寄存器的值*/ + /*进入深度睡眠后,部分外设的部分寄存器可能会丢失*/ + save_register(SAVE_REG,sizeof(SAVE_REG_TYPE),save_load_mem); /*备份寄存器的值*/ g_pm_data.in_fun_times++; /*进入睡眠次数+1*/ break; /*睡眠唤醒后*/ case RT_PM_EXIT_SLEEP: g_pm_data.flag = 0; /*睡眠唤醒后*/ - load_register(UART0,sizeof(UART_TypeDef),save_load_mem); /*还原寄存器的值*/ + load_register(SAVE_REG,sizeof(SAVE_REG_TYPE),save_load_mem); /*还原寄存器的值*/ rt_kprintf("\n\rEXIT\n\r"); - rt_pm_release(mode); /*释放休眠模式*/ + rt_pm_request(PM_SLEEP_MODE_NONE); /*进无休眠模式*/ return; default: break; @@ -118,7 +139,7 @@ static void pm_test(void *parameter) /*设置回调函数和私有数据*/ rt_pm_notify_set(sleep_in_out_callback,RT_NULL); - + while(i < SLEEP_TIMES) { @@ -130,9 +151,12 @@ static void pm_test(void *parameter) g_pm_data.flag = 2; } + + /*彻底释放无休眠模式*/ + rt_pm_release_all(PM_SLEEP_MODE_NONE); /*请求选择的休眠模式*/ - rt_pm_request(in_mode[i%6]); + rt_pm_request(in_mode[i%6]); rt_thread_mdelay(500); @@ -142,14 +166,19 @@ static void pm_test(void *parameter) rt_thread_mdelay(500); } - /*释放选择的休眠模式*/ - rt_pm_release(in_mode[i%6]); + /*释放选择的休眠模式 ,彻底释放*/ + rt_pm_release_all(in_mode[i%6]); i++; } - /*清除回调函数和私有数据*/ + + /*切换为无睡眠模式*/ + rt_pm_request(PM_SLEEP_MODE_NONE); + + /*清除回调函数和私有数据*/ rt_pm_notify_set(RT_NULL,RT_NULL); + rt_kprintf("thread pm_test close\n\r"); } @@ -187,3 +216,5 @@ static int pm_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pm_sample, pm sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/pwm_led_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/pwm_led_sample.c index df82c1b41c..8d12b74e15 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/pwm_led_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/pwm_led_sample.c @@ -17,9 +17,12 @@ #include #include -#define LED_PIN_NUM 19 /* PF1 LED PIN脚编号,查看驱动文件drv_gpio.c确定 */ + +#ifdef RT_USING_PWM + +#define LED_PIN_NUM 37 /* PF1 LED PIN脚编号,查看驱动文件drv_gpio.c确定 */ #define PWM_DEV_NAME "pwm1" /* PWM设备名称 */ -#define PWM_DEV_CHANNEL 2 /* PA1 PWM通道 */ +#define PWM_DEV_CHANNEL 1 /* PWM通道 */ struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ @@ -70,3 +73,5 @@ static int pwm_led_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_led_sample, pwm sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/rtc_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/rtc_sample.c index 711a3a0ebb..d66b9db9df 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/rtc_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/rtc_sample.c @@ -17,6 +17,8 @@ #include #include +#ifdef RT_USING_RTC + static int rtc_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; @@ -39,7 +41,7 @@ static int rtc_sample(int argc, char *argv[]) } /* 延时3秒 */ - rt_thread_mdelay(3000); + rt_thread_mdelay(3000); /* 获取时间 */ now = time(RT_NULL); @@ -49,3 +51,5 @@ static int rtc_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(rtc_sample, rtc sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/bsp_driver_example/spi_sample.c b/bsp/essemi/es32f369x/drivers/bsp_driver_example/spi_sample.c index 994888cdb0..6f6e730288 100644 --- a/bsp/essemi/es32f369x/drivers/bsp_driver_example/spi_sample.c +++ b/bsp/essemi/es32f369x/drivers/bsp_driver_example/spi_sample.c @@ -1,7 +1,19 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes @@ -17,13 +29,14 @@ #include #include +#ifdef RT_USING_SPI + #define SPI_DEVICE_NAME "spi00" #define BUF_LEN 16 static void spi_io_sample(int argc, char *argv[]) { struct rt_spi_device * spi_dev; /* spi设备的句柄 */ - struct rt_spi_configuration spi_config; rt_uint8_t i,buffer[BUF_LEN] = { 0U }; rt_err_t s_stat; rt_err_t result; @@ -37,23 +50,8 @@ static void spi_io_sample(int argc, char *argv[]) return; } - - /* 清空配置结构体 */ - rt_memset(&spi_config,0,sizeof(struct rt_spi_configuration)); - - spi_config.mode &= ~RT_SPI_SLAVE; /* 主机模式 */ - spi_config.mode &= ~RT_SPI_3WIRE; /* 4线,双向传输 */ - spi_config.mode |= RT_SPI_CPHA; /* 第二边沿采样 */ - spi_config.mode |= RT_SPI_CPOL; /* 空闲高电平 */ - spi_config.mode |= RT_SPI_NO_CS; /* 禁用软件从机选择管理 */ - spi_config.mode |= RT_SPI_MSB; /* 高位在前 */ - - spi_config.data_width = 8; /* 数据长度:8 */ - - spi_config.max_hz = 2000000; /* 最快时钟频率 */ - /* 配置SPI设备 */ - s_stat = rt_spi_configure(spi_dev,&spi_config); + s_stat = rt_spi_configure(spi_dev,&(spi_dev->config)); if(s_stat != RT_EOK) { @@ -150,3 +148,5 @@ static void spi_io_sample(int argc, char *argv[]) } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(spi_io_sample, spi sample); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/drv_adc.c b/bsp/essemi/es32f369x/drivers/drv_adc.c index 79afc06123..716fddcfa4 100644 --- a/bsp/essemi/es32f369x/drivers/drv_adc.c +++ b/bsp/essemi/es32f369x/drivers/drv_adc.c @@ -1,26 +1,44 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes * 2019-04-03 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include #include #include "board.h" -#include "drv_adc.h" -#include -#include +#include "drv_adc.h" #ifdef RT_USING_ADC /* define adc instance */ + +#ifdef BSP_USING_ADC0 static struct rt_adc_device _device_adc0; +#endif /*BSP_USING_ADC0*/ + +#ifdef BSP_USING_ADC1 +static struct rt_adc_device _device_adc1; +#endif /*BSP_USING_ADC1*/ /* enable or disable adc */ static rt_err_t es32f3_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) @@ -48,7 +66,8 @@ static adc_channel_t es32f3_adc_get_channel(rt_uint32_t channel) /* Initialize ADC pin */ gpio_initstruct.mode = GPIO_MODE_INPUT; - gpio_initstruct.pupd = GPIO_FLOATING; + gpio_initstruct.pupd = GPIO_FLOATING; + gpio_initstruct.odos = GPIO_OPEN_DRAIN; gpio_initstruct.podrv = GPIO_OUT_DRIVE_1; gpio_initstruct.nodrv = GPIO_OUT_DRIVE_1; gpio_initstruct.flt = GPIO_FILTER_DISABLE; @@ -60,77 +79,69 @@ static adc_channel_t es32f3_adc_get_channel(rt_uint32_t channel) { case 0: es32f3_channel = ADC_CHANNEL_0; - ald_gpio_init(GPIOC, GPIO_PIN_0, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH0_GPIO, ES_GPIO_ADC_CH0_PIN, &gpio_initstruct); break; case 1: es32f3_channel = ADC_CHANNEL_1; - ald_gpio_init(GPIOC, GPIO_PIN_1, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH1_GPIO, ES_GPIO_ADC_CH1_PIN, &gpio_initstruct); break; case 2: es32f3_channel = ADC_CHANNEL_2; - ald_gpio_init(GPIOC, GPIO_PIN_2, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH2_GPIO, ES_GPIO_ADC_CH2_PIN, &gpio_initstruct); break; case 3: es32f3_channel = ADC_CHANNEL_3; - ald_gpio_init(GPIOC, GPIO_PIN_3, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH3_GPIO, ES_GPIO_ADC_CH3_PIN, &gpio_initstruct); break; case 4: es32f3_channel = ADC_CHANNEL_4; - ald_gpio_init(GPIOA, GPIO_PIN_0, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH4_GPIO, ES_GPIO_ADC_CH4_PIN, &gpio_initstruct); break; case 5: es32f3_channel = ADC_CHANNEL_5; - ald_gpio_init(GPIOA, GPIO_PIN_1, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH5_GPIO, ES_GPIO_ADC_CH5_PIN, &gpio_initstruct); break; case 6: es32f3_channel = ADC_CHANNEL_6; - ald_gpio_init(GPIOA, GPIO_PIN_2, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH6_GPIO, ES_GPIO_ADC_CH6_PIN, &gpio_initstruct); break; case 7: es32f3_channel = ADC_CHANNEL_7; - ald_gpio_init(GPIOA, GPIO_PIN_3, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH7_GPIO, ES_GPIO_ADC_CH7_PIN, &gpio_initstruct); break; case 8: es32f3_channel = ADC_CHANNEL_8; - ald_gpio_init(GPIOA, GPIO_PIN_4, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH8_GPIO, ES_GPIO_ADC_CH8_PIN, &gpio_initstruct); break; case 9: es32f3_channel = ADC_CHANNEL_9; - ald_gpio_init(GPIOA, GPIO_PIN_5, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH9_GPIO, ES_GPIO_ADC_CH9_PIN, &gpio_initstruct); break; case 10: es32f3_channel = ADC_CHANNEL_10; - ald_gpio_init(GPIOA, GPIO_PIN_6, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH10_GPIO, ES_GPIO_ADC_CH10_PIN, &gpio_initstruct); break; case 11: es32f3_channel = ADC_CHANNEL_11; - ald_gpio_init(GPIOA, GPIO_PIN_7, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH11_GPIO, ES_GPIO_ADC_CH11_PIN, &gpio_initstruct); break; case 12: es32f3_channel = ADC_CHANNEL_12; - ald_gpio_init(GPIOC, GPIO_PIN_4, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH12_GPIO, ES_GPIO_ADC_CH12_PIN, &gpio_initstruct); break; case 13: es32f3_channel = ADC_CHANNEL_13; - ald_gpio_init(GPIOC, GPIO_PIN_5, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH13_GPIO, ES_GPIO_ADC_CH13_PIN, &gpio_initstruct); break; case 14: es32f3_channel = ADC_CHANNEL_14; - ald_gpio_init(GPIOB, GPIO_PIN_0, &gpio_initstruct); + ald_gpio_init(ES_GPIO_ADC_CH14_GPIO, ES_GPIO_ADC_CH14_PIN, &gpio_initstruct); break; case 15: es32f3_channel = ADC_CHANNEL_15; - ald_gpio_init(GPIOB, GPIO_PIN_1, &gpio_initstruct); - break; - case 16: - es32f3_channel = ADC_CHANNEL_16; - break; - case 17: - es32f3_channel = ADC_CHANNEL_17; - break; - case 18: - es32f3_channel = ADC_CHANNEL_18; + ald_gpio_init(ES_GPIO_ADC_CH15_GPIO, ES_GPIO_ADC_CH15_PIN, &gpio_initstruct); break; + default: break; } @@ -149,7 +160,7 @@ static rt_err_t es32f3_get_adc_value(struct rt_adc_device *device, rt_uint32_t c /* config adc channel */ nm_config.ch = es32f3_adc_get_channel(channel); nm_config.idx = ADC_NCH_IDX_1; - nm_config.samp = ADC_SAMPLETIME_4; + nm_config.samp = ES_ADC0_NCH_SAMPLETIME; ald_adc_normal_channel_config(_hadc, &nm_config); ald_adc_normal_start(_hadc); @@ -169,23 +180,51 @@ static const struct rt_adc_ops es32f3_adc_ops = int rt_hw_adc_init(void) { int result = RT_EOK; - static adc_handle_t _h_adc0; + adc_handle_t _h_adc; /* adc function initialization */ - _h_adc0.perh = ADC0; - _h_adc0.init.align = ADC_DATAALIGN_RIGHT; - _h_adc0.init.scan = DISABLE; - _h_adc0.init.cont = DISABLE; - _h_adc0.init.disc = ADC_ALL_DISABLE; - _h_adc0.init.disc_nr = ADC_DISC_NR_1; - _h_adc0.init.data_bit = ADC_CONV_BIT_12; - _h_adc0.init.div = ADC_CKDIV_128; - _h_adc0.init.nche_sel = ADC_NCHESEL_MODE_ALL; - _h_adc0.init.n_ref = ADC_NEG_REF_VSS; - _h_adc0.init.p_ref = ADC_POS_REF_VDD; - ald_adc_init(&_h_adc0); + _h_adc.init.scan = DISABLE; + _h_adc.init.cont = DISABLE; + _h_adc.init.disc = ADC_ALL_DISABLE; + _h_adc.init.disc_nr = ADC_DISC_NR_1; + _h_adc.init.nch_nr = ADC_NCH_NR_16; + _h_adc.init.nche_sel = ADC_NCHESEL_MODE_ALL; + _h_adc.init.cont = DISABLE; + _h_adc.init.n_ref = ADC_NEG_REF_VSS; + _h_adc.init.p_ref = ADC_POS_REF_VDD; - rt_hw_adc_register(&_device_adc0, "adc0", &es32f3_adc_ops, &_h_adc0); +#ifdef BSP_USING_ADC0 + + static adc_handle_t _h_adc0; + + _h_adc0.init = _h_adc.init; + + _h_adc0.perh = ADC0; + _h_adc0.init.align = ES_ADC0_ALIGN; + _h_adc0.init.data_bit = ES_ADC0_DATA_BIT; + _h_adc0.init.div = ES_ADC0_CLK_DIV; + ald_adc_init(&_h_adc0); + + rt_hw_adc_register(&_device_adc0, ES_DEVICE_NAME_ADC0, &es32f3_adc_ops, &_h_adc0); + +#endif /*BSP_USING_ADC0*/ + +#ifdef BSP_USING_ADC1 + + static adc_handle_t _h_adc1; + + _h_adc1.init = _h_adc.init; + + _h_adc1.perh = ADC1; + _h_adc1.init.align = ES_ADC1_ALIGN; + _h_adc1.init.data_bit = ES_ADC1_DATA_BIT; + _h_adc1.init.div = ES_ADC1_CLK_DIV; + ald_adc_init(&_h_adc1); + + rt_hw_adc_register(&_device_adc1, ES_DEVICE_NAME_ADC1, &es32f3_adc_ops, &_h_adc1); + +#endif /*BSP_USING_ADC1*/ + return result; } diff --git a/bsp/essemi/es32f369x/drivers/drv_adc.h b/bsp/essemi/es32f369x/drivers/drv_adc.h index eaddd67407..6585b44cf0 100644 --- a/bsp/essemi/es32f369x/drivers/drv_adc.h +++ b/bsp/essemi/es32f369x/drivers/drv_adc.h @@ -3,14 +3,29 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-04-03 wangyq the first version + * 2019-04-03 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_ADC_H__ #define DRV_ADC_H__ +#include "es_conf_info_adc.h" + int rt_hw_adc_init(void); #endif diff --git a/bsp/essemi/es32f369x/drivers/drv_can.c b/bsp/essemi/es32f369x/drivers/drv_can.c index 04f4f161d7..6e7456b9b6 100644 --- a/bsp/essemi/es32f369x/drivers/drv_can.c +++ b/bsp/essemi/es32f369x/drivers/drv_can.c @@ -1,51 +1,93 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #include "drv_can.h" -#ifdef BSP_USING_CAN +#ifdef RT_USING_CAN static struct es32f3_can can; -/* attention !!! baud calculation example: Pclk / ((sjw + seg1 + seg2) * psc) 48 / ((1 + 3 + 2) * 8) = 1MHz */ -static const struct es32f3_baud_rate_tab can_baud_rate_tab[] = -{ - {CAN1MBaud, 8}, - {CAN800kBaud, 10}, - {CAN500kBaud, 16}, - {CAN250kBaud, 32}, - {CAN125kBaud, 64}, - {CAN100kBaud, 80}, - {CAN50kBaud, 160}, - {CAN20kBaud, 400}, - {CAN10kBaud, 800} -}; -static rt_uint32_t get_can_baud_index(rt_uint32_t baud) -{ - rt_uint32_t len, index; - - len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]); - for (index = 0; index < len; index++) +static rt_uint32_t get_can_baud_index(rt_uint32_t baud,can_init_t * init) +{ +/* attention !!! baud calculation example: Pclk / ((1 + seg1 + seg2) * psc) Pclk=48 / ((1 + seg1=3 + seg2=2) * 8) = 1MHz */ + double target,temp,min; + uint32_t i,j,j_max,near = 0; + target = (double)(ald_cmu_get_pclk1_clock()); + target/= baud; /*计算误差1*/ + + min = 0xFFFFFFFF; + + for(i = 1 + 16 + 8 ;i > 2;i--) /*SYNC_SEG + SEG1 + SEG2*/ { - if (can_baud_rate_tab[index].baud_rate == baud) - return index; + j_max = target/i/(0.98) + 1; /*缩小范围*/ + j_max = (j_max > 1024) ? (1024) : (j_max); + + for(j = target/i/1.02 ;j < j_max;j++) + { + temp = target/i/j; /*计算误差2*/ + temp = (temp > 1) ? (temp - 1) : (1 - temp); + temp+= ((1.0 * i * j) / 0xFFFFFFFF) ; + + if(temp < min) + { + if(temp > 0.000001) + { + near = (i<<16) + j; + min = temp; + } + else + { + init->seg1 = (can_seg1_t)((i - 1)*2/3-1); + init->seg2 = (can_seg2_t)(i - init->seg1 - 1 - 1 - 1); + init->psc = j; + + return 0; + } + } + } } - return 0; /* default baud is CAN1MBaud */ + if(min < 0.01) + { + i = near>>16; + j = near % (1<<16); + init->seg1 = (can_seg1_t)((i - 1)*2/3-1); + init->seg2 = (can_seg2_t)(i - init->seg1 - 1 - 1 - 1); + init->psc = j; + + return 0; + } + else + { + return 1; + } } + static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configure *cfg) { struct es32f3_can *drv_can; - rt_uint32_t baud_index; RT_ASSERT(can_device); RT_ASSERT(cfg); @@ -56,7 +98,7 @@ static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configu drv_can->CanHandle.init.ttcm = DISABLE; drv_can->CanHandle.init.abom = ENABLE; drv_can->CanHandle.init.awk = DISABLE; - drv_can->CanHandle.init.artx = DISABLE; + drv_can->CanHandle.init.artx = (type_func_t)ES_CAN0_AUTO_BAN_RE_T; drv_can->CanHandle.init.rfom = DISABLE; drv_can->CanHandle.init.txmp = ENABLE; @@ -75,12 +117,13 @@ static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configu drv_can->CanHandle.init.mode = CAN_MODE_SILENT_LOOPBACK; break; } - - baud_index = get_can_baud_index(cfg->baud_rate); - drv_can->CanHandle.init.sjw = CAN_SJW_1; - drv_can->CanHandle.init.seg1 = CAN_SEG1_3; - drv_can->CanHandle.init.seg2 = CAN_SEG2_2; - drv_can->CanHandle.init.psc = can_baud_rate_tab[baud_index].config_data; + /*配置参数*/ + if(get_can_baud_index(cfg->baud_rate,&(drv_can->CanHandle.init))) + { + return -RT_ERROR; + } + drv_can->CanHandle.init.sjw = (can_sjw_t)(cfg->reserved); + /* init can */ if (ald_can_init(&drv_can->CanHandle) != OK) { @@ -95,8 +138,12 @@ static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configu static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *arg) { rt_uint32_t argval; + struct es32f3_can *drv_can; + +#ifdef RT_CAN_USING_HDR struct rt_can_filter_config *filter_cfg; +#endif RT_ASSERT(can_device != RT_NULL); drv_can = (struct es32f3_can *)can_device->parent.user_data; @@ -108,17 +155,24 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar argval = (rt_uint32_t) arg; if (argval == RT_DEVICE_FLAG_INT_RX) { - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_FP0 | CAN_IT_FF0 | CAN_IT_FOV0 | - CAN_IT_FP1 | CAN_IT_FF1 | CAN_IT_FOV1), DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, DISABLE); } else if (argval == RT_DEVICE_FLAG_INT_TX) { ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_TXM, DISABLE); } else if (argval == RT_DEVICE_CAN_INT_ERR) - { - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_WARN | CAN_IT_PERR | CAN_IT_BOF | - CAN_IT_PRERR | CAN_IT_ERR), DISABLE); + { + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, DISABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, DISABLE); } break; case RT_DEVICE_CTRL_SET_INT: @@ -127,29 +181,36 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar { NVIC_SetPriority(CAN0_RX0_IRQn, 1); NVIC_EnableIRQ(CAN0_RX0_IRQn); - - NVIC_SetPriority(CAN0_RX0_IRQn, 1); - NVIC_EnableIRQ(CAN0_RX0_IRQn); - - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_FP0 | CAN_IT_FF0 | CAN_IT_FOV0 | - CAN_IT_FP1 | CAN_IT_FF1 | CAN_IT_FOV1), ENABLE); + + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, ENABLE); + } else if (argval == RT_DEVICE_FLAG_INT_TX) { NVIC_SetPriority(CAN0_TX_IRQn, 1); NVIC_EnableIRQ(CAN0_TX_IRQn); - + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_TXM, ENABLE); } else if (argval == RT_DEVICE_CAN_INT_ERR) { NVIC_SetPriority(CAN0_EXCEPTION_IRQn, 1); NVIC_EnableIRQ(CAN0_EXCEPTION_IRQn); - - ald_can_interrupt_config(&drv_can->CanHandle, (can_it_t)(CAN_IT_WARN | CAN_IT_PERR | CAN_IT_BOF | - CAN_IT_PRERR | CAN_IT_ERR), ENABLE); + + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, ENABLE); + ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, ENABLE); + } break; +#ifdef RT_CAN_USING_HDR case RT_CAN_CMD_SET_FILTER: if (RT_NULL == arg) { @@ -161,20 +222,70 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar filter_cfg = (struct rt_can_filter_config *)arg; /* get default filter */ for (int i = 0; i < filter_cfg->count; i++) - { - drv_can->FilterConfig.number = filter_cfg->items[i].hdr; + { + + /*默认过滤表判断*/ + if(filter_cfg->items[i].hdr < drv_can->device.config.maxhdr) + drv_can->FilterConfig.number = filter_cfg->items[i].hdr; + else + drv_can->FilterConfig.number = ES_C_CAN_DEFAULT_FILTER_NUMBER; + + if(filter_cfg->items[i].mode) + { + /*标识符列表模式: 类型匹配 ,id匹配为:接收的id = 配置的id + 或者 = 配置的mask ,通过*/ + /*扩展帧*/ + if(filter_cfg->items[i].ide) + { +// filter_cfg->items[i].id = filter_cfg->items[i].id ; /*id 29 位*/ + filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 3) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)); + } + else /*标准帧*/ + { + filter_cfg->items[i].id = (filter_cfg->items[i].id << 18); + filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 21) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)); + } + } + else + { + /*标识符掩码模式*/ + /*扩展帧*/ + if(filter_cfg->items[i].ide) + { + filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<3; + } + else /*标准帧*/ + { + filter_cfg->items[i].id = (filter_cfg->items[i].id)<<18; + filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<21; + } + +#if ES_C_CAN_FILTER_FRAME_TYPE + /*匹配类型*/ + filter_cfg->items[i].mask |= 0x6; +#endif + + } + drv_can->FilterConfig.id_high = (filter_cfg->items[i].id >> 13) & 0xFFFF; drv_can->FilterConfig.id_low = ((filter_cfg->items[i].id << 3) | (filter_cfg->items[i].ide << 2) | (filter_cfg->items[i].rtr << 1)) & 0xFFFF; drv_can->FilterConfig.mask_id_high = (filter_cfg->items[i].mask >> 16) & 0xFFFF; drv_can->FilterConfig.mask_id_low = filter_cfg->items[i].mask & 0xFFFF; + drv_can->FilterConfig.mode = (can_filter_mode_t)filter_cfg->items[i].mode; /* Filter conf */ ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig); } } break; + +#endif case RT_CAN_CMD_SET_MODE: argval = (rt_uint32_t) arg; if (argval != RT_CAN_MODE_NORMAL && @@ -192,18 +303,7 @@ static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *ar break; case RT_CAN_CMD_SET_BAUD: argval = (rt_uint32_t) arg; - if (argval != CAN1MBaud && - argval != CAN800kBaud && - argval != CAN500kBaud && - argval != CAN250kBaud && - argval != CAN125kBaud && - argval != CAN100kBaud && - argval != CAN50kBaud && - argval != CAN20kBaud && - argval != CAN10kBaud) - { - return -RT_ERROR; - } + if (argval != drv_can->device.config.baud_rate) { drv_can->device.config.baud_rate = argval; @@ -312,6 +412,7 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t } /* clear TIR */ h_can->perh->TxMailBox[box_num].TXID &= CAN_TXID0_TXMREQ_MSK; + /* Set up the Id */ if (RT_CAN_STDID == pmsg->ide) { @@ -336,7 +437,7 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t ((uint32_t)pmsg->data[0] << CAN_TXDL0_BYTE0_POSS)); /* Request transmission */ SET_BIT(h_can->perh->TxMailBox[box_num].TXID, CAN_TXID0_TXMREQ_MSK); - + return RT_EOK; } else @@ -346,6 +447,8 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t return -RT_ERROR; } + + } static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo) @@ -427,8 +530,12 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) /* RX interrupt */ else { + if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO0) != 0) + { /* save to user list */ rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } + /* Clear FIFO0 rx Flag */ SET_BIT(h_can->perh->RXF0, CAN_RXF0_FREE_MSK); } @@ -444,8 +551,12 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) /* RX interrupt */ else { + if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO1) != 0) + { /* save to user list */ rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } + /* Clear FIFO0 rx Flag */ SET_BIT(h_can->perh->RXF1, CAN_RXF1_FREE_MSK); } @@ -575,30 +686,30 @@ void CAN0_EXCEPTION_Handler(void) int rt_hw_can_init(void) { gpio_init_t h_gpio; - struct can_configure config = CANDEFAULTCONFIG; - - config.privmode = RT_CAN_MODE_NOPRIV; - config.ticks = 50; -#ifdef RT_CAN_USING_HDR - config.maxhdr = 14; -#endif /* Initialize can common pin */ h_gpio.odos = GPIO_PUSH_PULL; h_gpio.pupd = GPIO_PUSH_UP; - h_gpio.podrv = GPIO_OUT_DRIVE_1; - h_gpio.nodrv = GPIO_OUT_DRIVE_0_1; + h_gpio.podrv = GPIO_OUT_DRIVE_6; + h_gpio.nodrv = GPIO_OUT_DRIVE_6; h_gpio.flt = GPIO_FILTER_DISABLE; h_gpio.type = GPIO_TYPE_TTL; - h_gpio.func = GPIO_FUNC_3; +#if defined(ES_CAN0_RX_GPIO_FUNC)&&defined(ES_CAN0_RX_GPIO_PORT)&&defined(ES_CAN0_RX_GPIO_PIN) /* Initialize can rx pin */ - h_gpio.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_8, &h_gpio); - + h_gpio.mode = GPIO_MODE_INPUT; + h_gpio.func = ES_CAN0_RX_GPIO_FUNC; + ald_gpio_init(ES_CAN0_RX_GPIO_PORT, ES_CAN0_RX_GPIO_PIN, &h_gpio); +#endif + + +#if defined(ES_CAN0_TX_GPIO_FUNC)&&defined(ES_CAN0_TX_GPIO_PORT)&&defined(ES_CAN0_TX_GPIO_PIN) /* Initialize can tx pin */ - h_gpio.mode = GPIO_MODE_OUTPUT; - ald_gpio_init(GPIOB, GPIO_PIN_9, &h_gpio); + h_gpio.mode = GPIO_MODE_OUTPUT; + h_gpio.func = ES_CAN0_TX_GPIO_FUNC; + ald_gpio_init(ES_CAN0_TX_GPIO_PORT, ES_CAN0_TX_GPIO_PIN, &h_gpio); +#endif + /* config default filter */ can_filter_t filter = {0}; @@ -607,15 +718,21 @@ int rt_hw_can_init(void) filter.mask_id_high = 0x0000; filter.mask_id_low = 0x0000; filter.fifo = CAN_FILTER_FIFO0; - filter.number = 0; + filter.number = ES_C_CAN_DEFAULT_FILTER_NUMBER; filter.mode = CAN_FILTER_MODE_MASK; filter.scale = CAN_FILTER_SCALE_32; filter.active = ENABLE; can.FilterConfig = filter; - can.device.config = config; + can.device.config = (struct can_configure)ES_CAN0_CONFIG; +#ifdef RT_CAN_USING_HDR + can.device.config.maxhdr = 14; +#endif + can.device.config.privmode = RT_CAN_MODE_NOPRIV; + can.device.config.ticks = 50; + can.device.config.reserved = ES_CAN0_SJW; /* register CAN1 device */ - rt_hw_can_register(&can.device, "can", &_can_ops, &can); + rt_hw_can_register(&can.device, ES_DEVICE_NAME_CAN0, &_can_ops, &can); return 0; } diff --git a/bsp/essemi/es32f369x/drivers/drv_can.h b/bsp/essemi/es32f369x/drivers/drv_can.h index cffe4b81b0..d7eeb859aa 100644 --- a/bsp/essemi/es32f369x/drivers/drv_can.h +++ b/bsp/essemi/es32f369x/drivers/drv_can.h @@ -3,9 +3,22 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_CAN_H__ @@ -14,16 +27,9 @@ #include #include #include +#include "es_conf_info_can.h" -#include -#include - -struct es32f3_baud_rate_tab -{ - rt_uint32_t baud_rate; - rt_uint32_t config_data; -}; - +#ifdef RT_USING_CAN /* es32f3 can device */ struct es32f3_can { @@ -34,4 +40,5 @@ struct es32f3_can int rt_hw_can_init(void); +#endif #endif /*DRV_CAN_H__ */ diff --git a/bsp/essemi/es32f369x/drivers/drv_gpio.c b/bsp/essemi/es32f369x/drivers/drv_gpio.c index fa39a31ea5..8ce6ab7aa8 100644 --- a/bsp/essemi/es32f369x/drivers/drv_gpio.c +++ b/bsp/essemi/es32f369x/drivers/drv_gpio.c @@ -1,107 +1,40 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ -#include -#include #include "board.h" #include "drv_gpio.h" -#include -#include + +/*管脚映射在 es_conf_info_map.h 的 pins[] 中*/ #ifdef RT_USING_PIN -#define __ES32F3_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_PIN_##gpio_index} -#define __ES32F3_PIN_DEFAULT {-1, 0, 0} - -/* ES32F3 GPIO driver */ -struct pin_index -{ - int index; - GPIO_TypeDef *gpio; - uint32_t pin; -}; - -static const struct pin_index pins[] = -{ - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN(2, C, 13), - __ES32F3_PIN(3, C, 14), - __ES32F3_PIN(4, C, 15), - __ES32F3_PIN(5, H, 0), - __ES32F3_PIN(6, H, 1), - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN(8, C, 0), - __ES32F3_PIN(9, C, 1), - __ES32F3_PIN(10, C, 2), - __ES32F3_PIN(11, C, 3), - __ES32F3_PIN(12, H, 3), - __ES32F3_PIN(13, H, 4), - __ES32F3_PIN(14, A, 0), - __ES32F3_PIN(15, A, 1), - __ES32F3_PIN(16, A, 2), - __ES32F3_PIN(17, A, 3), - __ES32F3_PIN(18, F, 0), - __ES32F3_PIN(19, F, 1), - __ES32F3_PIN(20, A, 4), - __ES32F3_PIN(21, A, 5), - __ES32F3_PIN(22, A, 6), - __ES32F3_PIN(23, A, 7), - __ES32F3_PIN(24, C, 4), - __ES32F3_PIN(25, C, 5), - __ES32F3_PIN(26, B, 0), - __ES32F3_PIN(27, B, 1), - __ES32F3_PIN(28, B, 2), - __ES32F3_PIN(29, B, 10), - __ES32F3_PIN(30, B, 11), - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN(33, B, 12), - __ES32F3_PIN(34, B, 13), - __ES32F3_PIN(35, B, 14), - __ES32F3_PIN(36, B, 15), - __ES32F3_PIN(37, C, 6), - __ES32F3_PIN(38, C, 7), - __ES32F3_PIN(39, C, 8), - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN(46, A, 13), - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN(49, A, 14), - __ES32F3_PIN(50, A, 15), - __ES32F3_PIN(51, C, 10), - __ES32F3_PIN(52, C, 11), - __ES32F3_PIN(53, C, 12), - __ES32F3_PIN(54, D, 2), - __ES32F3_PIN(55, B, 3), - __ES32F3_PIN(56, B, 4), - __ES32F3_PIN(57, B, 5), - __ES32F3_PIN(58, B, 6), - __ES32F3_PIN(59, B, 7), - __ES32F3_PIN(60, H, 2), - __ES32F3_PIN(61, B, 8), - __ES32F3_PIN(62, B, 9), - __ES32F3_PIN_DEFAULT, - __ES32F3_PIN_DEFAULT, -}; struct pin_irq_map { rt_uint16_t pinbit; IRQn_Type irqno; }; + static const struct pin_irq_map pin_irq_map[] = { {GPIO_PIN_0, EXTI0_IRQn}, @@ -140,7 +73,151 @@ struct rt_pin_irq_hdr pin_irq_hdr_tab[] = { -1, 0, RT_NULL, RT_NULL}, { -1, 0, RT_NULL, RT_NULL}, { -1, 0, RT_NULL, RT_NULL}, -}; +}; + +#ifdef ES_CONF_EXTI_IRQ_0 + +RT_WEAK void irq_pin0_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 0\r\n"); +} +#endif + +#ifdef ES_CONF_EXTI_IRQ_1 + +RT_WEAK void irq_pin1_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 1\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_2 + + RT_WEAK void irq_pin2_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 2\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_3 + +RT_WEAK void irq_pin3_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 3\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_4 + +RT_WEAK void irq_pin4_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 4\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_5 + +RT_WEAK void irq_pin5_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 5\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_6 + +RT_WEAK void irq_pin6_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 6\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_7 + +RT_WEAK void irq_pin7_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 7\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_8 + +RT_WEAK void irq_pin8_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 8\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_9 + +RT_WEAK void irq_pin9_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 9\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_10 + +RT_WEAK void irq_pin10_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 10\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_11 + +RT_WEAK void irq_pin11_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 11\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_12 + +RT_WEAK void irq_pin12_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 12\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_13 + +RT_WEAK void irq_pin13_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 13\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_14 + +RT_WEAK void irq_pin14_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 14\r\n"); +} + +#endif + +#ifdef ES_CONF_EXTI_IRQ_15 + +RT_WEAK void irq_pin15_callback(void* arg) +{ + rt_kprintf("\r\nEXTI 15\r\n"); +} + +#endif + #define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) const struct pin_index *get_pin(uint8_t pin) @@ -200,8 +277,8 @@ void es32f3_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) gpio_initstruct.podrv = GPIO_OUT_DRIVE_1; gpio_initstruct.nodrv = GPIO_OUT_DRIVE_0_1; gpio_initstruct.type = GPIO_TYPE_CMOS; - gpio_initstruct.pupd = GPIO_FLOATING; - gpio_initstruct.odos = GPIO_PUSH_PULL; + gpio_initstruct.odos = GPIO_PUSH_PULL; + gpio_initstruct.flt = GPIO_FILTER_DISABLE; if (mode == PIN_MODE_OUTPUT) { @@ -364,7 +441,11 @@ rt_err_t es32f3_pin_irq_enable(struct rt_device *device, rt_base_t pin, ald_gpio_exti_init(index->gpio, index->pin, &exti_initstruct); /* Configure GPIO_InitStructure */ gpio_initstruct.mode = GPIO_MODE_INPUT; - gpio_initstruct.func = GPIO_FUNC_1; + gpio_initstruct.odos = GPIO_PUSH_PULL; + gpio_initstruct.podrv = GPIO_OUT_DRIVE_1; + gpio_initstruct.nodrv = GPIO_OUT_DRIVE_1; + gpio_initstruct.func = GPIO_FUNC_1; + gpio_initstruct.flt = GPIO_FILTER_DISABLE; switch (pin_irq_hdr_tab[irqindex].mode) { case PIN_IRQ_MODE_RISING: @@ -408,18 +489,9 @@ const static struct rt_pin_ops _es32f3_pin_ops = es32f3_pin_attach_irq, es32f3_pin_detach_irq, es32f3_pin_irq_enable, - RT_NULL, + /*RT_NULL,*/ }; -int rt_hw_pin_init(void) -{ - int result; - ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE); - result = rt_device_pin_register("pin", &_es32f3_pin_ops, RT_NULL); - return result; -} -INIT_BOARD_EXPORT(rt_hw_pin_init); - rt_inline void pin_irq_hdr(uint16_t GPIO_Pin) { uint16_t irqno; @@ -560,4 +632,44 @@ void EXTI15_Handler(void) rt_interrupt_leave(); } +int rt_hw_pin_init(void) +{ + int result; + + +#ifdef ES_INIT_GPIOS + + rt_size_t i,gpio_conf_num = sizeof(gpio_conf_all) / sizeof(gpio_conf_t); + +#endif + + ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE); + + result = rt_device_pin_register(ES_DEVICE_NAME_PIN, &_es32f3_pin_ops, RT_NULL); + + if(result != RT_EOK)return result; + +#ifdef ES_INIT_GPIOS + + for(i = 0;i < gpio_conf_num;i++) + { + rt_pin_mode( gpio_conf_all[i].pin,gpio_conf_all[i].pin_mode); + + if((gpio_conf_all[i].pin_mode == ES_C_GPIO_MODE_OUTPUT)||(gpio_conf_all[i].pin_mode == ES_C_GPIO_MODE_OUTPUT_OD)) + rt_pin_write(gpio_conf_all[i].pin,gpio_conf_all[i].pin_level); + + if(!gpio_conf_all[i].irq_en)continue; + + rt_pin_attach_irq(gpio_conf_all[i].pin, gpio_conf_all[i].irq_mode, gpio_conf_all[i].callback, RT_NULL); + rt_pin_irq_enable(gpio_conf_all[i].pin, gpio_conf_all[i].irq_en); + } + +#endif + + + + return result; +} +INIT_BOARD_EXPORT(rt_hw_pin_init); + #endif diff --git a/bsp/essemi/es32f369x/drivers/drv_gpio.h b/bsp/essemi/es32f369x/drivers/drv_gpio.h index fef8fb8487..8489e625d5 100644 --- a/bsp/essemi/es32f369x/drivers/drv_gpio.h +++ b/bsp/essemi/es32f369x/drivers/drv_gpio.h @@ -3,14 +3,29 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_GPIO_H__ #define DRV_GPIO_H__ +#include "es_conf_info_gpio.h" + int rt_hw_pin_init(void); #endif diff --git a/bsp/essemi/es32f369x/drivers/drv_hwtimer.c b/bsp/essemi/es32f369x/drivers/drv_hwtimer.c index f693137ae7..e0fd46a36b 100644 --- a/bsp/essemi/es32f369x/drivers/drv_hwtimer.c +++ b/bsp/essemi/es32f369x/drivers/drv_hwtimer.c @@ -1,21 +1,33 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes * 2019-3-19 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include #include #include -#include -#include -#include +#include + #ifdef RT_USING_HWTIMER @@ -26,53 +38,167 @@ struct es32f3_hwtimer_dev IRQn_Type IRQn; }; -#ifdef BSP_USING_HWTIMER0 -static struct es32f3_hwtimer_dev hwtimer0; +#ifdef BSP_USING_AD16C4T0_HWTIMER +static struct es32f3_hwtimer_dev ad16c4t0_hwtimer; + +static struct rt_hwtimer_info ad16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_AD16C4T0_HWTIMER_MODE +}; + +void AD16C4T0_UP_Handler(void) +{ + ald_timer_clear_flag_status(ad16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&ad16c4t0_hwtimer.parent); +} + +#endif + +#ifdef BSP_USING_AD16C4T1_HWTIMER + +static struct es32f3_hwtimer_dev ad16c4t1_hwtimer; + +static struct rt_hwtimer_info ad16c4t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_AD16C4T1_HWTIMER_MODE +}; + +void AD16C4T1_UP_Handler(void) +{ + ald_timer_clear_flag_status(ad16c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&ad16c4t1_hwtimer.parent); +} + +#endif +#ifdef BSP_USING_GP32C4T0_HWTIMER + +static struct es32f3_hwtimer_dev gp32c4t0_hwtimer; + +static struct rt_hwtimer_info gp32c4t0_info = +{ + + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV , /* maximum count frequency */ + ( ES_SYS_CLK >> ES_CMU_PCLK_1_DIV )/(1U<<16), /* minimum count frequency */ + 0xFFFFFFFF, /* counter maximum value */ + ES_GP32C4T0_HWTIMER_MODE +}; + +void GP32C4T0_Handler(void) +{ + ald_timer_clear_flag_status(gp32c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp32c4t0_hwtimer.parent); +} + +#endif +#ifdef BSP_USING_GP32C4T1_HWTIMER + +static struct es32f3_hwtimer_dev gp32c4t1_hwtimer; + +static struct rt_hwtimer_info gp32c4t1_info = +{ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV ), /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV )/(1U<<16), /* minimum count frequency */ + 0xFFFFFFFF, /* counter maximum value */ + ES_GP32C4T1_HWTIMER_MODE +}; + +void GP32C4T1_Handler(void) +{ + ald_timer_clear_flag_status(gp32c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp32c4t1_hwtimer.parent); +} + +#endif +#ifdef BSP_USING_GP16C4T0_HWTIMER + +static struct es32f3_hwtimer_dev gp16c4t0_hwtimer; + +static struct rt_hwtimer_info gp16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C4T0_HWTIMER_MODE +}; + +void GP16C4T0_Handler(void) +{ + ald_timer_clear_flag_status(gp16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp16c4t0_hwtimer.parent); +} + +#endif +#ifdef BSP_USING_GP16C4T1_HWTIMER + +static struct es32f3_hwtimer_dev gp16c4t1_hwtimer; + +static struct rt_hwtimer_info gp16c4t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C4T1_HWTIMER_MODE +}; + +void GP16C4T1_Handler(void) +{ + ald_timer_clear_flag_status(gp16c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&gp16c4t1_hwtimer.parent); +} + +#endif +#ifdef BSP_USING_BS16T0_HWTIMER + +static struct es32f3_hwtimer_dev bs16t0_hwtimer; + +static struct rt_hwtimer_info bs16t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T0_HWTIMER_MODE +}; void BS16T0_Handler(void) { - ald_timer_clear_flag_status(hwtimer0.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&hwtimer0.parent); - - if (HWTIMER_MODE_ONESHOT == hwtimer0.parent.mode) - { - ald_timer_base_stop(hwtimer0.hwtimer_periph); - } + ald_timer_clear_flag_status(bs16t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&bs16t0_hwtimer.parent); } -#endif -#ifdef BSP_USING_HWTIMER1 -static struct es32f3_hwtimer_dev hwtimer1; -/* can not use when UART2 Handler is enabled */ +#endif +#ifdef BSP_USING_BS16T1_HWTIMER + +static struct es32f3_hwtimer_dev bs16t1_hwtimer; + +static struct rt_hwtimer_info bs16t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T1_HWTIMER_MODE +}; + void BS16T1_Handler(void) { - /* if BS16T1 it */ - if (ald_timer_get_it_status(hwtimer1.hwtimer_periph, TIMER_IT_UPDATE) && - ald_timer_get_flag_status(hwtimer1.hwtimer_periph, TIMER_FLAG_UPDATE)) - { - ald_timer_clear_flag_status(hwtimer1.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&hwtimer1.parent); - - if (HWTIMER_MODE_ONESHOT == hwtimer1.parent.mode) - { - ald_timer_base_stop(hwtimer1.hwtimer_periph); - } - } + ald_timer_clear_flag_status(bs16t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); + rt_device_hwtimer_isr(&bs16t1_hwtimer.parent); } -#endif -static struct rt_hwtimer_info es32f3_hwtimer_info = -{ - 96000000, /* maximum count frequency */ - 1, /* minimum count frequency */ - 65535, /* counter maximum value */ - HWTIMER_CNTMODE_UP -}; +#endif static void es32f3_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) { struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; + struct rt_hwtimer_info *hwtimer_info = (struct rt_hwtimer_info *)timer->info; + + RT_ASSERT(hwtimer != RT_NULL); if (1 == state) @@ -81,19 +207,21 @@ static void es32f3_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) ald_timer_interrupt_config(hwtimer->hwtimer_periph, TIMER_IT_UPDATE, ENABLE); NVIC_EnableIRQ(hwtimer->IRQn); } - hwtimer->parent.freq = ald_cmu_get_pclk1_clock(); - es32f3_hwtimer_info.maxfreq = ald_cmu_get_pclk1_clock(); - es32f3_hwtimer_info.minfreq = ald_cmu_get_pclk1_clock(); + + hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); + hwtimer_info->maxfreq = hwtimer->parent.freq; + hwtimer_info->minfreq = (hwtimer->parent.freq)/0xFFFF; + } static rt_err_t es32f3_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) { - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; + struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; RT_ASSERT(hwtimer != RT_NULL); - + WRITE_REG(hwtimer->hwtimer_periph->perh->AR, cnt); ald_timer_base_start(hwtimer->hwtimer_periph); @@ -135,10 +263,37 @@ static rt_err_t es32f3_hwtimer_control(rt_hwtimer_t *timer, { case HWTIMER_CTRL_FREQ_SET: freq = *(rt_uint32_t *)args; - if (freq != ald_cmu_get_pclk1_clock()) - { - ret = -RT_ERROR; + + ret = -RT_ERROR; + + if(freq) + { + double temp,target; + temp = (double)ald_cmu_get_pclk1_clock(); + target = temp/freq; + + if(target < 0x10001) /*最大分频 = max(PRES)+1*/ + { + temp = target - (int)(target); + + if((temp > 0.998)&&(target < 0x10000)) + { + hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target; + ret = RT_EOK; + } + if((temp < 0.002)&&(target >= 0x1)) + { + hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target - 1; + ret = RT_EOK; + } + + } + + if(ret == RT_EOK) /*更新信息*/ + hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); + } + break; case HWTIMER_CTRL_STOP: @@ -166,24 +321,124 @@ int rt_hw_hwtimer_init(void) { rt_err_t ret = RT_EOK; -#ifdef BSP_USING_HWTIMER0 - static timer_handle_t _hwtimer_periph0; - _hwtimer_periph0.perh = BS16T0; - hwtimer0.IRQn = BS16T0_IRQn; - hwtimer0.hwtimer_periph = &_hwtimer_periph0; - hwtimer0.parent.info = &es32f3_hwtimer_info; - hwtimer0.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer0.parent, "timer0", &hwtimer0); +#ifdef BSP_USING_AD16C4T0_HWTIMER + static timer_handle_t ad16c4t0_hwtimer_periph; + + ad16c4t0_hwtimer_periph.perh = AD16C4T0; + ad16c4t0_hwtimer.IRQn = AD16C4T0_UP_IRQn; + + ad16c4t0_hwtimer_periph.init.prescaler = ES_AD16C4T0_HWTIMER_PRES - 1; + ad16c4t0_hwtimer_periph.init.mode = ( ES_AD16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + ad16c4t0_hwtimer.hwtimer_periph = &ad16c4t0_hwtimer_periph; + + ad16c4t0_hwtimer.parent.info = &ad16c4t0_info; + ad16c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&ad16c4t0_hwtimer.parent, ES_DEVICE_NAME_AD16C4T0_HWTIMER, &ad16c4t0_hwtimer); #endif -#ifdef BSP_USING_HWTIMER1 - static timer_handle_t _hwtimer_periph1; - _hwtimer_periph1.perh = BS16T1; - hwtimer1.IRQn = BS16T1_IRQn; - hwtimer1.hwtimer_periph = &_hwtimer_periph1; - hwtimer1.parent.info = &es32f3_hwtimer_info; - hwtimer1.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer1.parent, "timer1", &hwtimer1); +#ifdef BSP_USING_AD16C4T1_HWTIMER + static timer_handle_t ad16c4t1_hwtimer_periph; + + ad16c4t1_hwtimer_periph.perh = AD16C4T1; + ad16c4t1_hwtimer.IRQn = AD16C4T1_UP_IRQn; + + ad16c4t1_hwtimer_periph.init.prescaler = ES_AD16C4T1_HWTIMER_PRES - 1; + ad16c4t1_hwtimer_periph.init.mode = ( ES_AD16C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + ad16c4t1_hwtimer.hwtimer_periph = &ad16c4t1_hwtimer_periph; + + ad16c4t1_hwtimer.parent.info = &ad16c4t1_info; + ad16c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&ad16c4t1_hwtimer.parent, ES_DEVICE_NAME_AD16C4T1_HWTIMER, &ad16c4t1_hwtimer); +#endif + +#ifdef BSP_USING_GP32C4T0_HWTIMER + static timer_handle_t gp32c4t0_hwtimer_periph; + + gp32c4t0_hwtimer_periph.perh = GP32C4T0; + gp32c4t0_hwtimer.IRQn = GP32C4T0_IRQn; + + gp32c4t0_hwtimer_periph.init.prescaler = ES_GP32C4T0_HWTIMER_PRES - 1; + gp32c4t0_hwtimer_periph.init.mode = ( ES_GP32C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp32c4t0_hwtimer.hwtimer_periph = &gp32c4t0_hwtimer_periph; + + gp32c4t0_hwtimer.parent.info = &gp32c4t0_info; + gp32c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp32c4t0_hwtimer.parent, ES_DEVICE_NAME_GP32C4T0_HWTIMER, &gp32c4t0_hwtimer); +#endif + +#ifdef BSP_USING_GP32C4T1_HWTIMER + static timer_handle_t gp32c4t1_hwtimer_periph; + + gp32c4t1_hwtimer_periph.perh = GP32C4T1; + gp32c4t1_hwtimer.IRQn = GP32C4T1_IRQn; + + gp32c4t1_hwtimer_periph.init.prescaler = ES_GP32C4T1_HWTIMER_PRES - 1; + gp32c4t1_hwtimer_periph.init.mode = ( ES_GP32C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp32c4t1_hwtimer.hwtimer_periph = &gp32c4t1_hwtimer_periph; + + gp32c4t1_hwtimer.parent.info = &gp32c4t1_info; + gp32c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp32c4t1_hwtimer.parent, ES_DEVICE_NAME_GP32C4T1_HWTIMER, &gp32c4t1_hwtimer); +#endif + +#ifdef BSP_USING_GP16C4T0_HWTIMER + static timer_handle_t gp16c4t0_hwtimer_periph; + + gp16c4t0_hwtimer_periph.perh = GP16C4T0; + gp16c4t0_hwtimer.IRQn = GP16C4T0_IRQn; + + gp16c4t0_hwtimer_periph.init.prescaler = ES_GP16C4T0_HWTIMER_PRES - 1; + gp16c4t0_hwtimer_periph.init.mode = ( ES_GP16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t0_hwtimer.hwtimer_periph = &gp16c4t0_hwtimer_periph; + + gp16c4t0_hwtimer.parent.info = &gp16c4t0_info; + gp16c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp16c4t0_hwtimer.parent, ES_DEVICE_NAME_GP16C4T0_HWTIMER, &gp16c4t0_hwtimer); +#endif + +#ifdef BSP_USING_GP16C4T1_HWTIMER + static timer_handle_t gp16c4t1_hwtimer_periph; + + gp16c4t1_hwtimer_periph.perh = GP16C4T1; + gp16c4t1_hwtimer.IRQn = GP16C4T1_IRQn; + + gp16c4t1_hwtimer_periph.init.prescaler = ES_GP16C4T1_HWTIMER_PRES - 1; + gp16c4t1_hwtimer_periph.init.mode = ( ES_GP16C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t1_hwtimer.hwtimer_periph = &gp16c4t1_hwtimer_periph; + + gp16c4t1_hwtimer.parent.info = &gp16c4t1_info; + gp16c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&gp16c4t1_hwtimer.parent, ES_DEVICE_NAME_GP16C4T1_HWTIMER, &gp16c4t1_hwtimer); +#endif + +#ifdef BSP_USING_BS16T0_HWTIMER + static timer_handle_t bs16t0_hwtimer_periph; + + bs16t0_hwtimer_periph.perh = BS16T0; + bs16t0_hwtimer.IRQn = BS16T0_IRQn; + + bs16t0_hwtimer_periph.init.prescaler = ES_BS16T0_HWTIMER_PRES - 1; + bs16t0_hwtimer_periph.init.mode = ( ES_BS16T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t0_hwtimer.hwtimer_periph = &bs16t0_hwtimer_periph; + + bs16t0_hwtimer.parent.info = &bs16t0_info; + bs16t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&bs16t0_hwtimer.parent, ES_DEVICE_NAME_BS16T0_HWTIMER, &bs16t0_hwtimer); +#endif + +#ifdef BSP_USING_BS16T1_HWTIMER + static timer_handle_t bs16t1_hwtimer_periph; + + bs16t1_hwtimer_periph.perh = BS16T1; + bs16t1_hwtimer.IRQn = BS16T1_IRQn; + + bs16t1_hwtimer_periph.init.prescaler = ES_BS16T1_HWTIMER_PRES - 1; + bs16t1_hwtimer_periph.init.mode = ( ES_BS16T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t1_hwtimer.hwtimer_periph = &bs16t1_hwtimer_periph; + + bs16t1_hwtimer.parent.info = &bs16t1_info; + bs16t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; + ret = rt_device_hwtimer_register(&bs16t1_hwtimer.parent, ES_DEVICE_NAME_BS16T1_HWTIMER, &bs16t1_hwtimer); #endif return ret; diff --git a/bsp/essemi/es32f369x/drivers/drv_hwtimer.h b/bsp/essemi/es32f369x/drivers/drv_hwtimer.h index e18d580fbd..46e307a5c3 100644 --- a/bsp/essemi/es32f369x/drivers/drv_hwtimer.h +++ b/bsp/essemi/es32f369x/drivers/drv_hwtimer.h @@ -3,14 +3,28 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-3-19 wangyq the first version + * 2019-3-19 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_HWTIMER_H__ #define DRV_HWTIMER_H__ +#include "es_conf_info_hwtimer.h" int rt_hw_hwtimer_init(void); #endif diff --git a/bsp/essemi/es32f369x/drivers/drv_i2c.c b/bsp/essemi/es32f369x/drivers/drv_i2c.c index 207890a6d4..c398d5ab45 100644 --- a/bsp/essemi/es32f369x/drivers/drv_i2c.c +++ b/bsp/essemi/es32f369x/drivers/drv_i2c.c @@ -1,12 +1,24 @@ /* - * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: - * Date Author Notes - * 2020-01-14 wangyq the first version - * 2019-11-01 wangyq update libraries + * Date Author Notes + * 2019-11-01 wangyq update libraries + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #include @@ -14,9 +26,7 @@ #include #include "board.h" #include "drv_i2c.h" -#include -#include -#include + #ifdef RT_USING_I2C @@ -43,36 +53,58 @@ static void _i2c_init(void) gpio_instruct.nodrv = GPIO_OUT_DRIVE_0_1; gpio_instruct.flt = GPIO_FILTER_DISABLE; gpio_instruct.type = GPIO_TYPE_CMOS; - gpio_instruct.func = GPIO_FUNC_5; + + +#ifdef BSP_USING_I2C0 + +#if defined(ES_I2C0_SCL_GPIO_FUNC)&&defined(ES_I2C0_SCL_GPIO_PORT)&&defined(ES_I2C0_SCL_GPIO_PIN) + gpio_instruct.func = ES_I2C0_SCL_GPIO_FUNC; + ald_gpio_init(ES_I2C0_SCL_GPIO_PORT, ES_I2C0_SCL_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_I2C0_SDA_GPIO_FUNC)&&defined(ES_I2C0_SDA_GPIO_PORT)&&defined(ES_I2C0_SDA_GPIO_PIN) + gpio_instruct.func = ES_I2C0_SDA_GPIO_FUNC; + ald_gpio_init(ES_I2C0_SDA_GPIO_PORT, ES_I2C0_SDA_GPIO_PIN, &gpio_instruct); +#endif -#ifdef BSP_USING_I2C0 /* Initialize I2C Function */ - _h_i2c0.perh = I2C0; - _h_i2c0.init.clk_speed = 100000; - _h_i2c0.init.own_addr1 = 0x0A; - _h_i2c0.init.addr_mode = I2C_ADDR_7BIT; - _h_i2c0.init.general_call = I2C_GENERALCALL_DISABLE; - _h_i2c0.init.no_stretch = I2C_NOSTRETCH_ENABLE; + _h_i2c0.perh = I2C0; + _h_i2c0.init.module = I2C_MODULE_MASTER; + _h_i2c0.init.clk_speed = ES_I2C0_CLK_SPEED; + _h_i2c0.init.own_addr1 = ES_I2C0_OWN_ADDR1; + _h_i2c0.init.addr_mode = ES_I2C0_ADDR_MODE; + _h_i2c0.init.general_call = ES_I2C0_GENERAL_CALL; + _h_i2c0.init.no_stretch = ES_I2C0_STRETCH; ald_i2c_reset(&_h_i2c0); ald_i2c_init(&_h_i2c0); - /* PB06->I2C0_SCL, PB07->I2C0_SDA */ - ald_gpio_init(GPIOB, GPIO_PIN_6 | GPIO_PIN_7, &gpio_instruct); + #endif -#ifdef BSP_USING_I2C1 +#ifdef BSP_USING_I2C1 + +#if defined(ES_I2C1_SDA_GPIO_FUNC)&&defined(ES_I2C1_SDA_GPIO_PORT)&&defined(ES_I2C1_SDA_GPIO_PIN) + gpio_instruct.func = ES_I2C1_SDA_GPIO_FUNC; + ald_gpio_init(ES_I2C1_SDA_GPIO_PORT, ES_I2C1_SDA_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_I2C1_SDA_GPIO_FUNC)&&defined(ES_I2C1_SDA_GPIO_PORT)&&defined(ES_I2C1_SDA_GPIO_PIN) + gpio_instruct.func = ES_I2C1_SDA_GPIO_FUNC; + ald_gpio_init(ES_I2C1_SDA_GPIO_PORT, ES_I2C1_SDA_GPIO_PIN, &gpio_instruct); +#endif + /* Initialize i2c function */ - _h_i2c1.perh = I2C1; - _h_i2c1.init.clk_speed = 100000; - _h_i2c1.init.own_addr1 = 0xA0; - _h_i2c1.init.addr_mode = I2C_ADDR_7BIT; - _h_i2c1.init.general_call = I2C_GENERALCALL_DISABLE; - _h_i2c1.init.no_stretch = I2C_NOSTRETCH_ENABLE; + _h_i2c1.perh = I2C1; + _h_i2c1.init.module = I2C_MODULE_MASTER; + _h_i2c1.init.clk_speed = ES_I2C1_CLK_SPEED; + _h_i2c1.init.own_addr1 = ES_I2C1_OWN_ADDR1; + _h_i2c1.init.addr_mode = ES_I2C1_ADDR_MODE; + _h_i2c1.init.general_call = ES_I2C1_GENERAL_CALL; + _h_i2c1.init.no_stretch = ES_I2C1_STRETCH; ald_i2c_reset(&_h_i2c1); ald_i2c_init(&_h_i2c1); - /* PA05->I2C1_SCL, PA06->I2C1_SDA */ - ald_gpio_init(GPIOA, GPIO_PIN_5 | GPIO_PIN_6, &gpio_instruct); + #endif } @@ -133,7 +165,7 @@ int rt_hw_i2c_init(void) _i2c_device0.ops = &es32f3_i2c_ops; _i2c_device0.priv = &_h_i2c0; - result = rt_i2c_bus_device_register(&_i2c_device0, "i2c0"); + result = rt_i2c_bus_device_register(&_i2c_device0, ES_DEVICE_NAME_I2C0); if (result != RT_EOK) { return result; @@ -147,7 +179,7 @@ int rt_hw_i2c_init(void) _i2c_device1.ops = &es32f3_i2c_ops; _i2c_device1.priv = &_h_i2c1; - rt_i2c_bus_device_register(&_i2c_device1, "i2c1"); + rt_i2c_bus_device_register(&_i2c_device1, ES_DEVICE_NAME_I2C1); if (result != RT_EOK) { return result; diff --git a/bsp/essemi/es32f369x/drivers/drv_i2c.h b/bsp/essemi/es32f369x/drivers/drv_i2c.h index d7c2410682..16bfa324d3 100644 --- a/bsp/essemi/es32f369x/drivers/drv_i2c.h +++ b/bsp/essemi/es32f369x/drivers/drv_i2c.h @@ -1,16 +1,31 @@ /* * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_I2C_H__ #define DRV_I2C_H__ +#include "es_conf_info_i2c.h" + int rt_hw_i2c_init(void); #endif diff --git a/bsp/essemi/es32f369x/drivers/drv_pm.c b/bsp/essemi/es32f369x/drivers/drv_pm.c index ffe46ff6f3..5ec1c8c701 100644 --- a/bsp/essemi/es32f369x/drivers/drv_pm.c +++ b/bsp/essemi/es32f369x/drivers/drv_pm.c @@ -3,16 +3,27 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2020-12-15 liuhy the first version */ -#include "drv_pm.h" +#include "drv_pm.h" #ifdef RT_USING_PM -//uint32_t save_mem[1024] __attribute__ ((aligned(4))); void save_register(void *p_head,uint32_t size,void *p_save) { @@ -21,15 +32,17 @@ void save_register(void *p_head,uint32_t size,void *p_save) void load_register(void *p_head,uint32_t size,void *p_load) { - uint32_t tmp; memcpy(p_head,p_load,size); - + +#ifdef ES_PMU_SAVE_LOAD_UART + if((p_head == UART0) || (p_head == UART1) || (p_head == UART2) || (p_head == UART3) || (p_head == UART4) || (p_head == UART5) ) { - tmp = ((UART_TypeDef*)p_load)->IVS; - ((UART_TypeDef*)p_head)->IER = tmp; + ((UART_TypeDef*)p_head)->IER = ((UART_TypeDef*)p_load)->IVS; } +#endif + } static void uart_console_reconfig(void) @@ -39,36 +52,14 @@ static void uart_console_reconfig(void) rt_device_control(rt_console_get_device(), RT_DEVICE_CTRL_CONFIG, &config); } -static void delay(void) -{ - long i; - rt_base_t level; - - level = rt_hw_interrupt_disable(); - i = 0; - do{ - i++; - } - while (i < 4000000); - - rt_hw_interrupt_enable(level); -} - /** * This function will put ES32F369x into sleep mode. * * @param pm pointer to power manage structure */ -struct pm_callback_t -{ - volatile int in_fun_times; /*进入函数的次数*/ - volatile char flag; /*标志*/ - volatile int mode; /*需要打印的模式*/ -}; - -extern volatile struct pm_callback_t g_pm_data; +/* 注意:进入睡眠前,如果有中断挂起(SYSTICK、PENDSV、UART、EXTI等),睡眠将被瞬间唤醒。*/ static void sleep(struct rt_pm *pm, uint8_t mode) { @@ -83,26 +74,21 @@ static void sleep(struct rt_pm *pm, uint8_t mode) case PM_SLEEP_MODE_LIGHT: /* Enter SLEEP Mode, Main regulator is ON */ ald_pmu_stop1_enter(); - delay(); - break; case PM_SLEEP_MODE_DEEP: - /* Enter STOP 2 mode */ + /* Enter STOP 2 mode */ ald_pmu_stop2_enter(); - delay(); break; case PM_SLEEP_MODE_STANDBY: - /* Enter STANDBY mode */ + /* Enter STANDBY mode */ ald_pmu_stop2_enter(); - delay(); break; case PM_SLEEP_MODE_SHUTDOWN: - /* Enter SHUTDOWNN mode */ + /* Enter SHUTDOWNN mode */ ald_pmu_stop2_enter(); - delay(); break; default: diff --git a/bsp/essemi/es32f369x/drivers/drv_pm.h b/bsp/essemi/es32f369x/drivers/drv_pm.h index 56de29eef5..874f86ed08 100644 --- a/bsp/essemi/es32f369x/drivers/drv_pm.h +++ b/bsp/essemi/es32f369x/drivers/drv_pm.h @@ -3,9 +3,22 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-04-01 wangyq the first version + * 2019-04-01 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_PM_H__ @@ -14,9 +27,8 @@ #include #include #include -#include -#include -#include "shell.h" +#include "es_conf_info_pm.h" +#include int rt_hw_pm_init(void); diff --git a/bsp/essemi/es32f369x/drivers/drv_pwm.c b/bsp/essemi/es32f369x/drivers/drv_pwm.c index e033e47cec..b61e363633 100644 --- a/bsp/essemi/es32f369x/drivers/drv_pwm.c +++ b/bsp/essemi/es32f369x/drivers/drv_pwm.c @@ -3,28 +3,33 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-03-11 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include #include #include -#include -#include -#include +#include "es_conf_info_pwm.h" -static void pwm_set_freq(timer_handle_t *timer_initstruct, uint32_t ns) -{ - uint64_t _arr = (uint64_t)ald_cmu_get_pclk1_clock() * ns / 1000000000 / - (timer_initstruct->init.prescaler + 1); - WRITE_REG(timer_initstruct->perh->AR, (uint32_t)_arr); - timer_initstruct->init.period = (uint32_t)_arr; -} +#ifdef RT_USING_PWM static void pwm_set_duty(timer_handle_t *timer_initstruct, timer_channel_t ch, uint32_t ns) { @@ -44,37 +49,40 @@ static void pwm_set_duty(timer_handle_t *timer_initstruct, timer_channel_t ch, u static rt_err_t es32f3_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) { rt_err_t ret = RT_EOK; - uint32_t _ccep; + uint64_t _arr,bus_speed,tmp; + uint32_t _maxcnt,_ccep_ch_en = 0U; timer_channel_t pwm_channel; timer_oc_init_t tim_ocinit; timer_handle_t *timer_initstruct = (timer_handle_t *)device->parent.user_data; struct rt_pwm_configuration *cfg = (struct rt_pwm_configuration *)arg; RT_ASSERT(timer_initstruct != RT_NULL); - - tim_ocinit.oc_mode = TIMER_OC_MODE_PWM1; - tim_ocinit.oc_polarity = TIMER_OC_POLARITY_HIGH; - tim_ocinit.oc_fast_en = DISABLE; - tim_ocinit.ocn_polarity = TIMER_OCN_POLARITY_HIGH; - tim_ocinit.ocn_idle = TIMER_OCN_IDLE_RESET; - tim_ocinit.oc_idle = TIMER_OC_IDLE_RESET; - + + /* select pwm output channel */ if (1 == cfg->channel) + { pwm_channel = TIMER_CHANNEL_1; - - else if (2 == cfg->channel) + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC1EN_MSK; + } + else if (2 == cfg->channel) + { pwm_channel = TIMER_CHANNEL_2; - - else if (3 == cfg->channel) + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC2EN_MSK; + } + else if (3 == cfg->channel) + { pwm_channel = TIMER_CHANNEL_3; - - else if (4 == cfg->channel) + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC3EN_MSK; + } + else if (4 == cfg->channel) + { pwm_channel = TIMER_CHANNEL_4; - + _ccep_ch_en = timer_initstruct->perh->CCEP & TIMER_CCEP_CC4EN_MSK; + } else return RT_EINVAL; - + switch (cmd) { case PWM_CMD_ENABLE: @@ -86,19 +94,53 @@ static rt_err_t es32f3_pwm_control(struct rt_device_pwm *device, int cmd, void * break; case PWM_CMD_SET: - _ccep = timer_initstruct->perh->CCEP; - /* count registers max 0xFFFF, auto adjust prescaler */ + + /*当通道没开的时候:关通道,设置输出模式和极性,初始化通道*/ + if(!_ccep_ch_en) + { + tim_ocinit.oc_mode = ES_PWM_OC_MODE; + tim_ocinit.oc_polarity = ES_PWM_OC_POLARITY; + tim_ocinit.oc_fast_en = DISABLE; + tim_ocinit.ocn_polarity = TIMER_OCN_POLARITY_HIGH; + tim_ocinit.ocn_idle = TIMER_OCN_IDLE_RESET; + tim_ocinit.oc_idle = TIMER_OC_IDLE_RESET; + + ald_timer_oc_config_channel(timer_initstruct, &tim_ocinit, pwm_channel); + } + + bus_speed = (uint64_t)ald_cmu_get_pclk1_clock(); + + /*判断外设的计数器最大值*/ +#ifdef ES32F36xx + if((timer_initstruct->perh == GP32C4T0)||(timer_initstruct->perh == GP32C4T1)) + { + _maxcnt = 0xFFFFFFFF; + } + else _maxcnt = 0xFFFF; +#else + _maxcnt = 0xFFFF; +#endif + + /*当最大分频 <= _maxcnt时:估计大概的分频,加快速度 */ + tmp = bus_speed * (cfg->period)/1000000000/_maxcnt; + timer_initstruct->init.prescaler = (tmp > 2U) ? (tmp - 2U) : 0U ; /*bus_speed < 500000000*/ + + /* count registers max , auto adjust prescaler */ do { - pwm_set_freq(timer_initstruct, cfg->period); - timer_initstruct->init.prescaler ++; + _arr = bus_speed * (cfg->period) / 1000000000 /(++timer_initstruct->init.prescaler); + } - while (timer_initstruct->init.period > 0xFFFF); + while (_arr > _maxcnt); + + WRITE_REG(timer_initstruct->perh->AR, (uint32_t)_arr); + timer_initstruct->init.period = (uint32_t)_arr; + /* update prescaler */ WRITE_REG(timer_initstruct->perh->PRES, --timer_initstruct->init.prescaler); - ald_timer_oc_config_channel(timer_initstruct, &tim_ocinit, pwm_channel); + pwm_set_duty(timer_initstruct, pwm_channel, cfg->pulse); - timer_initstruct->perh->CCEP = _ccep; + break; case PWM_CMD_GET: @@ -130,42 +172,210 @@ int rt_hw_pwm_init(void) gpio_initstructure.flt = GPIO_FILTER_DISABLE; gpio_initstructure.type = GPIO_TYPE_TTL; -#ifdef BSP_USING_PWM0 /* 4 channels */ - static struct rt_device_pwm pwm_dev0; - static timer_handle_t timer_initstruct0; +#ifdef BSP_USING_AD16C4T0_PWM /* 4 channels */ + static struct rt_device_pwm ad16c4t0_pwm_dev; + static timer_handle_t ad16c4t0_timer_initstruct; - timer_initstruct0.perh = GP16C4T0; - ald_timer_pwm_init(&timer_initstruct0); + ad16c4t0_timer_initstruct.perh = AD16C4T0; + ald_timer_pwm_init(&ad16c4t0_timer_initstruct); /* gpio initialization */ - gpio_initstructure.func = GPIO_FUNC_2; - ald_gpio_init(GPIOB, GPIO_PIN_6, &gpio_initstructure); - ald_gpio_init(GPIOB, GPIO_PIN_7, &gpio_initstructure); - ald_gpio_init(GPIOB, GPIO_PIN_8, &gpio_initstructure); - ald_gpio_init(GPIOB, GPIO_PIN_9, &gpio_initstructure); - ret = rt_device_pwm_register(&pwm_dev0, "pwm0", &es32f3_pwm_ops, - &timer_initstruct0); +#if defined(ES_AD16C4T0_CH1_GPIO_FUNC)&&defined(ES_AD16C4T0_CH1_GPIO_PORT)&&defined(ES_AD16C4T0_CH1_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T0_CH1_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH1_GPIO_PORT, ES_AD16C4T0_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T0_CH2_GPIO_FUNC)&&defined(ES_AD16C4T0_CH2_GPIO_PORT)&&defined(ES_AD16C4T0_CH2_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T0_CH2_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH2_GPIO_PORT, ES_AD16C4T0_CH2_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T0_CH3_GPIO_FUNC)&&defined(ES_AD16C4T0_CH3_GPIO_PORT)&&defined(ES_AD16C4T0_CH3_GPIO_FUNC) + gpio_initstructure.func = ES_AD16C4T0_CH3_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH3_GPIO_PORT, ES_AD16C4T0_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T0_CH4_GPIO_FUNC)&&defined(ES_AD16C4T0_CH4_GPIO_PORT)&&defined(ES_AD16C4T0_CH4_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T0_CH4_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T0_CH4_GPIO_PORT, ES_AD16C4T0_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&ad16c4t0_pwm_dev, ES_DEVICE_NAME_AD16C4T0_PWM, &es32f3_pwm_ops, + &ad16c4t0_timer_initstruct); #endif -#ifdef BSP_USING_PWM1 /* 4 channels */ - static struct rt_device_pwm pwm_dev1; - static timer_handle_t timer_initstruct1; +#ifdef BSP_USING_AD16C4T1_PWM /* 4 channels */ + static struct rt_device_pwm ad16c4t1_pwm_dev; + static timer_handle_t ad16c4t1_timer_initstruct; - timer_initstruct1.perh = GP16C4T1; - ald_timer_pwm_init(&timer_initstruct1); + ad16c4t1_timer_initstruct.perh = AD16C4T1; + ald_timer_pwm_init(&ad16c4t1_timer_initstruct); /* gpio initialization */ - gpio_initstructure.func = GPIO_FUNC_5; - ald_gpio_init(GPIOA, GPIO_PIN_0, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_1, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_2, &gpio_initstructure); - ald_gpio_init(GPIOA, GPIO_PIN_3, &gpio_initstructure); + +#if defined(ES_AD16C4T1_CH1_GPIO_FUNC)&&defined(ES_AD16C4T1_CH1_GPIO_PORT)&&defined(ES_AD16C4T1_CH1_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T1_CH1_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T1_CH1_GPIO_PORT, ES_AD16C4T1_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T1_CH2_GPIO_FUNC)&&defined(ES_AD16C4T1_CH2_GPIO_PORT)&&defined(ES_AD16C4T1_CH2_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T1_CH2_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T1_CH2_GPIO_PORT, ES_AD16C4T1_CH2_GPIO_PIN, &gpio_initstructure); +#endif - ret = rt_device_pwm_register(&pwm_dev1, "pwm1", &es32f3_pwm_ops, - &timer_initstruct1); +#if defined(ES_AD16C4T1_CH3_GPIO_FUNC)&&defined(ES_AD16C4T1_CH3_GPIO_PORT)&&defined(ES_AD16C4T1_CH3_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T1_CH3_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T1_CH3_GPIO_PORT, ES_AD16C4T1_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_AD16C4T1_CH4_GPIO_FUNC)&&defined(ES_AD16C4T1_CH4_GPIO_PORT)&&defined(ES_AD16C4T1_CH4_GPIO_PIN) + gpio_initstructure.func = ES_AD16C4T1_CH4_GPIO_FUNC; + ald_gpio_init(ES_AD16C4T1_CH4_GPIO_PORT, ES_AD16C4T1_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&ad16c4t1_pwm_dev, ES_DEVICE_NAME_AD16C4T1_PWM, &es32f3_pwm_ops, + &ad16c4t1_timer_initstruct); +#endif + + +#ifdef BSP_USING_GP32C4T0_PWM /* 4 channels */ + static struct rt_device_pwm gp32c4t0_pwm_dev; + static timer_handle_t gp32c4t0_timer_initstruct; + + gp32c4t0_timer_initstruct.perh = GP32C4T0; + ald_timer_pwm_init(&gp32c4t0_timer_initstruct); + + /* gpio initialization */ + +#if defined(ES_GP32C4T0_CH1_GPIO_FUNC)&&defined(ES_GP32C4T0_CH1_GPIO_PORT)&&defined(ES_GP32C4T0_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T0_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T0_CH1_GPIO_PORT, ES_GP32C4T0_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP32C4T0_CH2_GPIO_FUNC)&&defined(ES_GP32C4T0_CH2_GPIO_PORT)&&defined(ES_GP32C4T0_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T0_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T0_CH2_GPIO_PORT, ES_GP32C4T0_CH2_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP32C4T0_CH3_GPIO_FUNC)&&defined(ES_GP32C4T0_CH3_GPIO_PORT)&&defined(ES_GP32C4T0_CH3_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T0_CH3_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T0_CH3_GPIO_PORT, ES_GP32C4T0_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP32C4T0_CH4_GPIO_FUNC)&&defined(ES_GP32C4T0_CH4_GPIO_PORT)&&defined(ES_GP32C4T0_CH4_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T0_CH4_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T0_CH4_GPIO_PORT, ES_GP32C4T0_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&gp32c4t0_pwm_dev, ES_DEVICE_NAME_AD16C4T1_PWM, &es32f3_pwm_ops, + &gp32c4t0_timer_initstruct); +#endif + + +#ifdef BSP_USING_GP32C4T1_PWM /* 4 channels */ + static struct rt_device_pwm gp32c4t1_pwm_dev; + static timer_handle_t gp32c4t1_timer_initstruct; + + gp32c4t1_timer_initstruct.perh = GP32C4T1; + ald_timer_pwm_init(&gp32c4t1_timer_initstruct); + + /* gpio initialization */ + +#if defined(ES_GP32C4T1_CH1_GPIO_FUNC)&&defined(ES_GP32C4T1_CH1_GPIO_PORT)&&defined(ES_GP32C4T1_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T1_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T1_CH1_GPIO_PORT, ES_GP32C4T1_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP32C4T1_CH2_GPIO_FUNC)&&defined(ES_GP32C4T1_CH2_GPIO_PORT)&&defined(ES_GP32C4T1_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T1_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T1_CH2_GPIO_PORT, ES_GP32C4T1_CH2_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP32C4T1_CH3_GPIO_FUNC)&&defined(ES_GP32C4T1_CH3_GPIO_PORT)&&defined(ES_GP32C4T1_CH3_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T1_CH3_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T1_CH3_GPIO_PORT, ES_GP32C4T1_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP32C4T1_CH4_GPIO_FUNC)&&defined(ES_GP32C4T1_CH4_GPIO_PORT)&&defined(ES_GP32C4T1_CH4_GPIO_PIN) + gpio_initstructure.func = ES_GP32C4T1_CH4_GPIO_FUNC; + ald_gpio_init(ES_GP32C4T1_CH4_GPIO_PORT, ES_GP32C4T1_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&gp32c4t1_pwm_dev, ES_DEVICE_NAME_GP32C4T1_PWM, &es32f3_pwm_ops, + &gp32c4t1_timer_initstruct); +#endif + + +#ifdef BSP_USING_GP16C4T0_PWM /* 4 channels */ + static struct rt_device_pwm gp16c4t0_pwm_dev; + static timer_handle_t gp16c4t0_timer_initstruct; + + gp16c4t0_timer_initstruct.perh = GP16C4T0; + ald_timer_pwm_init(&gp16c4t0_timer_initstruct); + + /* gpio initialization */ + +#if defined(ES_GP16C4T0_CH1_GPIO_FUNC)&&defined(ES_GP16C4T0_CH1_GPIO_PORT)&&defined(ES_GP16C4T0_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH1_GPIO_PORT, ES_GP16C4T0_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T0_CH2_GPIO_FUNC)&&defined(ES_GP16C4T0_CH2_GPIO_PORT)&&defined(ES_GP16C4T0_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH2_GPIO_PORT, ES_GP16C4T0_CH2_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T0_CH3_GPIO_FUNC)&&defined(ES_GP16C4T0_CH3_GPIO_PORT)&&defined(ES_GP16C4T0_CH3_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH3_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH3_GPIO_PORT, ES_GP16C4T0_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T0_CH4_GPIO_FUNC)&&defined(ES_GP16C4T0_CH4_GPIO_PORT)&&defined(ES_GP16C4T0_CH4_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T0_CH4_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T0_CH4_GPIO_PORT, ES_GP16C4T0_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&gp16c4t0_pwm_dev, ES_DEVICE_NAME_GP16C4T0_PWM, &es32f3_pwm_ops, + &gp16c4t0_timer_initstruct); +#endif + + +#ifdef BSP_USING_GP16C4T1_PWM /* 4 channels */ + static struct rt_device_pwm gp16c4t1_pwm_dev; + static timer_handle_t gp16c4t1_timer_initstruct; + + gp16c4t1_timer_initstruct.perh = GP16C4T1; + ald_timer_pwm_init(&gp16c4t1_timer_initstruct); + + /* gpio initialization */ + +#if defined(ES_GP16C4T1_CH1_GPIO_FUNC)&&defined(ES_GP16C4T1_CH1_GPIO_PORT)&&defined(ES_GP16C4T1_CH1_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T1_CH1_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T1_CH1_GPIO_PORT, ES_GP16C4T1_CH1_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T1_CH2_GPIO_FUNC)&&defined(ES_GP16C4T1_CH2_GPIO_PORT)&&defined(ES_GP16C4T1_CH2_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T1_CH2_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T1_CH2_GPIO_PORT, ES_GP16C4T1_CH2_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T1_CH3_GPIO_FUNC)&&defined(ES_GP16C4T1_CH3_GPIO_PORT)&&defined(ES_GP16C4T1_CH3_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T1_CH3_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T1_CH3_GPIO_PORT, ES_GP16C4T1_CH3_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_GP16C4T1_CH4_GPIO_FUNC)&&defined(ES_GP16C4T1_CH4_GPIO_PORT)&&defined(ES_GP16C4T1_CH4_GPIO_PIN) + gpio_initstructure.func = ES_GP16C4T1_CH4_GPIO_FUNC; + ald_gpio_init(ES_GP16C4T1_CH4_GPIO_PORT, ES_GP16C4T1_CH4_GPIO_PIN, &gpio_initstructure); +#endif + + ret = rt_device_pwm_register(&gp16c4t1_pwm_dev, ES_DEVICE_NAME_GP16C4T1_PWM, &es32f3_pwm_ops, + &gp16c4t1_timer_initstruct); #endif return ret; } INIT_DEVICE_EXPORT(rt_hw_pwm_init); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/drv_rtc.c b/bsp/essemi/es32f369x/drivers/drv_rtc.c index cab5b8b61b..13b0fc9a24 100644 --- a/bsp/essemi/es32f369x/drivers/drv_rtc.c +++ b/bsp/essemi/es32f369x/drivers/drv_rtc.c @@ -3,21 +3,32 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2019-03-22 wangyq the first version - * 2019-11-01 wangyq update libraries + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version */ #include #include -#include +#include #include #include #include "board.h" -#include "drv_rtc.h" -#include -#include +#include "drv_rtc.h" #ifdef RT_USING_RTC @@ -117,20 +128,28 @@ int rt_hw_rtc_init(void) rt_err_t ret = RT_EOK; static struct rt_device rtc_dev; rtc_init_t rtc_initstruct; + + /* enable clk */ + ald_rtc_source_select(ES_RTC_CLK_SOURCE); - /* enable external 32.768kHz */ - CMU_LOSC_ENABLE(); - ald_cmu_losc_safe_config(ENABLE); + if(ES_RTC_CLK_SOURCE == ES_C_RTC_SOURCE_LOSC) + { + CMU_LOSC_ENABLE(); + ald_cmu_losc_safe_config(ENABLE); + } + /* set default time */ RTC_UNLOCK(); WRITE_REG(RTC->TIME, 0x134251); WRITE_REG(RTC->DATE, 0x1190401); RTC_LOCK(); + /* RTC function initialization */ rtc_initstruct.hour_format = RTC_HOUR_FORMAT_24; rtc_initstruct.asynch_pre_div = 0; rtc_initstruct.synch_pre_div = 32767; - rtc_initstruct.output = RTC_OUTPUT_DISABLE; + rtc_initstruct.output = RTC_OUTPUT_DISABLE; + rtc_initstruct.output_polarity = RTC_OUTPUT_POLARITY_HIGH; __rtc_init(&rtc_initstruct); rtc_dev.type = RT_Device_Class_RTC; @@ -150,7 +169,7 @@ int rt_hw_rtc_init(void) rtc_dev.user_data = RTC; - ret = rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR); + ret = rt_device_register(&rtc_dev, ES_DEVICE_NAME_RTC, RT_DEVICE_FLAG_RDWR); return ret; } diff --git a/bsp/essemi/es32f369x/drivers/drv_rtc.h b/bsp/essemi/es32f369x/drivers/drv_rtc.h index fe0264fb51..76e5b24d85 100644 --- a/bsp/essemi/es32f369x/drivers/drv_rtc.h +++ b/bsp/essemi/es32f369x/drivers/drv_rtc.h @@ -3,14 +3,28 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2019-03-22 wangyq the first version + * 2019-03-22 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_RTC_H__ #define DRV_RTC_H__ +#include "es_conf_info_rtc.h" int rt_hw_rtc_init(void); #endif diff --git a/bsp/essemi/es32f369x/drivers/drv_spi.c b/bsp/essemi/es32f369x/drivers/drv_spi.c index 9bf7e4e4b5..aae178f78e 100644 --- a/bsp/essemi/es32f369x/drivers/drv_spi.c +++ b/bsp/essemi/es32f369x/drivers/drv_spi.c @@ -3,10 +3,23 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: - * Date Author Notes - * 2020-01-14 wangyq the first version - * 2019-11-01 wangyq update libraries + * Date Author Notes + * 2019-11-01 wangyq update libraries + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #include @@ -15,9 +28,7 @@ #include #include "board.h" #include "drv_spi.h" -#include -#include -#include + #ifdef RT_USING_SPI @@ -31,6 +42,7 @@ rt_err_t spi_configure(struct rt_spi_device *device, hspi->init.ss_en = DISABLE; hspi->init.crc_calc = DISABLE; + hspi->init.frame = SPI_FRAME_MOTOROLA; /* config spi mode */ if (cfg->mode & RT_SPI_SLAVE) @@ -163,73 +175,54 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * hspi = (spi_handle_t *)device->bus->parent.user_data; cs = device->parent.user_data; + if (message->cs_take) + { + rt_pin_write(cs->pin, ES_SPI_CS_LEVEL); + } + if(message->send_buf != RT_NULL || message->recv_buf != RT_NULL) { /* send & receive */ if ((message->send_buf != RT_NULL) && (message->recv_buf != RT_NULL)) { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } res = ald_spi_send_recv(hspi, (rt_uint8_t *)message->send_buf, (rt_uint8_t *)message->recv_buf, (rt_int32_t)message->length, SPITIMEOUT); - if (message->cs_release) - { - rt_pin_write(cs->pin, 1); - } - if (res != RT_EOK) - return RT_ERROR; } else { /* only send data */ if (message->recv_buf == RT_NULL) { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } res = ald_spi_send(hspi, (rt_uint8_t *)message->send_buf, (rt_int32_t)message->length, SPITIMEOUT); - if (message->cs_release) - { - rt_pin_write(cs->pin, 1); - } - if (res != RT_EOK) - return RT_ERROR; } /* only receive data */ if (message->send_buf == RT_NULL) { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } res = ald_spi_recv(hspi, (rt_uint8_t *)message->recv_buf, (rt_int32_t)message->length, SPITIMEOUT); - if (message->cs_release) - { - rt_pin_write(cs->pin, 1); - } - if (res != RT_EOK) - return RT_ERROR; } } - + + if (message->cs_release) + { + rt_pin_write(cs->pin, !ES_SPI_CS_LEVEL); + } + + if (res != RT_EOK) + return RT_ERROR; + else + return message->length; + } else { - if (message->cs_take) - { - rt_pin_write(cs->pin, 0); - } - + if (message->cs_release) { - rt_pin_write(cs->pin, 1); + rt_pin_write(cs->pin, !ES_SPI_CS_LEVEL); } return RT_EOK; } - return message->length; + } const struct rt_spi_ops es32f3_spi_ops = @@ -240,6 +233,7 @@ const struct rt_spi_ops es32f3_spi_ops = rt_err_t es32f3_spi_device_attach(rt_uint32_t pin, const char *bus_name, const char *device_name) { + int result; /* define spi Instance */ struct rt_spi_device *spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); RT_ASSERT(spi_device != RT_NULL); @@ -248,7 +242,20 @@ rt_err_t es32f3_spi_device_attach(rt_uint32_t pin, const char *bus_name, const c cs_pin->pin = pin; rt_pin_mode(pin, PIN_MODE_OUTPUT); rt_pin_write(pin, 1); - return rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin); + + result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin); + +#ifdef BSP_USING_SPI0 + if(!(strcmp(bus_name,ES_DEVICE_NAME_SPI0_BUS)))SPI_BUS_CONFIG(spi_device->config,0); +#endif +#ifdef BSP_USING_SPI1 + if(!(strcmp(bus_name,ES_DEVICE_NAME_SPI1_BUS)))SPI_BUS_CONFIG(spi_device->config,1); +#endif +#ifdef BSP_USING_SPI2 + if(!(strcmp(bus_name,ES_DEVICE_NAME_SPI2_BUS)))SPI_BUS_CONFIG(spi_device->config,2); +#endif + + return result; } #ifdef BSP_USING_SPI0 @@ -273,40 +280,47 @@ int rt_hw_spi_init(void) struct rt_spi_bus *spi_bus; spi_handle_t *spi; gpio_init_t gpio_instruct; - + + gpio_instruct.pupd = GPIO_PUSH_UP_DOWN; + gpio_instruct.odos = GPIO_PUSH_PULL; + gpio_instruct.podrv = GPIO_OUT_DRIVE_1; + gpio_instruct.nodrv = GPIO_OUT_DRIVE_1; + gpio_instruct.type = GPIO_TYPE_TTL; + gpio_instruct.flt = GPIO_FILTER_DISABLE; + #ifdef BSP_USING_SPI0 _spi0.perh = SPI0; spi_bus = &_spi_bus0; spi = &_spi0; - rt_device_t spi_bus_dev0; /* SPI0 gpio init */ gpio_instruct.mode = GPIO_MODE_OUTPUT; - gpio_instruct.odos = GPIO_PUSH_PULL; - gpio_instruct.podrv = GPIO_OUT_DRIVE_1; - gpio_instruct.nodrv = GPIO_OUT_DRIVE_1; - gpio_instruct.func = GPIO_FUNC_4; - gpio_instruct.type = GPIO_TYPE_TTL; - gpio_instruct.flt = GPIO_FILTER_DISABLE; - /* PB3->SPI0_SCK, PB5->SPI0_MOSI */ - ald_gpio_init(GPIOB, GPIO_PIN_3 | GPIO_PIN_5, &gpio_instruct); +#if defined(ES_SPI0_SCK_GPIO_FUNC)&&defined(ES_SPI0_SCK_GPIO_PORT)&&defined(ES_SPI0_SCK_GPIO_PIN) + gpio_instruct.func = ES_SPI0_SCK_GPIO_FUNC; + ald_gpio_init(ES_SPI0_SCK_GPIO_PORT, ES_SPI0_SCK_GPIO_PIN, &gpio_instruct); +#endif - /* PB4->SPI0_MISO */ +#if defined(ES_SPI0_MOSI_GPIO_FUNC)&&defined(ES_SPI0_MOSI_GPIO_PORT)&&defined(ES_SPI0_MOSI_GPIO_PIN) + gpio_instruct.func = ES_SPI0_MOSI_GPIO_FUNC; + ald_gpio_init(ES_SPI0_MOSI_GPIO_PORT, ES_SPI0_MOSI_GPIO_PIN, &gpio_instruct); +#endif + gpio_instruct.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_4, &gpio_instruct); + +#if defined(ES_SPI0_MISO_GPIO_FUNC)&&defined(ES_SPI0_MISO_GPIO_PORT)&&defined(ES_SPI0_MISO_GPIO_PIN) + gpio_instruct.func = ES_SPI0_MISO_GPIO_FUNC; + ald_gpio_init(ES_SPI0_MISO_GPIO_PORT, ES_SPI0_MISO_GPIO_PIN, &gpio_instruct); +#endif spi_bus->parent.user_data = spi; - result = rt_spi_bus_register(spi_bus, "spi0", &es32f3_spi_ops); + result = rt_spi_bus_register(spi_bus, ES_DEVICE_NAME_SPI0_BUS, &es32f3_spi_ops); if (result != RT_EOK) { return result; } - rt_device_register(spi_bus_dev0, "spi00", RT_DEVICE_FLAG_RDWR); - - /* SPI0_NSS = PA15 = PIN 50 */ - result = es32f3_spi_device_attach(50, "spi0", "spi00"); + result = es32f3_spi_device_attach(ES_SPI0_NSS_PIN, ES_DEVICE_NAME_SPI0_BUS, ES_DEVICE_NAME_SPI0_DEV0); if (result != RT_EOK) { @@ -319,35 +333,35 @@ int rt_hw_spi_init(void) _spi1.perh = SPI1; spi_bus = &_spi_bus1; spi = &_spi1; - rt_device_t spi_bus_dev0; /* SPI1 gpio init */ gpio_instruct.mode = GPIO_MODE_OUTPUT; - gpio_instruct.odos = GPIO_PUSH_PULL; - gpio_instruct.podrv = GPIO_OUT_DRIVE_1; - gpio_instruct.nodrv = GPIO_OUT_DRIVE_1; - gpio_instruct.func = GPIO_FUNC_4; - gpio_instruct.type = GPIO_TYPE_TTL; - gpio_instruct.flt = GPIO_FILTER_DISABLE; - - /* PC01->SPI1_SCK, PC03->SPI1_MOSI */ - ald_gpio_init(GPIOC, GPIO_PIN_1 | GPIO_PIN_3, &gpio_instruct); - - /* PC02->SPI1_MISO */ + +#if defined(ES_SPI1_SCK_GPIO_FUNC)&&defined(ES_SPI1_SCK_GPIO_PORT)&&defined(ES_SPI1_SCK_GPIO_PIN) + gpio_instruct.func = ES_SPI1_SCK_GPIO_FUNC; + ald_gpio_init(ES_SPI1_SCK_GPIO_PORT, ES_SPI1_SCK_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_SPI1_MOSI_GPIO_FUNC)&&defined(ES_SPI1_MOSI_GPIO_PORT)&&defined(ES_SPI1_MOSI_GPIO_PIN) + gpio_instruct.func = ES_SPI1_MOSI_GPIO_FUNC; + ald_gpio_init(ES_SPI1_MOSI_GPIO_PORT, ES_SPI1_MOSI_GPIO_PIN, &gpio_instruct); +#endif + gpio_instruct.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOC, GPIO_PIN_2, &gpio_instruct); + +#if defined(ES_SPI1_MISO_GPIO_FUNC)&&defined(ES_SPI1_MISO_GPIO_PORT)&&defined(ES_SPI1_MISO_GPIO_PIN) + gpio_instruct.func = ES_SPI1_MISO_GPIO_FUNC; + ald_gpio_init(ES_SPI1_MISO_GPIO_PORT, ES_SPI1_MISO_GPIO_PIN, &gpio_instruct); +#endif spi_bus->parent.user_data = spi; - result = rt_spi_bus_register(spi_bus, "spi1", &es32f3_spi_ops); + result = rt_spi_bus_register(spi_bus, ES_DEVICE_NAME_SPI1_BUS, &es32f3_spi_ops); if (result != RT_EOK) { return result; } - rt_device_register(spi_bus_dev0, "spi10", RT_DEVICE_FLAG_RDWR); - - /* SPI1_NSS = PC00 = PIN 8 */ - result = es32f3_spi_device_attach(8, "spi1", "spi10"); + result = es32f3_spi_device_attach(ES_SPI1_NSS_PIN, ES_DEVICE_NAME_SPI1_BUS, ES_DEVICE_NAME_SPI1_DEV0); if (result != RT_EOK) { @@ -357,38 +371,38 @@ int rt_hw_spi_init(void) #endif #ifdef BSP_USING_SPI2 - _spi1.perh = SPI2; + _spi2.perh = SPI2; spi_bus = &_spi_bus2; spi = &_spi2; - rt_device_t spi_bus_dev0; /* SPI2 gpio init */ gpio_instruct.mode = GPIO_MODE_OUTPUT; - gpio_instruct.odos = GPIO_PUSH_PULL; - gpio_instruct.podrv = GPIO_OUT_DRIVE_1; - gpio_instruct.nodrv = GPIO_OUT_DRIVE_1; - gpio_instruct.func = GPIO_FUNC_5; - gpio_instruct.type = GPIO_TYPE_TTL; - gpio_instruct.flt = GPIO_FILTER_DISABLE; - - /* PC05->SPI1_SCK, PB01->SPI1_MOSI */ - ald_gpio_init(GPIOC, GPIO_PIN_5 | GPIO_PIN_1, &gpio_instruct); - - /* PB00->SPI1_MISO */ + +#if defined(ES_SPI2_SCK_GPIO_FUNC)&&defined(ES_SPI2_SCK_GPIO_PORT)&&defined(ES_SPI2_SCK_GPIO_PIN) + gpio_instruct.func = ES_SPI2_SCK_GPIO_FUNC; + ald_gpio_init(ES_SPI2_SCK_GPIO_PORT, ES_SPI2_SCK_GPIO_PIN, &gpio_instruct); +#endif + +#if defined(ES_SPI2_MOSI_GPIO_FUNC)&&defined(ES_SPI2_MOSI_GPIO_PORT)&&defined(ES_SPI2_MOSI_GPIO_PIN) + gpio_instruct.func = ES_SPI2_MOSI_GPIO_FUNC; + ald_gpio_init(ES_SPI2_MOSI_GPIO_PORT, ES_SPI2_MOSI_GPIO_PIN, &gpio_instruct); +#endif + gpio_instruct.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_0, &gpio_instruct); + +#if defined(ES_SPI2_MISO_GPIO_FUNC)&&defined(ES_SPI2_MISO_GPIO_PORT)&&defined(ES_SPI2_MISO_GPIO_PIN) + gpio_instruct.func = ES_SPI2_MISO_GPIO_FUNC; + ald_gpio_init(ES_SPI2_MISO_GPIO_PORT, ES_SPI2_MISO_GPIO_PIN, &gpio_instruct); +#endif spi_bus->parent.user_data = spi; - result = rt_spi_bus_register(spi_bus, "spi2", &es32f3_spi_ops); + result = rt_spi_bus_register(spi_bus, ES_DEVICE_NAME_SPI2_BUS, &es32f3_spi_ops); if (result != RT_EOK) { return result; } - rt_device_register(spi_bus_dev0, "spi20", RT_DEVICE_FLAG_RDWR); - - /* SPI2_NSS = PC04 = PIN 24 */ - result = es32f3_spi_device_attach(39, "spi2", "spi20"); + result = es32f3_spi_device_attach(ES_SPI2_NSS_PIN, ES_DEVICE_NAME_SPI2_BUS, ES_DEVICE_NAME_SPI1_DEV0); if (result != RT_EOK) { diff --git a/bsp/essemi/es32f369x/drivers/drv_spi.h b/bsp/essemi/es32f369x/drivers/drv_spi.h index 832d1a58b1..32eab04cc5 100644 --- a/bsp/essemi/es32f369x/drivers/drv_spi.h +++ b/bsp/essemi/es32f369x/drivers/drv_spi.h @@ -3,9 +3,22 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #ifndef DRV_SPI_H__ @@ -14,6 +27,8 @@ #include #include #include + +#include "es_conf_info_spi.h" struct es32f3_hw_spi_cs { diff --git a/bsp/essemi/es32f369x/drivers/drv_spiflash.c b/bsp/essemi/es32f369x/drivers/drv_spiflash.c new file mode 100644 index 0000000000..d8176257d1 --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/drv_spiflash.c @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-02-15 wangyq the first version + * 2019-11-01 wangyq update libraries + */ + +#include "board.h" +#include + +#if defined(BSP_USING_SPI_FLASH) + +#include "spi_flash.h" +#include "drv_spiflash.h" +#include "spi_flash_sfud.h" +#include "drv_spi.h" + +int rt_hw_spi_flash_init(void) +{ + + if (RT_NULL == rt_sfud_flash_probe(ES_DEVICE_NAME_SPI_FALSH_DEV, ES_DEVICE_NAME_SPI_DEV)) + { + return -RT_ERROR; + }; + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/drv_spiflash.h b/bsp/essemi/es32f369x/drivers/drv_spiflash.h new file mode 100644 index 0000000000..6ef31852bb --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/drv_spiflash.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-02-15 wangyq the first version + * 2021-04-20 liuhy the second version + */ + +#ifndef DRV_NOR_FLASH_H__ +#define DRV_NOR_FLASH_H__ + +#include "es_conf_info_spi.h" + +int rt_hw_spi_flash_init(void); + +#endif diff --git a/bsp/essemi/es32f369x/drivers/drv_uart.c b/bsp/essemi/es32f369x/drivers/drv_uart.c index b6a8b7a453..5ca5085c54 100644 --- a/bsp/essemi/es32f369x/drivers/drv_uart.c +++ b/bsp/essemi/es32f369x/drivers/drv_uart.c @@ -3,19 +3,29 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes - * 2020-01-14 wangyq the first version + * 2020-01-14 wangyq the first version + * 2021-04-20 liuhy the second version */ #include #include #include #include "board.h" -#include "drv_uart.h" -#include -#include -#include +#include "es_conf_info_uart.h" #ifdef RT_USING_SERIAL @@ -26,183 +36,6 @@ struct es32_uart IRQn_Type irq; }; -static rt_err_t es32f3x_configure(struct rt_serial_device *serial, struct serial_configure *cfg) -{ - gpio_init_t gpio_initstructure; - struct es32_uart *uart; - RT_ASSERT(serial != RT_NULL); - RT_ASSERT(cfg != RT_NULL); - uart = (struct es32_uart *)serial->parent.user_data; - - /* Initialize tx pin */ - gpio_initstructure.mode = GPIO_MODE_OUTPUT; - gpio_initstructure.odos = GPIO_PUSH_PULL; - gpio_initstructure.pupd = GPIO_PUSH_UP; - gpio_initstructure.podrv = GPIO_OUT_DRIVE_1; - gpio_initstructure.nodrv = GPIO_OUT_DRIVE_1; - gpio_initstructure.flt = GPIO_FILTER_DISABLE; - gpio_initstructure.type = GPIO_TYPE_TTL; - -#ifdef BSP_USING_UART0 - gpio_initstructure.func = GPIO_FUNC_3; - ald_gpio_init(GPIOB, GPIO_PIN_10, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_11, &gpio_initstructure); - - ald_cmu_perh_clock_config(CMU_PERH_UART0, ENABLE); -#endif /* uart0 gpio init */ - -#ifdef BSP_USING_UART1 - gpio_initstructure.func = GPIO_FUNC_3; - ald_gpio_init(GPIOC, GPIO_PIN_10, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOC, GPIO_PIN_11, &gpio_initstructure); - - ald_cmu_perh_clock_config(CMU_PERH_UART1, ENABLE); -#endif /* uart1 gpio init */ - -#ifdef BSP_USING_UART2 - gpio_initstructure.func = GPIO_FUNC_5; - ald_gpio_init(GPIOC, GPIO_PIN_12, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOD, GPIO_PIN_2, &gpio_initstructure); - - ald_cmu_perh_clock_config(CMU_PERH_UART2, ENABLE); -#endif /* uart2 gpio init */ - -#ifdef BSP_USING_UART3 - gpio_initstructure.func = GPIO_FUNC_4; - ald_gpio_init(GPIOC, GPIO_PIN_4, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOC, GPIO_PIN_5, &gpio_initstructure); - - ald_cmu_perh_clock_config(CMU_PERH_UART3, ENABLE); -#endif /* uart3 gpio init */ - -#ifdef BSP_USING_UART4 - gpio_initstructure.func = GPIO_FUNC_3; - ald_gpio_init(GPIOB, GPIO_PIN_6, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_7, &gpio_initstructure); - - ald_cmu_perh_clock_config(CMU_PERH_UART4, ENABLE); -#endif /* uart4 gpio init */ - -#ifdef BSP_USING_UART5 - gpio_initstructure.func = GPIO_FUNC_4; - ald_gpio_init(GPIOB, GPIO_PIN_9, &gpio_initstructure); - - /* Initialize rx pin ,the same as txpin except mode */ - gpio_initstructure.mode = GPIO_MODE_INPUT; - ald_gpio_init(GPIOB, GPIO_PIN_8, &gpio_initstructure); - - ald_cmu_perh_clock_config(CMU_PERH_UART5, ENABLE); -#endif /* uart5 gpio init */ - - ald_uart_tx_fifo_config(&uart->huart, UART_TXFIFO_EMPTY); - ald_uart_rx_fifo_config(&uart->huart, UART_RXFIFO_1BYTE); - - uart->huart.init.mode = UART_MODE_UART; - uart->huart.init.baud = cfg->baud_rate; - uart->huart.init.word_length = (uart_word_length_t)(8 - cfg->data_bits); - uart->huart.init.parity = (uart_parity_t)(cfg->parity == PARITY_EVEN ? UART_PARITY_EVEN : cfg->parity); - uart->huart.init.fctl = UART_HW_FLOW_CTL_DISABLE; - ald_uart_init(&uart->huart); - - if (cfg->bit_order == BIT_ORDER_MSB) - { - UART_MSB_FIRST_ENABLE(&uart->huart); - } - else - { - UART_MSB_FIRST_DISABLE(&uart->huart); - } - - if (cfg->invert == NRZ_INVERTED) - { - UART_DATA_INV_ENABLE(&uart->huart); - } - else - { - UART_DATA_INV_DISABLE(&uart->huart); - } - - return RT_EOK; -} - -static rt_err_t es32f3x_control(struct rt_serial_device *serial, int cmd, void *arg) -{ - struct es32_uart *uart; - RT_ASSERT(serial != RT_NULL); - - uart = (struct es32_uart *)serial->parent.user_data; - switch (cmd) - { - case RT_DEVICE_CTRL_CLR_INT: - /* disable rx irq */ - NVIC_DisableIRQ(uart->irq); - /* disable interrupt */ - ald_uart_interrupt_config(&uart->huart, UART_IT_RFTH, DISABLE); - break; - - case RT_DEVICE_CTRL_SET_INT: - /* enable rx irq */ - NVIC_EnableIRQ(uart->irq); - /* enable interrupt */ - ald_uart_interrupt_config(&uart->huart, UART_IT_RFTH, ENABLE); - break; - } - - return RT_EOK; -} - -static int es32f3x_putc(struct rt_serial_device *serial, char c) -{ - struct es32_uart *uart; - RT_ASSERT(serial != RT_NULL); - uart = (struct es32_uart *)serial->parent.user_data; - - while (ald_uart_get_status(&uart->huart, UART_STATUS_TFEMPTY) == RESET) - ; - WRITE_REG(uart->huart.perh->TXBUF, c); - - return 1; -} - -static int es32f3x_getc(struct rt_serial_device *serial) -{ - int ch = -1; - struct es32_uart *uart; - - RT_ASSERT(serial != RT_NULL); - uart = (struct es32_uart *)serial->parent.user_data; - - if (ald_uart_get_status(&uart->huart, UART_STATUS_RFTH)) - { - ch = (uint8_t)(uart->huart.perh->RXBUF & 0xFF); - } - - return ch; -} - -static const struct rt_uart_ops es32f3x_uart_ops = -{ - es32f3x_configure, - es32f3x_control, - es32f3x_putc, - es32f3x_getc, -}; - #ifdef BSP_USING_UART0 /* UART0 device driver structure */ struct es32_uart uart0 = @@ -353,18 +186,243 @@ void UART5_Handler(void) } #endif /* BSP_USING_UART5 */ +static rt_err_t es32f3x_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + gpio_init_t gpio_initstructure; + struct es32_uart *uart; + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + uart = (struct es32_uart *)serial->parent.user_data; + + /* Initialize tx pin */ + gpio_initstructure.mode = GPIO_MODE_OUTPUT; + gpio_initstructure.odos = GPIO_PUSH_PULL; + gpio_initstructure.pupd = GPIO_PUSH_UP; + gpio_initstructure.podrv = GPIO_OUT_DRIVE_1; + gpio_initstructure.nodrv = GPIO_OUT_DRIVE_1; + gpio_initstructure.flt = GPIO_FILTER_DISABLE; + gpio_initstructure.type = GPIO_TYPE_TTL; + +#ifdef BSP_USING_UART0 + if(uart == (&uart0)) + { +#if defined(ES_UART0_TX_GPIO_FUNC)&&defined(ES_UART0_TX_GPIO_PORT)&&defined(ES_UART0_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART0_TX_GPIO_FUNC; + ald_gpio_init(ES_UART0_TX_GPIO_PORT, ES_UART0_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART0_RX_GPIO_FUNC)&&defined(ES_UART0_RX_GPIO_PORT)&&defined(ES_UART0_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART0_RX_GPIO_FUNC; + ald_gpio_init(ES_UART0_RX_GPIO_PORT, ES_UART0_RX_GPIO_PIN, &gpio_initstructure); +#endif + ald_cmu_perh_clock_config(CMU_PERH_UART0, ENABLE); + } + +#endif /* uart0 gpio init */ + +#ifdef BSP_USING_UART1 + if(uart == (&uart1)) + { +#if defined(ES_UART1_TX_GPIO_FUNC)&&defined(ES_UART1_TX_GPIO_PORT)&&defined(ES_UART1_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART1_TX_GPIO_FUNC; + ald_gpio_init(ES_UART1_TX_GPIO_PORT, ES_UART1_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART1_RX_GPIO_FUNC)&&defined(ES_UART1_RX_GPIO_PORT)&&defined(ES_UART1_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART1_RX_GPIO_FUNC; + ald_gpio_init(ES_UART1_RX_GPIO_PORT, ES_UART1_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART1, ENABLE); + } +#endif /* uart1 gpio init */ + +#ifdef BSP_USING_UART2 + if(uart == (&uart2)) + { +#if defined(ES_UART2_TX_GPIO_FUNC)&&defined(ES_UART2_TX_GPIO_PORT)&&defined(ES_UART2_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART2_TX_GPIO_FUNC; + ald_gpio_init(ES_UART2_TX_GPIO_PORT, ES_UART2_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART2_RX_GPIO_FUNC)&&defined(ES_UART2_RX_GPIO_PORT)&&defined(ES_UART2_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART2_RX_GPIO_FUNC; + ald_gpio_init(ES_UART2_RX_GPIO_PORT, ES_UART2_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART2, ENABLE); + } +#endif /* uart2 gpio init */ + +#ifdef BSP_USING_UART3 + if(uart == (&uart3)) + { +#if defined(ES_UART3_TX_GPIO_FUNC)&&defined(ES_UART3_TX_GPIO_PORT)&&defined(ES_UART3_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART3_TX_GPIO_FUNC; + ald_gpio_init(ES_UART3_TX_GPIO_PORT, ES_UART3_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART3_RX_GPIO_FUNC)&&defined(ES_UART3_RX_GPIO_PORT)&&defined(ES_UART3_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART3_RX_GPIO_FUNC; + ald_gpio_init(ES_UART3_RX_GPIO_PORT, ES_UART3_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART3, ENABLE); + } +#endif /* uart3 gpio init */ + +#ifdef BSP_USING_UART4 + if(uart == (&uart4)) + { +#if defined(ES_UART4_TX_GPIO_FUNC)&&defined(ES_UART4_TX_GPIO_PORT)&&defined(ES_UART4_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART4_TX_GPIO_FUNC; + ald_gpio_init(ES_UART4_TX_GPIO_PORT, ES_UART4_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART4_RX_GPIO_FUNC)&&defined(ES_UART4_RX_GPIO_PORT)&&defined(ES_UART4_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART4_RX_GPIO_FUNC; + ald_gpio_init(ES_UART4_RX_GPIO_PORT, ES_UART4_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART4, ENABLE); + } +#endif /* uart4 gpio init */ + +#ifdef BSP_USING_UART5 + if(uart == (&uart5)) + { +#if defined(ES_UART5_TX_GPIO_FUNC)&&defined(ES_UART5_TX_GPIO_PORT)&&defined(ES_UART5_TX_GPIO_PIN) + gpio_initstructure.func = ES_UART5_TX_GPIO_FUNC; + ald_gpio_init(ES_UART5_TX_GPIO_PORT, ES_UART5_TX_GPIO_PIN, &gpio_initstructure); +#endif + +#if defined(ES_UART5_RX_GPIO_FUNC)&&defined(ES_UART5_RX_GPIO_PORT)&&defined(ES_UART5_RX_GPIO_PIN) + /* Initialize rx pin ,the same as txpin except mode */ + gpio_initstructure.mode = GPIO_MODE_INPUT; + gpio_initstructure.func = ES_UART5_RX_GPIO_FUNC; + ald_gpio_init(ES_UART5_RX_GPIO_PORT, ES_UART5_RX_GPIO_PIN, &gpio_initstructure); +#endif + + ald_cmu_perh_clock_config(CMU_PERH_UART5, ENABLE); + } +#endif /* uart5 gpio init */ + + ald_uart_tx_fifo_config(&uart->huart, UART_TXFIFO_EMPTY); + ald_uart_rx_fifo_config(&uart->huart, UART_RXFIFO_1BYTE); + + uart->huart.init.mode = UART_MODE_UART; + uart->huart.init.baud = cfg->baud_rate; + uart->huart.init.word_length = (uart_word_length_t)(8 - cfg->data_bits); + uart->huart.init.parity = (uart_parity_t)(cfg->parity == PARITY_EVEN ? UART_PARITY_EVEN : cfg->parity); + uart->huart.init.fctl = UART_HW_FLOW_CTL_DISABLE; + uart->huart.init.stop_bits = UART_STOP_BITS_1; + ald_uart_init(&uart->huart); + + if (cfg->bit_order == BIT_ORDER_MSB) + { + UART_MSB_FIRST_ENABLE(&uart->huart); + } + else + { + UART_MSB_FIRST_DISABLE(&uart->huart); + } + + if (cfg->invert == NRZ_INVERTED) + { + UART_DATA_INV_ENABLE(&uart->huart); + } + else + { + UART_DATA_INV_DISABLE(&uart->huart); + } + + return RT_EOK; +} + +static rt_err_t es32f3x_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct es32_uart *uart; + RT_ASSERT(serial != RT_NULL); + + uart = (struct es32_uart *)serial->parent.user_data; + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + NVIC_DisableIRQ(uart->irq); + /* disable interrupt */ + ald_uart_interrupt_config(&uart->huart, UART_IT_RFTH, DISABLE); + break; + + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + NVIC_EnableIRQ(uart->irq); + /* enable interrupt */ + ald_uart_interrupt_config(&uart->huart, UART_IT_RFTH, ENABLE); + break; + } + + return RT_EOK; +} + +static int es32f3x_putc(struct rt_serial_device *serial, char c) +{ + struct es32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct es32_uart *)serial->parent.user_data; + + while (ald_uart_get_status(&uart->huart, UART_STATUS_TFEMPTY) == RESET) + ; + WRITE_REG(uart->huart.perh->TXBUF, c); + + return 1; +} + +static int es32f3x_getc(struct rt_serial_device *serial) +{ + int ch = -1; + struct es32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + uart = (struct es32_uart *)serial->parent.user_data; + + if (ald_uart_get_status(&uart->huart, UART_STATUS_RFTH)) + { + ch = (uint8_t)(uart->huart.perh->RXBUF & 0xFF); + } + + return ch; +} + +static const struct rt_uart_ops es32f3x_uart_ops = +{ + es32f3x_configure, + es32f3x_control, + es32f3x_putc, + es32f3x_getc, +}; + int rt_hw_uart_init(void) { struct es32_uart *uart; - struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; #ifdef BSP_USING_UART0 uart = &uart0; serial0.ops = &es32f3x_uart_ops; - serial0.config = config; + serial0.config = (struct serial_configure)ES_UART0_CONFIG; /* register UART0 device */ - rt_hw_serial_register(&serial0, "uart0", + rt_hw_serial_register(&serial0, ES_DEVICE_NAME_UART0, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART0 */ @@ -372,10 +430,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART1 uart = &uart1; serial1.ops = &es32f3x_uart_ops; - serial1.config = config; + serial1.config = (struct serial_configure)ES_UART1_CONFIG; /* register UART1 device */ - rt_hw_serial_register(&serial1, "uart1", + rt_hw_serial_register(&serial1, ES_DEVICE_NAME_UART1, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART1 */ @@ -383,10 +441,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART2 uart = &uart2; serial2.ops = &es32f3x_uart_ops; - serial2.config = config; + serial2.config = (struct serial_configure)ES_UART2_CONFIG; /* register UART2 device */ - rt_hw_serial_register(&serial2, "uart2", + rt_hw_serial_register(&serial2, ES_DEVICE_NAME_UART2, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART2 */ @@ -394,10 +452,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART3 uart = &uart3; serial3.ops = &es32f3x_uart_ops; - serial3.config = config; + serial3.config = (struct serial_configure)ES_UART3_CONFIG; /* register UART3 device */ - rt_hw_serial_register(&serial3, "uart3", + rt_hw_serial_register(&serial3, ES_DEVICE_NAME_UART3, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART3 */ @@ -405,10 +463,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART4 uart = &uart4; serial4.ops = &es32f3x_uart_ops; - serial4.config = config; + serial4.config = (struct serial_configure)ES_UART4_CONFIG; /* register UART4 device */ - rt_hw_serial_register(&serial4, "uart4", + rt_hw_serial_register(&serial4, ES_DEVICE_NAME_UART4, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART4 */ @@ -416,10 +474,10 @@ int rt_hw_uart_init(void) #ifdef BSP_USING_UART5 uart = &uart5; serial5.ops = &es32f3x_uart_ops; - serial5.config = config; + serial5.config = (struct serial_configure)ES_UART5_CONFIG; /* register UART5 device */ - rt_hw_serial_register(&serial5, "uart5", + rt_hw_serial_register(&serial5, ES_DEVICE_NAME_UART5, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* BSP_USING_UART5 */ diff --git a/bsp/essemi/es32f369x/drivers/drv_uart.h b/bsp/essemi/es32f369x/drivers/drv_uart.h index fed3184080..6e9b7703e0 100644 --- a/bsp/essemi/es32f369x/drivers/drv_uart.h +++ b/bsp/essemi/es32f369x/drivers/drv_uart.h @@ -3,6 +3,18 @@ * * SPDX-License-Identifier: Apache-2.0 * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * Change Logs: * Date Author Notes * 2020-01-14 wangyq the first version diff --git a/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Include/es32f36xx.h b/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Include/es32f36xx.h index 2e29a0d583..71e4e83261 100644 --- a/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Include/es32f36xx.h +++ b/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Include/es32f36xx.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/gcc/startup_es32f36xx.S b/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/gcc/startup_es32f36xx.S new file mode 100644 index 0000000000..4e34d42c1d --- /dev/null +++ b/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/gcc/startup_es32f36xx.S @@ -0,0 +1,438 @@ +/** + ****************************************************************************** + * @file startup_es32f36xx.s + * @author AE Team + * @brief ES32F36xx devices vector table for GCC toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + */ + + .syntax unified + .arch armv7-m + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/*bl __libc_init_array + + bl main */ + bl entry + +LoopForever: + b LoopForever + + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M0. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack /* 0, load top of stack */ + .word Reset_Handler /* 1, reset handler */ + .word NMI_Handler /* 2, nmi handler */ + .word HardFault_Handler /* 3, hard fault handler */ + .word MemManage_Handler /* 4, MPU Fault Handler */ + .word BusFault_Handler /* 5, Bus Fault Handler */ + .word UsageFault_Handler /* 6, Usage Fault Handler */ + .word 0 /* 7, Reserved */ + .word 0 /* 8, Reserved */ + .word 0 /* 9, Reserved */ + .word 0 /* 10, Reserved */ + .word SVC_Handler /* 11, svcall handler */ + .word DebugMon_Handler /* 12, Debug Monitor Handler */ + .word 0 /* 13, Reserved */ + .word PendSV_Handler /* 14, pendsv handler */ + .word SysTick_Handler /* 15, systick handler */ + .word WWDG_Handler /* 16, irq0 WWDG handler */ + .word IWDG_Handler /* 17, irq1 IWDG handler */ + .word LVD_Handler /* 18, irq2 LVD handler */ + .word RTC_Handler /* 19, irq3 RTC handler */ + .word 0 /* 20, irq4 Reserved */ + .word 0 /* 21, irq5 Reserved */ + .word CMU_Handler /* 22, irq6 CMU handler */ + .word ADC0_Handler /* 23, irq7 ADC0 handler */ + .word CAN0_TX_Handler /* 24, irq8 CAN0_TX handler */ + .word CAN0_RX0_Handler /* 25, irq9 CAN0_RX0 handler */ + .word CAN0_RX1_Handler /* 26, irq10 CAN0_RX1 handler */ + .word CAN0_EXCEPTION_Handler /* 27, irq11 CAN0_EXCEPTION handler */ + .word AD16C4T0_BRK_Handler /* 28, irq12 AD16C4T0_BRK handler */ + .word AD16C4T0_UP_Handler /* 29, irq13 AD16C4T0_UP handler */ + .word AD16C4T0_TRIG_COM_Handler /* 30, irq14 AD16C4T0_TRIG_COM handler */ + .word AD16C4T0_CC_Handler /* 31, irq15 AD16C4T0_CC handler */ + .word AD16C4T1_BRK_Handler /* 32, irq16 AD16C4T1_BRK handler */ + .word AD16C4T1_UP_Handler /* 33, irq17 AD16C4T1_UP handler */ + .word AD16C4T1_TRIG_COM_Handler /* 34, irq18 AD16C4T1_TRIG_COM handler */ + .word AD16C4T1_CC_Handler /* 35, irq19 AD16C4T1_CC handler */ + .word GP32C4T0_Handler /* 36, irq20 GP32C4T0 handler */ + .word GP32C4T1_Handler /* 37, irq21 GP32C4T1 handler */ + .word BS16T0_Handler /* 38, irq22 BS16T0 handler */ + .word BS16T1_Handler /* 39, irq23 BS16T1 handler */ + .word GP16C4T0_Handler /* 40, irq24 GP16C4T0 handler */ + .word GP16C4T1_Handler /* 41, irq25 GP16C4T1 handler */ + .word 0 /* 42, irq26 Reserved */ + .word DAC0_CH0_Handler /* 43, irq27 DAC0_CH0 handler */ + .word I2C0_EV_Handler /* 44, irq28 I2C0_EV handler */ + .word I2C0_ERR_Handler /* 45, irq29 I2C0_ERR handler */ + .word I2C1_EV_Handler /* 46 irq30 I2C1_EV handler */ + .word I2C1_ERR_Handler /* 47, irq31 I2C1_ERR handler */ + .word SPI0_I2S0_Handler /* 48, irq32 SPI0_I2S0 handler */ + .word SPI1_I2S1_Handler /* 49, irq33 SPI1_I2S1 handler */ + .word UART0_Handler /* 50, irq34 UART0 handler */ + .word UART1_Handler /* 51, irq35 UART1 handler */ + .word UART2_Handler /* 52, irq36 UART2 handler */ + .word UART3_Handler /* 53, irq37 UART3 handler */ + .word UART4_Handler /* 54, irq38 UART4 handler */ + .word UART5_Handler /* 55, irq39 UART5 handler */ + .word 0 /* 56, irq40 Reserved */ + .word 0 /* 57, irq41 Reserved */ + .word CRYPT_Handler /* 58, irq42 CRYPT handler */ + .word ACMP0_Handler /* 59, irq43 ACMP0 handler */ + .word ACMP1_Handler /* 60, irq44 ACMP1 handler */ + .word SPI2_I2S2_Handler /* 61, irq45 SPI2_I2S2 handler */ + .word 0 /* 62, irq46 Reserved */ + .word EBI_Handler /* 63, irq47 EBI handler */ + .word TRNG_Handler /* 64, irq48 TRNG handler */ + .word TSENSE_Handler /* 65, irq49 TSENSE handler */ + .word EXTI0_Handler /* 66, irq50 EXTI0 handler */ + .word EXTI1_Handler /* 67, irq51 EXTI1 handler */ + .word EXTI2_Handler /* 68, irq52 EXTI2 handler */ + .word EXTI3_Handler /* 69, irq53 EXTI3 handler */ + .word EXTI4_Handler /* 70, irq54 EXTI4 handler */ + .word EXTI5_Handler /* 71, irq55 EXTI5 handler */ + .word EXTI6_Handler /* 72, irq56 EXTI6 handler */ + .word EXTI7_Handler /* 73, irq57 EXTI7 handler */ + .word EXTI8_Handler /* 74, irq58 EXTI8 handler */ + .word EXTI9_Handler /* 75, irq59 EXTI9 handler */ + .word EXTI10_Handler /* 76, irq60 EXTI10 handler */ + .word EXTI11_Handler /* 77, irq61 EXTI11 handler */ + .word EXTI12_Handler /* 78, irq62 EXTI12 handler */ + .word EXTI13_Handler /* 79, irq63 EXTI13 handler */ + .word EXTI14_Handler /* 80, irq64 EXTI14 handler */ + .word EXTI15_Handler /* 81, irq65 EXTI15 handler */ + .word DMA_Handler /* 82, irq66 DMA handler */ + .word ADC1_Handler /* 83, irq67 ADC1 handler */ + .word DAC0_CH1_Handler /* 84, irq68 DAC0_CH1 handler */ + .word QSPI_Handler /* 85, irq69 QSPI handler */ + .word USB_INT_Handler /* 86, irq70 USB_INT handler */ + .word USB_DMA_Handler /* 87, irq71 USB_DMA handler */ + .word ACMP2_Handler /* 88, irq72 ACMP2 handler */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_Handler + .thumb_set WWDG_Handler,Default_Handler + + .weak IWDG_Handler + .thumb_set IWDG_Handler,Default_Handler + + .weak LVD_Handler + .thumb_set LVD_Handler,Default_Handler + + .weak RTC_Handler + .thumb_set RTC_Handler,Default_Handler + + .weak CMU_Handler + .thumb_set CMU_Handler,Default_Handler + + .weak ADC0_Handler + .thumb_set ADC0_Handler,Default_Handler + + .weak CAN0_TX_Handler + .thumb_set CAN0_TX_Handler,Default_Handler + + .weak CAN0_RX0_Handler + .thumb_set CAN0_RX0_Handler,Default_Handler + + .weak CAN0_RX1_Handler + .thumb_set CAN0_RX1_Handler,Default_Handler + + .weak CAN0_EXCEPTION_Handler + .thumb_set CAN0_EXCEPTION_Handler,Default_Handler + + .weak AD16C4T0_BRK_Handler + .thumb_set AD16C4T0_BRK_Handler,Default_Handler + + .weak AD16C4T0_UP_Handler + .thumb_set AD16C4T0_UP_Handler,Default_Handler + + .weak AD16C4T0_TRIG_COM_Handler + .thumb_set AD16C4T0_TRIG_COM_Handler,Default_Handler + + .weak AD16C4T0_CC_Handler + .thumb_set AD16C4T0_CC_Handler,Default_Handler + + .weak AD16C4T1_BRK_Handler + .thumb_set AD16C4T1_BRK_Handler,Default_Handler + + .weak AD16C4T1_UP_Handler + .thumb_set AD16C4T1_UP_Handler,Default_Handler + + .weak AD16C4T1_TRIG_COM_Handler + .thumb_set AD16C4T1_TRIG_COM_Handler,Default_Handler + + .weak AD16C4T1_CC_Handler + .thumb_set AD16C4T1_CC_Handler,Default_Handler + + .weak GP32C4T0_Handler + .thumb_set GP32C4T0_Handler,Default_Handler + + .weak GP32C4T1_Handler + .thumb_set GP32C4T1_Handler,Default_Handler + + .weak BS16T0_Handler + .thumb_set BS16T0_Handler,Default_Handler + + .weak BS16T1_Handler + .thumb_set BS16T1_Handler,Default_Handler + + .weak GP16C4T0_Handler + .thumb_set GP16C4T0_Handler,Default_Handler + + .weak GP16C4T1_Handler + .thumb_set GP16C4T1_Handler,Default_Handler + + .weak DAC0_CH0_Handler + .thumb_set DAC0_CH0_Handler,Default_Handler + + .weak I2C0_EV_Handler + .thumb_set I2C0_EV_Handler,Default_Handler + + .weak I2C0_ERR_Handler + .thumb_set I2C0_ERR_Handler,Default_Handler + + .weak I2C1_EV_Handler + .thumb_set I2C1_EV_Handler,Default_Handler + + .weak I2C1_ERR_Handler + .thumb_set I2C1_ERR_Handler,Default_Handler + + .weak SPI0_I2S0_Handler + .thumb_set SPI0_I2S0_Handler,Default_Handler + + .weak SPI1_I2S1_Handler + .thumb_set SPI1_I2S1_Handler,Default_Handler + + .weak UART0_Handler + .thumb_set UART0_Handler,Default_Handler + + .weak UART1_Handler + .thumb_set UART1_Handler,Default_Handler + + .weak UART2_Handler + .thumb_set UART2_Handler,Default_Handler + + .weak UART3_Handler + .thumb_set UART3_Handler,Default_Handler + + .weak UART4_Handler + .thumb_set UART4_Handler,Default_Handler + + .weak UART5_Handler + .thumb_set UART5_Handler,Default_Handler + + .weak CRYPT_Handler + .thumb_set CRYPT_Handler,Default_Handler + + .weak ACMP0_Handler + .thumb_set ACMP0_Handler,Default_Handler + + .weak ACMP1_Handler + .thumb_set ACMP1_Handler,Default_Handler + + .weak SPI2_I2S2_Handler + .thumb_set SPI2_I2S2_Handler,Default_Handler + + .weak EBI_Handler + .thumb_set EBI_Handler,Default_Handler + + .weak TRNG_Handler + .thumb_set TRNG_Handler,Default_Handler + + .weak TSENSE_Handler + .thumb_set TSENSE_Handler,Default_Handler + + .weak EXTI0_Handler + .thumb_set EXTI0_Handler,Default_Handler + + .weak EXTI1_Handler + .thumb_set EXTI1_Handler,Default_Handler + + .weak EXTI2_Handler + .thumb_set EXTI2_Handler,Default_Handler + + .weak EXTI3_Handler + .thumb_set EXTI3_Handler,Default_Handler + + .weak EXTI4_Handler + .thumb_set EXTI4_Handler,Default_Handler + + .weak EXTI5_Handler + .thumb_set EXTI5_Handler,Default_Handler + + .weak EXTI6_Handler + .thumb_set EXTI6_Handler,Default_Handler + + .weak EXTI7_Handler + .thumb_set EXTI7_Handler,Default_Handler + + .weak EXTI8_Handler + .thumb_set EXTI8_Handler,Default_Handler + + .weak EXTI9_Handler + .thumb_set EXTI9_Handler,Default_Handler + + .weak EXTI10_Handler + .thumb_set EXTI10_Handler,Default_Handler + + .weak EXTI11_Handler + .thumb_set EXTI11_Handler,Default_Handler + + .weak EXTI12_Handler + .thumb_set EXTI12_Handler,Default_Handler + + .weak EXTI13_Handler + .thumb_set EXTI13_Handler,Default_Handler + + .weak EXTI14_Handler + .thumb_set EXTI14_Handler,Default_Handler + + .weak EXTI15_Handler + .thumb_set EXTI15_Handler,Default_Handler + + .weak DMA_Handler + .thumb_set DMA_Handler,Default_Handler + + .weak ADC1_Handler + .thumb_set ADC1_Handler,Default_Handler + + .weak DAC0_CH1_Handler + .thumb_set DAC0_CH1_Handler,Default_Handler + + .weak QSPI_Handler + .thumb_set QSPI_Handler,Default_Handler + + .weak USB_INT_Handler + .thumb_set USB_INT_Handler,Default_Handler + + .weak USB_DMA_Handler + .thumb_set USB_DMA_Handler,Default_Handler + + .weak ACMP2_Handler + .thumb_set ACMP2_Handler,Default_Handler + diff --git a/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/keil/startup_es32f36xx.s b/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/keil/startup_es32f36xx.s index 362c8483fe..c8aaf3ed69 100644 --- a/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/keil/startup_es32f36xx.s +++ b/bsp/essemi/es32f369x/libraries/CMSIS/Device/EastSoft/ES32F36xx/Startup/keil/startup_es32f36xx.s @@ -4,6 +4,20 @@ ; author : AE Team ; data : 23 Jan 2019 ; Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. +; +; SPDX-License-Identifier: Apache-2.0 +; +; Licensed under the Apache License, Version 2.0 (the License); you may +; not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an AS IS BASIS, WITHOUT +; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. ;******************************************************************************* ;Stack Configuration------------------------------------------------------------ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_acmp.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_acmp.h index 7fbb68e655..60877098d6 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_acmp.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_acmp.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_adc.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_adc.h index 2638e139fd..e88c16d10b 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_adc.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_adc.h @@ -9,6 +9,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ****************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_bkpc.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_bkpc.h index ce23ba73e9..246f6397d3 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_bkpc.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_bkpc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_calc.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_calc.h index bd861b2d04..e14ff7851e 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_calc.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_calc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_can.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_can.h index 196094eaaa..04a5d5ef5e 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_can.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_can.h @@ -10,6 +10,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ****************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_cmu.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_cmu.h index 400551ae45..55d713ed38 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_cmu.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_cmu.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_conf.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_conf.h index 1ee5597055..4953ab4f14 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_conf.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_conf.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crc.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crc.h index dcd6761acb..4e0f3cc152 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crc.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crc.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crypt.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crypt.h index f72cb06fc7..36a4d41387 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crypt.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_crypt.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dac.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dac.h index d086905826..0e71f3e7e0 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dac.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dac.h @@ -9,6 +9,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ****************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dbgc.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dbgc.h index 4d72f6cb2b..c6471b2c2c 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dbgc.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dbgc.h @@ -10,6 +10,21 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dma.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dma.h index efd366889c..6f29a0cc7b 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dma.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_dma.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_ebi.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_ebi.h index a4c0f372d6..d3ed85d97a 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_ebi.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_ebi.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_flash.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_flash.h index 3a1dfac113..8899ca4326 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_flash.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_flash.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_gpio.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_gpio.h index 4731c34a67..517330ce32 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_gpio.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_gpio.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2c.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2c.h index 7219542d60..c520c3d41a 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2c.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2c.h @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2s.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2s.h index 46d0c36c8e..e6a811aae3 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2s.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_i2s.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_iap.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_iap.h index 900cc43086..cb1e0bf023 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_iap.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_iap.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nand.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nand.h index bf08b7de80..89d8d5875b 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nand.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nand.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nor_lcd.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nor_lcd.h index 83a200b34e..9815aa6ebc 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nor_lcd.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_nor_lcd.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pis.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pis.h index 992b3790f0..39f481a5be 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pis.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pis.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pmu.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pmu.h index d58c34db24..f400be8a9f 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pmu.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_pmu.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_qspi.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_qspi.h index a8e80b09d8..f4e2642dcd 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_qspi.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_qspi.h @@ -7,6 +7,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rmu.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rmu.h index 07319306b0..bb3ec3df89 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rmu.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rmu.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtc.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtc.h index 4c31312e84..3234aa7d6e 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtc.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtc.h @@ -10,6 +10,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtchw.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtchw.h index 55cbbfec47..6faecf5145 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtchw.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_rtchw.h @@ -10,6 +10,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_spi.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_spi.h index 63a4a01f56..ebda1db3a7 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_spi.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_spi.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_sram.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_sram.h index 2743b83535..aff23692a3 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_sram.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_sram.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_syscfg.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_syscfg.h index c541c714ed..35063a28a1 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_syscfg.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_syscfg.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_timer.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_timer.h index 1805c3f95a..dcbc884368 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_timer.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_timer.h @@ -12,6 +12,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_trng.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_trng.h index ff86dbbcbf..267a7db0da 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_trng.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_trng.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_tsense.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_tsense.h index 6aff4435b1..cceb2587ec 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_tsense.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_tsense.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_uart.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_uart.h index a525f59783..56c1b5b94d 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_uart.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_uart.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_usb.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_usb.h index 38c991a757..d319f7a575 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_usb.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_usb.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_wdt.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_wdt.h index 5629fafaa3..805be32d50 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_wdt.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/ald_wdt.h @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/type.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/type.h index ea5bd88970..a8db397a97 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/type.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/type.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ @@ -22,7 +36,7 @@ extern "C" { #endif #include - +#include "es_conf_info_select.h" #if defined (__CC_ARM) #define __INLINE__ __inline diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/utils.h b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/utils.h index 1c6b1b942f..b5589ce07a 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/utils.h +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Include/utils.h @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_acmp.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_acmp.c index 75c53bda13..2e2dbe74d5 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_acmp.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_acmp.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_adc.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_adc.c index c239d074b2..6870742cc0 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_adc.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_adc.c @@ -24,6 +24,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_bkpc.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_bkpc.c index c0a5e86f8a..568f7cec0e 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_bkpc.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_bkpc.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_calc.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_calc.c index 7a00c641fb..a49d150e32 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_calc.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_calc.c @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_can.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_can.c index 24cabd8cef..ec9ec28260 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_can.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_can.c @@ -14,6 +14,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_cmu.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_cmu.c index 76c6e516be..8beb08de5b 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_cmu.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_cmu.c @@ -9,7 +9,21 @@ * @author AE Team * @note * - * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * ********************************************************************************* * @verbatim diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crc.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crc.c index ad0199a486..ea64ad1245 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crc.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crc.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crypt.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crypt.c index 4d17afca3b..04a0fa19de 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crypt.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_crypt.c @@ -12,6 +12,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dac.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dac.c index ba07048b07..7f98ce0b88 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dac.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dac.c @@ -10,6 +10,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dma.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dma.c index a314e72b29..eae14f80c3 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dma.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_dma.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_ebi.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_ebi.c index 5fc69ba3f9..d58acdfc9b 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_ebi.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_ebi.c @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. ****************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash.c index 48c7fe0228..33b114fa55 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * ********************************************************************************* diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash_ext.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash_ext.c index 0c8f94b3a2..07d7dc5f60 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash_ext.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_flash_ext.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * ********************************************************************************* diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_gpio.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_gpio.c index 686bb601d2..255c569463 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_gpio.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_gpio.c @@ -16,6 +16,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== @@ -185,7 +199,7 @@ void ald_gpio_init(GPIO_TypeDef *GPIOx, uint16_t pin, gpio_init_t *init) for (i = 0; i < 16; ++i) { if (((pin >> i) & 0x1) == 0) continue; - + /* Get position and 2-bits mask */ pos = i << 1; mask = 0x3 << pos; diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2c.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2c.c index 419bb25481..37ec31d67d 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2c.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2c.c @@ -10,6 +10,20 @@ * @note * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2s.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2s.c index 9570ddf8f7..c018037845 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2s.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_i2s.c @@ -17,6 +17,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_iap.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_iap.c index e350c0a3ac..a2265bc1dc 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_iap.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_iap.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nand.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nand.c index 1595d520e6..cc178feb7f 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nand.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nand.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nor_lcd.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nor_lcd.c index 4d52faee86..ca28cbf091 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nor_lcd.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_nor_lcd.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pis.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pis.c index e26037fcfc..3546c0b3be 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pis.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pis.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pmu.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pmu.c index bb588747db..0d411b0bbd 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pmu.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_pmu.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_qspi.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_qspi.c index d0c0ecb3ac..b8bd90ffc1 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_qspi.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_qspi.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ #include "ald_qspi.h" diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rmu.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rmu.c index c5bd06b325..55869f621b 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rmu.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rmu.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtc.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtc.c index c0fd24b64f..baf3e5d205 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtc.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtc.c @@ -18,6 +18,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtchw.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtchw.c index c423f657cb..684e1eb5e8 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtchw.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_rtchw.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ******************************************************************************** */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_spi.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_spi.c index ce78e605a7..470167d65e 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_spi.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_spi.c @@ -17,6 +17,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_sram.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_sram.c index 31f7491679..384175d117 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_sram.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_sram.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ #include "ald_sram.h" diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_timer.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_timer.c index 49e8ccee2c..7860499237 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_timer.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_timer.c @@ -12,6 +12,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_trng.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_trng.c index 200f8db8bc..54496cec18 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_trng.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_trng.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_tsense.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_tsense.c index b5bbc8534b..90c341c864 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_tsense.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_tsense.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_uart.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_uart.c index f747967e32..84c96348c6 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_uart.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_uart.c @@ -17,6 +17,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* * @verbatim ============================================================================== diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_usb.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_usb.c index 26605cd791..3524853e37 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_usb.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_usb.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_wdt.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_wdt.c index 1e69e95d8f..2077cdabed 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_wdt.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/ald_wdt.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ #include "ald_conf.h" diff --git a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/utils.c b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/utils.c index bd247fc055..d2c5bfecb6 100644 --- a/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/utils.c +++ b/bsp/essemi/es32f369x/libraries/ES32F36xx_ALD_StdPeriph_Driver/Source/utils.c @@ -11,6 +11,20 @@ * * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved. * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ********************************************************************************* */ diff --git a/bsp/essemi/es32f369x/project.uvoptx b/bsp/essemi/es32f369x/project.uvoptx index 9820d88eaa..2ee2601b40 100644 --- a/bsp/essemi/es32f369x/project.uvoptx +++ b/bsp/essemi/es32f369x/project.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 @@ -176,7 +176,7 @@ Applications - 1 + 0 0 0 0 @@ -195,7 +195,7 @@ - cpu + CPU 0 0 0 @@ -275,66 +275,6 @@ 0 0 0 - ..\..\..\components\drivers\can\can.c - can.c - 0 - 0 - - - 3 - 8 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c - 0 - 0 - - - 3 - 9 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\i2c\i2c_core.c - i2c_core.c - 0 - 0 - - - 3 - 10 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\i2c\i2c_dev.c - i2c_dev.c - 0 - 0 - - - 3 - 11 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - i2c-bit-ops.c - 0 - 0 - - - 3 - 12 - 1 - 0 - 0 - 0 ..\..\..\components\drivers\misc\pin.c pin.c 0 @@ -342,55 +282,7 @@ 3 - 13 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\misc\adc.c - adc.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - rt_drv_pwm.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\pm\pm.c - pm.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\rtc\rtc.c - rtc.c - 0 - 0 - - - 3 - 17 + 8 1 0 0 @@ -402,43 +294,7 @@ 3 - 18 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_core.c - spi_core.c - 0 - 0 - - - 3 - 19 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_dev.c - spi_dev.c - 0 - 0 - - - 3 - 20 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\src\completion.c - completion.c - 0 - 0 - - - 3 - 21 + 9 1 0 0 @@ -450,7 +306,7 @@ 3 - 22 + 10 1 0 0 @@ -462,7 +318,31 @@ 3 - 23 + 11 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 3 + 13 1 0 0 @@ -474,7 +354,7 @@ 3 - 24 + 14 1 0 0 @@ -486,7 +366,7 @@ 3 - 25 + 15 1 0 0 @@ -496,18 +376,6 @@ 0 0 - - 3 - 26 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\src\workqueue.c - workqueue.c - 0 - 0 - @@ -518,19 +386,7 @@ 0 4 - 27 - 1 - 0 - 0 - 0 - drivers\board.c - board.c - 0 - 0 - - - 4 - 28 + 16 1 0 0 @@ -542,7 +398,7 @@ 4 - 29 + 17 1 0 0 @@ -552,6 +408,18 @@ 0 0 + + 4 + 18 + 1 + 0 + 0 + 0 + drivers\board.c + board.c + 0 + 0 + @@ -562,7 +430,7 @@ 0 5 - 30 + 19 1 0 0 @@ -574,19 +442,7 @@ 5 - 31 - 1 - 0 - 0 - 0 - ..\..\..\components\finsh\cmd.c - cmd.c - 0 - 0 - - - 5 - 32 + 20 1 0 0 @@ -596,6 +452,18 @@ 0 0 + + 5 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + @@ -604,6 +472,138 @@ 0 0 0 + + 6 + 22 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 23 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 24 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + 6 + 25 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 26 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 27 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 6 + 28 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + 6 33 @@ -611,8 +611,8 @@ 0 0 0 - ..\..\..\src\clock.c - clock.c + ..\..\..\src\device.c + device.c 0 0 @@ -635,140 +635,28 @@ 0 0 0 - ..\..\..\src\device.c - device.c + ..\..\..\src\clock.c + clock.c 0 0 + + + + libc + 0 + 0 + 0 + 0 - 6 + 7 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.c - scheduler.c - 0 - 0 - - - 6 - 44 - 1 - 0 - 0 - 0 - ..\..\..\src\signal.c - signal.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 + ..\..\..\components\libc\compilers\common\time.c + time.c 0 0 @@ -781,176 +669,8 @@ 0 0 - 7 - 47 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_acmp.c - ald_acmp.c - 0 - 0 - - - 7 - 48 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_adc.c - ald_adc.c - 0 - 0 - - - 7 - 49 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_bkpc.c - ald_bkpc.c - 0 - 0 - - - 7 - 50 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_calc.c - ald_calc.c - 0 - 0 - - - 7 - 51 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_can.c - ald_can.c - 0 - 0 - - - 7 - 52 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_cmu.c - ald_cmu.c - 0 - 0 - - - 7 - 53 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crc.c - ald_crc.c - 0 - 0 - - - 7 - 54 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crypt.c - ald_crypt.c - 0 - 0 - - - 7 - 55 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dac.c - ald_dac.c - 0 - 0 - - - 7 - 56 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dma.c - ald_dma.c - 0 - 0 - - - 7 - 57 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_ebi.c - ald_ebi.c - 0 - 0 - - - 7 - 58 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash.c - ald_flash.c - 0 - 0 - - - 7 - 59 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash_ext.c - ald_flash_ext.c - 0 - 0 - - - 7 - 60 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_gpio.c - ald_gpio.c - 0 - 0 - - - 7 - 61 + 8 + 37 1 0 0 @@ -961,44 +681,44 @@ 0 - 7 - 62 + 8 + 38 1 0 0 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_i2s.c - ald_i2s.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_ebi.c + ald_ebi.c 0 0 - 7 - 63 + 8 + 39 1 0 0 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_iap.c - ald_iap.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtc.c + ald_rtc.c 0 0 - 7 - 64 + 8 + 40 1 0 0 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_nand.c - ald_nand.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_can.c + ald_can.c 0 0 - 7 - 65 + 8 + 41 1 0 0 @@ -1009,8 +729,20 @@ 0 - 7 - 66 + 8 + 42 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_cmu.c + ald_cmu.c + 0 + 0 + + + 8 + 43 1 0 0 @@ -1021,7 +753,283 @@ 0 - 7 + 8 + 44 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_timer.c + ald_timer.c + 0 + 0 + + + 8 + 45 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_sram.c + ald_sram.c + 0 + 0 + + + 8 + 46 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_iap.c + ald_iap.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_wdt.c + ald_wdt.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtchw.c + ald_rtchw.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dac.c + ald_dac.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_acmp.c + ald_acmp.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_gpio.c + ald_gpio.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_tsense.c + ald_tsense.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dma.c + ald_dma.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rmu.c + ald_rmu.c + 0 + 0 + + + 8 + 55 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_trng.c + ald_trng.c + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_spi.c + ald_spi.c + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crc.c + ald_crc.c + 0 + 0 + + + 8 + 58 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_usb.c + ald_usb.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_calc.c + ald_calc.c + 0 + 0 + + + 8 + 60 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\utils.c + utils.c + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_qspi.c + ald_qspi.c + 0 + 0 + + + 8 + 62 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash.c + ald_flash.c + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_nand.c + ald_nand.c + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_adc.c + ald_adc.c + 0 + 0 + + + 8 + 65 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crypt.c + ald_crypt.c + 0 + 0 + + + 8 + 66 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_uart.c + ald_uart.c + 0 + 0 + + + 8 67 1 0 @@ -1033,164 +1041,32 @@ 0 - 7 + 8 68 1 0 0 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_qspi.c - ald_qspi.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_bkpc.c + ald_bkpc.c 0 0 - 7 + 8 69 1 0 0 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rmu.c - ald_rmu.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash_ext.c + ald_flash_ext.c 0 0 - 7 + 8 70 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtc.c - ald_rtc.c - 0 - 0 - - - 7 - 71 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtchw.c - ald_rtchw.c - 0 - 0 - - - 7 - 72 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_spi.c - ald_spi.c - 0 - 0 - - - 7 - 73 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_sram.c - ald_sram.c - 0 - 0 - - - 7 - 74 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_timer.c - ald_timer.c - 0 - 0 - - - 7 - 75 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_trng.c - ald_trng.c - 0 - 0 - - - 7 - 76 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_tsense.c - ald_tsense.c - 0 - 0 - - - 7 - 77 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_uart.c - ald_uart.c - 0 - 0 - - - 7 - 78 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_usb.c - ald_usb.c - 0 - 0 - - - 7 - 79 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_wdt.c - ald_wdt.c - 0 - 0 - - - 7 - 80 - 1 - 0 - 0 - 0 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\utils.c - utils.c - 0 - 0 - - - 7 - 81 2 0 0 @@ -1200,6 +1076,18 @@ 0 0 + + 8 + 71 + 1 + 0 + 0 + 0 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_i2s.c + ald_i2s.c + 0 + 0 + diff --git a/bsp/essemi/es32f369x/project.uvprojx b/bsp/essemi/es32f369x/project.uvprojx index bca6765ef1..5fc8ec68b0 100644 --- a/bsp/essemi/es32f369x/project.uvprojx +++ b/bsp/essemi/es32f369x/project.uvprojx @@ -336,9 +336,9 @@ 0 - ES32F36xx + ES32F36xx, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND - applications;.;drivers;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\include;drivers;..\..\..\components\finsh;.;..\..\..\include;libraries\CMSIS\Device\EastSoft\ES32F36xx\Include;libraries\CMSIS\Include;libraries\ES32F36xx_ALD_StdPeriph_Driver\Include + applications;.;drivers\ES;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;drivers;..\..\..\components\finsh;.;..\..\..\include;..\..\..\components\libc\compilers\common;libraries\CMSIS\Device\EastSoft\ES32F36xx\Include;libraries\CMSIS\Include;libraries\ES32F36xx_ALD_StdPeriph_Driver\Include @@ -390,7 +390,7 @@ - cpu + CPU backtrace.c @@ -421,146 +421,17 @@ DeviceDrivers - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - pin.c 1 ..\..\..\components\drivers\misc\pin.c - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - serial.c 1 ..\..\..\components\drivers\serial\serial.c - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - completion.c - 1 - ..\..\..\components\drivers\src\completion.c - dataqueue.c 1 @@ -571,6 +442,16 @@ 1 ..\..\..\components\drivers\src\pipe.c + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + ringblk_buf.c 1 @@ -586,21 +467,11 @@ 1 ..\..\..\components\drivers\src\waitqueue.c - - workqueue.c - 1 - ..\..\..\components\drivers\src\workqueue.c - Drivers - - board.c - 1 - drivers\board.c - drv_gpio.c 1 @@ -611,6 +482,11 @@ 1 drivers\drv_uart.c + + board.c + 1 + drivers\board.c + @@ -621,45 +497,25 @@ 1 ..\..\..\components\finsh\shell.c - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - msh.c 1 ..\..\..\components\finsh\msh.c + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + Kernel - clock.c + mem.c 1 - ..\..\..\src\clock.c - - - components.c - 1 - ..\..\..\src\components.c - - - device.c - 1 - ..\..\..\src\device.c - - - idle.c - 1 - ..\..\..\src\idle.c - - - ipc.c - 1 - ..\..\..\src\ipc.c + ..\..\..\src\mem.c irq.c @@ -667,19 +523,9 @@ ..\..\..\src\irq.c - kservice.c + timer.c 1 - ..\..\..\src\kservice.c - - - mem.c - 1 - ..\..\..\src\mem.c - - - mempool.c - 1 - ..\..\..\src\mempool.c + ..\..\..\src\timer.c object.c @@ -687,24 +533,64 @@ ..\..\..\src\object.c - scheduler.c + kservice.c 1 - ..\..\..\src\scheduler.c + ..\..\..\src\kservice.c signal.c 1 ..\..\..\src\signal.c + + mempool.c + 1 + ..\..\..\src\mempool.c + thread.c 1 ..\..\..\src\thread.c - timer.c + ipc.c 1 - ..\..\..\src\timer.c + ..\..\..\src\ipc.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + device.c + 1 + ..\..\..\src\device.c + + + components.c + 1 + ..\..\..\src\components.c + + + clock.c + 1 + ..\..\..\src\clock.c + + + + + libc + + + time.c + 1 + ..\..\..\components\libc\compilers\common\time.c @@ -712,54 +598,9 @@ Libraries - ald_acmp.c + ald_i2c.c 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_acmp.c - - - ald_adc.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_adc.c - - - ald_bkpc.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_bkpc.c - - - ald_calc.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_calc.c - - - ald_can.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_can.c - - - ald_cmu.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_cmu.c - - - ald_crc.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crc.c - - - ald_crypt.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crypt.c - - - ald_dac.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dac.c - - - ald_dma.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dma.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_i2c.c ald_ebi.c @@ -767,125 +608,170 @@ libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_ebi.c - ald_flash.c + ald_rtc.c 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtc.c - ald_flash_ext.c + ald_can.c 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash_ext.c - - - ald_gpio.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_gpio.c - - - ald_i2c.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_i2c.c - - - ald_i2s.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_i2s.c - - - ald_iap.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_iap.c - - - ald_nand.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_nand.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_can.c ald_nor_lcd.c 1 libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_nor_lcd.c + + ald_cmu.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_cmu.c + ald_pis.c 1 libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_pis.c - - ald_pmu.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_pmu.c - - - ald_qspi.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_qspi.c - - - ald_rmu.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rmu.c - - - ald_rtc.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtc.c - - - ald_rtchw.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtchw.c - - - ald_spi.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_spi.c - - - ald_sram.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_sram.c - ald_timer.c 1 libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_timer.c - ald_trng.c + ald_sram.c 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_trng.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_sram.c - ald_tsense.c + ald_iap.c 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_tsense.c - - - ald_uart.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_uart.c - - - ald_usb.c - 1 - libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_usb.c + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_iap.c ald_wdt.c 1 libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_wdt.c + + ald_rtchw.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rtchw.c + + + ald_dac.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dac.c + + + ald_acmp.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_acmp.c + + + ald_gpio.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_gpio.c + + + ald_tsense.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_tsense.c + + + ald_dma.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_dma.c + + + ald_rmu.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_rmu.c + + + ald_trng.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_trng.c + + + ald_spi.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_spi.c + + + ald_crc.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crc.c + + + ald_usb.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_usb.c + + + ald_calc.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_calc.c + utils.c 1 libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\utils.c + + ald_qspi.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_qspi.c + + + ald_flash.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash.c + + + ald_nand.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_nand.c + + + ald_adc.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_adc.c + + + ald_crypt.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_crypt.c + + + ald_uart.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_uart.c + + + ald_pmu.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_pmu.c + + + ald_bkpc.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_bkpc.c + + + ald_flash_ext.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_flash_ext.c + startup_es32f36xx.s 2 libraries\CMSIS\Device\EastSoft\ES32F36xx\Startup\keil\startup_es32f36xx.s + + ald_i2s.c + 1 + libraries\ES32F36xx_ALD_StdPeriph_Driver\Source\ald_i2s.c + diff --git a/bsp/essemi/es32f369x/rtconfig.h b/bsp/essemi/es32f369x/rtconfig.h index 54bd07901b..819056462c 100644 --- a/bsp/essemi/es32f369x/rtconfig.h +++ b/bsp/essemi/es32f369x/rtconfig.h @@ -15,7 +15,7 @@ #define RT_USING_HOOK #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 256 +#define IDLE_THREAD_STACK_SIZE 512 #define RT_DEBUG #define RT_DEBUG_COLOR @@ -26,6 +26,7 @@ #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE +#define RT_USING_SIGNALS /* Memory Management */ @@ -76,22 +77,14 @@ #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_CAN -#define RT_USING_HWTIMER -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS #define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_PM -#define RT_USING_RTC -#define RT_USING_SPI /* Using USB */ /* POSIX layer and C standard library */ +#define RT_LIBC_USING_TIME /* Network */ @@ -144,6 +137,9 @@ /* system packages */ +/* Micrium: Micrium software products porting for RT-Thread */ + + /* peripheral libraries and drivers */ @@ -152,6 +148,9 @@ /* samples: kernel and components samples */ + +/* games: games run on RT-Thread console */ + #define SOC_ES32F3696LT /* Hardware Drivers Config */ @@ -179,7 +178,7 @@ /* RTC Drivers */ -/* HWtimer Drivers */ +/* HWTIMER Drivers */ /* PWM Drivers */ diff --git a/bsp/essemi/es32f369x/template.uvoptx b/bsp/essemi/es32f369x/template.uvoptx index 8d3f54f7f5..8e6583c22c 100644 --- a/bsp/essemi/es32f369x/template.uvoptx +++ b/bsp/essemi/es32f369x/template.uvoptx @@ -101,7 +101,9 @@ 0 0 1 - 2 + 0 + 0 + 3 @@ -165,6 +167,10 @@ + + + + diff --git a/bsp/essemi/es32f369x/template.uvprojx b/bsp/essemi/es32f369x/template.uvprojx index ad28753eb3..df9bb4e30c 100644 --- a/bsp/essemi/es32f369x/template.uvprojx +++ b/bsp/essemi/es32f369x/template.uvprojx @@ -10,11 +10,13 @@ rt-thread 0x4 ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 ES32F3696LT Eastsoft - Eastsoft.ES32_DFP.1.0.5 + Eastsoft.ES32_DFP.7.2350 http://www.essemi.com IRAM(0x20000000,0x00018000) IROM(0x00000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -182,6 +184,7 @@ 0 0 0 + 0 0 0 8 @@ -322,6 +325,7 @@ 0 0 1 + 0 0 1 1 From c444c5d3d49595ae9f5323e083355f6b9f0420ee Mon Sep 17 00:00:00 2001 From: THEWON Date: Wed, 16 Jun 2021 16:37:53 +0800 Subject: [PATCH 5/5] =?UTF-8?q?update=20bsp/stm32/libraries/HAL=5FDrivers/?= =?UTF-8?q?drv=5Fusbh.c.=20=E4=BF=AE=E6=94=B9=E4=BA=86=20hcd=20=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E5=87=BD=E6=95=B0=E3=80=82=E5=88=A0=E6=8E=89?= =?UTF-8?q?=20RT=5FASSERT=20=E5=AE=8F=E8=B0=83=E7=94=A8=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E6=96=B9=E6=B3=95=E3=80=82=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=9B=A0=E7=A6=81=E7=94=A8=E8=B0=83=E8=AF=95=20RT=5FA?= =?UTF-8?q?SSERT=20=E5=AE=9A=E4=B9=89=E4=B8=BA=E7=A9=BA=EF=BC=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=20HAL=5FHCD=5FInit=20=E4=B8=8D=E8=A2=AB=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E7=9A=84=E6=83=85=E5=86=B5=E5=87=BA=E7=8E=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/HAL_Drivers/drv_usbh.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usbh.c b/bsp/stm32/libraries/HAL_Drivers/drv_usbh.c index ad65accd07..9486e1a56d 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usbh.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usbh.c @@ -197,6 +197,8 @@ static struct uhcd_ops _uhcd_ops = static rt_err_t stm32_hcd_init(rt_device_t device) { + HAL_StatusTypeDef state; + HCD_HandleTypeDef *hhcd = (HCD_HandleTypeDef *)device->user_data; hhcd->Instance = USB_OTG_FS; hhcd->Init.Host_channels = 8; @@ -204,7 +206,11 @@ static rt_err_t stm32_hcd_init(rt_device_t device) hhcd->Init.dma_enable = DISABLE; hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; hhcd->Init.Sof_enable = DISABLE; - RT_ASSERT(HAL_HCD_Init(hhcd) == HAL_OK); + state = HAL_HCD_Init(hhcd); + if (state != HAL_OK) + { + return -RT_ERROR; + } HAL_HCD_Start(hhcd); #ifdef USBH_USING_CONTROLLABLE_POWER rt_pin_mode(USBH_POWER_PIN, PIN_MODE_OUTPUT);