From 607b8ca017d00a4023c7d3704e8b74a679555445 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Thu, 2 Dec 2021 15:17:59 +0800 Subject: [PATCH 1/5] transplant development board of gd32vf103_rvstar --- APP_Framework/Applications/main.c | 2 +- .../xiuos/user_api/posix_support/Makefile | 12 +- Ubiquitous/XiUOS/Makefile | 2 +- Ubiquitous/XiUOS/arch/risc-v/Makefile | 4 + .../arch/risc-v/gd32vf103_rvstar/Makefile | 3 + .../risc-v/gd32vf103_rvstar/arch_interrupt.h | 12 + .../XiUOS/arch/risc-v/gd32vf103_rvstar/boot.S | 486 ++++++ .../arch/risc-v/gd32vf103_rvstar/interrupt.c | 61 + .../gd32vf103_rvstar/intexc_gd32vf103.S | 232 +++ .../XiUOS/arch/risc-v/gd32vf103_rvstar/tick.c | 28 + .../XiUOS/board/gd32vf103_rvstar/Kconfig | 31 + .../XiUOS/board/gd32vf103_rvstar/Makefile | 6 + .../XiUOS/board/gd32vf103_rvstar/README.md | 175 +++ .../XiUOS/board/gd32vf103_rvstar/board.c | 86 ++ .../XiUOS/board/gd32vf103_rvstar/board.h | 67 + .../XiUOS/board/gd32vf103_rvstar/config.mk | 34 + .../gd32vf103_rvstar/gd32vf103v_rvstar.c | 191 +++ .../gd32vf103_rvstar/gd32vf103v_rvstar.h | 131 ++ .../XiUOS/board/gd32vf103_rvstar/link.lds | 299 ++++ .../board/gd32vf103_rvstar/nuclei_sdk_hal.h | 20 + .../board/gd32vf103_rvstar/nuclei_sdk_soc.h | 20 + .../third_party_driver/Kconfig | 25 + .../third_party_driver/Makefile | 17 + .../third_party_driver/gpio/Kconfig | 11 + .../third_party_driver/gpio/Makefile | 3 + .../third_party_driver/gpio/gd32vf103_gpio.c | 502 ++++++ .../third_party_driver/include/connect_uart.h | 38 + .../include/core_feature_base.h | 1352 +++++++++++++++++ .../include/core_feature_eclic.h | 894 +++++++++++ .../include/core_feature_timer.h | 364 +++++ .../third_party_driver/include/gd32vf103.h | 445 ++++++ .../include/gd32vf103_gpio.h | 423 ++++++ .../include/gd32vf103_rcu.h | 760 +++++++++ .../include/gd32vf103_timer.h | 720 +++++++++ .../include/gd32vf103_usart.h | 375 +++++ .../third_party_driver/include/nmsis_gcc.h | 265 ++++ .../third_party_driver/include/riscv_bits.h | 94 ++ .../include/riscv_encoding.h | 690 +++++++++ .../third_party_driver/sys_clock/Kconfig | 1 + .../third_party_driver/sys_clock/Makefile | 3 + .../sys_clock/gd32vf103_rcu.c | 1103 ++++++++++++++ .../sys_clock/gd32vf103_soc.c | 60 + .../third_party_driver/system_gd32vf103.c | 603 ++++++++ .../third_party_driver/system_gd32vf103.h | 110 ++ .../third_party_driver/uart/Kconfig | 14 + .../third_party_driver/uart/Makefile | 4 + .../third_party_driver/uart/connect_uart.c | 378 +++++ .../third_party_driver/uart/gd32vf103_usart.c | 781 ++++++++++ Ubiquitous/XiUOS/path_kernel.mk | 12 + 49 files changed, 11946 insertions(+), 3 deletions(-) create mode 100755 Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/Makefile create mode 100755 Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/arch_interrupt.h create mode 100755 Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/boot.S create mode 100755 Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/interrupt.c create mode 100755 Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/intexc_gd32vf103.S create mode 100755 Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/tick.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/Kconfig create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/Makefile create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/link.lds create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_hal.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_soc.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Kconfig create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Makefile create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Kconfig create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Makefile create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/gd32vf103_gpio.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/connect_uart.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_base.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_eclic.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_timer.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_gpio.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_rcu.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_timer.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_usart.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/nmsis_gcc.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_bits.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_encoding.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Kconfig create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Makefile create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_rcu.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_soc.c create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.h create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Kconfig create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Makefile create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c create mode 100755 Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c diff --git a/APP_Framework/Applications/main.c b/APP_Framework/Applications/main.c index b23c8d881..3a12d762f 100644 --- a/APP_Framework/Applications/main.c +++ b/APP_Framework/Applications/main.c @@ -12,7 +12,7 @@ #include #include -#include +// #include #include extern int FrameworkInit(); diff --git a/APP_Framework/Framework/transform_layer/xiuos/user_api/posix_support/Makefile b/APP_Framework/Framework/transform_layer/xiuos/user_api/posix_support/Makefile index ec8c5f715..abdf776a8 100644 --- a/APP_Framework/Framework/transform_layer/xiuos/user_api/posix_support/Makefile +++ b/APP_Framework/Framework/transform_layer/xiuos/user_api/posix_support/Makefile @@ -1,4 +1,14 @@ -SRC_FILES := pthread.c semaphore.c pthread_mutex.c mqueue.c +SRC_FILES := pthread.c +ifeq ($(CONFIG_KERNEL_SEMAPHORE),y) + SRC_FILES += semaphore.c +endif +ifeq ($(CONFIG_KERNEL_MUTEX),y) + SRC_FILES += pthread_mutex.c +endif + +ifeq ($(CONFIG_KERNEL_MESSAGEQUEUE),y) + SRC_FILES += mqueue.c +endif include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiUOS/Makefile b/Ubiquitous/XiUOS/Makefile index a83871b0f..c6d162ebf 100755 --- a/Ubiquitous/XiUOS/Makefile +++ b/Ubiquitous/XiUOS/Makefile @@ -5,7 +5,7 @@ MAKEFLAGS += --no-print-directory .PHONY:COMPILE_APP COMPILE_KERNEL -support :=kd233 stm32f407-st-discovery maix-go stm32f407zgt6 aiit-riscv64-board aiit-arm32-board hifive1-rev-B hifive1-emulator k210-emulator cortex-m3-emulator cortex-m4-emulator ok1052-c gapuino +support :=kd233 stm32f407-st-discovery maix-go stm32f407zgt6 aiit-riscv64-board aiit-arm32-board hifive1-rev-B hifive1-emulator k210-emulator cortex-m3-emulator cortex-m4-emulator ok1052-c gapuino gd32vf103_rvstar SRC_DIR:= export BOARD ?=kd233 diff --git a/Ubiquitous/XiUOS/arch/risc-v/Makefile b/Ubiquitous/XiUOS/arch/risc-v/Makefile index 5c86eb8b4..61804b9f4 100755 --- a/Ubiquitous/XiUOS/arch/risc-v/Makefile +++ b/Ubiquitous/XiUOS/arch/risc-v/Makefile @@ -20,4 +20,8 @@ ifeq ($(CONFIG_BOARD_GAPUINO),y) SRC_DIR +=gap8 endif +ifeq ($(CONFIG_BOARD_GD32VF103RVSTAR),y) +SRC_DIR +=gd32vf103_rvstar +endif + include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/Makefile b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/Makefile new file mode 100755 index 000000000..ea1321028 --- /dev/null +++ b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := boot.S intexc_gd32vf103.S interrupt.c tick.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/arch_interrupt.h b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/arch_interrupt.h new file mode 100755 index 000000000..87e3734e3 --- /dev/null +++ b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/arch_interrupt.h @@ -0,0 +1,12 @@ +#ifndef ARCH_INTERRUPT_H__ +#define ARCH_INTERRUPT_H__ + +#include + +#define ARCH_MAX_IRQ_NUM 128 +#define ARCH_IRQ_NUM_OFFSET 0 + +int ArchEnableHwIrq(uint32_t irq_num); +int ArchDisableHwIrq(uint32_t irq_num); + +#endif \ No newline at end of file diff --git a/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/boot.S b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/boot.S new file mode 100755 index 000000000..a981cd98b --- /dev/null +++ b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/boot.S @@ -0,0 +1,486 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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. + */ +/****************************************************************************** + * \file startup_gd32vf103.S + * \brief NMSIS Nuclei N/NX Class Core based Core Device Startup File for + * Device gd32vf103 + * \version V1.00 + * \date 21 Nov 2019 + * + * + ******************************************************************************/ +#include "boot.h" +#include "riscv_encoding.h" + +#ifndef __riscv_32e +#define portRegNum 30 +#else +#define portRegNum 14 +#endif + +#define portCONTEXT_SIZE ( portRegNum * REGBYTES ) + +# .align 2 +# .global eclic_msip_handler +# eclic_msip_handler: +# addi sp, sp, -portCONTEXT_SIZE +# STORE x1, 1 * REGBYTES(sp) /* RA */ +# STORE x5, 2 * REGBYTES(sp) +# STORE x6, 3 * REGBYTES(sp) +# STORE x7, 4 * REGBYTES(sp) +# STORE x8, 5 * REGBYTES(sp) +# STORE x9, 6 * REGBYTES(sp) +# STORE x10, 7 * REGBYTES(sp) +# STORE x11, 8 * REGBYTES(sp) +# STORE x12, 9 * REGBYTES(sp) +# STORE x13, 10 * REGBYTES(sp) +# STORE x14, 11 * REGBYTES(sp) +# STORE x15, 12 * REGBYTES(sp) +# #ifndef __riscv_32e +# STORE x16, 13 * REGBYTES(sp) +# STORE x17, 14 * REGBYTES(sp) +# STORE x18, 15 * REGBYTES(sp) +# STORE x19, 16 * REGBYTES(sp) +# STORE x20, 17 * REGBYTES(sp) +# STORE x21, 18 * REGBYTES(sp) +# STORE x22, 19 * REGBYTES(sp) +# STORE x23, 20 * REGBYTES(sp) +# STORE x24, 21 * REGBYTES(sp) +# STORE x25, 22 * REGBYTES(sp) +# STORE x26, 23 * REGBYTES(sp) +# STORE x27, 24 * REGBYTES(sp) +# STORE x28, 25 * REGBYTES(sp) +# STORE x29, 26 * REGBYTES(sp) +# STORE x30, 27 * REGBYTES(sp) +# STORE x31, 28 * REGBYTES(sp) +# #endif +# /* Push mstatus to stack */ +# csrr t0, CSR_MSTATUS +# STORE t0, (portRegNum - 1) * REGBYTES(sp) + +# /* Push additional registers */ + +# /* Store sp to task stack */ +# LOAD t0, rt_interrupt_from_thread +# STORE sp, 0(t0) + +# csrr t0, CSR_MEPC +# STORE t0, 0(sp) + +# jal xPortTaskSwitch + +# /* Switch task context */ +# LOAD t0, rt_interrupt_to_thread +# LOAD sp, 0x0(t0) + +# /* Pop PC from stack and set MEPC */ +# LOAD t0, 0 * REGBYTES(sp) +# csrw CSR_MEPC, t0 +# /* Pop additional registers */ + +# /* Pop mstatus from stack and set it */ +# LOAD t0, (portRegNum - 1) * REGBYTES(sp) +# csrw CSR_MSTATUS, t0 +# /* Interrupt still disable here */ +# /* Restore Registers from Stack */ +# LOAD x1, 1 * REGBYTES(sp) /* RA */ +# LOAD x5, 2 * REGBYTES(sp) +# LOAD x6, 3 * REGBYTES(sp) +# LOAD x7, 4 * REGBYTES(sp) +# LOAD x8, 5 * REGBYTES(sp) +# LOAD x9, 6 * REGBYTES(sp) +# LOAD x10, 7 * REGBYTES(sp) +# LOAD x11, 8 * REGBYTES(sp) +# LOAD x12, 9 * REGBYTES(sp) +# LOAD x13, 10 * REGBYTES(sp) +# LOAD x14, 11 * REGBYTES(sp) +# LOAD x15, 12 * REGBYTES(sp) +# #ifndef __riscv_32e +# LOAD x16, 13 * REGBYTES(sp) +# LOAD x17, 14 * REGBYTES(sp) +# LOAD x18, 15 * REGBYTES(sp) +# LOAD x19, 16 * REGBYTES(sp) +# LOAD x20, 17 * REGBYTES(sp) +# LOAD x21, 18 * REGBYTES(sp) +# LOAD x22, 19 * REGBYTES(sp) +# LOAD x23, 20 * REGBYTES(sp) +# LOAD x24, 21 * REGBYTES(sp) +# LOAD x25, 22 * REGBYTES(sp) +# LOAD x26, 23 * REGBYTES(sp) +# LOAD x27, 24 * REGBYTES(sp) +# LOAD x28, 25 * REGBYTES(sp) +# LOAD x29, 26 * REGBYTES(sp) +# LOAD x30, 27 * REGBYTES(sp) +# LOAD x31, 28 * REGBYTES(sp) +# #endif + +# addi sp, sp, portCONTEXT_SIZE +# mret + .extern xPortTaskSwitch + +.align 2 +.global eclic_msip_handler +eclic_msip_handler: + + SAVE_X_REGISTERS + + jal xPortTaskSwitch + + call KTaskOsAssignAfterIrq + j SwitchKTaskContextExit + + +.macro DECLARE_INT_HANDLER INT_HDL_NAME +#if defined(__riscv_xlen) && (__riscv_xlen == 32) + .word \INT_HDL_NAME +#else + .dword \INT_HDL_NAME +#endif +.endm + + /* + * Put the interrupt vectors in this section according to vector remapped or not: + * .vtable: vector table's LMA and VMA are the same, it is not remapped + * .vtable_ilm: vector table's LMA and VMA are different, it is remapped, and + * VECTOR_TABLE_REMAPPED need to be defined + */ +#if defined(VECTOR_TABLE_REMAPPED) + .section .vtable_ilm +#else + .section .vtable +#endif + + .weak eclic_msip_handler + .weak eclic_mtip_handler + .weak eclic_bwei_handler + .weak eclic_pmovi_handler + .weak WWDGT_IRQHandler + .weak LVD_IRQHandler + .weak TAMPER_IRQHandler + .weak RTC_IRQHandler + .weak FMC_IRQHandler + .weak RCU_IRQHandler + .weak EXTI0_IRQHandler + .weak EXTI1_IRQHandler + .weak EXTI2_IRQHandler + .weak EXTI3_IRQHandler + .weak EXTI4_IRQHandler + .weak DMA0_Channel0_IRQHandler + .weak DMA0_Channel1_IRQHandler + .weak DMA0_Channel2_IRQHandler + .weak DMA0_Channel3_IRQHandler + .weak DMA0_Channel4_IRQHandler + .weak DMA0_Channel5_IRQHandler + .weak DMA0_Channel6_IRQHandler + .weak ADC0_1_IRQHandler + .weak CAN0_TX_IRQHandler + .weak CAN0_RX0_IRQHandler + .weak CAN0_RX1_IRQHandler + .weak CAN0_EWMC_IRQHandler + .weak EXTI5_9_IRQHandler + .weak TIMER0_BRK_IRQHandler + .weak TIMER0_UP_IRQHandler + .weak TIMER0_TRG_CMT_IRQHandler + .weak TIMER0_Channel_IRQHandler + .weak TIMER1_IRQHandler + .weak TIMER2_IRQHandler + .weak TIMER3_IRQHandler + .weak I2C0_EV_IRQHandler + .weak I2C0_ER_IRQHandler + .weak I2C1_EV_IRQHandler + .weak I2C1_ER_IRQHandler + .weak SPI0_IRQHandler + .weak SPI1_IRQHandler + .weak USART0_IRQHandler + .weak USART1_IRQHandler + .weak USART2_IRQHandler + .weak EXTI10_15_IRQHandler + .weak RTC_Alarm_IRQHandler + .weak USBFS_WKUP_IRQHandler + .weak EXMC_IRQHandler + .weak TIMER4_IRQHandler + .weak SPI2_IRQHandler + .weak UART3_IRQHandler + .weak UART4_IRQHandler + .weak TIMER5_IRQHandler + .weak TIMER6_IRQHandler + .weak DMA1_Channel0_IRQHandler + .weak DMA1_Channel1_IRQHandler + .weak DMA1_Channel2_IRQHandler + .weak DMA1_Channel3_IRQHandler + .weak DMA1_Channel4_IRQHandler + .weak CAN1_TX_IRQHandler + .weak CAN1_RX0_IRQHandler + .weak CAN1_RX1_IRQHandler + .weak CAN1_EWMC_IRQHandler + .weak USBFS_IRQHandler + + + .globl vector_base + .type vector_base, @object +vector_base: +#ifndef VECTOR_TABLE_REMAPPED + j _start /* 0: Reserved, Jump to _start when reset for vector table not remapped cases.*/ + .align LOG_REGBYTES /* Need to align 4 byte for RV32, 8 Byte for RV64 */ +#else + DECLARE_INT_HANDLER default_intexc_handler /* 0: Reserved, default handler for vector table remapped cases */ +#endif + DECLARE_INT_HANDLER default_intexc_handler /* 1: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 2: Reserved */ + DECLARE_INT_HANDLER eclic_msip_handler /* 3: Machine software interrupt */ + + DECLARE_INT_HANDLER default_intexc_handler /* 4: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 5: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 6: Reserved */ + DECLARE_INT_HANDLER eclic_mtip_handler /* 7: Machine timer interrupt */ + + DECLARE_INT_HANDLER default_intexc_handler /* 8: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 9: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 10: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 11: Reserved */ + + DECLARE_INT_HANDLER default_intexc_handler /* 12: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 13: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 14: Reserved */ + DECLARE_INT_HANDLER default_intexc_handler /* 15: Reserved */ + + DECLARE_INT_HANDLER default_intexc_handler /* 16: Reserved */ + DECLARE_INT_HANDLER eclic_bwei_handler /* 17: Bus Error interrupt */ + DECLARE_INT_HANDLER eclic_pmovi_handler /* 18: Performance Monitor */ + + DECLARE_INT_HANDLER WWDGT_IRQHandler + DECLARE_INT_HANDLER LVD_IRQHandler + DECLARE_INT_HANDLER TAMPER_IRQHandler + DECLARE_INT_HANDLER RTC_IRQHandler + DECLARE_INT_HANDLER FMC_IRQHandler + DECLARE_INT_HANDLER RCU_IRQHandler + DECLARE_INT_HANDLER EXTI0_IRQHandler + DECLARE_INT_HANDLER EXTI1_IRQHandler + DECLARE_INT_HANDLER EXTI2_IRQHandler + DECLARE_INT_HANDLER EXTI3_IRQHandler + DECLARE_INT_HANDLER EXTI4_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel0_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel1_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel2_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel3_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel4_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel5_IRQHandler + DECLARE_INT_HANDLER DMA0_Channel6_IRQHandler + DECLARE_INT_HANDLER ADC0_1_IRQHandler + DECLARE_INT_HANDLER CAN0_TX_IRQHandler + DECLARE_INT_HANDLER CAN0_RX0_IRQHandler + DECLARE_INT_HANDLER CAN0_RX1_IRQHandler + DECLARE_INT_HANDLER CAN0_EWMC_IRQHandler + DECLARE_INT_HANDLER EXTI5_9_IRQHandler + DECLARE_INT_HANDLER TIMER0_BRK_IRQHandler + DECLARE_INT_HANDLER TIMER0_UP_IRQHandler + DECLARE_INT_HANDLER TIMER0_TRG_CMT_IRQHandler + DECLARE_INT_HANDLER TIMER0_Channel_IRQHandler + DECLARE_INT_HANDLER TIMER1_IRQHandler + DECLARE_INT_HANDLER TIMER2_IRQHandler + DECLARE_INT_HANDLER TIMER3_IRQHandler + DECLARE_INT_HANDLER I2C0_EV_IRQHandler + DECLARE_INT_HANDLER I2C0_ER_IRQHandler + DECLARE_INT_HANDLER I2C1_EV_IRQHandler + DECLARE_INT_HANDLER I2C1_ER_IRQHandler + DECLARE_INT_HANDLER SPI0_IRQHandler + DECLARE_INT_HANDLER SPI1_IRQHandler + DECLARE_INT_HANDLER USART0_IRQHandler + DECLARE_INT_HANDLER USART1_IRQHandler + DECLARE_INT_HANDLER USART2_IRQHandler + DECLARE_INT_HANDLER EXTI10_15_IRQHandler + DECLARE_INT_HANDLER RTC_Alarm_IRQHandler + DECLARE_INT_HANDLER USBFS_WKUP_IRQHandler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER EXMC_IRQHandler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER TIMER4_IRQHandler + DECLARE_INT_HANDLER SPI2_IRQHandler + DECLARE_INT_HANDLER UART3_IRQHandler + DECLARE_INT_HANDLER UART4_IRQHandler + DECLARE_INT_HANDLER TIMER5_IRQHandler + DECLARE_INT_HANDLER TIMER6_IRQHandler + DECLARE_INT_HANDLER DMA1_Channel0_IRQHandler + DECLARE_INT_HANDLER DMA1_Channel1_IRQHandler + DECLARE_INT_HANDLER DMA1_Channel2_IRQHandler + DECLARE_INT_HANDLER DMA1_Channel3_IRQHandler + DECLARE_INT_HANDLER DMA1_Channel4_IRQHandler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER default_intexc_handler + DECLARE_INT_HANDLER CAN1_TX_IRQHandler + DECLARE_INT_HANDLER CAN1_RX0_IRQHandler + DECLARE_INT_HANDLER CAN1_RX1_IRQHandler + DECLARE_INT_HANDLER CAN1_EWMC_IRQHandler + DECLARE_INT_HANDLER USBFS_IRQHandler + + .extern Gd32vf103Start + .extern SystemInit + .extern _premain_init + + + .section .init + + .globl _start + .type _start, @function + +/** + * Reset Handler called on controller reset + */ +_start: + /* ===== Startup Stage 1 ===== */ + /* Disable Global Interrupt */ + csrc CSR_MSTATUS, MSTATUS_MIE + /* Jump to logical address first to ensure correct operation of RAM region */ + la a0, _start + li a1, 1 + slli a1, a1, 29 + bleu a1, a0, _start0800 + srli a1, a1, 2 + bleu a1, a0, _start0800 + la a0, _start0800 + add a0, a0, a1 + jr a0 + +_start0800: + /* Initialize GP and Stack Pointer SP */ + .option push + .option norelax + la gp, __global_pointer$ + + .option pop + la sp, _sp + + /* + * Set the the NMI base mnvec to share + * with mtvec by setting CSR_MMISC_CTL + * bit 9 NMI_CAUSE_FFF to 1 + */ + li t0, MMISC_CTL_NMI_CAUSE_FFF + csrs CSR_MMISC_CTL, t0 + + /* + * Intialize ECLIC vector interrupt + * base address mtvt to vector_base + */ + la t0, vector_base + csrw CSR_MTVT, t0 + + /* + * Set ECLIC non-vector entry to be controlled + * by mtvt2 CSR register. + * Intialize ECLIC non-vector interrupt + * base address mtvt2 to irq_entry. + */ + la t0, irq_entry + csrw CSR_MTVT2, t0 + csrs CSR_MTVT2, 0x1 + + /* + * Set Exception Entry MTVEC to exc_entry + * Due to settings above, Exception and NMI + * will share common entry. + */ + la t0, exc_entry + csrw CSR_MTVEC, t0 + + /* Set the interrupt processing mode to ECLIC mode */ + li t0, 0x3f + csrc CSR_MTVEC, t0 + csrs CSR_MTVEC, 0x3 + + /* ===== Startup Stage 2 ===== */ + +#if defined(__riscv_flen) && __riscv_flen > 0 + /* Enable FPU */ + li t0, MSTATUS_FS + csrs mstatus, t0 + csrw fcsr, x0 +#endif + + /* Enable mcycle and minstret counter */ + csrci CSR_MCOUNTINHIBIT, 0x5 + + /* ===== Startup Stage 3 ===== */ + /* + * Load code section from FLASH to ILM + * when code LMA is different with VMA + */ + la a0, _ilm_lma + la a1, _ilm + /* If the ILM phy-address same as the logic-address, then quit */ + beq a0, a1, 2f + la a2, _eilm + bgeu a1, a2, 2f + +1: + /* Load code section if necessary */ + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: + /* Load data section */ + la a0, _data_lma + la a1, _data + la a2, _edata + bgeu a1, a2, 2f +1: + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: + /* Clear bss section */ + la a0, __bss_start + la a1, _end + bgeu a0, a1, 2f +1: + sw zero, (a0) + addi a0, a0, 4 + bltu a0, a1, 1b +2: + /* + * Call vendor defined SystemInit to + * initialize the micro-controller system + */ + call SystemInit + + /* Call global constructors */ + la a0, __libc_fini_array + call atexit + /* Call C/C++ constructor start up code */ + call __libc_init_array + + /* do pre-init steps before main */ + call _premain_init + + /* ===== Call entry Function ===== */ + /* argc = argv = 0 */ + li a0, 0 + li a1, 0 + + j Gd32vf103Start + +1: + j 1b diff --git a/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/interrupt.c b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/interrupt.c new file mode 100755 index 000000000..7169933d7 --- /dev/null +++ b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/interrupt.c @@ -0,0 +1,61 @@ +/** +* @file interrupt.c +* @brief support gap8 interrupt enable and disable +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2021-09-02 +*/ + + +#include +#include +#include +#include + +int ArchDisableHwIrq(uint32_t irq_num) +{ + ECLIC_DisableIRQ(irq_num); + return 0; +} + +int ArchEnableHwIrq(uint32_t irq_num) +{ + ECLIC_EnableIRQ(irq_num); + return 0; +} + + +x_base DisableLocalInterrupt(void) +{ + return __RV_CSR_READ_CLEAR(CSR_MSTATUS, MSTATUS_MIE); +} + +/**************************************************************************** + * Name: EnableLocalInterrupt + * + * Description: + * Return the current interrupt state and enable interrupts + * + ****************************************************************************/ + +void EnableLocalInterrupt(x_base oldstat) +{ + __RV_CSR_WRITE(CSR_MSTATUS, oldstat); +} + + +// extern void KTaskOsAssignAfterIrq(void *context); + +// void IsrEntry() +// { +// uint32 ipsr; + +// isrManager.done->incCounter(); +// isrManager.done->handleIrq(ipsr); +// KTaskOsAssignAfterIrq(NONE); +// isrManager.done->decCounter(); + +// } + + + diff --git a/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/intexc_gd32vf103.S b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/intexc_gd32vf103.S new file mode 100755 index 000000000..9298f5544 --- /dev/null +++ b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/intexc_gd32vf103.S @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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. + */ +/****************************************************************************** + * \file intexc_gd32vf103.S + * \brief NMSIS Interrupt and Exception Handling Template File + * for Device gd32vf103 + * \version V1.00 + * \date 7 Jan 2020 + * + ******************************************************************************/ + +#include "riscv_encoding.h" + +/** + * \brief Global interrupt disabled + * \details + * This function disable global interrupt. + * \remarks + * - All the interrupt requests will be ignored by CPU. + */ +.macro DISABLE_MIE + csrc CSR_MSTATUS, MSTATUS_MIE +.endm + +/** + * \brief Macro for context save + * \details + * This macro save ABI defined caller saved registers in the stack. + * \remarks + * - This Macro could use to save context when you enter to interrupt + * or exception +*/ +/* Save caller registers */ +.macro SAVE_CONTEXT + /* Allocate stack space for context saving */ +#ifndef __riscv_32e + addi sp, sp, -20*REGBYTES +#else + addi sp, sp, -14*REGBYTES +#endif /* __riscv_32e */ + + STORE x1, 0*REGBYTES(sp) + STORE x4, 1*REGBYTES(sp) + STORE x5, 2*REGBYTES(sp) + STORE x6, 3*REGBYTES(sp) + STORE x7, 4*REGBYTES(sp) + STORE x10, 5*REGBYTES(sp) + STORE x11, 6*REGBYTES(sp) + STORE x12, 7*REGBYTES(sp) + STORE x13, 8*REGBYTES(sp) + STORE x14, 9*REGBYTES(sp) + STORE x15, 10*REGBYTES(sp) +#ifndef __riscv_32e + STORE x16, 14*REGBYTES(sp) + STORE x17, 15*REGBYTES(sp) + STORE x28, 16*REGBYTES(sp) + STORE x29, 17*REGBYTES(sp) + STORE x30, 18*REGBYTES(sp) + STORE x31, 19*REGBYTES(sp) +#endif /* __riscv_32e */ +.endm + +/** + * \brief Macro for restore caller registers + * \details + * This macro restore ABI defined caller saved registers from stack. + * \remarks + * - You could use this macro to restore context before you want return + * from interrupt or exeception + */ +/* Restore caller registers */ +.macro RESTORE_CONTEXT + LOAD x1, 0*REGBYTES(sp) + LOAD x4, 1*REGBYTES(sp) + LOAD x5, 2*REGBYTES(sp) + LOAD x6, 3*REGBYTES(sp) + LOAD x7, 4*REGBYTES(sp) + LOAD x10, 5*REGBYTES(sp) + LOAD x11, 6*REGBYTES(sp) + LOAD x12, 7*REGBYTES(sp) + LOAD x13, 8*REGBYTES(sp) + LOAD x14, 9*REGBYTES(sp) + LOAD x15, 10*REGBYTES(sp) +#ifndef __riscv_32e + LOAD x16, 14*REGBYTES(sp) + LOAD x17, 15*REGBYTES(sp) + LOAD x28, 16*REGBYTES(sp) + LOAD x29, 17*REGBYTES(sp) + LOAD x30, 18*REGBYTES(sp) + LOAD x31, 19*REGBYTES(sp) + + /* De-allocate the stack space */ + addi sp, sp, 20*REGBYTES +#else + /* De-allocate the stack space */ + addi sp, sp, 14*REGBYTES +#endif /* __riscv_32e */ + +.endm + +/** + * \brief Macro for save necessary CSRs to stack + * \details + * This macro store MCAUSE, MEPC, MSUBM to stack. + */ +.macro SAVE_CSR_CONTEXT + /* Store CSR mcause to stack using pushmcause */ + csrrwi x0, CSR_PUSHMCAUSE, 11 + /* Store CSR mepc to stack using pushmepc */ + csrrwi x0, CSR_PUSHMEPC, 12 + /* Store CSR msub to stack using pushmsub */ + csrrwi x0, CSR_PUSHMSUBM, 13 +.endm + +/** + * \brief Macro for restore necessary CSRs from stack + * \details + * This macro restore MSUBM, MEPC, MCAUSE from stack. + */ +.macro RESTORE_CSR_CONTEXT + LOAD x5, 13*REGBYTES(sp) + csrw CSR_MSUBM, x5 + LOAD x5, 12*REGBYTES(sp) + csrw CSR_MEPC, x5 + LOAD x5, 11*REGBYTES(sp) + csrw CSR_MCAUSE, x5 +.endm + +/** + * \brief Exception/NMI Entry + * \details + * This function provide common entry functions for exception/nmi. + * \remarks + * This function provide a default exception/nmi entry. + * ABI defined caller save register and some CSR registers + * to be saved before enter interrupt handler and be restored before return. + */ +.section .text.trap +/* In CLIC mode, the exeception entry must be 64bytes aligned */ +.align 6 +.global exc_entry +.weak exc_entry +exc_entry: + /* Save the caller saving registers (context) */ + SAVE_CONTEXT + /* Save the necessary CSR registers */ + SAVE_CSR_CONTEXT + + /* + * Set the exception handler function arguments + * argument 1: mcause value + * argument 2: current stack point(SP) value + */ + csrr a0, mcause + mv a1, sp + /* + * TODO: Call the exception handler function + * By default, the function template is provided in + * system_Device.c, you can adjust it as you want + */ + call core_exception_handler + + /* Restore the necessary CSR registers */ + RESTORE_CSR_CONTEXT + /* Restore the caller saving registers (context) */ + RESTORE_CONTEXT + + /* Return to regular code */ + mret + +/** + * \brief Non-Vector Interrupt Entry + * \details + * This function provide common entry functions for handling + * non-vector interrupts + * \remarks + * This function provide a default non-vector interrupt entry. + * ABI defined caller save register and some CSR registers need + * to be saved before enter interrupt handler and be restored before return. + */ +.section .text.irq +/* In CLIC mode, the interrupt entry must be 4bytes aligned */ +.align 2 +.global irq_entry +.weak irq_entry +/* This label will be set to MTVT2 register */ +irq_entry: + /* Save the caller saving registers (context) */ + SAVE_CONTEXT + /* Save the necessary CSR registers */ + SAVE_CSR_CONTEXT + + /* This special CSR read/write operation, which is actually + * claim the CLIC to find its pending highest ID, if the ID + * is not 0, then automatically enable the mstatus.MIE, and + * jump to its vector-entry-label, and update the link register + */ + csrrw ra, CSR_JALMNXTI, ra + + /* Critical section with interrupts disabled */ + DISABLE_MIE + + /* Restore the necessary CSR registers */ + RESTORE_CSR_CONTEXT + /* Restore the caller saving registers (context) */ + RESTORE_CONTEXT + + /* Return to regular code */ + mret + +/* Default Handler for Exceptions / Interrupts */ +.global default_intexc_handler +.weak default_intexc_handler +Undef_Handler: +default_intexc_handler: +1: + j 1b diff --git a/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/tick.c b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/tick.c new file mode 100755 index 000000000..3a0e78d0d --- /dev/null +++ b/Ubiquitous/XiUOS/arch/risc-v/gd32vf103_rvstar/tick.c @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ +#include +#include +#include + +#define SysTick_Handler eclic_mtip_handler + +/* This is the timer interrupt service routine. */ +void SysTick_Handler(void) +{ + SysTick_Reload(SYSTICK_TICK_CONST); + + // isrManager.done->incCounter(); + + TickAndTaskTimesliceUpdate(); + + // isrManager.done->decCounter(); +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/Kconfig b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/Kconfig new file mode 100755 index 000000000..156014d26 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/Kconfig @@ -0,0 +1,31 @@ +mainmenu "XiUOS Project Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config KERNEL_DIR + string + option env="KERNEL_ROOT" + default "../.." + +config BOARD_GD32VF103RVSTAR + bool + select ARCH_RISCV + default y + +source "$KERNEL_DIR/arch/Kconfig" + +menu "gd32vf103_rvstar feature" + source "$BSP_DIR/third_party_driver/Kconfig" +endmenu + + +menu "Hardware feature" + source "$KERNEL_DIR/resources/Kconfig" +endmenu + +source "$KERNEL_DIR/Kconfig" + + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/Makefile b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/Makefile new file mode 100755 index 000000000..00cf61324 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/Makefile @@ -0,0 +1,6 @@ +SRC_FILES := board.c gd32vf103v_rvstar.c + +SRC_DIR := third_party_driver + + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md new file mode 100755 index 000000000..ac6520e45 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md @@ -0,0 +1,175 @@ +# 从零开始构建矽璓工业物联操作系统:使用risc-v架构的gapuino 开发板 + +[XiUOS](http://xuos.io/) (X Industrial Ubiquitous Operating System) 矽璓工业物联操作系统是一款面向工业物联场景的泛在操作系统,来自泛在操作系统研究计划。所谓泛在操作系统(UOS: Ubiquitous Operating Systems),是支持互联网时代人机物融合泛在计算应用模式的新型操作系统,是传统操作系统概念的泛化与延伸。在泛在操作系统技术体系中,不同的泛在计算设备和泛在应用场景需要符合各自特性的不同UOS,XiUOS即是面向工业物联场景的一种UOS,主要由一个极简的微型实时操作系统(RTOS)内核和其上的智能工业物联框架构成,支持工业物联网(IIoT: Industrial Internet of Things)应用。 + + +## 开发环境搭建 + +### 推荐使用: + +**操作系统:** ubuntu18.04 [https://ubuntu.com/download/desktop](https://ubuntu.com/download/desktop) + +**开发工具推荐使用 VSCode ,VScode下载地址为:** VSCode [https://code.visualstudio.com/](https://code.visualstudio.com/),推荐下载地址为 [http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb](http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb) + +### 依赖包安装: + +``` +$ sudo apt install build-essential pkg-config +$ sudo apt install gcc make libncurses5-dev openssl libssl-dev bison flex libelf-dev autoconf libtool gperf libc6-dev git +``` + +**源码下载:** XiUOS [https://forgeplus.trustie.net/projects/xuos/xiuos](https://forgeplus.trustie.net/projects/xuos/xiuos) + +新建一个空文件夹并进入文件夹中,并下载源码,具体命令如下: + +```c +mkdir test && cd test +git clone https://git.trustie.net/xuos/xiuos.git +``` + +打开源码文件包可以看到以下目录: +| 名称 | 说明 | +| -- | -- | +| application | 应用代码 | +| board | 板级支持包 | +| framework | 应用框架 | +| fs | 文件系统 | +| kernel | 内核源码 | +| resources | 驱动文件 | +| tool | 系统工具 | + +使用VScode打开代码,具体操作步骤为:在源码文件夹下打开系统终端,输入`code .`即可打开VScode开发环境,如下图所示: + +![vscode](img/vscode.jpg) + +### 裁减配置工具的下载 + +裁减配置工具: + +**工具地址:** kconfig-frontends [https://forgeplus.trustie.net/projects/xuos/kconfig-frontends](https://forgeplus.trustie.net/projects/xuos/kconfig-frontends) + +```c +mkdir kfrontends && cd kfrontends +git clone https://git.trustie.net/xuos/kconfig-frontends.git +``` + +下载源码后按以下步骤执行软件安装: + +```c +cd kconfig-frontends + ./xs_build.sh +``` + +### 编译工具链: + +RISC-V: riscv-none-embed-,默认安装到Ubuntu的/opt/,下载源码并解压。[下载网址 http://101.36.126.201:8011/gnu-mcu-eclipse.tar.bz2](http://101.36.126.201:8011/gnu-mcu-eclipse.tar.bz2) + +```shell +$ tar -xjf gnu-mcu-eclipse.tar.bz2 -C /opt/ +``` + +将上述解压的编译工具链的路径添加到board/hifive1-rev-B/config.mk文件当中,例如: + +``` +export CROSS_COMPILE ?=/opt/gnu-mcu-eclipse/riscv-none-gcc/8.2.0-2.1-20190425-1021/bin/riscv-none-embed- +``` + +若已存在`export CROSS_COMPILE ?=xxxx` 应该将原有的语句注释,再写入上面的语句。 + +# 在gapuino board 上创建第一个应用 + +## 1.gapuino board 简介 + +| 硬件 | 描述 | +| -- | -- | +|芯片型号| gap8 | +|架构| RV32IMAC | +|主频| 200+MHz | +|片内SRAM| 512KB | +| 外设 | UART、SPI、I2C | + +XiUOS板级当前支持使用UART。 + +## 2. 代码编写与编译说明 + +编辑环境:`VScode` + +编译工具链:`riscv-none-embed-gcc` + +使用`VScode`打开工程的方法有多种,本文介绍一种快捷键,在项目目录下将`code .`输入终端即可打开目标项目 + +修改`applications`文件夹下`main.c` + +在输出函数中写入 Hello, world! \n 完成代码编辑。 + + +编译步骤: + +1.在VScode终端下执行以下命令,生成配置文件 + +``` +make BOARD=gapuino menuconfig +``` + +2.在menuconfig界面配置需要关闭和开启的功能,按回车键进入下级菜单,按Y键选中需要开启的功能,按N键选中需要关闭的功能,配置结束后选择Exit保存并退出 + +![menuconfig](img/menuconfig.png) + +3.继续执行以下命令,进行编译 + +``` +make BOARD=gapuino +``` + +4.如果编译正确无误,build文件夹下会产生XiUOS_gapuino.elf、XiUOS_gapuino.bin文件。 + +>注:最后可以执行以下命令,清除配置文件和编译生成的文件 + +``` +make BOARD=gapuino distclean +``` + +## 3. 烧写及执行 + +gapuino支持jtag,可以通过jtag进行烧录和调试。 +调试烧写需要下载gap sdk和openocd,下载配置方法参见以下文档: +https://greenwaves-technologies.com/setting-up-sdk/ + +在SDK 和openocd安装完成以后,按照如下步骤进行调试: + +1、进入sdk目录路径下 +``` +cd ~/gap_sdk +``` + +2、在当前终端输入 +``` +source sourceme.sh +``` +出现如下图所示的界面,输入7选择单板名称; +![choose](./img/choose_board.png) + +3、先按开发板的复位键,再在当前终端输入 +``` +gap8-openocd -f interface/ftdi/gapuino_ftdi.cfg -f target/gap8.tcl -f tcl/jtag_boot_entry.tcl +``` +在当前终端连接openocd,连接如下图所示: +![openocd](./img/openocd.png) + +4、打开一个新的终端,输入以下命令打开终端串口: +``` +sudo apt install screen +screen /dev/ttyUSB0 115200 +``` + +5、打开一个新的终端,进入编译生成的elf路径,输入例如: +``` +riscv32-unknown-elf-gdb build/XiUOS_gapuino.elf -ex "target remote localhost:3333" +``` +结果如下图所示: +![gdb](./img/gdb_load.png) + +6、再输入load,最后输入continue命令即可在串口终端看到系统运行界面,如下图所示: +![terminal](./img/terminal.png) + + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c new file mode 100755 index 000000000..3e1ee1d3c --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file board.c +* @brief support gap8 init configure and start-up +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2021-09-02 +*/ + +#include +#include +#include +#include +// #include +#include + +extern void entry(void); +extern int InitHwUart(); + +#ifndef configKERNEL_INTERRUPT_PRIORITY +#define configKERNEL_INTERRUPT_PRIORITY 0 +#endif + +void xPortTaskSwitch(void) +{ + /* Clear Software IRQ, A MUST */ + SysTimer_ClearSWIRQ(); + isrManager.done->setSwitchTrigerFlag(); +} + +void vPortSetupTimerInterrupt(void) +{ + uint64_t ticks = SYSTICK_TICK_CONST; + + /* Make SWI and SysTick the lowest priority interrupts. */ + /* Stop and clear the SysTimer. SysTimer as Non-Vector Interrupt */ + SysTick_Config(ticks); + ECLIC_DisableIRQ(SysTimer_IRQn); + ECLIC_SetLevelIRQ(SysTimer_IRQn, configKERNEL_INTERRUPT_PRIORITY); + ECLIC_SetShvIRQ(SysTimer_IRQn, ECLIC_NON_VECTOR_INTERRUPT); + ECLIC_EnableIRQ(SysTimer_IRQn); + + /* Set SWI interrupt level to lowest level/priority, SysTimerSW as Vector Interrupt */ + ECLIC_SetShvIRQ(SysTimerSW_IRQn, ECLIC_VECTOR_INTERRUPT); + ECLIC_SetLevelIRQ(SysTimerSW_IRQn, configKERNEL_INTERRUPT_PRIORITY); + ECLIC_EnableIRQ(SysTimerSW_IRQn); +} + +void Gd32vf103Start(void) +{ + entry(); +} +void InitBoardHardware(void) +{ + + vPortSetupTimerInterrupt(); + + + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + + InitHwUart(); + InstallConsole("uart4", "uart4_drv", "uart4_dev4"); + + KPrintf("console init completed.\n"); + KPrintf("board initialization......\n"); + + // InitHwTick(); + KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, gd32vf103_SRAM_SIZE); + /* initialize memory system */ + + KPrintf("board init done.\n"); + KPrintf("start kernel...\n"); + return; +} + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h new file mode 100755 index 000000000..750debd41 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file board.h +* @brief define gapuino-board init configure and start-up function +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2021-09-02 +*/ + +/************************************************* +File name: board.h +Description: define gapuino-board init configure and start-up function +Others: +History: +1. Date: 2021-09-02 +Author: AIIT XUOS Lab +Modification: +1. define gapuino-board InitBoardHardware +2. define gapuino-board data and bss struct +*************************************************/ +#ifndef BOARD_H__ +#define BOARD_H__ + +#include +#include + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +extern unsigned int __bss_start__; +extern unsigned int __bss_end__; +extern unsigned int _end; +extern unsigned int __stack_end__; +extern unsigned int g_service_table_start; +extern unsigned int g_service_table_end; + +#define MEMORY_START_ADDRESS (void*)(&_end) +#define gd32vf103_SRAM_SIZE 0x00008000 +#define MEMORY_END_ADDRESS (void*)(0x20000000 + gd32vf103_SRAM_SIZE) + + +#undef EXTERN +#if defined(__cplusplus) +} +#endif +#endif + +#endif diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk new file mode 100755 index 000000000..b2ec28c46 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk @@ -0,0 +1,34 @@ + +# export CFLAGS := -mcmodel=medany -march=rv32imac -mabi=ilp32 -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -fgnu89-inline -Werror +# export AFLAGS := -c -mcmodel=medany -march=rv32imac -mabi=ilp32 -x assembler-with-cpp -ggdb +# export LFLAGS := --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections,-Map=XiUOS_gd32vf103.map,-cref,-u,_start -T $(BSP_ROOT)/link.lds + +# export APPLFLAGS := -mcmodel=medany -march=rv32imac -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=XiUOS_app.map,-cref,-u, -T $(BSP_ROOT)/link_userspace.lds + +# export CXXFLAGS := -mcmodel=medany -march=rv32imac -mabi=ilp32 -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -Werror + +# export CROSS_COMPILE ?=/opt/Nuclei/gcc/bin/riscv-nuclei-elf- + +# export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO + +# export ARCH = risc-v +# export MCU = GD32VF103 + + +export CFLAGS := -march=rv32imac -mabi=ilp32 -fno-common -ffunction-sections -fdata-sections -O0 -ggdb -fgnu89-inline -Werror +export AFLAGS := -march=rv32imac -mabi=ilp32 -x assembler-with-cpp -ggdb +export LFLAGS := -march=rv32imac -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=XiUOS_gd32vf103.map,-cref,-u,_start -T $(BSP_ROOT)/link.lds + +export APPLFLAGS := -nostartfiles -Wl,--gc-sections,-Map=XiUOS_app.map,-cref,-u, -T $(BSP_ROOT)/link_userspace.lds + +export CXXFLAGS := -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -Werror + +export CROSS_COMPILE ?=/opt/Nuclei/gcc/bin/riscv-nuclei-elf- + +export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO + +export ARCH = risc-v +export MCU = GD32VF103 + + + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c new file mode 100755 index 000000000..6d592b002 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c @@ -0,0 +1,191 @@ +/*! + * \file gd32vf103c_start.c + * \brief firmware functions to manage leds, keys, COM ports + * + * \version 2020-02-05, V1.0.0, rvstar board functions for GD32VF103 + */ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103v_rvstar.h" + +// /* private variables */ +// static const uint32_t GPIO_PORT[LEDn] = {LEDG_GPIO_PORT, LEDB_GPIO_PORT, LEDR_GPIO_PORT}; + +// static const uint32_t GPIO_PIN[LEDn] = {LEDG_PIN, LEDB_PIN, LEDR_PIN}; + +// static const rcu_periph_enum GPIO_CLK[LEDn] = {LEDG_GPIO_CLK, LEDB_GPIO_CLK, LEDR_GPIO_CLK}; + +// static const uint32_t KEY_PORT[KEYn] = {WAKEUP_KEY_GPIO_PORT}; + +// static const uint32_t KEY_PIN[KEYn] = {WAKEUP_KEY_PIN}; + +// static const rcu_periph_enum KEY_CLK[KEYn] = {WAKEUP_KEY_GPIO_CLK}; + +// static const exti_line_enum KEY_EXTI_LINE[KEYn] = {WAKEUP_KEY_EXTI_LINE}; + +// static const uint8_t KEY_PORT_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PORT_SOURCE}; + +// static const uint8_t KEY_PIN_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PIN_SOURCE}; + +// static const uint8_t KEY_IRQn[KEYn] = {WAKEUP_KEY_EXTI_IRQn}; + +/* eval board low layer private functions */ +/*! + * \brief configure led GPIO + * \param[in] lednum: specify the led to be configured + * \arg LED1 + * \param[out] none + * \retval none + */ +// void gd_led_init(led_typedef_enum lednum) +// { +// /* enable the led clock */ +// rcu_periph_clock_enable(GPIO_CLK[lednum]); +// /* configure led GPIO port */ +// gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN[lednum]); +// GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +// } + +/*! + * \brief turn on selected led + * \param[in] lednum: specify the led to be turned on + * \arg LED1 + * \param[out] none + * \retval none + */ +// void gd_led_on(led_typedef_enum lednum) +// { +// GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +// } + +/*! + * \brief turn off selected led + * \param[in] lednum: specify the led to be turned off + * \arg LED1 + * \param[out] none + * \retval none + */ +// void gd_led_off(led_typedef_enum lednum) +// { +// GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +// } + +/*! + * \brief toggle selected led + * \param[in] lednum: specify the led to be toggled + * \arg LED1 + * \param[out] none + * \retval none + */ +// void gd_led_toggle(led_typedef_enum lednum) +// { +// gpio_bit_write(GPIO_PORT[lednum], GPIO_PIN[lednum], +// (bit_status)(1 - gpio_input_bit_get(GPIO_PORT[lednum], GPIO_PIN[lednum]))); +// } + +/*! + * \brief configure key + * \param[in] keynum: specify the key to be configured + * \arg KEY_WAKEUP: wakeup key + * \param[in] keymode: specify button mode + * \arg KEY_MODE_GPIO: key will be used as simple IO + * \arg KEY_MODE_EXTI: key will be connected to EXTI line with interrupt + * \param[out] none + * \retval none + */ +// void gd_key_init(key_typedef_enum keynum, keymode_typedef_enum keymode) +// { +// /* enable the key clock */ +// rcu_periph_clock_enable(KEY_CLK[keynum]); +// rcu_periph_clock_enable(RCU_AF); + +// /* configure button pin as input */ +// gpio_init(KEY_PORT[keynum], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY_PIN[keynum]); + +// if (keymode == KEY_MODE_EXTI) { +// /* enable and set key EXTI interrupt to the lowest priority */ +// ECLIC_EnableIRQ(KEY_IRQn[keynum]); +// ECLIC_SetLevelIRQ(KEY_IRQn[keynum], 1); +// ECLIC_SetPriorityIRQ(KEY_IRQn[keynum], 1); + +// /* connect key EXTI line to key GPIO pin */ +// gpio_exti_source_select(KEY_PORT_SOURCE[keynum], KEY_PIN_SOURCE[keynum]); + +// /* configure key EXTI line */ +// exti_init(KEY_EXTI_LINE[keynum], EXTI_INTERRUPT, EXTI_TRIG_FALLING); +// exti_interrupt_flag_clear(KEY_EXTI_LINE[keynum]); +// } +// } + +/*! + * \brief return the selected key state + * \param[in] keynum: specify the key to be checked + * \arg KEY_WAKEUP: wakeup key + * \param[out] none + * \retval the key's GPIO pin value + */ +// uint8_t gd_key_state_get(key_typedef_enum keynum) +// { +// return gpio_input_bit_get(KEY_PORT[keynum], KEY_PIN[keynum]); +// } + +/*! + * \brief configure COM port + * \param[in] com: COM on the board + * \arg GD32_COM0: COM0 on the board + * \param[out] none + * \retval none + */ +void gd_com_init(uint32_t usart_periph) +{ + /* enable GPIO TX and RX clock */ + rcu_periph_clock_enable(GD32_COM_TX_GPIO_CLK); + rcu_periph_clock_enable(GD32_COM_RX_GPIO_CLK); + + /* enable USART clock */ + rcu_periph_clock_enable(GD32_COM_CLK); + + /* connect port to USARTx_Tx */ + gpio_init(GD32_COM_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GD32_COM_TX_PIN); + + /* connect port to USARTx_Rx */ + gpio_init(GD32_COM_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GD32_COM_RX_PIN); + + /* USART configure */ + usart_deinit(usart_periph); + usart_baudrate_set(usart_periph, 115200U); + usart_word_length_set(usart_periph, USART_WL_8BIT); + usart_stop_bit_set(usart_periph, USART_STB_1BIT); + usart_parity_config(usart_periph, USART_PM_NONE); + usart_hardware_flow_rts_config(usart_periph, USART_RTS_DISABLE); + usart_hardware_flow_cts_config(usart_periph, USART_CTS_DISABLE); + usart_receive_config(usart_periph, USART_RECEIVE_ENABLE); + usart_transmit_config(usart_periph, USART_TRANSMIT_ENABLE); + usart_enable(usart_periph); +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.h new file mode 100755 index 000000000..7ac21d877 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.h @@ -0,0 +1,131 @@ +/*! + \file gd32vf103c_start.h + \brief definitions for GD32VF103C_START's leds, keys and COM ports hardware resources + + \version 2019-06-05, V1.0.0, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103C_RVSTART_H +#define GD32VF103C_RVSTART_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nuclei_sdk_soc.h" + +/* exported types */ +typedef enum { + LED1 = 0, + LED2 = 1, + LED3 = 2, + LED_1 = 0, + LED_2 = 1, + LED_3 = 2 +} led_typedef_enum; + +typedef enum { + KEY_WAKEUP = 0, +} key_typedef_enum; + +typedef enum { + KEY_MODE_GPIO = 0, + KEY_MODE_EXTI = 1 +} keymode_typedef_enum; + + +// /* rvstar board low layer led */ +// #define LEDn 3U + +// #define LEDG_PIN GPIO_PIN_1 +// #define LEDG_GPIO_PORT GPIOA +// #define LEDG_GPIO_CLK RCU_GPIOA + +// #define LEDB_PIN GPIO_PIN_3 +// #define LEDB_GPIO_PORT GPIOA +// #define LEDB_GPIO_CLK RCU_GPIOA + +// #define LEDR_PIN GPIO_PIN_2 +// #define LEDR_GPIO_PORT GPIOA +// #define LEDR_GPIO_CLK RCU_GPIOA + +/* rvstar board UART com port */ +#define GD32_COM0 UART4 +#define GD32_COM_CLK RCU_UART4 +#define GD32_COM_TX_PIN GPIO_PIN_12 +#define GD32_COM_RX_PIN GPIO_PIN_2 +#define GD32_COM_TX_GPIO_PORT GPIOC +#define GD32_COM_RX_GPIO_PORT GPIOD +#define GD32_COM_TX_GPIO_CLK RCU_GPIOC +#define GD32_COM_RX_GPIO_CLK RCU_GPIOD + +/* rvstar board low layer button */ +#define KEYn (1U) + +/* wakeup push-button */ +#define WAKEUP_KEY_PIN GPIO_PIN_0 +#define WAKEUP_KEY_GPIO_PORT GPIOA +#define WAKEUP_KEY_GPIO_CLK RCU_GPIOA +#define WAKEUP_KEY_EXTI_LINE EXTI_0 +#define WAKEUP_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOA +#define WAKEUP_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_0 +#define WAKEUP_KEY_EXTI_IRQn EXTI0_IRQn + +/* function declarations */ +/* configure led GPIO */ +void gd_led_init(led_typedef_enum lednum); +/* turn on selected led */ +void gd_led_on(led_typedef_enum lednum); +/* turn off selected led */ +void gd_led_off(led_typedef_enum lednum); +/* toggle the selected led */ +void gd_led_toggle(led_typedef_enum lednum); +/* configure key */ +void gd_key_init(key_typedef_enum keynum, keymode_typedef_enum keymode); +/* return the selected key state */ +uint8_t gd_key_state_get(key_typedef_enum keynum); +/* configure COM port */ +void gd_com_init(uint32_t usart_periph); + +/* Defines for LED functions to new / general API */ +#define gd_rvstar_led_init gd_led_init +#define gd_rvstar_led_on gd_led_on +#define gd_rvstar_led_off gd_led_off +#define gd_rvstar_led_toggle gd_led_toggle + +#define gd_rvstar_key_init gd_key_init +#define gd_rvstar_key_state_get gd_key_state_get + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103V_RVSTART_H */ + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/link.lds b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/link.lds new file mode 100755 index 000000000..e277a0013 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/link.lds @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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. + */ +/****************************************************************************** + * @file gcc_Device.ld + * @brief GNU Linker Script for gd32vf103 based device + * @version V1.0.0 + * @date 17. Dec 2019 + ******************************************************************************/ + +/*********** Use Configuration Wizard in Context Menu *************************/ + +OUTPUT_ARCH( "riscv" ) +/********************* Flash Configuration ************************************ + * Flash Configuration + * Flash Base Address <0x0-0xFFFFFFFF:8> + * Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> + * + */ +__ROM_BASE = 0x08000000; +__ROM_SIZE = 0x00020000; + +/*--------------------- ILM RAM Configuration --------------------------- + * ILM RAM Configuration + * ILM RAM Base Address <0x0-0xFFFFFFFF:8> + * ILM RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + * + */ +__ILM_RAM_BASE = 0x80000000; +__ILM_RAM_SIZE = 0x00010000; + +/*--------------------- Embedded RAM Configuration --------------------------- + * RAM Configuration + * RAM Base Address <0x0-0xFFFFFFFF:8> + * RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + * +*/ +__RAM_BASE = 0x20000000; +__RAM_SIZE = 0x00005000; + +/********************* Stack / Heap Configuration **************************** + * Stack / Heap Configuration + * Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> + * Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> + * + */ +__STACK_SIZE = 0x00000800; +__HEAP_SIZE = 0x00000800; + +/**************************** end of configuration section ********************/ + +/* Define base address and length of flash and ram */ +MEMORY +{ + flash (rxai!w) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE + ram (wxa!ri) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE +} +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH,ILM and RAM. + * It references following symbols, which must be defined in code: + * _Start : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * _ilm_lma + * _ilm + * __etext + * _etext + * etext + * _eilm + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * _data_lma + * _edata + * edata + * __data_end__ + * __bss_start + * __fbss + * _end + * end + * __heap_end + * __StackLimit + * __StackTop + * __STACK_SIZE + */ +/* Define entry label of program */ +ENTRY(_start) +SECTIONS +{ + __STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 2K; + + .init : + { + /* vector table locate at flash */ + *(.vtable) + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash + + .ilalign : + { + . = ALIGN(4); + /* Create a section label as _ilm_lma which located at flash */ + PROVIDE( _ilm_lma = . ); + } >flash AT>flash + + .ialign : + { + /* Create a section label as _ilm which located at flash */ + PROVIDE( _ilm = . ); + } >flash AT>flash + + /* Code section located at flash */ + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + /* section information for shell */ + . = ALIGN(4); + _shell_command_start = .; + KEEP (*(shellCommand)) + _shell_command_end = .; + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + __isrtbl_idx_start = .; + KEEP(*(.isrtbl.idx)) + __isrtbl_start = .; + KEEP(*(.isrtbl)) + __isrtbl_end = .; + . = ALIGN(4); + + PROVIDE(g_service_table_start = ABSOLUTE(.)); + KEEP(*(.g_service_table)) + PROVIDE(g_service_table_end = ABSOLUTE(.)); + + *(.gnu.linkonce.t.*) + } >flash AT>flash + + .rodata : ALIGN(4) + { + . = ALIGN(4); + *(.rdata) + *(.rodata .rodata.*) + /* section information for initial. */ + . = ALIGN(4); + + *(.gnu.linkonce.r.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >flash AT>flash + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash + + . = ALIGN(4); + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + PROVIDE( _eilm = . ); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >flash AT>flash + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + * the constructors, so we make sure it is + * first. Because this is a wildcard, it + * doesn't matter if the user does not + * actually link against crtbegin.o; the + * linker won't look for a file to match a + * wildcard. The wildcard also means that it + * doesn't matter which directory crtbegin.o + * is in. + */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + * the crtend.o file until after the sorted ctors. + * The .ctor section from the crtend file contains the + * end of ctors marker and it must be last + */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + } >flash AT>flash + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >ram AT>flash + + /* Define data section virtual address is ram and physical address is flash */ + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.* .sdata*) + *(.gnu.linkonce.s.*) + } >ram AT>flash + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram + + . = ALIGN(8); + + /* Define stack and head location at ram */ + .stack : + { + . = . + __STACK_SIZE; + PROVIDE( _sp = . ); + } >ram AT>ram + + PROVIDE( _end = . ); + PROVIDE( end = . ); + +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_hal.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_hal.h new file mode 100755 index 000000000..5f5a6c00a --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_hal.h @@ -0,0 +1,20 @@ +// See LICENSE for license details. +#ifndef _NUCLEI_SDK_HAL_H +#define _NUCLEI_SDK_HAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "gd32vf103v_rvstar.h" + +#define SOC_DEBUG_UART GD32_COM0 + +#ifndef NUCLEI_BANNER +#define NUCLEI_BANNER 1 +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_soc.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_soc.h new file mode 100755 index 000000000..d247cac2f --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/nuclei_sdk_soc.h @@ -0,0 +1,20 @@ +// See LICENSE for license details. +#ifndef _NUCLEI_SDK_SOC_H +#define _NUCLEI_SDK_SOC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "gd32vf103.h" +// #include "gd32vf103_libopt.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_timer.h" + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Kconfig b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Kconfig new file mode 100755 index 000000000..cee6d3778 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Kconfig @@ -0,0 +1,25 @@ +menuconfig BSP_USING_GPIO + bool "Using GPIO device" + default y + select RESOURCES_PIN + if BSP_USING_GPIO + source "$BSP_DIR/third_party_driver/gpio/Kconfig" + endif + +menuconfig BSP_USING_SYSCLOCK + bool "Using SYSCLOCK device" + default y + if BSP_USING_SYSCLOCK + source "$BSP_DIR/third_party_driver/sys_clock/Kconfig" + endif + +menuconfig BSP_USING_UART + bool "Using UART device" + default y + select RESOURCES_SERIAL + if BSP_USING_UART + source "$BSP_DIR/third_party_driver/uart/Kconfig" + endif + + + \ No newline at end of file diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Makefile b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Makefile new file mode 100755 index 000000000..48eef19d2 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/Makefile @@ -0,0 +1,17 @@ +SRC_FILES := system_gd32vf103.c +SRC_DIR := + +ifeq ($(CONFIG_BSP_USING_GPIO),y) + SRC_DIR += gpio +endif + +ifeq ($(CONFIG_BSP_USING_SYSCLOCK),y) + SRC_DIR += sys_clock +endif + +ifeq ($(CONFIG_BSP_USING_UART),y) + SRC_DIR += uart +endif + + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Kconfig b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Kconfig new file mode 100755 index 000000000..35dce7392 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Kconfig @@ -0,0 +1,11 @@ +config PIN_BUS_NAME + string "pin bus name" + default "pin" + +config PIN_DRIVER_NAME + string "pin driver name" + default "pin_drv" + +config PIN_DEVICE_NAME + string "pin device name" + default "pin_dev" diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Makefile b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Makefile new file mode 100755 index 000000000..e364e4064 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := gd32vf103_gpio.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/gd32vf103_gpio.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/gd32vf103_gpio.c new file mode 100755 index 000000000..7e36269a0 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/gpio/gd32vf103_gpio.c @@ -0,0 +1,502 @@ +/*! + \file gd32vf103_gpio.c + \brief GPIO driver + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_gpio.h" + +#define AFIO_EXTI_SOURCE_MASK ((uint8_t)0x03U) /*!< AFIO exti source selection mask*/ +#define AFIO_EXTI_SOURCE_FIELDS ((uint8_t)0x04U) /*!< select AFIO exti source registers */ +#define LSB_16BIT_MASK ((uint16_t)0xFFFFU) /*!< LSB 16-bit mask */ +#define PCF_POSITION_MASK ((uint32_t)0x000F0000U) /*!< AFIO_PCF register position mask */ +#define PCF_SWJCFG_MASK ((uint32_t)0xF0FFFFFFU) /*!< AFIO_PCF register SWJCFG mask */ +#define PCF_LOCATION1_MASK ((uint32_t)0x00200000U) /*!< AFIO_PCF register location1 mask */ +#define PCF_LOCATION2_MASK ((uint32_t)0x00100000U) /*!< AFIO_PCF register location2 mask */ +#define AFIO_PCF1_FIELDS ((uint32_t)0x80000000U) /*!< select AFIO_PCF1 register */ +#define GPIO_OUTPUT_PORT_OFFSET ((uint32_t)4U) /*!< GPIO event output port offset*/ + +/*! + \brief reset GPIO port + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[out] none + \retval none +*/ +void gpio_deinit(uint32_t gpio_periph) +{ + switch (gpio_periph) { + case GPIOA: + /* reset GPIOA */ + rcu_periph_reset_enable(RCU_GPIOARST); + rcu_periph_reset_disable(RCU_GPIOARST); + break; + case GPIOB: + /* reset GPIOB */ + rcu_periph_reset_enable(RCU_GPIOBRST); + rcu_periph_reset_disable(RCU_GPIOBRST); + break; + case GPIOC: + /* reset GPIOC */ + rcu_periph_reset_enable(RCU_GPIOCRST); + rcu_periph_reset_disable(RCU_GPIOCRST); + break; + case GPIOD: + /* reset GPIOD */ + rcu_periph_reset_enable(RCU_GPIODRST); + rcu_periph_reset_disable(RCU_GPIODRST); + break; + case GPIOE: + /* reset GPIOE */ + rcu_periph_reset_enable(RCU_GPIOERST); + rcu_periph_reset_disable(RCU_GPIOERST); + break; + default: + break; + } +} + +/*! + \brief reset alternate function I/O(AFIO) + \param[in] none + \param[out] none + \retval none +*/ +void gpio_afio_deinit(void) +{ + rcu_periph_reset_enable(RCU_AFRST); + rcu_periph_reset_disable(RCU_AFRST); +} + +/*! + \brief GPIO parameter initialization + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] mode: gpio pin mode + only one parameter can be selected which is shown as below: + \arg GPIO_MODE_AIN: analog input mode + \arg GPIO_MODE_IN_FLOATING: floating input mode + \arg GPIO_MODE_IPD: pull-down input mode + \arg GPIO_MODE_IPU: pull-up input mode + \arg GPIO_MODE_OUT_OD: GPIO output with open-drain + \arg GPIO_MODE_OUT_PP: GPIO output with push-pull + \arg GPIO_MODE_AF_OD: AFIO output with open-drain + \arg GPIO_MODE_AF_PP: AFIO output with push-pull + \param[in] speed: gpio output max speed value + only one parameter can be selected which is shown as below: + \arg GPIO_OSPEED_10MHZ: output max speed 10MHz + \arg GPIO_OSPEED_2MHZ: output max speed 2MHz + \arg GPIO_OSPEED_50MHZ: output max speed 50MHz + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + + \param[out] none + \retval none +*/ +void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, + uint32_t pin) +{ + uint16_t i; + uint32_t temp_mode = 0U; + uint32_t reg = 0U; + + /* GPIO mode configuration */ + temp_mode = (uint32_t)(mode & ((uint32_t) 0x0FU)); + + /* GPIO speed configuration */ + if (((uint32_t) 0x00U) != ((uint32_t) mode & ((uint32_t) 0x10U))) { + /* output mode max speed:10MHz,2MHz,50MHz */ + temp_mode |= (uint32_t) speed; + } + + /* configure the eight low port pins with GPIO_CTL0 */ + for (i = 0U; i < 8U; i++) { + if ((1U << i) & pin) { + reg = GPIO_CTL0(gpio_periph); + + /* clear the specified pin mode bits */ + reg &= ~GPIO_MODE_MASK(i); + /* set the specified pin mode bits */ + reg |= GPIO_MODE_SET(i, temp_mode); + + /* set IPD or IPU */ + if (GPIO_MODE_IPD == mode) { + /* reset the corresponding OCTL bit */ + GPIO_BC(gpio_periph) = (uint32_t)((1U << i) & pin); + } else { + /* set the corresponding OCTL bit */ + if (GPIO_MODE_IPU == mode) { + GPIO_BOP(gpio_periph) = (uint32_t)((1U << i) & pin); + } + } + /* set GPIO_CTL0 register */ + GPIO_CTL0(gpio_periph) = reg; + } + } + /* configure the eight high port pins with GPIO_CTL1 */ + for (i = 8U; i < 16U; i++) { + if ((1U << i) & pin) { + reg = GPIO_CTL1(gpio_periph); + + /* clear the specified pin mode bits */ + reg &= ~GPIO_MODE_MASK(i - 8U); + /* set the specified pin mode bits */ + reg |= GPIO_MODE_SET(i - 8U, temp_mode); + + /* set IPD or IPU */ + if (GPIO_MODE_IPD == mode) { + /* reset the corresponding OCTL bit */ + GPIO_BC(gpio_periph) = (uint32_t)((1U << i) & pin); + } else { + /* set the corresponding OCTL bit */ + if (GPIO_MODE_IPU == mode) { + GPIO_BOP(gpio_periph) = (uint32_t)((1U << i) & pin); + } + } + /* set GPIO_CTL1 register */ + GPIO_CTL1(gpio_periph) = reg; + } + } +} + +/*! + \brief set GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_BOP(gpio_periph) = (uint32_t) pin; +} + +/*! + \brief reset GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_BC(gpio_periph) = (uint32_t) pin; +} + +/*! + \brief write data to the specified GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[in] bit_value: SET or RESET + only one parameter can be selected which is shown as below: + \arg RESET: clear the port pin + \arg SET: set the port pin + \param[out] none + \retval none +*/ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) +{ + if (RESET != bit_value) { + GPIO_BOP(gpio_periph) = (uint32_t) pin; + } else { + GPIO_BC(gpio_periph) = (uint32_t) pin; + } +} + +/*! + \brief write data to the specified GPIO port + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] data: specify the value to be written to the port output data register + \param[out] none + \retval none +*/ +void gpio_port_write(uint32_t gpio_periph, uint16_t data) +{ + GPIO_OCTL(gpio_periph) = (uint32_t) data; +} + +/*! + \brief get GPIO pin input status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval input status of gpio pin: SET or RESET +*/ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin) +{ + if ((uint32_t) RESET != (GPIO_ISTAT(gpio_periph) & (pin))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get GPIO port input status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[out] none + \retval input status of gpio all pins +*/ +uint16_t gpio_input_port_get(uint32_t gpio_periph) +{ + return (uint16_t)(GPIO_ISTAT(gpio_periph)); +} + +/*! + \brief get GPIO pin output status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval output status of gpio pin: SET or RESET +*/ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin) +{ + if ((uint32_t) RESET != (GPIO_OCTL(gpio_periph) & (pin))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get GPIO port output status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[out] none + \retval output status of gpio all pins +*/ +uint16_t gpio_output_port_get(uint32_t gpio_periph) +{ + return ((uint16_t) GPIO_OCTL(gpio_periph)); +} + +/*! + \brief configure GPIO pin remap + \param[in] gpio_remap: select the pin to remap + only one parameter can be selected which are shown as below: + \arg GPIO_SPI0_REMAP: SPI0 remapping + \arg GPIO_I2C0_REMAP: I2C0 remapping + \arg GPIO_USART0_REMAP: USART0 remapping + \arg GPIO_USART1_REMAP: USART1 remapping + \arg GPIO_USART2_PARTIAL_REMAP: USART2 partial remapping + \arg GPIO_USART2_FULL_REMAP: USART2 full remapping + \arg GPIO_TIMER0_PARTIAL_REMAP: TIMER0 partial remapping + \arg GPIO_TIMER0_FULL_REMAP: TIMER0 full remapping + \arg GPIO_TIMER1_PARTIAL_REMAP0: TIMER1 partial remapping + \arg GPIO_TIMER1_PARTIAL_REMAP1: TIMER1 partial remapping + \arg GPIO_TIMER1_FULL_REMAP: TIMER1 full remapping + \arg GPIO_TIMER2_PARTIAL_REMAP: TIMER2 partial remapping + \arg GPIO_TIMER2_FULL_REMAP: TIMER2 full remapping + \arg GPIO_TIMER3_REMAP: TIMER3 remapping + \arg GPIO_CAN0_PARTIAL_REMAP: CAN0 partial remapping + \arg GPIO_CAN0_FULL_REMAP: CAN0 full remapping + \arg GPIO_PD01_REMAP: PD01 remapping + \arg GPIO_TIMER4CH3_IREMAP: TIMER4 channel3 internal remapping + \arg GPIO_CAN1_REMAP: CAN1 remapping + \arg GPIO_SWJ_NONJTRST_REMAP: JTAG-DP,but without NJTRST + \arg GPIO_SWJ_DISABLE_REMAP: JTAG-DP disabled + \arg GPIO_SPI2_REMAP: SPI2 remapping + \arg GPIO_TIMER1ITI1_REMAP: TIMER1 internal trigger 1 remapping + \arg GPIO_EXMC_NADV_REMAP: EXMC_NADV connect/disconnect + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue) +{ + uint32_t remap1 = 0U, remap2 = 0U, temp_reg = 0U, temp_mask = 0U; + + if (AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)) { + /* get AFIO_PCF1 regiter value */ + temp_reg = AFIO_PCF1; + } else { + /* get AFIO_PCF0 regiter value */ + temp_reg = AFIO_PCF0; + } + + temp_mask = (remap & PCF_POSITION_MASK) >> 0x10U; + remap1 = remap & LSB_16BIT_MASK; + + /* judge pin remap type */ + if ((PCF_LOCATION1_MASK | PCF_LOCATION2_MASK) + == (remap & (PCF_LOCATION1_MASK | PCF_LOCATION2_MASK))) { + temp_reg &= PCF_SWJCFG_MASK; + AFIO_PCF0 &= PCF_SWJCFG_MASK; + } else if (PCF_LOCATION2_MASK == (remap & PCF_LOCATION2_MASK)) { + remap2 = ((uint32_t) 0x03U) << temp_mask; + temp_reg &= ~remap2; + temp_reg |= ~PCF_SWJCFG_MASK; + } else { + temp_reg &= ~(remap1 << ((remap >> 0x15U) * 0x10U)); + temp_reg |= ~PCF_SWJCFG_MASK; + } + + /* set pin remap value */ + if (DISABLE != newvalue) { + temp_reg |= (remap1 << ((remap >> 0x15U) * 0x10U)); + } + + if (AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)) { + /* set AFIO_PCF1 regiter value */ + AFIO_PCF1 = temp_reg; + } else { + /* set AFIO_PCF0 regiter value */ + AFIO_PCF0 = temp_reg; + } +} + +/*! + \brief select GPIO pin exti sources + \param[in] gpio_outputport: gpio event output port + only one parameter can be selected which are shown as below: + \arg GPIO_PORT_SOURCE_GPIOA: output port source A + \arg GPIO_PORT_SOURCE_GPIOB: output port source B + \arg GPIO_PORT_SOURCE_GPIOC: output port source C + \arg GPIO_PORT_SOURCE_GPIOD: output port source D + \arg GPIO_PORT_SOURCE_GPIOE: output port source E + \param[in] gpio_outputpin: GPIO_PIN_SOURCE_x(x=0..15) + \param[out] none + \retval none +*/ +void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin) +{ + uint32_t source = 0U; + source = ((uint32_t) 0x0FU) + << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)); + + /* select EXTI sources */ + if (GPIO_PIN_SOURCE_4 > output_pin) { + /* select EXTI0/EXTI1/EXTI2/EXTI3 */ + AFIO_EXTISS0 &= ~source; + AFIO_EXTISS0 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } else if (GPIO_PIN_SOURCE_8 > output_pin) { + /* select EXTI4/EXTI5/EXTI6/EXTI7 */ + AFIO_EXTISS1 &= ~source; + AFIO_EXTISS1 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } else if (GPIO_PIN_SOURCE_12 > output_pin) { + /* select EXTI8/EXTI9/EXTI10/EXTI11 */ + AFIO_EXTISS2 &= ~source; + AFIO_EXTISS2 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } else { + /* select EXTI12/EXTI13/EXTI14/EXTI15 */ + AFIO_EXTISS3 &= ~source; + AFIO_EXTISS3 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } +} + +/*! + \brief configure GPIO pin event output + \param[in] output_port: gpio event output port + only one parameter can be selected which are shown as below: + \arg GPIO_EVENT_PORT_GPIOA: event output port A + \arg GPIO_EVENT_PORT_GPIOB: event output port B + \arg GPIO_EVENT_PORT_GPIOC: event output port C + \arg GPIO_EVENT_PORT_GPIOD: event output port D + \arg GPIO_EVENT_PORT_GPIOE: event output port E + \param[in] output_pin: + only one parameter can be selected which are shown as below: + \arg GPIO_EVENT_PIN_x(x=0..15) + \param[out] none + \retval none +*/ +void gpio_event_output_config(uint8_t output_port, uint8_t output_pin) +{ + uint32_t reg = 0U; + reg = AFIO_EC; + + /* clear AFIO_EC_PORT and AFIO_EC_PIN bits */ + reg &= (uint32_t)(~(AFIO_EC_PORT | AFIO_EC_PIN)); + + reg |= (uint32_t)((uint32_t) output_port << GPIO_OUTPUT_PORT_OFFSET); + reg |= (uint32_t) output_pin; + + AFIO_EC = reg; +} + +/*! + \brief enable GPIO pin event output + \param[in] none + \param[out] none + \retval none +*/ +void gpio_event_output_enable(void) +{ + AFIO_EC |= AFIO_EC_EOE; +} + +/*! + \brief disable GPIO pin event output + \param[in] none + \param[out] none + \retval none +*/ +void gpio_event_output_disable(void) +{ + AFIO_EC &= (uint32_t)(~AFIO_EC_EOE); +} + +/*! + \brief lock GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin) +{ + uint32_t lock = 0x00010000U; + lock |= pin; + + /* lock key writing sequence: write 1 -> write 0 -> write 1 -> read 0 -> read 1 */ + GPIO_LOCK(gpio_periph) = (uint32_t) lock; + GPIO_LOCK(gpio_periph) = (uint32_t) pin; + GPIO_LOCK(gpio_periph) = (uint32_t) lock; + lock = GPIO_LOCK(gpio_periph); + lock = GPIO_LOCK(gpio_periph); +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/connect_uart.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/connect_uart.h new file mode 100755 index 000000000..1bfa45689 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/connect_uart.h @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file connect_uart.h +* @brief define gap8-board uart function and struct +* @version 1.1 +* @author AIIT XUOS Lab +* @date 2021-07-27 +*/ + +#ifndef CONNECT_UART_H +#define CONNECT_UART_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +int InitHwUart(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_base.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_base.h new file mode 100755 index 000000000..3fabcb8b2 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_base.h @@ -0,0 +1,1352 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __CORE_FEATURE_BASE__ +#define __CORE_FEATURE_BASE__ +/*! + * @file core_feature_base.h + * @brief Base core feature API for Nuclei N/NX Core + */ +#include +#include "riscv_encoding.h" +#include "nmsis_gcc.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * \defgroup NMSIS_Core_Registers Register Define and Type Definitions + * \brief Type definitions and defines for core registers. + * + * @{ + */ +#ifndef __RISCV_XLEN + /** \brief Refer to the width of an integer register in bits(either 32 or 64) */ + #ifndef __riscv_xlen + #define __RISCV_XLEN 32 + #else + #define __RISCV_XLEN __riscv_xlen + #endif +#endif /* __RISCV_XLEN */ + +/** \brief Type of Control and Status Register(CSR), depends on the XLEN defined in RISC-V */ +#if __RISCV_XLEN == 32 + typedef uint32_t rv_csr_t; +#elif __RISCV_XLEN == 64 + typedef uint64_t rv_csr_t; +#else + typedef uint32_t rv_csr_t; +#endif +/** @} */ /* End of Doxygen Group NMSIS_Core_Registers */ +/** + * \defgroup NMSIS_Core_Base_Registers Base Register Define and Type Definitions + * \ingroup NMSIS_Core_Registers + * \brief Type definitions and defines for base core registers. + * + * @{ + */ +/** + * \brief Union type to access MISA CSR register. + */ +typedef union { + struct { + rv_csr_t a:1; /*!< bit: 0 Atomic extension */ + rv_csr_t b:1; /*!< bit: 1 Tentatively reserved for Bit-Manipulation extension */ + rv_csr_t c:1; /*!< bit: 2 Compressed extension */ + rv_csr_t d:1; /*!< bit: 3 Double-precision floating-point extension */ + rv_csr_t e:1; /*!< bit: 4 RV32E base ISA */ + rv_csr_t f:1; /*!< bit: 5 Single-precision floating-point extension */ + rv_csr_t g:1; /*!< bit: 6 Additional standard extensions present */ + rv_csr_t h:1; /*!< bit: 7 Hypervisor extension */ + rv_csr_t i:1; /*!< bit: 8 RV32I/64I/128I base ISA */ + rv_csr_t j:1; /*!< bit: 9 Tentatively reserved for Dynamically Translated Languages extension */ + rv_csr_t _reserved1:1; /*!< bit: 10 Reserved */ + rv_csr_t l:1; /*!< bit: 11 Tentatively reserved for Decimal Floating-Point extension */ + rv_csr_t m:1; /*!< bit: 12 Integer Multiply/Divide extension */ + rv_csr_t n:1; /*!< bit: 13 User-level interrupts supported */ + rv_csr_t _reserved2:1; /*!< bit: 14 Reserved */ + rv_csr_t p:1; /*!< bit: 15 Tentatively reserved for Packed-SIMD extension */ + rv_csr_t q:1; /*!< bit: 16 Quad-precision floating-point extension */ + rv_csr_t _resreved3:1; /*!< bit: 17 Reserved */ + rv_csr_t s:1; /*!< bit: 18 Supervisor mode implemented */ + rv_csr_t t:1; /*!< bit: 19 Tentatively reserved for Transactional Memory extension */ + rv_csr_t u:1; /*!< bit: 20 User mode implemented */ + rv_csr_t v:1; /*!< bit: 21 Tentatively reserved for Vector extension */ + rv_csr_t _reserved4:1; /*!< bit: 22 Reserved */ + rv_csr_t x:1; /*!< bit: 23 Non-standard extensions present */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved5:38; /*!< bit: 24..61 Reserved */ + rv_csr_t mxl:2; /*!< bit: 62..63 Machine XLEN */ +#else + rv_csr_t _reserved5:6; /*!< bit: 24..29 Reserved */ + rv_csr_t mxl:2; /*!< bit: 30..31 Machine XLEN */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MISA_Type; + +/** + * \brief Union type to access MSTATUS CSR register. + */ +typedef union { + struct { +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved0:3; /*!< bit: 0..2 Reserved */ + rv_csr_t mie:1; /*!< bit: 3 Machine mode interrupt enable flag */ + rv_csr_t _reserved1:3; /*!< bit: 4..6 Reserved */ + rv_csr_t mpie:1; /*!< bit: 7 mirror of MIE flag */ + rv_csr_t _reserved2:3; /*!< bit: 8..10 Reserved */ + rv_csr_t mpp:2; /*!< bit: 11..12 mirror of Privilege Mode */ + rv_csr_t fs:2; /*!< bit: 13..14 FS status flag */ + rv_csr_t xs:2; /*!< bit: 15..16 XS status flag */ + rv_csr_t mprv:1; /*!< bit: Machine mode PMP */ + rv_csr_t _reserved3:14; /*!< bit: 18..31 Reserved */ + rv_csr_t uxl:2; /*!< bit: 32..33 user mode xlen */ + rv_csr_t _reserved6:29; /*!< bit: 34..62 Reserved */ + rv_csr_t sd:1; /*!< bit: Dirty status for XS or FS */ +#else + rv_csr_t _reserved0:1; /*!< bit: 0 Reserved */ + rv_csr_t sie:1; /*!< bit: 1 supervisor interrupt enable flag */ + rv_csr_t _reserved1:1; /*!< bit: 2 Reserved */ + rv_csr_t mie:1; /*!< bit: 3 Machine mode interrupt enable flag */ + rv_csr_t _reserved2:1; /*!< bit: 4 Reserved */ + rv_csr_t spie:1; /*!< bit: 3 Supervisor Privilede mode interrupt enable flag */ + rv_csr_t _reserved3:1; /*!< bit: Reserved */ + rv_csr_t mpie:1; /*!< bit: mirror of MIE flag */ + rv_csr_t _reserved4:3; /*!< bit: Reserved */ + rv_csr_t mpp:2; /*!< bit: mirror of Privilege Mode */ + rv_csr_t fs:2; /*!< bit: FS status flag */ + rv_csr_t xs:2; /*!< bit: XS status flag */ + rv_csr_t mprv:1; /*!< bit: Machine mode PMP */ + rv_csr_t sum:1; /*!< bit: Supervisor Mode load and store protection */ + rv_csr_t _reserved6:12; /*!< bit: 19..30 Reserved */ + rv_csr_t sd:1; /*!< bit: Dirty status for XS or FS */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MSTATUS_Type; + +/** + * \brief Union type to access MTVEC CSR register. + */ +typedef union { + struct { + rv_csr_t mode:6; /*!< bit: 0..5 interrupt mode control */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t addr:58; /*!< bit: 6..63 mtvec address */ +#else + rv_csr_t addr:26; /*!< bit: 6..31 mtvec address */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MTVEC_Type; + +/** + * \brief Union type to access MCAUSE CSR register. + */ +typedef union { + struct { + rv_csr_t exccode:12; /*!< bit: 11..0 exception or interrupt code */ + rv_csr_t _reserved0:4; /*!< bit: 15..12 Reserved */ + rv_csr_t mpil:8; /*!< bit: 23..16 Previous interrupt level */ + rv_csr_t _reserved1:3; /*!< bit: 26..24 Reserved */ + rv_csr_t mpie:1; /*!< bit: 27 Interrupt enable flag before enter interrupt */ + rv_csr_t mpp:2; /*!< bit: 29..28 Privilede mode flag before enter interrupt */ + rv_csr_t minhv:1; /*!< bit: 30 Machine interrupt vector table */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved2:32; /*!< bit: 31..62 Reserved */ + rv_csr_t interrupt:1; /*!< bit: 63 trap type. 0 means exception and 1 means interrupt */ +#else + rv_csr_t interrupt:1; /*!< bit: 31 trap type. 0 means exception and 1 means interrupt */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MCAUSE_Type; + +/** + * \brief Union type to access MCOUNTINHIBIT CSR register. + */ +typedef union { + struct { + rv_csr_t cy:1; /*!< bit: 0 1 means disable mcycle counter */ + rv_csr_t _reserved0:1; /*!< bit: 1 Reserved */ + rv_csr_t ir:1; /*!< bit: 2 1 means disable minstret counter */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved1:61; /*!< bit: 3..63 Reserved */ +#else + rv_csr_t _reserved1:29; /*!< bit: 3..31 Reserved */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MCOUNTINHIBIT_Type; + +/** + * \brief Union type to access MSUBM CSR register. + */ +typedef union { + struct { + rv_csr_t _reserved0:6; /*!< bit: 0..5 Reserved */ + rv_csr_t typ:2; /*!< bit: 6..7 current trap type */ + rv_csr_t ptyp:2; /*!< bit: 8..9 previous trap type */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved1:54; /*!< bit: 10..63 Reserved */ +#else + rv_csr_t _reserved1:22; /*!< bit: 10..31 Reserved */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MSUBM_Type; + +/** + * \brief Union type to access MDCAUSE CSR register. + */ +typedef union { + struct { + rv_csr_t mdcause:2; /*!< bit: 0..1 More detailed exception information as MCAUSE supplement */ + rv_csr_t _reserved0:__RISCV_XLEN-2; /*!< bit: 2..XLEN-1 Reserved */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MDCAUSE_Type; + +/** + * \brief Union type to access MMISC_CTRL CSR register. + */ +typedef union { + struct { + rv_csr_t _reserved0:3; /*!< bit: 0..2 Reserved */ + rv_csr_t bpu:1; /*!< bit: 3 dynamic prediction enable flag */ + rv_csr_t _reserved1:2; /*!< bit: 4..5 Reserved */ + rv_csr_t misalign:1; /*!< bit: 6 misaligned access support flag */ + rv_csr_t _reserved2:2; /*!< bit: 7..8 Reserved */ + rv_csr_t nmi_cause:1; /*!< bit: 9 mnvec control and nmi mcase exccode */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved3:54; /*!< bit: 10..63 Reserved */ +#else + rv_csr_t _reserved3:22; /*!< bit: 10..31 Reserved */ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MMISCCTRL_Type; + +typedef CSR_MMISCCTRL_Type CSR_MMISCCTL_Type; + +/** + * \brief Union type to access MCACHE_CTL CSR register. + */ +typedef union { + struct { + rv_csr_t ic_en:1; /*!< I-Cache enable */ + rv_csr_t ic_scpd_mod:1; /*!< Scratchpad mode, 0: Scratchpad as ICache Data RAM, 1: Scratchpad as ILM SRAM */ + rv_csr_t ic_ecc_en:1; /*!< I-Cache ECC enable */ + rv_csr_t ic_ecc_excp_en:1; /*!< I-Cache 2bit ECC error exception enable */ + rv_csr_t ic_rwtecc:1; /*!< Control I-Cache Tag Ram ECC code injection */ + rv_csr_t ic_rwdecc:1; /*!< Control I-Cache Data Ram ECC code injection */ + rv_csr_t _reserved0:10; + rv_csr_t dc_en:1; /*!< DCache enable */ + rv_csr_t dc_ecc_en:1; /*!< D-Cache ECC enable */ + rv_csr_t dc_ecc_excp_en:1; /*!< D-Cache 2bit ECC error exception enable */ + rv_csr_t dc_rwtecc:1; /*!< Control D-Cache Tag Ram ECC code injection */ + rv_csr_t dc_rwdecc:1; /*!< Control D-Cache Data Ram ECC code injection */ + rv_csr_t _reserved1:__RISCV_XLEN-21; + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MCACHECTL_Type; + +/** + * \brief Union type to access MSAVESTATUS CSR register. + */ +typedef union { + struct { + rv_csr_t mpie1:1; /*!< bit: 0 interrupt enable flag of fisrt level NMI/exception nestting */ + rv_csr_t mpp1:2; /*!< bit: 1..2 privilede mode of fisrt level NMI/exception nestting */ + rv_csr_t _reserved0:3; /*!< bit: 3..5 Reserved */ + rv_csr_t ptyp1:2; /*!< bit: 6..7 NMI/exception type of before first nestting */ + rv_csr_t mpie2:1; /*!< bit: 8 interrupt enable flag of second level NMI/exception nestting */ + rv_csr_t mpp2:2; /*!< bit: 9..10 privilede mode of second level NMI/exception nestting */ + rv_csr_t _reserved1:3; /*!< bit: 11..13 Reserved */ + rv_csr_t ptyp2:2; /*!< bit: 14..15 NMI/exception type of before second nestting */ +#if defined(__RISCV_XLEN) && __RISCV_XLEN == 64 + rv_csr_t _reserved2:48; /*!< bit: 16..63 Reserved*/ +#else + rv_csr_t _reserved2:16; /*!< bit: 16..31 Reserved*/ +#endif + } b; /*!< Structure used for bit access */ + rv_csr_t w; /*!< Type used for csr data access */ +} CSR_MSAVESTATUS_Type; + +/** + * \brief Union type to access MILM_CTL CSR register. + */ +typedef union { + struct { + rv_csr_t ilm_en:1; /*!< ILM enable */ + rv_csr_t ilm_ecc_en:1; /*!< ILM ECC eanble */ + rv_csr_t ilm_ecc_excp_en:1; /*!< ILM ECC exception enable */ + rv_csr_t ilm_rwecc:1; /*!< Control mecc_code write to ilm, simulate error injection */ + rv_csr_t _reserved0:6; /*!< Reserved */ + rv_csr_t ilm_bpa:__RISCV_XLEN-10; /*!< ILM base address */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MILMCTL_Type; + +/** + * \brief Union type to access MDLM_CTL CSR register. + */ +typedef union { + struct { + rv_csr_t dlm_en:1; /*!< DLM enable */ + rv_csr_t dlm_ecc_en:1; /*!< DLM ECC eanble */ + rv_csr_t dlm_ecc_excp_en:1; /*!< DLM ECC exception enable */ + rv_csr_t dlm_rwecc:1; /*!< Control mecc_code write to dlm, simulate error injection */ + rv_csr_t _reserved0:6; /*!< Reserved */ + rv_csr_t dlm_bpa:__RISCV_XLEN-10; /*!< DLM base address */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MDLMCTL_Type; + +/** + * \brief Union type to access MCFG_INFO CSR register. + */ +typedef union { + struct { + rv_csr_t tee:1; /*!< TEE present */ + rv_csr_t ecc:1; /*!< ECC present */ + rv_csr_t clic:1; /*!< CLIC present */ + rv_csr_t plic:1; /*!< PLIC present */ + rv_csr_t fio:1; /*!< FIO present */ + rv_csr_t ppi:1; /*!< PPI present */ + rv_csr_t nice:1; /*!< NICE present */ + rv_csr_t ilm:1; /*!< ILM present */ + rv_csr_t dlm:1; /*!< DLM present */ + rv_csr_t icache:1; /*!< ICache present */ + rv_csr_t dcache:1; /*!< DCache present */ + rv_csr_t _reserved0:__RISCV_XLEN-11; + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MCFGINFO_Type; + +/** + * \brief Union type to access MICFG_INFO CSR register. + */ +typedef union { + struct { + rv_csr_t set:4; /*!< I-Cache sets per way */ + rv_csr_t way:3; /*!< I-Cache way */ + rv_csr_t lsize:3; /*!< I-Cache line size */ + rv_csr_t cache_ecc:1; /*!< I-Cache ECC present */ + rv_csr_t _reserved0:5; + rv_csr_t lm_size:5; /*!< ILM size, need to be 2^n size */ + rv_csr_t lm_xonly:1; /*!< ILM Execute only permission */ + rv_csr_t lm_ecc:1; /*!< ILM ECC present */ + rv_csr_t _reserved1:__RISCV_XLEN-23; + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MICFGINFO_Type; + +/** + * \brief Union type to access MDCFG_INFO CSR register. + */ +typedef union { + struct { + rv_csr_t set:4; /*!< D-Cache sets per way */ + rv_csr_t way:3; /*!< D-Cache way */ + rv_csr_t lsize:3; /*!< D-Cache line size */ + rv_csr_t cache_ecc:1; /*!< D-Cache ECC present */ + rv_csr_t _reserved0:5; + rv_csr_t lm_size:5; /*!< DLM size, need to be 2^n size */ + rv_csr_t lm_xonly:1; /*!< DLM Execute only permission */ + rv_csr_t lm_ecc:1; /*!< DLM ECC present */ + rv_csr_t _reserved1:__RISCV_XLEN-23; + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MDCFGINFO_Type; + +/** + * \brief Union type to access MPPICFG_INFO CSR register. + */ +typedef union { + struct { + rv_csr_t _reserved0:1; /*!< Reserved */ + rv_csr_t ppi_size:5; /*!< PPI size, need to be 2^n size */ + rv_csr_t _reserved1:4; /*!< Reserved */ + rv_csr_t ppi_bpa:__RISCV_XLEN-10; /*!< PPI base address */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MPPICFGINFO_Type; + +/** + * \brief Union type to access MFIOCFG_INFO CSR register. + */ +typedef union { + struct { + rv_csr_t _reserved0:1; /*!< Reserved */ + rv_csr_t fio_size:5; /*!< FIO size, need to be 2^n size */ + rv_csr_t _reserved1:4; /*!< Reserved */ + rv_csr_t fio_bpa:__RISCV_XLEN-10; /*!< FIO base address */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MFIOCFGINFO_Type; + +/** + * \brief Union type to access MECC_LOCK CSR register. + */ +typedef union { + struct { + rv_csr_t ecc_lock:1; /*!< RW permission, ECC Lock configure */ + rv_csr_t _reserved0:__RISCV_XLEN-1; /*!< Reserved */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MECCLOCK_Type; + +/** + * \brief Union type to access MECC_CODE CSR register. + */ +typedef union { + struct { + rv_csr_t code:9; /*!< Used to inject ECC check code */ + rv_csr_t _reserved0:7; /*!< Reserved */ + rv_csr_t ramid:5; /*!< Indicate 2bit ECC error, software can clear these bits */ + rv_csr_t _reserved1:3; /*!< Reserved */ + rv_csr_t sramid:5; /*!< Indicate 1bit ECC error, software can clear these bits */ + rv_csr_t _reserved2:__RISCV_XLEN-29; /*!< Reserved */ + } b; /*!< Structure used for bit access */ + rv_csr_t d; /*!< Type used for csr data access */ +} CSR_MECCCODE_Type; + +/** @} */ /* End of Doxygen Group NMSIS_Core_Base_Registers */ + +/* ########################### Core Function Access ########################### */ +/** + * \defgroup NMSIS_Core_CSR_Register_Access Core CSR Register Access + * \ingroup NMSIS_Core + * \brief Functions to access the Core CSR Registers + * \details + * + * The following functions or macros provide access to Core CSR registers. + * - \ref NMSIS_Core_CSR_Encoding + * - \ref NMSIS_Core_CSR_Registers + * @{ + */ + + +#ifndef __ASSEMBLY__ + +/** + * \brief CSR operation Macro for csrrw instruction. + * \details + * Read the content of csr register to __v, + * then write content of val into csr register, then return __v + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \param val value to store into the CSR register + * \return the CSR register value before written + */ +#define __RV_CSR_SWAP(csr, val) \ + ({ \ + register rv_csr_t __v = (unsigned long)(val); \ + __ASM volatile("csrrw %0, " STRINGIFY(csr) ", %1" \ + : "=r"(__v) \ + : "rK"(__v) \ + : "memory"); \ + __v; \ + }) + +/** + * \brief CSR operation Macro for csrr instruction. + * \details + * Read the content of csr register to __v and return it + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \return the CSR register value + */ +#define __RV_CSR_READ(csr) \ + ({ \ + register rv_csr_t __v; \ + __ASM volatile("csrr %0, " STRINGIFY(csr) \ + : "=r"(__v) \ + : \ + : "memory"); \ + __v; \ + }) + +/** + * \brief CSR operation Macro for csrw instruction. + * \details + * Write the content of val to csr register + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \param val value to store into the CSR register + */ +#define __RV_CSR_WRITE(csr, val) \ + ({ \ + register rv_csr_t __v = (rv_csr_t)(val); \ + __ASM volatile("csrw " STRINGIFY(csr) ", %0" \ + : \ + : "rK"(__v) \ + : "memory"); \ + }) + +/** + * \brief CSR operation Macro for csrrs instruction. + * \details + * Read the content of csr register to __v, + * then set csr register to be __v | val, then return __v + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \param val Mask value to be used wih csrrs instruction + * \return the CSR register value before written + */ +#define __RV_CSR_READ_SET(csr, val) \ + ({ \ + register rv_csr_t __v = (rv_csr_t)(val); \ + __ASM volatile("csrrs %0, " STRINGIFY(csr) ", %1" \ + : "=r"(__v) \ + : "rK"(__v) \ + : "memory"); \ + __v; \ + }) + +/** + * \brief CSR operation Macro for csrs instruction. + * \details + * Set csr register to be csr_content | val + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \param val Mask value to be used wih csrs instruction + */ +#define __RV_CSR_SET(csr, val) \ + ({ \ + register rv_csr_t __v = (rv_csr_t)(val); \ + __ASM volatile("csrs " STRINGIFY(csr) ", %0" \ + : \ + : "rK"(__v) \ + : "memory"); \ + }) + +/** + * \brief CSR operation Macro for csrrc instruction. + * \details + * Read the content of csr register to __v, + * then set csr register to be __v & ~val, then return __v + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \param val Mask value to be used wih csrrc instruction + * \return the CSR register value before written + */ +#define __RV_CSR_READ_CLEAR(csr, val) \ + ({ \ + register rv_csr_t __v = (rv_csr_t)(val); \ + __ASM volatile("csrrc %0, " STRINGIFY(csr) ", %1" \ + : "=r"(__v) \ + : "rK"(__v) \ + : "memory"); \ + __v; \ + }) + +/** + * \brief CSR operation Macro for csrc instruction. + * \details + * Set csr register to be csr_content & ~val + * \param csr CSR macro definition defined in + * \ref NMSIS_Core_CSR_Registers, eg. \ref CSR_MSTATUS + * \param val Mask value to be used wih csrc instruction + */ +#define __RV_CSR_CLEAR(csr, val) \ + ({ \ + register rv_csr_t __v = (rv_csr_t)(val); \ + __ASM volatile("csrc " STRINGIFY(csr) ", %0" \ + : \ + : "rK"(__v) \ + : "memory"); \ + }) +#endif /* __ASSEMBLY__ */ + +/** + * \brief Enable IRQ Interrupts + * \details Enables IRQ interrupts by setting the MIE-bit in the MSTATUS Register. + * \remarks + * Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __RV_CSR_SET(CSR_MSTATUS, MSTATUS_MIE); +} + +/** + * \brief Disable IRQ Interrupts + * \details Disables IRQ interrupts by clearing the MIE-bit in the MSTATUS Register. + * \remarks + * Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __RV_CSR_CLEAR(CSR_MSTATUS, MSTATUS_MIE); +} + +/** + * \brief Read whole 64 bits value of mcycle counter + * \details This function will read the whole 64 bits of MCYCLE register + * \return The whole 64 bits value of MCYCLE + * \remarks It will work for both RV32 and RV64 to get full 64bits value of MCYCLE + */ +__STATIC_FORCEINLINE uint64_t __get_rv_cycle(void) +{ +#if __RISCV_XLEN == 32 + volatile uint32_t high0, low, high; + uint64_t full; + + high0 = __RV_CSR_READ(CSR_MCYCLEH); + low = __RV_CSR_READ(CSR_MCYCLE); + high = __RV_CSR_READ(CSR_MCYCLEH); + if (high0 != high) { + low = __RV_CSR_READ(CSR_MCYCLE); + } + full = (((uint64_t)high) << 32) | low; + return full; +#elif __RISCV_XLEN == 64 + return (uint64_t)__RV_CSR_READ(CSR_MCYCLE); +#else // TODO Need cover for XLEN=128 case in future + return (uint64_t)__RV_CSR_READ(CSR_MCYCLE); +#endif +} + +/** + * \brief Read whole 64 bits value of machine instruction-retired counter + * \details This function will read the whole 64 bits of MINSTRET register + * \return The whole 64 bits value of MINSTRET + * \remarks It will work for both RV32 and RV64 to get full 64bits value of MINSTRET + */ +__STATIC_FORCEINLINE uint64_t __get_rv_instret(void) +{ +#if __RISCV_XLEN == 32 + volatile uint32_t high0, low, high; + uint64_t full; + + high0 = __RV_CSR_READ(CSR_MINSTRETH); + low = __RV_CSR_READ(CSR_MINSTRET); + high = __RV_CSR_READ(CSR_MINSTRETH); + if (high0 != high) { + low = __RV_CSR_READ(CSR_MINSTRET); + } + full = (((uint64_t)high) << 32) | low; + return full; +#elif __RISCV_XLEN == 64 + return (uint64_t)__RV_CSR_READ(CSR_MINSTRET); +#else // TODO Need cover for XLEN=128 case in future + return (uint64_t)__RV_CSR_READ(CSR_MINSTRET); +#endif +} + +/** + * \brief Read whole 64 bits value of real-time clock + * \details This function will read the whole 64 bits of TIME register + * \return The whole 64 bits value of TIME CSR + * \remarks It will work for both RV32 and RV64 to get full 64bits value of TIME + * \attention only available when user mode available + */ +__STATIC_FORCEINLINE uint64_t __get_rv_time(void) +{ +#if __RISCV_XLEN == 32 + volatile uint32_t high0, low, high; + uint64_t full; + + high0 = __RV_CSR_READ(CSR_TIMEH); + low = __RV_CSR_READ(CSR_TIME); + high = __RV_CSR_READ(CSR_TIMEH); + if (high0 != high) { + low = __RV_CSR_READ(CSR_TIME); + } + full = (((uint64_t)high) << 32) | low; + return full; +#elif __RISCV_XLEN == 64 + return (uint64_t)__RV_CSR_READ(CSR_TIME); +#else // TODO Need cover for XLEN=128 case in future + return (uint64_t)__RV_CSR_READ(CSR_TIME); +#endif +} + +/** @} */ /* End of Doxygen Group NMSIS_Core_CSR_Register_Access */ + +/* ########################### CPU Intrinsic Functions ########################### */ +/** + * \defgroup NMSIS_Core_CPU_Intrinsic Intrinsic Functions for CPU Intructions + * \ingroup NMSIS_Core + * \brief Functions that generate RISC-V CPU instructions. + * \details + * + * The following functions generate specified RISC-V instructions that cannot be directly accessed by compiler. + * @{ + */ + +/** + * \brief NOP Instruction + * \details + * No Operation does nothing. + * This instruction can be used for code alignment purposes. + */ +__STATIC_FORCEINLINE void __NOP(void) +{ + __ASM volatile("nop"); +} + +/** + * \brief Wait For Interrupt + * \details + * Wait For Interrupt is is executed using CSR_WFE.WFE=0 and WFI instruction. + * It will suspends execution until interrupt, NMI or Debug happened. + * When Core is waked up by interrupt, if + * 1. mstatus.MIE == 1(interrupt enabled), Core will enter ISR code + * 2. mstatus.MIE == 0(interrupt disabled), Core will resume previous execution + */ +__STATIC_FORCEINLINE void __WFI(void) +{ + __RV_CSR_CLEAR(CSR_WFE, WFE_WFE); + __ASM volatile("wfi"); +} + +/** + * \brief Wait For Event + * \details + * Wait For Event is executed using CSR_WFE.WFE=1 and WFI instruction. + * It will suspends execution until event, NMI or Debug happened. + * When Core is waked up, Core will resume previous execution + */ +__STATIC_FORCEINLINE void __WFE(void) +{ + __RV_CSR_SET(CSR_WFE, WFE_WFE); + __ASM volatile("wfi"); + __RV_CSR_CLEAR(CSR_WFE, WFE_WFE); +} + +/** + * \brief Breakpoint Instruction + * \details + * Causes the processor to enter Debug state. + * Debug tools can use this to investigate system state + * when the instruction at a particular address is reached. + */ +__STATIC_FORCEINLINE void __EBREAK(void) +{ + __ASM volatile("ebreak"); +} + +/** + * \brief Environment Call Instruction + * \details + * The ECALL instruction is used to make a service request to + * the execution environment. + */ +__STATIC_FORCEINLINE void __ECALL(void) +{ + __ASM volatile("ecall"); +} + +/** + * \brief WFI Sleep Mode enumeration + */ +typedef enum WFI_SleepMode { + WFI_SHALLOW_SLEEP = 0, /*!< Shallow sleep mode, the core_clk will poweroff */ + WFI_DEEP_SLEEP = 1 /*!< Deep sleep mode, the core_clk and core_ano_clk will poweroff */ +} WFI_SleepMode_Type; + +/** + * \brief Set Sleep mode of WFI + * \details + * Set the SLEEPVALUE CSR register to control the + * WFI Sleep mode. + * \param[in] mode The sleep mode to be set + */ +__STATIC_FORCEINLINE void __set_wfi_sleepmode(WFI_SleepMode_Type mode) +{ + __RV_CSR_WRITE(CSR_SLEEPVALUE, mode); +} + +/** + * \brief Send TX Event + * \details + * Set the CSR TXEVT to control send a TX Event. + * The Core will output signal tx_evt as output event signal. + */ +__STATIC_FORCEINLINE void __TXEVT(void) +{ + __RV_CSR_SET(CSR_TXEVT, 0x1); +} + +/** + * \brief Enable MCYCLE counter + * \details + * Clear the CY bit of MCOUNTINHIBIT to 0 to enable MCYCLE Counter + */ +__STATIC_FORCEINLINE void __enable_mcycle_counter(void) +{ + __RV_CSR_CLEAR(CSR_MCOUNTINHIBIT, MCOUNTINHIBIT_CY); +} + +/** + * \brief Disable MCYCLE counter + * \details + * Set the CY bit of MCOUNTINHIBIT to 1 to disable MCYCLE Counter + */ +__STATIC_FORCEINLINE void __disable_mcycle_counter(void) +{ + __RV_CSR_SET(CSR_MCOUNTINHIBIT, MCOUNTINHIBIT_CY); +} + +/** + * \brief Enable MINSTRET counter + * \details + * Clear the IR bit of MCOUNTINHIBIT to 0 to enable MINSTRET Counter + */ +__STATIC_FORCEINLINE void __enable_minstret_counter(void) +{ + __RV_CSR_CLEAR(CSR_MCOUNTINHIBIT, MCOUNTINHIBIT_IR); +} + +/** + * \brief Disable MINSTRET counter + * \details + * Set the IR bit of MCOUNTINHIBIT to 1 to disable MINSTRET Counter + */ +__STATIC_FORCEINLINE void __disable_minstret_counter(void) +{ + __RV_CSR_SET(CSR_MCOUNTINHIBIT, MCOUNTINHIBIT_IR); +} + +/** + * \brief Enable MCYCLE & MINSTRET counter + * \details + * Clear the IR and CY bit of MCOUNTINHIBIT to 1 to enable MINSTRET & MCYCLE Counter + */ +__STATIC_FORCEINLINE void __enable_all_counter(void) +{ + __RV_CSR_CLEAR(CSR_MCOUNTINHIBIT, MCOUNTINHIBIT_IR|MCOUNTINHIBIT_CY); +} + +/** + * \brief Disable MCYCLE & MINSTRET counter + * \details + * Set the IR and CY bit of MCOUNTINHIBIT to 1 to disable MINSTRET & MCYCLE Counter + */ +__STATIC_FORCEINLINE void __disable_all_counter(void) +{ + __RV_CSR_SET(CSR_MCOUNTINHIBIT, MCOUNTINHIBIT_IR|MCOUNTINHIBIT_CY); +} + +/** + * \brief Execute fence instruction, p -> pred, s -> succ + * \details + * the FENCE instruction ensures that all memory accesses from instructions preceding + * the fence in program order (the `predecessor set`) appear earlier in the global memory order than + * memory accesses from instructions appearing after the fence in program order (the `successor set`). + * For details, please refer to The RISC-V Instruction Set Manual + * \param p predecessor set, such as iorw, rw, r, w + * \param s successor set, such as iorw, rw, r, w + **/ +#define __FENCE(p, s) __ASM volatile ("fence " #p "," #s : : : "memory") + +/** + * \brief Fence.i Instruction + * \details + * The FENCE.I instruction is used to synchronize the instruction + * and data streams. + */ +__STATIC_FORCEINLINE void __FENCE_I(void) +{ + __ASM volatile("fence.i"); +} + +/** \brief Read & Write Memory barrier */ +#define __RWMB() __FENCE(iorw,iorw) + +/** \brief Read Memory barrier */ +#define __RMB() __FENCE(ir,ir) + +/** \brief Write Memory barrier */ +#define __WMB() __FENCE(ow,ow) + +/** \brief SMP Read & Write Memory barrier */ +#define __SMP_RWMB() __FENCE(rw,rw) + +/** \brief SMP Read Memory barrier */ +#define __SMP_RMB() __FENCE(r,r) + +/** \brief SMP Write Memory barrier */ +#define __SMP_WMB() __FENCE(w,w) + +/** \brief CPU relax for busy loop */ +#define __CPU_RELAX() __ASM volatile ("" : : : "memory") + + +/* ===== Load/Store Operations ===== */ +/** + * \brief Load 8bit value from address (8 bit) + * \details Load 8 bit value. + * \param [in] addr Address pointer to data + * \return value of type uint8_t at (*addr) + */ +__STATIC_FORCEINLINE uint8_t __LB(volatile void *addr) +{ + uint8_t result; + + __ASM volatile ("lb %0, 0(%1)" : "=r" (result) : "r" (addr)); + return result; +} + +/** + * \brief Load 16bit value from address (16 bit) + * \details Load 16 bit value. + * \param [in] addr Address pointer to data + * \return value of type uint16_t at (*addr) + */ +__STATIC_FORCEINLINE uint16_t __LH(volatile void *addr) +{ + uint16_t result; + + __ASM volatile ("lh %0, 0(%1)" : "=r" (result) : "r" (addr)); + return result; +} + +/** + * \brief Load 32bit value from address (32 bit) + * \details Load 32 bit value. + * \param [in] addr Address pointer to data + * \return value of type uint32_t at (*addr) + */ +__STATIC_FORCEINLINE uint32_t __LW(volatile void *addr) +{ + uint32_t result; + + __ASM volatile ("lw %0, 0(%1)" : "=r" (result) : "r" (addr)); + return result; +} + +#if __RISCV_XLEN != 32 +/** + * \brief Load 64bit value from address (64 bit) + * \details Load 64 bit value. + * \param [in] addr Address pointer to data + * \return value of type uint64_t at (*addr) + * \remarks RV64 only macro + */ +__STATIC_FORCEINLINE uint64_t __LD(volatile void *addr) +{ + uint64_t result; + __ASM volatile ("ld %0, 0(%1)" : "=r" (result) : "r" (addr)); + return result; +} +#endif + +/** + * \brief Write 8bit value to address (8 bit) + * \details Write 8 bit value. + * \param [in] addr Address pointer to data + * \param [in] val Value to set + */ +__STATIC_FORCEINLINE void __SB(volatile void *addr, uint8_t val) +{ + __ASM volatile ("sb %0, 0(%1)" : : "r" (val), "r" (addr)); +} + +/** + * \brief Write 16bit value to address (16 bit) + * \details Write 16 bit value. + * \param [in] addr Address pointer to data + * \param [in] val Value to set + */ +__STATIC_FORCEINLINE void __SH(volatile void *addr, uint16_t val) +{ + __ASM volatile ("sh %0, 0(%1)" : : "r" (val), "r" (addr)); +} + +/** + * \brief Write 32bit value to address (32 bit) + * \details Write 32 bit value. + * \param [in] addr Address pointer to data + * \param [in] val Value to set + */ +__STATIC_FORCEINLINE void __SW(volatile void *addr, uint32_t val) +{ + __ASM volatile ("sw %0, 0(%1)" : : "r" (val), "r" (addr)); +} + +#if __RISCV_XLEN != 32 +/** + * \brief Write 64bit value to address (64 bit) + * \details Write 64 bit value. + * \param [in] addr Address pointer to data + * \param [in] val Value to set + */ +__STATIC_FORCEINLINE void __SD(volatile void *addr, uint64_t val) +{ + __ASM volatile ("sd %0, 0(%1)" : : "r" (val), "r" (addr)); +} +#endif + +/** + * \brief Compare and Swap 32bit value using LR and SC + * \details Compare old value with memory, if identical, + * store new value in memory. Return the initial value in memory. + * Success is indicated by comparing return value with OLD. + * memory address, return 0 if successful, otherwise return !0 + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] oldval Old value of the data in address + * \param [in] newval New value to be stored into the address + * \return return the initial value in memory + */ +__STATIC_FORCEINLINE uint32_t __CAS_W(volatile uint32_t *addr, uint32_t oldval, uint32_t newval) +{ + register uint32_t result; + register uint32_t rc; + + __ASM volatile ( \ + "0: lr.w %0, %2 \n" \ + " bne %0, %z3, 1f \n" \ + " sc.w %1, %z4, %2 \n" \ + " bnez %1, 0b \n" \ + "1:\n" \ + : "=&r"(result), "=&r"(rc), "+A"(*addr) \ + : "r"(oldval), "r"(newval) \ + : "memory"); + return result; +} + +/** + * \brief Atomic Swap 32bit value into memory + * \details Atomically swap new 32bit value into memory using amoswap.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] newval New value to be stored into the address + * \return return the original value in memory + */ +__STATIC_FORCEINLINE uint32_t __AMOSWAP_W(volatile uint32_t *addr, uint32_t newval) +{ + register uint32_t result; + + __ASM volatile ("amoswap.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(newval) : "memory"); + return result; +} + +/** + * \brief Atomic Add with 32bit value + * \details Atomically ADD 32bit value with value in memory using amoadd.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be ADDed + * \return return memory value + add value + */ +__STATIC_FORCEINLINE int32_t __AMOADD_W(volatile int32_t *addr, int32_t value) +{ + register int32_t result; + + __ASM volatile ("amoadd.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic And with 32bit value + * \details Atomically AND 32bit value with value in memory using amoand.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be ANDed + * \return return memory value & and value + */ +__STATIC_FORCEINLINE int32_t __AMOAND_W(volatile int32_t *addr, int32_t value) +{ + register int32_t result; + + __ASM volatile ("amoand.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic OR with 32bit value + * \details Atomically OR 32bit value with value in memory using amoor.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be ORed + * \return return memory value | and value + */ +__STATIC_FORCEINLINE int32_t __AMOOR_W(volatile int32_t *addr, int32_t value) +{ + register int32_t result; + + __ASM volatile ("amoor.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic XOR with 32bit value + * \details Atomically XOR 32bit value with value in memory using amoxor.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be XORed + * \return return memory value ^ and value + */ +__STATIC_FORCEINLINE int32_t __AMOXOR_W(volatile int32_t *addr, int32_t value) +{ + register int32_t result; + + __ASM volatile ("amoxor.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic unsigned MAX with 32bit value + * \details Atomically unsigned max compare 32bit value with value in memory using amomaxu.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be compared + * \return return the bigger value + */ +__STATIC_FORCEINLINE uint32_t __AMOMAXU_W(volatile uint32_t *addr, uint32_t value) +{ + register uint32_t result; + + __ASM volatile ("amomaxu.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic signed MAX with 32bit value + * \details Atomically signed max compare 32bit value with value in memory using amomax.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be compared + * \return the bigger value + */ +__STATIC_FORCEINLINE int32_t __AMOMAX_W(volatile int32_t *addr, int32_t value) +{ + register int32_t result; + + __ASM volatile ("amomax.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic unsigned MIN with 32bit value + * \details Atomically unsigned min compare 32bit value with value in memory using amominu.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be compared + * \return the smaller value + */ +__STATIC_FORCEINLINE uint32_t __AMOMINU_W(volatile uint32_t *addr, uint32_t value) +{ + register uint32_t result; + + __ASM volatile ("amominu.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic signed MIN with 32bit value + * \details Atomically signed min compare 32bit value with value in memory using amomin.d. + * \param [in] addr Address pointer to data, address need to be 4byte aligned + * \param [in] value value to be compared + * \return the smaller value + */ +__STATIC_FORCEINLINE int32_t __AMOMIN_W(volatile int32_t *addr, int32_t value) +{ + register int32_t result; + + __ASM volatile ("amomin.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +#if __RISCV_XLEN == 64 +/** + * \brief Compare and Swap 64bit value using LR and SC + * \details Compare old value with memory, if identical, + * store new value in memory. Return the initial value in memory. + * Success is indicated by comparing return value with OLD. + * memory address, return 0 if successful, otherwise return !0 + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] oldval Old value of the data in address + * \param [in] newval New value to be stored into the address + * \return return the initial value in memory + */ +__STATIC_FORCEINLINE uint64_t __CAS_D(volatile uint64_t *addr, uint64_t oldval, uint64_t newval) +{ + register uint64_t result; + register uint64_t rc; + + __ASM volatile ( \ + "0: lr.d %0, %2 \n" \ + " bne %0, %z3, 1f \n" \ + " sc.d %1, %z4, %2 \n" \ + " bnez %1, 0b \n" \ + "1:\n" \ + : "=&r"(result), "=&r"(rc), "+A"(*addr) \ + : "r"(oldval), "r"(newval) \ + : "memory"); + return result; +} + +/** + * \brief Atomic Swap 64bit value into memory + * \details Atomically swap new 64bit value into memory using amoswap.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] newval New value to be stored into the address + * \return return the original value in memory + */ +__STATIC_FORCEINLINE uint64_t __AMOSWAP_D(volatile uint64_t *addr, uint64_t newval) +{ + register uint64_t result; + + __ASM volatile ("amoswap.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(newval) : "memory"); + return result; +} + +/** + * \brief Atomic Add with 64bit value + * \details Atomically ADD 64bit value with value in memory using amoadd.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be ADDed + * \return return memory value + add value + */ +__STATIC_FORCEINLINE int64_t __AMOADD_D(volatile int64_t *addr, int64_t value) +{ + register int64_t result; + + __ASM volatile ("amoadd.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic And with 64bit value + * \details Atomically AND 64bit value with value in memory using amoand.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be ANDed + * \return return memory value & and value + */ +__STATIC_FORCEINLINE int64_t __AMOAND_D(volatile int64_t *addr, int64_t value) +{ + register int64_t result; + + __ASM volatile ("amoand.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic OR with 64bit value + * \details Atomically OR 64bit value with value in memory using amoor.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be ORed + * \return return memory value | and value + */ +__STATIC_FORCEINLINE int64_t __AMOOR_D(volatile int64_t *addr, int64_t value) +{ + register int64_t result; + + __ASM volatile ("amoor.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic XOR with 64bit value + * \details Atomically XOR 64bit value with value in memory using amoxor.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be XORed + * \return return memory value ^ and value + */ +__STATIC_FORCEINLINE int64_t __AMOXOR_D(volatile int64_t *addr, int64_t value) +{ + register int64_t result; + + __ASM volatile ("amoxor.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic unsigned MAX with 64bit value + * \details Atomically unsigned max compare 64bit value with value in memory using amomaxu.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be compared + * \return return the bigger value + */ +__STATIC_FORCEINLINE uint64_t __AMOMAXU_D(volatile uint64_t *addr, uint64_t value) +{ + register uint64_t result; + + __ASM volatile ("amomaxu.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic signed MAX with 64bit value + * \details Atomically signed max compare 64bit value with value in memory using amomax.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be compared + * \return the bigger value + */ +__STATIC_FORCEINLINE int64_t __AMOMAX_D(volatile int64_t *addr, int64_t value) +{ + register int64_t result; + + __ASM volatile ("amomax.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic unsigned MIN with 64bit value + * \details Atomically unsigned min compare 64bit value with value in memory using amominu.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be compared + * \return the smaller value + */ +__STATIC_FORCEINLINE uint64_t __AMOMINU_D(volatile uint64_t *addr, uint64_t value) +{ + register uint64_t result; + + __ASM volatile ("amominu.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/** + * \brief Atomic signed MIN with 64bit value + * \details Atomically signed min compare 64bit value with value in memory using amomin.d. + * \param [in] addr Address pointer to data, address need to be 8byte aligned + * \param [in] value value to be compared + * \return the smaller value + */ +__STATIC_FORCEINLINE int64_t __AMOMIN_D(volatile int64_t *addr, int64_t value) +{ + register int64_t result; + + __ASM volatile ("amomin.d %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} +#endif /* __RISCV_XLEN == 64 */ + +/** @} */ /* End of Doxygen Group NMSIS_Core_CPU_Intrinsic */ + +#ifdef __cplusplus +} +#endif +#endif /* __CORE_FEATURE_BASE__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_eclic.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_eclic.h new file mode 100755 index 000000000..21e17ce2b --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_eclic.h @@ -0,0 +1,894 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __CORE_FEATURE_ECLIC__ +#define __CORE_FEATURE_ECLIC__ +/*! + * @file core_feature_eclic.h + * @brief ECLIC feature API header file for Nuclei N/NX Core + */ +/* + * ECLIC Feature Configuration Macro: + * 1. __ECLIC_PRESENT: Define whether Enhanced Core Local Interrupt Controller (ECLIC) Unit is present or not + * * 0: Not present + * * 1: Present + * 2. __ECLIC_BASEADDR: Base address of the ECLIC unit. + * 3. ECLIC_GetInfoCtlbits(): Define the number of hardware bits are actually implemented in the clicintctl registers. + * Valid number is 1 - 8. + * 4. __ECLIC_INTNUM : Define the external interrupt number of ECLIC Unit + * + */ +#ifdef __cplusplus + extern "C" { +#endif + +#include "nmsis_gcc.h" +#include "core_feature_base.h" + +#if defined(__ECLIC_PRESENT) && (__ECLIC_PRESENT == 1) +/** + * \defgroup NMSIS_Core_ECLIC_Registers Register Define and Type Definitions Of ECLIC + * \ingroup NMSIS_Core_Registers + * \brief Type definitions and defines for eclic registers. + * + * @{ + */ + +/** + * \brief Union type to access CLICFG configure register. + */ +typedef union +{ + struct { + uint8_t _reserved0:1; /*!< bit: 0 Overflow condition code flag */ + uint8_t nlbits:4; /*!< bit: 29 Carry condition code flag */ + uint8_t _reserved1:2; /*!< bit: 30 Zero condition code flag */ + uint8_t _reserved2:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint8_t w; /*!< Type used for byte access */ +} CLICCFG_Type; + +/** + * \brief Union type to access CLICINFO information register. + */ +typedef union { + struct { + uint32_t numint:13; /*!< bit: 0..12 number of maximum interrupt inputs supported */ + uint32_t version:8; /*!< bit: 13..20 20:17 for architecture version,16:13 for implementation version */ + uint32_t intctlbits:4; /*!< bit: 21..24 specifies how many hardware bits are actually implemented in the clicintctl registers */ + uint32_t _reserved0:7; /*!< bit: 25..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CLICINFO_Type; + +/** + * \brief Access to the structure of a vector interrupt controller. + */ +typedef struct { + __IOM uint8_t INTIP; /*!< Offset: 0x000 (R/W) Interrupt set pending register */ + __IOM uint8_t INTIE; /*!< Offset: 0x001 (R/W) Interrupt set enable register */ + __IOM uint8_t INTATTR; /*!< Offset: 0x002 (R/W) Interrupt set attributes register */ + __IOM uint8_t INTCTRL; /*!< Offset: 0x003 (R/W) Interrupt configure register */ +} CLIC_CTRL_Type; + +typedef struct { + __IOM uint8_t CFG; /*!< Offset: 0x000 (R/W) CLIC configuration register */ + uint8_t RESERVED0[3]; + __IM uint32_t INFO; /*!< Offset: 0x004 (R/ ) CLIC information register */ + uint8_t RESERVED1[3]; + __IOM uint8_t MTH; /*!< Offset: 0x00B (R/W) CLIC machine mode threshold register */ + uint32_t RESERVED2[0x3FD]; + CLIC_CTRL_Type CTRL[4096]; /*!< Offset: 0x1000 (R/W) CLIC register structure for INTIP, INTIE, INTATTR, INTCTL */ +} CLIC_Type; + +#define CLIC_CLICCFG_NLBIT_Pos 1U /*!< CLIC CLICCFG: NLBIT Position */ +#define CLIC_CLICCFG_NLBIT_Msk (0xFUL << CLIC_CLICCFG_NLBIT_Pos) /*!< CLIC CLICCFG: NLBIT Mask */ + +#define CLIC_CLICINFO_CTLBIT_Pos 21U /*!< CLIC INTINFO: __ECLIC_GetInfoCtlbits() Position */ +#define CLIC_CLICINFO_CTLBIT_Msk (0xFUL << CLIC_CLICINFO_CTLBIT_Pos) /*!< CLIC INTINFO: __ECLIC_GetInfoCtlbits() Mask */ + +#define CLIC_CLICINFO_VER_Pos 13U /*!< CLIC CLICINFO: VERSION Position */ +#define CLIC_CLICINFO_VER_Msk (0xFFUL << CLIC_CLICCFG_NLBIT_Pos) /*!< CLIC CLICINFO: VERSION Mask */ + +#define CLIC_CLICINFO_NUM_Pos 0U /*!< CLIC CLICINFO: NUM Position */ +#define CLIC_CLICINFO_NUM_Msk (0xFFFUL << CLIC_CLICINFO_NUM_Pos) /*!< CLIC CLICINFO: NUM Mask */ + +#define CLIC_INTIP_IP_Pos 0U /*!< CLIC INTIP: IP Position */ +#define CLIC_INTIP_IP_Msk (0x1UL << CLIC_INTIP_IP_Pos) /*!< CLIC INTIP: IP Mask */ + +#define CLIC_INTIE_IE_Pos 0U /*!< CLIC INTIE: IE Position */ +#define CLIC_INTIE_IE_Msk (0x1UL << CLIC_INTIE_IE_Pos) /*!< CLIC INTIE: IE Mask */ + +#define CLIC_INTATTR_TRIG_Pos 1U /*!< CLIC INTATTR: TRIG Position */ +#define CLIC_INTATTR_TRIG_Msk (0x3UL << CLIC_INTATTR_TRIG_Pos) /*!< CLIC INTATTR: TRIG Mask */ + +#define CLIC_INTATTR_SHV_Pos 0U /*!< CLIC INTATTR: SHV Position */ +#define CLIC_INTATTR_SHV_Msk (0x1UL << CLIC_INTATTR_SHV_Pos) /*!< CLIC INTATTR: SHV Mask */ + +#define ECLIC_MAX_NLBITS 8U /*!< Max nlbit of the CLICINTCTLBITS */ +#define ECLIC_MODE_MTVEC_Msk 3U /*!< ECLIC Mode mask for MTVT CSR Register */ + +#define ECLIC_NON_VECTOR_INTERRUPT 0x0 /*!< Non-Vector Interrupt Mode of ECLIC */ +#define ECLIC_VECTOR_INTERRUPT 0x1 /*!< Vector Interrupt Mode of ECLIC */ + +/**\brief ECLIC Trigger Enum for different Trigger Type */ +typedef enum ECLIC_TRIGGER { + ECLIC_LEVEL_TRIGGER = 0x0, /*!< Level Triggerred, trig[0] = 0 */ + ECLIC_POSTIVE_EDGE_TRIGGER = 0x1, /*!< Postive/Rising Edge Triggered, trig[0] = 1, trig[1] = 0 */ + ECLIC_NEGTIVE_EDGE_TRIGGER = 0x3, /*!< Negtive/Falling Edge Triggered, trig[0] = 1, trig[1] = 1 */ + ECLIC_MAX_TRIGGER = 0x3 /*!< MAX Supported Trigger Mode */ +} ECLIC_TRIGGER_Type; + +#ifndef __ECLIC_BASEADDR +/* Base address of ECLIC(__ECLIC_BASEADDR) should be defined in */ +#error "__ECLIC_BASEADDR is not defined, please check!" +#endif + +#ifndef __ECLIC_INTCTLBITS +/* Define __ECLIC_INTCTLBITS to get via ECLIC->INFO if not defined */ +#define __ECLIC_INTCTLBITS (__ECLIC_GetInfoCtlbits()) +#endif + +/* ECLIC Memory mapping of Device */ +#define ECLIC_BASE __ECLIC_BASEADDR /*!< ECLIC Base Address */ +#define ECLIC ((CLIC_Type *) ECLIC_BASE) /*!< CLIC configuration struct */ + +/** @} */ /* end of group NMSIS_Core_ECLIC_Registers */ + +/* ########################## ECLIC functions #################################### */ +/** + * \defgroup NMSIS_Core_IntExc Interrupts and Exceptions + * \brief Functions that manage interrupts and exceptions via the ECLIC. + * + * @{ + */ + +/** + * \brief Definition of IRQn numbers + * \details + * The core interrupt enumeration names for IRQn values are defined in the file .h. + * - Interrupt ID(IRQn) from 0 to 18 are reserved for core internal interrupts. + * - Interrupt ID(IRQn) start from 19 represent device-specific external interrupts. + * - The first device-specific interrupt has the IRQn value 19. + * + * The table below describes the core interrupt names and their availability in various Nuclei Cores. + */ +/* The following enum IRQn definition in this file + * is only used for doxygen documentation generation, + * The .h is the real file to define it by vendor + */ +#if defined(__ONLY_FOR_DOXYGEN_DOCUMENT_GENERATION__) +typedef enum IRQn { + /* ========= Nuclei N/NX Core Specific Interrupt Numbers =========== */ + /* Core Internal Interrupt IRQn definitions */ + Reserved0_IRQn = 0, /*!< Internal reserved */ + Reserved1_IRQn = 1, /*!< Internal reserved */ + Reserved2_IRQn = 2, /*!< Internal reserved */ + SysTimerSW_IRQn = 3, /*!< System Timer SW interrupt */ + Reserved3_IRQn = 4, /*!< Internal reserved */ + Reserved4_IRQn = 5, /*!< Internal reserved */ + Reserved5_IRQn = 6, /*!< Internal reserved */ + SysTimer_IRQn = 7, /*!< System Timer Interrupt */ + Reserved6_IRQn = 8, /*!< Internal reserved */ + Reserved7_IRQn = 9, /*!< Internal reserved */ + Reserved8_IRQn = 10, /*!< Internal reserved */ + Reserved9_IRQn = 11, /*!< Internal reserved */ + Reserved10_IRQn = 12, /*!< Internal reserved */ + Reserved11_IRQn = 13, /*!< Internal reserved */ + Reserved12_IRQn = 14, /*!< Internal reserved */ + Reserved13_IRQn = 15, /*!< Internal reserved */ + Reserved14_IRQn = 16, /*!< Internal reserved */ + Reserved15_IRQn = 17, /*!< Internal reserved */ + Reserved16_IRQn = 18, /*!< Internal reserved */ + + /* ========= Device Specific Interrupt Numbers =================== */ + /* ToDo: add here your device specific external interrupt numbers. + * 19~max(NUM_INTERRUPT, 1023) is reserved number for user. + * Maxmum interrupt supported could get from clicinfo.NUM_INTERRUPT. + * According the interrupt handlers defined in startup_Device.S + * eg.: Interrupt for Timer#1 eclic_tim1_handler -> TIM1_IRQn */ + FirstDeviceSpecificInterrupt_IRQn = 19, /*!< First Device Specific Interrupt */ + SOC_INT_MAX, /*!< Number of total interrupts */ +} IRQn_Type; +#endif /* __ONLY_FOR_DOXYGEN_DOCUMENT_GENERATION__ */ + +#ifdef NMSIS_ECLIC_VIRTUAL + #ifndef NMSIS_ECLIC_VIRTUAL_HEADER_FILE + #define NMSIS_ECLIC_VIRTUAL_HEADER_FILE "nmsis_eclic_virtual.h" + #endif + #include NMSIS_ECLIC_VIRTUAL_HEADER_FILE +#else + #define ECLIC_SetCfgNlbits __ECLIC_SetCfgNlbits + #define ECLIC_GetCfgNlbits __ECLIC_GetCfgNlbits + #define ECLIC_GetInfoVer __ECLIC_GetInfoVer + #define ECLIC_GetInfoCtlbits __ECLIC_GetInfoCtlbits + #define ECLIC_GetInfoNum __ECLIC_GetInfoNum + #define ECLIC_SetMth __ECLIC_SetMth + #define ECLIC_GetMth __ECLIC_GetMth + #define ECLIC_EnableIRQ __ECLIC_EnableIRQ + #define ECLIC_GetEnableIRQ __ECLIC_GetEnableIRQ + #define ECLIC_DisableIRQ __ECLIC_DisableIRQ + #define ECLIC_SetPendingIRQ __ECLIC_SetPendingIRQ + #define ECLIC_GetPendingIRQ __ECLIC_GetPendingIRQ + #define ECLIC_ClearPendingIRQ __ECLIC_ClearPendingIRQ + #define ECLIC_SetTrigIRQ __ECLIC_SetTrigIRQ + #define ECLIC_GetTrigIRQ __ECLIC_GetTrigIRQ + #define ECLIC_SetShvIRQ __ECLIC_SetShvIRQ + #define ECLIC_GetShvIRQ __ECLIC_GetShvIRQ + #define ECLIC_SetCtrlIRQ __ECLIC_SetCtrlIRQ + #define ECLIC_GetCtrlIRQ __ECLIC_GetCtrlIRQ + #define ECLIC_SetLevelIRQ __ECLIC_SetLevelIRQ + #define ECLIC_GetLevelIRQ __ECLIC_GetLevelIRQ + #define ECLIC_SetPriorityIRQ __ECLIC_SetPriorityIRQ + #define ECLIC_GetPriorityIRQ __ECLIC_GetPriorityIRQ + +#endif /* NMSIS_ECLIC_VIRTUAL */ + +#ifdef NMSIS_VECTAB_VIRTUAL + #ifndef NMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define NMSIS_VECTAB_VIRTUAL_HEADER_FILE "nmsis_vectab_virtual.h" + #endif + #include NMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define ECLIC_SetVector __ECLIC_SetVector + #define ECLIC_GetVector __ECLIC_GetVector +#endif /* (NMSIS_VECTAB_VIRTUAL) */ + +/** + * \brief Set nlbits value + * \details + * This function set the nlbits value of CLICCFG register. + * \param [in] nlbits nlbits value + * \remarks + * - nlbits is used to set the width of level in the CLICINTCTL[i]. + * \sa + * - \ref ECLIC_GetCfgNlbits + */ +__STATIC_FORCEINLINE void __ECLIC_SetCfgNlbits(uint32_t nlbits) +{ + ECLIC->CFG &= ~CLIC_CLICCFG_NLBIT_Msk; + ECLIC->CFG |= (uint8_t)((nlbits <CFG & CLIC_CLICCFG_NLBIT_Msk) >> CLIC_CLICCFG_NLBIT_Pos)); +} + +/** + * \brief Get the ECLIC version number + * \details + * This function gets the hardware version information from CLICINFO register. + * \return hardware version number in CLICINFO register. + * \remarks + * - This function gets harware version information from CLICINFO register. + * - Bit 20:17 for architecture version, bit 16:13 for implementation version. + * \sa + * - \ref ECLIC_GetInfoNum +*/ +__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoVer(void) +{ + return ((uint32_t)((ECLIC->INFO & CLIC_CLICINFO_VER_Msk) >> CLIC_CLICINFO_VER_Pos)); +} + +/** + * \brief Get CLICINTCTLBITS + * \details + * This function gets CLICINTCTLBITS from CLICINFO register. + * \return CLICINTCTLBITS from CLICINFO register. + * \remarks + * - In the CLICINTCTL[i] registers, with 2 <= CLICINTCTLBITS <= 8. + * - The implemented bits are kept left-justified in the most-significant bits of each 8-bit + * CLICINTCTL[I] register, with the lower unimplemented bits treated as hardwired to 1. + * \sa + * - \ref ECLIC_GetInfoNum + */ +__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoCtlbits(void) +{ + return ((uint32_t)((ECLIC->INFO & CLIC_CLICINFO_CTLBIT_Msk) >> CLIC_CLICINFO_CTLBIT_Pos)); +} + +/** + * \brief Get number of maximum interrupt inputs supported + * \details + * This function gets number of maximum interrupt inputs supported from CLICINFO register. + * \return number of maximum interrupt inputs supported from CLICINFO register. + * \remarks + * - This function gets number of maximum interrupt inputs supported from CLICINFO register. + * - The num_interrupt field specifies the actual number of maximum interrupt inputs supported in this implementation. + * \sa + * - \ref ECLIC_GetInfoCtlbits + */ +__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoNum(void) +{ + return ((uint32_t)((ECLIC->INFO & CLIC_CLICINFO_NUM_Msk) >> CLIC_CLICINFO_NUM_Pos)); +} + +/** + * \brief Set Machine Mode Interrupt Level Threshold + * \details + * This function sets machine mode interrupt level threshold. + * \param [in] mth Interrupt Level Threshold. + * \sa + * - \ref ECLIC_GetMth + */ +__STATIC_FORCEINLINE void __ECLIC_SetMth(uint8_t mth) +{ + ECLIC->MTH = mth; +} + +/** + * \brief Get Machine Mode Interrupt Level Threshold + * \details + * This function gets machine mode interrupt level threshold. + * \return Interrupt Level Threshold. + * \sa + * - \ref ECLIC_SetMth + */ +__STATIC_FORCEINLINE uint8_t __ECLIC_GetMth(void) +{ + return (ECLIC->MTH); +} + + +/** + * \brief Enable a specific interrupt + * \details + * This function enables the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_DisableIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_EnableIRQ(IRQn_Type IRQn) +{ + ECLIC->CTRL[IRQn].INTIE |= CLIC_INTIE_IE_Msk; +} + +/** + * \brief Get a specific interrupt enable status + * \details + * This function returns the interrupt enable status for the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \returns + * - 0 Interrupt is not enabled + * - 1 Interrupt is pending + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_EnableIRQ + * - \ref ECLIC_DisableIRQ + */ +__STATIC_FORCEINLINE uint32_t __ECLIC_GetEnableIRQ(IRQn_Type IRQn) +{ + return((uint32_t) (ECLIC->CTRL[IRQn].INTIE) & CLIC_INTIE_IE_Msk); +} + +/** + * \brief Disable a specific interrupt + * \details + * This function disables the specific interrupt \em IRQn. + * \param [in] IRQn Number of the external interrupt to disable + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_EnableIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_DisableIRQ(IRQn_Type IRQn) +{ + ECLIC->CTRL[IRQn].INTIE &= ~CLIC_INTIE_IE_Msk; +} + +/** + * \brief Get the pending specific interrupt + * \details + * This function returns the pending status of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \returns + * - 0 Interrupt is not pending + * - 1 Interrupt is pending + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_SetPendingIRQ + * - \ref ECLIC_ClearPendingIRQ + */ +__STATIC_FORCEINLINE int32_t __ECLIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t)(ECLIC->CTRL[IRQn].INTIP) & CLIC_INTIP_IP_Msk); +} + +/** + * \brief Set a specific interrupt to pending + * \details + * This function sets the pending bit for the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_GetPendingIRQ + * - \ref ECLIC_ClearPendingIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_SetPendingIRQ(IRQn_Type IRQn) +{ + ECLIC->CTRL[IRQn].INTIP |= CLIC_INTIP_IP_Msk; +} + +/** + * \brief Clear a specific interrupt from pending + * \details + * This function removes the pending state of the specific interrupt \em IRQn. + * \em IRQn cannot be a negative number. + * \param [in] IRQn Interrupt number + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_SetPendingIRQ + * - \ref ECLIC_GetPendingIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + ECLIC->CTRL[IRQn].INTIP &= ~ CLIC_INTIP_IP_Msk; +} + +/** + * \brief Set trigger mode and polarity for a specific interrupt + * \details + * This function set trigger mode and polarity of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \param [in] trig + * - 00 level trigger, \ref ECLIC_LEVEL_TRIGGER + * - 01 positive edge trigger, \ref ECLIC_POSTIVE_EDGE_TRIGGER + * - 02 level trigger, \ref ECLIC_LEVEL_TRIGGER + * - 03 negative edge trigger, \ref ECLIC_NEGTIVE_EDGE_TRIGGER + * \remarks + * - IRQn must not be negative. + * + * \sa + * - \ref ECLIC_GetTrigIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_SetTrigIRQ(IRQn_Type IRQn, uint32_t trig) +{ + ECLIC->CTRL[IRQn].INTATTR &= ~CLIC_INTATTR_TRIG_Msk; + ECLIC->CTRL[IRQn].INTATTR |= (uint8_t)(trig<CTRL[IRQn].INTATTR) & CLIC_INTATTR_TRIG_Msk)>>CLIC_INTATTR_TRIG_Pos)); +} + +/** + * \brief Set interrupt working mode for a specific interrupt + * \details + * This function set selective hardware vector or non-vector working mode of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \param [in] shv + * - 0 non-vector mode, \ref ECLIC_NON_VECTOR_INTERRUPT + * - 1 vector mode, \ref ECLIC_VECTOR_INTERRUPT + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_GetShvIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_SetShvIRQ(IRQn_Type IRQn, uint32_t shv) +{ + ECLIC->CTRL[IRQn].INTATTR &= ~CLIC_INTATTR_SHV_Msk; + ECLIC->CTRL[IRQn].INTATTR |= (uint8_t)(shv<CTRL[IRQn].INTATTR) & CLIC_INTATTR_SHV_Msk)>>CLIC_INTATTR_SHV_Pos)); +} + +/** + * \brief Modify ECLIC Interrupt Input Control Register for a specific interrupt + * \details + * This function modify ECLIC Interrupt Input Control(CLICINTCTL[i]) register of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \param [in] intctrl Set value for CLICINTCTL[i] register + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_GetCtrlIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_SetCtrlIRQ(IRQn_Type IRQn, uint8_t intctrl) +{ + ECLIC->CTRL[IRQn].INTCTRL = intctrl; +} + +/** + * \brief Get ECLIC Interrupt Input Control Register value for a specific interrupt + * \details + * This function modify ECLIC Interrupt Input Control register of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \return value of ECLIC Interrupt Input Control register + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_SetCtrlIRQ + */ +__STATIC_FORCEINLINE uint8_t __ECLIC_GetCtrlIRQ(IRQn_Type IRQn) +{ + return (ECLIC->CTRL[IRQn].INTCTRL); +} + +/** + * \brief Set ECLIC Interrupt level of a specific interrupt + * \details + * This function set interrupt level of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \param [in] lvl_abs Interrupt level + * \remarks + * - IRQn must not be negative. + * - If lvl_abs to be set is larger than the max level allowed, it will be force to be max level. + * - When you set level value you need use clciinfo.nlbits to get the width of level. + * Then we could know the maximum of level. CLICINTCTLBITS is how many total bits are + * present in the CLICINTCTL register. + * \sa + * - \ref ECLIC_GetLevelIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_SetLevelIRQ(IRQn_Type IRQn, uint8_t lvl_abs) +{ + uint8_t nlbits = __ECLIC_GetCfgNlbits(); + uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS; + + if (nlbits == 0) { + return; + } + + if (nlbits > intctlbits) { + nlbits = intctlbits; + } + uint8_t maxlvl = ((1 << nlbits) - 1); + if (lvl_abs > maxlvl) { + lvl_abs = maxlvl; + } + uint8_t lvl = lvl_abs << (ECLIC_MAX_NLBITS - nlbits); + uint8_t cur_ctrl = __ECLIC_GetCtrlIRQ(IRQn); + cur_ctrl = cur_ctrl << nlbits; + cur_ctrl = cur_ctrl >> nlbits; + __ECLIC_SetCtrlIRQ(IRQn, (cur_ctrl | lvl)); +} + +/** + * \brief Get ECLIC Interrupt level of a specific interrupt + * \details + * This function get interrupt level of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \return Interrupt level + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_SetLevelIRQ + */ +__STATIC_FORCEINLINE uint8_t __ECLIC_GetLevelIRQ(IRQn_Type IRQn) +{ + uint8_t nlbits = __ECLIC_GetCfgNlbits(); + uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS; + + if (nlbits == 0) { + return 0; + } + + if (nlbits > intctlbits) { + nlbits = intctlbits; + } + uint8_t intctrl = __ECLIC_GetCtrlIRQ(IRQn); + uint8_t lvl_abs = intctrl >> (ECLIC_MAX_NLBITS - nlbits); + return lvl_abs; +} + +/** + * \brief Get ECLIC Interrupt priority of a specific interrupt + * \details + * This function get interrupt priority of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \param [in] pri Interrupt priority + * \remarks + * - IRQn must not be negative. + * - If pri to be set is larger than the max priority allowed, it will be force to be max priority. + * - Priority width is CLICINTCTLBITS minus clciinfo.nlbits if clciinfo.nlbits + * is less than CLICINTCTLBITS. Otherwise priority width is 0. + * \sa + * - \ref ECLIC_GetPriorityIRQ + */ +__STATIC_FORCEINLINE void __ECLIC_SetPriorityIRQ(IRQn_Type IRQn, uint8_t pri) +{ + uint8_t nlbits = __ECLIC_GetCfgNlbits(); + uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS; + if (nlbits < intctlbits) { + uint8_t maxpri = ((1 << (intctlbits - nlbits)) - 1); + if (pri > maxpri) { + pri = maxpri; + } + pri = pri << (ECLIC_MAX_NLBITS - intctlbits); + uint8_t mask = ((uint8_t)(-1)) >> intctlbits; + pri = pri | mask; + uint8_t cur_ctrl = __ECLIC_GetCtrlIRQ(IRQn); + cur_ctrl = cur_ctrl >> (ECLIC_MAX_NLBITS - nlbits); + cur_ctrl = cur_ctrl << (ECLIC_MAX_NLBITS - nlbits); + __ECLIC_SetCtrlIRQ(IRQn, (cur_ctrl | pri)); + } +} + +/** + * \brief Get ECLIC Interrupt priority of a specific interrupt + * \details + * This function get interrupt priority of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \return Interrupt priority + * \remarks + * - IRQn must not be negative. + * \sa + * - \ref ECLIC_SetPriorityIRQ + */ +__STATIC_FORCEINLINE uint8_t __ECLIC_GetPriorityIRQ(IRQn_Type IRQn) +{ + uint8_t nlbits = __ECLIC_GetCfgNlbits(); + uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS; + if (nlbits < intctlbits) { + uint8_t cur_ctrl = __ECLIC_GetCtrlIRQ(IRQn); + uint8_t pri = cur_ctrl << nlbits; + pri = pri >> nlbits; + pri = pri >> (ECLIC_MAX_NLBITS - intctlbits); + return pri; + } else { + return 0; + } +} + +/** + * \brief Set Interrupt Vector of a specific interrupt + * \details + * This function set interrupt handler address of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \param [in] vector Interrupt handler address + * \remarks + * - IRQn must not be negative. + * - You can set the \ref CSR_CSR_MTVT to set interrupt vector table entry address. + * - If your vector table is placed in readonly section, the vector for IRQn will not be modified. + * For this case, you need to use the correct irq handler name defined in your vector table as + * your irq handler function name. + * - This function will only work correctly when the vector table is placed in an read-write enabled section. + * \sa + * - \ref ECLIC_GetVector + */ +__STATIC_FORCEINLINE void __ECLIC_SetVector(IRQn_Type IRQn, rv_csr_t vector) +{ + volatile unsigned long vec_base; + vec_base = ((unsigned long)__RV_CSR_READ(CSR_MTVT)); + vec_base += ((unsigned long)IRQn) * sizeof(unsigned long); + (* (unsigned long *) vec_base) = vector; +#if (defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1)) + MFlushDCacheLine((unsigned long)vec_base); +#endif +} + +/** + * \brief Get Interrupt Vector of a specific interrupt + * \details + * This function get interrupt handler address of the specific interrupt \em IRQn. + * \param [in] IRQn Interrupt number + * \return Interrupt handler address + * \remarks + * - IRQn must not be negative. + * - You can read \ref CSR_CSR_MTVT to get interrupt vector table entry address. + * \sa + * - \ref ECLIC_SetVector + */ +__STATIC_FORCEINLINE rv_csr_t __ECLIC_GetVector(IRQn_Type IRQn) +{ +#if __RISCV_XLEN == 32 + return (*(uint32_t *)(__RV_CSR_READ(CSR_MTVT)+IRQn*4)); +#elif __RISCV_XLEN == 64 + return (*(uint64_t *)(__RV_CSR_READ(CSR_MTVT)+IRQn*8)); +#else // TODO Need cover for XLEN=128 case in future + return (*(uint64_t *)(__RV_CSR_READ(CSR_MTVT)+IRQn*8)); +#endif +} + +/** + * \brief Set Exception entry address + * \details + * This function set exception handler address to 'CSR_MTVEC'. + * \param [in] addr Exception handler address + * \remarks + * - This function use to set exception handler address to 'CSR_MTVEC'. Address is 4 bytes align. + * \sa + * - \ref __get_exc_entry + */ +__STATIC_FORCEINLINE void __set_exc_entry(rv_csr_t addr) +{ + addr &= (rv_csr_t)(~0x3F); + addr |= ECLIC_MODE_MTVEC_Msk; + __RV_CSR_WRITE(CSR_MTVEC, addr); +} + +/** + * \brief Get Exception entry address + * \details + * This function get exception handler address from 'CSR_MTVEC'. + * \return Exception handler address + * \remarks + * - This function use to get exception handler address from 'CSR_MTVEC'. Address is 4 bytes align + * \sa + * - \ref __set_exc_entry + */ +__STATIC_FORCEINLINE rv_csr_t __get_exc_entry(void) +{ + unsigned long addr = __RV_CSR_READ(CSR_MTVEC); + return (addr & ~ECLIC_MODE_MTVEC_Msk); +} + +/** + * \brief Set Non-vector interrupt entry address + * \details + * This function set Non-vector interrupt address. + * \param [in] addr Non-vector interrupt entry address + * \remarks + * - This function use to set non-vector interrupt entry address to 'CSR_MTVT2' if + * - CSR_MTVT2 bit0 is 1. If 'CSR_MTVT2' bit0 is 0 then set address to 'CSR_MTVEC' + * \sa + * - \ref __get_nonvec_entry + */ +__STATIC_FORCEINLINE void __set_nonvec_entry(rv_csr_t addr) +{ + if (__RV_CSR_READ(CSR_MTVT2) & 0x1){ + __RV_CSR_WRITE(CSR_MTVT2, addr | 0x01); + } else { + addr &= (rv_csr_t)(~0x3F); + addr |= ECLIC_MODE_MTVEC_Msk; + __RV_CSR_WRITE(CSR_MTVEC, addr); + } +} + +/** + * \brief Get Non-vector interrupt entry address + * \details + * This function get Non-vector interrupt address. + * \return Non-vector interrupt handler address + * \remarks + * - This function use to get non-vector interrupt entry address from 'CSR_MTVT2' if + * - CSR_MTVT2 bit0 is 1. If 'CSR_MTVT2' bit0 is 0 then get address from 'CSR_MTVEC'. + * \sa + * - \ref __set_nonvec_entry + */ +__STATIC_FORCEINLINE rv_csr_t __get_nonvec_entry(void) +{ + if (__RV_CSR_READ(CSR_MTVT2) & 0x1) { + return __RV_CSR_READ(CSR_MTVT2) & (~(rv_csr_t)(0x1)); + } else { + rv_csr_t addr = __RV_CSR_READ(CSR_MTVEC); + return (addr & ~ECLIC_MODE_MTVEC_Msk); + } +} + +/** + * \brief Get NMI interrupt entry from 'CSR_MNVEC' + * \details + * This function get NMI interrupt address from 'CSR_MNVEC'. + * \return NMI interrupt handler address + * \remarks + * - This function use to get NMI interrupt handler address from 'CSR_MNVEC'. If CSR_MMISC_CTL[9] = 1 'CSR_MNVEC' + * - will be equal as mtvec. If CSR_MMISC_CTL[9] = 0 'CSR_MNVEC' will be equal as reset vector. + * - NMI entry is defined via \ref CSR_MMISC_CTL, writing to \ref CSR_MNVEC will be ignored. + */ +__STATIC_FORCEINLINE rv_csr_t __get_nmi_entry(void) +{ + return __RV_CSR_READ(CSR_MNVEC); +} + +/** + * \brief Save necessary CSRs into variables for vector interrupt nesting + * \details + * This macro is used to declare variables which are used for saving + * CSRs(MCAUSE, MEPC, MSUB), and it will read these CSR content into + * these variables, it need to be used in a vector-interrupt if nesting + * is required. + * \remarks + * - Interrupt will be enabled after this macro is called + * - It need to be used together with \ref RESTORE_IRQ_CSR_CONTEXT + * - Don't use variable names __mcause, __mpec, __msubm in your ISR code + * - If you want to enable interrupt nesting feature for vector interrupt, + * you can do it like this: + * \code + * // __INTERRUPT attribute will generates function entry and exit sequences suitable + * // for use in an interrupt handler when this attribute is present + * __INTERRUPT void eclic_mtip_handler(void) + * { + * // Must call this to save CSRs + * SAVE_IRQ_CSR_CONTEXT(); + * // !!!Interrupt is enabled here!!! + * // !!!Higher priority interrupt could nest it!!! + * + * // put you own interrupt handling code here + * + * // Must call this to restore CSRs + * RESTORE_IRQ_CSR_CONTEXT(); + * } + * \endcode + */ +#define SAVE_IRQ_CSR_CONTEXT() \ + rv_csr_t __mcause = __RV_CSR_READ(CSR_MCAUSE); \ + rv_csr_t __mepc = __RV_CSR_READ(CSR_MEPC); \ + rv_csr_t __msubm = __RV_CSR_READ(CSR_MSUBM); \ + __enable_irq(); + +/** + * \brief Restore necessary CSRs from variables for vector interrupt nesting + * \details + * This macro is used restore CSRs(MCAUSE, MEPC, MSUB) from pre-defined variables + * in \ref SAVE_IRQ_CSR_CONTEXT macro. + * \remarks + * - Interrupt will be disabled after this macro is called + * - It need to be used together with \ref SAVE_IRQ_CSR_CONTEXT + */ +#define RESTORE_IRQ_CSR_CONTEXT() \ + __disable_irq(); \ + __RV_CSR_WRITE(CSR_MSUBM, __msubm); \ + __RV_CSR_WRITE(CSR_MEPC, __mepc); \ + __RV_CSR_WRITE(CSR_MCAUSE, __mcause); + +/** @} */ /* End of Doxygen Group NMSIS_Core_IntExc */ + +#endif /* defined(__ECLIC_PRESENT) && (__ECLIC_PRESENT == 1) */ + +#ifdef __cplusplus +} +#endif +#endif /** __CORE_FEATURE_ECLIC__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_timer.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_timer.h new file mode 100755 index 000000000..6e9b7af39 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/core_feature_timer.h @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __CORE_FEATURE_TIMER_H__ +#define __CORE_FEATURE_TIMER_H__ +/*! + * @file core_feature_timer.h + * @brief System Timer feature API header file for Nuclei N/NX Core + */ +/* + * System Timer Feature Configuration Macro: + * 1. __SYSTIMER_PRESENT: Define whether Private System Timer is present or not. + * * 0: Not present + * * 1: Present + * 2. __SYSTIMER_BASEADDR: Define the base address of the System Timer. + */ +#ifdef __cplusplus + extern "C" { +#endif + +#if defined(__SYSTIMER_PRESENT) && (__SYSTIMER_PRESENT == 1) +/** + * \defgroup NMSIS_Core_SysTimer_Registers Register Define and Type Definitions Of System Timer + * \ingroup NMSIS_Core_Registers + * \brief Type definitions and defines for system timer registers. + * + * @{ + */ +/** + * \brief Structure type to access the System Timer (SysTimer). + * \details + * Structure definition to access the system timer(SysTimer). + * \remarks + * - MSFTRST register is introduced in Nuclei N Core version 1.3(\ref __NUCLEI_N_REV >= 0x0103) + * - MSTOP register is renamed to MTIMECTL register in Nuclei N Core version 1.4(\ref __NUCLEI_N_REV >= 0x0104) + * - CMPCLREN and CLKSRC bit in MTIMECTL register is introduced in Nuclei N Core version 1.4(\ref __NUCLEI_N_REV >= 0x0104) + */ +typedef struct { + __IOM uint64_t MTIMER; /*!< Offset: 0x000 (R/W) System Timer current value 64bits Register */ + __IOM uint64_t MTIMERCMP; /*!< Offset: 0x008 (R/W) System Timer compare Value 64bits Register */ + __IOM uint32_t RESERVED0[0x3F8]; /*!< Offset: 0x010 - 0xFEC Reserved */ + __IOM uint32_t MSFTRST; /*!< Offset: 0xFF0 (R/W) System Timer Software Core Reset Register */ + __IOM uint32_t RESERVED1; /*!< Offset: 0xFF4 Reserved */ + __IOM uint32_t MTIMECTL; /*!< Offset: 0xFF8 (R/W) System Timer Control Register, previously MSTOP register */ + __IOM uint32_t MSIP; /*!< Offset: 0xFFC (R/W) System Timer SW interrupt Register */ +} SysTimer_Type; + +/* Timer Control / Status Register Definitions */ +#define SysTimer_MTIMECTL_TIMESTOP_Pos 0U /*!< SysTick Timer MTIMECTL: TIMESTOP bit Position */ +#define SysTimer_MTIMECTL_TIMESTOP_Msk (1UL << SysTimer_MTIMECTL_TIMESTOP_Pos) /*!< SysTick Timer MTIMECTL: TIMESTOP Mask */ +#define SysTimer_MTIMECTL_CMPCLREN_Pos 1U /*!< SysTick Timer MTIMECTL: CMPCLREN bit Position */ +#define SysTimer_MTIMECTL_CMPCLREN_Msk (1UL << SysTimer_MTIMECTL_CMPCLREN_Pos) /*!< SysTick Timer MTIMECTL: CMPCLREN Mask */ +#define SysTimer_MTIMECTL_CLKSRC_Pos 2U /*!< SysTick Timer MTIMECTL: CLKSRC bit Position */ +#define SysTimer_MTIMECTL_CLKSRC_Msk (1UL << SysTimer_MTIMECTL_CLKSRC_Pos) /*!< SysTick Timer MTIMECTL: CLKSRC Mask */ + +#define SysTimer_MSIP_MSIP_Pos 0U /*!< SysTick Timer MSIP: MSIP bit Position */ +#define SysTimer_MSIP_MSIP_Msk (1UL << SysTimer_MSIP_MSIP_Pos) /*!< SysTick Timer MSIP: MSIP Mask */ + +#define SysTimer_MTIMER_Msk (0xFFFFFFFFFFFFFFFFULL) /*!< SysTick Timer MTIMER value Mask */ +#define SysTimer_MTIMERCMP_Msk (0xFFFFFFFFFFFFFFFFULL) /*!< SysTick Timer MTIMERCMP value Mask */ +#define SysTimer_MTIMECTL_Msk (0xFFFFFFFFUL) /*!< SysTick Timer MTIMECTL/MSTOP value Mask */ +#define SysTimer_MSIP_Msk (0xFFFFFFFFUL) /*!< SysTick Timer MSIP value Mask */ +#define SysTimer_MSFTRST_Msk (0xFFFFFFFFUL) /*!< SysTick Timer MSFTRST value Mask */ + +#define SysTimer_MSFRST_KEY (0x80000A5FUL) /*!< SysTick Timer Software Reset Request Key */ + +#ifndef __SYSTIMER_BASEADDR +/* Base address of SYSTIMER(__SYSTIMER_BASEADDR) should be defined in */ +#error "__SYSTIMER_BASEADDR is not defined, please check!" +#endif +/* System Timer Memory mapping of Device */ +#define SysTimer_BASE __SYSTIMER_BASEADDR /*!< SysTick Base Address */ +#define SysTimer ((SysTimer_Type *) SysTimer_BASE) /*!< SysTick configuration struct */ +/** @} */ /* end of group NMSIS_Core_SysTimer_Registers */ + +/* ################################## SysTimer function ############################################ */ +/** + * \defgroup NMSIS_Core_SysTimer SysTimer Functions + * \brief Functions that configure the Core System Timer. + * @{ + */ +/** + * \brief Set system timer load value + * \details + * This function set the system timer load value in MTIMER register. + * \param [in] value value to set system timer MTIMER register. + * \remarks + * - Load value is 64bits wide. + * - \ref SysTimer_GetLoadValue + */ +__STATIC_FORCEINLINE void SysTimer_SetLoadValue(uint64_t value) +{ + SysTimer->MTIMER = value; +} + +/** + * \brief Get system timer load value + * \details + * This function get the system timer current value in MTIMER register. + * \return current value(64bit) of system timer MTIMER register. + * \remarks + * - Load value is 64bits wide. + * - \ref SysTimer_SetLoadValue + */ +__STATIC_FORCEINLINE uint64_t SysTimer_GetLoadValue(void) +{ + return SysTimer->MTIMER; +} + +/** + * \brief Set system timer compare value + * \details + * This function set the system Timer compare value in MTIMERCMP register. + * \param [in] value compare value to set system timer MTIMERCMP register. + * \remarks + * - Compare value is 64bits wide. + * - If compare value is larger than current value timer interrupt generate. + * - Modify the load value or compare value less to clear the interrupt. + * - \ref SysTimer_GetCompareValue + */ +__STATIC_FORCEINLINE void SysTimer_SetCompareValue(uint64_t value) +{ + SysTimer->MTIMERCMP = value; +} + +/** + * \brief Get system timer compare value + * \details + * This function get the system timer compare value in MTIMERCMP register. + * \return compare value of system timer MTIMERCMP register. + * \remarks + * - Compare value is 64bits wide. + * - \ref SysTimer_SetCompareValue + */ +__STATIC_FORCEINLINE uint64_t SysTimer_GetCompareValue(void) +{ + return SysTimer->MTIMERCMP; +} + +/** + * \brief Enable system timer counter running + * \details + * Enable system timer counter running by clear + * TIMESTOP bit in MTIMECTL register. + */ +__STATIC_FORCEINLINE void SysTimer_Start(void) +{ + SysTimer->MTIMECTL &= ~(SysTimer_MTIMECTL_TIMESTOP_Msk); +} + +/** + * \brief Stop system timer counter running + * \details + * Stop system timer counter running by set + * TIMESTOP bit in MTIMECTL register. + */ +__STATIC_FORCEINLINE void SysTimer_Stop(void) +{ + SysTimer->MTIMECTL |= SysTimer_MTIMECTL_TIMESTOP_Msk; +} + +/** + * \brief Set system timer control value + * \details + * This function set the system timer MTIMECTL register value. + * \param [in] mctl value to set MTIMECTL register + * \remarks + * - Bit TIMESTOP is used to start and stop timer. + * Clear TIMESTOP bit to 0 to start timer, otherwise to stop timer. + * - Bit CMPCLREN is used to enable auto MTIMER clear to zero when MTIMER >= MTIMERCMP. + * Clear CMPCLREN bit to 0 to stop auto clear MTIMER feature, otherwise to enable it. + * - Bit CLKSRC is used to select timer clock source. + * Clear CLKSRC bit to 0 to use *mtime_toggle_a*, otherwise use *core_clk_aon* + * - \ref SysTimer_GetControlValue + */ +__STATIC_FORCEINLINE void SysTimer_SetControlValue(uint32_t mctl) +{ + SysTimer->MTIMECTL = (mctl & SysTimer_MTIMECTL_Msk); +} + +/** + * \brief Get system timer control value + * \details + * This function get the system timer MTIMECTL register value. + * \return MTIMECTL register value + * \remarks + * - \ref SysTimer_SetControlValue + */ +__STATIC_FORCEINLINE uint32_t SysTimer_GetControlValue(void) +{ + return (SysTimer->MTIMECTL & SysTimer_MTIMECTL_Msk); +} + +/** + * \brief Trigger or set software interrupt via system timer + * \details + * This function set the system timer MSIP bit in MSIP register. + * \remarks + * - Set system timer MSIP bit and generate a SW interrupt. + * - \ref SysTimer_ClearSWIRQ + * - \ref SysTimer_GetMsipValue + */ +__STATIC_FORCEINLINE void SysTimer_SetSWIRQ(void) +{ + SysTimer->MSIP |= SysTimer_MSIP_MSIP_Msk; +} + +/** + * \brief Clear system timer software interrupt pending request + * \details + * This function clear the system timer MSIP bit in MSIP register. + * \remarks + * - Clear system timer MSIP bit in MSIP register to clear the software interrupt pending. + * - \ref SysTimer_SetSWIRQ + * - \ref SysTimer_GetMsipValue + */ +__STATIC_FORCEINLINE void SysTimer_ClearSWIRQ(void) +{ + SysTimer->MSIP &= ~SysTimer_MSIP_MSIP_Msk; +} + +/** + * \brief Get system timer MSIP register value + * \details + * This function get the system timer MSIP register value. + * \return Value of Timer MSIP register. + * \remarks + * - Bit0 is SW interrupt flag. + * Bit0 is 1 then SW interrupt set. Bit0 is 0 then SW interrupt clear. + * - \ref SysTimer_SetSWIRQ + * - \ref SysTimer_ClearSWIRQ + */ +__STATIC_FORCEINLINE uint32_t SysTimer_GetMsipValue(void) +{ + return (uint32_t)(SysTimer->MSIP & SysTimer_MSIP_Msk); +} + +/** + * \brief Set system timer MSIP register value + * \details + * This function set the system timer MSIP register value. + * \param [in] msip value to set MSIP register + */ +__STATIC_FORCEINLINE void SysTimer_SetMsipValue(uint32_t msip) +{ + SysTimer->MSIP = (msip & SysTimer_MSIP_Msk); +} + +/** + * \brief Do software reset request + * \details + * This function will do software reset request through MTIMER + * - Software need to write \ref SysTimer_MSFRST_KEY to generate software reset request + * - The software request flag can be cleared by reset operation to clear + * \remarks + * - The software reset is sent to SoC, SoC need to generate reset signal and send back to Core + * - This function will not return, it will do while(1) to wait the Core reset happened + */ +__STATIC_FORCEINLINE void SysTimer_SoftwareReset(void) +{ + SysTimer->MSFTRST = SysTimer_MSFRST_KEY; + while(1); +} + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) && defined(__ECLIC_PRESENT) && (__ECLIC_PRESENT == 1) +/** + * \brief System Tick Configuration + * \details Initializes the System Timer and its non-vector interrupt, and starts the System Tick Timer. + * + * In our default implementation, the timer counter will be set to zero, and it will start a timer compare non-vector interrupt + * when it matchs the ticks user set, during the timer interrupt user should reload the system tick using \ref SysTick_Reload function + * or similar function written by user, so it can produce period timer interrupt. + * \param [in] ticks Number of ticks between two interrupts. + * \return 0 Function succeeded. + * \return 1 Function failed. + * \remarks + * - For \ref __NUCLEI_N_REV >= 0x0104, the CMPCLREN bit in MTIMECTL is introduced, + * but we assume that the CMPCLREN bit is set to 0, so MTIMER register will not be + * auto cleared to 0 when MTIMER >= MTIMERCMP. + * - When the variable \ref __Vendor_SysTickConfig is set to 1, then the + * function \ref SysTick_Config is not included. + * - In this case, the file .h must contain a vendor-specific implementation + * of this function. + * - If user need this function to start a period timer interrupt, then in timer interrupt handler + * routine code, user should call \ref SysTick_Reload with ticks to reload the timer. + * - This function only available when __SYSTIMER_PRESENT == 1 and __ECLIC_PRESENT == 1 and __Vendor_SysTickConfig == 0 + * \sa + * - \ref SysTimer_SetCompareValue; SysTimer_SetLoadValue + */ +__STATIC_INLINE uint32_t SysTick_Config(uint64_t ticks) +{ + SysTimer_SetLoadValue(0); + SysTimer_SetCompareValue(ticks); + ECLIC_SetShvIRQ(SysTimer_IRQn, ECLIC_NON_VECTOR_INTERRUPT); + ECLIC_SetLevelIRQ(SysTimer_IRQn, 0); + ECLIC_EnableIRQ(SysTimer_IRQn); + return (0UL); +} + +/** + * \brief System Tick Reload + * \details Reload the System Timer Tick when the MTIMECMP reached TIME value + * + * \param [in] ticks Number of ticks between two interrupts. + * \return 0 Function succeeded. + * \return 1 Function failed. + * \remarks + * - For \ref __NUCLEI_N_REV >= 0x0104, the CMPCLREN bit in MTIMECTL is introduced, + * but for this \ref SysTick_Config function, we assume this CMPCLREN bit is set to 0, + * so in interrupt handler function, user still need to set the MTIMERCMP or MTIMER to reload + * the system tick, if vendor want to use this timer's auto clear feature, they can define + * \ref __Vendor_SysTickConfig to 1, and implement \ref SysTick_Config and \ref SysTick_Reload functions. + * - When the variable \ref __Vendor_SysTickConfig is set to 1, then the + * function \ref SysTick_Reload is not included. + * - In this case, the file .h must contain a vendor-specific implementation + * of this function. + * - This function only available when __SYSTIMER_PRESENT == 1 and __ECLIC_PRESENT == 1 and __Vendor_SysTickConfig == 0 + * - Since the MTIMERCMP value might overflow, if overflowed, MTIMER will be set to 0, and MTIMERCMP set to ticks + * \sa + * - \ref SysTimer_SetCompareValue + * - \ref SysTimer_SetLoadValue + */ +__STATIC_FORCEINLINE uint32_t SysTick_Reload(uint64_t ticks) +{ + uint64_t cur_ticks = SysTimer->MTIMER; + uint64_t reload_ticks = ticks + cur_ticks; + + if (__USUALLY(reload_ticks > cur_ticks)) { + SysTimer->MTIMERCMP = reload_ticks; + } else { + /* When added the ticks value, then the MTIMERCMP < TIMER, + * which means the MTIMERCMP is overflowed, + * so we need to reset the counter to zero */ + SysTimer->MTIMER = 0; + SysTimer->MTIMERCMP = ticks; + } + + return (0UL); +} + +#endif /* defined(__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) */ +/** @} */ /* End of Doxygen Group NMSIS_Core_SysTimer */ + +#endif /* defined(__SYSTIMER_PRESENT) && (__SYSTIMER_PRESENT == 1) */ + +#ifdef __cplusplus +} +#endif +#endif /** __CORE_FEATURE_TIMER_H__ */ + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103.h new file mode 100755 index 000000000..96be0bb03 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103.h @@ -0,0 +1,445 @@ +/****************************************************************************** + * @file gd32vf103.h + * @brief NMSIS Core Peripheral Access Layer Header File for GD32VF103 series + * + * @version V1.00 + * @date 4. Jan 2020 + ******************************************************************************/ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __GD32VF103_H__ +#define __GD32VF103_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup gd32 + * @{ + */ + + +/** @addtogroup gd32vf103 + * @{ + */ + + +/** @addtogroup Configuration_of_NMSIS + * @{ + */ + +/** \brief SoC Download mode definition */ +typedef enum { + DOWNLOAD_MODE_FLASHXIP = 0, /*!< Flashxip download mode */ + DOWNLOAD_MODE_FLASH = 1, /*!< Flash download mode */ + DOWNLOAD_MODE_ILM = 2, /*!< ilm download mode */ + DOWNLOAD_MODE_DDR = 3, /*!< ddr download mode */ + DOWNLOAD_MODE_MAX, +} DownloadMode_Type; + +/* =========================================================================================================================== */ +/* ================ Interrupt Number Definition ================ */ +/* =========================================================================================================================== */ + +typedef enum IRQn { + /* ======================================= Nuclei Core Specific Interrupt Numbers ======================================== */ + + Reserved0_IRQn = 0, /*!< Internal reserved */ + Reserved1_IRQn = 1, /*!< Internal reserved */ + Reserved2_IRQn = 2, /*!< Internal reserved */ + SysTimerSW_IRQn = 3, /*!< System Timer SW interrupt */ + Reserved3_IRQn = 4, /*!< Internal reserved */ + Reserved4_IRQn = 5, /*!< Internal reserved */ + Reserved5_IRQn = 6, /*!< Internal reserved */ + SysTimer_IRQn = 7, /*!< System Timer Interrupt */ + Reserved6_IRQn = 8, /*!< Internal reserved */ + Reserved7_IRQn = 9, /*!< Internal reserved */ + Reserved8_IRQn = 10, /*!< Internal reserved */ + Reserved9_IRQn = 11, /*!< Internal reserved */ + Reserved10_IRQn = 12, /*!< Internal reserved */ + Reserved11_IRQn = 13, /*!< Internal reserved */ + Reserved12_IRQn = 14, /*!< Internal reserved */ + Reserved13_IRQn = 15, /*!< Internal reserved */ + Reserved14_IRQn = 16, /*!< Internal reserved */ + BusError_IRQn = 17, /*!< Bus Error interrupt */ + PerfMon_IRQn = 18, /*!< Performance Monitor */ + + /* =========================================== GD32VF103 Specific Interrupt Numbers ========================================= */ + /* ToDo: add here your device specific external interrupt numbers. 19~1023 is reserved number for user. Maxmum interrupt supported + could get from clicinfo.NUM_INTERRUPT. According the interrupt handlers defined in startup_Device.s + eg.: Interrupt for Timer#1 TIM1_IRQHandler -> TIM1_IRQn */ + /* interruput numbers */ + WWDGT_IRQn = 19, /*!< window watchDog timer interrupt */ + LVD_IRQn = 20, /*!< LVD through EXTI line detect interrupt */ + TAMPER_IRQn = 21, /*!< tamper through EXTI line detect */ + RTC_IRQn = 22, /*!< RTC alarm interrupt */ + FMC_IRQn = 23, /*!< FMC interrupt */ + RCU_CTC_IRQn = 24, /*!< RCU and CTC interrupt */ + EXTI0_IRQn = 25, /*!< EXTI line 0 interrupts */ + EXTI1_IRQn = 26, /*!< EXTI line 1 interrupts */ + EXTI2_IRQn = 27, /*!< EXTI line 2 interrupts */ + EXTI3_IRQn = 28, /*!< EXTI line 3 interrupts */ + EXTI4_IRQn = 29, /*!< EXTI line 4 interrupts */ + DMA0_Channel0_IRQn = 30, /*!< DMA0 channel0 interrupt */ + DMA0_Channel1_IRQn = 31, /*!< DMA0 channel1 interrupt */ + DMA0_Channel2_IRQn = 32, /*!< DMA0 channel2 interrupt */ + DMA0_Channel3_IRQn = 33, /*!< DMA0 channel3 interrupt */ + DMA0_Channel4_IRQn = 34, /*!< DMA0 channel4 interrupt */ + DMA0_Channel5_IRQn = 35, /*!< DMA0 channel5 interrupt */ + DMA0_Channel6_IRQn = 36, /*!< DMA0 channel6 interrupt */ + ADC0_1_IRQn = 37, /*!< ADC0 and ADC1 interrupt */ + CAN0_TX_IRQn = 38, /*!< CAN0 TX interrupts */ + CAN0_RX0_IRQn = 39, /*!< CAN0 RX0 interrupts */ + CAN0_RX1_IRQn = 40, /*!< CAN0 RX1 interrupts */ + CAN0_EWMC_IRQn = 41, /*!< CAN0 EWMC interrupts */ + EXTI5_9_IRQn = 42, /*!< EXTI[9:5] interrupts */ + TIMER0_BRK_IRQn = 43, /*!< TIMER0 break interrupts */ + TIMER0_UP_IRQn = 44, /*!< TIMER0 update interrupts */ + TIMER0_TRG_CMT_IRQn = 45, /*!< TIMER0 trigger and commutation interrupts */ + TIMER0_Channel_IRQn = 46, /*!< TIMER0 channel capture compare interrupts */ + TIMER1_IRQn = 47, /*!< TIMER1 interrupt */ + TIMER2_IRQn = 48, /*!< TIMER2 interrupt */ + TIMER3_IRQn = 49, /*!< TIMER3 interrupts */ + I2C0_EV_IRQn = 50, /*!< I2C0 event interrupt */ + I2C0_ER_IRQn = 51, /*!< I2C0 error interrupt */ + I2C1_EV_IRQn = 52, /*!< I2C1 event interrupt */ + I2C1_ER_IRQn = 53, /*!< I2C1 error interrupt */ + SPI0_IRQn = 54, /*!< SPI0 interrupt */ + SPI1_IRQn = 55, /*!< SPI1 interrupt */ + USART0_IRQn = 56, /*!< USART0 interrupt */ + USART1_IRQn = 57, /*!< USART1 interrupt */ + USART2_IRQn = 58, /*!< USART2 interrupt */ + EXTI10_15_IRQn = 59, /*!< EXTI[15:10] interrupts */ + RTC_ALARM_IRQn = 60, /*!< RTC alarm interrupt EXTI */ + USBFS_WKUP_IRQn = 61, /*!< USBFS wakeup interrupt */ + + EXMC_IRQn = 67, /*!< EXMC global interrupt */ + + TIMER4_IRQn = 69, /*!< TIMER4 global interrupt */ + SPI2_IRQn = 70, /*!< SPI2 global interrupt */ + UART3_IRQn = 71, /*!< UART3 global interrupt */ + UART4_IRQn = 72, /*!< UART4 global interrupt */ + TIMER5_IRQn = 73, /*!< TIMER5 global interrupt */ + TIMER6_IRQn = 74, /*!< TIMER6 global interrupt */ + DMA1_Channel0_IRQn = 75, /*!< DMA1 channel0 global interrupt */ + DMA1_Channel1_IRQn = 76, /*!< DMA1 channel1 global interrupt */ + DMA1_Channel2_IRQn = 77, /*!< DMA1 channel2 global interrupt */ + DMA1_Channel3_IRQn = 78, /*!< DMA1 channel3 global interrupt */ + DMA1_Channel4_IRQn = 79, /*!< DMA1 channel3 global interrupt */ + + CAN1_TX_IRQn = 82, /*!< CAN1 TX interrupt */ + CAN1_RX0_IRQn = 83, /*!< CAN1 RX0 interrupt */ + CAN1_RX1_IRQn = 84, /*!< CAN1 RX1 interrupt */ + CAN1_EWMC_IRQn = 85, /*!< CAN1 EWMC interrupt */ + USBFS_IRQn = 86, /*!< USBFS global interrupt */ + + SOC_INT_MAX, + +} IRQn_Type; + +/* =========================================================================================================================== */ +/* ================ Exception Code Definition ================ */ +/* =========================================================================================================================== */ + +typedef enum EXCn { + /* ======================================= Nuclei N/NX Specific Exception Code ======================================== */ + InsUnalign_EXCn = 0, /*!< Instruction address misaligned */ + InsAccFault_EXCn = 1, /*!< Instruction access fault */ + IlleIns_EXCn = 2, /*!< Illegal instruction */ + Break_EXCn = 3, /*!< Beakpoint */ + LdAddrUnalign_EXCn = 4, /*!< Load address misaligned */ + LdFault_EXCn = 5, /*!< Load access fault */ + StAddrUnalign_EXCn = 6, /*!< Store or AMO address misaligned */ + StAccessFault_EXCn = 7, /*!< Store or AMO access fault */ + UmodeEcall_EXCn = 8, /*!< Environment call from User mode */ + MmodeEcall_EXCn = 11, /*!< Environment call from Machine mode */ + NMI_EXCn = 0xfff, /*!< NMI interrupt*/ +} EXCn_Type; + +/* =========================================================================================================================== */ +/* ================ Processor and Core Peripheral Section ================ */ +/* =========================================================================================================================== */ + +/* ToDo: set the defines according your Device */ +/* ToDo: define the correct core revision */ +#define __NUCLEI_N_REV 0x0100 /*!< Core Revision r1p0 */ + +/* ToDo: define the correct core features for the nuclei_soc */ +#define __ECLIC_PRESENT 1 /*!< Set to 1 if ECLIC is present */ +#define __ECLIC_BASEADDR 0xD2000000UL /*!< Set to ECLIC baseaddr of your device */ + +#define __ECLIC_INTCTLBITS 4 /*!< Set to 1 - 8, the number of hardware bits are actually implemented in the clicintctl registers. */ +#define __ECLIC_INTNUM 86 /*!< Set to 1 - 1005, the external interrupt number of ECLIC Unit */ +#define __SYSTIMER_PRESENT 1 /*!< Set to 1 if System Timer is present */ +#define __SYSTIMER_BASEADDR 0xD1000000UL /*!< Set to SysTimer baseaddr of your device */ + +/*!< Set to 0, 1, or 2, 0 not present, 1 single floating point unit present, 2 double floating point unit present */ +#define __FPU_PRESENT 0 + +#define __DSP_PRESENT 0 /*!< Set to 1 if DSP is present */ +#define __PMP_PRESENT 1 /*!< Set to 1 if PMP is present */ +#define __PMP_ENTRY_NUM 8 /*!< Set to 8 or 16, the number of PMP entries */ +#define __ICACHE_PRESENT 0 /*!< Set to 1 if I-Cache is present */ +#define __DCACHE_PRESENT 0 /*!< Set to 1 if D-Cache is present */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __Vendor_EXCEPTION 0 /*!< Set to 1 if vendor exception hander is present */ + +/** @} */ /* End of group Configuration_of_CMSIS */ + + + +// #include /*!< Nuclei N/NX class processor and core peripherals */ +/* ToDo: include your system_nuclei_soc.h file + replace 'Device' with your device name */ +#include "system_gd32vf103.h" /*!< gd32vf103 System */ + + +/* ======================================== Start of section using anonymous unions ======================================== */ +#if defined (__GNUC__) +/* anonymous unions are enabled by default */ +#else +#warning Not supported compiler type +#endif + + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + + +#define RTC_FREQ LXTAL_VALUE +// The TIMER frequency is just the RTC frequency +#define SOC_TIMER_FREQ ((uint32_t)SystemCoreClock/4) //LXTAL_VALUE units HZ + +#define SYSTICK_TICK_CONST (SOC_TIMER_FREQ / TICK_PER_SECOND) + + +/* enum definitions */ +typedef enum { + DISABLE = 0, + ENABLE = !DISABLE +} EventStatus, ControlStatus; + +typedef enum { + FALSE = 0, + TRUE = !FALSE +} BOOL; + +typedef enum { + RESET = 0, + SET = 1, + MAX = 0X7FFFFFFF +} FlagStatus; + +typedef enum { + ERR = 0, + SUCCESS = !ERR +} ErrStatus; + +/* =========================================================================================================================== */ +/* ================ Device Specific Peripheral Section ================ */ +/* =========================================================================================================================== */ + + +/** @addtogroup Device_Peripheral_peripherals + * @{ + */ + +/**************************************************************************** + * Platform definitions + *****************************************************************************/ + + + + + +/* ToDo: add here your device specific peripheral access structure typedefs + following is an example for Systick Timer*/ + +/* =========================================================================================================================== */ +/* ================ SysTick Timer ================ */ +/* =========================================================================================================================== */ + +/*@}*/ /* end of group nuclei_soc_Peripherals */ + + +/* ========================================= End of section using anonymous unions ========================================= */ +#if defined (__GNUC__) +/* anonymous unions are enabled by default */ +#else +#warning Not supported compiler type +#endif + + +/* =========================================================================================================================== */ +/* ================ Device Specific Peripheral Address Map ================ */ +/* =========================================================================================================================== */ + + +/* ToDo: add here your device peripherals base addresses + following is an example for timer */ +/** @addtogroup Device_Peripheral_peripheralAddr + * @{ + */ +/* main flash and SRAM memory map */ +#define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */ +#define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM0 base address */ +#define OB_BASE ((uint32_t)0x1FFFF800U) /*!< OB base address */ +#define DBG_BASE ((uint32_t)0xE0042000U) /*!< DBG base address */ +#define EXMC_BASE ((uint32_t)0xA0000000U) /*!< EXMC register base address */ + +/* peripheral memory map */ +#define APB1_BUS_BASE ((uint32_t)0x40000000U) /*!< apb1 base address */ +#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */ +#define AHB1_BUS_BASE ((uint32_t)0x40018000U) /*!< ahb1 base address */ +#define AHB3_BUS_BASE ((uint32_t)0x60000000U) /*!< ahb3 base address */ + +/* advanced peripheral bus 1 memory map */ +#define TIMER_BASE (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address */ +#define RTC_BASE (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address */ +#define WWDGT_BASE (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address */ +#define FWDGT_BASE (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address */ +#define SPI_BASE (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address */ +#define USART_BASE (APB1_BUS_BASE + 0x00004400U) /*!< USART base address */ +#define I2C_BASE (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address */ +#define CAN_BASE (APB1_BUS_BASE + 0x00006400U) /*!< CAN base address */ +#define BKP_BASE (APB1_BUS_BASE + 0x00006C00U) /*!< BKP base address */ +#define PMU_BASE (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address */ +#define DAC_BASE (APB1_BUS_BASE + 0x00007400U) /*!< DAC base address */ + +/* advanced peripheral bus 2 memory map */ +#define AFIO_BASE (APB2_BUS_BASE + 0x00000000U) /*!< AFIO base address */ +#define EXTI_BASE (APB2_BUS_BASE + 0x00000400U) /*!< EXTI base address */ +#define GPIO_BASE (APB2_BUS_BASE + 0x00000800U) /*!< GPIO base address */ +#define ADC_BASE (APB2_BUS_BASE + 0x00002400U) /*!< ADC base address */ + +/* advanced high performance bus 1 memory map */ +#define DMA_BASE (AHB1_BUS_BASE + 0x00008000U) /*!< DMA base address */ +#define RCU_BASE (AHB1_BUS_BASE + 0x00009000U) /*!< RCU base address */ +#define FMC_BASE (AHB1_BUS_BASE + 0x0000A000U) /*!< FMC base address */ +#define CRC_BASE (AHB1_BUS_BASE + 0x0000B000U) /*!< CRC base address */ +#define USBFS_BASE (AHB1_BUS_BASE + 0x0FFE8000U) /*!< USBFS base address */ + + +/** @} */ /* End of group Device_Peripheral_peripheralAddr */ + + +/* =========================================================================================================================== */ +/* ================ Peripheral declaration ================ */ +/* =========================================================================================================================== */ + +/* Macros for memory access operations */ +#define _REG8P(p, i) ((volatile uint8_t *) ((uintptr_t)((p) + (i)))) +#define _REG16P(p, i) ((volatile uint16_t *) ((uintptr_t)((p) + (i)))) +#define _REG32P(p, i) ((volatile uint32_t *) ((uintptr_t)((p) + (i)))) +#define _REG64P(p, i) ((volatile uint64_t *) ((uintptr_t)((p) + (i)))) +#define _REG8(p, i) (*(_REG8P(p, i))) +#define _REG16(p, i) (*(_REG16P(p, i))) +#define _REG32(p, i) (*(_REG32P(p, i))) +#define _REG64(p, i) (*(_REG64P(p, i))) +#define REG8(addr) _REG8((addr), 0) +#define REG16(addr) _REG16((addr), 0) +#define REG32(addr) _REG32((addr), 0) +#define REG64(addr) _REG64((addr), 0) + +/* Macros for address type convert and access operations */ +#define ADDR16(addr) ((uint16_t)(uintptr_t)(addr)) +#define ADDR32(addr) ((uint32_t)(uintptr_t)(addr)) +#define ADDR64(addr) ((uint64_t)(uintptr_t)(addr)) +#define ADDR8P(addr) ((uint8_t *)(uintptr_t)(addr)) +#define ADDR16P(addr) ((uint16_t *)(uintptr_t)(addr)) +#define ADDR32P(addr) ((uint32_t *)(uintptr_t)(addr)) +#define ADDR64P(addr) ((uint64_t *)(uintptr_t)(addr)) + +/* Macros for Bit Operations */ +#if __riscv_xlen == 32 +#define BITMASK_MAX 0xFFFFFFFFUL +#define BITOFS_MAX 31 +#else +#define BITMASK_MAX 0xFFFFFFFFFFFFFFFFULL +#define BITOFS_MAX 63 +#endif + +// BIT/BITS only support bit mask for __riscv_xlen +// For RISC-V 32 bit, it support mask 32 bit wide +// For RISC-V 64 bit, it support mask 64 bit wide +#define BIT(ofs) (0x1UL << (ofs)) +#define BITS(start, end) ((BITMASK_MAX) << (start) & (BITMASK_MAX) >> (BITOFS_MAX - (end))) +#define GET_BIT(regval, bitofs) (((regval) >> (bitofs)) & 0x1) +#define SET_BIT(regval, bitofs) ((regval) |= BIT(bitofs)) +#define CLR_BIT(regval, bitofs) ((regval) &= (~BIT(bitofs))) +#define FLIP_BIT(regval, bitofs) ((regval) ^= BIT(bitofs)) +#define WRITE_BIT(regval, bitofs, val) CLR_BIT(regval, bitofs); ((regval) |= ((val) << bitofs) & BIT(bitofs)) +#define CHECK_BIT(regval, bitofs) (!!((regval) & (0x1UL<<(bitofs)))) +#define GET_BITS(regval, start, end) (((regval) & BITS((start), (end))) >> (start)) +#define SET_BITS(regval, start, end) ((regval) |= BITS((start), (end))) +#define CLR_BITS(regval, start, end) ((regval) &= (~BITS((start), (end)))) +#define FLIP_BITS(regval, start, end) ((regval) ^= BITS((start), (end))) +#define WRITE_BITS(regval, start, end, val) CLR_BITS(regval, start, end); ((regval) |= ((val) << start) & BITS((start), (end))) +#define CHECK_BITS_ALL(regval, start, end) (!((~(regval)) & BITS((start), (end)))) +#define CHECK_BITS_ANY(regval, start, end) ((regval) & BITS((start), (end))) + +#define BITMASK_SET(regval, mask) ((regval) |= (mask)) +#define BITMASK_CLR(regval, mask) ((regval) &= (~(mask))) +#define BITMASK_FLIP(regval, mask) ((regval) ^= (mask)) +#define BITMASK_CHECK_ALL(regval, mask) (!((~(regval)) & (mask))) +#define BITMASK_CHECK_ANY(regval, mask) ((regval) & (mask)) + +/* ToDo: add here your device peripherals pointer definitions + following is an example for timer */ +/** @addtogroup Device_Peripheral_declaration + * @{ + */ + +// Interrupt Numbers +#define SOC_ECLIC_NUM_INTERRUPTS 86 +#define SOC_ECLIC_INT_GPIO_BASE 19 + + +// Interrupt Handler Definitions +#define SOC_MTIMER_HANDLER eclic_mtip_handler +#define SOC_SOFTINT_HANDLER eclic_msip_handler + +#define NUM_GPIO 32 + +extern uint32_t get_cpu_freq(void); + +/** + * \brief delay a time in milliseconds + * \param[in] count: count in milliseconds + * \param[out] none + * \retval none + */ +extern void delay_1ms(uint32_t count); + + +/** @} */ /* End of group gd32vf103_soc */ + +/** @} */ /* End of group gd32vf103 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __GD32VF103_SOC_H__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_gpio.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_gpio.h new file mode 100755 index 000000000..3b03a62d8 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_gpio.h @@ -0,0 +1,423 @@ +/*! + \file gd32vf103_gpio.h + \brief definitions for the GPIO + + \version 2019-06-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_GPIO_H +#define GD32VF103_GPIO_H + +#include "gd32vf103.h" +#include "gd32vf103_rcu.h" +// #include "gd32vf103_dbg.h" + +/* GPIOx(x=A,B,C,D,E) definitions */ +#define GPIOA (GPIO_BASE + 0x00000000U) +#define GPIOB (GPIO_BASE + 0x00000400U) +#define GPIOC (GPIO_BASE + 0x00000800U) +#define GPIOD (GPIO_BASE + 0x00000C00U) +#define GPIOE (GPIO_BASE + 0x00001000U) + +/* AFIO definitions */ +#define AFIO AFIO_BASE + +/* registers definitions */ + +/* GPIO registers definitions */ +#define GPIO_CTL0(gpiox) REG32((gpiox) + 0x00U) /*!< GPIO port control register 0 */ +#define GPIO_CTL1(gpiox) REG32((gpiox) + 0x04U) /*!< GPIO port control register 1 */ +#define GPIO_ISTAT(gpiox) REG32((gpiox) + 0x08U) /*!< GPIO port input status register */ +#define GPIO_OCTL(gpiox) REG32((gpiox) + 0x0CU) /*!< GPIO port output control register */ +#define GPIO_BOP(gpiox) REG32((gpiox) + 0x10U) /*!< GPIO port bit operation register */ +#define GPIO_BC(gpiox) REG32((gpiox) + 0x14U) /*!< GPIO bit clear register */ +#define GPIO_LOCK(gpiox) REG32((gpiox) + 0x18U) /*!< GPIO port configuration lock register */ + +/* AFIO registers definitions */ +#define AFIO_EC REG32(AFIO + 0x00U) /*!< AFIO event control register */ +#define AFIO_PCF0 REG32(AFIO + 0x04U) /*!< AFIO port configuration register 0 */ +#define AFIO_EXTISS0 REG32(AFIO + 0x08U) /*!< AFIO port EXTI sources selection register 0 */ +#define AFIO_EXTISS1 REG32(AFIO + 0x0CU) /*!< AFIO port EXTI sources selection register 1 */ +#define AFIO_EXTISS2 REG32(AFIO + 0x10U) /*!< AFIO port EXTI sources selection register 2 */ +#define AFIO_EXTISS3 REG32(AFIO + 0x14U) /*!< AFIO port EXTI sources selection register 3 */ +#define AFIO_PCF1 REG32(AFIO + 0x1CU) /*!< AFIO port configuration register 1 */ + +/* bits definitions */ +/* GPIO_CTL0 */ +#define GPIO_CTL0_MD0 BITS(0, 1) /*!< port 0 mode bits */ +#define GPIO_CTL0_CTL0 BITS(2, 3) /*!< pin 0 configuration bits */ +#define GPIO_CTL0_MD1 BITS(4, 5) /*!< port 1 mode bits */ +#define GPIO_CTL0_CTL1 BITS(6, 7) /*!< pin 1 configuration bits */ +#define GPIO_CTL0_MD2 BITS(8, 9) /*!< port 2 mode bits */ +#define GPIO_CTL0_CTL2 BITS(10, 11) /*!< pin 2 configuration bits */ +#define GPIO_CTL0_MD3 BITS(12, 13) /*!< port 3 mode bits */ +#define GPIO_CTL0_CTL3 BITS(14, 15) /*!< pin 3 configuration bits */ +#define GPIO_CTL0_MD4 BITS(16, 17) /*!< port 4 mode bits */ +#define GPIO_CTL0_CTL4 BITS(18, 19) /*!< pin 4 configuration bits */ +#define GPIO_CTL0_MD5 BITS(20, 21) /*!< port 5 mode bits */ +#define GPIO_CTL0_CTL5 BITS(22, 23) /*!< pin 5 configuration bits */ +#define GPIO_CTL0_MD6 BITS(24, 25) /*!< port 6 mode bits */ +#define GPIO_CTL0_CTL6 BITS(26, 27) /*!< pin 6 configuration bits */ +#define GPIO_CTL0_MD7 BITS(28, 29) /*!< port 7 mode bits */ +#define GPIO_CTL0_CTL7 BITS(30, 31) /*!< pin 7 configuration bits */ + +/* GPIO_CTL1 */ +#define GPIO_CTL1_MD8 BITS(0, 1) /*!< port 8 mode bits */ +#define GPIO_CTL1_CTL8 BITS(2, 3) /*!< pin 8 configuration bits */ +#define GPIO_CTL1_MD9 BITS(4, 5) /*!< port 9 mode bits */ +#define GPIO_CTL1_CTL9 BITS(6, 7) /*!< pin 9 configuration bits */ +#define GPIO_CTL1_MD10 BITS(8, 9) /*!< port 10 mode bits */ +#define GPIO_CTL1_CTL10 BITS(10, 11) /*!< pin 10 configuration bits */ +#define GPIO_CTL1_MD11 BITS(12, 13) /*!< port 11 mode bits */ +#define GPIO_CTL1_CTL11 BITS(14, 15) /*!< pin 11 configuration bits */ +#define GPIO_CTL1_MD12 BITS(16, 17) /*!< port 12 mode bits */ +#define GPIO_CTL1_CTL12 BITS(18, 19) /*!< pin 12 configuration bits */ +#define GPIO_CTL1_MD13 BITS(20, 21) /*!< port 13 mode bits */ +#define GPIO_CTL1_CTL13 BITS(22, 23) /*!< pin 13 configuration bits */ +#define GPIO_CTL1_MD14 BITS(24, 25) /*!< port 14 mode bits */ +#define GPIO_CTL1_CTL14 BITS(26, 27) /*!< pin 14 configuration bits */ +#define GPIO_CTL1_MD15 BITS(28, 29) /*!< port 15 mode bits */ +#define GPIO_CTL1_CTL15 BITS(30, 31) /*!< pin 15 configuration bits */ + +/* GPIO_ISTAT */ +#define GPIO_ISTAT_ISTAT0 BIT(0) /*!< pin 0 input status */ +#define GPIO_ISTAT_ISTAT1 BIT(1) /*!< pin 1 input status */ +#define GPIO_ISTAT_ISTAT2 BIT(2) /*!< pin 2 input status */ +#define GPIO_ISTAT_ISTAT3 BIT(3) /*!< pin 3 input status */ +#define GPIO_ISTAT_ISTAT4 BIT(4) /*!< pin 4 input status */ +#define GPIO_ISTAT_ISTAT5 BIT(5) /*!< pin 5 input status */ +#define GPIO_ISTAT_ISTAT6 BIT(6) /*!< pin 6 input status */ +#define GPIO_ISTAT_ISTAT7 BIT(7) /*!< pin 7 input status */ +#define GPIO_ISTAT_ISTAT8 BIT(8) /*!< pin 8 input status */ +#define GPIO_ISTAT_ISTAT9 BIT(9) /*!< pin 9 input status */ +#define GPIO_ISTAT_ISTAT10 BIT(10) /*!< pin 10 input status */ +#define GPIO_ISTAT_ISTAT11 BIT(11) /*!< pin 11 input status */ +#define GPIO_ISTAT_ISTAT12 BIT(12) /*!< pin 12 input status */ +#define GPIO_ISTAT_ISTAT13 BIT(13) /*!< pin 13 input status */ +#define GPIO_ISTAT_ISTAT14 BIT(14) /*!< pin 14 input status */ +#define GPIO_ISTAT_ISTAT15 BIT(15) /*!< pin 15 input status */ + +/* GPIO_OCTL */ +#define GPIO_OCTL_OCTL0 BIT(0) /*!< pin 0 output bit */ +#define GPIO_OCTL_OCTL1 BIT(1) /*!< pin 1 output bit */ +#define GPIO_OCTL_OCTL2 BIT(2) /*!< pin 2 output bit */ +#define GPIO_OCTL_OCTL3 BIT(3) /*!< pin 3 output bit */ +#define GPIO_OCTL_OCTL4 BIT(4) /*!< pin 4 output bit */ +#define GPIO_OCTL_OCTL5 BIT(5) /*!< pin 5 output bit */ +#define GPIO_OCTL_OCTL6 BIT(6) /*!< pin 6 output bit */ +#define GPIO_OCTL_OCTL7 BIT(7) /*!< pin 7 output bit */ +#define GPIO_OCTL_OCTL8 BIT(8) /*!< pin 8 output bit */ +#define GPIO_OCTL_OCTL9 BIT(9) /*!< pin 9 output bit */ +#define GPIO_OCTL_OCTL10 BIT(10) /*!< pin 10 output bit */ +#define GPIO_OCTL_OCTL11 BIT(11) /*!< pin 11 output bit */ +#define GPIO_OCTL_OCTL12 BIT(12) /*!< pin 12 output bit */ +#define GPIO_OCTL_OCTL13 BIT(13) /*!< pin 13 output bit */ +#define GPIO_OCTL_OCTL14 BIT(14) /*!< pin 14 output bit */ +#define GPIO_OCTL_OCTL15 BIT(15) /*!< pin 15 output bit */ + +/* GPIO_BOP */ +#define GPIO_BOP_BOP0 BIT(0) /*!< pin 0 set bit */ +#define GPIO_BOP_BOP1 BIT(1) /*!< pin 1 set bit */ +#define GPIO_BOP_BOP2 BIT(2) /*!< pin 2 set bit */ +#define GPIO_BOP_BOP3 BIT(3) /*!< pin 3 set bit */ +#define GPIO_BOP_BOP4 BIT(4) /*!< pin 4 set bit */ +#define GPIO_BOP_BOP5 BIT(5) /*!< pin 5 set bit */ +#define GPIO_BOP_BOP6 BIT(6) /*!< pin 6 set bit */ +#define GPIO_BOP_BOP7 BIT(7) /*!< pin 7 set bit */ +#define GPIO_BOP_BOP8 BIT(8) /*!< pin 8 set bit */ +#define GPIO_BOP_BOP9 BIT(9) /*!< pin 9 set bit */ +#define GPIO_BOP_BOP10 BIT(10) /*!< pin 10 set bit */ +#define GPIO_BOP_BOP11 BIT(11) /*!< pin 11 set bit */ +#define GPIO_BOP_BOP12 BIT(12) /*!< pin 12 set bit */ +#define GPIO_BOP_BOP13 BIT(13) /*!< pin 13 set bit */ +#define GPIO_BOP_BOP14 BIT(14) /*!< pin 14 set bit */ +#define GPIO_BOP_BOP15 BIT(15) /*!< pin 15 set bit */ +#define GPIO_BOP_CR0 BIT(16) /*!< pin 0 clear bit */ +#define GPIO_BOP_CR1 BIT(17) /*!< pin 1 clear bit */ +#define GPIO_BOP_CR2 BIT(18) /*!< pin 2 clear bit */ +#define GPIO_BOP_CR3 BIT(19) /*!< pin 3 clear bit */ +#define GPIO_BOP_CR4 BIT(20) /*!< pin 4 clear bit */ +#define GPIO_BOP_CR5 BIT(21) /*!< pin 5 clear bit */ +#define GPIO_BOP_CR6 BIT(22) /*!< pin 6 clear bit */ +#define GPIO_BOP_CR7 BIT(23) /*!< pin 7 clear bit */ +#define GPIO_BOP_CR8 BIT(24) /*!< pin 8 clear bit */ +#define GPIO_BOP_CR9 BIT(25) /*!< pin 9 clear bit */ +#define GPIO_BOP_CR10 BIT(26) /*!< pin 10 clear bit */ +#define GPIO_BOP_CR11 BIT(27) /*!< pin 11 clear bit */ +#define GPIO_BOP_CR12 BIT(28) /*!< pin 12 clear bit */ +#define GPIO_BOP_CR13 BIT(29) /*!< pin 13 clear bit */ +#define GPIO_BOP_CR14 BIT(30) /*!< pin 14 clear bit */ +#define GPIO_BOP_CR15 BIT(31) /*!< pin 15 clear bit */ + +/* GPIO_BC */ +#define GPIO_BC_CR0 BIT(0) /*!< pin 0 clear bit */ +#define GPIO_BC_CR1 BIT(1) /*!< pin 1 clear bit */ +#define GPIO_BC_CR2 BIT(2) /*!< pin 2 clear bit */ +#define GPIO_BC_CR3 BIT(3) /*!< pin 3 clear bit */ +#define GPIO_BC_CR4 BIT(4) /*!< pin 4 clear bit */ +#define GPIO_BC_CR5 BIT(5) /*!< pin 5 clear bit */ +#define GPIO_BC_CR6 BIT(6) /*!< pin 6 clear bit */ +#define GPIO_BC_CR7 BIT(7) /*!< pin 7 clear bit */ +#define GPIO_BC_CR8 BIT(8) /*!< pin 8 clear bit */ +#define GPIO_BC_CR9 BIT(9) /*!< pin 9 clear bit */ +#define GPIO_BC_CR10 BIT(10) /*!< pin 10 clear bit */ +#define GPIO_BC_CR11 BIT(11) /*!< pin 11 clear bit */ +#define GPIO_BC_CR12 BIT(12) /*!< pin 12 clear bit */ +#define GPIO_BC_CR13 BIT(13) /*!< pin 13 clear bit */ +#define GPIO_BC_CR14 BIT(14) /*!< pin 14 clear bit */ +#define GPIO_BC_CR15 BIT(15) /*!< pin 15 clear bit */ + +/* GPIO_LOCK */ +#define GPIO_LOCK_LK0 BIT(0) /*!< pin 0 lock bit */ +#define GPIO_LOCK_LK1 BIT(1) /*!< pin 1 lock bit */ +#define GPIO_LOCK_LK2 BIT(2) /*!< pin 2 lock bit */ +#define GPIO_LOCK_LK3 BIT(3) /*!< pin 3 lock bit */ +#define GPIO_LOCK_LK4 BIT(4) /*!< pin 4 lock bit */ +#define GPIO_LOCK_LK5 BIT(5) /*!< pin 5 lock bit */ +#define GPIO_LOCK_LK6 BIT(6) /*!< pin 6 lock bit */ +#define GPIO_LOCK_LK7 BIT(7) /*!< pin 7 lock bit */ +#define GPIO_LOCK_LK8 BIT(8) /*!< pin 8 lock bit */ +#define GPIO_LOCK_LK9 BIT(9) /*!< pin 9 lock bit */ +#define GPIO_LOCK_LK10 BIT(10) /*!< pin 10 lock bit */ +#define GPIO_LOCK_LK11 BIT(11) /*!< pin 11 lock bit */ +#define GPIO_LOCK_LK12 BIT(12) /*!< pin 12 lock bit */ +#define GPIO_LOCK_LK13 BIT(13) /*!< pin 13 lock bit */ +#define GPIO_LOCK_LK14 BIT(14) /*!< pin 14 lock bit */ +#define GPIO_LOCK_LK15 BIT(15) /*!< pin 15 lock bit */ +#define GPIO_LOCK_LKK BIT(16) /*!< pin sequence lock key */ + +/* AFIO_EC */ +#define AFIO_EC_PIN BITS(0, 3) /*!< event output pin selection */ +#define AFIO_EC_PORT BITS(4, 6) /*!< event output port selection */ +#define AFIO_EC_EOE BIT(7) /*!< event output enable */ + +/* AFIO_PCF0 */ +#define AFIO_PCF0_SPI0_REMAP BIT(0) /*!< SPI0 remapping */ +#define AFIO_PCF0_I2C0_REMAP BIT(1) /*!< I2C0 remapping */ +#define AFIO_PCF0_USART0_REMAP BIT(2) /*!< USART0 remapping */ +#define AFIO_PCF0_USART1_REMAP BIT(3) /*!< USART1 remapping */ +#define AFIO_PCF0_USART2_REMAP BITS(4, 5) /*!< USART2 remapping */ +#define AFIO_PCF0_TIMER0_REMAP BITS(6, 7) /*!< TIMER0 remapping */ +#define AFIO_PCF0_TIMER1_REMAP BITS(8, 9) /*!< TIMER1 remapping */ +#define AFIO_PCF0_TIMER2_REMAP BITS(10, 11) /*!< TIMER2 remapping */ +#define AFIO_PCF0_TIMER3_REMAP BIT(12) /*!< TIMER3 remapping */ +#define AFIO_PCF0_CAN_REMAP BITS(13, 14) /*!< CAN remapping */ +#define AFIO_PCF0_PD01_REMAP BIT(15) /*!< port D0/port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_PCF0_TIMER4CH3_IREMAP BIT(16) /*!< TIMER3 channel3 internal remapping */ +#define AFIO_PCF0_SWJ_CFG BITS(24, 26) /*!< serial wire JTAG configuration */ +#define AFIO_PCF0_SPI2_REMAP BIT(28) /*!< SPI2/I2S2 remapping */ +#define AFIO_PCF0_TIMER1_ITI1_REMAP BIT(29) /*!< TIMER1 internal trigger 1 remapping */ + +/* AFIO_EXTISS0 */ +#define AFIO_EXTI0_SS BITS(0, 3) /*!< EXTI 0 sources selection */ +#define AFIO_EXTI1_SS BITS(4, 7) /*!< EXTI 1 sources selection */ +#define AFIO_EXTI2_SS BITS(8, 11) /*!< EXTI 2 sources selection */ +#define AFIO_EXTI3_SS BITS(12, 15) /*!< EXTI 3 sources selection */ + +/* AFIO_EXTISS1 */ +#define AFIO_EXTI4_SS BITS(0, 3) /*!< EXTI 4 sources selection */ +#define AFIO_EXTI5_SS BITS(4, 7) /*!< EXTI 5 sources selection */ +#define AFIO_EXTI6_SS BITS(8, 11) /*!< EXTI 6 sources selection */ +#define AFIO_EXTI7_SS BITS(12, 15) /*!< EXTI 7 sources selection */ + +/* AFIO_EXTISS2 */ +#define AFIO_EXTI8_SS BITS(0, 3) /*!< EXTI 8 sources selection */ +#define AFIO_EXTI9_SS BITS(4, 7) /*!< EXTI 9 sources selection */ +#define AFIO_EXTI10_SS BITS(8, 11) /*!< EXTI 10 sources selection */ +#define AFIO_EXTI11_SS BITS(12, 15) /*!< EXTI 11 sources selection */ + +/* AFIO_EXTISS3 */ +#define AFIO_EXTI12_SS BITS(0, 3) /*!< EXTI 12 sources selection */ +#define AFIO_EXTI13_SS BITS(4, 7) /*!< EXTI 13 sources selection */ +#define AFIO_EXTI14_SS BITS(8, 11) /*!< EXTI 14 sources selection */ +#define AFIO_EXTI15_SS BITS(12, 15) /*!< EXTI 15 sources selection */ + +/* AFIO_PCF1 */ +#define AFIO_PCF1_EXMC_NADV BIT(10) /*!< EXMC_NADV connect/disconnect */ + +/* constants definitions */ +typedef FlagStatus bit_status; + +/* GPIO mode values set */ +#define GPIO_MODE_SET(n, mode) ((uint32_t)((uint32_t)(mode) << (4U * (n)))) +#define GPIO_MODE_MASK(n) (0xFU << (4U * (n))) + +/* GPIO mode definitions */ +#define GPIO_MODE_AIN ((uint8_t)0x00U) /*!< analog input mode */ +#define GPIO_MODE_IN_FLOATING ((uint8_t)0x04U) /*!< floating input mode */ +#define GPIO_MODE_IPD ((uint8_t)0x28U) /*!< pull-down input mode */ +#define GPIO_MODE_IPU ((uint8_t)0x48U) /*!< pull-up input mode */ +#define GPIO_MODE_OUT_OD ((uint8_t)0x14U) /*!< GPIO output with open-drain */ +#define GPIO_MODE_OUT_PP ((uint8_t)0x10U) /*!< GPIO output with push-pull */ +#define GPIO_MODE_AF_OD ((uint8_t)0x1CU) /*!< AFIO output with open-drain */ +#define GPIO_MODE_AF_PP ((uint8_t)0x18U) /*!< AFIO output with push-pull */ + +/* GPIO output max speed value */ +#define GPIO_OSPEED_10MHZ ((uint8_t)0x01U) /*!< output max speed 10MHz */ +#define GPIO_OSPEED_2MHZ ((uint8_t)0x02U) /*!< output max speed 2MHz */ +#define GPIO_OSPEED_50MHZ ((uint8_t)0x03U) /*!< output max speed 50MHz */ + +/* GPIO event output port definitions */ +#define GPIO_EVENT_PORT_GPIOA ((uint8_t)0x00U) /*!< event output port A */ +#define GPIO_EVENT_PORT_GPIOB ((uint8_t)0x01U) /*!< event output port B */ +#define GPIO_EVENT_PORT_GPIOC ((uint8_t)0x02U) /*!< event output port C */ +#define GPIO_EVENT_PORT_GPIOD ((uint8_t)0x03U) /*!< event output port D */ +#define GPIO_EVENT_PORT_GPIOE ((uint8_t)0x04U) /*!< event output port E */ + +/* GPIO output port source definitions */ +#define GPIO_PORT_SOURCE_GPIOA ((uint8_t)0x00U) /*!< output port source A */ +#define GPIO_PORT_SOURCE_GPIOB ((uint8_t)0x01U) /*!< output port source B */ +#define GPIO_PORT_SOURCE_GPIOC ((uint8_t)0x02U) /*!< output port source C */ +#define GPIO_PORT_SOURCE_GPIOD ((uint8_t)0x03U) /*!< output port source D */ +#define GPIO_PORT_SOURCE_GPIOE ((uint8_t)0x04U) /*!< output port source E */ + +/* GPIO event output pin definitions */ +#define GPIO_EVENT_PIN_0 ((uint8_t)0x00U) /*!< GPIO event pin 0 */ +#define GPIO_EVENT_PIN_1 ((uint8_t)0x01U) /*!< GPIO event pin 1 */ +#define GPIO_EVENT_PIN_2 ((uint8_t)0x02U) /*!< GPIO event pin 2 */ +#define GPIO_EVENT_PIN_3 ((uint8_t)0x03U) /*!< GPIO event pin 3 */ +#define GPIO_EVENT_PIN_4 ((uint8_t)0x04U) /*!< GPIO event pin 4 */ +#define GPIO_EVENT_PIN_5 ((uint8_t)0x05U) /*!< GPIO event pin 5 */ +#define GPIO_EVENT_PIN_6 ((uint8_t)0x06U) /*!< GPIO event pin 6 */ +#define GPIO_EVENT_PIN_7 ((uint8_t)0x07U) /*!< GPIO event pin 7 */ +#define GPIO_EVENT_PIN_8 ((uint8_t)0x08U) /*!< GPIO event pin 8 */ +#define GPIO_EVENT_PIN_9 ((uint8_t)0x09U) /*!< GPIO event pin 9 */ +#define GPIO_EVENT_PIN_10 ((uint8_t)0x0AU) /*!< GPIO event pin 10 */ +#define GPIO_EVENT_PIN_11 ((uint8_t)0x0BU) /*!< GPIO event pin 11 */ +#define GPIO_EVENT_PIN_12 ((uint8_t)0x0CU) /*!< GPIO event pin 12 */ +#define GPIO_EVENT_PIN_13 ((uint8_t)0x0DU) /*!< GPIO event pin 13 */ +#define GPIO_EVENT_PIN_14 ((uint8_t)0x0EU) /*!< GPIO event pin 14 */ +#define GPIO_EVENT_PIN_15 ((uint8_t)0x0FU) /*!< GPIO event pin 15 */ + +/* GPIO output pin source definitions */ +#define GPIO_PIN_SOURCE_0 ((uint8_t)0x00U) /*!< GPIO pin source 0 */ +#define GPIO_PIN_SOURCE_1 ((uint8_t)0x01U) /*!< GPIO pin source 1 */ +#define GPIO_PIN_SOURCE_2 ((uint8_t)0x02U) /*!< GPIO pin source 2 */ +#define GPIO_PIN_SOURCE_3 ((uint8_t)0x03U) /*!< GPIO pin source 3 */ +#define GPIO_PIN_SOURCE_4 ((uint8_t)0x04U) /*!< GPIO pin source 4 */ +#define GPIO_PIN_SOURCE_5 ((uint8_t)0x05U) /*!< GPIO pin source 5 */ +#define GPIO_PIN_SOURCE_6 ((uint8_t)0x06U) /*!< GPIO pin source 6 */ +#define GPIO_PIN_SOURCE_7 ((uint8_t)0x07U) /*!< GPIO pin source 7 */ +#define GPIO_PIN_SOURCE_8 ((uint8_t)0x08U) /*!< GPIO pin source 8 */ +#define GPIO_PIN_SOURCE_9 ((uint8_t)0x09U) /*!< GPIO pin source 9 */ +#define GPIO_PIN_SOURCE_10 ((uint8_t)0x0AU) /*!< GPIO pin source 10 */ +#define GPIO_PIN_SOURCE_11 ((uint8_t)0x0BU) /*!< GPIO pin source 11 */ +#define GPIO_PIN_SOURCE_12 ((uint8_t)0x0CU) /*!< GPIO pin source 12 */ +#define GPIO_PIN_SOURCE_13 ((uint8_t)0x0DU) /*!< GPIO pin source 13 */ +#define GPIO_PIN_SOURCE_14 ((uint8_t)0x0EU) /*!< GPIO pin source 14 */ +#define GPIO_PIN_SOURCE_15 ((uint8_t)0x0FU) /*!< GPIO pin source 15 */ + +/* GPIO pin definitions */ +#define GPIO_PIN_0 BIT(0) /*!< GPIO pin 0 */ +#define GPIO_PIN_1 BIT(1) /*!< GPIO pin 1 */ +#define GPIO_PIN_2 BIT(2) /*!< GPIO pin 2 */ +#define GPIO_PIN_3 BIT(3) /*!< GPIO pin 3 */ +#define GPIO_PIN_4 BIT(4) /*!< GPIO pin 4 */ +#define GPIO_PIN_5 BIT(5) /*!< GPIO pin 5 */ +#define GPIO_PIN_6 BIT(6) /*!< GPIO pin 6 */ +#define GPIO_PIN_7 BIT(7) /*!< GPIO pin 7 */ +#define GPIO_PIN_8 BIT(8) /*!< GPIO pin 8 */ +#define GPIO_PIN_9 BIT(9) /*!< GPIO pin 9 */ +#define GPIO_PIN_10 BIT(10) /*!< GPIO pin 10 */ +#define GPIO_PIN_11 BIT(11) /*!< GPIO pin 11 */ +#define GPIO_PIN_12 BIT(12) /*!< GPIO pin 12 */ +#define GPIO_PIN_13 BIT(13) /*!< GPIO pin 13 */ +#define GPIO_PIN_14 BIT(14) /*!< GPIO pin 14 */ +#define GPIO_PIN_15 BIT(15) /*!< GPIO pin 15 */ +#define GPIO_PIN_ALL BITS(0, 15) /*!< GPIO pin all */ + +/* GPIO remap definitions */ +#define GPIO_SPI0_REMAP ((uint32_t)0x00000001U) /*!< SPI0 remapping */ +#define GPIO_I2C0_REMAP ((uint32_t)0x00000002U) /*!< I2C0 remapping */ +#define GPIO_USART0_REMAP ((uint32_t)0x00000004U) /*!< USART0 remapping */ +#define GPIO_USART1_REMAP ((uint32_t)0x00000008U) /*!< USART1 remapping */ +#define GPIO_USART2_PARTIAL_REMAP ((uint32_t)0x00140010U) /*!< USART2 partial remapping */ +#define GPIO_USART2_FULL_REMAP ((uint32_t)0x00140030U) /*!< USART2 full remapping */ +#define GPIO_TIMER0_PARTIAL_REMAP ((uint32_t)0x00160040U) /*!< TIMER0 partial remapping */ +#define GPIO_TIMER0_FULL_REMAP ((uint32_t)0x001600C0U) /*!< TIMER0 full remapping */ +#define GPIO_TIMER1_PARTIAL_REMAP0 ((uint32_t)0x00180100U) /*!< TIMER1 partial remapping */ +#define GPIO_TIMER1_PARTIAL_REMAP1 ((uint32_t)0x00180200U) /*!< TIMER1 partial remapping */ +#define GPIO_TIMER1_FULL_REMAP ((uint32_t)0x00180300U) /*!< TIMER1 full remapping */ +#define GPIO_TIMER2_PARTIAL_REMAP ((uint32_t)0x001A0800U) /*!< TIMER2 partial remapping */ +#define GPIO_TIMER2_FULL_REMAP ((uint32_t)0x001A0C00U) /*!< TIMER2 full remapping */ +#define GPIO_TIMER3_REMAP ((uint32_t)0x00001000U) /*!< TIMER3 remapping */ +#define GPIO_CAN0_PARTIAL_REMAP ((uint32_t)0x001D4000U) /*!< CAN0 partial remapping */ +#define GPIO_CAN0_FULL_REMAP ((uint32_t)0x001D6000U) /*!< CAN0 full remapping */ +#define GPIO_PD01_REMAP ((uint32_t)0x00008000U) /*!< PD01 remapping */ +#define GPIO_TIMER4CH3_IREMAP ((uint32_t)0x00200001U) /*!< TIMER4 channel3 internal remapping */ +#define GPIO_CAN1_REMAP ((uint32_t)0x00200040U) /*!< CAN1 remapping */ +#define GPIO_SWJ_NONJTRST_REMAP ((uint32_t)0x00300100U) /*!< JTAG-DP,but without NJTRST */ +#define GPIO_SWJ_DISABLE_REMAP ((uint32_t)0x00300200U) /*!< JTAG-DP disabled */ +#define GPIO_SPI2_REMAP ((uint32_t)0x00201100U) /*!< SPI2 remapping */ +#define GPIO_TIMER1ITI1_REMAP ((uint32_t)0x00202000U) /*!< TIMER1 internal trigger 1 remapping */ +#define GPIO_EXMC_NADV_REMAP ((uint32_t)0x80000400U) /*!< EXMC_NADV connect/disconnect */ + +/* function declarations */ +/* reset GPIO port */ +void gpio_deinit(uint32_t gpio_periph); +/* reset alternate function I/O(AFIO) */ +void gpio_afio_deinit(void); +/* GPIO parameter initialization */ +void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin); + +/* set GPIO pin bit */ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin); +/* reset GPIO pin bit */ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin); +/* write data to the specified GPIO pin */ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value); +/* write data to the specified GPIO port */ +void gpio_port_write(uint32_t gpio_periph, uint16_t data); + +/* get GPIO pin input status */ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port input status */ +uint16_t gpio_input_port_get(uint32_t gpio_periph); +/* get GPIO pin output status */ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port output status */ +uint16_t gpio_output_port_get(uint32_t gpio_periph); + +/* configure GPIO pin remap */ +void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue); + +/* select GPIO pin exti sources */ +void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin); +/* configure GPIO pin event output */ +void gpio_event_output_config(uint8_t output_port, uint8_t output_pin); +/* enable GPIO pin event output */ +void gpio_event_output_enable(void); +/* disable GPIO pin event output */ +void gpio_event_output_disable(void); + +/* lock GPIO pin bit */ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin); + +#endif /* GD32VF103_GPIO_H */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_rcu.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_rcu.h new file mode 100755 index 000000000..4c07ab01d --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_rcu.h @@ -0,0 +1,760 @@ +/*! + \file gd32vf103_rcu.h + \brief definitions for the RCU + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_RCU_H +#define GD32VF103_RCU_H + +#include "gd32vf103.h" + +/* RCU definitions */ +#define RCU RCU_BASE + +/* registers definitions */ + +#define RCU_CTL REG32(RCU + 0x00U) /*!< control register */ +#define RCU_CFG0 REG32(RCU + 0x04U) /*!< clock configuration register 0 */ +#define RCU_INT REG32(RCU + 0x08U) /*!< clock interrupt register */ +#define RCU_APB2RST REG32(RCU + 0x0CU) /*!< APB2 reset register */ +#define RCU_APB1RST REG32(RCU + 0x10U) /*!< APB1 reset register */ +#define RCU_AHBEN REG32(RCU + 0x14U) /*!< AHB1 enable register */ +#define RCU_APB2EN REG32(RCU + 0x18U) /*!< APB2 enable register */ +#define RCU_APB1EN REG32(RCU + 0x1CU) /*!< APB1 enable register */ +#define RCU_BDCTL REG32(RCU + 0x20U) /*!< backup domain control register */ +#define RCU_RSTSCK REG32(RCU + 0x24U) /*!< reset source / clock register */ +#define RCU_AHBRST REG32(RCU + 0x28U) /*!< AHB reset register */ +#define RCU_CFG1 REG32(RCU + 0x2CU) /*!< clock configuration register 1 */ +#define RCU_DSV REG32(RCU + 0x34U) /*!< deep-sleep mode voltage register */ + + +/* bits definitions */ +/* RCU_CTL */ +#define RCU_CTL_IRC8MEN BIT(0) /*!< internal high speed oscillator enable */ +#define RCU_CTL_IRC8MSTB BIT(1) /*!< IRC8M high speed internal oscillator stabilization flag */ +#define RCU_CTL_IRC8MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */ +#define RCU_CTL_IRC8MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */ +#define RCU_CTL_HXTALEN BIT(16) /*!< external high speed oscillator enable */ +#define RCU_CTL_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */ +#define RCU_CTL_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */ +#define RCU_CTL_CKMEN BIT(19) /*!< HXTAL clock monitor enable */ +#define RCU_CTL_PLLEN BIT(24) /*!< PLL enable */ +#define RCU_CTL_PLLSTB BIT(25) /*!< PLL clock stabilization flag */ +#define RCU_CTL_PLL1EN BIT(26) /*!< PLL1 enable */ +#define RCU_CTL_PLL1STB BIT(27) /*!< PLL1 clock stabilization flag */ +#define RCU_CTL_PLL2EN BIT(28) /*!< PLL2 enable */ +#define RCU_CTL_PLL2STB BIT(29) /*!< PLL2 clock stabilization flag */ + + +#define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */ +#define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */ +#define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */ +#define RCU_CFG0_APB1PSC BITS(8,10) /*!< APB1 prescaler selection */ +#define RCU_CFG0_APB2PSC BITS(11,13) /*!< APB2 prescaler selection */ +#define RCU_CFG0_ADCPSC BITS(14,15) /*!< ADC prescaler selection */ +#define RCU_CFG0_PLLSEL BIT(16) /*!< PLL clock source selection */ +#define RCU_CFG0_PREDV0_LSB BIT(17) /*!< the LSB of PREDV0 division factor */ +#define RCU_CFG0_PLLMF BITS(18,21) /*!< PLL clock multiplication factor */ +#define RCU_CFG0_USBFSPSC BITS(22,23) /*!< USBFS clock prescaler selection */ +#define RCU_CFG0_CKOUT0SEL BITS(24,27) /*!< CKOUT0 clock source selection */ +#define RCU_CFG0_ADCPSC_2 BIT(28) /*!< bit 2 of ADCPSC */ +#define RCU_CFG0_PLLMF_4 BIT(29) /*!< bit 4 of PLLMF */ + +/* RCU_INT */ +#define RCU_INT_IRC40KSTBIF BIT(0) /*!< IRC40K stabilization interrupt flag */ +#define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */ +#define RCU_INT_IRC8MSTBIF BIT(2) /*!< IRC8M stabilization interrupt flag */ +#define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */ +#define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */ +#define RCU_INT_PLL1STBIF BIT(5) /*!< PLL1 stabilization interrupt flag */ +#define RCU_INT_PLL2STBIF BIT(6) /*!< PLL2 stabilization interrupt flag */ +#define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */ +#define RCU_INT_IRC40KSTBIE BIT(8) /*!< IRC40K stabilization interrupt enable */ +#define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */ +#define RCU_INT_IRC8MSTBIE BIT(10) /*!< IRC8M stabilization interrupt enable */ +#define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */ +#define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */ +#define RCU_INT_PLL1STBIE BIT(13) /*!< PLL1 stabilization interrupt enable */ +#define RCU_INT_PLL2STBIE BIT(14) /*!< PLL2 stabilization interrupt enable */ +#define RCU_INT_IRC40KSTBIC BIT(16) /*!< IRC40K stabilization interrupt clear */ +#define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL stabilization interrupt clear */ +#define RCU_INT_IRC8MSTBIC BIT(18) /*!< IRC8M stabilization interrupt clear */ +#define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL stabilization interrupt clear */ +#define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization interrupt clear */ +#define RCU_INT_PLL1STBIC BIT(21) /*!< PLL1 stabilization interrupt clear */ +#define RCU_INT_PLL2STBIC BIT(22) /*!< PLL2 stabilization interrupt clear */ +#define RCU_INT_CKMIC BIT(23) /*!< HXTAL clock stuck interrupt clear */ + +/* RCU_APB2RST */ +#define RCU_APB2RST_AFRST BIT(0) /*!< alternate function I/O reset */ +#define RCU_APB2RST_PARST BIT(2) /*!< GPIO port A reset */ +#define RCU_APB2RST_PBRST BIT(3) /*!< GPIO port B reset */ +#define RCU_APB2RST_PCRST BIT(4) /*!< GPIO port C reset */ +#define RCU_APB2RST_PDRST BIT(5) /*!< GPIO port D reset */ +#define RCU_APB2RST_PERST BIT(6) /*!< GPIO port E reset */ +#define RCU_APB2RST_ADC0RST BIT(9) /*!< ADC0 reset */ +#define RCU_APB2RST_ADC1RST BIT(10) /*!< ADC1 reset */ +#define RCU_APB2RST_TIMER0RST BIT(11) /*!< TIMER0 reset */ +#define RCU_APB2RST_SPI0RST BIT(12) /*!< SPI0 reset */ +#define RCU_APB2RST_USART0RST BIT(14) /*!< USART0 reset */ + +/* RCU_APB1RST */ +#define RCU_APB1RST_TIMER1RST BIT(0) /*!< TIMER1 reset */ +#define RCU_APB1RST_TIMER2RST BIT(1) /*!< TIMER2 reset */ +#define RCU_APB1RST_TIMER3RST BIT(2) /*!< TIMER3 reset */ +#define RCU_APB1RST_TIMER4RST BIT(3) /*!< TIMER4 reset */ +#define RCU_APB1RST_TIMER5RST BIT(4) /*!< TIMER5 reset */ +#define RCU_APB1RST_TIMER6RST BIT(5) /*!< TIMER6 reset */ + +#define RCU_APB1RST_WWDGTRST BIT(11) /*!< WWDGT reset */ +#define RCU_APB1RST_SPI1RST BIT(14) /*!< SPI1 reset */ +#define RCU_APB1RST_SPI2RST BIT(15) /*!< SPI2 reset */ +#define RCU_APB1RST_USART1RST BIT(17) /*!< USART1 reset */ +#define RCU_APB1RST_USART2RST BIT(18) /*!< USART2 reset */ +#define RCU_APB1RST_UART3RST BIT(19) /*!< UART3 reset */ +#define RCU_APB1RST_UART4RST BIT(20) /*!< UART4 reset */ +#define RCU_APB1RST_I2C0RST BIT(21) /*!< I2C0 reset */ +#define RCU_APB1RST_I2C1RST BIT(22) /*!< I2C1 reset */ +#define RCU_APB1RST_CAN0RST BIT(25) /*!< CAN0 reset */ +#define RCU_APB1RST_CAN1RST BIT(26) /*!< CAN1 reset */ +#define RCU_APB1RST_BKPIRST BIT(27) /*!< backup interface reset */ +#define RCU_APB1RST_PMURST BIT(28) /*!< PMU reset */ +#define RCU_APB1RST_DACRST BIT(29) /*!< DAC reset */ + +/* RCU_AHBEN */ +#define RCU_AHBEN_DMA0EN BIT(0) /*!< DMA0 clock enable */ +#define RCU_AHBEN_DMA1EN BIT(1) /*!< DMA1 clock enable */ +#define RCU_AHBEN_SRAMSPEN BIT(2) /*!< SRAM clock enable when sleep mode */ +#define RCU_AHBEN_FMCSPEN BIT(4) /*!< FMC clock enable when sleep mode */ +#define RCU_AHBEN_CRCEN BIT(6) /*!< CRC clock enable */ +#define RCU_AHBEN_EXMCEN BIT(8) /*!< EXMC clock enable */ +#define RCU_AHBEN_USBFSEN BIT(12) /*!< USBFS clock enable */ + +/* RCU_APB2EN */ +#define RCU_APB2EN_AFEN BIT(0) /*!< alternate function IO clock enable */ +#define RCU_APB2EN_PAEN BIT(2) /*!< GPIO port A clock enable */ +#define RCU_APB2EN_PBEN BIT(3) /*!< GPIO port B clock enable */ +#define RCU_APB2EN_PCEN BIT(4) /*!< GPIO port C clock enable */ +#define RCU_APB2EN_PDEN BIT(5) /*!< GPIO port D clock enable */ +#define RCU_APB2EN_PEEN BIT(6) /*!< GPIO port E clock enable */ +#define RCU_APB2EN_ADC0EN BIT(9) /*!< ADC0 clock enable */ +#define RCU_APB2EN_ADC1EN BIT(10) /*!< ADC1 clock enable */ +#define RCU_APB2EN_TIMER0EN BIT(11) /*!< TIMER0 clock enable */ +#define RCU_APB2EN_SPI0EN BIT(12) /*!< SPI0 clock enable */ +#define RCU_APB2EN_USART0EN BIT(14) /*!< USART0 clock enable */ + +/* RCU_APB1EN */ +#define RCU_APB1EN_TIMER1EN BIT(0) /*!< TIMER1 clock enable */ +#define RCU_APB1EN_TIMER2EN BIT(1) /*!< TIMER2 clock enable */ +#define RCU_APB1EN_TIMER3EN BIT(2) /*!< TIMER3 clock enable */ +#define RCU_APB1EN_TIMER4EN BIT(3) /*!< TIMER4 clock enable */ +#define RCU_APB1EN_TIMER5EN BIT(4) /*!< TIMER5 clock enable */ +#define RCU_APB1EN_TIMER6EN BIT(5) /*!< TIMER6 clock enable */ +#define RCU_APB1EN_WWDGTEN BIT(11) /*!< WWDGT clock enable */ +#define RCU_APB1EN_SPI1EN BIT(14) /*!< SPI1 clock enable */ +#define RCU_APB1EN_SPI2EN BIT(15) /*!< SPI2 clock enable */ +#define RCU_APB1EN_USART1EN BIT(17) /*!< USART1 clock enable */ +#define RCU_APB1EN_USART2EN BIT(18) /*!< USART2 clock enable */ +#define RCU_APB1EN_UART3EN BIT(19) /*!< UART3 clock enable */ +#define RCU_APB1EN_UART4EN BIT(20) /*!< UART4 clock enable */ +#define RCU_APB1EN_I2C0EN BIT(21) /*!< I2C0 clock enable */ +#define RCU_APB1EN_I2C1EN BIT(22) /*!< I2C1 clock enable */ +#define RCU_APB1EN_CAN0EN BIT(25) /*!< CAN0 clock enable */ +#define RCU_APB1EN_CAN1EN BIT(26) /*!< CAN1 clock enable */ +#define RCU_APB1EN_BKPIEN BIT(27) /*!< backup interface clock enable */ +#define RCU_APB1EN_PMUEN BIT(28) /*!< PMU clock enable */ +#define RCU_APB1EN_DACEN BIT(29) /*!< DAC clock enable */ + +/* RCU_BDCTL */ +#define RCU_BDCTL_LXTALEN BIT(0) /*!< LXTAL enable */ +#define RCU_BDCTL_LXTALSTB BIT(1) /*!< low speed crystal oscillator stabilization flag */ +#define RCU_BDCTL_LXTALBPS BIT(2) /*!< LXTAL bypass mode enable */ +#define RCU_BDCTL_RTCSRC BITS(8,9) /*!< RTC clock entry selection */ +#define RCU_BDCTL_RTCEN BIT(15) /*!< RTC clock enable */ +#define RCU_BDCTL_BKPRST BIT(16) /*!< backup domain reset */ + +/* RCU_RSTSCK */ +#define RCU_RSTSCK_IRC40KEN BIT(0) /*!< IRC40K enable */ +#define RCU_RSTSCK_IRC40KSTB BIT(1) /*!< IRC40K stabilization flag */ +#define RCU_RSTSCK_RSTFC BIT(24) /*!< reset flag clear */ +#define RCU_RSTSCK_EPRSTF BIT(26) /*!< external pin reset flag */ +#define RCU_RSTSCK_PORRSTF BIT(27) /*!< power reset flag */ +#define RCU_RSTSCK_SWRSTF BIT(28) /*!< software reset flag */ +#define RCU_RSTSCK_FWDGTRSTF BIT(29) /*!< free watchdog timer reset flag */ +#define RCU_RSTSCK_WWDGTRSTF BIT(30) /*!< window watchdog timer reset flag */ +#define RCU_RSTSCK_LPRSTF BIT(31) /*!< low-power reset flag */ + +/* RCU_AHBRST */ +#define RCU_AHBRST_USBFSRST BIT(12) /*!< USBFS reset */ + +/* RCU_CFG1 */ +#define RCU_CFG1_PREDV0 BITS(0,3) /*!< PREDV0 division factor */ +#define RCU_CFG1_PREDV1 BITS(4,7) /*!< PREDV1 division factor */ +#define RCU_CFG1_PLL1MF BITS(8,11) /*!< PLL1 clock multiplication factor */ +#define RCU_CFG1_PLL2MF BITS(12,15) /*!< PLL2 clock multiplication factor */ +#define RCU_CFG1_PREDV0SEL BIT(16) /*!< PREDV0 input clock source selection */ +#define RCU_CFG1_I2S1SEL BIT(17) /*!< I2S1 clock source selection */ +#define RCU_CFG1_I2S2SEL BIT(18) /*!< I2S2 clock source selection */ + +/* RCU_DSV */ +#define RCU_DSV_DSLPVS BITS(0,1) /*!< deep-sleep mode voltage select */ + +/* constants definitions */ +/* define value of high speed crystal oscillator (HXTAL) in Hz */ +#if !defined HXTAL_VALUE +#define HXTAL_VALUE ((uint32_t)8000000) /*!< value of the external oscillator in Hz */ +#define HXTAL_VALUE_25M HXTAL_VALUE +#endif /* high speed crystal oscillator value */ + +/* define startup timeout value of high speed crystal oscillator (HXTAL) */ +#if !defined (HXTAL_STARTUP_TIMEOUT) +#define HXTAL_STARTUP_TIMEOUT ((uint16_t)0xFFFF) +#endif /* high speed crystal oscillator startup timeout */ + +/* define value of internal 8MHz RC oscillator (IRC8M) in Hz */ +#if !defined (IRC8M_VALUE) +#define IRC8M_VALUE ((uint32_t)8000000) +#endif /* internal 8MHz RC oscillator value */ + +/* define startup timeout value of internal 8MHz RC oscillator (IRC8M) */ +#if !defined (IRC8M_STARTUP_TIMEOUT) +#define IRC8M_STARTUP_TIMEOUT ((uint16_t)0x0500) +#endif /* internal 8MHz RC oscillator startup timeout */ + +/* define value of internal 40KHz RC oscillator(IRC40K) in Hz */ +#if !defined (IRC40K_VALUE) +#define IRC40K_VALUE ((uint32_t)40000) +#endif /* internal 40KHz RC oscillator value */ + +/* define value of low speed crystal oscillator (LXTAL)in Hz */ +#if !defined (LXTAL_VALUE) +#define LXTAL_VALUE ((uint32_t)32768) +#endif /* low speed crystal oscillator value */ + +/* define clock source */ +#define SEL_IRC8M ((uint16_t)0U) +#define SEL_HXTAL ((uint16_t)1U) +#define SEL_PLL ((uint16_t)2U) + +/* define startup timeout count */ +#define OSC_STARTUP_TIMEOUT ((uint32_t)0xFFFFFU) +#define LXTAL_STARTUP_TIMEOUT ((uint32_t)0x3FFFFFFU) + +/* define the peripheral clock enable bit position and its register index offset */ +#define RCU_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph) >> 6))) +#define RCU_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* register offset */ +/* peripherals enable */ +#define AHBEN_REG_OFFSET 0x14U /*!< AHB enable register offset */ +#define APB1EN_REG_OFFSET 0x1CU /*!< APB1 enable register offset */ +#define APB2EN_REG_OFFSET 0x18U /*!< APB2 enable register offset */ + +/* peripherals reset */ +#define AHBRST_REG_OFFSET 0x28U /*!< AHB reset register offset */ +#define APB1RST_REG_OFFSET 0x10U /*!< APB1 reset register offset */ +#define APB2RST_REG_OFFSET 0x0CU /*!< APB2 reset register offset */ +#define RSTSCK_REG_OFFSET 0x24U /*!< reset source/clock register offset */ + +/* clock control */ +#define CTL_REG_OFFSET 0x00U /*!< control register offset */ +#define BDCTL_REG_OFFSET 0x20U /*!< backup domain control register offset */ + +/* clock stabilization and stuck interrupt */ +#define INT_REG_OFFSET 0x08U /*!< clock interrupt register offset */ + +/* configuration register */ +#define CFG0_REG_OFFSET 0x04U /*!< clock configuration register 0 offset */ +#define CFG1_REG_OFFSET 0x2CU /*!< clock configuration register 1 offset */ + +/* peripheral clock enable */ +typedef enum { + /* AHB peripherals */ + RCU_DMA0 = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 0U), /*!< DMA0 clock */ + RCU_DMA1 = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 1U), /*!< DMA1 clock */ + RCU_CRC = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 6U), /*!< CRC clock */ + RCU_EXMC = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 8U), /*!< EXMC clock */ + RCU_USBFS = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 12U), /*!< USBFS clock */ + /* APB1 peripherals */ + RCU_TIMER1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 0U), /*!< TIMER1 clock */ + RCU_TIMER2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 1U), /*!< TIMER2 clock */ + RCU_TIMER3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 2U), /*!< TIMER3 clock */ + RCU_TIMER4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 3U), /*!< TIMER4 clock */ + RCU_TIMER5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 4U), /*!< TIMER5 clock */ + RCU_TIMER6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 5U), /*!< TIMER6 clock */ + RCU_WWDGT = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 11U), /*!< WWDGT clock */ + RCU_SPI1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 14U), /*!< SPI1 clock */ + RCU_SPI2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 15U), /*!< SPI2 clock */ + RCU_USART1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 17U), /*!< USART1 clock */ + RCU_USART2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 18U), /*!< USART2 clock */ + RCU_UART3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 19U), /*!< UART3 clock */ + RCU_UART4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 20U), /*!< UART4 clock */ + RCU_I2C0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 21U), /*!< I2C0 clock */ + RCU_I2C1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 22U), /*!< I2C1 clock */ + RCU_CAN0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 25U), /*!< CAN0 clock */ + RCU_CAN1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 26U), /*!< CAN1 clock */ + RCU_BKPI = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 27U), /*!< BKPI clock */ + RCU_PMU = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 28U), /*!< PMU clock */ + RCU_DAC = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 29U), /*!< DAC clock */ + RCU_RTC = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 15U), /*!< RTC clock */ + /* APB2 peripherals */ + RCU_AF = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 0U), /*!< alternate function clock */ + RCU_GPIOA = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 2U), /*!< GPIOA clock */ + RCU_GPIOB = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 3U), /*!< GPIOB clock */ + RCU_GPIOC = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 4U), /*!< GPIOC clock */ + RCU_GPIOD = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 5U), /*!< GPIOD clock */ + RCU_GPIOE = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 6U), /*!< GPIOE clock */ + RCU_ADC0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 9U), /*!< ADC0 clock */ + RCU_ADC1 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 10U), /*!< ADC1 clock */ + RCU_TIMER0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 11U), /*!< TIMER0 clock */ + RCU_SPI0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 12U), /*!< SPI0 clock */ + RCU_USART0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 14U), /*!< USART0 clock */ +} rcu_periph_enum; + +/* peripheral clock enable when sleep mode*/ +typedef enum { + /* AHB peripherals */ + RCU_SRAM_SLP = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 2U), /*!< SRAM clock */ + RCU_FMC_SLP = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 4U), /*!< FMC clock */ +} rcu_periph_sleep_enum; + +/* peripherals reset */ +typedef enum { + /* AHB peripherals */ + RCU_USBFSRST = RCU_REGIDX_BIT(AHBRST_REG_OFFSET, 12U), /*!< USBFS clock reset */ + /* APB1 peripherals */ + RCU_TIMER1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 0U), /*!< TIMER1 clock reset */ + RCU_TIMER2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 1U), /*!< TIMER2 clock reset */ + RCU_TIMER3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 2U), /*!< TIMER3 clock reset */ + RCU_TIMER4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 3U), /*!< TIMER4 clock reset */ + RCU_TIMER5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 4U), /*!< TIMER5 clock reset */ + RCU_TIMER6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 5U), /*!< TIMER6 clock reset */ + RCU_WWDGTRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 11U), /*!< WWDGT clock reset */ + RCU_SPI1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 14U), /*!< SPI1 clock reset */ + RCU_SPI2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 15U), /*!< SPI2 clock reset */ + RCU_USART1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 17U), /*!< USART1 clock reset */ + RCU_USART2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 18U), /*!< USART2 clock reset */ + RCU_UART3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 19U), /*!< UART3 clock reset */ + RCU_UART4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 20U), /*!< UART4 clock reset */ + RCU_I2C0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 21U), /*!< I2C0 clock reset */ + RCU_I2C1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 22U), /*!< I2C1 clock reset */ + RCU_CAN0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 25U), /*!< CAN0 clock reset */ + RCU_CAN1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 26U), /*!< CAN1 clock reset */ + RCU_BKPIRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 27U), /*!< BKPI clock reset */ + RCU_PMURST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 28U), /*!< PMU clock reset */ + RCU_DACRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 29U), /*!< DAC clock reset */ + /* APB2 peripherals */ + RCU_AFRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 0U), /*!< alternate function clock reset */ + RCU_GPIOARST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 2U), /*!< GPIOA clock reset */ + RCU_GPIOBRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 3U), /*!< GPIOB clock reset */ + RCU_GPIOCRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 4U), /*!< GPIOC clock reset */ + RCU_GPIODRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 5U), /*!< GPIOD clock reset */ + RCU_GPIOERST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 6U), /*!< GPIOE clock reset */ + RCU_ADC0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 9U), /*!< ADC0 clock reset */ + RCU_ADC1RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 10U), /*!< ADC1 clock reset */ + RCU_TIMER0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 11U), /*!< TIMER0 clock reset */ + RCU_SPI0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 12U), /*!< SPI0 clock reset */ + RCU_USART0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 14U), /*!< USART0 clock reset */ +} rcu_periph_reset_enum; + +/* clock stabilization and peripheral reset flags */ +typedef enum { + /* clock stabilization flags */ + RCU_FLAG_IRC8MSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 1U), /*!< IRC8M stabilization flags */ + RCU_FLAG_HXTALSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 17U), /*!< HXTAL stabilization flags */ + RCU_FLAG_PLLSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 25U), /*!< PLL stabilization flags */ + RCU_FLAG_PLL1STB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 27U), /*!< PLL1 stabilization flags */ + RCU_FLAG_PLL2STB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 29U), /*!< PLL2 stabilization flags */ + RCU_FLAG_LXTALSTB = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 1U), /*!< LXTAL stabilization flags */ + RCU_FLAG_IRC40KSTB = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 1U), /*!< IRC40K stabilization flags */ + /* reset source flags */ + RCU_FLAG_EPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 26U), /*!< external PIN reset flags */ + RCU_FLAG_PORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 27U), /*!< power reset flags */ + RCU_FLAG_SWRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 28U), /*!< software reset flags */ + RCU_FLAG_FWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 29U), /*!< FWDGT reset flags */ + RCU_FLAG_WWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 30U), /*!< WWDGT reset flags */ + RCU_FLAG_LPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 31U), /*!< low-power reset flags */ +} rcu_flag_enum; + +/* clock stabilization and ckm interrupt flags */ +typedef enum { + RCU_INT_FLAG_IRC40KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 0U), /*!< IRC40K stabilization interrupt flag */ + RCU_INT_FLAG_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 1U), /*!< LXTAL stabilization interrupt flag */ + RCU_INT_FLAG_IRC8MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 2U), /*!< IRC8M stabilization interrupt flag */ + RCU_INT_FLAG_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 3U), /*!< HXTAL stabilization interrupt flag */ + RCU_INT_FLAG_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 4U), /*!< PLL stabilization interrupt flag */ + RCU_INT_FLAG_PLL1STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 5U), /*!< PLL1 stabilization interrupt flag */ + RCU_INT_FLAG_PLL2STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 6U), /*!< PLL2 stabilization interrupt flag */ + RCU_INT_FLAG_CKM = RCU_REGIDX_BIT(INT_REG_OFFSET, 7U), /*!< HXTAL clock stuck interrupt flag */ +} rcu_int_flag_enum; + +/* clock stabilization and stuck interrupt flags clear */ +typedef enum { + RCU_INT_FLAG_IRC40KSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 16U), /*!< IRC40K stabilization interrupt flags clear */ + RCU_INT_FLAG_LXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 17U), /*!< LXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_IRC8MSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 18U), /*!< IRC8M stabilization interrupt flags clear */ + RCU_INT_FLAG_HXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 19U), /*!< HXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLLSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 20U), /*!< PLL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLL1STB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 21U), /*!< PLL1 stabilization interrupt flags clear */ + RCU_INT_FLAG_PLL2STB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 22U), /*!< PLL2 stabilization interrupt flags clear */ + RCU_INT_FLAG_CKM_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 23U), /*!< CKM interrupt flags clear */ +} rcu_int_flag_clear_enum; + +/* clock stabilization interrupt enable or disable */ +typedef enum { + RCU_INT_IRC40KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 8U), /*!< IRC40K stabilization interrupt */ + RCU_INT_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 9U), /*!< LXTAL stabilization interrupt */ + RCU_INT_IRC8MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 10U), /*!< IRC8M stabilization interrupt */ + RCU_INT_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 11U), /*!< HXTAL stabilization interrupt */ + RCU_INT_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 12U), /*!< PLL stabilization interrupt */ + RCU_INT_PLL1STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 13U), /*!< PLL1 stabilization interrupt */ + RCU_INT_PLL2STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 14U), /*!< PLL2 stabilization interrupt */ +} rcu_int_enum; + +/* oscillator types */ +typedef enum { + RCU_HXTAL = RCU_REGIDX_BIT(CTL_REG_OFFSET, 16U), /*!< HXTAL */ + RCU_LXTAL = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 0U), /*!< LXTAL */ + RCU_IRC8M = RCU_REGIDX_BIT(CTL_REG_OFFSET, 0U), /*!< IRC8M */ + RCU_IRC40K = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 0U), /*!< IRC40K */ + RCU_PLL_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 24U), /*!< PLL */ + RCU_PLL1_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 26U), /*!< PLL1 */ + RCU_PLL2_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 28U), /*!< PLL2 */ +} rcu_osci_type_enum; + +/* rcu clock frequency */ +typedef enum { + CK_SYS = 0, /*!< system clock */ + CK_AHB, /*!< AHB clock */ + CK_APB1, /*!< APB1 clock */ + CK_APB2, /*!< APB2 clock */ +} rcu_clock_freq_enum; + +/* RCU_CFG0 register bit define */ +/* system clock source select */ +#define CFG0_SCS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define RCU_CKSYSSRC_IRC8M CFG0_SCS(0) /*!< system clock source select IRC8M */ +#define RCU_CKSYSSRC_HXTAL CFG0_SCS(1) /*!< system clock source select HXTAL */ +#define RCU_CKSYSSRC_PLL CFG0_SCS(2) /*!< system clock source select PLL */ + +/* system clock source select status */ +#define CFG0_SCSS(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define RCU_SCSS_IRC8M CFG0_SCSS(0) /*!< system clock source select IRC8M */ +#define RCU_SCSS_HXTAL CFG0_SCSS(1) /*!< system clock source select HXTAL */ +#define RCU_SCSS_PLL CFG0_SCSS(2) /*!< system clock source select PLLP */ + +/* AHB prescaler selection */ +#define CFG0_AHBPSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_AHB_CKSYS_DIV1 CFG0_AHBPSC(0) /*!< AHB prescaler select CK_SYS */ +#define RCU_AHB_CKSYS_DIV2 CFG0_AHBPSC(8) /*!< AHB prescaler select CK_SYS/2 */ +#define RCU_AHB_CKSYS_DIV4 CFG0_AHBPSC(9) /*!< AHB prescaler select CK_SYS/4 */ +#define RCU_AHB_CKSYS_DIV8 CFG0_AHBPSC(10) /*!< AHB prescaler select CK_SYS/8 */ +#define RCU_AHB_CKSYS_DIV16 CFG0_AHBPSC(11) /*!< AHB prescaler select CK_SYS/16 */ +#define RCU_AHB_CKSYS_DIV64 CFG0_AHBPSC(12) /*!< AHB prescaler select CK_SYS/64 */ +#define RCU_AHB_CKSYS_DIV128 CFG0_AHBPSC(13) /*!< AHB prescaler select CK_SYS/128 */ +#define RCU_AHB_CKSYS_DIV256 CFG0_AHBPSC(14) /*!< AHB prescaler select CK_SYS/256 */ +#define RCU_AHB_CKSYS_DIV512 CFG0_AHBPSC(15) /*!< AHB prescaler select CK_SYS/512 */ + +/* APB1 prescaler selection */ +#define CFG0_APB1PSC(regval) (BITS(8,10) & ((uint32_t)(regval) << 8)) +#define RCU_APB1_CKAHB_DIV1 CFG0_APB1PSC(0) /*!< APB1 prescaler select CK_AHB */ +#define RCU_APB1_CKAHB_DIV2 CFG0_APB1PSC(4) /*!< APB1 prescaler select CK_AHB/2 */ +#define RCU_APB1_CKAHB_DIV4 CFG0_APB1PSC(5) /*!< APB1 prescaler select CK_AHB/4 */ +#define RCU_APB1_CKAHB_DIV8 CFG0_APB1PSC(6) /*!< APB1 prescaler select CK_AHB/8 */ +#define RCU_APB1_CKAHB_DIV16 CFG0_APB1PSC(7) /*!< APB1 prescaler select CK_AHB/16 */ + +/* APB2 prescaler selection */ +#define CFG0_APB2PSC(regval) (BITS(11,13) & ((uint32_t)(regval) << 11)) +#define RCU_APB2_CKAHB_DIV1 CFG0_APB2PSC(0) /*!< APB2 prescaler select CK_AHB */ +#define RCU_APB2_CKAHB_DIV2 CFG0_APB2PSC(4) /*!< APB2 prescaler select CK_AHB/2 */ +#define RCU_APB2_CKAHB_DIV4 CFG0_APB2PSC(5) /*!< APB2 prescaler select CK_AHB/4 */ +#define RCU_APB2_CKAHB_DIV8 CFG0_APB2PSC(6) /*!< APB2 prescaler select CK_AHB/8 */ +#define RCU_APB2_CKAHB_DIV16 CFG0_APB2PSC(7) /*!< APB2 prescaler select CK_AHB/16 */ + +/* ADC prescaler select */ +#define RCU_CKADC_CKAPB2_DIV2 ((uint32_t)0x00000000U) /*!< ADC prescaler select CK_APB2/2 */ +#define RCU_CKADC_CKAPB2_DIV4 ((uint32_t)0x00000001U) /*!< ADC prescaler select CK_APB2/4 */ +#define RCU_CKADC_CKAPB2_DIV6 ((uint32_t)0x00000002U) /*!< ADC prescaler select CK_APB2/6 */ +#define RCU_CKADC_CKAPB2_DIV8 ((uint32_t)0x00000003U) /*!< ADC prescaler select CK_APB2/8 */ +#define RCU_CKADC_CKAPB2_DIV12 ((uint32_t)0x00000005U) /*!< ADC prescaler select CK_APB2/12 */ +#define RCU_CKADC_CKAPB2_DIV16 ((uint32_t)0x00000007U) /*!< ADC prescaler select CK_APB2/16 */ + +/* PLL clock source selection */ +#define RCU_PLLSRC_IRC8M_DIV2 ((uint32_t)0x00000000U) /*!< IRC8M/2 clock selected as source clock of PLL */ +#define RCU_PLLSRC_HXTAL RCU_CFG0_PLLSEL /*!< HXTAL clock selected as source clock of PLL */ + +/* PLL clock multiplication factor */ +#define PLLMF_4 RCU_CFG0_PLLMF_4 /* bit 4 of PLLMF */ + +#define CFG0_PLLMF(regval) (BITS(18,21) & ((uint32_t)(regval) << 18)) +#define RCU_PLL_MUL2 CFG0_PLLMF(0) /*!< PLL source clock multiply by 2 */ +#define RCU_PLL_MUL3 CFG0_PLLMF(1) /*!< PLL source clock multiply by 3 */ +#define RCU_PLL_MUL4 CFG0_PLLMF(2) /*!< PLL source clock multiply by 4 */ +#define RCU_PLL_MUL5 CFG0_PLLMF(3) /*!< PLL source clock multiply by 5 */ +#define RCU_PLL_MUL6 CFG0_PLLMF(4) /*!< PLL source clock multiply by 6 */ +#define RCU_PLL_MUL7 CFG0_PLLMF(5) /*!< PLL source clock multiply by 7 */ +#define RCU_PLL_MUL8 CFG0_PLLMF(6) /*!< PLL source clock multiply by 8 */ +#define RCU_PLL_MUL9 CFG0_PLLMF(7) /*!< PLL source clock multiply by 9 */ +#define RCU_PLL_MUL10 CFG0_PLLMF(8) /*!< PLL source clock multiply by 10 */ +#define RCU_PLL_MUL11 CFG0_PLLMF(9) /*!< PLL source clock multiply by 11 */ +#define RCU_PLL_MUL12 CFG0_PLLMF(10) /*!< PLL source clock multiply by 12 */ +#define RCU_PLL_MUL13 CFG0_PLLMF(11) /*!< PLL source clock multiply by 13 */ +#define RCU_PLL_MUL14 CFG0_PLLMF(12) /*!< PLL source clock multiply by 14 */ +#define RCU_PLL_MUL6_5 CFG0_PLLMF(13) /*!< PLL source clock multiply by 6.5 */ +#define RCU_PLL_MUL16 CFG0_PLLMF(14) /*!< PLL source clock multiply by 16 */ +#define RCU_PLL_MUL17 (PLLMF_4 | CFG0_PLLMF(0)) /*!< PLL source clock multiply by 17 */ +#define RCU_PLL_MUL18 (PLLMF_4 | CFG0_PLLMF(1)) /*!< PLL source clock multiply by 18 */ +#define RCU_PLL_MUL19 (PLLMF_4 | CFG0_PLLMF(2)) /*!< PLL source clock multiply by 19 */ +#define RCU_PLL_MUL20 (PLLMF_4 | CFG0_PLLMF(3)) /*!< PLL source clock multiply by 20 */ +#define RCU_PLL_MUL21 (PLLMF_4 | CFG0_PLLMF(4)) /*!< PLL source clock multiply by 21 */ +#define RCU_PLL_MUL22 (PLLMF_4 | CFG0_PLLMF(5)) /*!< PLL source clock multiply by 22 */ +#define RCU_PLL_MUL23 (PLLMF_4 | CFG0_PLLMF(6)) /*!< PLL source clock multiply by 23 */ +#define RCU_PLL_MUL24 (PLLMF_4 | CFG0_PLLMF(7)) /*!< PLL source clock multiply by 24 */ +#define RCU_PLL_MUL25 (PLLMF_4 | CFG0_PLLMF(8)) /*!< PLL source clock multiply by 25 */ +#define RCU_PLL_MUL26 (PLLMF_4 | CFG0_PLLMF(9)) /*!< PLL source clock multiply by 26 */ +#define RCU_PLL_MUL27 (PLLMF_4 | CFG0_PLLMF(10)) /*!< PLL source clock multiply by 27 */ +#define RCU_PLL_MUL28 (PLLMF_4 | CFG0_PLLMF(11)) /*!< PLL source clock multiply by 28 */ +#define RCU_PLL_MUL29 (PLLMF_4 | CFG0_PLLMF(12)) /*!< PLL source clock multiply by 29 */ +#define RCU_PLL_MUL30 (PLLMF_4 | CFG0_PLLMF(13)) /*!< PLL source clock multiply by 30 */ +#define RCU_PLL_MUL31 (PLLMF_4 | CFG0_PLLMF(14)) /*!< PLL source clock multiply by 31 */ +#define RCU_PLL_MUL32 (PLLMF_4 | CFG0_PLLMF(15)) /*!< PLL source clock multiply by 32 */ + +/* USBFS prescaler select */ +#define CFG0_USBPSC(regval) (BITS(22,23) & ((uint32_t)(regval) << 22)) +#define RCU_CKUSB_CKPLL_DIV1_5 CFG0_USBPSC(0) /*!< USBFS prescaler select CK_PLL/1.5 */ +#define RCU_CKUSB_CKPLL_DIV1 CFG0_USBPSC(1) /*!< USBFS prescaler select CK_PLL/1 */ +#define RCU_CKUSB_CKPLL_DIV2_5 CFG0_USBPSC(2) /*!< USBFS prescaler select CK_PLL/2.5 */ +#define RCU_CKUSB_CKPLL_DIV2 CFG0_USBPSC(3) /*!< USBFS prescaler select CK_PLL/2 */ + +/* CKOUT0 clock source selection */ +#define CFG0_CKOUT0SEL(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) +#define RCU_CKOUT0SRC_NONE CFG0_CKOUT0SEL(0) /*!< no clock selected */ +#define RCU_CKOUT0SRC_CKSYS CFG0_CKOUT0SEL(4) /*!< system clock selected */ +#define RCU_CKOUT0SRC_IRC8M CFG0_CKOUT0SEL(5) /*!< internal 8M RC oscillator clock selected */ +#define RCU_CKOUT0SRC_HXTAL CFG0_CKOUT0SEL(6) /*!< high speed crystal oscillator clock (HXTAL) selected */ +#define RCU_CKOUT0SRC_CKPLL_DIV2 CFG0_CKOUT0SEL(7) /*!< CK_PLL/2 clock selected */ +#define RCU_CKOUT0SRC_CKPLL1 CFG0_CKOUT0SEL(8) /*!< CK_PLL1 clock selected */ +#define RCU_CKOUT0SRC_CKPLL2_DIV2 CFG0_CKOUT0SEL(9) /*!< CK_PLL2/2 clock selected */ +#define RCU_CKOUT0SRC_EXT1 CFG0_CKOUT0SEL(10) /*!< EXT1 selected */ +#define RCU_CKOUT0SRC_CKPLL2 CFG0_CKOUT0SEL(11) /*!< CK_PLL2 clock selected */ + +/* RTC clock entry selection */ +#define BDCTL_RTCSRC(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) +#define RCU_RTCSRC_NONE BDCTL_RTCSRC(0) /*!< no clock selected */ +#define RCU_RTCSRC_LXTAL BDCTL_RTCSRC(1) /*!< RTC source clock select LXTAL */ +#define RCU_RTCSRC_IRC40K BDCTL_RTCSRC(2) /*!< RTC source clock select IRC40K */ +#define RCU_RTCSRC_HXTAL_DIV_128 BDCTL_RTCSRC(3) /*!< RTC source clock select HXTAL/128 */ + +/* PREDV0 division factor */ +#define CFG1_PREDV0(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) +#define RCU_PREDV0_DIV1 CFG1_PREDV0(0) /*!< PREDV0 input source clock not divided */ +#define RCU_PREDV0_DIV2 CFG1_PREDV0(1) /*!< PREDV0 input source clock divided by 2 */ +#define RCU_PREDV0_DIV3 CFG1_PREDV0(2) /*!< PREDV0 input source clock divided by 3 */ +#define RCU_PREDV0_DIV4 CFG1_PREDV0(3) /*!< PREDV0 input source clock divided by 4 */ +#define RCU_PREDV0_DIV5 CFG1_PREDV0(4) /*!< PREDV0 input source clock divided by 5 */ +#define RCU_PREDV0_DIV6 CFG1_PREDV0(5) /*!< PREDV0 input source clock divided by 6 */ +#define RCU_PREDV0_DIV7 CFG1_PREDV0(6) /*!< PREDV0 input source clock divided by 7 */ +#define RCU_PREDV0_DIV8 CFG1_PREDV0(7) /*!< PREDV0 input source clock divided by 8 */ +#define RCU_PREDV0_DIV9 CFG1_PREDV0(8) /*!< PREDV0 input source clock divided by 9 */ +#define RCU_PREDV0_DIV10 CFG1_PREDV0(9) /*!< PREDV0 input source clock divided by 10 */ +#define RCU_PREDV0_DIV11 CFG1_PREDV0(10) /*!< PREDV0 input source clock divided by 11 */ +#define RCU_PREDV0_DIV12 CFG1_PREDV0(11) /*!< PREDV0 input source clock divided by 12 */ +#define RCU_PREDV0_DIV13 CFG1_PREDV0(12) /*!< PREDV0 input source clock divided by 13 */ +#define RCU_PREDV0_DIV14 CFG1_PREDV0(13) /*!< PREDV0 input source clock divided by 14 */ +#define RCU_PREDV0_DIV15 CFG1_PREDV0(14) /*!< PREDV0 input source clock divided by 15 */ +#define RCU_PREDV0_DIV16 CFG1_PREDV0(15) /*!< PREDV0 input source clock divided by 16 */ + +/* PREDV1 division factor */ +#define CFG1_PREDV1(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_PREDV1_DIV1 CFG1_PREDV1(0) /*!< PREDV1 input source clock not divided */ +#define RCU_PREDV1_DIV2 CFG1_PREDV1(1) /*!< PREDV1 input source clock divided by 2 */ +#define RCU_PREDV1_DIV3 CFG1_PREDV1(2) /*!< PREDV1 input source clock divided by 3 */ +#define RCU_PREDV1_DIV4 CFG1_PREDV1(3) /*!< PREDV1 input source clock divided by 4 */ +#define RCU_PREDV1_DIV5 CFG1_PREDV1(4) /*!< PREDV1 input source clock divided by 5 */ +#define RCU_PREDV1_DIV6 CFG1_PREDV1(5) /*!< PREDV1 input source clock divided by 6 */ +#define RCU_PREDV1_DIV7 CFG1_PREDV1(6) /*!< PREDV1 input source clock divided by 7 */ +#define RCU_PREDV1_DIV8 CFG1_PREDV1(7) /*!< PREDV1 input source clock divided by 8 */ +#define RCU_PREDV1_DIV9 CFG1_PREDV1(8) /*!< PREDV1 input source clock divided by 9 */ +#define RCU_PREDV1_DIV10 CFG1_PREDV1(9) /*!< PREDV1 input source clock divided by 10 */ +#define RCU_PREDV1_DIV11 CFG1_PREDV1(10) /*!< PREDV1 input source clock divided by 11 */ +#define RCU_PREDV1_DIV12 CFG1_PREDV1(11) /*!< PREDV1 input source clock divided by 12 */ +#define RCU_PREDV1_DIV13 CFG1_PREDV1(12) /*!< PREDV1 input source clock divided by 13 */ +#define RCU_PREDV1_DIV14 CFG1_PREDV1(13) /*!< PREDV1 input source clock divided by 14 */ +#define RCU_PREDV1_DIV15 CFG1_PREDV1(14) /*!< PREDV1 input source clock divided by 15 */ +#define RCU_PREDV1_DIV16 CFG1_PREDV1(15) /*!< PREDV1 input source clock divided by 16 */ + +/* PLL1 clock multiplication factor */ +#define CFG1_PLL1MF(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) +#define RCU_PLL1_MUL8 CFG1_PLL1MF(6) /*!< PLL1 source clock multiply by 8 */ +#define RCU_PLL1_MUL9 CFG1_PLL1MF(7) /*!< PLL1 source clock multiply by 9 */ +#define RCU_PLL1_MUL10 CFG1_PLL1MF(8) /*!< PLL1 source clock multiply by 10 */ +#define RCU_PLL1_MUL11 CFG1_PLL1MF(9) /*!< PLL1 source clock multiply by 11 */ +#define RCU_PLL1_MUL12 CFG1_PLL1MF(10) /*!< PLL1 source clock multiply by 12 */ +#define RCU_PLL1_MUL13 CFG1_PLL1MF(11) /*!< PLL1 source clock multiply by 13 */ +#define RCU_PLL1_MUL14 CFG1_PLL1MF(12) /*!< PLL1 source clock multiply by 14 */ +#define RCU_PLL1_MUL15 CFG1_PLL1MF(13) /*!< PLL1 source clock multiply by 15 */ +#define RCU_PLL1_MUL16 CFG1_PLL1MF(14) /*!< PLL1 source clock multiply by 16 */ +#define RCU_PLL1_MUL20 CFG1_PLL1MF(15) /*!< PLL1 source clock multiply by 20 */ + +/* PLL2 clock multiplication factor */ +#define CFG1_PLL2MF(regval) (BITS(12,15) & ((uint32_t)(regval) << 12)) +#define RCU_PLL2_MUL8 CFG1_PLL2MF(6) /*!< PLL2 source clock multiply by 8 */ +#define RCU_PLL2_MUL9 CFG1_PLL2MF(7) /*!< PLL2 source clock multiply by 9 */ +#define RCU_PLL2_MUL10 CFG1_PLL2MF(8) /*!< PLL2 source clock multiply by 10 */ +#define RCU_PLL2_MUL11 CFG1_PLL2MF(9) /*!< PLL2 source clock multiply by 11 */ +#define RCU_PLL2_MUL12 CFG1_PLL2MF(10) /*!< PLL2 source clock multiply by 12 */ +#define RCU_PLL2_MUL13 CFG1_PLL2MF(11) /*!< PLL2 source clock multiply by 13 */ +#define RCU_PLL2_MUL14 CFG1_PLL2MF(12) /*!< PLL2 source clock multiply by 14 */ +#define RCU_PLL2_MUL15 CFG1_PLL2MF(13) /*!< PLL2 source clock multiply by 15 */ +#define RCU_PLL2_MUL16 CFG1_PLL2MF(14) /*!< PLL2 source clock multiply by 16 */ +#define RCU_PLL2_MUL20 CFG1_PLL2MF(15) /*!< PLL2 source clock multiply by 20 */ + + +/* PREDV0 input clock source selection */ +#define RCU_PREDV0SRC_HXTAL ((uint32_t)0x00000000U) /*!< HXTAL selected as PREDV0 input source clock */ +#define RCU_PREDV0SRC_CKPLL1 RCU_CFG1_PREDV0SEL /*!< CK_PLL1 selected as PREDV0 input source clock */ + +/* I2S1 clock source selection */ +#define RCU_I2S1SRC_CKSYS ((uint32_t)0x00000000U) /*!< system clock selected as I2S1 source clock */ +#define RCU_I2S1SRC_CKPLL2_MUL2 RCU_CFG1_I2S1SEL /*!< (CK_PLL2 x 2) selected as I2S1 source clock */ + +/* I2S2 clock source selection */ +#define RCU_I2S2SRC_CKSYS ((uint32_t)0x00000000U) /*!< system clock selected as I2S2 source clock */ +#define RCU_I2S2SRC_CKPLL2_MUL2 RCU_CFG1_I2S2SEL /*!< (CK_PLL2 x 2) selected as I2S2 source clock */ + + +/* deep-sleep mode voltage */ +#define DSV_DSLPVS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define RCU_DEEPSLEEP_V_1_2 DSV_DSLPVS(0) /*!< core voltage is 1.2V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_1_1 DSV_DSLPVS(1) /*!< core voltage is 1.1V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_1_0 DSV_DSLPVS(2) /*!< core voltage is 1.0V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_0_9 DSV_DSLPVS(3) /*!< core voltage is 0.9V in deep-sleep mode */ + +/* function declarations */ +/* initialization, peripheral clock enable/disable functions */ +/* deinitialize the RCU */ +void rcu_deinit(void); +/* enable the peripherals clock */ +void rcu_periph_clock_enable(rcu_periph_enum periph); +/* disable the peripherals clock */ +void rcu_periph_clock_disable(rcu_periph_enum periph); +/* enable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph); +/* disable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph); +/* reset the peripherals */ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset); +/* disable reset the peripheral */ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset); +/* reset the BKP domain */ +void rcu_bkp_reset_enable(void); +/* disable the BKP domain reset */ +void rcu_bkp_reset_disable(void); + +/* clock configuration functions */ +/* configure the system clock source */ +void rcu_system_clock_source_config(uint32_t ck_sys); +/* get the system clock source */ +uint32_t rcu_system_clock_source_get(void); +/* configure the AHB prescaler selection */ +void rcu_ahb_clock_config(uint32_t ck_ahb); +/* configure the APB1 prescaler selection */ +void rcu_apb1_clock_config(uint32_t ck_apb1); +/* configure the APB2 prescaler selection */ +void rcu_apb2_clock_config(uint32_t ck_apb2); +/* configure the CK_OUT0 clock source and divider */ +void rcu_ckout0_config(uint32_t ckout0_src); +/* configure the PLL clock source selection and PLL multiply factor */ +void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul); + +/* configure the PREDV0 division factor and clock source */ +void rcu_predv0_config(uint32_t predv0_source, uint32_t predv0_div); +/* configure the PREDV1 division factor */ +void rcu_predv1_config(uint32_t predv1_div); +/* configure the PLL1 clock */ +void rcu_pll1_config(uint32_t pll_mul); +/* configure the PLL2 clock */ +void rcu_pll2_config(uint32_t pll_mul); + +/* peripheral clock configuration functions */ +/* configure the ADC division factor */ +void rcu_adc_clock_config(uint32_t adc_psc); +/* configure the USBD/USBFS prescaler factor */ +void rcu_usb_clock_config(uint32_t usb_psc); +/* configure the RTC clock source selection */ +void rcu_rtc_clock_config(uint32_t rtc_clock_source); + +/* configure the I2S1 clock source selection */ +void rcu_i2s1_clock_config(uint32_t i2s_clock_source); +/* configure the I2S2 clock source selection */ +void rcu_i2s2_clock_config(uint32_t i2s_clock_source); + +/* interrupt & flag functions */ +/* get the clock stabilization and periphral reset flags */ +FlagStatus rcu_flag_get(rcu_flag_enum flag); +/* clear the reset flag */ +void rcu_all_reset_flag_clear(void); +/* get the clock stabilization interrupt and ckm flags */ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag); +/* clear the interrupt flags */ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag_clear); +/* enable the stabilization interrupt */ +void rcu_interrupt_enable(rcu_int_enum stab_int); +/* disable the stabilization interrupt */ +void rcu_interrupt_disable(rcu_int_enum stab_int); + +/* oscillator configuration functions */ +/* wait for oscillator stabilization flags is SET or oscillator startup is timeout */ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci); +/* turn on the oscillator */ +void rcu_osci_on(rcu_osci_type_enum osci); +/* turn off the oscillator */ +void rcu_osci_off(rcu_osci_type_enum osci); +/* enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci); +/* disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci); +/* enable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_enable(void); +/* disable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_disable(void); + +/* set the IRC8M adjust value */ +void rcu_irc8m_adjust_value_set(uint32_t irc8m_adjval); +/* set the deep sleep mode voltage */ +void rcu_deepsleep_voltage_set(uint32_t dsvol); + +/* get the system clock, bus and peripheral clock frequency */ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock); + +#endif /* GD32VF103_RCU_H */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_timer.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_timer.h new file mode 100755 index 000000000..c210f3cb2 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_timer.h @@ -0,0 +1,720 @@ +/*! + \file gd32vf103_timer.h + \brief definitions for the TIMER + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_TIMER_H +#define GD32VF103_TIMER_H + +#include "gd32vf103.h" +#include "gd32vf103_rcu.h" +// #include "gd32vf103_dbg.h" + +/* TIMERx(x=0..13) definitions */ +#define TIMER0 (TIMER_BASE + 0x00012C00U) +#define TIMER1 (TIMER_BASE + 0x00000000U) +#define TIMER2 (TIMER_BASE + 0x00000400U) +#define TIMER3 (TIMER_BASE + 0x00000800U) +#define TIMER4 (TIMER_BASE + 0x00000C00U) +#define TIMER5 (TIMER_BASE + 0x00001000U) +#define TIMER6 (TIMER_BASE + 0x00001400U) + +/* registers definitions */ +#define TIMER_CTL0(timerx) REG32((timerx) + 0x00U) /*!< TIMER control register 0 */ +#define TIMER_CTL1(timerx) REG32((timerx) + 0x04U) /*!< TIMER control register 1 */ +#define TIMER_SMCFG(timerx) REG32((timerx) + 0x08U) /*!< TIMER slave mode configuration register */ +#define TIMER_DMAINTEN(timerx) REG32((timerx) + 0x0CU) /*!< TIMER DMA and interrupt enable register */ +#define TIMER_INTF(timerx) REG32((timerx) + 0x10U) /*!< TIMER interrupt flag register */ +#define TIMER_SWEVG(timerx) REG32((timerx) + 0x14U) /*!< TIMER software event generation register */ +#define TIMER_CHCTL0(timerx) REG32((timerx) + 0x18U) /*!< TIMER channel control register 0 */ +#define TIMER_CHCTL1(timerx) REG32((timerx) + 0x1CU) /*!< TIMER channel control register 1 */ +#define TIMER_CHCTL2(timerx) REG32((timerx) + 0x20U) /*!< TIMER channel control register 2 */ +#define TIMER_CNT(timerx) REG32((timerx) + 0x24U) /*!< TIMER counter register */ +#define TIMER_PSC(timerx) REG32((timerx) + 0x28U) /*!< TIMER prescaler register */ +#define TIMER_CAR(timerx) REG32((timerx) + 0x2CU) /*!< TIMER counter auto reload register */ +#define TIMER_CREP(timerx) REG32((timerx) + 0x30U) /*!< TIMER counter repetition register */ +#define TIMER_CH0CV(timerx) REG32((timerx) + 0x34U) /*!< TIMER channel 0 capture/compare value register */ +#define TIMER_CH1CV(timerx) REG32((timerx) + 0x38U) /*!< TIMER channel 1 capture/compare value register */ +#define TIMER_CH2CV(timerx) REG32((timerx) + 0x3CU) /*!< TIMER channel 2 capture/compare value register */ +#define TIMER_CH3CV(timerx) REG32((timerx) + 0x40U) /*!< TIMER channel 3 capture/compare value register */ +#define TIMER_CCHP(timerx) REG32((timerx) + 0x44U) /*!< TIMER channel complementary protection register */ +#define TIMER_DMACFG(timerx) REG32((timerx) + 0x48U) /*!< TIMER DMA configuration register */ +#define TIMER_DMATB(timerx) REG32((timerx) + 0x4CU) /*!< TIMER DMA transfer buffer register */ + +/* bits definitions */ +/* TIMER_CTL0 */ +#define TIMER_CTL0_CEN BIT(0) /*!< TIMER counter enable */ +#define TIMER_CTL0_UPDIS BIT(1) /*!< update disable */ +#define TIMER_CTL0_UPS BIT(2) /*!< update source */ +#define TIMER_CTL0_SPM BIT(3) /*!< single pulse mode */ +#define TIMER_CTL0_DIR BIT(4) /*!< timer counter direction */ +#define TIMER_CTL0_CAM BITS(5,6) /*!< center-aligned mode selection */ +#define TIMER_CTL0_ARSE BIT(7) /*!< auto-reload shadow enable */ +#define TIMER_CTL0_CKDIV BITS(8,9) /*!< clock division */ + +/* TIMER_CTL1 */ +#define TIMER_CTL1_CCSE BIT(0) /*!< commutation control shadow enable */ +#define TIMER_CTL1_CCUC BIT(2) /*!< commutation control shadow register update control */ +#define TIMER_CTL1_DMAS BIT(3) /*!< DMA request source selection */ +#define TIMER_CTL1_MMC BITS(4,6) /*!< master mode control */ +#define TIMER_CTL1_TI0S BIT(7) /*!< channel 0 trigger input selection(hall mode selection) */ +#define TIMER_CTL1_ISO0 BIT(8) /*!< idle state of channel 0 output */ +#define TIMER_CTL1_ISO0N BIT(9) /*!< idle state of channel 0 complementary output */ +#define TIMER_CTL1_ISO1 BIT(10) /*!< idle state of channel 1 output */ +#define TIMER_CTL1_ISO1N BIT(11) /*!< idle state of channel 1 complementary output */ +#define TIMER_CTL1_ISO2 BIT(12) /*!< idle state of channel 2 output */ +#define TIMER_CTL1_ISO2N BIT(13) /*!< idle state of channel 2 complementary output */ +#define TIMER_CTL1_ISO3 BIT(14) /*!< idle state of channel 3 output */ + +/* TIMER_SMCFG */ +#define TIMER_SMCFG_SMC BITS(0,2) /*!< slave mode control */ +#define TIMER_SMCFG_TRGS BITS(4,6) /*!< trigger selection */ +#define TIMER_SMCFG_MSM BIT(7) /*!< master-slave mode */ +#define TIMER_SMCFG_ETFC BITS(8,11) /*!< external trigger filter control */ +#define TIMER_SMCFG_ETPSC BITS(12,13) /*!< external trigger prescaler */ +#define TIMER_SMCFG_SMC1 BIT(14) /*!< part of SMC for enable external clock mode 1 */ +#define TIMER_SMCFG_ETP BIT(15) /*!< external trigger polarity */ + +/* TIMER_DMAINTEN */ +#define TIMER_DMAINTEN_UPIE BIT(0) /*!< update interrupt enable */ +#define TIMER_DMAINTEN_CH0IE BIT(1) /*!< channel 0 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH1IE BIT(2) /*!< channel 1 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH2IE BIT(3) /*!< channel 2 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH3IE BIT(4) /*!< channel 3 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CMTIE BIT(5) /*!< commutation interrupt request enable */ +#define TIMER_DMAINTEN_TRGIE BIT(6) /*!< trigger interrupt enable */ +#define TIMER_DMAINTEN_BRKIE BIT(7) /*!< break interrupt enable */ +#define TIMER_DMAINTEN_UPDEN BIT(8) /*!< update DMA request enable */ +#define TIMER_DMAINTEN_CH0DEN BIT(9) /*!< channel 0 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CH1DEN BIT(10) /*!< channel 1 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CH2DEN BIT(11) /*!< channel 2 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CH3DEN BIT(12) /*!< channel 3 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CMTDEN BIT(13) /*!< commutation DMA request enable */ +#define TIMER_DMAINTEN_TRGDEN BIT(14) /*!< trigger DMA request enable */ + +/* TIMER_INTF */ +#define TIMER_INTF_UPIF BIT(0) /*!< update interrupt flag */ +#define TIMER_INTF_CH0IF BIT(1) /*!< channel 0 capture/compare interrupt flag */ +#define TIMER_INTF_CH1IF BIT(2) /*!< channel 1 capture/compare interrupt flag */ +#define TIMER_INTF_CH2IF BIT(3) /*!< channel 2 capture/compare interrupt flag */ +#define TIMER_INTF_CH3IF BIT(4) /*!< channel 3 capture/compare interrupt flag */ +#define TIMER_INTF_CMTIF BIT(5) /*!< channel commutation interrupt flag */ +#define TIMER_INTF_TRGIF BIT(6) /*!< trigger interrupt flag */ +#define TIMER_INTF_BRKIF BIT(7) /*!< break interrupt flag */ +#define TIMER_INTF_CH0OF BIT(9) /*!< channel 0 over capture flag */ +#define TIMER_INTF_CH1OF BIT(10) /*!< channel 1 over capture flag */ +#define TIMER_INTF_CH2OF BIT(11) /*!< channel 2 over capture flag */ +#define TIMER_INTF_CH3OF BIT(12) /*!< channel 3 over capture flag */ + +/* TIMER_SWEVG */ +#define TIMER_SWEVG_UPG BIT(0) /*!< update event generate */ +#define TIMER_SWEVG_CH0G BIT(1) /*!< channel 0 capture or compare event generation */ +#define TIMER_SWEVG_CH1G BIT(2) /*!< channel 1 capture or compare event generation */ +#define TIMER_SWEVG_CH2G BIT(3) /*!< channel 2 capture or compare event generation */ +#define TIMER_SWEVG_CH3G BIT(4) /*!< channel 3 capture or compare event generation */ +#define TIMER_SWEVG_CMTG BIT(5) /*!< channel commutation event generation */ +#define TIMER_SWEVG_TRGG BIT(6) /*!< trigger event generation */ +#define TIMER_SWEVG_BRKG BIT(7) /*!< break event generation */ + +/* TIMER_CHCTL0 */ +/* output compare mode */ +#define TIMER_CHCTL0_CH0MS BITS(0,1) /*!< channel 0 mode selection */ +#define TIMER_CHCTL0_CH0COMFEN BIT(2) /*!< channel 0 output compare fast enable */ +#define TIMER_CHCTL0_CH0COMSEN BIT(3) /*!< channel 0 output compare shadow enable */ +#define TIMER_CHCTL0_CH0COMCTL BITS(4,6) /*!< channel 0 output compare control */ +#define TIMER_CHCTL0_CH0COMCEN BIT(7) /*!< channel 0 output compare clear enable */ +#define TIMER_CHCTL0_CH1MS BITS(8,9) /*!< channel 1 mode selection */ +#define TIMER_CHCTL0_CH1COMFEN BIT(10) /*!< channel 1 output compare fast enable */ +#define TIMER_CHCTL0_CH1COMSEN BIT(11) /*!< channel 1 output compare shadow enable */ +#define TIMER_CHCTL0_CH1COMCTL BITS(12,14) /*!< channel 1 output compare control */ +#define TIMER_CHCTL0_CH1COMCEN BIT(15) /*!< channel 1 output compare clear enable */ +/* input capture mode */ +#define TIMER_CHCTL0_CH0CAPPSC BITS(2,3) /*!< channel 0 input capture prescaler */ +#define TIMER_CHCTL0_CH0CAPFLT BITS(4,7) /*!< channel 0 input capture filter control */ +#define TIMER_CHCTL0_CH1CAPPSC BITS(10,11) /*!< channel 1 input capture prescaler */ +#define TIMER_CHCTL0_CH1CAPFLT BITS(12,15) /*!< channel 1 input capture filter control */ + +/* TIMER_CHCTL1 */ +/* output compare mode */ +#define TIMER_CHCTL1_CH2MS BITS(0,1) /*!< channel 2 mode selection */ +#define TIMER_CHCTL1_CH2COMFEN BIT(2) /*!< channel 2 output compare fast enable */ +#define TIMER_CHCTL1_CH2COMSEN BIT(3) /*!< channel 2 output compare shadow enable */ +#define TIMER_CHCTL1_CH2COMCTL BITS(4,6) /*!< channel 2 output compare control */ +#define TIMER_CHCTL1_CH2COMCEN BIT(7) /*!< channel 2 output compare clear enable */ +#define TIMER_CHCTL1_CH3MS BITS(8,9) /*!< channel 3 mode selection */ +#define TIMER_CHCTL1_CH3COMFEN BIT(10) /*!< channel 3 output compare fast enable */ +#define TIMER_CHCTL1_CH3COMSEN BIT(11) /*!< channel 3 output compare shadow enable */ +#define TIMER_CHCTL1_CH3COMCTL BITS(12,14) /*!< channel 3 output compare control */ +#define TIMER_CHCTL1_CH3COMCEN BIT(15) /*!< channel 3 output compare clear enable */ +/* input capture mode */ +#define TIMER_CHCTL1_CH2CAPPSC BITS(2,3) /*!< channel 2 input capture prescaler */ +#define TIMER_CHCTL1_CH2CAPFLT BITS(4,7) /*!< channel 2 input capture filter control */ +#define TIMER_CHCTL1_CH3CAPPSC BITS(10,11) /*!< channel 3 input capture prescaler */ +#define TIMER_CHCTL1_CH3CAPFLT BITS(12,15) /*!< channel 3 input capture filter control */ + +/* TIMER_CHCTL2 */ +#define TIMER_CHCTL2_CH0EN BIT(0) /*!< channel 0 capture/compare function enable */ +#define TIMER_CHCTL2_CH0P BIT(1) /*!< channel 0 capture/compare function polarity */ +#define TIMER_CHCTL2_CH0NEN BIT(2) /*!< channel 0 complementary output enable */ +#define TIMER_CHCTL2_CH0NP BIT(3) /*!< channel 0 complementary output polarity */ +#define TIMER_CHCTL2_CH1EN BIT(4) /*!< channel 1 capture/compare function enable */ +#define TIMER_CHCTL2_CH1P BIT(5) /*!< channel 1 capture/compare function polarity */ +#define TIMER_CHCTL2_CH1NEN BIT(6) /*!< channel 1 complementary output enable */ +#define TIMER_CHCTL2_CH1NP BIT(7) /*!< channel 1 complementary output polarity */ +#define TIMER_CHCTL2_CH2EN BIT(8) /*!< channel 2 capture/compare function enable */ +#define TIMER_CHCTL2_CH2P BIT(9) /*!< channel 2 capture/compare function polarity */ +#define TIMER_CHCTL2_CH2NEN BIT(10) /*!< channel 2 complementary output enable */ +#define TIMER_CHCTL2_CH2NP BIT(11) /*!< channel 2 complementary output polarity */ +#define TIMER_CHCTL2_CH3EN BIT(12) /*!< channel 3 capture/compare function enable */ +#define TIMER_CHCTL2_CH3P BIT(13) /*!< channel 3 capture/compare function polarity */ + +/* TIMER_CNT */ +#define TIMER_CNT_CNT BITS(0,15) /*!< 16 bit timer counter */ + +/* TIMER_PSC */ +#define TIMER_PSC_PSC BITS(0,15) /*!< prescaler value of the counter clock */ + +/* TIMER_CAR */ +#define TIMER_CAR_CARL BITS(0,15) /*!< 16 bit counter auto reload value */ + +/* TIMER_CREP */ +#define TIMER_CREP_CREP BITS(0,7) /*!< counter repetition value */ + +/* TIMER_CH0CV */ +#define TIMER_CH0CV_CH0VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 0 */ + +/* TIMER_CH1CV */ +#define TIMER_CH1CV_CH1VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 1 */ + +/* TIMER_CH2CV */ +#define TIMER_CH2CV_CH2VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 2 */ + +/* TIMER_CH3CV */ +#define TIMER_CH3CV_CH3VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 3 */ + +/* TIMER_CCHP */ +#define TIMER_CCHP_DTCFG BITS(0,7) /*!< dead time configure */ +#define TIMER_CCHP_PROT BITS(8,9) /*!< complementary register protect control */ +#define TIMER_CCHP_IOS BIT(10) /*!< idle mode off-state configure */ +#define TIMER_CCHP_ROS BIT(11) /*!< run mode off-state configure */ +#define TIMER_CCHP_BRKEN BIT(12) /*!< break enable */ +#define TIMER_CCHP_BRKP BIT(13) /*!< break polarity */ +#define TIMER_CCHP_OAEN BIT(14) /*!< output automatic enable */ +#define TIMER_CCHP_POEN BIT(15) /*!< primary output enable */ + +/* TIMER_DMACFG */ +#define TIMER_DMACFG_DMATA BITS(0,4) /*!< DMA transfer access start address */ +#define TIMER_DMACFG_DMATC BITS(8,12) /*!< DMA transfer count */ + +/* TIMER_DMATB */ +#define TIMER_DMATB_DMATB BITS(0,15) /*!< DMA transfer buffer address */ + +/* constants definitions */ +/* TIMER init parameter struct definitions */ +typedef struct { + uint16_t prescaler; /*!< prescaler value */ + uint16_t alignedmode; /*!< aligned mode */ + uint16_t counterdirection; /*!< counter direction */ + uint32_t period; /*!< period value */ + uint16_t clockdivision; /*!< clock division value */ + uint8_t repetitioncounter; /*!< the counter repetition value */ +} timer_parameter_struct; + +/* break parameter struct definitions */ +typedef struct { + uint16_t runoffstate; /*!< run mode off-state */ + uint16_t ideloffstate; /*!< idle mode off-state */ + uint16_t deadtime; /*!< dead time */ + uint16_t breakpolarity; /*!< break polarity */ + uint16_t outputautostate; /*!< output automatic enable */ + uint16_t protectmode; /*!< complementary register protect control */ + uint16_t breakstate; /*!< break enable */ +} timer_break_parameter_struct; + +/* channel output parameter struct definitions */ +typedef struct { + uint16_t outputstate; /*!< channel output state */ + uint16_t outputnstate; /*!< channel complementary output state */ + uint16_t ocpolarity; /*!< channel output polarity */ + uint16_t ocnpolarity; /*!< channel complementary output polarity */ + uint16_t ocidlestate; /*!< idle state of channel output */ + uint16_t ocnidlestate; /*!< idle state of channel complementary output */ +} timer_oc_parameter_struct; + +/* channel input parameter struct definitions */ +typedef struct { + uint16_t icpolarity; /*!< channel input polarity */ + uint16_t icselection; /*!< channel input mode selection */ + uint16_t icprescaler; /*!< channel input capture prescaler */ + uint16_t icfilter; /*!< channel input capture filter control */ +} timer_ic_parameter_struct; + +/* TIMER interrupt enable or disable */ +#define TIMER_INT_UP TIMER_DMAINTEN_UPIE /*!< update interrupt */ +#define TIMER_INT_CH0 TIMER_DMAINTEN_CH0IE /*!< channel 0 interrupt */ +#define TIMER_INT_CH1 TIMER_DMAINTEN_CH1IE /*!< channel 1 interrupt */ +#define TIMER_INT_CH2 TIMER_DMAINTEN_CH2IE /*!< channel 2 interrupt */ +#define TIMER_INT_CH3 TIMER_DMAINTEN_CH3IE /*!< channel 3 interrupt */ +#define TIMER_INT_CMT TIMER_DMAINTEN_CMTIE /*!< channel commutation interrupt flag */ +#define TIMER_INT_TRG TIMER_DMAINTEN_TRGIE /*!< trigger interrupt */ +#define TIMER_INT_BRK TIMER_DMAINTEN_BRKIE /*!< break interrupt */ + +/* TIMER interrupt flag */ +#define TIMER_INT_FLAG_UP TIMER_INT_UP /*!< update interrupt */ +#define TIMER_INT_FLAG_CH0 TIMER_INT_CH0 /*!< channel 0 interrupt */ +#define TIMER_INT_FLAG_CH1 TIMER_INT_CH1 /*!< channel 1 interrupt */ +#define TIMER_INT_FLAG_CH2 TIMER_INT_CH2 /*!< channel 2 interrupt */ +#define TIMER_INT_FLAG_CH3 TIMER_INT_CH3 /*!< channel 3 interrupt */ +#define TIMER_INT_FLAG_CMT TIMER_INT_CMT /*!< channel commutation interrupt flag */ +#define TIMER_INT_FLAG_TRG TIMER_INT_TRG /*!< trigger interrupt */ +#define TIMER_INT_FLAG_BRK TIMER_INT_BRK + +/* TIMER flag */ +#define TIMER_FLAG_UP TIMER_INTF_UPIF /*!< update flag */ +#define TIMER_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 flag */ +#define TIMER_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 flag */ +#define TIMER_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 flag */ +#define TIMER_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 flag */ +#define TIMER_FLAG_CMT TIMER_INTF_CMTIF /*!< channel control update flag */ +#define TIMER_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger flag */ +#define TIMER_FLAG_BRK TIMER_INTF_BRKIF /*!< break flag */ +#define TIMER_FLAG_CH0O TIMER_INTF_CH0OF /*!< channel 0 overcapture flag */ +#define TIMER_FLAG_CH1O TIMER_INTF_CH1OF /*!< channel 1 overcapture flag */ +#define TIMER_FLAG_CH2O TIMER_INTF_CH2OF /*!< channel 2 overcapture flag */ +#define TIMER_FLAG_CH3O TIMER_INTF_CH3OF /*!< channel 3 overcapture flag */ + +/* TIMER DMA source enable */ +#define TIMER_DMA_UPD ((uint16_t)TIMER_DMAINTEN_UPDEN) /*!< update DMA enable */ +#define TIMER_DMA_CH0D ((uint16_t)TIMER_DMAINTEN_CH0DEN) /*!< channel 0 DMA enable */ +#define TIMER_DMA_CH1D ((uint16_t)TIMER_DMAINTEN_CH1DEN) /*!< channel 1 DMA enable */ +#define TIMER_DMA_CH2D ((uint16_t)TIMER_DMAINTEN_CH2DEN) /*!< channel 2 DMA enable */ +#define TIMER_DMA_CH3D ((uint16_t)TIMER_DMAINTEN_CH3DEN) /*!< channel 3 DMA enable */ +#define TIMER_DMA_CMTD ((uint16_t)TIMER_DMAINTEN_CMTDEN) /*!< commutation DMA request enable */ +#define TIMER_DMA_TRGD ((uint16_t)TIMER_DMAINTEN_TRGDEN) /*!< trigger DMA enable */ + +/* channel DMA request source selection */ +#define TIMER_DMAREQUEST_UPDATEEVENT TIMER_CTL1_DMAS /*!< DMA request of channel n is sent when update event occurs */ +#define TIMER_DMAREQUEST_CHANNELEVENT ((uint32_t)0x00000000U) /*!< DMA request of channel n is sent when channel n event occurs */ + +/* DMA access base address */ +#define DMACFG_DMATA(regval) (BITS(0, 4) & ((uint32_t)(regval) << 0U)) +#define TIMER_DMACFG_DMATA_CTL0 DMACFG_DMATA(0) /*!< DMA transfer address is TIMER_CTL0 */ +#define TIMER_DMACFG_DMATA_CTL1 DMACFG_DMATA(1) /*!< DMA transfer address is TIMER_CTL1 */ +#define TIMER_DMACFG_DMATA_SMCFG DMACFG_DMATA(2) /*!< DMA transfer address is TIMER_SMCFG */ +#define TIMER_DMACFG_DMATA_DMAINTEN DMACFG_DMATA(3) /*!< DMA transfer address is TIMER_DMAINTEN */ +#define TIMER_DMACFG_DMATA_INTF DMACFG_DMATA(4) /*!< DMA transfer address is TIMER_INTF */ +#define TIMER_DMACFG_DMATA_SWEVG DMACFG_DMATA(5) /*!< DMA transfer address is TIMER_SWEVG */ +#define TIMER_DMACFG_DMATA_CHCTL0 DMACFG_DMATA(6) /*!< DMA transfer address is TIMER_CHCTL0 */ +#define TIMER_DMACFG_DMATA_CHCTL1 DMACFG_DMATA(7) /*!< DMA transfer address is TIMER_CHCTL1 */ +#define TIMER_DMACFG_DMATA_CHCTL2 DMACFG_DMATA(8) /*!< DMA transfer address is TIMER_CHCTL2 */ +#define TIMER_DMACFG_DMATA_CNT DMACFG_DMATA(9) /*!< DMA transfer address is TIMER_CNT */ +#define TIMER_DMACFG_DMATA_PSC DMACFG_DMATA(10) /*!< DMA transfer address is TIMER_PSC */ +#define TIMER_DMACFG_DMATA_CAR DMACFG_DMATA(11) /*!< DMA transfer address is TIMER_CAR */ +#define TIMER_DMACFG_DMATA_CREP DMACFG_DMATA(12) /*!< DMA transfer address is TIMER_CREP */ +#define TIMER_DMACFG_DMATA_CH0CV DMACFG_DMATA(13) /*!< DMA transfer address is TIMER_CH0CV */ +#define TIMER_DMACFG_DMATA_CH1CV DMACFG_DMATA(14) /*!< DMA transfer address is TIMER_CH1CV */ +#define TIMER_DMACFG_DMATA_CH2CV DMACFG_DMATA(15) /*!< DMA transfer address is TIMER_CH2CV */ +#define TIMER_DMACFG_DMATA_CH3CV DMACFG_DMATA(16) /*!< DMA transfer address is TIMER_CH3CV */ +#define TIMER_DMACFG_DMATA_CCHP DMACFG_DMATA(17) /*!< DMA transfer address is TIMER_CCHP */ +#define TIMER_DMACFG_DMATA_DMACFG DMACFG_DMATA(18) /*!< DMA transfer address is TIMER_DMACFG */ + +/* DMA access burst length */ +#define DMACFG_DMATC(regval) (BITS(8, 12) & ((uint32_t)(regval) << 8U)) +#define TIMER_DMACFG_DMATC_1TRANSFER DMACFG_DMATC(0) /*!< DMA transfer 1 time */ +#define TIMER_DMACFG_DMATC_2TRANSFER DMACFG_DMATC(1) /*!< DMA transfer 2 times */ +#define TIMER_DMACFG_DMATC_3TRANSFER DMACFG_DMATC(2) /*!< DMA transfer 3 times */ +#define TIMER_DMACFG_DMATC_4TRANSFER DMACFG_DMATC(3) /*!< DMA transfer 4 times */ +#define TIMER_DMACFG_DMATC_5TRANSFER DMACFG_DMATC(4) /*!< DMA transfer 5 times */ +#define TIMER_DMACFG_DMATC_6TRANSFER DMACFG_DMATC(5) /*!< DMA transfer 6 times */ +#define TIMER_DMACFG_DMATC_7TRANSFER DMACFG_DMATC(6) /*!< DMA transfer 7 times */ +#define TIMER_DMACFG_DMATC_8TRANSFER DMACFG_DMATC(7) /*!< DMA transfer 8 times */ +#define TIMER_DMACFG_DMATC_9TRANSFER DMACFG_DMATC(8) /*!< DMA transfer 9 times */ +#define TIMER_DMACFG_DMATC_10TRANSFER DMACFG_DMATC(9) /*!< DMA transfer 10 times */ +#define TIMER_DMACFG_DMATC_11TRANSFER DMACFG_DMATC(10) /*!< DMA transfer 11 times */ +#define TIMER_DMACFG_DMATC_12TRANSFER DMACFG_DMATC(11) /*!< DMA transfer 12 times */ +#define TIMER_DMACFG_DMATC_13TRANSFER DMACFG_DMATC(12) /*!< DMA transfer 13 times */ +#define TIMER_DMACFG_DMATC_14TRANSFER DMACFG_DMATC(13) /*!< DMA transfer 14 times */ +#define TIMER_DMACFG_DMATC_15TRANSFER DMACFG_DMATC(14) /*!< DMA transfer 15 times */ +#define TIMER_DMACFG_DMATC_16TRANSFER DMACFG_DMATC(15) /*!< DMA transfer 16 times */ +#define TIMER_DMACFG_DMATC_17TRANSFER DMACFG_DMATC(16) /*!< DMA transfer 17 times */ +#define TIMER_DMACFG_DMATC_18TRANSFER DMACFG_DMATC(17) /*!< DMA transfer 18 times */ + +/* TIMER software event generation source */ +#define TIMER_EVENT_SRC_UPG ((uint16_t)0x0001U) /*!< update event generation */ +#define TIMER_EVENT_SRC_CH0G ((uint16_t)0x0002U) /*!< channel 0 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH1G ((uint16_t)0x0004U) /*!< channel 1 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH2G ((uint16_t)0x0008U) /*!< channel 2 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH3G ((uint16_t)0x0010U) /*!< channel 3 capture or compare event generation */ +#define TIMER_EVENT_SRC_CMTG ((uint16_t)0x0020U) /*!< channel commutation event generation */ +#define TIMER_EVENT_SRC_TRGG ((uint16_t)0x0040U) /*!< trigger event generation */ +#define TIMER_EVENT_SRC_BRKG ((uint16_t)0x0080U) /*!< break event generation */ + +/* center-aligned mode selection */ +#define CTL0_CAM(regval) ((uint16_t)(BITS(5, 6) & ((uint32_t)(regval) << 5U))) +#define TIMER_COUNTER_EDGE CTL0_CAM(0) /*!< edge-aligned mode */ +#define TIMER_COUNTER_CENTER_DOWN CTL0_CAM(1) /*!< center-aligned and counting down assert mode */ +#define TIMER_COUNTER_CENTER_UP CTL0_CAM(2) /*!< center-aligned and counting up assert mode */ +#define TIMER_COUNTER_CENTER_BOTH CTL0_CAM(3) /*!< center-aligned and counting up/down assert mode */ + +/* TIMER prescaler reload mode */ +#define TIMER_PSC_RELOAD_NOW TIMER_SWEVG_UPG /*!< the prescaler is loaded right now */ +#define TIMER_PSC_RELOAD_UPDATE ((uint32_t)0x00000000U) /*!< the prescaler is loaded at the next update event */ + +/* count direction */ +#define TIMER_COUNTER_UP ((uint16_t)0x0000U) /*!< counter up direction */ +#define TIMER_COUNTER_DOWN ((uint16_t)TIMER_CTL0_DIR) /*!< counter down direction */ + +/* specify division ratio between TIMER clock and dead-time and sampling clock */ +#define CTL0_CKDIV(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CKDIV_DIV1 CTL0_CKDIV(0) /*!< clock division value is 1,fDTS=fTIMER_CK */ +#define TIMER_CKDIV_DIV2 CTL0_CKDIV(1) /*!< clock division value is 2,fDTS= fTIMER_CK/2 */ +#define TIMER_CKDIV_DIV4 CTL0_CKDIV(2) /*!< clock division value is 4, fDTS= fTIMER_CK/4 */ + +/* single pulse mode */ +#define TIMER_SP_MODE_SINGLE TIMER_CTL0_SPM /*!< single pulse mode */ +#define TIMER_SP_MODE_REPETITIVE ((uint32_t)0x00000000U) /*!< repetitive pulse mode */ + +/* update source */ +#define TIMER_UPDATE_SRC_REGULAR TIMER_CTL0_UPS /*!< update generate only by counter overflow/underflow */ +#define TIMER_UPDATE_SRC_GLOBAL ((uint32_t)0x00000000U) /*!< update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger */ + +/* run mode off-state configure */ +#define TIMER_ROS_STATE_ENABLE ((uint16_t)TIMER_CCHP_ROS) /*!< when POEN bit is set, the channel output signals(CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_ROS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is set, the channel output signals(CHx_O/CHx_ON) are disabled */ + + +/* idle mode off-state configure */ +#define TIMER_IOS_STATE_ENABLE ((uint16_t)TIMER_CCHP_IOS) /*!< when POEN bit is reset, he channel output signals(CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_IOS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is reset, the channel output signals(CHx_O/CHx_ON) are disabled */ + +/* break input polarity */ +#define TIMER_BREAK_POLARITY_LOW ((uint16_t)0x0000U) /*!< break input polarity is low */ +#define TIMER_BREAK_POLARITY_HIGH ((uint16_t)TIMER_CCHP_BRKP) /*!< break input polarity is high */ + +/* output automatic enable */ +#define TIMER_OUTAUTO_ENABLE ((uint16_t)TIMER_CCHP_OAEN) /*!< output automatic enable */ +#define TIMER_OUTAUTO_DISABLE ((uint16_t)0x0000U) /*!< output automatic disable */ + +/* complementary register protect control */ +#define CCHP_PROT(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CCHP_PROT_OFF CCHP_PROT(0) /*!< protect disable */ +#define TIMER_CCHP_PROT_0 CCHP_PROT(1) /*!< PROT mode 0 */ +#define TIMER_CCHP_PROT_1 CCHP_PROT(2) /*!< PROT mode 1 */ +#define TIMER_CCHP_PROT_2 CCHP_PROT(3) /*!< PROT mode 2 */ + +/* break input enable */ +#define TIMER_BREAK_ENABLE ((uint16_t)TIMER_CCHP_BRKEN) /*!< break input enable */ +#define TIMER_BREAK_DISABLE ((uint16_t)0x0000U) /*!< break input disable */ + +/* TIMER channel n(n=0,1,2,3) */ +#define TIMER_CH_0 ((uint16_t)0x0000U) /*!< TIMER channel 0(TIMERx(x=0..4)) */ +#define TIMER_CH_1 ((uint16_t)0x0001U) /*!< TIMER channel 1(TIMERx(x=0..4)) */ +#define TIMER_CH_2 ((uint16_t)0x0002U) /*!< TIMER channel 2(TIMERx(x=0..4)) */ +#define TIMER_CH_3 ((uint16_t)0x0003U) /*!< TIMER channel 3(TIMERx(x=0..4)) */ + +/* channel enable state */ +#define TIMER_CCX_ENABLE ((uint16_t)0x0001U) /*!< channel enable */ +#define TIMER_CCX_DISABLE ((uint16_t)0x0000U) /*!< channel disable */ + +/* channel complementary output enable state */ +#define TIMER_CCXN_ENABLE ((uint16_t)0x0004U) /*!< channel complementary enable */ +#define TIMER_CCXN_DISABLE ((uint16_t)0x0000U) /*!< channel complementary disable */ + +/* channel output polarity */ +#define TIMER_OC_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel output polarity is high */ +#define TIMER_OC_POLARITY_LOW ((uint16_t)0x0002U) /*!< channel output polarity is low */ + +/* channel complementary output polarity */ +#define TIMER_OCN_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel complementary output polarity is high */ +#define TIMER_OCN_POLARITY_LOW ((uint16_t)0x0008U) /*!< channel complementary output polarity is low */ + +/* idle state of channel output */ +#define TIMER_OC_IDLE_STATE_HIGH ((uint16_t)0x0100) /*!< idle state of channel output is high */ +#define TIMER_OC_IDLE_STATE_LOW ((uint16_t)0x0000) /*!< idle state of channel output is low */ + +/* idle state of channel complementary output */ +#define TIMER_OCN_IDLE_STATE_HIGH ((uint16_t)0x0200U) /*!< idle state of channel complementary output is high */ +#define TIMER_OCN_IDLE_STATE_LOW ((uint16_t)0x0000U) /*!< idle state of channel complementary output is low */ + +/* channel output compare mode */ +#define TIMER_OC_MODE_TIMING ((uint16_t)0x0000U) /*!< timing mode */ +#define TIMER_OC_MODE_ACTIVE ((uint16_t)0x0010U) /*!< active mode */ +#define TIMER_OC_MODE_INACTIVE ((uint16_t)0x0020U) /*!< inactive mode */ +#define TIMER_OC_MODE_TOGGLE ((uint16_t)0x0030U) /*!< toggle mode */ +#define TIMER_OC_MODE_LOW ((uint16_t)0x0040U) /*!< force low mode */ +#define TIMER_OC_MODE_HIGH ((uint16_t)0x0050U) /*!< force high mode */ +#define TIMER_OC_MODE_PWM0 ((uint16_t)0x0060U) /*!< PWM0 mode */ +#define TIMER_OC_MODE_PWM1 ((uint16_t)0x0070U) /*!< PWM1 mode */ + +/* channel output compare shadow enable */ +#define TIMER_OC_SHADOW_ENABLE ((uint16_t)0x0008U) /*!< channel output shadow state enable */ +#define TIMER_OC_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel output shadow state disable */ + +/* channel output compare fast enable */ +#define TIMER_OC_FAST_ENABLE ((uint16_t)0x0004) /*!< channel output fast function enable */ +#define TIMER_OC_FAST_DISABLE ((uint16_t)0x0000) /*!< channel output fast function disable */ + +/* channel output compare clear enable */ +#define TIMER_OC_CLEAR_ENABLE ((uint16_t)0x0080U) /*!< channel output clear function enable */ +#define TIMER_OC_CLEAR_DISABLE ((uint16_t)0x0000U) /*!< channel output clear function disable */ + +/* channel control shadow register update control */ +#define TIMER_UPDATECTL_CCU ((uint32_t)0x00000000U) /*!< the shadow registers update by when CMTG bit is set */ +#define TIMER_UPDATECTL_CCUTRI TIMER_CTL1_CCUC /*!< the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs */ + +/* channel input capture polarity */ +#define TIMER_IC_POLARITY_RISING ((uint16_t)0x0000U) /*!< input capture rising edge */ +#define TIMER_IC_POLARITY_FALLING ((uint16_t)0x0002U) /*!< input capture falling edge */ +#define TIMER_IC_POLARITY_BOTH_EDGE ((uint16_t)0x000AU) /*!< input capture both edge */ + +/* TIMER input capture selection */ +#define TIMER_IC_SELECTION_DIRECTTI ((uint16_t)0x0001U) /*!< channel n is configured as input and icy is mapped on CIy */ +#define TIMER_IC_SELECTION_INDIRECTTI ((uint16_t)0x0002U) /*!< channel n is configured as input and icy is mapped on opposite input */ +#define TIMER_IC_SELECTION_ITS ((uint16_t)0x0003U) /*!< channel n is configured as input and icy is mapped on ITS */ + +/* channel input capture prescaler */ +#define TIMER_IC_PSC_DIV1 ((uint16_t)0x0000U) /*!< no prescaler */ +#define TIMER_IC_PSC_DIV2 ((uint16_t)0x0004U) /*!< divided by 2 */ +#define TIMER_IC_PSC_DIV4 ((uint16_t)0x0008U) /*!< divided by 4 */ +#define TIMER_IC_PSC_DIV8 ((uint16_t)0x000CU) /*!< divided by 8 */ + +/* trigger selection */ +#define SMCFG_TRGSEL(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_SMCFG_TRGSEL_ITI0 SMCFG_TRGSEL(0) /*!< internal trigger 0 */ +#define TIMER_SMCFG_TRGSEL_ITI1 SMCFG_TRGSEL(1) /*!< internal trigger 1 */ +#define TIMER_SMCFG_TRGSEL_ITI2 SMCFG_TRGSEL(2) /*!< internal trigger 2 */ +#define TIMER_SMCFG_TRGSEL_ITI3 SMCFG_TRGSEL(3) /*!< internal trigger 3 */ +#define TIMER_SMCFG_TRGSEL_CI0F_ED SMCFG_TRGSEL(4) /*!< TI0 Edge Detector */ +#define TIMER_SMCFG_TRGSEL_CI0FE0 SMCFG_TRGSEL(5) /*!< filtered TIMER input 0 */ +#define TIMER_SMCFG_TRGSEL_CI1FE1 SMCFG_TRGSEL(6) /*!< filtered TIMER input 1 */ +#define TIMER_SMCFG_TRGSEL_ETIFP SMCFG_TRGSEL(7) /*!< filtered external trigger input */ + +/* master mode control */ +#define CTL1_MMC(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_TRI_OUT_SRC_RESET CTL1_MMC(0) /*!< the UPG bit as trigger output */ +#define TIMER_TRI_OUT_SRC_ENABLE CTL1_MMC(1) /*!< the counter enable signal TIMER_CTL0_CEN as trigger output */ +#define TIMER_TRI_OUT_SRC_UPDATE CTL1_MMC(2) /*!< update event as trigger output */ +#define TIMER_TRI_OUT_SRC_CH0 CTL1_MMC(3) /*!< a capture or a compare match occurred in channel 0 as trigger output TRGO */ +#define TIMER_TRI_OUT_SRC_O0CPRE CTL1_MMC(4) /*!< O0CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O1CPRE CTL1_MMC(5) /*!< O1CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O2CPRE CTL1_MMC(6) /*!< O2CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O3CPRE CTL1_MMC(7) /*!< O3CPRE as trigger output */ + +/* slave mode control */ +#define SMCFG_SMC(regval) (BITS(0, 2) & ((uint32_t)(regval) << 0U)) +#define TIMER_SLAVE_MODE_DISABLE SMCFG_SMC(0) /*!< slave mode disable */ +#define TIMER_ENCODER_MODE0 SMCFG_SMC(1) /*!< encoder mode 0 */ +#define TIMER_ENCODER_MODE1 SMCFG_SMC(2) /*!< encoder mode 1 */ +#define TIMER_ENCODER_MODE2 SMCFG_SMC(3) /*!< encoder mode 2 */ +#define TIMER_SLAVE_MODE_RESTART SMCFG_SMC(4) /*!< restart mode */ +#define TIMER_SLAVE_MODE_PAUSE SMCFG_SMC(5) /*!< pause mode */ +#define TIMER_SLAVE_MODE_EVENT SMCFG_SMC(6) /*!< event mode */ +#define TIMER_SLAVE_MODE_EXTERNAL0 SMCFG_SMC(7) /*!< external clock mode 0 */ + +/* master slave mode selection */ +#define TIMER_MASTER_SLAVE_MODE_ENABLE TIMER_SMCFG_MSM /*!< master slave mode enable */ +#define TIMER_MASTER_SLAVE_MODE_DISABLE ((uint32_t)0x00000000U) /*!< master slave mode disable */ + +/* external trigger prescaler */ +#define SMCFG_ETPSC(regval) (BITS(12, 13) & ((uint32_t)(regval) << 12U)) +#define TIMER_EXT_TRI_PSC_OFF SMCFG_ETPSC(0) /*!< no divided */ +#define TIMER_EXT_TRI_PSC_DIV2 SMCFG_ETPSC(1) /*!< divided by 2 */ +#define TIMER_EXT_TRI_PSC_DIV4 SMCFG_ETPSC(2) /*!< divided by 4 */ +#define TIMER_EXT_TRI_PSC_DIV8 SMCFG_ETPSC(3) /*!< divided by 8 */ + +/* external trigger polarity */ +#define TIMER_ETP_FALLING TIMER_SMCFG_ETP /*!< active low or falling edge active */ +#define TIMER_ETP_RISING ((uint32_t)0x00000000U) /*!< active high or rising edge active */ + +/* channel 0 trigger input selection */ +#define TIMER_HALLINTERFACE_ENABLE TIMER_CTL1_TI0S /*!< TIMER hall sensor mode enable */ +#define TIMER_HALLINTERFACE_DISABLE ((uint32_t)0x00000000U) /*!< TIMER hall sensor mode disable */ + +/* TIMERx(x=0..4) write CHxVAL register selection */ +#define TIMER_CHVSEL_ENABLE ((uint16_t)TIMER_CFG_OUTSEL) /*!< write CHxVAL register selection enable */ +#define TIMER_CHVSEL_DISABLE ((uint16_t)0x0000U) /*!< write CHxVAL register selection disable */ + +/* function declarations */ +/* TIMER timebase */ +/* deinit a timer */ +void timer_deinit(uint32_t timer_periph); +/* initialize TIMER init parameter struct */ +void timer_struct_para_init(timer_parameter_struct* initpara); +/* initialize TIMER counter */ +void timer_init(uint32_t timer_periph, timer_parameter_struct* initpara); +/* enable a timer */ +void timer_enable(uint32_t timer_periph); +/* disable a timer */ +void timer_disable(uint32_t timer_periph); +/* enable the auto reload shadow function */ +void timer_auto_reload_shadow_enable(uint32_t timer_periph); +/* disable the auto reload shadow function */ +void timer_auto_reload_shadow_disable(uint32_t timer_periph); +/* enable the update event */ +void timer_update_event_enable(uint32_t timer_periph); +/* disable the update event */ +void timer_update_event_disable(uint32_t timer_periph); +/* set TIMER counter alignment mode */ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned); +/* set TIMER counter up direction */ +void timer_counter_up_direction(uint32_t timer_periph); +/* set TIMER counter down direction */ +void timer_counter_down_direction(uint32_t timer_periph); + +/* configure TIMER prescaler */ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint32_t pscreload); +/* configure TIMER repetition register value */ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition); +/* configure TIMER autoreload register value */ +void timer_autoreload_value_config(uint32_t timer_periph, uint16_t autoreload); +/* configure TIMER counter register value */ +void timer_counter_value_config(uint32_t timer_periph, uint16_t counter); +/* read TIMER counter value */ +uint32_t timer_counter_read(uint32_t timer_periph); +/* read TIMER prescaler value */ +uint16_t timer_prescaler_read(uint32_t timer_periph); +/* configure TIMER single pulse mode */ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode); +/* configure TIMER update source */ +void timer_update_source_config(uint32_t timer_periph, uint32_t update); + +/* TIMER DMA and event */ +/* enable the TIMER DMA */ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma); +/* disable the TIMER DMA */ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma); +/* channel DMA request source selection */ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint32_t dma_request); +/* configure the TIMER DMA transfer */ +void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth); +/* software generate events */ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event); + +/* TIMER channel complementary protection */ +/* initialize TIMER break parameter struct */ +void timer_break_struct_para_init(timer_break_parameter_struct* breakpara); +/* configure TIMER break function */ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct* breakpara); +/* enable TIMER break function */ +void timer_break_enable(uint32_t timer_periph); +/* disable TIMER break function */ +void timer_break_disable(uint32_t timer_periph); +/* enable TIMER output automatic function */ +void timer_automatic_output_enable(uint32_t timer_periph); +/* disable TIMER output automatic function */ +void timer_automatic_output_disable(uint32_t timer_periph); +/* enable or disable TIMER primary output function */ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue); +/* enable or disable channel capture/compare control shadow register */ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue); +/* configure TIMER channel control shadow register update control */ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint32_t ccuctl); + +/* TIMER channel output */ +/* initialize TIMER channel output parameter struct */ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct* ocpara); +/* configure TIMER channel output function */ +void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, timer_oc_parameter_struct* ocpara); +/* configure TIMER channel output compare mode */ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode); +/* configure TIMER channel output pulse value */ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse); +/* configure TIMER channel output shadow function */ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow); +/* configure TIMER channel output fast function */ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast); +/* configure TIMER channel output clear function */ +void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear); +/* configure TIMER channel output polarity */ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocpolarity); +/* configure TIMER channel complementary output polarity */ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnpolarity); +/* configure TIMER channel enable state */ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state); +/* configure TIMER channel complementary output enable state */ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnstate); + +/* TIMER channel input */ +/* initialize TIMER channel input parameter struct */ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct* icpara); +/* configure TIMER input capture parameter */ +void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpara); +/* configure TIMER channel input capture prescaler value */ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, uint16_t prescaler); +/* read TIMER channel capture compare register value */ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel); +/* configure TIMER input pwm capture function */ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpwm); +/* configure TIMER hall sensor mode */ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode); + +/* TIMER master and slave mode */ +/* select TIMER input trigger source */ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger); +/* select TIMER master mode output trigger source */ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger); +/* select TIMER slave mode */ +void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode); +/* configure TIMER master slave mode */ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave); +/* configure TIMER external trigger input */ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER quadrature decoder mode */ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, uint16_t ic0polarity, uint16_t ic1polarity); +/* configure TIMER internal clock mode */ +void timer_internal_clock_config(uint32_t timer_periph); +/* configure TIMER the internal trigger as external clock input */ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger); +/* configure TIMER the external trigger as external clock input */ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, uint16_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 0 */ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 1 */ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* disable TIMER the external clock mode 1 */ +void timer_external_clock_mode1_disable(uint32_t timer_periph); + +/* TIMER interrupt and flag */ +/* enable the TIMER interrupt */ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt); +/* disable the TIMER interrupt */ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt); +/* get TIMER interrupt flag */ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt); +/* clear TIMER interrupt flag */ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt); +/* get TIMER flag */ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag); +/* clear TIMER flag */ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag); + +#endif /* GD32VF103_TIMER_H */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_usart.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_usart.h new file mode 100755 index 000000000..3c849874e --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/gd32vf103_usart.h @@ -0,0 +1,375 @@ +/*! + \file gd32vf103_usart.h + \brief definitions for the USART + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2018, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_USART_H +#define GD32VF103_USART_H + +#include "gd32vf103.h" +#include "gd32vf103_rcu.h" +// #include "gd32vf103_dbg.h" + +/* USARTx(x=0,1,2)/UARTx(x=3,4) definitions */ +#define USART1 USART_BASE /*!< USART1 base address */ +#define USART2 (USART_BASE+(0x00000400U)) /*!< USART2 base address */ +#define UART3 (USART_BASE+(0x00000800U)) /*!< UART3 base address */ +#define UART4 (USART_BASE+(0x00000C00U)) /*!< UART4 base address */ +#define USART0 (USART_BASE+(0x0000F400U)) /*!< USART0 base address */ + +/* registers definitions */ +#define USART_STAT(usartx) REG32((usartx) + (0x00000000U)) /*!< USART status register */ +#define USART_DATA(usartx) REG32((usartx) + (0x00000004U)) /*!< USART data register */ +#define USART_BAUD(usartx) REG32((usartx) + (0x00000008U)) /*!< USART baud rate register */ +#define USART_CTL0(usartx) REG32((usartx) + (0x0000000CU)) /*!< USART control register 0 */ +#define USART_CTL1(usartx) REG32((usartx) + (0x00000010U)) /*!< USART control register 1 */ +#define USART_CTL2(usartx) REG32((usartx) + (0x00000014U)) /*!< USART control register 2 */ +#define USART_GP(usartx) REG32((usartx) + (0x00000018U)) /*!< USART guard time and prescaler register */ + +/* bits definitions */ +/* USARTx_STAT */ +#define USART_STAT_PERR BIT(0) /*!< parity error flag */ +#define USART_STAT_FERR BIT(1) /*!< frame error flag */ +#define USART_STAT_NERR BIT(2) /*!< noise error flag */ +#define USART_STAT_ORERR BIT(3) /*!< overrun error */ +#define USART_STAT_IDLEF BIT(4) /*!< IDLE frame detected flag */ +#define USART_STAT_RBNE BIT(5) /*!< read data buffer not empty */ +#define USART_STAT_TC BIT(6) /*!< transmission complete */ +#define USART_STAT_TBE BIT(7) /*!< transmit data buffer empty */ +#define USART_STAT_LBDF BIT(8) /*!< LIN break detected flag */ +#define USART_STAT_CTSF BIT(9) /*!< CTS change flag */ + +/* USARTx_DATA */ +#define USART_DATA_DATA BITS(0,8) /*!< transmit or read data value */ + +/* USARTx_BAUD */ +#define USART_BAUD_FRADIV BITS(0,3) /*!< fraction part of baud-rate divider */ +#define USART_BAUD_INTDIV BITS(4,15) /*!< integer part of baud-rate divider */ + +/* USARTx_CTL0 */ +#define USART_CTL0_SBKCMD BIT(0) /*!< send break command */ +#define USART_CTL0_RWU BIT(1) /*!< receiver wakeup from mute mode */ +#define USART_CTL0_REN BIT(2) /*!< receiver enable */ +#define USART_CTL0_TEN BIT(3) /*!< transmitter enable */ +#define USART_CTL0_IDLEIE BIT(4) /*!< idle line detected interrupt enable */ +#define USART_CTL0_RBNEIE BIT(5) /*!< read data buffer not empty interrupt and overrun error interrupt enable */ +#define USART_CTL0_TCIE BIT(6) /*!< transmission complete interrupt enable */ +#define USART_CTL0_TBEIE BIT(7) /*!< transmitter buffer empty interrupt enable */ +#define USART_CTL0_PERRIE BIT(8) /*!< parity error interrupt enable */ +#define USART_CTL0_PM BIT(9) /*!< parity mode */ +#define USART_CTL0_PCEN BIT(10) /*!< parity check function enable */ +#define USART_CTL0_WM BIT(11) /*!< wakeup method in mute mode */ +#define USART_CTL0_WL BIT(12) /*!< word length */ +#define USART_CTL0_UEN BIT(13) /*!< USART enable */ + +/* USARTx_CTL1 */ +#define USART_CTL1_ADDR BITS(0,3) /*!< address of USART */ +#define USART_CTL1_LBLEN BIT(5) /*!< LIN break frame length */ +#define USART_CTL1_LBDIE BIT(6) /*!< LIN break detected interrupt eanble */ +#define USART_CTL1_CLEN BIT(8) /*!< CK length */ +#define USART_CTL1_CPH BIT(9) /*!< CK phase */ +#define USART_CTL1_CPL BIT(10) /*!< CK polarity */ +#define USART_CTL1_CKEN BIT(11) /*!< CK pin enable */ +#define USART_CTL1_STB BITS(12,13) /*!< STOP bits length */ +#define USART_CTL1_LMEN BIT(14) /*!< LIN mode enable */ + +/* USARTx_CTL2 */ +#define USART_CTL2_ERRIE BIT(0) /*!< error interrupt enable */ +#define USART_CTL2_IREN BIT(1) /*!< IrDA mode enable */ +#define USART_CTL2_IRLP BIT(2) /*!< IrDA low-power */ +#define USART_CTL2_HDEN BIT(3) /*!< half-duplex enable */ +#define USART_CTL2_NKEN BIT(4) /*!< NACK enable in smartcard mode */ +#define USART_CTL2_SCEN BIT(5) /*!< smartcard mode enable */ +#define USART_CTL2_DENR BIT(6) /*!< DMA request enable for reception */ +#define USART_CTL2_DENT BIT(7) /*!< DMA request enable for transmission */ +#define USART_CTL2_RTSEN BIT(8) /*!< RTS enable */ +#define USART_CTL2_CTSEN BIT(9) /*!< CTS enable */ +#define USART_CTL2_CTSIE BIT(10) /*!< CTS interrupt enable */ + +/* USARTx_GP */ +#define USART_GP_PSC BITS(0,7) /*!< prescaler value for dividing the system clock */ +#define USART_GP_GUAT BITS(8,15) /*!< guard time value in smartcard mode */ + +/* constants definitions */ +/* define the USART bit position and its register index offset */ +#define USART_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define USART_REG_VAL(usartx, offset) (REG32((usartx) + (((uint32_t)(offset) & (0x0000FFFFU)) >> 6))) +#define USART_BIT_POS(val) ((uint32_t)(val) & (0x0000001FU)) +#define USART_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define USART_REG_VAL2(usartx, offset) (REG32((usartx) + ((uint32_t)(offset) >> 22))) +#define USART_BIT_POS2(val) (((uint32_t)(val) & (0x001F0000U)) >> 16) + +/* register offset */ +#define USART_STAT_REG_OFFSET (0x00000000U) /*!< STAT register offset */ +#define USART_CTL0_REG_OFFSET (0x0000000CU) /*!< CTL0 register offset */ +#define USART_CTL1_REG_OFFSET (0x00000010U) /*!< CTL1 register offset */ +#define USART_CTL2_REG_OFFSET (0x00000014U) /*!< CTL2 register offset */ + +/* USART flags */ +typedef enum { + /* flags in STAT register */ + USART_FLAG_CTSF = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 9U), /*!< CTS change flag */ + USART_FLAG_LBDF = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 8U), /*!< LIN break detected flag */ + USART_FLAG_TBE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 7U), /*!< transmit data buffer empty */ + USART_FLAG_TC = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 6U), /*!< transmission complete */ + USART_FLAG_RBNE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 5U), /*!< read data buffer not empty */ + USART_FLAG_IDLEF = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 4U), /*!< IDLE frame detected flag */ + USART_FLAG_ORERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 3U), /*!< overrun error */ + USART_FLAG_NERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 2U), /*!< noise error flag */ + USART_FLAG_FERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 1U), /*!< frame error flag */ + USART_FLAG_PERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 0U), /*!< parity error flag */ +} usart_flag_enum; + +/* USART interrupt flags */ +typedef enum { + /* interrupt flags in CTL0 register */ + USART_INT_FLAG_PERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 8U, USART_STAT_REG_OFFSET, 0U), /*!< parity error interrupt and flag */ + USART_INT_FLAG_TBE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 7U, USART_STAT_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt and flag */ + USART_INT_FLAG_TC = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 6U, USART_STAT_REG_OFFSET, 6U), /*!< transmission complete interrupt and flag */ + USART_INT_FLAG_RBNE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and flag */ + USART_INT_FLAG_RBNE_ORERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT_REG_OFFSET, 3U), /*!< read data buffer not empty interrupt and overrun error flag */ + USART_INT_FLAG_IDLE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 4U, USART_STAT_REG_OFFSET, 4U), /*!< IDLE line detected interrupt and flag */ + /* interrupt flags in CTL1 register */ + USART_INT_FLAG_LBD = USART_REGIDX_BIT2(USART_CTL1_REG_OFFSET, 6U, USART_STAT_REG_OFFSET, 8U), /*!< LIN break detected interrupt and flag */ + /* interrupt flags in CTL2 register */ + USART_INT_FLAG_CTS = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 10U, USART_STAT_REG_OFFSET, 9U), /*!< CTS interrupt and flag */ + USART_INT_FLAG_ERR_ORERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 3U), /*!< error interrupt and overrun error */ + USART_INT_FLAG_ERR_NERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 2U), /*!< error interrupt and noise error flag */ + USART_INT_FLAG_ERR_FERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 1U), /*!< error interrupt and frame error flag */ +} usart_interrupt_flag_enum; + +/* USART interrupt enable or disable */ +typedef enum { + /* interrupt in CTL0 register */ + USART_INT_PERR = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 8U), /*!< parity error interrupt */ + USART_INT_TBE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt */ + USART_INT_TC = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 6U), /*!< transmission complete interrupt */ + USART_INT_RBNE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and overrun error interrupt */ + USART_INT_IDLE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt */ + /* interrupt in CTL1 register */ + USART_INT_LBD = USART_REGIDX_BIT(USART_CTL1_REG_OFFSET, 6U), /*!< LIN break detected interrupt */ + /* interrupt in CTL2 register */ + USART_INT_CTS = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 10U), /*!< CTS interrupt */ + USART_INT_ERR = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 0U), /*!< error interrupt */ +} usart_interrupt_enum; + +/* USART receiver configure */ +#define CTL0_REN(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_RECEIVE_ENABLE CTL0_REN(1) /*!< enable receiver */ +#define USART_RECEIVE_DISABLE CTL0_REN(0) /*!< disable receiver */ + +/* USART transmitter configure */ +#define CTL0_TEN(regval) (BIT(3) & ((uint32_t)(regval) << 3)) +#define USART_TRANSMIT_ENABLE CTL0_TEN(1) /*!< enable transmitter */ +#define USART_TRANSMIT_DISABLE CTL0_TEN(0) /*!< disable transmitter */ + +/* USART parity bits definitions */ +#define CTL0_PM(regval) (BITS(9,10) & ((uint32_t)(regval) << 9)) +#define USART_PM_NONE CTL0_PM(0) /*!< no parity */ +#define USART_PM_EVEN CTL0_PM(2) /*!< even parity */ +#define USART_PM_ODD CTL0_PM(3) /*!< odd parity */ + +/* USART wakeup method in mute mode */ +#define CTL0_WM(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_WM_IDLE CTL0_WM(0) /*!< idle line */ +#define USART_WM_ADDR CTL0_WM(1) /*!< address match */ + +/* USART word length definitions */ +#define CTL0_WL(regval) (BIT(12) & ((uint32_t)(regval) << 12)) +#define USART_WL_8BIT CTL0_WL(0) /*!< 8 bits */ +#define USART_WL_9BIT CTL0_WL(1) /*!< 9 bits */ + +/* USART stop bits definitions */ +#define CTL1_STB(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) +#define USART_STB_1BIT CTL1_STB(0) /*!< 1 bit */ +#define USART_STB_0_5BIT CTL1_STB(1) /*!< 0.5 bit */ +#define USART_STB_2BIT CTL1_STB(2) /*!< 2 bits */ +#define USART_STB_1_5BIT CTL1_STB(3) /*!< 1.5 bits */ + +/* USART LIN break frame length */ +#define CTL1_LBLEN(regval) (BIT(5) & ((uint32_t)(regval) << 5)) +#define USART_LBLEN_10B CTL1_LBLEN(0) /*!< 10 bits */ +#define USART_LBLEN_11B CTL1_LBLEN(1) /*!< 11 bits */ + +/* USART CK length */ +#define CTL1_CLEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_CLEN_NONE CTL1_CLEN(0) /*!< there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame */ +#define USART_CLEN_EN CTL1_CLEN(1) /*!< there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame */ + +/* USART clock phase */ +#define CTL1_CPH(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CPH_1CK CTL1_CPH(0) /*!< first clock transition is the first data capture edge */ +#define USART_CPH_2CK CTL1_CPH(1) /*!< second clock transition is the first data capture edge */ + +/* USART clock polarity */ +#define CTL1_CPL(regval) (BIT(10) & ((uint32_t)(regval) << 10)) +#define USART_CPL_LOW CTL1_CPL(0) /*!< steady low value on CK pin */ +#define USART_CPL_HIGH CTL1_CPL(1) /*!< steady high value on CK pin */ + +/* USART DMA request for receive configure */ +#define CLT2_DENR(regval) (BIT(6) & ((uint32_t)(regval) << 6)) +#define USART_DENR_ENABLE CLT2_DENR(1) /*!< DMA request enable for reception */ +#define USART_DENR_DISABLE CLT2_DENR(0) /*!< DMA request disable for reception */ + +/* USART DMA request for transmission configure */ +#define CLT2_DENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) +#define USART_DENT_ENABLE CLT2_DENT(1) /*!< DMA request enable for transmission */ +#define USART_DENT_DISABLE CLT2_DENT(0) /*!< DMA request disable for transmission */ + +/* USART RTS configure */ +#define CLT2_RTSEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_RTS_ENABLE CLT2_RTSEN(1) /*!< RTS enable */ +#define USART_RTS_DISABLE CLT2_RTSEN(0) /*!< RTS disable */ + +/* USART CTS configure */ +#define CLT2_CTSEN(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CTS_ENABLE CLT2_CTSEN(1) /*!< CTS enable */ +#define USART_CTS_DISABLE CLT2_CTSEN(0) /*!< CTS disable */ + +/* USART IrDA low-power enable */ +#define CTL2_IRLP(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_IRLP_LOW CTL2_IRLP(1) /*!< low-power */ +#define USART_IRLP_NORMAL CTL2_IRLP(0) /*!< normal */ + +/* function declarations */ +/* initialization functions */ +/* reset USART */ +void usart_deinit(uint32_t usart_periph); +/* configure USART baud rate value */ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval); +/* configure USART parity function */ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg); +/* configure USART word length */ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen); +/* configure USART stop bit length */ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen); + +/* USART normal mode communication */ +/* enable USART */ +void usart_enable(uint32_t usart_periph); +/* disable USART */ +void usart_disable(uint32_t usart_periph); +/* configure USART transmitter */ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig); +/* configure USART receiver */ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig); +/* USART transmit data function */ +void usart_data_transmit(uint32_t usart_periph, uint32_t data); +/* USART receive data function */ +uint16_t usart_data_receive(uint32_t usart_periph); + +/* multi-processor communication */ +/* configure address of the USART */ +void usart_address_config(uint32_t usart_periph, uint8_t addr); +/* enable mute mode */ +void usart_mute_mode_enable(uint32_t usart_periph); +/* disable mute mode */ +void usart_mute_mode_disable(uint32_t usart_periph); +/* configure wakeup method in mute mode */ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod); + +/* LIN mode communication */ +/* LIN mode enable */ +void usart_lin_mode_enable(uint32_t usart_periph); +/* LIN mode disable */ +void usart_lin_mode_disable(uint32_t usart_periph); +/* LIN break detection length */ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen); +/* send break frame */ +void usart_send_break(uint32_t usart_periph); + +/* half-duplex communication */ +/* half-duplex enable */ +void usart_halfduplex_enable(uint32_t usart_periph); +/* half-duplex disable */ +void usart_halfduplex_disable(uint32_t usart_periph); + +/* synchronous communication */ +/* clock enable */ +void usart_synchronous_clock_enable(uint32_t usart_periph); +/* clock disable */ +void usart_synchronous_clock_disable(uint32_t usart_periph); +/* configure usart synchronous mode parameters */ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl); + +/* smartcard communication */ +/* guard time value configure in smartcard mode */ +void usart_guard_time_config(uint32_t usart_periph, uint32_t gaut); +/* smartcard mode enable */ +void usart_smartcard_mode_enable(uint32_t usart_periph); +/* smartcard mode disable */ +void usart_smartcard_mode_disable(uint32_t usart_periph); +/* NACK enable in smartcard mode */ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph); +/* NACK disable in smartcard mode */ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph); + +/* IrDA communication */ +/* enable IrDA mode */ +void usart_irda_mode_enable(uint32_t usart_periph); +/* disable IrDA mode */ +void usart_irda_mode_disable(uint32_t usart_periph); +/* configure the peripheral clock prescaler */ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc); +/* configure IrDA low-power */ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp); + +/* hardware flow communication */ +/* configure hardware flow control RTS */ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig); +/* configure hardware flow control CTS */ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig); + +/* configure USART DMA for reception */ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd); +/* configure USART DMA for transmission */ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd); + +/* flag functions */ +/* get flag in STAT register */ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag); +/* clear flag in STAT register */ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag); + +/* interrupt functions */ +/* enable USART interrupt */ +void usart_interrupt_enable(uint32_t usart_periph, uint32_t int_flag); +/* disable USART interrupt */ +void usart_interrupt_disable(uint32_t usart_periph, uint32_t int_flag); +/* get USART interrupt and flag status */ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, uint32_t int_flag); +/* clear interrupt flag in STAT register */ +void usart_interrupt_flag_clear(uint32_t usart_periph, uint32_t flag); +int usart_write(uint32_t usart_periph, int ch); +uint8_t usart_read(uint32_t usart_periph); +#endif /* GD32VF103_USART_H */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/nmsis_gcc.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/nmsis_gcc.h new file mode 100755 index 000000000..9f7eb9d26 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/nmsis_gcc.h @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __NMSIS_GCC_H__ +#define __NMSIS_GCC_H__ +/*! + * @file nmsis_gcc.h + * @brief NMSIS compiler GCC header file + */ +#include +#include "riscv_encoding.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ +/** + * \defgroup NMSIS_Core_CompilerControl Compiler Control + * \ingroup NMSIS_Core + * \brief Compiler agnostic \#define symbols for generic c/c++ source code + * \details + * + * The NMSIS-Core provides the header file nmsis_compiler.h with consistent \#define symbols for generate C or C++ source files that should be compiler agnostic. + * Each NMSIS compliant compiler should support the functionality described in this section. + * + * The header file nmsis_compiler.h is also included by each Device Header File so that these definitions are available. + * @{ + */ +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* NMSIS compiler specific defines */ +/** \brief Pass information from the compiler to the assembler. */ +#ifndef __ASM + #define __ASM __asm +#endif + +/** \brief Recommend that function should be inlined by the compiler. */ +#ifndef __INLINE + #define __INLINE inline +#endif + +/** \brief Define a static function that may be inlined by the compiler. */ +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +/** \brief Define a static function that should be always inlined by the compiler. */ +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif + +/** \brief Inform the compiler that a function does not return. */ +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif + +/** \brief Inform that a variable shall be retained in executable image. */ +#ifndef __USED + #define __USED __attribute__((used)) +#endif + +/** \brief restrict pointer qualifier to enable additional optimizations. */ +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif + +/** \brief specified the vector size of the variable, measured in bytes */ +#ifndef __VECTOR_SIZE + #define __VECTOR_SIZE(x) __attribute__((vector_size(x))) +#endif + +/** \brief Request smallest possible alignment. */ +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif + +/** \brief Request smallest possible alignment for a structure. */ +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif + +/** \brief Request smallest possible alignment for a union. */ +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif + +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + /** \brief Packed struct for unaligned uint16_t write access */ + __PACKED_STRUCT T_UINT16_WRITE { + uint16_t v; + }; + #pragma GCC diagnostic pop + /** \brief Pointer for unaligned write of a uint16_t variable. */ + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif + +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + /** \brief Packed struct for unaligned uint16_t read access */ + __PACKED_STRUCT T_UINT16_READ { + uint16_t v; + }; + #pragma GCC diagnostic pop + /** \brief Pointer for unaligned read of a uint16_t variable. */ + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + /** \brief Packed struct for unaligned uint32_t write access */ + __PACKED_STRUCT T_UINT32_WRITE { + uint32_t v; + }; + #pragma GCC diagnostic pop + /** \brief Pointer for unaligned write of a uint32_t variable. */ + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif + +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + /** \brief Packed struct for unaligned uint32_t read access */ + __PACKED_STRUCT T_UINT32_READ { + uint32_t v; + }; + #pragma GCC diagnostic pop + /** \brief Pointer for unaligned read of a uint32_t variable. */ + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif + +/** \brief Minimum `x` bytes alignment for a variable. */ +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif + +/** \brief restrict pointer qualifier to enable additional optimizations. */ +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/** \brief Barrier to prevent compiler from reordering instructions. */ +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/** \brief provide the compiler with branch prediction information, the branch is usually true */ +#ifndef __USUALLY + #define __USUALLY(exp) __builtin_expect((exp), 1) +#endif + +/** \brief provide the compiler with branch prediction information, the branch is rarely true */ +#ifndef __RARELY + #define __RARELY(exp) __builtin_expect((exp), 0) +#endif + +/** \brief Use this attribute to indicate that the specified function is an interrupt handler. */ +#ifndef __INTERRUPT + #define __INTERRUPT __attribute__((interrupt)) +#endif + +/** @} */ /* End of Doxygen Group NMSIS_Core_CompilerControl */ + +/* IO definitions (access restrictions to peripheral registers) */ +/** + * \defgroup NMSIS_Core_PeriphAccess Peripheral Access + * \brief Naming conventions and optional features for accessing peripherals. + * + * The section below describes the naming conventions, requirements, and optional features + * for accessing device specific peripherals. + * Most of the rules also apply to the core peripherals. + * + * The **Device Header File ** contains typically these definition + * and also includes the core specific header files. + * + * @{ + */ +/** \brief Defines 'read only' permissions */ +#ifdef __cplusplus + #define __I volatile +#else + #define __I volatile const +#endif +/** \brief Defines 'write only' permissions */ +#define __O volatile +/** \brief Defines 'read / write' permissions */ +#define __IO volatile + +/* following defines should be used for structure members */ +/** \brief Defines 'read only' structure member permissions */ +#define __IM volatile const +/** \brief Defines 'write only' structure member permissions */ +#define __OM volatile +/** \brief Defines 'read/write' structure member permissions */ +#define __IOM volatile + +/** + * \brief Mask and shift a bit field value for use in a register bit range. + * \details The macro \ref _VAL2FLD uses the #define's _Pos and _Msk of the related bit + * field to shift bit-field values for assigning to a register. + * + * **Example**: + * \code + * ECLIC->CFG = _VAL2FLD(CLIC_CLICCFG_NLBIT, 3); + * \endcode + * \param[in] field Name of the register bit field. + * \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + * \return Masked and shifted value. + */ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + * \brief Mask and shift a register value to extract a bit filed value. + * \details The macro \ref _FLD2VAL uses the #define's _Pos and _Msk of the related bit + * field to extract the value of a bit field from a register. + * + * **Example**: + * \code + * nlbits = _FLD2VAL(CLIC_CLICCFG_NLBIT, ECLIC->CFG); + * \endcode + * \param[in] field Name of the register bit field. + * \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + * \return Masked and shifted bit field value. + */ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/** @} */ /* end of group NMSIS_Core_PeriphAccess */ + + +#ifdef __cplusplus +} +#endif +#endif /* __NMSIS_GCC_H__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_bits.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_bits.h new file mode 100755 index 000000000..fe0beb957 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_bits.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __RISCV_BITS_H__ +#define __RISCV_BITS_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +#if __riscv_xlen == 64 +# define SLL32 sllw +# define STORE sd +# define LOAD ld +# define LWU lwu +# define LOG_REGBYTES 3 +#else +# define SLL32 sll +# define STORE sw +# define LOAD lw +# define LWU lw +# define LOG_REGBYTES 2 +#endif /* __riscv_xlen */ + +#define REGBYTES (1 << LOG_REGBYTES) + +#if defined(__riscv_flen) +#if __riscv_flen == 64 +# define FPSTORE fsd +# define FPLOAD fld +# define LOG_FPREGBYTES 3 +#else +# define FPSTORE fsw +# define FPLOAD flw +# define LOG_FPREGBYTES 2 +#endif /* __riscv_flen == 64 */ +#define FPREGBYTES (1 << LOG_FPREGBYTES) +#endif /* __riscv_flen */ + +#define __rv_likely(x) __builtin_expect((x), 1) +#define __rv_unlikely(x) __builtin_expect((x), 0) + +#define __RV_ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) +#define __RV_ROUNDDOWN(a, b) ((a)/(b)*(b)) + +#define __RV_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define __RV_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define __RV_CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) + +#define __RV_EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) +#define __RV_INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) + +#ifdef __ASSEMBLY__ +#define _AC(X,Y) X +#define _AT(T,X) X +#else +#define __AC(X,Y) (X##Y) +#define _AC(X,Y) __AC(X,Y) +#define _AT(T,X) ((T)(X)) +#endif /* __ASSEMBLY__ */ + +#define _UL(x) (_AC(x, UL)) +#define _ULL(x) (_AC(x, ULL)) + +#define _BITUL(x) (_UL(1) << (x)) +#define _BITULL(x) (_ULL(1) << (x)) + +#define UL(x) (_UL(x)) +#define ULL(x) (_ULL(x)) + +#define STR(x) XSTR(x) +#define XSTR(x) #x +#define __STR(s) #s +#define STRINGIFY(s) __STR(s) + +#ifdef __cplusplus +} +#endif + +#endif /** __RISCV_BITS_H__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_encoding.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_encoding.h new file mode 100755 index 000000000..a0ec96845 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/include/riscv_encoding.h @@ -0,0 +1,690 @@ +/* + * Copyright (c) 2019 Nuclei Limited. 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 __RISCV_ENCODING_H__ +#define __RISCV_ENCODING_H__ + +#include "riscv_bits.h" +#ifdef __cplusplus + extern "C" { +#endif +/** + * \defgroup NMSIS_Core_CSR_Encoding Core CSR Encodings + * \ingroup NMSIS_Core + * \brief NMSIS Core CSR Encodings + * \details + * + * The following macros are used for CSR encodings + * @{ + */ +/* === Standard CSR bit mask === */ +#define MSTATUS_UIE 0x00000001 +#define MSTATUS_SIE 0x00000002 +#define MSTATUS_HIE 0x00000004 +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_UPIE 0x00000010 +#define MSTATUS_SPIE 0x00000020 +#define MSTATUS_HPIE 0x00000040 +#define MSTATUS_MPIE 0x00000080 +#define MSTATUS_SPP 0x00000100 +#define MSTATUS_MPP 0x00001800 +#define MSTATUS_FS 0x00006000 +#define MSTATUS_XS 0x00018000 +#define MSTATUS_MPRV 0x00020000 +#define MSTATUS_PUM 0x00040000 +#define MSTATUS_MXR 0x00080000 +#define MSTATUS_VM 0x1F000000 +#define MSTATUS32_SD 0x80000000 +#define MSTATUS64_SD 0x8000000000000000 + +#define MSTATUS_FS_INITIAL 0x00002000 +#define MSTATUS_FS_CLEAN 0x00004000 +#define MSTATUS_FS_DIRTY 0x00006000 + +#define SSTATUS_UIE 0x00000001 +#define SSTATUS_SIE 0x00000002 +#define SSTATUS_UPIE 0x00000010 +#define SSTATUS_SPIE 0x00000020 +#define SSTATUS_SPP 0x00000100 +#define SSTATUS_FS 0x00006000 +#define SSTATUS_XS 0x00018000 +#define SSTATUS_PUM 0x00040000 +#define SSTATUS32_SD 0x80000000 +#define SSTATUS64_SD 0x8000000000000000 + +#define CSR_MCACHE_CTL_IE 0x00000001 +#define CSR_MCACHE_CTL_DE 0x00010000 + +#define DCSR_XDEBUGVER (3U<<30) +#define DCSR_NDRESET (1<<29) +#define DCSR_FULLRESET (1<<28) +#define DCSR_EBREAKM (1<<15) +#define DCSR_EBREAKH (1<<14) +#define DCSR_EBREAKS (1<<13) +#define DCSR_EBREAKU (1<<12) +#define DCSR_STOPCYCLE (1<<10) +#define DCSR_STOPTIME (1<<9) +#define DCSR_CAUSE (7<<6) +#define DCSR_DEBUGINT (1<<5) +#define DCSR_HALT (1<<3) +#define DCSR_STEP (1<<2) +#define DCSR_PRV (3<<0) + +#define DCSR_CAUSE_NONE 0 +#define DCSR_CAUSE_SWBP 1 +#define DCSR_CAUSE_HWBP 2 +#define DCSR_CAUSE_DEBUGINT 3 +#define DCSR_CAUSE_STEP 4 +#define DCSR_CAUSE_HALT 5 + +#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) +#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) +#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) + +#define MCONTROL_SELECT (1<<19) +#define MCONTROL_TIMING (1<<18) +#define MCONTROL_ACTION (0x3f<<12) +#define MCONTROL_CHAIN (1<<11) +#define MCONTROL_MATCH (0xf<<7) +#define MCONTROL_M (1<<6) +#define MCONTROL_H (1<<5) +#define MCONTROL_S (1<<4) +#define MCONTROL_U (1<<3) +#define MCONTROL_EXECUTE (1<<2) +#define MCONTROL_STORE (1<<1) +#define MCONTROL_LOAD (1<<0) + +#define MCONTROL_TYPE_NONE 0 +#define MCONTROL_TYPE_MATCH 2 + +#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 +#define MCONTROL_ACTION_DEBUG_MODE 1 +#define MCONTROL_ACTION_TRACE_START 2 +#define MCONTROL_ACTION_TRACE_STOP 3 +#define MCONTROL_ACTION_TRACE_EMIT 4 + +#define MCONTROL_MATCH_EQUAL 0 +#define MCONTROL_MATCH_NAPOT 1 +#define MCONTROL_MATCH_GE 2 +#define MCONTROL_MATCH_LT 3 +#define MCONTROL_MATCH_MASK_LOW 4 +#define MCONTROL_MATCH_MASK_HIGH 5 + +#define MIP_SSIP (1 << IRQ_S_SOFT) +#define MIP_HSIP (1 << IRQ_H_SOFT) +#define MIP_MSIP (1 << IRQ_M_SOFT) +#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_HTIP (1 << IRQ_H_TIMER) +#define MIP_MTIP (1 << IRQ_M_TIMER) +#define MIP_SEIP (1 << IRQ_S_EXT) +#define MIP_HEIP (1 << IRQ_H_EXT) +#define MIP_MEIP (1 << IRQ_M_EXT) + +#define MIE_SSIE MIP_SSIP +#define MIE_HSIE MIP_HSIP +#define MIE_MSIE MIP_MSIP +#define MIE_STIE MIP_STIP +#define MIE_HTIE MIP_HTIP +#define MIE_MTIE MIP_MTIP +#define MIE_SEIE MIP_SEIP +#define MIE_HEIE MIP_HEIP +#define MIE_MEIE MIP_MEIP + +/* === P-ext CSR bit mask === */ + +#define UCODE_OV (0x1) + +/* === Nuclei custom CSR bit mask === */ + +#define WFE_WFE (0x1) +#define TXEVT_TXEVT (0x1) +#define SLEEPVALUE_SLEEPVALUE (0x1) + +#define MCOUNTINHIBIT_IR (1<<2) +#define MCOUNTINHIBIT_CY (1<<0) + +#define MILM_CTL_ILM_BPA (((1ULL<<((__riscv_xlen)-10))-1)<<10) +#define MILM_CTL_ILM_RWECC (1<<3) +#define MILM_CTL_ILM_ECC_EXCP_EN (1<<2) +#define MILM_CTL_ILM_ECC_EN (1<<1) +#define MILM_CTL_ILM_EN (1<<0) + +#define MDLM_CTL_DLM_BPA (((1ULL<<((__riscv_xlen)-10))-1)<<10) +#define MDLM_CTL_DLM_RWECC (1<<3) +#define MDLM_CTL_DLM_ECC_EXCP_EN (1<<2) +#define MDLM_CTL_DLM_ECC_EN (1<<1) +#define MDLM_CTL_DLM_EN (1<<0) + +#define MSUBM_PTYP (0x3<<8) +#define MSUBM_TYP (0x3<<6) + +#define MDCAUSE_MDCAUSE (0x3) + +#define MMISC_CTL_NMI_CAUSE_FFF (1<<9) +#define MMISC_CTL_MISALIGN (1<<6) +#define MMISC_CTL_BPU (1<<3) + +#define MCACHE_CTL_IC_EN (1<<0) +#define MCACHE_CTL_IC_SCPD_MOD (1<<1) +#define MCACHE_CTL_IC_ECC_EN (1<<2) +#define MCACHE_CTL_IC_ECC_EXCP_EN (1<<3) +#define MCACHE_CTL_IC_RWTECC (1<<4) +#define MCACHE_CTL_IC_RWDECC (1<<5) +#define MCACHE_CTL_DC_EN (1<<16) +#define MCACHE_CTL_DC_ECC_EN (1<<17) +#define MCACHE_CTL_DC_ECC_EXCP_EN (1<<18) +#define MCACHE_CTL_DC_RWTECC (1<<19) +#define MCACHE_CTL_DC_RWDECC (1<<20) + +#define MTVT2_MTVT2EN (1<<0) +#define MTVT2_COMMON_CODE_ENTRY (((1ULL<<((__riscv_xlen)-2))-1)<<2) + +#define MCFG_INFO_TEE (1<<0) +#define MCFG_INFO_ECC (1<<1) +#define MCFG_INFO_CLIC (1<<2) +#define MCFG_INFO_PLIC (1<<3) +#define MCFG_INFO_FIO (1<<4) +#define MCFG_INFO_PPI (1<<5) +#define MCFG_INFO_NICE (1<<6) +#define MCFG_INFO_ILM (1<<7) +#define MCFG_INFO_DLM (1<<8) +#define MCFG_INFO_ICACHE (1<<9) +#define MCFG_INFO_DCACHE (1<<10) + +#define MICFG_IC_SET (0xF<<0) +#define MICFG_IC_WAY (0x7<<4) +#define MICFG_IC_LSIZE (0x7<<7) +#define MICFG_IC_ECC (0x1<<10) +#define MICFG_ILM_SIZE (0x1F<<16) +#define MICFG_ILM_XONLY (0x1<<21) +#define MICFG_ILM_ECC (0x1<<22) + +#define MDCFG_DC_SET (0xF<<0) +#define MDCFG_DC_WAY (0x7<<4) +#define MDCFG_DC_LSIZE (0x7<<7) +#define MDCFG_DC_ECC (0x1<<10) +#define MDCFG_DLM_SIZE (0x1F<<16) +#define MDCFG_DLM_ECC (0x1<<21) + +#define MPPICFG_INFO_PPI_SIZE (0x1F<<1) +#define MPPICFG_INFO_PPI_BPA (((1ULL<<((__riscv_xlen)-10))-1)<<10) + +#define MFIOCFG_INFO_FIO_SIZE (0x1F<<1) +#define MFIOCFG_INFO_FIO_BPA (((1ULL<<((__riscv_xlen)-10))-1)<<10) + +#define MECC_LOCK_ECC_LOCK (0x1) + +#define MECC_CODE_CODE (0x1FF) +#define MECC_CODE_RAMID (0x1F<<16) +#define MECC_CODE_SRAMID (0x1F<<24) + +#define CCM_SUEN_SUEN (0x1<<0) +#define CCM_DATA_DATA (0x7<<0) +#define CCM_COMMAND_COMMAND (0x1F<<0) + +#define SIP_SSIP MIP_SSIP +#define SIP_STIP MIP_STIP + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +#define VM_MBARE 0 +#define VM_MBB 1 +#define VM_MBBID 2 +#define VM_SV32 8 +#define VM_SV39 9 +#define VM_SV48 10 + +#define IRQ_S_SOFT 1 +#define IRQ_H_SOFT 2 +#define IRQ_M_SOFT 3 +#define IRQ_S_TIMER 5 +#define IRQ_H_TIMER 6 +#define IRQ_M_TIMER 7 +#define IRQ_S_EXT 9 +#define IRQ_H_EXT 10 +#define IRQ_M_EXT 11 +#define IRQ_COP 12 +#define IRQ_HOST 13 + + +/* === FPU FRM Rounding Mode === */ +/** FPU Round to Nearest, ties to Even*/ +#define FRM_RNDMODE_RNE 0x0 +/** FPU Round Towards Zero */ +#define FRM_RNDMODE_RTZ 0x1 +/** FPU Round Down (towards -inf) */ +#define FRM_RNDMODE_RDN 0x2 +/** FPU Round Up (towards +inf) */ +#define FRM_RNDMODE_RUP 0x3 +/** FPU Round to nearest, ties to Max Magnitude */ +#define FRM_RNDMODE_RMM 0x4 +/** + * In instruction's rm, selects dynamic rounding mode. + * In Rounding Mode register, Invalid */ +#define FRM_RNDMODE_DYN 0x7 + +/* === FPU FFLAGS Accrued Exceptions === */ +/** FPU Inexact */ +#define FFLAGS_AE_NX (1<<0) +/** FPU Underflow */ +#define FFLAGS_AE_UF (1<<1) +/** FPU Overflow */ +#define FFLAGS_AE_OF (1<<2) +/** FPU Divide by Zero */ +#define FFLAGS_AE_DZ (1<<3) +/** FPU Invalid Operation */ +#define FFLAGS_AE_NV (1<<4) + +/** Floating Point Register f0-f31, eg. f0 -> FREG(0) */ +#define FREG(idx) f##idx + + +/* === PMP CFG Bits === */ +#define PMP_R 0x01 +#define PMP_W 0x02 +#define PMP_X 0x04 +#define PMP_A 0x18 +#define PMP_A_TOR 0x08 +#define PMP_A_NA4 0x10 +#define PMP_A_NAPOT 0x18 +#define PMP_L 0x80 + +#define PMP_SHIFT 2 +#define PMP_COUNT 16 + +// page table entry (PTE) fields +#define PTE_V 0x001 // Valid +#define PTE_R 0x002 // Read +#define PTE_W 0x004 // Write +#define PTE_X 0x008 // Execute +#define PTE_U 0x010 // User +#define PTE_G 0x020 // Global +#define PTE_A 0x040 // Accessed +#define PTE_D 0x080 // Dirty +#define PTE_SOFT 0x300 // Reserved for Software + +#define PTE_PPN_SHIFT 10 + +#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) + +#ifdef __riscv + +#ifdef __riscv64 +# define MSTATUS_SD MSTATUS64_SD +# define SSTATUS_SD SSTATUS64_SD +# define RISCV_PGLEVEL_BITS 9 +#else +# define MSTATUS_SD MSTATUS32_SD +# define SSTATUS_SD SSTATUS32_SD +# define RISCV_PGLEVEL_BITS 10 +#endif /* __riscv64 */ + +#define RISCV_PGSHIFT 12 +#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) + +#endif /* __riscv */ + +/** + * \defgroup NMSIS_Core_CSR_Registers Core CSR Registers + * \ingroup NMSIS_Core + * \brief NMSIS Core CSR Register Definitions + * \details + * + * The following macros are used for CSR Register Defintions. + * @{ + */ +/* === Standard RISC-V CSR Registers === */ +#define CSR_USTATUS 0x0 +#define CSR_FFLAGS 0x1 +#define CSR_FRM 0x2 +#define CSR_FCSR 0x3 +#define CSR_CYCLE 0xc00 +#define CSR_TIME 0xc01 +#define CSR_INSTRET 0xc02 +#define CSR_HPMCOUNTER3 0xc03 +#define CSR_HPMCOUNTER4 0xc04 +#define CSR_HPMCOUNTER5 0xc05 +#define CSR_HPMCOUNTER6 0xc06 +#define CSR_HPMCOUNTER7 0xc07 +#define CSR_HPMCOUNTER8 0xc08 +#define CSR_HPMCOUNTER9 0xc09 +#define CSR_HPMCOUNTER10 0xc0a +#define CSR_HPMCOUNTER11 0xc0b +#define CSR_HPMCOUNTER12 0xc0c +#define CSR_HPMCOUNTER13 0xc0d +#define CSR_HPMCOUNTER14 0xc0e +#define CSR_HPMCOUNTER15 0xc0f +#define CSR_HPMCOUNTER16 0xc10 +#define CSR_HPMCOUNTER17 0xc11 +#define CSR_HPMCOUNTER18 0xc12 +#define CSR_HPMCOUNTER19 0xc13 +#define CSR_HPMCOUNTER20 0xc14 +#define CSR_HPMCOUNTER21 0xc15 +#define CSR_HPMCOUNTER22 0xc16 +#define CSR_HPMCOUNTER23 0xc17 +#define CSR_HPMCOUNTER24 0xc18 +#define CSR_HPMCOUNTER25 0xc19 +#define CSR_HPMCOUNTER26 0xc1a +#define CSR_HPMCOUNTER27 0xc1b +#define CSR_HPMCOUNTER28 0xc1c +#define CSR_HPMCOUNTER29 0xc1d +#define CSR_HPMCOUNTER30 0xc1e +#define CSR_HPMCOUNTER31 0xc1f +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_SBADADDR 0x143 +#define CSR_SIP 0x144 +#define CSR_SPTBR 0x180 +#define CSR_MSTATUS 0x300 +#define CSR_MISA 0x301 +#define CSR_MEDELEG 0x302 +#define CSR_MIDELEG 0x303 +#define CSR_MIE 0x304 +#define CSR_MTVEC 0x305 +#define CSR_MCOUNTEREN 0x306 +#define CSR_MSCRATCH 0x340 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 +#define CSR_MBADADDR 0x343 +#define CSR_MTVAL 0x343 +#define CSR_MIP 0x344 +#define CSR_PMPCFG0 0x3a0 +#define CSR_PMPCFG1 0x3a1 +#define CSR_PMPCFG2 0x3a2 +#define CSR_PMPCFG3 0x3a3 +#define CSR_PMPADDR0 0x3b0 +#define CSR_PMPADDR1 0x3b1 +#define CSR_PMPADDR2 0x3b2 +#define CSR_PMPADDR3 0x3b3 +#define CSR_PMPADDR4 0x3b4 +#define CSR_PMPADDR5 0x3b5 +#define CSR_PMPADDR6 0x3b6 +#define CSR_PMPADDR7 0x3b7 +#define CSR_PMPADDR8 0x3b8 +#define CSR_PMPADDR9 0x3b9 +#define CSR_PMPADDR10 0x3ba +#define CSR_PMPADDR11 0x3bb +#define CSR_PMPADDR12 0x3bc +#define CSR_PMPADDR13 0x3bd +#define CSR_PMPADDR14 0x3be +#define CSR_PMPADDR15 0x3bf +#define CSR_TSELECT 0x7a0 +#define CSR_TDATA1 0x7a1 +#define CSR_TDATA2 0x7a2 +#define CSR_TDATA3 0x7a3 +#define CSR_DCSR 0x7b0 +#define CSR_DPC 0x7b1 +#define CSR_DSCRATCH 0x7b2 +#define CSR_MCYCLE 0xb00 +#define CSR_MINSTRET 0xb02 +#define CSR_MHPMCOUNTER3 0xb03 +#define CSR_MHPMCOUNTER4 0xb04 +#define CSR_MHPMCOUNTER5 0xb05 +#define CSR_MHPMCOUNTER6 0xb06 +#define CSR_MHPMCOUNTER7 0xb07 +#define CSR_MHPMCOUNTER8 0xb08 +#define CSR_MHPMCOUNTER9 0xb09 +#define CSR_MHPMCOUNTER10 0xb0a +#define CSR_MHPMCOUNTER11 0xb0b +#define CSR_MHPMCOUNTER12 0xb0c +#define CSR_MHPMCOUNTER13 0xb0d +#define CSR_MHPMCOUNTER14 0xb0e +#define CSR_MHPMCOUNTER15 0xb0f +#define CSR_MHPMCOUNTER16 0xb10 +#define CSR_MHPMCOUNTER17 0xb11 +#define CSR_MHPMCOUNTER18 0xb12 +#define CSR_MHPMCOUNTER19 0xb13 +#define CSR_MHPMCOUNTER20 0xb14 +#define CSR_MHPMCOUNTER21 0xb15 +#define CSR_MHPMCOUNTER22 0xb16 +#define CSR_MHPMCOUNTER23 0xb17 +#define CSR_MHPMCOUNTER24 0xb18 +#define CSR_MHPMCOUNTER25 0xb19 +#define CSR_MHPMCOUNTER26 0xb1a +#define CSR_MHPMCOUNTER27 0xb1b +#define CSR_MHPMCOUNTER28 0xb1c +#define CSR_MHPMCOUNTER29 0xb1d +#define CSR_MHPMCOUNTER30 0xb1e +#define CSR_MHPMCOUNTER31 0xb1f +#define CSR_MUCOUNTEREN 0x320 +#define CSR_MSCOUNTEREN 0x321 +#define CSR_MHPMEVENT3 0x323 +#define CSR_MHPMEVENT4 0x324 +#define CSR_MHPMEVENT5 0x325 +#define CSR_MHPMEVENT6 0x326 +#define CSR_MHPMEVENT7 0x327 +#define CSR_MHPMEVENT8 0x328 +#define CSR_MHPMEVENT9 0x329 +#define CSR_MHPMEVENT10 0x32a +#define CSR_MHPMEVENT11 0x32b +#define CSR_MHPMEVENT12 0x32c +#define CSR_MHPMEVENT13 0x32d +#define CSR_MHPMEVENT14 0x32e +#define CSR_MHPMEVENT15 0x32f +#define CSR_MHPMEVENT16 0x330 +#define CSR_MHPMEVENT17 0x331 +#define CSR_MHPMEVENT18 0x332 +#define CSR_MHPMEVENT19 0x333 +#define CSR_MHPMEVENT20 0x334 +#define CSR_MHPMEVENT21 0x335 +#define CSR_MHPMEVENT22 0x336 +#define CSR_MHPMEVENT23 0x337 +#define CSR_MHPMEVENT24 0x338 +#define CSR_MHPMEVENT25 0x339 +#define CSR_MHPMEVENT26 0x33a +#define CSR_MHPMEVENT27 0x33b +#define CSR_MHPMEVENT28 0x33c +#define CSR_MHPMEVENT29 0x33d +#define CSR_MHPMEVENT30 0x33e +#define CSR_MHPMEVENT31 0x33f +#define CSR_MVENDORID 0xf11 +#define CSR_MARCHID 0xf12 +#define CSR_MIMPID 0xf13 +#define CSR_MHARTID 0xf14 +#define CSR_CYCLEH 0xc80 +#define CSR_TIMEH 0xc81 +#define CSR_INSTRETH 0xc82 +#define CSR_HPMCOUNTER3H 0xc83 +#define CSR_HPMCOUNTER4H 0xc84 +#define CSR_HPMCOUNTER5H 0xc85 +#define CSR_HPMCOUNTER6H 0xc86 +#define CSR_HPMCOUNTER7H 0xc87 +#define CSR_HPMCOUNTER8H 0xc88 +#define CSR_HPMCOUNTER9H 0xc89 +#define CSR_HPMCOUNTER10H 0xc8a +#define CSR_HPMCOUNTER11H 0xc8b +#define CSR_HPMCOUNTER12H 0xc8c +#define CSR_HPMCOUNTER13H 0xc8d +#define CSR_HPMCOUNTER14H 0xc8e +#define CSR_HPMCOUNTER15H 0xc8f +#define CSR_HPMCOUNTER16H 0xc90 +#define CSR_HPMCOUNTER17H 0xc91 +#define CSR_HPMCOUNTER18H 0xc92 +#define CSR_HPMCOUNTER19H 0xc93 +#define CSR_HPMCOUNTER20H 0xc94 +#define CSR_HPMCOUNTER21H 0xc95 +#define CSR_HPMCOUNTER22H 0xc96 +#define CSR_HPMCOUNTER23H 0xc97 +#define CSR_HPMCOUNTER24H 0xc98 +#define CSR_HPMCOUNTER25H 0xc99 +#define CSR_HPMCOUNTER26H 0xc9a +#define CSR_HPMCOUNTER27H 0xc9b +#define CSR_HPMCOUNTER28H 0xc9c +#define CSR_HPMCOUNTER29H 0xc9d +#define CSR_HPMCOUNTER30H 0xc9e +#define CSR_HPMCOUNTER31H 0xc9f +#define CSR_MCYCLEH 0xb80 +#define CSR_MINSTRETH 0xb82 +#define CSR_MHPMCOUNTER3H 0xb83 +#define CSR_MHPMCOUNTER4H 0xb84 +#define CSR_MHPMCOUNTER5H 0xb85 +#define CSR_MHPMCOUNTER6H 0xb86 +#define CSR_MHPMCOUNTER7H 0xb87 +#define CSR_MHPMCOUNTER8H 0xb88 +#define CSR_MHPMCOUNTER9H 0xb89 +#define CSR_MHPMCOUNTER10H 0xb8a +#define CSR_MHPMCOUNTER11H 0xb8b +#define CSR_MHPMCOUNTER12H 0xb8c +#define CSR_MHPMCOUNTER13H 0xb8d +#define CSR_MHPMCOUNTER14H 0xb8e +#define CSR_MHPMCOUNTER15H 0xb8f +#define CSR_MHPMCOUNTER16H 0xb90 +#define CSR_MHPMCOUNTER17H 0xb91 +#define CSR_MHPMCOUNTER18H 0xb92 +#define CSR_MHPMCOUNTER19H 0xb93 +#define CSR_MHPMCOUNTER20H 0xb94 +#define CSR_MHPMCOUNTER21H 0xb95 +#define CSR_MHPMCOUNTER22H 0xb96 +#define CSR_MHPMCOUNTER23H 0xb97 +#define CSR_MHPMCOUNTER24H 0xb98 +#define CSR_MHPMCOUNTER25H 0xb99 +#define CSR_MHPMCOUNTER26H 0xb9a +#define CSR_MHPMCOUNTER27H 0xb9b +#define CSR_MHPMCOUNTER28H 0xb9c +#define CSR_MHPMCOUNTER29H 0xb9d +#define CSR_MHPMCOUNTER30H 0xb9e +#define CSR_MHPMCOUNTER31H 0xb9f + +/* === TEE CSR Registers === */ +#define CSR_SPMPCFG0 0x1A0 +#define CSR_SPMPCFG1 0x1A1 +#define CSR_SPMPCFG2 0x1A2 +#define CSR_SPMPCFG3 0x1A3 +#define CSR_SPMPADDR0 0x1B0 +#define CSR_SPMPADDR1 0x1B1 +#define CSR_SPMPADDR2 0x1B2 +#define CSR_SPMPADDR3 0x1B3 +#define CSR_SPMPADDR4 0x1B4 +#define CSR_SPMPADDR5 0x1B5 +#define CSR_SPMPADDR6 0x1B6 +#define CSR_SPMPADDR7 0x1B7 +#define CSR_SPMPADDR8 0x1B8 +#define CSR_SPMPADDR9 0x1B9 +#define CSR_SPMPADDR10 0x1BA +#define CSR_SPMPADDR11 0x1BB +#define CSR_SPMPADDR12 0x1BC +#define CSR_SPMPADDR13 0x1BD +#define CSR_SPMPADDR14 0x1BE +#define CSR_SPMPADDR15 0x1BF + +#define CSR_JALSNXTI 0x947 +#define CSR_STVT2 0x948 +#define CSR_PUSHSCAUSE 0x949 +#define CSR_PUSHSEPC 0x94A + + +/* === CLIC CSR Registers === */ +#define CSR_MTVT 0x307 +#define CSR_MNXTI 0x345 +#define CSR_MINTSTATUS 0x346 +#define CSR_MSCRATCHCSW 0x348 +#define CSR_MSCRATCHCSWL 0x349 +#define CSR_MCLICBASE 0x350 + +/* === P-Extension Registers === */ +#define CSR_UCODE 0x801 + +/* === Nuclei custom CSR Registers === */ +#define CSR_MCOUNTINHIBIT 0x320 +#define CSR_MILM_CTL 0x7C0 +#define CSR_MDLM_CTL 0x7C1 +#define CSR_MECC_CODE 0x7C2 +#define CSR_MNVEC 0x7C3 +#define CSR_MSUBM 0x7C4 +#define CSR_MDCAUSE 0x7C9 +#define CSR_MCACHE_CTL 0x7CA +#define CSR_MMISC_CTL 0x7D0 +#define CSR_MSAVESTATUS 0x7D6 +#define CSR_MSAVEEPC1 0x7D7 +#define CSR_MSAVECAUSE1 0x7D8 +#define CSR_MSAVEEPC2 0x7D9 +#define CSR_MSAVECAUSE2 0x7DA +#define CSR_MSAVEDCAUSE1 0x7DB +#define CSR_MSAVEDCAUSE2 0x7DC +#define CSR_MTLB_CTL 0x7DD +#define CSR_MECC_LOCK 0x7DE +#define CSR_MFP16MODE 0x7E2 +#define CSR_LSTEPFORC 0x7E9 +#define CSR_PUSHMSUBM 0x7EB +#define CSR_MTVT2 0x7EC +#define CSR_JALMNXTI 0x7ED +#define CSR_PUSHMCAUSE 0x7EE +#define CSR_PUSHMEPC 0x7EF +#define CSR_MPPICFG_INFO 0x7F0 +#define CSR_MFIOCFG_INFO 0x7F1 +#define CSR_MSMPCFG_INFO 0x7F7 +#define CSR_SLEEPVALUE 0x811 +#define CSR_TXEVT 0x812 +#define CSR_WFE 0x810 +#define CSR_MICFG_INFO 0xFC0 +#define CSR_MDCFG_INFO 0xFC1 +#define CSR_MCFG_INFO 0xFC2 +#define CSR_MTLBCFG_INFO 0xFC3 + +/* === Nuclei CCM Registers === */ +#define CSR_CCM_MBEGINADDR 0x7CB +#define CSR_CCM_MCOMMAND 0x7CC +#define CSR_CCM_MDATA 0x7CD +#define CSR_CCM_SUEN 0x7CE +#define CSR_CCM_SBEGINADDR 0x5CB +#define CSR_CCM_SCOMMAND 0x5CC +#define CSR_CCM_SDATA 0x5CD +#define CSR_CCM_UBEGINADDR 0x4CB +#define CSR_CCM_UCOMMAND 0x4CC +#define CSR_CCM_UDATA 0x4CD +#define CSR_CCM_FPIPE 0x4CF + +/** @} */ /** End of Doxygen Group NMSIS_Core_CSR_Registers **/ + +/* Exception Code in MCAUSE CSR */ +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FAULT_FETCH 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_FAULT_LOAD 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_FAULT_STORE 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb + +/* Exception Subcode in MDCAUSE CSR */ +#define DCAUSE_FAULT_FETCH_PMP 0x1 +#define DCAUSE_FAULT_FETCH_INST 0x2 + +#define DCAUSE_FAULT_LOAD_PMP 0x1 +#define DCAUSE_FAULT_LOAD_INST 0x2 +#define DCAUSE_FAULT_LOAD_NICE 0x3 + +#define DCAUSE_FAULT_STORE_PMP 0x1 +#define DCAUSE_FAULT_STORE_INST 0x2 + +/** @} */ /** End of Doxygen Group NMSIS_Core_CSR_Encoding **/ + +#ifdef __cplusplus +} +#endif +#endif /* __RISCV_ENCODING_H__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Kconfig b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Kconfig new file mode 100755 index 000000000..8b1378917 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Kconfig @@ -0,0 +1 @@ + diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Makefile b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Makefile new file mode 100755 index 000000000..14e791c04 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := gd32vf103_soc.c gd32vf103_rcu.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_rcu.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_rcu.c new file mode 100755 index 000000000..49edb5815 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_rcu.c @@ -0,0 +1,1103 @@ +/*! + \file gd32vf103_rcu.c + \brief RCU driver + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_rcu.h" + + +/*! + \brief deinitialize the RCU + \param[in] none + \param[out] none + \retval none +*/ +void rcu_deinit(void) +{ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + rcu_osci_stab_wait(RCU_IRC8M); + + /* reset CFG0 register */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_CKOUT0SEL | RCU_CFG0_ADCPSC_2 | RCU_CFG0_PLLMF_4); + /* reset CTL register */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + RCU_CTL &= ~RCU_CTL_HXTALBPS; + RCU_CTL &= ~(RCU_CTL_PLL1EN | RCU_CTL_PLL2EN); + /* reset INT and CFG1 register */ + RCU_INT = 0x00ff0000U; + RCU_CFG1 &= ~(RCU_CFG1_PREDV0 | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PLL2MF | + RCU_CFG1_PREDV0SEL | RCU_CFG1_I2S1SEL | RCU_CFG1_I2S2SEL); +} + +/*! + \brief enable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x=A,B,C,D,E): GPIO ports clock + \arg RCU_AF : alternate function clock + \arg RCU_CRC: CRC clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_USBFS: USBFS clock + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x=0,1,2,3,4,5,6): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x=0,1,2): SPI clock + \arg RCU_USARTx (x=0,1,2): USART clock + \arg RCU_UARTx (x=3,4): UART clock + \arg RCU_I2Cx (x=0,1): I2C clock + \arg RCU_CANx (x=0,1): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x=0,1): ADC clock + \arg RCU_BKPI: BKP interface clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_enable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x=A,B,C,D,E): GPIO ports clock + \arg RCU_AF: alternate function clock + \arg RCU_CRC: CRC clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_USBFS: USBFS clock + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x=0,1,2,3,4,5,6): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x=0,1,2): SPI clock + \arg RCU_USARTx (x=0,1,2): USART clock + \arg RCU_UARTx (x=3,4): UART clock + \arg RCU_I2Cx (x=0,1): I2C clock + \arg RCU_CANx (x=0,1): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x=0,1): ADC clock + \arg RCU_BKPI: BKP interface clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_disable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief enable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM_SLP: SRAM clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM_SLP: SRAM clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief reset the peripherals + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x=A,B,C,D,E): reset GPIO ports + \arg RCU_AFRST : reset alternate function clock + \arg RCU_USBFSRST: reset USBFS + \arg RCU_TIMERxRST (x=0,1,2,3,4,5,6): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x=0,1,2): reset SPI + \arg RCU_USARTxRST (x=0,1,2): reset USART + \arg RCU_UARTxRST (x=3,4): reset UART + \arg RCU_I2CxRST (x=0,1): reset I2C + \arg RCU_CANxRST (x=0,1): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCxRST (x=0,1): reset ADC + \arg RCU_BKPIRST: reset BKPI + \param[out] none + \retval none +*/ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) |= BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief disable reset the peripheral + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x=A,B,C,D,E): reset GPIO ports + \arg RCU_AFRST : reset alternate function clock + \arg RCU_USBFSRST: reset USBFS + \arg RCU_TIMERxRST (x=0,1,2,3,4,5,6): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x=0,1,2): reset SPI + \arg RCU_USARTxRST (x=0,1,2): reset USART + \arg RCU_UARTxRST (x=3,4): reset UART + \arg RCU_I2CxRST (x=0,1): reset I2C + \arg RCU_CANxRST (x=0,1): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCxRST (x=0,1): reset ADC + \arg RCU_BKPIRST: reset BKPI + \param[out] none + \retval none +*/ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) &= ~BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief reset the BKP domain + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_enable(void) +{ + RCU_BDCTL |= RCU_BDCTL_BKPRST; +} + +/*! + \brief disable the BKP domain reset + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_disable(void) +{ + RCU_BDCTL &= ~RCU_BDCTL_BKPRST; +} + +/*! + \brief configure the system clock source + \param[in] ck_sys: system clock source select + only one parameter can be selected which is shown as below: + \arg RCU_CKSYSSRC_IRC8M: select CK_IRC8M as the CK_SYS source + \arg RCU_CKSYSSRC_HXTAL: select CK_HXTAL as the CK_SYS source + \arg RCU_CKSYSSRC_PLL: select CK_PLL as the CK_SYS source + \param[out] none + \retval none +*/ +void rcu_system_clock_source_config(uint32_t ck_sys) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the SCS bits and set according to ck_sys */ + reg &= ~RCU_CFG0_SCS; + RCU_CFG0 = (reg | ck_sys); +} + +/*! + \brief get the system clock source + \param[in] none + \param[out] none + \retval which clock is selected as CK_SYS source + \arg RCU_SCSS_IRC8M: CK_IRC8M is selected as the CK_SYS source + \arg RCU_SCSS_HXTAL: CK_HXTAL is selected as the CK_SYS source + \arg RCU_SCSS_PLL: CK_PLL is selected as the CK_SYS source +*/ +uint32_t rcu_system_clock_source_get(void) +{ + return (RCU_CFG0 & RCU_CFG0_SCSS); +} + +/*! + \brief configure the AHB clock prescaler selection + \param[in] ck_ahb: AHB clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_AHB_CKSYS_DIVx, x=1, 2, 4, 8, 16, 64, 128, 256, 512 + \param[out] none + \retval none +*/ +void rcu_ahb_clock_config(uint32_t ck_ahb) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the AHBPSC bits and set according to ck_ahb */ + reg &= ~RCU_CFG0_AHBPSC; + RCU_CFG0 = (reg | ck_ahb); +} + +/*! + \brief configure the APB1 clock prescaler selection + \param[in] ck_apb1: APB1 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB1_CKAHB_DIV1: select CK_AHB as CK_APB1 + \arg RCU_APB1_CKAHB_DIV2: select CK_AHB/2 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV4: select CK_AHB/4 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV8: select CK_AHB/8 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV16: select CK_AHB/16 as CK_APB1 + \param[out] none + \retval none +*/ +void rcu_apb1_clock_config(uint32_t ck_apb1) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the APB1PSC and set according to ck_apb1 */ + reg &= ~RCU_CFG0_APB1PSC; + RCU_CFG0 = (reg | ck_apb1); +} + +/*! + \brief configure the APB2 clock prescaler selection + \param[in] ck_apb2: APB2 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB2_CKAHB_DIV1: select CK_AHB as CK_APB2 + \arg RCU_APB2_CKAHB_DIV2: select CK_AHB/2 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV4: select CK_AHB/4 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV8: select CK_AHB/8 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV16: select CK_AHB/16 as CK_APB2 + \param[out] none + \retval none +*/ +void rcu_apb2_clock_config(uint32_t ck_apb2) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the APB2PSC and set according to ck_apb2 */ + reg &= ~RCU_CFG0_APB2PSC; + RCU_CFG0 = (reg | ck_apb2); +} + +/*! + \brief configure the CK_OUT0 clock source + \param[in] ckout0_src: CK_OUT0 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CKOUT0SRC_NONE: no clock selected + \arg RCU_CKOUT0SRC_CKSYS: system clock selected + \arg RCU_CKOUT0SRC_IRC8M: high speed 8M internal oscillator clock selected + \arg RCU_CKOUT0SRC_HXTAL: HXTAL selected + \arg RCU_CKOUT0SRC_CKPLL_DIV2: CK_PLL/2 selected + \arg RCU_CKOUT0SRC_CKPLL1: CK_PLL1 selected + \arg RCU_CKOUT0SRC_CKPLL2_DIV2: CK_PLL2/2 selected + \arg RCU_CKOUT0SRC_EXT1: EXT1 selected + \arg RCU_CKOUT0SRC_CKPLL2: PLL2 selected + \param[out] none + \retval none +*/ +void rcu_ckout0_config(uint32_t ckout0_src) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the CKOUT0SRC, set according to ckout0_src */ + reg &= ~RCU_CFG0_CKOUT0SEL; + RCU_CFG0 = (reg | ckout0_src); +} + +/*! + \brief configure the main PLL clock + \param[in] pll_src: PLL clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PLLSRC_IRC8M_DIV2: IRC8M/2 clock selected as source clock of PLL + \arg RCU_PLLSRC_HXTAL: HXTAL selected as source clock of PLL + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL_MULx (x = 2..14, 6.5, 16..32) + \param[out] none + \retval none +*/ +void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul) +{ + uint32_t reg = 0U; + + reg = RCU_CFG0; + + /* PLL clock source and multiplication factor configuration */ + reg &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + reg |= (pll_src | pll_mul); + + RCU_CFG0 = reg; +} + +/*! + \brief configure the PREDV0 division factor and clock source + \param[in] predv0_source: PREDV0 input clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PREDV0SRC_HXTAL: HXTAL selected as PREDV0 input source clock + \arg RCU_PREDV0SRC_CKPLL1: CK_PLL1 selected as PREDV0 input source clock + \param[in] predv0_div: PREDV0 division factor + only one parameter can be selected which is shown as below: + \arg RCU_PREDV0_DIVx, x = 1..16 + \param[out] none + \retval none +*/ +void rcu_predv0_config(uint32_t predv0_source, uint32_t predv0_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + /* reset PREDV0SEL and PREDV0 bits */ + reg &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV0); + /* set the PREDV0SEL and PREDV0 division factor */ + reg |= (predv0_source | predv0_div); + + RCU_CFG1 = reg; +} + +/*! + \brief configure the PREDV1 division factor + \param[in] predv1_div: PREDV1 division factor + only one parameter can be selected which is shown as below: + \arg RCU_PREDV1_DIVx, x = 1..16 + \param[out] none + \retval none +*/ +void rcu_predv1_config(uint32_t predv1_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + /* reset the PREDV1 bits */ + reg &= ~RCU_CFG1_PREDV1; + /* set the PREDV1 division factor */ + reg |= predv1_div; + + RCU_CFG1 = reg; +} + +/*! + \brief configure the PLL1 clock + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL1_MULx (x = 8..16, 20) + \param[out] none + \retval none +*/ +void rcu_pll1_config(uint32_t pll_mul) +{ + RCU_CFG1 &= ~RCU_CFG1_PLL1MF; + RCU_CFG1 |= pll_mul; +} + +/*! + \brief configure the PLL2 clock + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL2_MULx (x = 8..16, 20) + \param[out] none + \retval none +*/ +void rcu_pll2_config(uint32_t pll_mul) +{ + RCU_CFG1 &= ~RCU_CFG1_PLL2MF; + RCU_CFG1 |= pll_mul; +} + +/*! + \brief configure the ADC prescaler factor + \param[in] adc_psc: ADC prescaler factor + only one parameter can be selected which is shown as below: + \arg RCU_CKADC_CKAPB2_DIV2: ADC prescaler select CK_APB2/2 + \arg RCU_CKADC_CKAPB2_DIV4: ADC prescaler select CK_APB2/4 + \arg RCU_CKADC_CKAPB2_DIV6: ADC prescaler select CK_APB2/6 + \arg RCU_CKADC_CKAPB2_DIV8: ADC prescaler select CK_APB2/8 + \arg RCU_CKADC_CKAPB2_DIV12: ADC prescaler select CK_APB2/12 + \arg RCU_CKADC_CKAPB2_DIV16: ADC prescaler select CK_APB2/16 + \param[out] none + \retval none +*/ +void rcu_adc_clock_config(uint32_t adc_psc) +{ + uint32_t reg0; + + /* reset the ADCPSC bits */ + reg0 = RCU_CFG0; + reg0 &= ~(RCU_CFG0_ADCPSC_2 | RCU_CFG0_ADCPSC); + + /* set the ADC prescaler factor */ + switch (adc_psc) { + case RCU_CKADC_CKAPB2_DIV2: + case RCU_CKADC_CKAPB2_DIV4: + case RCU_CKADC_CKAPB2_DIV6: + case RCU_CKADC_CKAPB2_DIV8: + reg0 |= (adc_psc << 14); + break; + + case RCU_CKADC_CKAPB2_DIV12: + case RCU_CKADC_CKAPB2_DIV16: + adc_psc &= ~BIT(2); + reg0 |= (adc_psc << 14 | RCU_CFG0_ADCPSC_2); + break; + + default: + break; + } + + /* set the register */ + RCU_CFG0 = reg0; +} + +/*! + \brief configure the USBFS prescaler factor + \param[in] usb_psc: USB prescaler factor + only one parameter can be selected which is shown as below: + \arg RCU_CKUSB_CKPLL_DIV1_5: USBFS prescaler select CK_PLL/1.5 + \arg RCU_CKUSB_CKPLL_DIV1: USBFS prescaler select CK_PLL/1 + \arg RCU_CKUSB_CKPLL_DIV2_5: USBFS prescaler select CK_PLL/2.5 + \arg RCU_CKUSB_CKPLL_DIV2: USBFS prescaler select CK_PLL/2 + \param[out] none + \retval none +*/ +void rcu_usb_clock_config(uint32_t usb_psc) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* configure the USBFS prescaler factor */ + reg &= ~RCU_CFG0_USBFSPSC; + RCU_CFG0 = (reg | usb_psc); +} + +/*! + \brief configure the RTC clock source selection + \param[in] rtc_clock_source: RTC clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_RTCSRC_NONE: no clock selected + \arg RCU_RTCSRC_LXTAL: CK_LXTAL selected as RTC source clock + \arg RCU_RTCSRC_IRC40K: CK_IRC40K selected as RTC source clock + \arg RCU_RTCSRC_HXTAL_DIV_128: CK_HXTAL/128 selected as RTC source clock + \param[out] none + \retval none +*/ +void rcu_rtc_clock_config(uint32_t rtc_clock_source) +{ + uint32_t reg; + + reg = RCU_BDCTL; + /* reset the RTCSRC bits and set according to rtc_clock_source */ + reg &= ~RCU_BDCTL_RTCSRC; + RCU_BDCTL = (reg | rtc_clock_source); +} + +/*! + \brief configure the I2S1 clock source selection + \param[in] i2s_clock_source: I2S1 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2S1SRC_CKSYS: System clock selected as I2S1 source clock + \arg RCU_I2S1SRC_CKPLL2_MUL2: CK_PLL2x2 selected as I2S1 source clock + \param[out] none + \retval none +*/ +void rcu_i2s1_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the I2S1SEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG1_I2S1SEL; + RCU_CFG1 = (reg | i2s_clock_source); +} + +/*! + \brief configure the I2S2 clock source selection + \param[in] i2s_clock_source: I2S2 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2S2SRC_CKSYS: system clock selected as I2S2 source clock + \arg RCU_I2S2SRC_CKPLL2_MUL2: CK_PLL2x2 selected as I2S2 source clock + \param[out] none + \retval none +*/ +void rcu_i2s2_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the I2S2SEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG1_I2S2SEL; + RCU_CFG1 = (reg | i2s_clock_source); +} + +/*! + \brief get the clock stabilization and periphral reset flags + \param[in] flag: the clock stabilization and periphral reset flags, refer to rcu_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_FLAG_IRC8MSTB: IRC8M stabilization flag + \arg RCU_FLAG_HXTALSTB: HXTAL stabilization flag + \arg RCU_FLAG_PLLSTB: PLL stabilization flag + \arg RCU_FLAG_PLL1STB: PLL1 stabilization flag + \arg RCU_FLAG_PLL2STB: PLL2 stabilization flag + \arg RCU_FLAG_LXTALSTB: LXTAL stabilization flag + \arg RCU_FLAG_IRC40KSTB: IRC40K stabilization flag + \arg RCU_FLAG_EPRST: external PIN reset flag + \arg RCU_FLAG_PORRST: power reset flag + \arg RCU_FLAG_SWRST: software reset flag + \arg RCU_FLAG_FWDGTRST: free watchdog timer reset flag + \arg RCU_FLAG_WWDGTRST: window watchdog timer reset flag + \arg RCU_FLAG_LPRST: low-power reset flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rcu_flag_get(rcu_flag_enum flag) +{ + /* get the rcu flag */ + if (RESET != (RCU_REG_VAL(flag) & BIT(RCU_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear all the reset flag + \param[in] none + \param[out] none + \retval none +*/ +void rcu_all_reset_flag_clear(void) +{ + RCU_RSTSCK |= RCU_RSTSCK_RSTFC; +} + +/*! + \brief get the clock stabilization interrupt and ckm flags + \param[in] int_flag: interrupt and ckm flags, refer to rcu_int_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC40KSTB: IRC40K stabilization interrupt flag + \arg RCU_INT_FLAG_LXTALSTB: LXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_IRC8MSTB: IRC8M stabilization interrupt flag + \arg RCU_INT_FLAG_HXTALSTB: HXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_PLLSTB: PLL stabilization interrupt flag + \arg RCU_INT_FLAG_PLL1STB: PLL1 stabilization interrupt flag + \arg RCU_INT_FLAG_PLL2STB: PLL2 stabilization interrupt flag + \arg RCU_INT_FLAG_CKM: HXTAL clock stuck interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag) +{ + /* get the rcu interrupt flag */ + if (RESET != (RCU_REG_VAL(int_flag) & BIT(RCU_BIT_POS(int_flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear the interrupt flags + \param[in] int_flag_clear: clock stabilization and stuck interrupt flags clear, refer to rcu_int_flag_clear_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC40KSTB_CLR: IRC40K stabilization interrupt flag clear + \arg RCU_INT_FLAG_LXTALSTB_CLR: LXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_IRC8MSTB_CLR: IRC8M stabilization interrupt flag clear + \arg RCU_INT_FLAG_HXTALSTB_CLR: HXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLLSTB_CLR: PLL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLL1STB_CLR: PLL1 stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLL2STB_CLR: PLL2 stabilization interrupt flag clear + \arg RCU_INT_FLAG_CKM_CLR: clock stuck interrupt flag clear + \param[out] none + \retval none +*/ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag_clear) +{ + RCU_REG_VAL(int_flag_clear) |= BIT(RCU_BIT_POS(int_flag_clear)); +} + +/*! + \brief enable the stabilization interrupt + \param[in] stab_int: clock stabilization interrupt, refer to rcu_int_enum + Only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC40KSTB: IRC40K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC8MSTB: IRC8M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLL1STB: PLL1 stabilization interrupt enable + \arg RCU_INT_PLL2STB: PLL2 stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_enable(rcu_int_enum stab_int) +{ + RCU_REG_VAL(stab_int) |= BIT(RCU_BIT_POS(stab_int)); +} + +/*! + \brief disable the stabilization interrupt + \param[in] stab_int: clock stabilization interrupt, refer to rcu_int_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC40KSTB: IRC40K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC8MSTB: IRC8M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLL1STB: PLL1 stabilization interrupt enable + \arg RCU_INT_PLL2STB: PLL2 stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_disable(rcu_int_enum stab_int) +{ + RCU_REG_VAL(stab_int) &= ~BIT(RCU_BIT_POS(stab_int)); +} + +/*! + \brief wait for oscillator stabilization flags is SET or oscillator startup is timeout + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1 + \arg RCU_PLL2_CK: phase locked loop 2 + \param[out] none + \retval ErrStatus: SUCCESS or ERR +*/ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci) +{ + uint32_t stb_cnt = 0U; + ErrStatus reval = ERR; + FlagStatus osci_stat = RESET; + + switch (osci) { + /* wait HXTAL stable */ + case RCU_HXTAL: + while ((RESET == osci_stat) && (HXTAL_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_HXTALSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_HXTALSTB)) { + reval = SUCCESS; + } + break; + + /* wait LXTAL stable */ + case RCU_LXTAL: + while ((RESET == osci_stat) && (LXTAL_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_LXTALSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_LXTALSTB)) { + reval = SUCCESS; + } + break; + + /* wait IRC8M stable */ + case RCU_IRC8M: + while ((RESET == osci_stat) && (IRC8M_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_IRC8MSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_IRC8MSTB)) { + reval = SUCCESS; + } + break; + + /* wait IRC40K stable */ + case RCU_IRC40K: + while ((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_IRC40KSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_IRC40KSTB)) { + reval = SUCCESS; + } + break; + + /* wait PLL stable */ + case RCU_PLL_CK: + while ((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_PLLSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_PLLSTB)) { + reval = SUCCESS; + } + break; + /* wait PLL1 stable */ + case RCU_PLL1_CK: + while ((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_PLL1STB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_PLL1STB)) { + reval = SUCCESS; + } + break; + /* wait PLL2 stable */ + case RCU_PLL2_CK: + while ((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_PLL2STB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_PLL2STB)) { + reval = SUCCESS; + } + break; + + default: + break; + } + + /* return value */ + return reval; +} + +/*! + \brief turn on the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1 + \arg RCU_PLL2_CK: phase locked loop 2 + \param[out] none + \retval none +*/ +void rcu_osci_on(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) |= BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief turn off the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1 + \arg RCU_PLL2_CK: phase locked loop 2 + \param[out] none + \retval none +*/ +void rcu_osci_off(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) &= ~BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch (osci) { + /* enable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg | RCU_CTL_HXTALBPS); + break; + /* enable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg | RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC8M: + case RCU_IRC40K: + case RCU_PLL_CK: + case RCU_PLL1_CK: + case RCU_PLL2_CK: + break; + default: + break; + } +} + +/*! + \brief disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch (osci) { + /* disable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg & ~RCU_CTL_HXTALBPS); + break; + /* disable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg & ~RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC8M: + case RCU_IRC40K: + case RCU_PLL_CK: + case RCU_PLL1_CK: + case RCU_PLL2_CK: + break; + default: + break; + } +} + +/*! + \brief enable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ + +void rcu_hxtal_clock_monitor_enable(void) +{ + RCU_CTL |= RCU_CTL_CKMEN; +} + +/*! + \brief disable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ +void rcu_hxtal_clock_monitor_disable(void) +{ + RCU_CTL &= ~RCU_CTL_CKMEN; +} + +/*! + \brief set the IRC8M adjust value + \param[in] irc8m_adjval: IRC8M adjust value, must be between 0 and 0x1F + \param[out] none + \retval none +*/ +void rcu_irc8m_adjust_value_set(uint32_t irc8m_adjval) +{ + uint32_t reg; + + reg = RCU_CTL; + /* reset the IRC8MADJ bits and set according to irc8m_adjval */ + reg &= ~RCU_CTL_IRC8MADJ; + RCU_CTL = (reg | ((irc8m_adjval & 0x1FU) << 3)); +} + +/*! + \brief deep-sleep mode voltage select + \param[in] dsvol: deep sleep mode voltage + only one parameter can be selected which is shown as below: + \arg RCU_DEEPSLEEP_V_1_2: the core voltage is 1.2V + \arg RCU_DEEPSLEEP_V_1_1: the core voltage is 1.1V + \arg RCU_DEEPSLEEP_V_1_0: the core voltage is 1.0V + \arg RCU_DEEPSLEEP_V_0_9: the core voltage is 0.9V + \param[out] none + \retval none +*/ +void rcu_deepsleep_voltage_set(uint32_t dsvol) +{ + dsvol &= RCU_DSV_DSLPVS; + RCU_DSV = dsvol; +} + +/*! + \brief get the system clock, bus and peripheral clock frequency + \param[in] clock: the clock frequency which to get + only one parameter can be selected which is shown as below: + \arg CK_SYS: system clock frequency + \arg CK_AHB: AHB clock frequency + \arg CK_APB1: APB1 clock frequency + \arg CK_APB2: APB2 clock frequency + \param[out] none + \retval clock frequency of system, AHB, APB1, APB2 +*/ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock) +{ + uint32_t sws, ck_freq = 0U; + uint32_t cksys_freq, ahb_freq, apb1_freq, apb2_freq; + uint32_t pllsel, predv0sel, pllmf, ck_src, idx, clk_exp; + uint32_t predv0, predv1, pll1mf; + + /* exponent of AHB, APB1 and APB2 clock divider */ + uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + uint8_t apb1_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + uint8_t apb2_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch (sws) { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + cksys_freq = IRC8M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + cksys_freq = HXTAL_VALUE; + break; + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + if (RCU_PLLSRC_HXTAL == pllsel) { + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + /* source clock use PLL1 */ + if (RCU_PREDV0SRC_CKPLL1 == predv0sel) { + predv1 = (uint32_t)((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = (uint32_t)((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if (17U == pll1mf) { + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } else { + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + if ((RCU_CFG0 & RCU_CFG0_PLLMF_4)) { + pllmf |= 0x10U; + } + if (pllmf < 15U) { + pllmf += 2U; + } else { + pllmf += 1U; + } + + cksys_freq = ck_src * pllmf; + + if (15U == pllmf) { + /* PLL source clock multiply by 6.5 */ + cksys_freq = ck_src * 6U + ck_src / 2U; + } + + break; + /* IRC8M is selected as CK_SYS */ + default: + cksys_freq = IRC8M_VALUE; + break; + } + + /* calculate AHB clock frequency */ + idx = GET_BITS(RCU_CFG0, 4, 7); + clk_exp = ahb_exp[idx]; + ahb_freq = cksys_freq >> clk_exp; + + /* calculate APB1 clock frequency */ + idx = GET_BITS(RCU_CFG0, 8, 10); + clk_exp = apb1_exp[idx]; + apb1_freq = ahb_freq >> clk_exp; + + /* calculate APB2 clock frequency */ + idx = GET_BITS(RCU_CFG0, 11, 13); + clk_exp = apb2_exp[idx]; + apb2_freq = ahb_freq >> clk_exp; + + /* return the clocks frequency */ + switch (clock) { + case CK_SYS: + ck_freq = cksys_freq; + break; + case CK_AHB: + ck_freq = ahb_freq; + break; + case CK_APB1: + ck_freq = apb1_freq; + break; + case CK_APB2: + ck_freq = apb2_freq; + break; + default: + break; + } + return ck_freq; +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_soc.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_soc.c new file mode 100755 index 000000000..f09165fd7 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/sys_clock/gd32vf103_soc.c @@ -0,0 +1,60 @@ +#include "nuclei_sdk_soc.h" +#include + +__STATIC_FORCEINLINE uint64_t get_timer_freq(void) +{ + return (uint64_t)SOC_TIMER_FREQ; +} + +uint32_t measure_cpu_freq(uint32_t n) +{ + uint32_t start_mcycle, delta_mcycle; + uint32_t start_mtime, delta_mtime; + uint64_t mtime_freq = get_timer_freq(); + + // Don't start measuruing until we see an mtime tick + uint32_t tmp = (uint32_t)SysTimer_GetLoadValue(); + do { + start_mtime = (uint32_t)SysTimer_GetLoadValue(); + start_mcycle = __RV_CSR_READ(CSR_MCYCLE); + } while (start_mtime == tmp); + + do { + delta_mtime = (uint32_t)SysTimer_GetLoadValue() - start_mtime; + delta_mcycle = __RV_CSR_READ(CSR_MCYCLE) - start_mcycle; + } while (delta_mtime < n); + + return (delta_mcycle / delta_mtime) * mtime_freq + + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; +} + +uint32_t get_cpu_freq(void) +{ + uint32_t cpu_freq; + + // warm up + measure_cpu_freq(1); + // measure for real + cpu_freq = measure_cpu_freq(100); + + return cpu_freq; +} + +/** + * \brief delay a time in milliseconds + * \details + * provide API for delay + * \param[in] count: count in milliseconds + * \remarks + */ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + uint64_t delay_ticks = (SOC_TIMER_FREQ * (uint64_t)count) / 1000; + + start_mtime = SysTimer_GetLoadValue(); + + do { + delta_mtime = SysTimer_GetLoadValue() - start_mtime; + } while (delta_mtime < delay_ticks); +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c new file mode 100644 index 000000000..d3e4a2272 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c @@ -0,0 +1,603 @@ +/****************************************************************************** + * @file system_gd32vf103.c + * @brief NMSIS Nuclei Core Device Peripheral Access Layer Source File for + * Device gd32vf103 + * @version V1.00 + * @date 22. Nov 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * Copyright (c) 2019 Nuclei Limited. 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 +#include +#include "nuclei_sdk_hal.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +/* ToDo: add here your necessary defines for device initialization + following is an example for different system frequencies */ +#ifndef SYSTEM_CLOCK +#define SYSTEM_CLOCK __SYSTEM_CLOCK_108M_PLL_HXTAL +#endif + +/** + * \defgroup NMSIS_Core_SystemAndClock System and Clock Configuration + * \brief Functions for system and clock setup available in system_.c. + * \details + * Nuclei provides a template file **system_Device.c** that must be adapted by + * the silicon vendor to match their actual device. As a minimum requirement, + * this file must provide: + * - A device-specific system configuration function, \ref SystemInit(). + * - A global variable that contains the system frequency, \ref SystemCoreClock. + * + * The file configures the device and, typically, initializes the oscillator (PLL) that is part + * of the microcontroller device. This file might export other functions or variables that provide + * a more flexible configuration of the microcontroller system. + * + * \note Please pay special attention to the static variable \c SystemCoreClock. This variable might be + * used throughout the whole system initialization and runtime to calculate frequency/time related values. + * Thus one must assure that the variable always reflects the actual system clock speed. + * + * \attention + * Be aware that a value stored to \c SystemCoreClock during low level initialization (i.e. \c SystemInit()) might get + * overwritten by C libray startup code and/or .bss section initialization. + * Thus its highly recommended to call \ref SystemCoreClockUpdate at the beginning of the user \c main() routine. + * + * @{ + */ + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +/* ToDo: initialize SystemCoreClock with the system core clock frequency value + achieved after system intitialization. + This means system core clock frequency after call to SystemInit() */ +/** + * \brief Variable to hold the system core clock value + * \details + * Holds the system core clock, which is the system clock frequency supplied to the SysTick + * timer and the processor core clock. This variable can be used by debuggers to query the + * frequency of the debug timer or to configure the trace clock speed. + * + * \attention + * Compilers must be configured to avoid removing this variable in case the application + * program is not using it. Debugging systems require the variable to be physically + * present in memory so that it can be examined to configure the debugger. + */ +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; /* System Clock Frequency (Core Clock) */ + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ + +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than + * HXTAL_STARTUP_TIMEOUT */ + do { + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + } while ((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if (0U == (RCU_CTL & RCU_CTL_HXTALSTB)) { + while (1) { + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if (HXTAL_VALUE == 25000000) { + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | + RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | + RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while (0U == (RCU_CTL & RCU_CTL_PLL1STB)) { + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while (0U == (RCU_CTL & RCU_CTL_PLL2STB)) { + } + } else if (HXTAL_VALUE == 8000000) { + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | + RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | + RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while (0U == (RCU_CTL & RCU_CTL_PLL1STB)) { + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while (0U == (RCU_CTL & RCU_CTL_PLL2STB)) { + } + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while (0U == (RCU_CTL & RCU_CTL_PLLSTB)) { + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while (0U == (RCU_CFG0 & RCU_SCSS_PLL)) { + } +} + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ + system_clock_108m_hxtal(); +} + + +/** + * \brief Function to update the variable \ref SystemCoreClock + * \details + * Updates the variable \ref SystemCoreClock and must be called whenever the core clock is changed + * during program execution. The function evaluates the clock register settings and calculates + * the current core clock. + */ +void SystemCoreClockUpdate(void) /* Get Core Clock Frequency */ +{ + /* ToDo: add code to calculate the system frequency based upon the current + * register settings. + * Note: This function can be used to retrieve the system core clock + * frequeny after user changed register settings. + */ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + if (RCU_PLLSRC_IRC8M_DIV2 == pllsel) { + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + } else { + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if (RCU_PREDV0SRC_CKPLL1 == predv0sel) { + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if (17U == pll1mf) { + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if ((RCU_CFG0 & RCU_CFG0_PLLMF_4)) { + pllmf |= 0x10U; + } + + if (pllmf >= 15U) { + pllmf += 1U; + } else { + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if (15U == pllmf) { + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +/** + * \brief Function to Initialize the system. + * \details + * Initializes the microcontroller system. Typically, this function configures the + * oscillator (PLL) that is part of the microcontroller device. For systems + * with a variable clock speed, it updates the variable \ref SystemCoreClock. + * SystemInit is called from the file startup_device. + */ +void SystemInit(void) +{ + /* ToDo: add code to initialize the system + * Warn: do not use global variables because this function is called before + * reaching pre-main. RW section maybe overwritten afterwards. + */ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/** + * \defgroup NMSIS_Core_IntExcNMI_Handling Interrupt and Exception and NMI Handling + * \brief Functions for interrupt, exception and nmi handle available in system_.c. + * \details + * Nuclei provide a template for interrupt, exception and NMI handling. Silicon Vendor could adapat according + * to their requirement. Silicon vendor could implement interface for different exception code and + * replace current implementation. + * + * @{ + */ +/** \brief Max exception handler number, don't include the NMI(0xFFF) one */ +#define MAX_SYSTEM_EXCEPTION_NUM 12 +/** + * \brief Store the exception handlers for each exception ID + * \note + * - This SystemExceptionHandlers are used to store all the handlers for all + * the exception codes Nuclei N/NX core provided. + * - Exception code 0 - 11, totally 12 exceptions are mapped to SystemExceptionHandlers[0:11] + * - Exception for NMI is also re-routed to exception handling(exception code 0xFFF) in startup code configuration, the handler itself is mapped to SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM] + */ +static unsigned long SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM + 1]; + +/** + * \brief Exception Handler Function Typedef + * \note + * This typedef is only used internal in this system_gd32vf103.c file. + * It is used to do type conversion for registered exception handler before calling it. + */ +typedef void (*EXC_HANDLER)(unsigned long mcause, unsigned long sp); + +/** + * \brief System Default Exception Handler + * \details + * This function provided a default exception and NMI handling code for all exception ids. + * By default, It will just print some information for debug, Vendor can customize it according to its requirements. + */ +static void system_default_exception_handler(unsigned long mcause, unsigned long sp) +{ + /* TODO: Uncomment this if you have implement printf function */ + printf("MCAUSE: 0x%lx\r\n", mcause); + printf("MEPC : 0x%lx\r\n", __RV_CSR_READ(CSR_MEPC)); + printf("MTVAL : 0x%lx\r\n", __RV_CSR_READ(CSR_MBADADDR)); + Exception_DumpFrame(sp); + while (1); +} + +/** + * \brief Initialize all the default core exception handlers + * \details + * The core exception handler for each exception id will be initialized to \ref system_default_exception_handler. + * \note + * Called in \ref _init function, used to initialize default exception handlers for all exception IDs + */ +static void Exception_Init(void) +{ + for (int i = 0; i < MAX_SYSTEM_EXCEPTION_NUM + 1; i++) { + SystemExceptionHandlers[i] = (unsigned long)system_default_exception_handler; + } +} + +/** + * \brief Register an exception handler for exception code EXCn + * \details + * * For EXCn < \ref MAX_SYSTEM_EXCEPTION_NUM, it will be registered into SystemExceptionHandlers[EXCn-1]. + * * For EXCn == NMI_EXCn, it will be registered into SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM]. + * \param EXCn See \ref EXCn_Type + * \param exc_handler The exception handler for this exception code EXCn + */ +void Exception_Register_EXC(uint32_t EXCn, unsigned long exc_handler) +{ + if ((EXCn < MAX_SYSTEM_EXCEPTION_NUM) && (EXCn >= 0)) { + SystemExceptionHandlers[EXCn] = exc_handler; + } else if (EXCn == NMI_EXCn) { + SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM] = exc_handler; + } +} + +/** + * \brief Get current exception handler for exception code EXCn + * \details + * * For EXCn < \ref MAX_SYSTEM_EXCEPTION_NUM, it will return SystemExceptionHandlers[EXCn-1]. + * * For EXCn == NMI_EXCn, it will return SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM]. + * \param EXCn See \ref EXCn_Type + * \return Current exception handler for exception code EXCn, if not found, return 0. + */ +unsigned long Exception_Get_EXC(uint32_t EXCn) +{ + if ((EXCn < MAX_SYSTEM_EXCEPTION_NUM) && (EXCn >= 0)) { + return SystemExceptionHandlers[EXCn]; + } else if (EXCn == NMI_EXCn) { + return SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM]; + } else { + return 0; + } +} + +/** + * \brief Common NMI and Exception handler entry + * \details + * This function provided a command entry for NMI and exception. Silicon Vendor could modify + * this template implementation according to requirement. + * \remarks + * - RISCV provided common entry for all types of exception. This is proposed code template + * for exception entry function, Silicon Vendor could modify the implementation. + * - For the core_exception_handler template, we provided exception register function \ref Exception_Register_EXC + * which can help developer to register your exception handler for specific exception number. + */ +uint32_t core_exception_handler(unsigned long mcause, unsigned long sp) +{ + uint32_t EXCn = (uint32_t)(mcause & 0X00000fff); + EXC_HANDLER exc_handler; + + if ((EXCn < MAX_SYSTEM_EXCEPTION_NUM) && (EXCn >= 0)) { + exc_handler = (EXC_HANDLER)SystemExceptionHandlers[EXCn]; + } else if (EXCn == NMI_EXCn) { + exc_handler = (EXC_HANDLER)SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM]; + } else { + exc_handler = (EXC_HANDLER)system_default_exception_handler; + } + if (exc_handler != NULL) { + exc_handler(mcause, sp); + } + return 0; +} +/** @} */ /* End of Doxygen Group NMSIS_Core_ExceptionAndNMI */ + +void SystemBannerPrint(void) +{ +#if defined(NUCLEI_BANNER) && (NUCLEI_BANNER == 1) + printf("Nuclei SDK Build Time: %s, %s\r\n", __DATE__, __TIME__); +#ifdef DOWNLOAD_MODE_STRING + printf("Download Mode: %s\r\n", DOWNLOAD_MODE_STRING); +#endif + printf("CPU Frequency %d Hz\r\n", SystemCoreClock); +#endif +} + +/** + * \brief initialize eclic config + * \details + * Eclic need initialize after boot up, Vendor could also change the initialization + * configuration. + */ +void ECLIC_Init(void) +{ + /* TODO: Add your own initialization code here. This function will be called by main */ + ECLIC_SetMth(0); + ECLIC_SetCfgNlbits(__ECLIC_INTCTLBITS); +} + +/** + * \brief Dump Exception Frame + * \details + * This function provided feature to dump exception frame stored in stack. + */ +void Exception_DumpFrame(unsigned long sp) +{ + EXC_Frame_Type *exc_frame = (EXC_Frame_Type *)sp; + +#ifndef __riscv_32e + printf("ra: 0x%x, tp: 0x%x, t0: 0x%x, t1: 0x%x, t2: 0x%x, t3: 0x%x, t4: 0x%x, t5: 0x%x, t6: 0x%x\n" \ + "a0: 0x%x, a1: 0x%x, a2: 0x%x, a3: 0x%x, a4: 0x%x, a5: 0x%x, a6: 0x%x, a7: 0x%x\n" \ + "mcause: 0x%x, mepc: 0x%x, msubm: 0x%x\n", exc_frame->ra, exc_frame->tp, exc_frame->t0, \ + exc_frame->t1, exc_frame->t2, exc_frame->t3, exc_frame->t4, exc_frame->t5, exc_frame->t6, \ + exc_frame->a0, exc_frame->a1, exc_frame->a2, exc_frame->a3, exc_frame->a4, exc_frame->a5, \ + exc_frame->a6, exc_frame->a7, exc_frame->mcause, exc_frame->mepc, exc_frame->msubm); +#else + printf("ra: 0x%x, tp: 0x%x, t0: 0x%x, t1: 0x%x, t2: 0x%x\n" \ + "a0: 0x%x, a1: 0x%x, a2: 0x%x, a3: 0x%x, a4: 0x%x, a5: 0x%x\n" \ + "mcause: 0x%x, mepc: 0x%x, msubm: 0x%x\n", exc_frame->ra, exc_frame->tp, exc_frame->t0, \ + exc_frame->t1, exc_frame->t2, exc_frame->a0, exc_frame->a1, exc_frame->a2, exc_frame->a3, \ + exc_frame->a4, exc_frame->a5, exc_frame->mcause, exc_frame->mepc, exc_frame->msubm); +#endif +} + +/** + * \brief Initialize a specific IRQ and register the handler + * \details + * This function set vector mode, trigger mode and polarity, interrupt level and priority, + * assign handler for specific IRQn. + * \param [in] IRQn NMI interrupt handler address + * \param [in] shv \ref ECLIC_NON_VECTOR_INTERRUPT means non-vector mode, and \ref ECLIC_VECTOR_INTERRUPT is vector mode + * \param [in] trig_mode see \ref ECLIC_TRIGGER_Type + * \param [in] lvl interupt level + * \param [in] priority interrupt priority + * \param [in] handler interrupt handler, if NULL, handler will not be installed + * \return -1 means invalid input parameter. 0 means successful. + * \remarks + * - This function use to configure specific eclic interrupt and register its interrupt handler and enable its interrupt. + * - If the vector table is placed in read-only section(FLASHXIP mode), handler could not be installed + */ +int32_t ECLIC_Register_IRQ(IRQn_Type IRQn, uint8_t shv, ECLIC_TRIGGER_Type trig_mode, uint8_t lvl, uint8_t priority, void* handler) +{ + if ((IRQn > SOC_INT_MAX) || (shv > ECLIC_VECTOR_INTERRUPT) \ + || (trig_mode > ECLIC_NEGTIVE_EDGE_TRIGGER)) { + return -1; + } + + /* set interrupt vector mode */ + ECLIC_SetShvIRQ(IRQn, shv); + /* set interrupt trigger mode and polarity */ + ECLIC_SetTrigIRQ(IRQn, trig_mode); + /* set interrupt level */ + ECLIC_SetLevelIRQ(IRQn, lvl); + /* set interrupt priority */ + ECLIC_SetPriorityIRQ(IRQn, priority); + if (handler != NULL) { + /* set interrupt handler entry to vector table */ + ECLIC_SetVector(IRQn, (rv_csr_t)handler); + } + /* enable interrupt */ + ECLIC_EnableIRQ(IRQn); + return 0; +} +/** @} */ /* End of Doxygen Group NMSIS_Core_ExceptionAndNMI */ + +/** + * \brief early init function before main + * \details + * This function is executed right before main function. + * For RISC-V gnu toolchain, _init function might not be called + * by __libc_init_array function, so we defined a new function + * to do initialization + */ +void _premain_init(void) +{ + /* TODO: Add your own initialization code here, called before main */ + SystemCoreClock = get_cpu_freq(); + /* configure USART */ + gd_com_init(SOC_DEBUG_UART); + /* Display banner after UART initialized */ + // SystemBannerPrint(); + /* Initialize exception default handlers */ + Exception_Init(); + /* ECLIC initialization, mainly MTH and NLBIT */ + ECLIC_Init(); +} + +/** + * \brief finish function after main + * \param [in] status status code return from main + * \details + * This function is executed right after main function. + * For RISC-V gnu toolchain, _fini function might not be called + * by __libc_fini_array function, so we defined a new function + * to do initialization + */ +void _postmain_fini(int status) +{ + /* TODO: Add your own finishing code here, called after main */ +} + +/** + * \brief _init function called in __libc_init_array() + * \details + * This `__libc_init_array()` function is called during startup code, + * user need to implement this function, otherwise when link it will + * error init.c:(.text.__libc_init_array+0x26): undefined reference to `_init' + * \note + * Please use \ref _premain_init function now + */ +void _init(void) +{ + /* Don't put any code here, please use _premain_init now */ +} + +/** + * \brief _fini function called in __libc_fini_array() + * \details + * This `__libc_fini_array()` function is called when exit main. + * user need to implement this function, otherwise when link it will + * error fini.c:(.text.__libc_fini_array+0x28): undefined reference to `_fini' + * \note + * Please use \ref _postmain_fini function now + */ +void _fini(void) +{ + /* Don't put any code here, please use _postmain_fini now */ +} + +/** @} */ /* End of Doxygen Group NMSIS_Core_SystemAndClock */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.h new file mode 100755 index 000000000..0a9aa6b45 --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.h @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2009-2018 Arm Limited. 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. + */ +/******************************************************************************* + * @file system_gd32vf103.h + * @brief NMSIS Nuclei N/NX Device Peripheral Access Layer Header File for + * Device gd32vf103 + * @version V1.00 + * @date 7. Jan 2020 + ******************************************************************************/ + +#ifndef __SYSTEM_GD32VF103_H__ +#define __SYSTEM_GD32VF103_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "gd32vf103.h" +#include "core_feature_eclic.h" + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ +typedef struct EXC_Frame { + unsigned long ra; /* ra: x1, return address for jump */ + unsigned long tp; /* tp: x4, thread pointer */ + unsigned long t0; /* t0: x5, temporary register 0 */ + unsigned long t1; /* t1: x6, temporary register 1 */ + unsigned long t2; /* t2: x7, temporary register 2 */ + unsigned long a0; /* a0: x10, return value or function argument 0 */ + unsigned long a1; /* a1: x11, return value or function argument 1 */ + unsigned long a2; /* a2: x12, function argument 2 */ + unsigned long a3; /* a3: x13, function argument 3 */ + unsigned long a4; /* a4: x14, function argument 4 */ + unsigned long a5; /* a5: x15, function argument 5 */ + unsigned long mcause; /* mcause: machine cause csr register */ + unsigned long mepc; /* mepc: machine exception program counter csr register */ + unsigned long msubm; /* msubm: machine sub-mode csr register, nuclei customized */ +#ifndef __riscv_32e + unsigned long a6; /* a6: x16, function argument 6 */ + unsigned long a7; /* a7: x17, function argument 7 */ + unsigned long t3; /* t3: x28, temporary register 3 */ + unsigned long t4; /* t4: x29, temporary register 4 */ + unsigned long t5; /* t5: x30, temporary register 5 */ + unsigned long t6; /* t6: x31, temporary register 6 */ +#endif +} EXC_Frame_Type; + +/** + \brief Setup the microcontroller system. + + Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit(void); + +/** + \brief Update SystemCoreClock variable. + + Updates the SystemCoreClock with current core Clock retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate(void); + +/** + * \brief Dump Exception Frame + */ +void Exception_DumpFrame(unsigned long sp); + +/** + * \brief Register an exception handler for exception code EXCn + */ +extern void Exception_Register_EXC(uint32_t EXCn, unsigned long exc_handler); + +/** + * \brief Get current exception handler for exception code EXCn + */ +extern unsigned long Exception_Get_EXC(uint32_t EXCn); + +/** + * \brief Initialize eclic config + */ +extern void ECLIC_Init(void); + +/** + * \brief Initialize a specific IRQ and register the handler + * \details + * This function set vector mode, trigger mode and polarity, interrupt level and priority, + * assign handler for specific IRQn. + */ +extern int32_t ECLIC_Register_IRQ(IRQn_Type IRQn, uint8_t shv, ECLIC_TRIGGER_Type trig_mode, uint8_t lvl, uint8_t priority, void* handler); + + +#ifdef __cplusplus +} +#endif + +#endif /* __SYSTEM_GD32VF103_H__ */ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Kconfig b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Kconfig new file mode 100755 index 000000000..6a9a7ae9d --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Kconfig @@ -0,0 +1,14 @@ +menuconfig BSP_USING_UART4 + bool "Enable UART4" + default y + if BSP_USING_UART4 + config SERIAL_BUS_NAME_4 + string "serial bus name" + default "uart4" + config SERIAL_DRV_NAME_4 + string "serial bus driver name" + default "uart4_drv" + config SERIAL_4_DEVICE_NAME_4 + string "serial bus device name" + default "uart4_dev4" + endif diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Makefile b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Makefile new file mode 100755 index 000000000..9a3985b4d --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/Makefile @@ -0,0 +1,4 @@ +SRC_FILES := connect_uart.c gd32vf103_usart.c + + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c new file mode 100755 index 000000000..431a8ea1d --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c @@ -0,0 +1,378 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file connect_usart.c +* @brief support gap8-board uart function and register to bus framework +* @version 1.1 +* @author AIIT XUOS Lab +* @date 2021-09-02 +*/ + +#include +#include + +#include "connect_uart.h" +#include "gd32vf103_usart.h" +#include "gd32vf103.h" +#include + +static void SerialCfgParamCheck(struct SerialCfgParam *serial_cfg_default, struct SerialCfgParam *serial_cfg_new) +{ + struct SerialDataCfg *data_cfg_default = &serial_cfg_default->data_cfg; + struct SerialDataCfg *data_cfg_new = &serial_cfg_new->data_cfg; + + if ((data_cfg_default->serial_baud_rate != data_cfg_new->serial_baud_rate) && (data_cfg_new->serial_baud_rate)) { + data_cfg_default->serial_baud_rate = data_cfg_new->serial_baud_rate; + } + + if ((data_cfg_default->serial_bit_order != data_cfg_new->serial_bit_order) && (data_cfg_new->serial_bit_order)) { + data_cfg_default->serial_bit_order = data_cfg_new->serial_bit_order; + } + + if ((data_cfg_default->serial_buffer_size != data_cfg_new->serial_buffer_size) && (data_cfg_new->serial_buffer_size)) { + data_cfg_default->serial_buffer_size = data_cfg_new->serial_buffer_size; + } + + if ((data_cfg_default->serial_data_bits != data_cfg_new->serial_data_bits) && (data_cfg_new->serial_data_bits)) { + data_cfg_default->serial_data_bits = data_cfg_new->serial_data_bits; + } + + if ((data_cfg_default->serial_invert_mode != data_cfg_new->serial_invert_mode) && (data_cfg_new->serial_invert_mode)) { + data_cfg_default->serial_invert_mode = data_cfg_new->serial_invert_mode; + } + + if ((data_cfg_default->serial_parity_mode != data_cfg_new->serial_parity_mode) && (data_cfg_new->serial_parity_mode)) { + data_cfg_default->serial_parity_mode = data_cfg_new->serial_parity_mode; + } + + if ((data_cfg_default->serial_stop_bits != data_cfg_new->serial_stop_bits) && (data_cfg_new->serial_stop_bits)) { + data_cfg_default->serial_stop_bits = data_cfg_new->serial_stop_bits; + } +} + +static void UartIsr(struct SerialDriver *serial_drv, struct SerialHardwareDevice *serial_dev) +{ + struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_drv->private_data; + + if ((usart_interrupt_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_INT_FLAG_RBNE) + != RESET) + && (RESET != usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_RBNE))) + { + SerialSetIsr(serial_dev, SERIAL_EVENT_RX_IND); + usart_interrupt_flag_clear(serial_cfg->hw_cfg.serial_register_base, USART_INT_FLAG_RBNE); + usart_flag_clear(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_RBNE); + } + else + { + if (usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_CTSF) != RESET) + { + usart_flag_clear(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_CTSF); + } + + if (usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_LBDF) != RESET) + { + usart_flag_clear(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_LBDF); + } + + if (usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_TC) != RESET) + { + usart_flag_clear(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_TC); + } + } + +} + + +static uint32 SerialInit(struct SerialDriver *serial_drv, struct BusConfigureInfo *configure_info) +{ + NULL_PARAM_CHECK(serial_drv); + struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_drv->private_data; + // struct UsartHwCfg *serial_hw_cfg = (struct UsartHwCfg *)serial_cfg->hw_cfg.private_data; + + + usart_deinit(serial_cfg->hw_cfg.serial_register_base); + usart_baudrate_set(serial_cfg->hw_cfg.serial_register_base, serial_cfg->data_cfg.serial_baud_rate); + + switch (serial_cfg->data_cfg.serial_data_bits) + { + case DATA_BITS_8: + usart_word_length_set(serial_cfg->hw_cfg.serial_register_base, USART_WL_8BIT); + break; + + case DATA_BITS_9: + usart_word_length_set(serial_cfg->hw_cfg.serial_register_base, USART_WL_9BIT); + break; + default: + usart_word_length_set(serial_cfg->hw_cfg.serial_register_base, USART_WL_8BIT); + break; + } + + switch (serial_cfg->data_cfg.serial_stop_bits) + { + case STOP_BITS_1: + usart_stop_bit_set(serial_cfg->hw_cfg.serial_register_base, USART_STB_1BIT); + break; + case STOP_BITS_2: + usart_stop_bit_set(serial_cfg->hw_cfg.serial_register_base, USART_STB_2BIT); + break; + default: + usart_stop_bit_set(serial_cfg->hw_cfg.serial_register_base, USART_STB_1BIT); + break; + } + + switch (serial_cfg->data_cfg.serial_parity_mode) + { + case PARITY_NONE: + usart_parity_config(serial_cfg->hw_cfg.serial_register_base, USART_PM_NONE); + break; + case PARITY_ODD: + usart_parity_config(serial_cfg->hw_cfg.serial_register_base, USART_PM_ODD); + break; + case PARITY_EVEN: + usart_parity_config(serial_cfg->hw_cfg.serial_register_base, USART_PM_EVEN); + break; + default: + usart_parity_config(serial_cfg->hw_cfg.serial_register_base, USART_PM_NONE); + break; + } + usart_hardware_flow_rts_config(serial_cfg->hw_cfg.serial_register_base, USART_RTS_DISABLE); + usart_hardware_flow_cts_config(serial_cfg->hw_cfg.serial_register_base, USART_CTS_DISABLE); + usart_receive_config(serial_cfg->hw_cfg.serial_register_base, USART_RECEIVE_ENABLE); + usart_transmit_config(serial_cfg->hw_cfg.serial_register_base, USART_TRANSMIT_ENABLE); + usart_enable(serial_cfg->hw_cfg.serial_register_base); + + + return EOK; +} + +static uint32 SerialConfigure(struct SerialDriver *serial_drv, int serial_operation_cmd) +{ + NULL_PARAM_CHECK(serial_drv); + + struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_drv->private_data; + + switch (serial_operation_cmd) + { + case OPER_CLR_INT: + ECLIC_DisableIRQ(serial_cfg->hw_cfg.serial_irq_interrupt); + usart_interrupt_disable(serial_cfg->hw_cfg.serial_register_base, USART_INT_RBNE); + break; + case OPER_SET_INT: + ECLIC_EnableIRQ(serial_cfg->hw_cfg.serial_irq_interrupt); + /* enable USART0 receive interrupt */ + usart_interrupt_enable(serial_cfg->hw_cfg.serial_register_base, USART_INT_RBNE); + break; + } + + return EOK; +} + +static uint32 SerialDrvConfigure(void *drv, struct BusConfigureInfo *configure_info) +{ + NULL_PARAM_CHECK(drv); + NULL_PARAM_CHECK(configure_info); + + x_err_t ret = EOK; + int serial_operation_cmd; + struct SerialDriver *serial_drv = (struct SerialDriver *)drv; + + switch (configure_info->configure_cmd) + { + case OPE_INT: + ret = SerialInit(serial_drv, configure_info); + break; + case OPE_CFG: + serial_operation_cmd = *(int *)configure_info->private_data; + ret = SerialConfigure(serial_drv, serial_operation_cmd); + break; + default: + break; + } + + return ret; +} + +static int SerialPutChar(struct SerialHardwareDevice *serial_dev, char c) +{ + struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_dev->private_data; + // struct UsartHwCfg *serial_hw_cfg = (struct UsartHwCfg *)serial_cfg->hw_cfg.private_data; + + usart_data_transmit(serial_cfg->hw_cfg.serial_register_base, (uint8_t) c); + while (usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_TBE) == RESET); + + return 0; +} + +static int SerialGetChar(struct SerialHardwareDevice *serial_dev) +{ + char ch = -1; + struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_dev->private_data; + // struct UsartHwCfg *serial_hw_cfg = (struct UsartHwCfg *)serial_cfg->hw_cfg.private_data; + + if (RESET != usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_RBNE)) + { + ch = usart_data_receive(serial_cfg->hw_cfg.serial_register_base) & 0xff; + } + + return ch; +} + +static const struct SerialDataCfg data_cfg_init = +{ + .serial_baud_rate = BAUD_RATE_115200, + .serial_data_bits = DATA_BITS_8, + .serial_stop_bits = STOP_BITS_1, + .serial_parity_mode = PARITY_NONE, + .serial_bit_order = BIT_ORDER_LSB, + .serial_invert_mode = NRZ_NORMAL, + .serial_buffer_size = SERIAL_RB_BUFSZ, +}; + + + +/*manage the serial device operations*/ +static const struct SerialDrvDone drv_done = +{ + .init = SerialInit, + .configure = SerialConfigure, +}; + +/*manage the serial device hal operations*/ +static struct SerialHwDevDone hwdev_done = +{ + .put_char = SerialPutChar, + .get_char = SerialGetChar, +}; + +static int BoardSerialBusInit(struct SerialBus *serial_bus, struct SerialDriver *serial_driver, const char *bus_name, const char *drv_name) +{ + x_err_t ret = EOK; + + /*Init the serial bus */ + ret = SerialBusInit(serial_bus, bus_name); + if (EOK != ret) { + KPrintf("InitHwUart SerialBusInit error %d\n", ret); + return ERROR; + } + + /*Init the serial driver*/ + ret = SerialDriverInit(serial_driver, drv_name); + if (EOK != ret) { + KPrintf("InitHwUart SerialDriverInit error %d\n", ret); + return ERROR; + } + + /*Attach the serial driver to the serial bus*/ + ret = SerialDriverAttachToBus(drv_name, bus_name); + if (EOK != ret) { + KPrintf("InitHwUart SerialDriverAttachToBus error %d\n", ret); + return ERROR; + } + + return ret; +} + +/*Attach the serial device to the serial bus*/ +static int BoardSerialDevBend(struct SerialHardwareDevice *serial_device, void *serial_param, const char *bus_name, const char *dev_name) +{ + x_err_t ret = EOK; + + ret = SerialDeviceRegister(serial_device, serial_param, dev_name); + if (EOK != ret) { + KPrintf("InitHwUart SerialDeviceInit device %s error %d\n", dev_name, ret); + return ERROR; + } + + ret = SerialDeviceAttachToBus(dev_name, bus_name); + if (EOK != ret) { + KPrintf("InitHwUart SerialDeviceAttachToBus device %s error %d\n", dev_name, ret); + return ERROR; + } + + return ret; +} +#ifdef BSP_USING_UART4 +struct SerialDriver serial_driver_4; +struct SerialHardwareDevice serial_device_4; + +void UART4_IRQHandler(int irq_num, void *arg) +{ + UartIsr(&serial_driver_4, &serial_device_4); +} +// DECLARE_HW_IRQ(UART4_IRQn, UART4_IRQHandler, NONE); +#endif + +int InitHwUart(void) +{ + x_err_t ret = EOK; + +// #ifdef BSP_USING_UART0 +// rcu_periph_clock_enable(RCU_USART0); +// #endif + +// #ifdef BSP_USING_UART1 +// rcu_periph_clock_enable(RCU_USART1); +// #endif +// #ifdef BSP_USING_UART2 +// rcu_periph_clock_enable(RCU_USART2); +// #endif +// #ifdef BSP_USING_UART3 +// rcu_periph_clock_enable(RCU_UART3); +// #endif +#ifdef BSP_USING_UART4 + rcu_periph_clock_enable(RCU_UART4); +#endif + +#ifdef BSP_USING_UART4 + static struct SerialBus serial_bus; + memset(&serial_bus, 0, sizeof(struct SerialBus)); + + memset(&serial_driver_4, 0, sizeof(struct SerialDriver)); + + memset(&serial_device_4, 0, sizeof(struct SerialHardwareDevice)); + + static struct SerialCfgParam serial_cfg; + memset(&serial_cfg, 0, sizeof(struct SerialCfgParam)); + + static struct SerialDevParam serial_dev_param; + memset(&serial_dev_param, 0, sizeof(struct SerialDevParam)); + + serial_driver_4.drv_done = &drv_done; + serial_driver_4.configure = &SerialDrvConfigure; + serial_device_4.hwdev_done = &hwdev_done; + + serial_cfg.data_cfg = data_cfg_init; + + serial_cfg.hw_cfg.serial_register_base = UART4; + serial_cfg.hw_cfg.serial_irq_interrupt = UART4_IRQn; + + serial_driver_4.private_data = (void *)&serial_cfg; + + serial_dev_param.serial_work_mode = SIGN_OPER_INT_RX; + serial_device_4.haldev.private_data = (void *)&serial_dev_param; + + ret = BoardSerialBusInit(&serial_bus, &serial_driver_4, SERIAL_BUS_NAME_4, SERIAL_DRV_NAME_4); + if (EOK != ret) { + KPrintf("InitHwUart uarths error ret %u\n", ret); + return ERROR; + } + + ret = BoardSerialDevBend(&serial_device_4, (void *)&serial_cfg, SERIAL_BUS_NAME_4, SERIAL_4_DEVICE_NAME_4); + if (EOK != ret) { + KPrintf("InitHwUart uarths error ret %u\n", ret); + return ERROR; + } +#endif + + return ret; +} diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c new file mode 100755 index 000000000..f2c44268b --- /dev/null +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c @@ -0,0 +1,781 @@ +/*! + \file gd32vf103_usart.c + \brief USART driver + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_usart.h" + +/*! + \brief reset USART/UART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_deinit(uint32_t usart_periph) +{ + switch (usart_periph) { + case USART0: + /* reset USART0 */ + rcu_periph_reset_enable(RCU_USART0RST); + rcu_periph_reset_disable(RCU_USART0RST); + break; + case USART1: + /* reset USART1 */ + rcu_periph_reset_enable(RCU_USART1RST); + rcu_periph_reset_disable(RCU_USART1RST); + break; + case USART2: + /* reset USART2 */ + rcu_periph_reset_enable(RCU_USART2RST); + rcu_periph_reset_disable(RCU_USART2RST); + break; + case UART3: + /* reset UART3 */ + rcu_periph_reset_enable(RCU_UART3RST); + rcu_periph_reset_disable(RCU_UART3RST); + break; + case UART4: + /* reset UART4 */ + rcu_periph_reset_enable(RCU_UART4RST); + rcu_periph_reset_disable(RCU_UART4RST); + break; + default: + break; + } +} + +/*! + \brief configure USART baud rate value + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] baudval: baud rate value + \param[out] none + \retval none +*/ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval) +{ + uint32_t uclk = 0U, intdiv = 0U, fradiv = 0U, udiv = 0U; + switch (usart_periph) { + /* get clock frequency */ + case USART0: + /* get USART0 clock */ + uclk = rcu_clock_freq_get(CK_APB2); + break; + case USART1: + /* get USART1 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + case USART2: + /* get USART2 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART3: + /* get UART3 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART4: + /* get UART4 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + default: + break; + } + /* oversampling by 16, configure the value of USART_BAUD */ + udiv = (uclk + baudval / 2U) / baudval; + intdiv = udiv & (0x0000fff0U); + fradiv = udiv & (0x0000000fU); + USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); +} + +/*! + \brief configure USART parity + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] paritycfg: configure USART parity + only one parameter can be selected which is shown as below: + \arg USART_PM_NONE: no parity + \arg USART_PM_ODD: odd parity + \arg USART_PM_EVEN: even parity + \param[out] none + \retval none +*/ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg) +{ + /* clear USART_CTL0 PM,PCEN bits */ + USART_CTL0(usart_periph) &= ~(USART_CTL0_PM | USART_CTL0_PCEN); + /* configure USART parity mode */ + USART_CTL0(usart_periph) |= paritycfg ; +} + +/*! + \brief configure USART word length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] wlen: USART word length configure + only one parameter can be selected which is shown as below: + \arg USART_WL_8BIT: 8 bits + \arg USART_WL_9BIT: 9 bits + \param[out] none + \retval none +*/ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen) +{ + /* clear USART_CTL0 WL bit */ + USART_CTL0(usart_periph) &= ~USART_CTL0_WL; + /* configure USART word length */ + USART_CTL0(usart_periph) |= wlen; +} + +/*! + \brief configure USART stop bit length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] stblen: USART stop bit configure + only one parameter can be selected which is shown as below: + \arg USART_STB_1BIT: 1 bit + \arg USART_STB_0_5BIT: 0.5 bit, not available for UARTx(x=3,4) + \arg USART_STB_2BIT: 2 bits + \arg USART_STB_1_5BIT: 1.5 bits, not available for UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen) +{ + /* clear USART_CTL1 STB bits */ + USART_CTL1(usart_periph) &= ~USART_CTL1_STB; + /* configure USART stop bits */ + USART_CTL1(usart_periph) |= stblen; +} + +/*! + \brief enable USART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_UEN; +} + +/*! + \brief disable USART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN); +} + +/*! + \brief configure USART transmitter + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] txconfig: enable or disable USART transmitter + only one parameter can be selected which is shown as below: + \arg USART_TRANSMIT_ENABLE: enable USART transmission + \arg USART_TRANSMIT_DISABLE: disable USART transmission + \param[out] none + \retval none +*/ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_TEN; + ctl |= txconfig; + /* configure transfer mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief configure USART receiver + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] rxconfig: enable or disable USART receiver + only one parameter can be selected which is shown as below: + \arg USART_RECEIVE_ENABLE: enable USART reception + \arg USART_RECEIVE_DISABLE: disable USART reception + \param[out] none + \retval none +*/ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_REN; + ctl |= rxconfig; + /* configure receiver mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief USART transmit data function + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] data: data of transmission + \param[out] none + \retval none +*/ +void usart_data_transmit(uint32_t usart_periph, uint32_t data) +{ + USART_DATA(usart_periph) = USART_DATA_DATA & data; +} + +/*! + \brief USART receive data function + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval data of received +*/ +uint16_t usart_data_receive(uint32_t usart_periph) +{ + return (uint16_t)(GET_BITS(USART_DATA(usart_periph), 0U, 8U)); +} + +/*! + \brief configure the address of the USART in wake up by address match mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] addr: address of USART/UART + \param[out] none + \retval none +*/ +void usart_address_config(uint32_t usart_periph, uint8_t addr) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_ADDR); + USART_CTL1(usart_periph) |= (USART_CTL1_ADDR & addr); +} + +/*! + \brief receiver in mute mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_mute_mode_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_RWU; +} + +/*! + \brief receiver in active mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_mute_mode_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_RWU); +} + +/*! + \brief configure wakeup method in mute mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] wmethod: two methods be used to enter or exit the mute mode + only one parameter can be selected which is shown as below: + \arg USART_WM_IDLE: idle line + \arg USART_WM_ADDR: address mask + \param[out] none + \retval none +*/ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_WM); + USART_CTL0(usart_periph) |= wmethod; +} + +/*! + \brief enable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_lin_mode_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_LMEN; +} + +/*! + \brief disable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_lin_mode_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LMEN); +} + +/*! + \brief configure lin break frame length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] lblen: lin break frame length + only one parameter can be selected which is shown as below: + \arg USART_LBLEN_10B: 10 bits + \arg USART_LBLEN_11B: 11 bits + \param[out] none + \retval none +*/ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LBLEN); + USART_CTL1(usart_periph) |= (USART_CTL1_LBLEN & lblen); +} + +/*! + \brief send break frame + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_send_break(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_SBKCMD; +} + +/*! + \brief enable half duplex mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_halfduplex_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_HDEN; +} + +/*! + \brief disable half duplex mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_halfduplex_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_HDEN); +} + +/*! + \brief enable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_CKEN; +} + +/*! + \brief disable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_CKEN); +} + +/*! + \brief configure USART synchronous mode parameters + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] clen: CK length + only one parameter can be selected which is shown as below: + \arg USART_CLEN_NONE: there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame + \arg USART_CLEN_EN: there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame + \param[in] cph: clock phase + only one parameter can be selected which is shown as below: + \arg USART_CPH_1CK: first clock transition is the first data capture edge + \arg USART_CPH_2CK: second clock transition is the first data capture edge + \param[in] cpl: clock polarity + only one parameter can be selected which is shown as below: + \arg USART_CPL_LOW: steady low value on CK pin + \arg USART_CPL_HIGH: steady high value on CK pin + \param[out] none + \retval none +*/ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl) +{ + uint32_t ctl = 0U; + + /* read USART_CTL1 register */ + ctl = USART_CTL1(usart_periph); + ctl &= ~(USART_CTL1_CLEN | USART_CTL1_CPH | USART_CTL1_CPL); + /* set CK length, CK phase, CK polarity */ + ctl |= (USART_CTL1_CLEN & clen) | (USART_CTL1_CPH & cph) | (USART_CTL1_CPL & cpl); + + USART_CTL1(usart_periph) = ctl; +} + +/*! + \brief configure guard time value in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] gaut: guard time value + \param[out] none + \retval none +*/ +void usart_guard_time_config(uint32_t usart_periph, uint32_t gaut) +{ + USART_GP(usart_periph) &= ~(USART_GP_GUAT); + USART_GP(usart_periph) |= (USART_GP_GUAT & ((gaut) << 8)); +} + +/*! + \brief enable smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_SCEN; +} + +/*! + \brief disable smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_SCEN); +} + +/*! + \brief enable NACK in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_NKEN; +} + +/*! + \brief disable NACK in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_NKEN); +} + +/*! + \brief enable IrDA mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_irda_mode_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_IREN; +} + +/*! + \brief disable IrDA mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_irda_mode_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_IREN); +} + +/*! + \brief configure the peripheral clock prescaler in USART IrDA low-power mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] psc: 0x00-0xFF + \param[out] none + \retval none +*/ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc) +{ + USART_GP(usart_periph) &= ~(USART_GP_PSC); + USART_GP(usart_periph) |= psc; +} + +/*! + \brief configure IrDA low-power + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] irlp: IrDA low-power or normal + only one parameter can be selected which is shown as below: + \arg USART_IRLP_LOW: low-power + \arg USART_IRLP_NORMAL: normal + \param[out] none + \retval none +*/ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_IRLP); + USART_CTL2(usart_periph) |= (USART_CTL2_IRLP & irlp); +} + +/*! + \brief configure hardware flow control RTS + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] rtsconfig: enable or disable RTS + only one parameter can be selected which is shown as below: + \arg USART_RTS_ENABLE: enable RTS + \arg USART_RTS_DISABLE: disable RTS + \param[out] none + \retval none +*/ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_RTSEN; + ctl |= rtsconfig; + /* configure RTS */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure hardware flow control CTS + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] ctsconfig: enable or disable CTS + only one parameter can be selected which is shown as below: + \arg USART_CTS_ENABLE: enable CTS + \arg USART_CTS_DISABLE: disable CTS + \param[out] none + \retval none +*/ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_CTSEN; + ctl |= ctsconfig; + /* configure CTS */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure USART DMA reception + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3) + \param[in] dmacmd: enable or disable DMA for reception + only one parameter can be selected which is shown as below: + \arg USART_DENR_ENABLE: DMA enable for reception + \arg USART_DENR_DISABLE: DMA disable for reception + \param[out] none + \retval none +*/ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_DENR; + ctl |= dmacmd; + /* configure DMA reception */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure USART DMA transmission + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3) + \param[in] dmacmd: enable or disable DMA for transmission + only one parameter can be selected which is shown as below: + \arg USART_DENT_ENABLE: DMA enable for transmission + \arg USART_DENT_DISABLE: DMA disable for transmission + \param[out] none + \retval none +*/ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_DENT; + ctl |= dmacmd; + /* configure DMA transmission */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief get flag in STAT register + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] flag: USART flags, refer to usart_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_FLAG_CTSF: CTS change flag + \arg USART_FLAG_LBDF: LIN break detected flag + \arg USART_FLAG_TBE: transmit data buffer empty + \arg USART_FLAG_TC: transmission complete + \arg USART_FLAG_RBNE: read data buffer not empty + \arg USART_FLAG_IDLEF: IDLE frame detected flag + \arg USART_FLAG_ORERR: overrun error + \arg USART_FLAG_NERR: noise error flag + \arg USART_FLAG_FERR: frame error flag + \arg USART_FLAG_PERR: parity error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag) +{ + if (RESET != (USART_REG_VAL(usart_periph, flag) & BIT(USART_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear flag in STAT register + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] flag: USART flags, refer to usart_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_FLAG_CTSF: CTS change flag + \arg USART_FLAG_LBDF: LIN break detected flag + \arg USART_FLAG_TC: transmission complete + \arg USART_FLAG_RBNE: read data buffer not empty + \param[out] none + \retval none +*/ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag) +{ + USART_REG_VAL(usart_periph, flag) &= ~BIT(USART_BIT_POS(flag)); +} + +/*! + \brief enable USART interrupt + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] int_flag + only one parameter can be selected which is shown as below: + \arg USART_INT_PERR: parity error interrupt + \arg USART_INT_TBE: transmitter buffer empty interrupt + \arg USART_INT_TC: transmission complete interrupt + \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt + \arg USART_INT_IDLE: IDLE line detected interrupt + \arg USART_INT_LBD: LIN break detected interrupt + \arg USART_INT_ERR: error interrupt + \arg USART_INT_CTS: CTS interrupt + \param[out] none + \retval none +*/ +void usart_interrupt_enable(uint32_t usart_periph, uint32_t int_flag) +{ + USART_REG_VAL(usart_periph, int_flag) |= BIT(USART_BIT_POS(int_flag)); +} + +/*! + \brief disable USART interrupt + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] int_flag + only one parameter can be selected which is shown as below: + \arg USART_INT_PERR: parity error interrupt + \arg USART_INT_TBE: transmitter buffer empty interrupt + \arg USART_INT_TC: transmission complete interrupt + \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt + \arg USART_INT_IDLE: IDLE line detected interrupt + \arg USART_INT_LBD: LIN break detected interrupt + \arg USART_INT_ERR: error interrupt + \arg USART_INT_CTS: CTS interrupt + \param[out] none + \retval none +*/ +void usart_interrupt_disable(uint32_t usart_periph, uint32_t int_flag) +{ + USART_REG_VAL(usart_periph, int_flag) &= ~BIT(USART_BIT_POS(int_flag)); +} + +/*! + \brief get USART interrupt and flag status + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] int_flag + only one parameter can be selected which is shown as below: + \arg USART_INT_FLAG_PERR: parity error interrupt and flag + \arg USART_INT_FLAG_TBE: transmitter buffer empty interrupt and flag + \arg USART_INT_FLAG_TC: transmission complete interrupt and flag + \arg USART_INT_FLAG_RBNE: read data buffer not empty interrupt and flag + \arg USART_INT_FLAG_RBNE_ORERR: read data buffer not empty interrupt and overrun error flag + \arg USART_INT_FLAG_IDLE: IDLE line detected interrupt and flag + \arg USART_INT_FLAG_LBD: LIN break detected interrupt and flag + \arg USART_INT_FLAG_CTS: CTS interrupt and flag + \arg USART_INT_FLAG_ERR_ORERR: error interrupt and overrun error + \arg USART_INT_FLAG_ERR_NERR: error interrupt and noise error flag + \arg USART_INT_FLAG_ERR_FERR: error interrupt and frame error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, uint32_t int_flag) +{ + uint32_t intenable = 0U, flagstatus = 0U; + /* get the interrupt enable bit status */ + intenable = (USART_REG_VAL(usart_periph, int_flag) & BIT(USART_BIT_POS(int_flag))); + /* get the corresponding flag bit status */ + flagstatus = (USART_REG_VAL2(usart_periph, int_flag) & BIT(USART_BIT_POS2(int_flag))); + + if (flagstatus && intenable) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear USART interrupt flag in STAT register + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] flag: USART interrupt flag + only one parameter can be selected which is shown as below: + \arg USART_INT_FLAG_CTS: CTS change flag + \arg USART_INT_FLAG_LBD: LIN break detected flag + \arg USART_INT_FLAG_TC: transmission complete + \arg USART_INT_FLAG_RBNE: read data buffer not empty + \param[out] none + \retval none +*/ +void usart_interrupt_flag_clear(uint32_t usart_periph, uint32_t flag) +{ + USART_REG_VAL2(usart_periph, flag) &= ~BIT(USART_BIT_POS2(flag)); +} + +int usart_write(uint32_t usart_periph, int ch) +{ + usart_data_transmit(usart_periph, (uint8_t) ch); + while (usart_flag_get(usart_periph, USART_FLAG_TBE) == RESET) { + } + + return ch; +} + + +uint8_t usart_read(uint32_t usart_periph) +{ + /* loop until RBNE = 1 */ + while (usart_flag_get(usart_periph, USART_FLAG_RBNE) == RESET); + return (usart_data_receive(usart_periph)); +} diff --git a/Ubiquitous/XiUOS/path_kernel.mk b/Ubiquitous/XiUOS/path_kernel.mk index 46d8624e2..6621c6520 100755 --- a/Ubiquitous/XiUOS/path_kernel.mk +++ b/Ubiquitous/XiUOS/path_kernel.mk @@ -80,6 +80,15 @@ KERNELPATHS :=-I$(BSP_ROOT) \ -I$(KERNEL_ROOT)/include # endif +ifeq ($(BSP_ROOT),$(KERNEL_ROOT)/board/gd32vf103_rvstar) +KERNELPATHS :=-I$(BSP_ROOT) \ + -I$(KERNEL_ROOT)/arch/risc-v/gd32vf103_rvstar \ + -I$(BSP_ROOT)/include \ + -I$(BSP_ROOT)/third_party_driver \ + -I$(BSP_ROOT)/third_party_driver/include \ + -I$(KERNEL_ROOT)/include # +endif + ifeq ($(BSP_ROOT),$(KERNEL_ROOT)/board/hifive1-rev-B) KERNELPATHS :=-I$(BSP_ROOT) \ -I$(BSP_ROOT)/third_party_driver \ @@ -254,6 +263,9 @@ endif ifeq ($(MCU), GAP8) KERNELPATHS +=-I$(KERNEL_ROOT)/arch/risc-v/gap8 endif +ifeq ($(MCU), GD32VF103) + KERNELPATHS +=-I$(KERNEL_ROOT)/arch/risc-v/gd32vf103 +endif endif From 19bd5a4705efa0b45f81321d110d23ddf1f7d1a8 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Fri, 3 Dec 2021 14:07:05 +0800 Subject: [PATCH 2/5] repair the uart input of gd32fv103_rvstar --- .../gd32vf103_rvstar/third_party_driver/uart/connect_uart.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c index 431a8ea1d..988e6d0e2 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c @@ -215,9 +215,8 @@ static int SerialPutChar(struct SerialHardwareDevice *serial_dev, char c) static int SerialGetChar(struct SerialHardwareDevice *serial_dev) { - char ch = -1; + int ch = -1; struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_dev->private_data; - // struct UsartHwCfg *serial_hw_cfg = (struct UsartHwCfg *)serial_cfg->hw_cfg.private_data; if (RESET != usart_flag_get(serial_cfg->hw_cfg.serial_register_base, USART_FLAG_RBNE)) { From 644f2bbf37d6409da401aeee17fe0d9d5c7d9747 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Fri, 3 Dec 2021 15:38:10 +0800 Subject: [PATCH 3/5] add gd32vf103 'README.md' --- .../XiUOS/board/gd32vf103_rvstar/README.md | 57 +++++++++--------- .../XiUOS/board/gd32vf103_rvstar/board.c | 2 +- .../XiUOS/board/gd32vf103_rvstar/board.h | 8 +-- .../XiUOS/board/gd32vf103_rvstar/config.mk | 16 ----- .../gd32vf103_rvstar/gd32vf103v_rvstar.c | 9 +++ .../board/gd32vf103_rvstar/img/gdb_load.png | Bin 0 -> 65304 bytes .../board/gd32vf103_rvstar/img/menuconfig.png | Bin 0 -> 31728 bytes .../board/gd32vf103_rvstar/img/openocd.png | Bin 0 -> 53489 bytes .../board/gd32vf103_rvstar/img/riscv_gnu.png | Bin 0 -> 27518 bytes .../board/gd32vf103_rvstar/img/terminal.png | Bin 0 -> 51851 bytes .../board/gd32vf103_rvstar/img/vscode.jpg | Bin 0 -> 57472 bytes .../third_party_driver/gpio/gd32vf103_gpio.c | 9 +++ .../third_party_driver/include/connect_uart.h | 4 +- .../sys_clock/gd32vf103_rcu.c | 9 +++ .../sys_clock/gd32vf103_soc.c | 9 +++ .../third_party_driver/system_gd32vf103.c | 10 +++ .../third_party_driver/uart/connect_uart.c | 4 +- .../third_party_driver/uart/gd32vf103_usart.c | 9 +++ 18 files changed, 92 insertions(+), 54 deletions(-) create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/gdb_load.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/menuconfig.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/openocd.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/riscv_gnu.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/terminal.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/vscode.jpg diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md index ac6520e45..e880c502b 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md @@ -62,31 +62,32 @@ cd kconfig-frontends ### 编译工具链: -RISC-V: riscv-none-embed-,默认安装到Ubuntu的/opt/,下载源码并解压。[下载网址 http://101.36.126.201:8011/gnu-mcu-eclipse.tar.bz2](http://101.36.126.201:8011/gnu-mcu-eclipse.tar.bz2) +RISC-V: riscv-nuclei-elf-,默认安装到Ubuntu的/opt/,下载源码并解压。[下载网址 https://www.nucleisys.com/download.php] +![vscode](img/riscv_gnu.png) ```shell -$ tar -xjf gnu-mcu-eclipse.tar.bz2 -C /opt/ +$ tar -xjf nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2 -C /opt/ ``` 将上述解压的编译工具链的路径添加到board/hifive1-rev-B/config.mk文件当中,例如: ``` -export CROSS_COMPILE ?=/opt/gnu-mcu-eclipse/riscv-none-gcc/8.2.0-2.1-20190425-1021/bin/riscv-none-embed- +export CROSS_COMPILE ?=/opt/Nuclei/gcc/bin/riscv-nuclei-elf- ``` 若已存在`export CROSS_COMPILE ?=xxxx` 应该将原有的语句注释,再写入上面的语句。 -# 在gapuino board 上创建第一个应用 +# 在gd32vf103_rvstar board 上创建第一个应用 -## 1.gapuino board 简介 +## 1.gd32vf103_rvstar board 简介 | 硬件 | 描述 | | -- | -- | -|芯片型号| gap8 | +|芯片型号| gd32vf103 | |架构| RV32IMAC | -|主频| 200+MHz | -|片内SRAM| 512KB | -| 外设 | UART、SPI、I2C | +|主频| 108MHz | +|片内SRAM| 32KB | +| 外设 | Timer(高级16位定时器,通用16位定时器)、U(S)ART、I2C、SPI/I2S、CAN、USBFS、ADC(16路外部通道)、DAC、EXMC、GPIO | XiUOS板级当前支持使用UART。 @@ -108,7 +109,7 @@ XiUOS板级当前支持使用UART。 1.在VScode终端下执行以下命令,生成配置文件 ``` -make BOARD=gapuino menuconfig +make BOARD=gd32vf103_rvstar menuconfig ``` 2.在menuconfig界面配置需要关闭和开启的功能,按回车键进入下级菜单,按Y键选中需要开启的功能,按N键选中需要关闭的功能,配置结束后选择Exit保存并退出 @@ -118,40 +119,38 @@ make BOARD=gapuino menuconfig 3.继续执行以下命令,进行编译 ``` -make BOARD=gapuino +make BOARD=gd32vf103_rvstar ``` -4.如果编译正确无误,build文件夹下会产生XiUOS_gapuino.elf、XiUOS_gapuino.bin文件。 +4.如果编译正确无误,build文件夹下会产生XiUOS_gd32vf103_rvstar.elf、XiUOS_gd32vf103_rvstar.bin文件。 >注:最后可以执行以下命令,清除配置文件和编译生成的文件 ``` -make BOARD=gapuino distclean +make BOARD=gd32vf103_rvstar distclean ``` -## 3. 烧写及执行 +## 3. 烧写及调试执行 -gapuino支持jtag,可以通过jtag进行烧录和调试。 -调试烧写需要下载gap sdk和openocd,下载配置方法参见以下文档: -https://greenwaves-technologies.com/setting-up-sdk/ +rvstar支持openocd,可以通过openocd和gdb进行调试。 +调试需要下载openocd和nuclei sdk,下载配置方法参见以下文档: +https://doc.nucleisys.com/nuclei_sdk/quickstart.html#figure-quickstart-5 -在SDK 和openocd安装完成以后,按照如下步骤进行调试: +openocd安装完成以后,按照如下步骤进行调试: -1、进入sdk目录路径下 +1、进入xiuos目录路径下 ``` -cd ~/gap_sdk +cd ~/xiuos/Ubiquitous/XiUOS ``` -2、在当前终端输入 -``` -source sourceme.sh -``` -出现如下图所示的界面,输入7选择单板名称; -![choose](./img/choose_board.png) +2、编译生成elf文件 -3、先按开发板的复位键,再在当前终端输入 + +3、使用USB先和串口连接好开发板,进入openocd目录下,再在当前终端输入 ``` -gap8-openocd -f interface/ftdi/gapuino_ftdi.cfg -f target/gap8.tcl -f tcl/jtag_boot_entry.tcl +cd ~/Nuclei/openocd/0.10.0-15/bin + +./openocd -f ~/nuclei-sdk/SoC/gd32vf103/Board/gd32vf103v_rvstar/openocd_gd32vf103.cfg ``` 在当前终端连接openocd,连接如下图所示: ![openocd](./img/openocd.png) @@ -164,7 +163,7 @@ screen /dev/ttyUSB0 115200 5、打开一个新的终端,进入编译生成的elf路径,输入例如: ``` -riscv32-unknown-elf-gdb build/XiUOS_gapuino.elf -ex "target remote localhost:3333" +riscv-nuclei-elf-gdb build/XiUOS_gd32vf103_rvstar.elf -ex "target remote localhost:3333" ``` 结果如下图所示: ![gdb](./img/gdb_load.png) diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c index 3e1ee1d3c..0655641fd 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.c @@ -12,7 +12,7 @@ /** * @file board.c -* @brief support gap8 init configure and start-up +* @brief support rvstar init configure and start-up * @version 1.0 * @author AIIT XUOS Lab * @date 2021-09-02 diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h index 750debd41..fee208c50 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/board.h @@ -12,7 +12,7 @@ /** * @file board.h -* @brief define gapuino-board init configure and start-up function +* @brief define rvstar-board init configure and start-up function * @version 1.0 * @author AIIT XUOS Lab * @date 2021-09-02 @@ -20,14 +20,14 @@ /************************************************* File name: board.h -Description: define gapuino-board init configure and start-up function +Description: define rvstar-board init configure and start-up function Others: History: 1. Date: 2021-09-02 Author: AIIT XUOS Lab Modification: -1. define gapuino-board InitBoardHardware -2. define gapuino-board data and bss struct +1. define rvstar-board InitBoardHardware +2. define rvstar-board data and bss struct *************************************************/ #ifndef BOARD_H__ #define BOARD_H__ diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk index b2ec28c46..203020e6f 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/config.mk @@ -1,20 +1,4 @@ -# export CFLAGS := -mcmodel=medany -march=rv32imac -mabi=ilp32 -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -fgnu89-inline -Werror -# export AFLAGS := -c -mcmodel=medany -march=rv32imac -mabi=ilp32 -x assembler-with-cpp -ggdb -# export LFLAGS := --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections,-Map=XiUOS_gd32vf103.map,-cref,-u,_start -T $(BSP_ROOT)/link.lds - -# export APPLFLAGS := -mcmodel=medany -march=rv32imac -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=XiUOS_app.map,-cref,-u, -T $(BSP_ROOT)/link_userspace.lds - -# export CXXFLAGS := -mcmodel=medany -march=rv32imac -mabi=ilp32 -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -Werror - -# export CROSS_COMPILE ?=/opt/Nuclei/gcc/bin/riscv-nuclei-elf- - -# export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO - -# export ARCH = risc-v -# export MCU = GD32VF103 - - export CFLAGS := -march=rv32imac -mabi=ilp32 -fno-common -ffunction-sections -fdata-sections -O0 -ggdb -fgnu89-inline -Werror export AFLAGS := -march=rv32imac -mabi=ilp32 -x assembler-with-cpp -ggdb export LFLAGS := -march=rv32imac -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=XiUOS_gd32vf103.map,-cref,-u,_start -T $(BSP_ROOT)/link.lds diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c index 6d592b002..f60645331 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/gd32vf103v_rvstar.c @@ -5,6 +5,15 @@ * \version 2020-02-05, V1.0.0, rvstar board functions for GD32VF103 */ +/** +* @file gd32vf103_rvstar.c +* @brief add from nuclei SDK +* https://github.com/Nuclei-Software/nuclei-sdk +* @version 1.1 +* @author AIIT XUOS Lab +* @date 2021-12-03 +*/ + /* Copyright (c) 2019, GigaDevice Semiconductor Inc. diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/gdb_load.png b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/gdb_load.png new file mode 100644 index 0000000000000000000000000000000000000000..854815a2d7e0125b7b2fe6fb7583db7efe1cd371 GIT binary patch literal 65304 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 @<{0E9lBb5 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 literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/openocd.png b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/openocd.png new file mode 100644 index 0000000000000000000000000000000000000000..356b7254d6a468ddb709dd0a0e425cc10d7fe8bf GIT binary patch literal 53489 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 literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/riscv_gnu.png b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/riscv_gnu.png new file mode 100644 index 0000000000000000000000000000000000000000..f065e9f09d06b5e7afbabae2e820fd9c8ee329e0 GIT binary patch literal 27518 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 T@4DE;pQEO#bvRY!)Rlh&C1R19 literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/vscode.jpg b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/vscode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9bacff78e4b635984f01459c6c41720bcd7f3c6 GIT binary patch literal 57472 zcmd42byQnV8!j5$-HH}1P74$ov`CQziUju-Da8p6h2riZxI=;mEAFl>6!+pTr4%X9 zmP5aveCM8X*S+WdcX#$$v-X-j@B2LOJTtRLayNgs1|S71f)oL0XaE4({SR=r1ds<{ zprik}?=Q^z8w(c;3lkFy9|s2;mk^(jkN}^6fQXo!l!%y&n1Fzknv{%!l8TCokc8#| zHRS_xN-D}fM$j5)lwl{(rvix&UOjXl>~B7-*~jbTTvyGPJus0K+{< zbPTjVc>lSuaqcmqq2u1?nvw$0F#bR%z{SSF#=ycPKtspC1YnV2ld}loP-s%punNgS zUPBY%6I7zwI&QF}T52{e*T5QFVL6xlo(=Y=BIX~uIplR81Wm4=Dp=Hg<9wlK8JwI_ zfGF<0w@-iX_mB5~T;Hc?Sm+oynArE38e{-8baYHCB77puzh3(DG8rZoiy%3*tY#uM z1?5xGd*^{k_qM56g|u{B@@u*`aA>r3EnI_O1&G=Y6KukAR`Lq$=HCiA?iK-r821*) zFvtMU0YB%gg0@%s8T$zfgHjjYVYxGy#LLOg6Z!sdra2Rw~TIFmE=obBI(ra};b&#+4rH{%r4oN@^9bOWWP8c?F zCBnYoh+ps2pAW@zY@=)v&_`3v;+aBA#i__*3gqLNBt`pO3u2ftD(w_taFlfO0>jA? zPEM}*{z?Ohlyv{}l*ai>>(ElZZ24!(m!5f*_6X1cMkrC;;fOMX$@wBm4E~&dI15h`4pHqpYFJcQy zb$#15*H*~5^y>T6k%>fY_ipigOE`zoXG)+WE$x}!-jEd9g6_k^2gY#ZY(B7Z&)EH` zPna=e2@LZT_av9APV969z6lG!`B^nJop#`xsj$<&4e@jc9#^k%`-{dw&r~*p4fiF% z(`&*fh)Rqwt%3t2)1JyP5@bl4SR*TdlmItDcNEnHDeDQ@byk#K+a%`O8mV_x$7mPYNb=oL#nIENxHu#;3r5qL>Es`ydEjmxl{(zS-4mZ+N0 zV_i8kjisyv?F7*qsl7(k75W*NqvmZ9WBu>lxJ`&DKMgJ(SiZ@rq9+m(_E{^2$wIgq zC-y!3-r3^4GoG)ld`v!m(ZzrHgp^k)8TvfRZ@qF0M_o1;H@*ND7Bh}DzsRWzrD*4N zz}FQXbUvzlwO3zmkC!M=DLI?3Z3mC|HWje+HY^W+W}9Ut9x0V6yO}`;pgz2pU9c`< zVfjC-l>RTQ3TjA~Cg7lG1ko%m9!s@kG1;vDn(o;k&&m@RNZGWBq)!+NsB~ zFN~tL+%-ozW}dG#t`l-bZeVX_S<=}9o^QX;LHxsGs@48~;-O2a7W?#P`!kEQa-)iN z9w8>9{L&JY5wOb+<@!AKMq+>@OEUXrsN&AKt5qb?^%OfenwZ^y2K0tYC5~DL*dH@$ zqlt&Z%>$WsM%z*s{UbM@q`&pn^tS*kZTGD#{Izc~zQ97=ZJ`n{Z^UNW8jy*Bm#KJC z^mDb$~}QMsSd54lQf5kKAPc&L&4B8j|D5suvEE z5f}@XcR99HcblC(I~+}hEJ69{JjOsLIL2N2Wx;pTvxGveZbvyYg-OGQAPDThvV$7G z&73MLsDkkF+SLq0(G+#J`r#L?r)o|OMlG|8?tx^WByGuRtg*|Jw z%0pjplXJc$1H9+)v0UNHN$-`Y!|B6j7ImP3;G(Kf$oo1N1J-sHdVm~w5;)^pS;4oT zZQ$HE0GT7hmye0HXBESO}-*_mE0LU&`@GYRE>iwDDrnWe1;E-Hr(U1!{!zM!^Xe77w=!0f{B#wEvWRrz^aE z2l)D?jV^2v79>E9CYOLn_`U#AUJL@BaxdCDF1@k~=Sk92-*$9|Axz<|JHiMXR z1-RW%hlq?yaEc87OWO9J3P|s*qB98sKW2ZAyLt8a^DLAxB_D%XcLA5!Q<}AKpD%UKed7K}Z1dh==7WPCKxYBM^$>g?oPS2cf}Q+^mVNipkZ?wU@R8Zueub_lG%(jD zV(^ZH-7$f7b-HeOMG-;>2Ip^9Lk|FPFz<3>!qmiIpek|M&!p#YgCM?eODTu8*0%|V zA*5FautP_7VvImTH9QEgE(Po*y<^@tcT*N z;imGFU;J#ip?xS@Lzp5iq&Y!}kO|Yds$G9xVcXJqIi%#~+JCXZ%}LoOsc?ZjcPiEM zm;@|m(`Hc%o<7?_{W1foO&2F~_6OKXORshg(OftFkOT5_~U~lxQN$j+o^G3R^ z_=a&dQiXByyp{SI(+eh2ubLnW*YPoo@~_7H(t z1k^QHx7*eBy&la>ezlum*(q&{n-L8*rh9Wmw{M$OB-#+!ZsADntQD9eAqd}05fU`u zRGv;Lp+?E_yc`Y_;BQ&x-Z8uq4}+6$K=M%C-0XzTR5t#gVhgz$DF!iVvLqsu6s>wM z4bz?gv-CPd0%84LiMU$37#Xb)ha>xo{!>z(facM5Bf=@(#W2~yW_QVSh8xraKX47o z56QUbone>954!3}kJ})OwtD3^<<;Oo+ZPE)r4D9gNvOS$H_f;8dnPUwwXrh75Z+SC z*R3_$Gn%Gl2bPNhvB!`NN@sL?Kl?@XzS)Sg(!K0xa#V|soH7~al~9}PWiaNIlr__7 zy+2nNtuUoJW|})g!|ApJelweX^|#GA z+m|V~`RsklsA}EvFn`@>w%yD8?U05}F=hr1)5Kr{iqaEqzpMU%w|?ix-V+>MjY{S- zStUNicJbhwNdD-u$KT1r$sd97pmnu%;d7x4lGJpE4Lrw6`{t45amYIqntNwCtpD*acvOwuBXpSiPlLwH8_la?BqPd(-Se9 z&CPCb@@KO_`bN!But_CK40y=_!N>o z+VwvFzPLy+_%HJg{nM^2A~S*<4vil<0f7fY>&8*q!!)uqdPcs|;l?WKM!k7I430lp zXO=!%PJn~pn?s->(3t(1r5~?6vz*08#iuy*A5pwB+f?vwdyxPA%US+@meV^oq-;`)t~FbCRL?%*;p2`L=$qvNwrEP~LF}{Hb zYkqh$D@Ww2!fBGvgvXACu4hT-z}W~aN%ebjxBAA`uGqf8L9>W{+S9H+SgprLrFy~T za^p&RQ&}!+VWw`qM?PX$SJIJo(-bg24UF%8LvL(twU#`^DqS|CfFE5o+0T@S7DP*e zgZ0TNNS20v=kXTB6A9CHkGXes%Lx&OE-O?|V3V0F#MR^o_+tiTh;AM<&OPoqh{Vt_ zm%HW1d-K=yzScRQM-qN|5LlKgmlHSU&5w-g7VXc&dp?)_9lvbi>OgO$sC}s+=LX7M zoaN4e{bFb!W^T^34PlJ*vbu6Ekk33d-kL-#&hLwy(J22lm(vZD;q&9Q8*LNupf6dk zPcRbZ-%~wr^at@C*Mz0L+3I;!c9m?$|tGE z>Xl!YpQKswrB3!v$awdyN*=X7SAg?R*=dK!}a zDh|`R8x^+_WPE};L2ZfGrC88V zgiTVqK!Rg}1b+jIM((ksp>$VQyrh%S+RpPHH#Fpf+~EkYi(REKgQ%%H2#gMgBiJ3} zb13N!YOv%T>!PuVomt<1E-H>jZZH&6 z*{))5Qee~3DRe(ms542c1Ky||kAT0hMRo%>yP%bpap{#V_N<@Fr#2q= zsjsuhY=y+OwQ1IoO4#A-r^Mdmy^E55`b%h{Q=0^;G*E2S|L{~yk!PkuFL>WX@5VEg zb)9?TJ5g`i9l%W`VA&Zit&J$1=6>hX6;7E|il)DzD5&|aq0aouJsq0P)hb{#ns9JQ zmRzc!G`wh6d}CGkzJzHbKK8k4ozo1)vgWsNjj0IrZa>8Y>EC+!CKgiXKo>hUW8Nu`>h#U8&fc&ZnGP%XX}dKX$uBEOWEU zQSNMsl9M8mV97+yL(JrAvSYk@|Dt~XPn&p|O4BDMsEayldkFsYu!vT(zZox?axegO zq-fL^U%RWwUm$7fnr{ojaHb;^D3+gFD>jf%iQ8j)htM-qM^ z8t%DX1zx|N5K&kjKpEEo?_Sja>xR0zD-hXvY}Z&!$=DD-KRjJCx>Q-CCqkVMexjzH zsPq8H=3v;X#G%0R;aCI6+%3a=Ye&C0r;tZ<>8$AGU)|vU^* zfZnW9+Q%)_;7$iYY`KdsjR{0%ToM4?uEg6{q;n8vd0J#(++31%R44k?P&cSHBqlqL zy{WLvItA44xG2H|>sa12TALTYhUwDV)L_*l9dZI(#iWv9-%ILrQuJSIu&8o~9WoEv zY`HSW1dp@UE(iwn%rbIR9GI8)be;6ko>d7jK5LdfcSL_1gTKYsZ&gco2Y3qrtKo9m zHF3yn5uOfUK`%&@Yee`@9456xkk@K7`1B64xC}6Oj58R5u9SzL{D_^(<_?e=7SNjc zP}|ZM!Kc*RQthlaYvDMtl%>0=%TSr?#OGfYMFq(Qp_}BFC*njVoET zHffYD0e65*sv){v`NZ7B@TOEh7?H4}#eIaB^zu z4P#;^X>r{}+(8nYhz+|8A0w5N+ZgL2oaJmfNseJ7+e0#17(SgEwrFOgA}l~rSJl7L#GUs__CxeAQR$*$~R^*2)XT{Y^bGdbu~r?*>|Uf^+r zi+R1#wwH9y0$h%`I+)sm{6SK98uT%9$}k#8gLy4ZQl|2@T|oSzeJJX^pb84u8}|Uw zgb-sMGIa4qU*8NILNoki=RjUh8V$sGC}Z#crS{)8{69CZlkyw+HwfK?eV$Zzn$A``y3McL5PI`%Y%gn#3*iMB?P;-pL-d* z;R}xk_Cd0us>?JTfm+kOO~C&I3q8j4w!Qn~B0k@gDES4=%}>U2RUTd1w!v^J6y9haLqT11-JQ?bgKRnEIHy$>>q>!2garY+c*H*vfDUMbpPN6~sry;0 z#lB=!WQ#^-ym8smvzGffq^{I1h$Wj54MKoLF)&42i;IRblwWO7|5)`=k1IXlc|%q+9q`R@|vewHWqumn0bj^-Z&vO zDocgiP{u(*XXuh?@d`PXmbwx0&83pOzV&*q!dD{rvug&4bi;p7P2K^{bK>s+HjHoXe(f(q;2^ zfW<ass#F17O4U}wppM##mxnpS$5-N2*r11!TEJ}8BS z{Hq45DyTT2XuPsPo$_+6Zzsm(?g{U@dg|Ky`k_4mHF7CtKr23+qwQ!^d5} zns1|iX#JBt9hlFt!gq@7OUGMC67Ts`qei_2gg<`GwT!OoY2AgtGEbzmHQ+-T&NgH< z^tG-aoX#DKKrZ}=>;_5R6xJi8|Nm-m=WY9=%lgh|wsAN5?hdFf6gNi6uG=eYRu*W&tWEE!CWJ|kIBmQdz|C(Wxbx-em3Fg@sIi|}8n{!>xKqo>au-*0qKJ#^_8EW!w_C*oFE$Jk5=U7;92nN9b;OR*s?VUB3BkOep9P5k$>?6(lO5A%}lXr8@*|1d!Lb^ z&qxSMSj_`bh8J(TFaw;Cgb6v;R0appn=KYax1YAdK7XG*R%f+yXwELza@DR*iUV>0 zOWBFx=Num((OV`YCHiTc1cCBC-5?vaaGx&9L{ck>CJV`?Hx2qS4DZL+DjX=->JQ%` z*(w(I;%UT57GXRJ?t>J_^CxvJPz$hgx_DsC}>8S~b@ooh$N z#fZ3-8+kr@I`irFU1DoB$WbWTPfc6A$2W3Br|%B1Y|R%XR2kZfvrCC_94@c!3K@8luiHi&!ONYMDoQcd$yiDdeh~S?*^pOCY4eUg&%U z8>?-V2V${%%VGu}Rz*+$Xylf%l&}*GYuGG(J;y*hd|F$po|-B^m3O}?jAn|3*u=+S zV~ZCb#a&z5GCZXZue545dh#6ca%Z0Hkx0>Uh@u1k{lqa^4w4q5pv=vQiM?P(!tFP% zDC(3uskZA8C{02A;0fEP)g}BzGYK%KSqLNgOTA^um1S_!w*C>7R!<|iDc?4dahO{U z7Rrq{0hCK9RUGS8&sLsa4_{7`oA`Vrq)(17y|L7-XtV{^o*zAmJuuQ*_K+OL;~#Pm zV5tw#mYYmj#w9B6rblm1$~dSMquoh2s(jk8D4z{UsR>Bllu+|#fcBd&XC*dS5^jp% z>(z_2yCHe5^4Iri9BSxmj2fC9tnf{LxR6|Y#Y##pJ&}M_VR}i(d3+12?S+wVWH_iH z>u9JogzMQd;v}<_=zbKVJ6D|E0Z`IqOBF81AC97(T3-!?nJVt|rNF1#SRsLCc(HS@$ zVDbuICVLc%cVi<`H=W1a0$aEg0B@f63L;^}-N0S*O-7xC6K+4)9xFJcG;ZY9XBR(L zihf)_BMH#c?ZEE_1jj4iZ-CK(p+AHe%~cd7j=7Kn%ki{oV!H^HonZsaO7wiin!uzWT*fS1*oP zp4f$@Y+=j@nPMN63l_Mt)L3jg{ z0oI)1XxTaBNto92L?K8i5oGtJr`u0M_dUliYfgpC*A-7vwws*dRm}lb0#TPiOGo7}7YpZx0J< z62U#$Dal{B@s&_fz>pMuxuI`46!7su+!|t-uGn?A|Hhv~JpUXuOe7TMNP-!TMB4H= zqmx7rSt6_%?f{XMs^QD<+jz;^|8y;SBIGVF-~Or3KXu6!v{D-d)O|rsMG+LRrywXXVwb3?Vy=Z_w9g*ZO*U*Vt-gM?n-dI8 zg~~CSi)(D;$dQv4FtVe47yu;Y=;&PigDsW+&z4+{7eG&qxUhN2qPEYVQfL(H?vT#{ z1ZO*yJAZq)D6{C_i```MPrb1os5K2Y^CL&R)wzp|;ubWR2;QnqbA~6NMa}+C;#L1T z7w%4Ux$EwS>u`ORld?fSHeK3ZYKtN1j2|a#_!M>PkUknLFl2Pp8#aMwoQ@e1$^-(S zYZnGN;|M%e$TvP5MoX!MuKO<{p79E&TpA{XFJux;LLvo+xtGNdL1^H%Cbm>EV~M1= zhLm71Hzc_+40!uCdNlST_58SYazuA6roN+bi&Q(gD%0T_6@w9f%$4lCtrh9VZTQB< z;}v&tB9Caw%gBU?;e**TBuh=@(+^GDhq>!U{BC`oT+tMHH% z0hEGWJFWYBn_ApCA1WiB>n4ZLVn9d04Vz9ef^~6|*w8*(UoYpQcLAG{nD2D5smqF| z6dB3megs(A8LxYZp^X#^od2@Yp67BLrk3g;8sUveyDS;VIOE9`q5Aes z)OP^Q7A2h1_Oxc>c~MGJhdaO^e(Tm9K!u3@MnQD@p~_2#QZfUO6;|TS<*HVoDbog! z-x!V~7?TxqV|Szbc1dc?cV_W~%f)0`RZ}q25I*Oc-(J?6N65!Z@5^VwGXQz(e(qiR znc=js+%{7^=*E}7mpzUlY1p`C3%j;vqO!V#UcCot+0ii*xO?KZ9rXshb+Sv_$%=fjtIZWVCVX3?5{-oUZ4T7*El&|{%&Vy zU5JUUl%}VloLVyz!t=yU$o`wY{w1PIxIdkYfLBMfBP#*}=*NiTMN5y{I`4qtlybsqaec zt;3_%7ZR#uFnw(PGH8D6ddAhZbO#7U|1ZMTiH4$_eYxClTqmwo0cANabWbmCz2IKj zW46#Y(f7QQvZs!rrw5t8eB0Y_E`Kop;2iS)#(*WN^Kjsqvg-eiQPuh_zb3v>1xK9< zm>A<*j$Ec0l6@`l5WNm*rE*jr3Xkcp* zt@gy8FcvPoyytB9S_{dZU~<0-7KE+zL#uV`_kwBnX%#r%@b*5svu(X_P8>ocbfZgMMzcl{mB|x3O(jEE20NpN>~nl*cts zPUa73+1~-$#SzVfT@Eb$?tC1NQI@a(>Qr5H5GN<_lh&`kcrkyksivge$6x6ZEDOM^ zt>>XdpL&cOgpOuovNyo5>LyL)jJ+D-Di~hlLRoku)qsJ4hMFQB8FD+oTkM zE2b)it=c#Qw2`T_8C%%KE_i%M00)P@t8GwCmL;!bzb`LBh0Kj36U^2xKOp~70;?FZ zls&E26aY~^h+D~*!RT@Z%vvCC#A|ZOjO#|+ob?R29T{#CyY#ZhC&Dx4z9fCCB5{)y zw&%>P?Pxn-;>E_a?THz*!saiGZ`Wk=3#KpxxAv*_E2xzDNH|g=2k{ul*BQ{&)Yi~O zyu4kFTcxJ9P_pH#}Lav+`a|>otpZ<1O zk*S|Tx{mez;Z21}Nx)@F%ZGxYUyobzZ)W$gzk9e?(l&x36TVlWXxIY`d38Myp}d}m z(=iJZZn|d61rMDcHP}iy`Ua({d+~h;z zy?>z_ovv>3!2^WP<^x>AXiP;jR;+)Swk)9K(MfK(7h6Bqh?a`!DQ9>{4W~l8=}DDk zM$hhwvm_qWnSe6CFXl{GWsCpuxn{x(GhqlLeU&Zz$F!&X-o4vducY5&(POt|c(yGC z3wF)IGpOAi(FX@}zrb4K-b^|{k`JG;f7^zYovT^mo8eT^f zg219g@q(2lyy9pX;*A9-ylELhIHMg(1KD~C3j_M&)&^{wMl7>ov}r-V80{V%JjVQ} z>t^b?VoYTxI#EI<<@j7`Xtt3>m`9$AM{7x!bf@2vgGFTxxQ5m{4AH$&nj&{1{*-C& z50IXux25NHut&W@)+5=iF`RLRbGfzy`Ob|yX-f4FJvPcQJ-6 zzj9;!f~G@7F%O@tgvqZ&3Jz=J1YyE^a^IT$Q4&2h*`*uG741q2TZv&VVzFmH|5)+3 z=v&&&JAh<-tdg7c9f08XSHnKrM`o9QXd0lhAKA3}tu!Yd#~Z1*h_4-zrbDgJ&erYO z6DZn&!#G`R7_5024XzZ3B`wCTJAkWE;UIKtm%vb#lXkb!ShiU(^3_UBu!4q2PPRL3#B%q9^Z&4F7F_#s8XKA<6e&IaIwrc4e)w z>o=qK>XPpMu6vhRNFq|z&bg`fukDtHa(95%*|g-pBwYD7_p4`$Om=2I>I47sE_Ra+ zy#sin1bKgD(_~-im;}$;1kc+}{Fm;(#`paG)StQDt@vY!ld@Kv>M5M+nZp0l{nz&A z8=7BV>i&NbN$#k+(5gbQ&T{$KC+e3iyZ1vc6@zZ}QoereCao?(q&H5Kq4%d@y*xhu zF9=U9<3VEDOOI(>6c46iGDDTH38o-pT~osr zcR%)A9W}n}de>I2S#90uiS@w!r_mze?2Je$pOJYbouY*8dr3~rL57%gfv~;=NJ2Z} z^b{;J+$9k)rl9y)P8Wvws>}>eiisOpY+3%&I{LVUJOCi?Ao?UMK~kID`+h@j_v3WI z-k6GRH2Lw4icpbqLin<(dpPNcMlt|D9KAr>HD-<2*DjX2Z>ONCKV)G(nX9yaQ-TzS z;tnw9;Hy1e_y$tEE3T-W5Q4GCzI&|~mHuF2O`6x~;ZHN2Qrk*KSL2BiL0=qtFL_xg zL!L^q<@DmLbb?K${Zm?(MH{ZsQ63@$At!XFFiw6*aF2>a4@`4bAYU^nfq@aKBmhel z-{z4Ica3YQr}+8O-O1wz^!!(bV&97v$>3Q92czDY_=8owqv^uL#u0!nMUFW0%&FmU zpCd)=){<=#%H7&H6BJgq?D%W(E^bWy~s*?r(F96ACY+!iQ1xENWA%RT9} z1%xwUqGvBKvj+wNGtQ5Ao<-B4BL~W^wrk$sb|x3DO5dNT^N?D3`Zd@8S1Z#=#zEib zYBrixFBPvx64Ba9LFgO2C5AA|SEr`|1A<%Quh;DOh3Qp0sY<@lbb{qXu{+k0AN%Kxi#fx!n(S z5(iQC0Z;O$w80}(#lCe*7r!F)>})-Z>2X}3pXW@gUBH?JJ-X zf(z~E0Y^!is?o1uI3WwUvGT*)fwnra?wA|C9n6RgF`Cb|xrQj)kw+yM7_9vQmLPqC zOjl%9^firm{mzewi`jm=Pv6K6%iTYwptue46}0zb6qT?fH;f+kZT`N%98#^AAC&5j zrFhiux=#dLnmy$I;%omg8nZSu!hnDqqepi#fkZs?JiUB-ydBg~!(Q}dY&vC8 z_gU3j9(?9+-RvIDrFtMJN3>2^zk@Z|ETwL3Uf5(9j3lH$20((Fw4lS$v&uRnI1kG_ zFnfCp5h4a!-XAm~mAzl;C@pdB=NL$*p0o}U#;YtYi?S+D%i_9Zy zA54T8QMcXMxlSx&OYop2u`lY*H9j2Y?1_2-jX6&{YDH!`ypTIOJDY>0yli^!S)t! z)n?G~daCi1C9!$358xU|drcW2&*J?N?OB^AsnqhHf>MK(ux4El50!PrbceLF9bGB1 z&PKlRjg%#0P8u_c>0?c`nDx|XxxVb^MT;y=IB$+OrZs6EihUzrrY}cO4&>s71fD7- zh4CW#Bn%xdch|wMFOT+<9lh<9dXgH1rWc3w(QLn@R#$BHZ;q5jKFN+SATGvtuWLyF zX7NUh7c)TT6)bFm4r2?0(8oU4pQ<-Bh^C8yKC}wh`21>k%vSR3YO<3fWtVZFJ zZ@6h})N0Hw)I<bn>v)*R1Du!csBlQPidwpUv0b8gyX~*LRm-w6P*ke~p8U zn6k9DuU+-`C2BrN70`Ad;C9>Y?vmN)cwfq`2ReYq%B;bogZaXl2!9rgI#{}gOPO|| zsR`~^d|ql|q#>Ly%)iW1jZbEff7z6mS6IhaLJq(1;@%R@Zu;MRE<*9$({Z_!cfYK9$#+)8*cU6ColR$i@JUf zL84{?e`R^|Wy7Pk9ZGBR6Y&p>IBZ~fUqb|%9c*6#nv1i)bo zYIZ|<89PVvbQfafad3nCE#XM6NH8Sg|0zkHtUeICanyKEuw5xlVI4&+L7Dsbd!+*} zjYt(%B?ZBR5<;<{-`Ko?$vU+JDh5|x7TKYV)F&Jp_sKZr6R!eRM8<%YH*p{!NM<~;b@2vVX-5C7} zWSngOdK;Hy?2zh%-OFT>qoiEU$DCy?N%cO-w8@pLf(RB&WPfq^{f?I(P;C4Oue!3a zfU`rq0D(fE=r`w$=lb_s6p>#f)6VFQ5u>8t$mMI<#2U?I8aZCDa1P)RnhEJ!Y?7at_XMtcVBz5}Gi>4Yh^fX#T~u_UxZIgF+? zyh7sW)k!G*nM9acUc}>rY{FOk9p!FjeQJ{yVh68hk*`rtEcGMoO-c<@tR{*rs>)xO zqKqEMVUq$Lbf2Te+}zqldC%&95zcKjJF8I2b^wTWH2|;z)woS50@STMPBKiEEXl87 zOQQ}iSuQm~(I=o12||igi92VdkfwUky}9h(+12YZ#z(xTD+gObo5ZgeShYS43!ze=ouDjwKg!oG(T<3bz>RJXNsq<)gjt4{?)I z$2fwv@)t=Q+_N5{%&y|USJsc5e2k{5TwFBv*7O86lf>h37%w{2)QrcAkbAk5=S^^o zKU_~H{l#R>d2z5l9 z-?+?0d?R8{T;B|+KyY%Dz0uNEjpbanl{0(%1j*?m9~%P8naJhD7@RO2oP47d;SltF z)PM!gp}k+97C0zLEM3+xSMF93ffB5JA;)0RV&=Fw6*pqT{#8!9)(2^MvNGu5>`i!n z;>TtaiA6YQGm!s`v&A@$A9V!(K>8FJr%=nFtOs~zJ)u9uS6e20?w4iVLKU}+|2|$M z%l&Zt4VDSuLPAQEKCxli5-pbI{id?)kSE&xlA~dM(?!}@meNK0Ww&Sj z(n6h*wzWma9pE65j4w|JN&aOMhHUObcWneX<76cWGuP`qEJXcYdEc!*alf_Y*!ilm zfjjC|h;i=UkHve3{*7kUdPbD}PvivD|9a9ockf)Pn&(ADnWwSPaQ^kgeIvelJayfJf|atD~KZ6X+5=Dp3ZIp>B*?q<$rJ<^8$b z_}ku}WeZ(^=Gy2vGo=7`lPsp^#}4mb8%G`P-2t*woa*bZL%rGjZI%@bX5PJz-)+3W zvT{rEHD~-3A8HY)c+?}>CzDLk4iXQLc$ zEbJ0i{Y2TL^@lFT&DdB;Mj*d{{`HHGeeMk^-cXskyl2O1f`i>W<7`p4xs&V$-^n>MhjLUi^MQkM>TnE#b&(ZrbvDX@|ox_smr*Xl(U8s|F^`nzk%c5D&2W; zU{^Q{L8db`v4og}MK)ka{{P89^}h{b(Z$GNx|B&Jj1`CXP)JVJfCxwK(eC%Mf)n7f%b? z$HzcM-iuFQXiQ1DI_{N=()YtOjYq(jl_gEQO5V+Vy(%gwDrptq$D5v7%|L}sb?lyG z6JrF@stpc-qJ_MAXnHeoEv|kP|K%ZF7S0=S3Zg=;$qqKJvG>RRBQ;F!4b#ukiAx>e z2+@kHxRGheLvq}9OWbEvz|yZ;tOB`{ABvaXMV6F99Yi>aP4HPh4UIs6L~S497@D*( zV}eN7Ofrj#-yh;uH+_8CNV$lRp4Yt^wOI_RfMKKk9-=K#xF~z9YJ#X+ej%Br*@#RA zIX4~jz_r1V=Q$X|`(l;5ift!M_uEpRG%_;X?8ep)oqo>f7&<&V^Xa*7u{fE<1;09% zT*@E9fB3D=iEWnOTG!2SN(aOj94}iI#zPw=%v^i$Fi(di6fBfL zjc;a0OU=Keza_(f^*POUE|1F13oy=Ws_ONYV&Rc8g z>*BwX3he^E_P=fXW2*)dQF~={2WW8pn&J6(+7D(OU2*!oFy3MFS7JxS73Dc0JSOI! zLcK970Y8OA{$8||Dzj|MR&ht01CVC{upWxHu8{p)OTW~*p3?lJ_dVzMviP}(j{MR$ z$C7{!fQT`>B{(m7s83m7tFQP9)x+LKRcKm>$3~wmF8=Ikrkb0$ z14!_#+Sz@_pQ682+u#{1Upn`f$}Qm@1gFL)Ug#9bvA*!0KSG{Y%4vIrmIK!11K8N6 z7J)iYmkdX(EfuYoPl{8FArCN_Df-sP)ukm5*5^)(jjK|WXWw}mxUwvNa(M!+dlvXH zK`A(tH$_HLY{sbkrgPFR@(s^=oymxS5k~zV1-|xBi{57AfthF+;p1J0H-!aBJChT4~h%J-I(pC8RLN<>O*9FfD zwg-J7J@~R@hGzZh8p$H{Q~g#3XVJdC^P=lQ*nB$1BHBCUuPfEkoi{HGxMCRDnt5bS zYVScT1p*^cBv7;rBdv)kWEjB|KUEi> z-3Vc5r_eFx^nIYdOhLjG$~u~q8qbdES2}&rq2#1`G>Gv&b612Rd8%WPd2M&KxMd9K z6*qavj*qR{bpR&LlZq9q7A6UyJ+B~L3(!6GJDm{*&6 zYc7rN1ZG-?t7*S-6L*Mn4^5*^Jtwjw5l>a6YMU3mn^0g4J((M~g-9khdPPL8T=so} zG}G?6pOx4k$Vv?ank0t=$^D-<#yro?6K1X&I)zJ3)!vG5{{}R@$kL&lc_hN~;%<+LK9t<=W?tyvWido8@zE~TOQE#425lr)zM)^~dz;?kUXYd&BsTBSX2^1DNp zpUbi-dUG9GUCobP|M#o}&y#_D;qh$l7ylJ>ChvQ^vBJ0K zL#NINd)ew;j(}l7&tf8RBX;x_TEnsKxxR|e#%Zh2Msjg!X1{&{Dne`;DC%#>fbrC% zR{U|4Xf7iA{}?b8`CKE>r5Gtho)v;7cw+a$hroK=aQs0@D*KCPMSf4`8^uVnXR8iM z^ll2j-fvkKp_F##zcF>;{7a zduV^A6ML+Dz&K}%=flr2II-W_$ew|S$oC&$B6Q(=tCl@oEecT6jPhe5;Voz3(D^z+ z3|K;f44*4sK$^Jl+?VNZitQAhw&7QwSLUni@#n3b9cvHa*CmzWK}G3r@o`z->3(8< z_`Ka=D&;lJEyY+#^?Z3JSZ`>4aSy$b>g23thnaK8@W=BjC>ROp*{kqv!@k12{&%m2$E&RS=_*R|-EQugOm~BIN)8S05amvp^MSttX%YB^H z@=vA*3yf49+E#)w!I!~paJ(T*%sASfiaAQ!3CX%e7sus6{F>i@ZByTFIJqs;gn~Ox zA4&S+UX0x>Q`*M;Z(2Kdq5gCFIcN5Z?Bfmg+x^KWKj&^%oh~wPbW>fF&=sXKoYM`v z_p+(tiqQ2|C5;?1CM9x%SK9esP&pJ}fA#rK&snsPKu=Y(^zn2@I zAjMEPU$~I57&l*#lga62-jwkK0!E~1qK2&ZuJ+y6@hhGtY<5FayGa1|qvCW-zFZ_a zK@{&wK8$IFfA~F_{0%s-YAv3RFNw7c!zChn@#8+bFa8!7_g#RrXYG@rQZE8w$aKLX zC9${XpQ~r5^5G$}QRg>6G0O*pk~g3Gz%*G8EJnfP3|7La&w4_S11q@M+;P>FZD)(}+ z>a5_LqRe~c=t5+_D4mPDHl!9wii3e0aW?1S7Q(qIvNvOB2u&B$4atPNWxp|bC~{P; zhy+Jx^cRU|1hEQ?P%#r%KJaAY&cx4ccpn}20Uy+RLnoCiBMdwhuZy1l7EMg!$urop-1Y5hLgNl3{ei01vU=ALfE13{nVwsRlBP?ljT7l1$ zLBUcvl2mC0*%nTCEz>s4E+WEcGLltg%EE(Mgae18-??}dX)Fr{OIoFn<}J$FU>FTD z8*0_B)(kwk$8?aH$RgY1l_EH-9D`(al?fbC(xmIg6rp#ZXH8Qp}B#BS~ zUY(2E_hnV_JV6%*GoKu3;mBInzgvxCEsIb5eAJCQB5&nWNa*1~#oP=v8Lg6_B8&wz z=4m394HU`oRtnuurKH67gO5h;y=%5fT|VAhYWDb;T%A-N`OZKJ_d^eOcMqkP<}G$o zyUqcl*4PBEQ+D1Z6J3g5}CHat}xO)56jWDJfU9PZN|pJ^6NvX>*wm}bpQIMoWGcv9QeuyJS3 zW)W0PDSV|XGHs(^D{$UhmN06^V1Ui#gcV#!wvEjmW;2Q(hpJi|7qdB3lZd}|BGc_Q}w?J2(%u!$ZT>I&Y|HIlC_U2IH*97 z2BW1rAvyIw@iwcNEs>l0-vG`&-zlnh&cUtG-=|2G3{QY{@PrC-w;{I|Jw-xUEVG7~ z@mt0PO3suYA8|4T)(6HcfyFcgAJJp>&P0avCX_&z;K4{`J99fi8m#y6>4!$oEioe{wQhp-MG_{v|>|qGSUpqXw{e*W~K6&^0>WNS-s5M za0HTc{}&`2>x^v+HwJ8V_$zLG+)nqt~oDt&k8gNuu=%87&{#R_sco3=vJdPrg1`Fj-AKs zH$izvUx%$aeV68G@mBmacMK*DtW!GWODYi=I>qE}x0q^GYZ%X8Sg{m1-*GekRC!$g&$}DJfXp~NGr!2lA zLkqdDi*ynb^!3obh-vq4)n!mS54$IbO>~aF%{(7WOtwJE4BrhKnH#HbEN$px;UZ%@ z=|0iKpb$)WuD>*3;YjSQoZzplDf|6~T>?jC2bD72lG_ZJ?SBZlatqBfH;vqg?jgrC$Um`pDNjMdq7 zjOf~AM_!6iO(4kyTUPdCFjnz*y?wD_l{ov#a8E>4 zYbTewOv7RBtnLwUp0i;=jSB=Oi|^4bEUtEf>t0qdmop8@j`yti-qI+&f7npshKjG3 zvyK)~Ef?3_H0<)+65i$?^W}W}O(|OJW9A(+A&{XE`|jjcO~M9=MkyE?64Iy=30*!>3{7B=!huxY}g*vK^v*G4>cMyc=;&R zK$oXWCLSa~wAGHN$hO&OHnasB;-(y6Mhpxu^uVpJ9?G8xST7zlWDW9^l>2b|iYyGu zwlh7OifvTAQW3HdU{Vd6t*uVBx}yH5t4?&UB1cCWy2cuM-p6YFHk9j=Y#GbcAxHd} z4Z^H9X(&EE;;Cbkigl-4=+IiHql5CB!1#)~-p0|6+=zf%f_kLpI(pGt*r8l)4!hLc z@WYq|72Te~%#_%RX)U!@+gaLL)t|-)gE-z9nx+vC`!mW-BToF?KB6;}li2O!-vEdU z_1@HlTDq1uno=J}b!~a2*%_3ZL@|FVcK>M{(5>P(V7h*sZrYxgTvTF;GY-dnwwMPY zSfI*eX?1`5Snm-XLwo(?lCIvp2-?v37kE892s)rG(|y2FcgRS`CSpWtwwg8 zGCfJzWi%_@rsP>GmCB*~-i#@c>{G@W8L##vfL09b@A~+u(bhAISZX|TyK0e2UluJp zcuG(6haps!3(8ATR+IsKd4qhdT9H^n>$)Gtjlm;Byn6|?9Mbalc^5ZJl({QWa3&vn z$or!zcg1GNsCoJX@AbEpfn9p&8Is-?yaknvx(=9UAn)^DwN39kB;4iW*7K&|B^(@4 zhI|DNk|*GotOmKC_?=-5(pe=BH6f>0ynCH;OMRDvN$`~>0Q4ayb5wGW5-65}K#I{- z;8K(&A?~K)a%PPgrkS=SKGt`Lz@5Bs6W;|K3!^*^82> zn-4$c^to6okxsSo<9JNBn{U79a&794afwHKHHJ^wGLzhO!i2KETnrk&!;aHJIQ?WW zhG(CgwH86ki`fLP$3}80xQ$WWS0qEHe;#OgK_Ud5!o#>wA{-2+hD!}LG_u+2?T9d| zJsnA8&YuYfTCsBy42?9AO0hmlLyBoRfy)J z^ir0i(fGtiayBeMiVRV@o4)7cB*e8^Yu?9co?CXIg)ll#CH?FpopGnyq|lba=IWq) zcgk1UUAVLxU~^4N(UB1d+CV0fk}~uC`ygSmeX5zLQd8@-a4x&#I&y<2l;nF>%7lhy z+r))&rsRAWD8i_tktVR8fM;LqR-~5Ov^yPGoLoYtez`7U2X=wv)JFQgTQZsc-*T^i zfwccY)6DV&~pxnyhOuK9v(Vz$))bQFk1#n6G|kn{z*8N z)h)YhUxrL|+!s=pzj@oRqc!v!@XF`r;Fonn(VFE%2mx&*T?84M;3#-GYjD8L#C@)p zQzDQEfNkITXUy_NFtx_>Hr*B+CJNDhKn7Vcc6?Q$Bomjrao{_#1~qVRQ?8${?&Xh?$YjKqJQkm(Nd&3)1|}r) zt>n>&$*h1^v@76JfO{B^Kg9DQbSk}7bt%iUUr5Ju7xAYM7Wjbf)5H`J@^AqA1tUOe zbMLeE4e>Rl2eASC@3mWPJnY!h0P~!Bb^n=;k93=QG=ZOE_2O^o@LQ3SPxcPEp?U>#DT$bwphCTfOxY$`V>LO`%4q_%?8 z?Wa9z{%MEW><4{buR_X_glR)41fEP;%5f@_m{mwZgL9W$8dhp~@gSe3!#nDO5G_bj zf@y7?_izk+ro>*%DV?@GmoCJSFUR8b{ot%_BXveIxbHbmTk@N^u)dBs-PXJ!-?gr4 zJqKG4`4eaY<=mkCy)bghd2NiNA*|gxi%}!knoVnwA(3|mbdzs0Tepvda1qQYK0zMh z7x>&vuIGE6-xSj64tjsWNB@!qx`nDe3b~j2H1wnHhrw#L)3f=ajaUmbG@;gESugW& zndAQ)LHsYz{QnOtzJn%}Ta72&m8t$qKJhQCJ{b(g^$0m1oq+2}1n2L?X%&2C+o)eW z6y=`2oRLgsKCz(y%{4;zR&0vgxfs~9-}9Isu27DZF|jhY<)oouC>S-iv|pf$KJr{f z;aklCm8BxO>ba2UhyIppmP*JtFXQ#jn4$Uh`5@q`o|gnCK8~y6A2`%vtEDugSgr0LlI!u zLA9k=U76xzapMx{%lCf+{=w>ec-1zLTwHN=K{c942~tL!c_XGPHK%qsz$3M9>k1k% zvvQj~2ESW*q(`_Z+xiw+12LHGyy_|dIGcE^AM7Vy6C6FSXv~B~XhlI|-L><Qk(2 z;4*Ouk25ypb*y)&D){AX&@sR8nQExABksqN^^Kuvs&4A1WgjwKFOyFNKaOstVWPhQ z8Xp|nihMV?u?G#gvgk(8oGSXyGT|5x08z4w8PF{E6`!lDMw0Pzr zcWrNap0F$>uqHiK7x}Zycj)Mae`ivtL)0!B+M|l=o=?xso@8(+Ew*JlI1v}$u(|X4 zOFYLy8r1iHK%XtyxQ|+Tv z@08OPSo-$rmd1*W0GdaL`BIpIfj~JRAoouBCMi)rj^vU#Z%QFo(?){iBkz{KJNXmK zAB_~BD+YTtQ98>PyK&-IbKWRv_l5!G>WZg*hwsb1IEV#wN%4kHBiMr!DGcW)A}^mG zsxEzj^Q42&6m1LVt9L%pt7i(LHfWDN|X zKQj^|Wi>vgj{1q)L`t(_z6>9XZuu&~XdBvDfc1((R6D4N+8Aaf_Nvyf5KP>15dcgo zJQizX=niPhJj`s>aSHf!Z$7n&m^seJ539NrO|zwk@ zE_FuikGGQvgZtq|UVYduK(%sPw)>=dZ3|OJ0%|NT}}tGF~&WA${P0b*{2W%9$LZkfO#^{I(?FipJ_q&m_-G-C3PBKe%M^! z71?>8erxPL(}L>U?{sWHn}6EeS4#QLWB#5)mZxsU-c4@T92;!F9{;!?3&&vmQ;{Ux zy4}M(F2YlBuT{dIN>{hR zp9b>sIi0YqEdGmOg=w8Kp7VFvb6&$@k)4Vy9vg(#+=rvaJatiz@#?i?V@Ptba9YCeCTWYyL|Yn9gg z7D&Tis7}mJ#w)(ZsYb^IRNC$KTKM>2T;6Q%YWSOk{EXMh+6cnIhX-10qAB z8C@~gcIw2V=z;+m{_LI$_zdo*$jrYh6I$uJi$U26ufA-IJYr}V2*b`*hsnM?1^`&gFdYm@!^#-7;D zt@c-S55pe+I=``oBsw|^B+}GfN~q|bKA6jWBEl5%exh9<3p&F*7(+t;c)kAER?nmBh*B0Vb@9LV?*;4wa)67<(IE37w=^LNXeulLW3Tt5_?2Fe`V)qbCVSZY;Z&k19ytgArdJm*m=|wGfCom#eR2MmJS~`h!RC zz`Y?4zp6h&2XZ~OkIbQdNSb%=r;wn0A&ua}x9@{bzK=zi8?z$7p^%@qYpjKFx7ejG ze(8Su4Ip;)k_?{}1q~e^5Hbu5Z3k+PIFliUT`_~SnuxaUo^7cUEuq2Q4Z5XD|DwPr zYl;m=)7AcmOIzC;LrBCyer?vx`*KzS@K-7EfchUPg*^VQ`P2S`OJHj3L*Fv{rTA^vXwoqF&S*AzdZ=!k^jO16@55afoc z=3g8z{_cnIKv^YVyY3cMHNmMjlQW_G;^h9Wj=aF>Gb_YrlznE%I~w!>{#UUOFnq z?S$c#iF(d5)z?FBs&loGoJ$^-chIYW#eYao{*BVqLvuF+KQGx~4;pF6kY?L!3S*+7 z<)0LxPVVFgXX+oS!h5kJi6F664|k1Ra`CxL#x9OXpq6ut?~24-eQ|ozHzx+pDI67~ zYNN6<|FHRXZ}L2AV8Psh#LXD|NFb)tqF z^fnAPCJ3CqyT8NtO@xQxMo<5oi^auFWr~iR`4jeZ8gEz1xJOUVoa!dMI0{-$=Kemx zHDR!hFCGXmBhvYMKs21m^4HLN(&4Bx}%mpn~&#G6`qh@{fBFehkhDxU&k%D2P zd%71KccvvGSfs-4D1@kaQzHqt-m&-Ldu}ANwT;nMTq$qf{A{D>_}aaXl%#k{E0y#P zT-2@F-qaDZ57;xTdD0zDnn*Q*>w{#b>zTgpBsFYoZOgQBaWOoyH+U>;Klt2Q*6MSh z)W}CXY}q(&IIbNl&A1Q!e&o?l?AjwP|5{_2^!VpWrux^)F1gsmH#k$kG1B-PT#w zVQGh<({+rH!KWk&d^jHIQ`Y1vJPPpOcp^3n6&7C-3Ej_u_W3CTnvh(qrvAGrzgii~J~4{A=o?qax8sF-}-G)5sumy_h{W@`p2v zSIr;U&cTw0Rk`u&N9VQUcQpUgO8I|^QR)VM%``=RD7(6SG--1{;5MDLvi#f$p{$wi zE~ouihI&JDH6)X*Sa?9eUHIC*1{yh!WCY439+rPF9C*+9!{v#rR#gp&)+uKL4Sm8}|9$*msl6rR}0172|wvYoNgyR(Q9;o`KM zqZjijt^2WizWjR2td+dZ6di;osi_w*@oqz^{xImwnHeqJBI2AgZ`Bx2+=m3a71qgk zBoHKRsvS9jsix<$DC{mxzYsyZzp{MgHNGT60v#JhtqJjcfddI2S9B5*D5^=YydN=k zjHMM1wF^IX-$?j*E8{j9Vj!dna%o!89`PHnFxcpEm$tE8CDW9x6cu(e@X{Ziyo@+P zevs*P-f%e>`^@0<{n2q0o)(|qPjXsp;Sv6wRd})`L3KgbYZf{d!Ci<^dmIPzs{&|V zw@0cALwkYBoTC!`5M#?#1xJG}x2W}ot36v9`7dRAKkKHXvZtB}(Sq@fspuddx6{yP znrm>>5v+dvicK4*ppnO)PMr;N!-+9p=@(TIm&(JK(8Cq{k5<4AB59gRe`mXteESy= zXpQ0DT!uLCahc$XNq02UHKvBi32odpLqMr#>cveo>P_RLgzIlS{XV2L?6ZJhRK>T9 zGU=?Y{M28V20=$aTz z5B<(Q>22BcqqqCrc=QYqT$zS3En3yZ{a#O=0YfNJ$ii(9n>$MfxL#aVHck=i`2e#& zUK8p1XB7i89tuogl)h6i7oD8Jb9RMg^GXEIw1wgJ@|VzoK7$G>iB*Ew{CXtk!x0Se z?@0Zs>DwoE4^ZTOZ<-IhPrP}AJUjJQtWWw(Y8;#h#1JE3x*=Whf~+@2`-;V@7BfV2 zma1Sr{+e~+#*g9gn)IS)fdsze1w96sG?!Nk{7}#C@=KR}yq2|3No%>jDJMLnm@Yh3 z2Se&?TQ$OW1q>`j73FvzOEpIy-eiFiXjyvvWsQR#D_};iEU8W>MGpWA)5^U!rem{J z@FhlPCLtsv2Pw0)O$17?tE|#V(_VJW=eD1WX21G*Ew~>qgR*R%?w6|;IqrXx#%*dD zQaY^N*I-s73X;YJe7#dCOe#tU98^XYj9I8F1&u;iWhd|vpMj)x(LgXSTN3A{@?vvRuy=i(3=f)rye%tuRRol=-HjF^U zP@887W)m2ujn@3mAG4^9E>_1ecR_hyb zaqVHiJN3EGPVi%KIjUGL=$pfPBX6>#Bj9(eW!SC~=>{K|NeIMc(%@p6+nJ9%IVSjW z4}af!e!Nh=wQViQslJtyFUqB)BDNfWltr<=B^7V(R~861miZ)G%d28kUxf1hS`sf( zJ{L5}D0ZGEc%{L>1E!M|QTSLG2&Vd8Eaxy<891B63!9zFnN^Ba33dT1AD1=?Te>aR zTg(`Ro_xb8c+Mb%{|*5s4ZT77L*s`qGBFOy%d87c!9{Yhi!m6BkLLx(!o=a0wC)Yl zTOrPrLs*vPW8-h;_H9%SVia%b>S6Sa2h-aQ75HVeDAI>eeJ7F>>Q5eUJbFH=LE)}l z%~j2*@kB#IKb9u@wDUYWv~FPN&6uHi)6dd_L!&-#2oy@~&Iev6aoc&6THsJ#;Y8&< z-Q6eR&^#6=akj_lfwJUgwU1aAe{Sh(FK_h=-VWR!RZ%vsGBU|E%ojjd47^mE6$pGv z9v=(PCA}0f(9Bz(%C9E`(7{wu%%zX{S+Ely%`t z<=GE!*cCFiZ!~y2_lm!z8kPE$X?XvZR{D_xxKeZ=G`yu?K~0!X{^L8Elk(y?r(sym!?j^a$k+MHf5Dyq9|F$X zHqbsqCQQ4KSy~=sAkD-mEgOD0mwzN|*RXFxQ;U;?9v9AK=W&)h%ps6TN)Ttt%?$FF zIx4GAQNGXI7kp>htU;&*RTGn5SIlp)F=00<0;fFIsvJtZb;zjJi#BsTBO<#07@G`o zQe8MWv)sK<&^Dvo_B4rSU^b~FWM~L0R(PoD&)_oB=m|w-`6ofg2*~;iqkWC_r^1X> zT>k}rt@?NT`afXlD(Y8Lp10Y4GI^s($v`&--OU4v5lBF(Osv-X9WZFb*Uj>6o7nB; zTYeMK6mn@#ZhA8pT=+(;L}okH-w|tFXSXNcG+Em`L*JG3Sums znjHv@Yqgj0KSS}a^y=f?R-N!+=`hl~q*5iON1A8zq9LHa)QkPkf?sNWI$>UErB1ei z5s)!2PzO>Tbhkg79DN`jm`405UfH|{Ijf3qsjXYHk^u?w=nKKwuDFNp7x07kw7WPI zADH=xhbDpZz}kbJ-uGDLW)tE7oEf;Hm2P^+LI0t~NHUd}1stvVoz6W;Fv*5Scw%L1 z=I_-Wri$gpA7}1rJ&gPikQvUHsWGk_>8t5x0%8BNVkzJaMnQrfOhvq$?JkSurood zaPe2~mPXq7*(e?P7&#UZSC^3kAKfXU&v3)(-)-raYWYEw9anb|#+H)^121`JLCYuh zvkC-B{6R|V;7x}OJy4W~A94tKR?yUz@17Szzk4J5?)dC;{k|p>(pj}lxd}&f7tB2% zC#AWbED%SXkPPG1ZZwLi9R^*Z=C zYkhLiImU1Fx>|*EDVez+hfI<58$e=>~R^m03 zU#vq#i^YTL;9l*b5q-5qw6rTZ28Qp&*}A-JJx6$!tUIY_#|Aky%|U=_+D7Blk}+RD%#wplyynkQ!{%7Yk z{dV^Kq7ywOEtB+zu`5D|Gt#whV~R53WQN={_3d|~lIa_I z_P_7!IdEr8%{_ht`a4Y;zpHFrQGI>6S)W$t)qs0q>@3>s)PK-$z81pe?XiuH_H!uk z`8ac2yXMrMKu7U_KvFlU6=mckxq+ z$k-Afd;HYAIO$9%a3(~K%Oyp4W1v~+wcX>Bm8q0gAoq zxuNB>m|D`305dll`(BRPD&omTNNbq*-m4}FXe;+yovJJTY`B=g%l&+)h0Y?nbo(-# zi7lB#Se&Z&`y(DV^z4^LGeP*Md?L-_s`O|ZdvK!zJSBGX1|^h zrRd%z(?gofPP3UnnjN5+fDDbqz zX`6A&f<)4(1UI~IV<+H*JQ4wr;8o18MHa2W>c%6}6y_uaN|jStse~R16bC|*Gs*Ar zOd{tUP4xIqRDJru1oh)CyTwY^Q|%=$H9_ggXY<@-dkpm-2w@{Z$H{#I<_dFE-(y0k z%nk4|Srw36QptFqPx9DaZE6%TQA0DrzOW+Bb8Z#n*y4t~pMsU3fLXS34;h zjj1a=t1cA^?lBuQbYWzsTzi`VgDe4QHS=p>_?yix4MSRIw1mnWoUHC~^lWZjTZR%> zC$TT=;D?~si_92?I})=U zsG#7NpuEgt46r2rvWTwfTpAa1%{JDJ0g$fIpvc(yF_!lSZeTw(LgxO#G?LrxEHK%1 zH$L)+wID`nYg~Yt-5*tb;3FO=*tWbP&6WuuU7oG@p2sd+VWTZX^24UB=gwz7e1Ju+ zzeQ~cN*D>7RZznqz-KaJWWzA_X)$b(EXm00<#;KVlC(qs@@-5gq}CbigHYEMKVDvRI7wdHbVe7Y6{Pc zYo@fyX7y|br0nO&hEaSslY(K}506W2EG&2QnVIETLk~7rpN~bwAkh}C1+wpI`5pPD zU@gIX#nf=hd`M){!ANA&)ytN+i<-yUDckKff!oQPuryE9M~es!kQWF;Ut^e)?n7PT zm@dhJ%1-Z5!s2)=UeEf~B>MyC=T!lB7FgnA0VFuUhal57mkr2gu$GwlgPK4hv|)D- zx6Y`qT&IqL7?SwlH-ID+J#tsJ@TknB2X$9~0uKnSbApwYd>K95x^(;0$ntn#w)h2X zzMpSnrQ-W>F%vzY;9V@$XXFC;rMR6+Cru~?%NLf@{Q09WMhLW!D2LMN;n~;HUqzI) z-iIb`@7_8u5OY26Rbuf}I1vO~r1EmQC#{6!aalDT5Dc?L|0;DVr$283*z-U~o%3qy z%|o1;(5p>+y%cL4Yy}i15RIN`nJ}DQTU|Bj)6f}B&Jk*AqO9ISz6_0!UDsb&*L#R#53Qa;BT zc7}TVAgnF-oPxy)>Aadi=^%o z&h!n3PdP)x8i|BVcuPuz+qU6}7HgM$8E`-u5`kZT2YOYbM$`h*m~86cBD8xK|ET)B zpC%~ZBa@SG_Q^Al0O8T)j#=%8t@3AT^_Q4ONB$eDsuqg7VUwN{k~l`6zT9fcW<28e zF^TP!JjXWDSNrYt#&%^xV2%9jEsKE@KeWCtO_=Y%P!kdf76HWSaL+E^SM2`iGg=>c z%=wj%r$@|=%dswXTv!)V8F#?dQAE7iBCSdeV!_m2Z7h;zSv$kbpD_0|x_lE#`~5g6 zBg8kp+MI@{!TJJwWQu{+u&zDZ2&^m1Gmcy=v)W<8mrqGM%mkWPEH2}SlXcN2e*1)2 zx2_jJGv%*Oo7j<0%~LTqQiha@K^ii7=-x>b(nt2%?{%p)N+sP6U-{>+>@4*uHu5SA z?HeeN%7p3fYiuqKOeN@aMZ!q}-$RK+L}Q4JM7L`Z8I7ocSv}?fTCs0Id=0T1jUe0` zIWm(oC5fh%WSwAF@4IUM*-p=~kxJ4z^I8_7hZ8J{de7#B>)YrPHs|04!6hT6cZ1$- z*T}zE`2is+-xC|XA&~K&(B7fskRZoRRbas|D4$%0Mrj#Nakn$3MW@4_6+YSa3!#=J z?mTxIBOlfy=%TZXU;PR5N77n?CP1YH7VWUd-m|93yxk`?>-^07y!kXPsMjUqX}HW{ z-LSw|nRob@?g6ZWqzc3#N?%Ykl(MFti5~l8i_S*S(Ah3ckQL-$eltiW6HlC6Nya0# zTT`?~U{IdyO9Nt8xxL+i7d3$j!e?vvmQD> zcUxbVPL4w*!+*J|+<<=WmwYb&G3kAym6Kj(e*8V#*7$K&)4_xJzN<=|KdM(zkqa4{ ztP8rM89cCmaT;*v`llYFNa!l7PbW*SaqpM^3k}_3CEY8d_I(4+#t%;dwg-GFvCaF) za{vV+INBcD>~W&SUx@G;eUFd~P(%18d9;NsArp~b+4w%o_}gatQT3r3-uvR)R>)*o zLab7@6o5w8LoitUE=|x$UQPR2nUL1)=t1}85~b_4-eWBj(!bV+^~_Eh27{zX@zq(R*f1v}j#1x* zZZf@w6A89F?97uIZl*r-u$O@$&}0yMKdvp{lpb)VO-;VJ?(*y2AX}J&PP!lGG$Kay zXL&```T3^7r?w7eP%z&ntf`E~PHY+i2_#r^CwG5Zak|ps`JlLNTSDq5`Y2e4F<{Si zMHssyFIaTZ7vITnc2_@Xof0dKFnk@f@Z^3=2+#wFB6O@PECVyECVv4*lyaSh@3h8= zj;$4E2an167)ELdzpV%I>tbcz|Jj{$KP)SK5aZ@##(dT)k`5jId}GmEdxAf9FGyT%ybQ7*6zJdNP9hF(9A~{SMqYtW*@eL z!wN8elA-Ki`w|?ah&H3L<;>RS%LlxhitYcfmiEfDHV^TQZ>_c zRmXCUs=nM0@omoTzuh>k@;k4J)LZ);F!#3)b$J9b^K_obhbz+b{9V2rQN&#Q5wglq zYIHbEjQ~vZXv0JhvBC!AV!IdMDxyiv`RA3nTI>nBuOW{JSiU1)pV*9>u00}f{(JK; zM{am>`BEVC2ebKbRB!5FpC&c!pEoGF@_+CxtS7t!WWYC>-q|KeIV$Op^D2NNih+yE z&aR&l$u)%aRiD0TUeN-Fl(LTF9>$=4=2seek+Xar`~SGh-~UJclmGZjMSnR`rLLW6 zMM4z)Rb%HUpWCylee6g1P49;4-y1no%0G{o#FiTL&7m#LWagKJaG(3&O5Z{ZtWWY@hDM!vnpcwzSFze3(s=roL=ikH^mChR(^5*qZ zHZ4bLCnolh_2~+Xdz8Bc59{e}1|dFrZpgU7PtSf%O>nrFwqUxk# z{Nq7=e520Nv29Ni0!enEMG25FCTPKEtnXazJuRcl?Tz?>@}|boOzK7F=Od2Ri>@sr zGzpvJ%R}8zDOUS%Hge&4ftAmNL1_unxJ+RPJZ5==-Cgq6mf6k5&0Er)sSwTlJ{IDJjFSMeng*bZF-YkdYUhUtVb zWJ#U6Cf3Dgi&P*T5v7aeblD}XYt$n}D?3961}feO#mV&zJexk}{_u~|H5wHjZp5_{V4q-d|J7GVxZ(~w7=x1x4Ar430JJJpIQ z{E((=++kMD-nqt!^H9WwGXtdfaQL-NSdjnQ9raapv#OLz@5y!pR+6Zc)XcUaR~F2OGqOLVRqH7=OZOg%ERY^XnP|;YD!p1iCSvOj&g1Kaw$rh=boK2m}s*&e>YbGl1873;4;-fQ3EQSDBBv6{hPbt5$%qF28`U-pzUo>OKA9Z`stp4aY`LdO%{Tb zm4;pi`|I`J!%kaZS2i^_xY!OqOCxEzo#xDOXzs}}dYXJW3>iB0NO~WHzoA9g(HPX= z@)32OFMBfTQBm`(kUI?5B&1PVp(VEb%wOa6EmE?pr%0(4C9*BX(li9)Wh= zaDLs9wKtPbTHY=uP?z?f6{(#@Z?nha0?0XA52<#!&}ua%?(KEYz&ZE70>zk@a9`S> z1Ct#Vy%?(Z4gIj{2orVnj_~VRsRl(CveOx42k}8#uXMHfTRAXsnPxHd&};9@pJ--k zE3Q~O3~4pYU&$K~G9eP*)ib=u#Kfc;JbbWQj#fQ*w5-=q2U)tBXp4EsPqWYt{n`I| zMy>SC%Z~jj(SF~NtCX#kf_x$eYvm}I?@dZ3SC#=AM%r` zd~0$to@IY!Bj!Wz&$Z1Xn-G3U3o`a>8I6A*_eu>R$kS1A!g(k}k!cY=NxPU(G~4Z( z)U=GaHUwG5b5oZ!OpEq+y zpxnVpP&pO|21yuT5f{5|KO1D!LL1%(M-~}@TrOJ)OEC&=Uxv=z^&-d0_4=RBn#^Y< zk#tCnmO-EJAo)Gw>?vGf;^Cdk#nwOveNxX>+uC>>NO`fYFsZmpX);pWku1}7{NJwk zGDpNadDSQAZc>ZZGi`H)uDJdN(4SUDuheQkO=8Bjb+VVfH4G*qa@qzkF$#|>`2Fq2 z7pAvGKMRR&RzDTu&eWvt@58l1sWK&PFqLwE2y}6j7*#SC`U)1Bl7${LcS(UE7))^C zY)LKse;FlY-lT^TV?!oF!1{uhhHP%qfXw1|6XJ!wuk@C8^9F^437ffdcRplg89;t! z%Q!^*@eXDE?RBz^YFY^&&zl8Sqk@@%b|8{mc1AmKHTA^Qt)6;w9^x(-J)M%tDS41? zL44P?SuF0zv!4zb|8{+G!Jt-1J+PnrdRmqpP(u7Z{5RmNs+b!6Y>AwlUS`S87y>(O zbRO0eJ{sEHsl2aWC1SFC(efc0rARMaGWEc2Ni~m`i^KOe7E2iM6aW;X2oi~Yq~~Oo z2vi>q+Gp--SjJEe7Y5Ux0k&ULjsEL+Up)yQIviqfh-8NFVulbmfpBf;A4!eBRyxQy zSoW0$fy|H~8&1b#Y>2qD_;lRL-NKeYnfKUDrDefzE_*h~ru%MB0Rl)H)(=^fC%dQ%e(j1z0Ys& zbM8Is-m~sq>z+Sgt!FZ8p6|>&&pcB;C4;n{Uw3Xie0*N(s4%o(An9OTVJ$QLz+)QC zeda<8-Y0!|-FWqZaYg)=?hg?RGuZwp`RDme>d!w##s+?Hyoov5!=Wl+Jqx3aQM=+^ zoBR|NVf+6>=GBn>O#~1J$5rGtbj7)TFw`OU1a(+s10#%?>dClZ1oBBpR= z>uDv*)eafm9lef?E>R^bAyPaSlQaK{+VQ9UW3mqG+E<1jg)9-w--)Mg#sSsa^a4#UrBAg zC*hW8d=5hyR+WKteG$QR-aZN^hS~|3?_^ev7-4c!oGi8HfO}4WmBUD75uB_3I{y;| zYuAxfBpo3zbCBr&@WH!Iv*}xIx!x6*gzHTS`1VMs8QfvfEhvoh0)+o2&U+i5?)~}U z*7@G|ZAN9F`!lj!6g4#xDdL?N8k5+aE$)08S4@MGSTkez@xZkAGhGTp%#a)1RNY`Oa$biLsVIBH&;9>*L}dodF%ws^lW;MYu|8*%Ol6Od z(uT+)3?0fR7*R7`iTRJ~ zj`X$Pzu+JrdJ0XR!a|Lq*Nk~sIX~;*5si>bmCV4UcxT{lVdKSb>Q#(^F9afWfU@eg z<$hYMAavb?rZ#w^&+EQ6q44nZ)6?WSL9C`~&zbvnXUuRa67|VLiryvW+co}Kl$r=N z;sd4`*?w*09vJn3ae?|%_m069(B-zGnqtgk-_x(~_`cA6;dDrh4>`KxGvO5riPr{IoroeE(ba;QzH0 z2<`-=0QR+D+s#9fTA(=glmhx?@9Hz7jd1{goERL2QJiv5dtvBEdX z7FFjC`!h`l+diDSFI>wjlmA-7H72toazy)MuPMjZI!cYVH)J=TFL;!a*Vl!iH;)Mr zgj0{$9Ygy(gV;v921yXPYx5Y=)e>8Rm`s{^2Y(IWM^x30N`U0oq%p%6Jt=P0aS<9p zWbqNylXoKnkd%*g5U2MQ99<6qm?|VE}(y7 zAN0laROv8j3~{*Y5Ake@?|NRMH2p|dS08e-7p`N}2mDx#i-wYR`H-xeO5Zgptpu!K zEuR~T4#Sh!22f(GeV(&Sm?V^Zz6nihdMV-f$KKh*R1@1}jjhZKdF*KtxD;KCbtkDHvR^8K3;_rHdVySJ+j{ZLXbs7|DXjeKy`iG!*y zG)C2x-=w{ik~#m0Q)?1}+b(%>VP%cSxjx5KRTd#(#KDnJh75GG0-cWxi<8v z5KbN1CF6Al=5s86wyaA*iK^_z-|YDtWL>B-h#|j7C*TuFD*V_5YWd2ts^U2x;-QUf zQf+WSUnJ9g|1`QhNDV9FOc#=D{~(gQhnTb(+W?@eRk6mq`9Y5Lt}$I!dHqKg<;r2? zLWyZ6WPC3;IC+DY>5IJn*2#1wA1ms*Z9F2Cs(9gv{wIk`ujZ6YsB%cH0*ma3^npy3 zvyMHd`J!nGb`m4btX+Yf-lS#D^k?x|n+3{2f~PY&|NNWt+Lln7ZYa|5>G`zWzzj`l zdn*K%MQnbmE~=)Pb+54ZNLgIOxF`=2@*jV2e{W2G(8n-Ys1^MBdR+^81`_pA!^H4l zAxrPWD&CvEI0eA@>eDw3FVdnt8X@jgPavHRRKT}Q%5$9 z&(82yt&0pVl>2k|D8T&z-L1LB?jwi~2Hzb%%FTO-bLoBTw*K}ry@`hg{Q>H1Cm51m~2_hyYrk_8zRGPl8o zGGRTNeIX3qp4%`~ZfLNZ1|acMsaN4Hdtb?={N$~R>9ku?Ba2oLvTjIZN=0?$b52V> zd}k`0NY@AZDuE_$`*a&j^WGw#@-r|r2@C>|KW)A&RkUX8GxTt;TR?lW4j~wC9Vkh6S-Q zA=g>2?HdfUh>hFsD*d?a=A5-P!K4FTkgVAs0HonTnYvm^232TzsO_c}=GA9V__C(9 zhGvCevV0%}h0OhU6if@vjAs?+47lf;3ebKsg777Rq;N@+^@wBSg_mh!DEM$DuMQ8F zSx8e3L>DPUN(E_qT+d>8dJ*yzv=qRIYYP_RE(Trf^_%wQROkcL-SJ)9ElGhYb6^V%fIPaD1u>`-J<-@D+EwR>9n4Zutv`0Grf60=7TM}=g|!pgoN_c zTq56=ejHL9X7h6`bmCxjlO>|%_BtQTeR`0fe&Hh;&+RkbEVSFwa+|yI!@O;St2f@F zc#o@WjSp>ZF=Eq)g6m0wZKH}1;VR@Yme!Ej(r%VIH<>1(ieDY6dpmmAG4%=kLbx!D}z)(4HvrlygO#a%=Sj7e@F3PJq_ z-qH}MkCf|+n)VA#y|D3jQFJ{#WBP5(<0||dm7VuVW&EOmh=9?CC|U)24cUaQRGPlm zRYlD^KMuegTNyG3gZmk3CX4rTlR|^T+++c(0T}fgthusd>$3x2i+QNl&Al+WErzhC zGX~E((c-yk;j(-|tmiSgF>`@5q6VrO0>129FW(F|^(x7rgnsNn1CQbQQGG1kLHoK@ zumzQU`#~<{1ZL%Mrf2cTTjtS*n8tar;URt^zIa|~+6vOR8aAGEodg2+pL6BYw?H(q zDMAJn&7@j457><&HL6pZA52mRNmDsN7XyG$U1k?I*A-)>-cMLBZ(|E0CI`2nv9Ocf zl60)x?IzUSxQTI+N?Nvik8=y**hYw3E;X2yVP~<~q|w|$e?-}}@e766RlsO|=k&() z>{`KtBMo96dLwFefCF<2`VGCrB&1ecs>N;X9X;1s17`N%%u*$&n-4VTA43N=Nbfc!6z|cby*pysCYnPmzN@dg`jg!U()P> zME_ZRI|TX()*}?gi=^Rmdv3*a($@HizT|C>Pt;XWePcA&{KO|?RnoNS&XZ)E^(`(j zgYF~$VS3NA1Pf@}Y_;$skBKL(xUD;t{|B$@-cWtxziAg?ZnBxgTJi@Vur%)VPSy5v zPjVfl$}!Qz))yG7pRjLoPg{?zIs+GZ<4}#|_V%3(QLLl6sflUEp!e;FrJn<1X_Zb7cJPH;ruy=97X&ziaCpmo8(cjyw*EPklR~ z$pk4&h&RaDlR*D6dHv0^DI8Db?9)rXpHr*(;>YXFsg#f>51Ht{8O_gh!B_QEw!n}i(uE&(yyLlrb*ZDZ6VD@`u#y6LxgQg4F z0KxjqM10UB(6{^7?G~hYGoIHiY^!EY91b{@k}KKEM0ut#`ShYbx>C3D6;dM=@#6(H zTK@nj8}2h6)Ox>j4A48&5$KD<)F-K13Sm!RqR8jPZc>>?@}_5S(V^*9{abE0@%u|f z^$5XxCY5!tQX1%zS&HN$U4p7V2XUSr3kDyls~Aq{%b_TnB`v`G(}D%hHohpm~2%1OG<9 z)|UQfC6I(u^)JD;b2{4()x{ru@N1aQ{63{m;nMv@X;w}LJZ*yX`PVcI}6g<9x z4(C*U(pYAnZs4iuL>@lZxC5{N_Y>;AX5|%u8oDB3et`F06%5&5ijw@oW~j%c^hp%; z?SB%cRy?Wjkz+ME-93cMmEOa~G0wrASTEzL13W|C(Y%B5ujn0>_2FE99I>+V?g@MR zpC7}{1dZ;<8l_QXq%cY1+@>a;omFaNi4H*k$xruhp46?QD2`ayu`;I=B{|<+PK{Px z@Vr19y)9VN{;vH)qdGvnvpkkEQ7-yoX7LTI!b(}Kq_|Htr`G@Z&Rx9+7b`o(FM`f+ z&VI2!qpm)8f1Zr`I_b~161h@J_qpT(<|umdsP|28`1kei)zFL2qw@JLkKc`H|G?kl z!Lj0h(0%=tQ~y`=MO_cLzT3r;ee3yVQFy$P8=&$BVB=+e)+OPj&QHlp{?ETM7XOO# zVfYKpiwOqCFVQD$nj7yFE+hW{^x}w||3Qs1NWZ5Z7l}!3-`?^~?fYGUUsbAp`>X0% z7g?7H7MJm167=8hZD>7n`EYOW>|Wfj_-TLD=uyD0j55bEXY6ffcZvT}^|aBI%ty(4 zkC^`!KHu*Oy}kOC@%j4mJypLwdD>aq&3CcFdGA2)_$S}~ieCTk6$<$JE9dWqt{EA4 z$zY}Y0`bDA^na>H^euBxKgIsLL;m0G5Rx`AsfIHNNj#j9r}xHp8a=K3qDhobVe&;D22h6!cGQ8d0wl9S5 z7?@M)e(rD;j#;t%&=x;c-TQ^ijQQ7#;a^^)jzR}n>JhAFAE;9tm6IiE9p8O*FZz(B z@cWxT0Bbbg40NE|pJu+2NvA$|`mWJ__V;7{dz7%AkX2tNT9niLX8Q-Aljo$&fHQYZ z0ewytbyCH9`SX2Af2Mz-yavX-R+cyV^JN6>C)>!Q1 zl}$Q}5-FA9I{O&wLIzvwe?V%JB&X>f^3|tl9id6g#xiS$hays-1h2GQ=tq{SzZr6T zXt)!40&6Yg5Gm3_cw9J`Ej+Ec3Y4kKrs8FYpw&|eHB?ZmU$A*PihtfI8N zN|h5hcnHqZ6HeXT!fbbeJrbMyjtcRzpsT8wJR*Y4gpjTaSOawbK(a(yev&eGF4wrY z%`KKwq63=BXY$Cj9wkd~t>Na0vm6G?X)D5E%yt_;#M$n(@4Yu;zTa+oc&UV6#KkbE z(PlW+IsTA@56C3Z?!Q+(2`D4JCweEs0ibLd0h>3KNvUk-j42no*D33YFt*-jJnco- z|2Xt}uVI?<#Tjg(83mQ#EwPQ{J<@r$HduUqAXh+B=rMlicHqjRX_Gp6xe_pwRJG$H z#C49!O~Op&0VttLuQq}aGda&kvFvMgMFT(qud3KHm&TJE?-n{aeT6~`MsrJ3r8*c2 zKn&QN9sFsalaXM^H~p294O5>syr`=bwp8Rb!jpRYOXH?DPrYkp(rH0idqbhofHOO3 z)qx$kKq>HL#lCdkwV$={i!GC0Al#~UL4cY4d-Erg3J>4>OFe{LUHzH1x~Ufy6HkOQ zf6H3d69c?v(&w6ubaWd@_7-elWAc;wLM zQz4ejOlBta(dELGRcBgqYjutWz8O))iH;IJPoCD(e(5gx~_nj#ULK}&mywu8%ve?z; ztEfkCIt&QO1niyZOh`g1xq*;m`d=kRrv^C36zY;F=xYu{hoVuaew@m2uV`<0 z7Z>}Ocsb73>2H%H+KqpfG%UUQ&v;&g`{&<(n~6Q~GXi2h#^kXy&;C^g1gC2`$qMi$ zZt|>m6; zswQb}A#kwQt;&o)Bxn|hDE0g5N~L#-eLorS=r)B)g+1m+4S;05JvB$Z zK7`aug2{IIpR7H&?lx+nU&>~M&x$9!+dje~ej=?Lzeu4hTt#I0e$I|Y;TbAbVNl|P zYZNAl;G>nj34-0lufc6#y=OmTt)&wzZO`fkt?P9SdVlH5uMcd;LrcrR3N*oKCmT)t zm9|z+dCL`qctMcJ?XGwsS$lQju+V4aEvdpT_Uw;RU`e0s>~L5zf^!NTR&RzY!_c<8 zs#;eG$u-Y_>VugQx7@SPz>){ntNk}FrDZa?=&@FWRxU=8Wgb{k!){9Ib zKowdsn`{QWi1RFVtsBNra;fRFmJ}f983PH5Wg7r_3Byl|Zj&d*b}py&;*?qF1;W@K zqm+UOpX1%Xw$Y99PpfjSo-Um{h7Ot_r?~`iHqp|_WN1siPADi22dQB3;H5RfuYu(c zjD;6XdL=I&Oh<5bDDwyCTxTPi4GZPnQbBxhl|m*{-UOHQn40<(Z96tYSDqaD$ia-M z^E?OiweeW=^cZi&@eUj%HsXQYR!wMl^-Rof?UhK_nCH|C*)QHvsoH_wSS|%G-rnnz z9}fDEzo2eojz&*;!Ikwz{7;-6m zCQUa5D_jPgSg|Q-=$%WTgNSx4>_VR&9ouf*<`~u3Gs9nNA>hvERh~2}*s)H8`E=}-{ zsfXGM!buBcUDT#NtjI9R_0CL41Cka=tf<=yJaBno3)^c+UY50@YKqp(f(EwG>Cw8Ma!ZbzUzHZ`Xt|(UzUo6|^=Va^ zeh|f;roPy-yQE><75Xtb8Bg0orT#$4Du8RHIsHXw@1^EDPjOB#udeQ@V*gtD?ve}X zBE8ZbY+oR(3UekxBqSB%Ep<$_H4C!NQ6Ml7U&a$`AmqqXwbLMU3ml86fY+eeNb&AAhY}%bGY=t}M3w~R8~g&5e9%b7 zXgdO&kGJ?Ogv^4ex;SV2QH473fcEV%(^;*!-AOOdhu(l!)pc)pON+C>P)dj~>k*_* zk<}_oMM&bSpb@=m4n+Al8%|D;8QZT1sqrshol1THwUa4NH6eMc9ktcDMZ7VYp_I87 z!fOmA4keb6=8oX%6Q zpWT|w*5VV%{Az$C0q7W7KcTSw?7=*jDklKxeQuaiF>XY5+sAFrO_}W!4T|7sjmYqP zlU2nA=Hb(&r|;-P!rtUn`Zc^hhKp?IK4V*#QCL2&2Yoty3tH)l%mx6q}kinZukwkhr*R8TCQt9bG zz4tNS563hv9vm*LkOCK>p|zxv;rX;D`W*6j@stILEr_MWVBCZVzs8_xY@rzXOf$Jm zXCM0Eqh2-$lGwy?!SblH41)EgGaNElGyX7xL}a=to_qu5*WbO^no}gOGZ$Sw?wQ(u zw%z`!57Pze;8st%ZU71WP9)TegS`#d!I|tPlPZasItX9MNA(2F@;_a_5~-qo6t_@O zvma&3=(CKmBiJUkxUsR@$1sDl7@z!~Kc+65&X@LU-Fg%R_&w=0p+{hSiqL!x4~25`$zN$^#~A zg{X8VHLB|0etgQl)By2H}Y1WTCoTxu&9&$M(&EVo9-8(%yMyFme%olOdtGl(m4iHzniJ z{8QQ*4fRvWGb@dt3E|PMSP%xZF5Nqtn@kd>x^F(%TbNlKGnKwY37evN4FNW=A_ z8)qq4*=R1W&DP$+JBbpO8tF>wz z@;qPfNEFxNw+d&31n^0Abb$ZH|H!pk4&jSqtPhg zcR&^jd4CWr?)|vS&Z3=`Y3@6EYBR(PtaJ}(n#!Wg16Fj}Syh><-*`Rn0%qJ(K(o{QCcGhv~W} zIE!9sTUL{b%$HwqhDllm+PDcG&N6e>NwPR>&|SAO+@0I-BYqVhK0y*5N|wdiwf}@a z88(hxx*NM(I9g_0L|(+-7^wX)8&lZi)R^E=_k~ ze@j+F*;0XyiDnong>TvtMBm?IpyG!#Fe;#&?z5{jx89e z>TOe6#p(gz&ou|!#;h7*S%-A!MPO_fuIfWsPQs3_fgC5VUtNt^t+rk{@jYz#v2`uz zyZzQA!;D7J7W>267ND{#H#hY{jA1U!bdM2%5lIT;A?}NhCjm;)y*)3esf@130N#1A zI9S9|8H&Y&)*OD4z~rI@1X~5T%ousw*OF3SU*;Fybo9wa9Fw_N~SmZqsrLPTrF=js*?%^O{mv6221mGQU*8 z$haz}{7@v?koG7oyAArBcAVzL?{ufii7`kIOs}TUE>%LFn`k4+Y$hZJ{^io1sHemaj;qBgJ!&B&f%>kh*W3i(YP9V>QGF{EfkS1kv?E02O|0k5c#%oL zu0Gd>k|8XU3^o@jHZ%lWB5P8MJCT^#4$jxAQwK-m`QD`E5lFY{N}0+^ey^VyW$R** z)C?-@izL4yhtoZaeiqxZN#if&4zV6y$m`bVY8oO)cyfmD!VN9 zkrdm#g4K~qWM55o7^MhmAWN?ldV_031qL`@dbLRq6hbD>94otW_ojOx+!iCU$!JIIap8y z;i(L9zHf559dj~Z{XHM!)yQ^-lUjpjh)pnt4Q+k?%bXWXw<&zZtA zvHi;6Ox>c@Pflcft!g&iNwGta)<)TH>FowJHOj+Y3mklr{h8QkHN6hU3OJb+EvQBT zkwRA|!d1YP$`lbkP}Zhrp{2HUD}@78H_yV+4hiz7yBgzG5$gT^~ zZf}VC`wR$49LM3A4l*7oL97Abbt?ya zhX{ADo=gxI&x`vSvJTu+HThJPy|=@}grxfBovMhHB%K9I&I)<j!$P%b9|* z={pswGKaD-zRrErVpksU;pe8JcfHuIDO`6X_$0OW?OsHv#xZs#p`O+3XggA3<1N-u zD^6aZL1)?yEgpLR{Y>mZB39uTaWY8Z8vLWos+Oyu1UZha#PBjP+0qlT=ou>wdS9p7 zxluXfxd2v~PW2fva~fyUL=Gayt&pSEM;??WoV->t`Y|CJu2uRCm140E=u%?aK2+*m zHdgf*8Am`bqpLux+OYYI_I930VT(QkWT4Q@!cRjj#@JM*{6i+xYZeJZ1Q^i%{9=Lq z-mPU3#vkrAGnJxj=XZVT8#e?1#b(+NIKe92U2YxXp6PPXvin?fWs?0qDaogAq{HDG zZfUQQu~uA;oRLxpq90JDK$kce(mzw9f^_LLQQB9_lAS;L-fg&M%$ie)CIP`(YtosS zo6!)5laAZ!Yn;APmQ(@``MY(i!ms#_>9fPOT!@bX54Td;=w3Wm;+}!^EKa}vQCF76 zBSW)|1~1VDxyFsC*ZUDx_6_STRgPqOoritG zXTqO%_eVb^*peZ*Pz~0k*tNp$v$-HdzijqKRHoZq4Z6PdAWfJCPV_Xl+!V+%j6*DKXLAeS*`lM%HWNR=e67H^rKZaQMRRyVhu;@Bj5WKnu?{%zt8d{`a%g_jtJAmSt| zU98AaSogagP&S58Kp8QAyvj=I_W*e%Ve|0}g54AsGp(?N5`M#sECqGB?=>3c=JY>Q zR^Np9fEU+k+Cy5A%Q~c-GfJwRQ*P4TRaY*1htD*TSCz@0CGNZyk~aplC&MJ$Hv-q< z#J8Pp;HPOftq?_OSv#KIHU>2+oi=AMSL4G!YsGB3HJe;tYdhWpHtieqb;(Lyn3a1i z*)^GuUaod0i<9#BmBr1cFzVRX_8X*S9L71*Wl{Tc8`s61L26%Ff)N1(MXs`(H?WAq;FfJ+nw^Hv~ojzk9ubxC-BVMcoc- zNGYQIJcGxk?_$&ev{ifqKQ#1!P_}~l*5I5La8Ox<{Z`kGCu+ma^O_GMvI@cyvS8di zaixswx_XAmX0J7uI@KJY%oEmzIE=7Tmf9qUg&--bojEWhVV2CLz+l(Vxj&(K-gmP@ zCFlI{9tgDhlHQJ^n|FYSel1Sy(2P)eP+1|fGR4a2+o!D@yhM|}XV|!PZ=Ouor(=As zWi@kE+$8!j^xTXeJRkP&CFx?mFVRpE6O zTPKbJ=9^D2XguLm%P&o?P=kxW*8F207duNKq&Vn0CnxHMzV?rRQn~9(21OEWeKf2! z_<00VQ5xEyq>a~WrUj$VK7})r^KuUtMBqG82l#^QGO>!q(7Uu)PWJ0fX3*C zkv34^OY+@n$`t`mxv^^8k(eD{Xc%4#)7&!Yv3p&?XQbXyI- z`<1monMmW~3zFp=ZuefS3q!GX^jA++RdimXD0Fb%x)Nv_xJO;jhYrl!Tt#f@Rje54 zbtx|}nSl=8sgqsuL_093Q90x?F5a*ssXuxNEL)^V@^f%ru+Q)b&}x5mI)g-EB$=<< z6EO|o_X80mFjLN5b&kcBSogb6;qe6B5GJ9s*py&cQf$*TZ$Qw9_-vE?lGt>0jaJB_ z@R~aE(Bf5c1f!+Kd{Sd}B}b5KkjZxUq)1gk=51+ELPuS@--a_(W?@8d@QER9Q0R2K z=pDm(bzgygS^n@018_F|iQ$hAU2b)G$%}#~xp`|T$!vwJ0=`7sCT35kh?#pu3wOUH zhW4bAji&WQP@_xPAb$XeYi#$gRNg%nS>4ZD!!@vh}xfJ z{Gn}dNy@8v`U5ag5sEawX43;*+R7<{2`vU{@JO+4+GaUN7%9J6WTVvxa<*$Kcw0Z% z<(U$K)Y^+QRtf(^b90zxh`aGCmS|p%gAZ9LBAkhH|Fd7*af)E9HP6(y*K}@{5Qw?H zM!I`p&0UJqn8s}k1Y#EvlOSXY zw3P!0Ue5(<^lxg6NEcFY?3Mc!(bwIX!1lj?yMfr0x%`OAr~WvJm(?{C45r_-FG|Li ze0M$*N-kacFe9t`(nNR2^SvQU+((^w>gCg(C1qxhS<*p1M^)%~aitPAcG25PJOb@S zA6b1brq`yVf?Zp8=q4F9CXX`|?W!>#O96I3?+T=$Z$8OxmJ>Zp6IS_*;IsV0}AIEo#h%yv>AaK?Z1 zKX24hgE>*)ll0jP=Ts+syHvW1D8#jHuJfc|Gz)|tpY{Bt(wEQ@pqQo$xE1=I-`PCh zpQt2)n>KBHno^(nBP@cJE*M3vrtK!YkWClmNG~zx+>^>Yi^9=@V&vzPM)QXGcwWhe z7!zW~6WSnM>4t`u@3|@RVRG+&_K#;&ct@t ziXtlOrEY^DYr=*2Rnio`Kehf)Gxzr zwg|)pJmK-IwLS97k9r%$M{xKr=*-vnlS-;Q30X;H&mOpec#>&;7I6+?XSl7vx0_ou zOy$+p^@-;W8DAJ2tMK>vNi;?b3%U!VaGBy*OgJujAHB|$R%-aof}+sSq{#mL58<(Quy{B1-kc(7$-RU_jf;t= zJ;&r)uyX%u!tru}e|amrH%~4ixPb<5jY4(}QtZ;-y!=&u@orq~CE5=qFE&@}ubfB+ zT;cCHEgKShZ}RSU`KNtqKcI30cNrXK-?9xvCA%cAUK-e>pAiZ1a8)wPH25*u;LzW-LuvH%y4afN3A4#U=8?Yrx8|(LvrSQELf*K!BgF%` z;t4b91(m?_+iJ0EEu$jW;bqdxk&p=Wa$t=r13-lPYg4Z?;=QQrMzb67KaO%0MqQQ4 z{g-94yE#9}tbgpi+l?w6!3}3tMK3SJ6Tg=I0Vo3gIe7g6aF}e?E^d%9J68N*V?g^$ zvEyHwq~Q{AW(+o?FESEYy8L$WP2d99^4c3@`ApqFkB&?{jCTUOpSALXv8h?D^PM~?XNgQVh`*FxKBFsFnmdcjWhgBH zHO-TrEV@(pbV3#JU2%)c)2Y<5gOmW0GHJ6`c)eGaN{chHPAAqS^_kPo*rqJDt5BeV ziKa~%+c@RGz{Q<@fyfG16nrLTAWzn5ikER_UIDz~3F&VjNp32zm*xeWB(d4s~ybUq3A0wB= z89EOznx(xwxkE@0(jBNKn_M~Gn{QFDqf@YCaw3?avtsn3NqFfNqm|c*?l`?*&Qu^6 z63M!q<>4!zXuT^x;+DOwJT88ihgH{##&r1BL7r-HW_>8kp*Kf!fap9fRUb61_PyF5 zl^XWBaVH?IJ%urgESH+X{|0j|5z99lQGQq|+Ouig^T!hX_|=hEQOo00kMnX%j?DqR zOqqE$mSvUh|Rc6B(Eh>R|Y!6$D*)1ba|30XhYOjp342J*{$V^Yk zo8_7bsPr&8aqOMOyt5j5x{YC=_L-9;Q-|}0B+o&mW_EYE>rY zv{KmbhRK>=dpasn*v7u(fc!GvZuo?Q$v7$1jA;_CnTv{Tr9wP1ND3`dUF6=E(CfAgj^**fYf;70jijv3 z1G7oVC2rU7u`Q_u_Ccj*x2ksu3zlyD3}q}}d#3~&?;&@xXr5LR5JpbarE3!(= z2<)pQL*!-n>fJ(EZT~ZkUiLTffSA==li-t&r3Jct){1^dq4V@Vb=w{Le26Ws5u{+o zYFsN?0}ZL=T6`xN^B6xSjwd)vSAFa)jb!=8Z4kR)Q#adPuHWx%Llp^+)H8KUzP8Cn zz>rX`ynDygrj7ka1DfBrB0Y8}#9a-gRlLj$x6>EmE5=is$}{ea$6}hv-r8j+2u++0 z%RCWVv@^wy_+aKt5p!_rFF(_cLvmWj{l zvEN@*Ct1VP`jSx4`Lr0&f-W^=}h9nOt2^o?4O=NvInuTI16 zK3p#F7vj18lOgZz10!KfJSd@atxFw{6?w zcP`!~pL1)r14|F24ZR~@x0FM;G+owTTfJ7O)vY$i_%K3@+O>ZP<2S#So`|R z9k0 zMPsJ(-snu!Y(L{v&K1nQ%k^Q|*^MXTumuV(d!mo}*`U)6aiJFiGGs+7)CRRnTAi7& zB2G2a1v_57-gb0IWBD^6AtSiY2_i(ES1V3L{*IZ%s^n!;p$fvXvny>7Vkm3Piytx) zE<>i`@?aA4W8-^S*EHLG`pn|H`Y7kaH@xZyHga_*R%9x*tbz3bey!BWl#kEP!s^d= zw{#2L>>zso&=UXLN`El}o$mRI-d(=nf5|8>G2SNTz)XU+*?lkLmuMXVbaN(exn}=V zDUdlh{NE258Ecqqxt4-n*a;v>4I08j(1w|sek zHhXC0g6wVC`TB6rXVA{h{+KSrDLsPNHMvx4jlZLVH7LD^&-4-0;6q18FasRn;;ryj z0jol^z&CJT%|>c`3AEovRrD}KXV1#P zx`JcP@O$*apjKmOFcQ$j2Qg~HO%MKV$M}z{jz9T_|7Pm@pPdNvKjr%1)CSZtL9rK_ z!S48I5YB{{PUa`?B^l-yQWx@Wma22+fU7*WFH_#NzD)MuSKAwk7n^k=HX&Z8M)_w) zv2TpO`AQpK&~jnBroEnU`urv7ci!mh{0|Tsmoo3dU(g=%-Bo{nG}8I12Ks+l#=pv1 z{`_0e{Ll^NX}BT+lS}6c1heQoqt@gHt%O=pTTNikvp1AHoJ= zl^FFai^6eFxu*H;D2jbx$!}Wdf7E6F>EHgB`Z&YM1(YNaCTI_W=%T=Kf#jY~$fT?% zzAS~GVFNxYDHD6k(0ex5n4X@~Va(NwBw z(mGhez?C}a0sMqSJg$8#o)oRr3=TLA%7MMo^8!>)xt3CWPXajv&0n3gX$$*o3@!9@ zAjo9p<-K533I~0mBWPwLacVpCe9Rv-uN{!2`bA=Ba`y33LBD=&4ni+WGvrA|00&Ux zOJeX%-K|U}rl;=s`FGqe+1!m|b?6)P<*1^8@tmP}F|i z!@+s{@mfViLxb~TZ3gaN$_gZBtZHTKV`$UL>$ZpKrv?&91&{Z@LR>2?5q;7VV(6a_0@fnpH_pPhWs zl<}5+g5_d0=*q6i0&za=oR@=+?=+AOe}Q^H1XGQ0Yuz{~`m<1z=D#NG(O+tO=hC~y zJoqIZn~}VI*XikBlk`h$cR7xdRg9nWe~_PdHp&dZWc)Qr`>$nE{TJM3CLOFK0^ZmX zZ<`c7O}KzmYDPQd)zivMGcRJP;+?3TQ6W{~mv2QdIqKM}P_b0=xTMyiaS?AGhY;r6 z7~F!e#NH?mvoQ}o6WcRjU)*aDMCT9@e$Xkd_pxt&ef=|8G)bpr4vXvCedtscb=02f zBV*JoZOUp>=OQ)f{H_h)yjGRZaO1p^q};GnaLAcvUnYfe=W*gLq|uN6wqGUN*?iks zPMF=+ zkHh+i8T+r(FK9n|qUBqR-o801_E>!?O|$;9VWo2$uZ+*|-S3cOe&2HmL?0J=@vidg zQB!+altK01WB6*SypQqQe?a_P`-WAX{C@}YyLbM(W&V#mGr;9>s?-8$*&IX)YGR~N zhl_aCyV${M+C69Ek$|a~P@-|tX79(=cp@Ui=(mwPzB?mTdGp&Aa^;US1-bMN-t)UL z@N}BCZu$BVqUyW-%JJB0(IW1gbMk=79Whh+e3M%_nsI&O(VCXE5hMhSnnZn^;aYD? za#;E2q18q#`ceJE5mtwLS%}ImV%!d7qZgBVx&A5M(5cN&k)L8e0Chj;U&g$P4S35t z@%7XAVbleaM|ng1=rXEwKgZ{1Y4zuq^HuSqB=^QrFNQ9rC7UH{1^`lYorF}ETk%&D zw0u|RcF$FX$E%hfDEmUtt=xbKY_MPF+)9~(Ts)r$H*U05=UK`hwwi0P!FQtO7=0%$Ks|19gOg30-=#UGSPzm5I zk?R(r^9m#DaaFT#a^Xjhm*^Wg65a1^!HTl&X;YRwxFAAo4s5E%y1J|^W^og%6K#eW zYd?Fp$sbie>do4#|M+ro@w?}DdvY}2rY2ds`Irfr=~Vj#1+HoGOO2|1+oVp_A27dU zcwRn{qvC!%b6mu$|Cbhw@%(E8{>QnjD$QG8gr6qULE8MLc1QB1F7_`b+AK0JIdbA~ zL_4LNKWnPbY=5wEDv2&BGuZ##CRux@+ha_)(CngUe_V;Rh1Cbz8FH|=-)zVNcV zQ~5m^VA$}@_$9pW!*hh8Q_H)7Avpc{*~J^GHMf-Ur`9#UcV1@K@_vuy$K_SBhF{cc zAD-_ubb|(^)_XCa|Mkz$c2D>gobg8P)L(YE3;e!VCBN|deR#f9QZF diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c index d3e4a2272..294830816 100644 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/system_gd32vf103.c @@ -23,6 +23,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** +* @file system_gd32vf103.c +* @brief add from nuclei SDK +* https://github.com/Nuclei-Software/nuclei-sdk +* @version 1.1 +* @author AIIT XUOS Lab +* @date 2021-12-03 +*/ + #include #include #include "nuclei_sdk_hal.h" diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c index 988e6d0e2..7f929ada1 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/connect_uart.c @@ -12,10 +12,10 @@ /** * @file connect_usart.c -* @brief support gap8-board uart function and register to bus framework +* @brief supportrvstar-board uart function and register to bus framework * @version 1.1 * @author AIIT XUOS Lab -* @date 2021-09-02 +* @date 2021-12-03 */ #include diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c index f2c44268b..9269ace87 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/third_party_driver/uart/gd32vf103_usart.c @@ -32,6 +32,15 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI OF SUCH DAMAGE. */ +/** +* @file gd32vf103_usart.c +* @brief add from nuclei SDK +* https://github.com/Nuclei-Software/nuclei-sdk +* @version 1.1 +* @author AIIT XUOS Lab +* @date 2021-12-03 +*/ + #include "gd32vf103_usart.h" /*! From b1e7057b178df5dd999665f6f663ca0ab2b19f88 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Fri, 3 Dec 2021 16:47:17 +0800 Subject: [PATCH 4/5] add bin file flash way of gd32vf103_rvstar in READ.md --- .../XiUOS/board/gd32vf103_rvstar/README.md | 23 +++++++++++++++++- .../board/gd32vf103_rvstar/img/GigaDevice.png | Bin 0 -> 112121 bytes .../img/ISP_support_usart.png | Bin 0 -> 22075 bytes .../board/gd32vf103_rvstar/img/bin_flash.png | Bin 0 -> 56598 bytes .../board/gd32vf103_rvstar/img/boot_mode.png | Bin 0 -> 97833 bytes 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/GigaDevice.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/ISP_support_usart.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/bin_flash.png create mode 100644 Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/boot_mode.png diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md index e880c502b..518e6d2f3 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md @@ -63,7 +63,7 @@ cd kconfig-frontends ### 编译工具链: RISC-V: riscv-nuclei-elf-,默认安装到Ubuntu的/opt/,下载源码并解压。[下载网址 https://www.nucleisys.com/download.php] -![vscode](img/riscv_gnu.png) +![gnu](img/riscv_gnu.png) ```shell $ tar -xjf nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2 -C /opt/ @@ -131,6 +131,12 @@ make BOARD=gd32vf103_rvstar distclean ``` ## 3. 烧写及调试执行 +rvstar开发板启动模式说明: +![boot_mode](./img/boot_mode.png) + + +### 3.1 openocd gdb 调试方法 +选择boot模式,将引脚BOOT0 = H BOOT1 = H; rvstar支持openocd,可以通过openocd和gdb进行调试。 调试需要下载openocd和nuclei sdk,下载配置方法参见以下文档: @@ -171,4 +177,19 @@ riscv-nuclei-elf-gdb build/XiUOS_gd32vf103_rvstar.elf -ex "target remote localho 6、再输入load,最后输入continue命令即可在串口终端看到系统运行界面,如下图所示: ![terminal](./img/terminal.png) +该调试方式会同步将ELF文件load到片上flash,此时将boot模式改成“主闪存”,断开gdb一样可以启动. +### 3.2 bin文件烧写flash + +1、选择boot模式为“系统存储器”,将引脚BOOT0 = 1,BOOT1 = 0; +烧写可以通过如下两个支持ISP的串口: +![isp_usart](./img/ISP_support_usart.png) + +2、通过串口连接上开发板:串口RX接D5(tx),串口TX接D6(rx)两个位置。 + +3、通过软件GigaDevice MCU ISP Programmer工具(下载地址:http://www.gd32mcu.com/en/download/7?kw=GD32VF1) 进行bin文件烧写。 +![GigaDevice](./img/GigaDevice.png) + +4、烧写完成后,改变BOOT模式为“主闪存”,将引脚BOOT0 = 0;,此时接上开发板调试串口UART4就可以进行串口输出了。 + +![binflash](./img/bin_flash.png) \ No newline at end of file diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/GigaDevice.png b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/GigaDevice.png new file mode 100644 index 0000000000000000000000000000000000000000..44d32e6eadd312b66dffec78b16418cf94765909 GIT binary patch literal 112121 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%0A*WVz9p*fB8;eTPeVUfm+`#dQB~`_O&BKBUnZ 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 literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/ISP_support_usart.png b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/ISP_support_usart.png new file mode 100644 index 0000000000000000000000000000000000000000..80e4944efe809f450f15b5ee0f18847eb11cc55e GIT binary patch literal 22075 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 literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/bin_flash.png b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/img/bin_flash.png new file mode 100644 index 0000000000000000000000000000000000000000..8906efb3d2dae827315dcd23d402842640f1da04 GIT binary patch literal 56598 zcmYIv1y~zfv~Gf(i^I7Ix(lgenUJ7YA|HHM>{j?0rLxSju;PkSAT%$_`%{~<3WuHk9; z_x_b5rTo+u#?+rbe@Yi-hUaJh?58aZ4Gr>x-Zh`@*WX*aYt@z=pgtzVwI9Dv>DrWr zRWXIJK}+A4GQ59UT012aJE|LVx8!|5{`|+wxu)szcbgC`SB9?osrYx=hVgN)mR_oeEre0*VUPR>{z5ypQMdJs9{e@=l- z4r=EBTknu>Pdhw$iA|{_v8D{|X%Eh~n7@+0`m=OT_3-d`N8WQ4A?YXn)sER9`Sw!1SnF*WC!=y&KtzPnoZ7s!kh}jex#;cSCxU}nxTgvrV|t|~ ztE}f;Oj>iiXeTKyR!g`%d_T)fOkn?_PjpCd5m*{%niAbs=+cuh+$ref5yu|6<+{_{ z##KOXYoy(L%s1Pr;-=h0HZs=drYI-pLxzu!KgRr7_XzxZ!u^<6d98FgE^UkuK3f1U zY9Q-`MM||jJl`+i1%j&!Rl05CQv2c=5o&4Nrf)yZUxg}Ipkxi}Q-{-v(ze$Tks3EY zd1q0PAm~$>US;e68%7!!EK^P2KXj@>U1hA7WES!0O*h&g$-Eg^{gv4rR$S}I1N&;XJ{y6t| z@9)@Xmj!nNw_Xi7aL?=Co3XR1+gaRP?3J6r9u2uHg?xN^j90rtQ~2C4EtIoi*De;u zLse)%kUF;$kNgmF2OSHmp1oVpRc2H~ZNmt0~5J$Nvpex!6+FcdTBHsS~}uF!x( z@>FX{w)wQEdW%mn#HMlmun^RS)9czIeCpm{)VgI&KtMnv;mWvn38(Y~>Gy^Ia9Rv8 zdbsc)Gvz=aN{TxIL*uz!w;j*V2&AH> zTURh7k#Tz@syDydT9ERxQ*>y-uNkktH+g#hjG^(7LusY1M#>?*a>!m$Ltl<0JKb*2 zt$ur<1k80>U5kZK=??&?sY4F;g(8JsX9_x&`Ls`ypJ3rIxNa6;8;Y^ji zgPG=88Pc4j-ko`W%N@2xWx{s}fH~&{_6bVpwO#KN`f2NoWI?SR=bAIc;-`Q5Ey6EE z|Kw1DpoP4}mko5NU?t%9*jvu!d`Hxb=$~P-1aJ5k0k~(!BojU<#aqk zBwHhy?S1N&6|wmi!zHQOTn@OKgISRXAei5Nu?jWQ0wAbI&gOE&@1(I55R=x9L4-?7 z5e0eD9`^g_dh^dRo7;iIL`tc7Ug<)!qPWomb~Fb(optxnIShJrJ}%3}VN{31P1l@_ zly>wX9%Nf4sdbL`_W}dKg(D6zQ)`tTZIK57Z4~uOl@kHN@{yu1H|-9XGA?5~d=AKS zdIV{(dVPIPQM$kfu(GSW5|%}TPY2EnTe^F|BNH6cxYvNzuAU_Rm}#*loGM-V65gui zxcL`tzWEV77?-AVe1nzSlDfVi6<&;RrC-@mfHs(lPOq#=lm_&Ar~wAoG<4NvRvpJY z;=iVDdDQx-lcf?_VscEc*gxPV?NMeO9u1`u9jaS`-l|v|P*Nn%+3Lc6?BK5HvrVjB zuK93y-rT*k7NPbgotrThC?6o%pIY<#qY$xZTR^lwy|*j8;xZAh?`HS!1c8OxDabNF@504Gw|!#8w+*2nNsI0Qk9jNIq)NZVw_B!L9Kr=|iBI?J z+<)^@MU|h53i^_kCG8yFavzfZGf!z#3zZ(VOUf&*cawY+x8Ga6O+}Okcn*IEW_Dh$ z5-ATTYDrQl$SCy=JJCQ^DzI@U9=vty0|UEWk!Rw68P4~jX`kC*<1Xv*qJNN519>GO zveS~1NNi_YG|vfyBc;r@%6w<)AKzxof}Z24DF3=Tjz{Lruf0|3DMMsqc3*;As*N68Y>;}FM4v3bo@dimU8ee?{rw<$@d_2^;wHqhT^<7XVH+kENmE1eR7mb?I40-RH zJ4S2fd1`Nu+kLXA-lgkzZuQjsI|*_W)_;ra9JRC7Dxn@_#Wl)H!T8F1R&!!1dr2`d zS8wt_scrRW?G){E>&k}0kUi+#M!EyHL!UG1|HsE?ys}!L-D*O-Ib;;buII6QG<}w7nikiRz zYlqk(>{qb<|Je?&ZstU_8+;NCpmcQfP8R{3Bpmt?&&8au&&u*aRaM@ZFetuoWF_}dQ`qP11-@~+73KwP<@M6&$sHb(l3z&6-LuK( z-25E&R#p}4?TRZOx;Rs}y>b2%9w_?dYAyS5cLu(BzBe5f^4ki9np_eRlOa~2DWOwc zrDrR()Ng73qp{}_{6tv}$$m{byuQBzkl; zF}-BcfsOEsi}{zXey!p8KfIhENx4D9{?`<9^?EJZe$?!=e9r(W+W_->eMoMXI3i&dxUx>dB#7h^uJP7VP)e1-c z%i_rRG}+5L*^43re| ze;nq-d?9M|nTP-T0I}G8&4=P_)canDU;VnaU*;OrtA_la1m&MEd+%!Jq@n-aP;our z@tn)9?{h5Rp9fxx+P1C^UnVJRdH>giWuNo?CrUak2Sfimf)X8iEB)Z6j_lTbPBr@f z2LAY=Bhkh+NX$uoC=S(o)YkG39lq6Xl+n7{ZT^~4Wg9LR`5(gVy2a2c8zXMLv473T zvB2_wEd2gsQHf-Wjr*So480^O)6ZjNLg+leL@-g%?qBj`{fF)HZXq+PM+j0*pvR{E z(QxJ5X6VN>=bYztlP1KCl+&p8`;IwPny$^*jIN|cUQPk#IXiKY4Tr2{uC?*NV$AX$J@1vCFZ| z1OVYj-T(q#B@|Hj``&p)8Nk!5(Nuf`tQ8j0t(ba2_jCPiJ~53HbW9Y$BQ`5wmF`Zq z(;bXXO)W0dr)ri&DGA?r;e<_|w6=R#qIRP%Avqw31aF?a{Ban)Vr9$maX^k$=zG$S zoDCMMKT`NV#wc-PX=jNj~o+3R>o<7PuXf64NX?Yvwg!Tm`U8ysn4X?!_Q=-C; zK_RIP30&bRI7Z!+`pOxKgPn<8*9~bkqsnx?G-$FP)Xvd^Haxc9F=-5ZoKv|~Gsyl@ z6L+XO@jZIUMu=vpeF?Ak$27a^fmF`-J4Q@a`@EtPYA2eYM2`JBG0fuMcTe!~@o5!rxEnw>Czei~A_E!WM*<4P zG;tyGv=||I1%OvZvPtJ}^Al_(oeIP<9Z-YL%{#vB%DF>X^D+4Q7c+RpYAeL*fTgi= z>V>L>0erj>yO!-R=-Q)W$;B7c=M8zEJ~-o52LD5_o0I-2w#XWIU2Yj0`h6)H0+n-Q zq1djM)Zm9Rf3>#asAyMH|3nCAMl$8lu9!F(hZ;9Rt#Z!z0D73Abl_IRq{I%3)xAX} zqF~9d+HOGL%mH>eDd<_QyA6|7gwPw%465Y?ZJMW#wuB;60%7=wo#X!$=Ph!K7iY@4n`5!%07EeGZKpq8!xj2jKiYvFieUaKN+ zMV%Lz-=pT1eo#}c%D54J7l!ql>0M;LNo%z~bPn(x1#y_WDPnc2lFUqq<-2%*v-ymR zj9_lBcw*JYwUEk?e)6D-zp){-ebxnb({%4|(h!OtgDL8T{WRTgj>tdRg*5_Y`QW8KvY^RX3hX)3Qf*!<)E6$N%uiDh!{fPp3$d`|v?2K=Kwg zXEnG1)8}DP3==cRz}#FD)ZV`mnk}ZBEf}o%V|w-OI{f#*fUGG!jrT2QEBZ3b%5Lx zuT$Tl84D6x3#6ue3CS1(GSM3&T7M*oW2uw=SzjeYAIy5*R--ESMn_e8A1YEli6+A6 zz-O56`|bOngVnWSOhQ}Y3urZto~FhM-%Wb(T&zX~Rp|9nd|*bdlB!XR(YOIr+5o$+ z&kM=Fvr7_nccLf9D*C-ZCUG$4!)tONsCXB#p3t9S*h=SR%OX*BUR>-~Y%}F! z&BpCD`xf7QW@)RfA>^NUl9^@4(xEQUvnK4VBomRbZ%)x z4)!uI@M6VkI44Qw9?V`n-J+8NG|{I(J(51ooK$v_m%g>Lr7$L zok?F+VhX=MK3pmN>ope1%I~o?If$Z+mm8gLxsTthKfnHJ@1$%2m@{ECVe;kNI%A3- z>xIiNL2b3GyRss@YI&SwD;WaSGY>Wl2xcj(R^s@KA{29SsTP88M_3Q5(RCK^>JxOf z(TFB{W|a9A=Px-ChYIHuXQr^EFFS@tYGywAWYt2vb;LUr82H#CsHg^#U4^ynubSGI zwpba!YHFv@1CjLh4~;PZEsswbNprJSm1AlXGsOk)9D0Pc zEho4e2$lwi{w|M_G}HuQZV&$~y1_U9FwYo}5ARRrSR`km2T9nGn!Dqhcy~sFt?pNJ7M9-ZMeZL<&2o35D#P(c+OI8eg%pwpO|3TTeDS@+Qf zuk;q7GnRwYuah6@4s2}5s(Ia)q_}&_%!tp7I4Q)Qc%X7jQN)h4o6fnE9vD&-ni>PX zy_|FoW2K2N5w@)tW|v{h2Sd{o^v@FBM4|G14cp#m zds7Y_8U!h{lCs~89=~3l8nyOl8Qr7#-dyzl5|>;C+0)_DybHNXc*|7mnLCU#e0J`> z_bGLGmx%%gZBFGVsDqoykm7V4%@cQ_w)POvzLQ3o51(QLCprMZ z415UYq9}2DO``t5EEC-wN=B2Bn`47W9YsxfSa#%IUwEwU=fptPFYBvM z*)+e_WJXO>ipoF|yo#G0@Rsb{B%4?gjZ=-~SH?*dCtYS4w>FMLC3wVB{Z+f46Hvs> z^C22l=n&Be{EXJGf$;AY=y=qkJr`8XT;9Vz5oCfdC4(b>ZF8Gq(46f})3n{KCSL_- z-;1;_+*3u;1RoPJuB@ka{^mgcel9GDlUd#4JPG?y;p2z_k)~4QQp8Da>MDwR zz2$jc95n92tcc$yRVpMZQ}NyLTr=|<(or7rH7-dPr4PWVEOw@f%#bzLKW845aYXM9 z3Sjl&6OM^Q(Kf!C<-?lQ$dvlSe`<l^AvOU?^P*K%(3+G`q zTK}josjwpnBxIgyKD(s4xg~L;Vov%YS8JG8Q$N|QyHCtsSS5hTg%5u@r)#ps^3Wvh^dvV zjjpniA!p3V}-W0Ghf-fuiK+gT{GFm(^5Kd_bKMjhpc`cn84 z({vL2aEB)v(&ZInq^mSP-UqC&#zI?c%~m%DL+fJ|8+Ow%k(OFxqx!i~VgpL@3|Re= z20_xPJi#RBRJ$$kkz#HqNK9Jvk3vssjz(@^$XtIyaxy)K=+kM3#jeGBF_Yo>YchU6 zI#@IrL;@5C%j1g5H{Y&Uxw_kG`}KIk|49D0;qdU%|8nV(r0ss_kjruT6E^*^PL(UU z{bFNa!1$+0YMJ0gTvIU}iT<5;pAajjQ9t6fU58Q|m2H+tT^xIiR8Bhfzx`F~oK%6$ zI7%AJ_-_^#YMV6x!n$E|lU$kc01`5e%F5z6h_`j*KWeF6uiwrbptm>n-ceJ1>)RIG zWzOA?VoM+xVA(mr9lPE5FGM!F#p(H5JN`ktgZa$7eMpRf)g9q9NY-fBlE`7zl#@LM z@6nWp{46ZYPC%}EC8X)6Bh8Xt(f#~O-uGL*E9r_hcbhukq+C5sY8K$@vdhN(v@A2*uDr8a&$w1hKXSz*HdEXzOQp_<8gd|qi>4_AHwi1M zzllp~{pO931A$t2eco3d>_qZ0|9LAO76$;ke*u&-<3j}oZR+zQy8RJ!rNhEv=wQ1? zmHtV)olV1igj1zOqqSY>M@^L*y5Vi#mBEZ``+m5&xeIgT1|^T8vKste0y1rV?lF$k zR~YyiD7%=`;({NR+4Si} zcKRI+7J2d!(Zog4Xq7h9b7m%&g3}w*UZsQ16an8a@{Fn~)4>RUA1^ZhP#E zZ;-8laPMDXcX;^T82|c3s{rkZN-t6{hAU?y@;9>|kF$?x9>pH1A9t1>U)?!8p8I!~ z`(3kQfA^A!yl4*$RYz$y;TJEK#N9GoBtI?6LhMYNN-@I}p}C36Nd66khESx-wv(=v zv(5`-f&J*aI!rF#wX=4$#_{LW z7wY7hn3?^)OhMi2=*ywtbNBB8n!bm98g4Q`xuW(v;as~km-i;O;XEX75jp;wqXi%s z@@Q@Tpa5Q0P!+EhzpDxzmxHR6sJu41d5thP=5>hW*sm}@NQ~@89~6P*uR`S5bt6B- zQ9PDBNALd=QIRo;{(JttKc|%Ah42dt_S}(h{1g!^&MHPaK96rrR;N{l>K5(IbMH;s zNuk6n)#fW+k$Q9$f2Y?umc)EIM1XJAC^)$?anmn&XVhQb4jUr7biU&qRN4E5qzo5w&&|Et_Zxv{hu`U%00NuoQor$Zh2u=Rx<8!FH$tE5;e>o2dkXED)*YacMI1bk@cQK^lHy(lt4&Rf|=WlRP6bT|%Pz*)@=AvQ`!7 z*j*!<*?0UI{5jjpDk-hb)OhYA@fm;p&Zkrqs0@!wdkcI~3HO>0{!H0iiO;}5A|)fe zc5|*bQ*-UDl+CTE$?DXH&Hu3RvP}Uhr;o}#s7HB%hCCxSM}T~$+lR6AvU&b(4_7zk zMtL5G4%}wjj!G$9ReFvI3qNRd5!gRa|DEeEpl(WF3|QvCk&p`{ zwDKRM%m3E>g#vAw7yd`Vx$2G$y!3> z+N-~#0}HxFah~wM*&I(}nLAwK0QY!wYyp!0a@}>sqkO2nE0p^RM?AAMoS|9&A|I3o z+LbIL2cVYM1>-?y2m9nWW~(|1jWB@S5eQW^^<5+!wK%1kW72wmv*6{N>A0?ph?`5& z8UWpnFBJQaCQ9GNDyb2wUx{E0`nCLC{I>Py9ezSJF0CM|yanGI0dIUd7dRc8B|!j> zEPd^|?OafOK4S`xjltQ-nqk|xa~`nQm9l^LnViYXH@r4Xaai?lI2@izR0q=+9K9k^ zdwIYjaJpP*E08xndc5&AN8e!3S~Fwpc&&F5r>PS>{Cys+o^VB`!^>PtV~#8-t!kI6 z7Pp7`rg_764g2>D?(pk~g|$QBdY)%0)$VH&^SqSdlu>!Al8(Zk^I0kd@kL&eqI?=d z3E~Strj$Tg{DvM-t@=ioD;EUi3dl5@yN{x1qWD)!q6YU61(*`+wvYAQ0jEH;f_M zRFG346>N+S`6!QbAiZunQYytJivN}Q_S+e`st3)YdD46s*^H#wKg-FRve z?m$<(&C`L&@ja|d25kdpp4ComOn36f5msEa z@mSE7o~1OscP9F{(0zKQ3Vi1hWAUey2Q4jxa*x|A=|Ic+3{BHg;%>&%YU)#5I&Coo z;`6|gPqOd93Kpi&y4>bd;Io|++yBNntW0VpDXK4JS}hGO*%-`vH?#Jj+kpHg>2YFd zgg1buwd5$dQ2f#!IXE$>W^DB8ay&!2SB&ZL#X)|lx(cV0^-#CxL7_~&ku~FWQ(_Cz zmI>psLWl6YyixS8mbJ4?G*w2~X@W(EAYTdr?OE4N__SRDV8=DeI&!&=GHJI^>dA4y z#k5fyNq~ey{hCipNm#!Ekn!!>$)wFpliNG_-@@25qL|-;v9%m`FvZ5Y7{K&$@3o<> ziSZW5?MgC1D4WcvCk;WGwR)k+;$IzYUI$zf0+;Q>or%KuUol9fv;g^dc-&~kd<9ZT zJu>X=sK7xdBNvyPh~|bP8?qI|Ik|_|uq!WyPpq8X_@ciN6}BWGX6J5F0Zg7cC?X&z z1N&&SC~fs^rmIkyUw^$k&LzowB~rVjQNU+~nqwZLYciO&VV^Wg_9?d~by7&hj7C@C z#+&*gY;GrRxqt1K(=!r?8V*a z)K}js)}YvBFZ1cy8lRARkt8G}<+a2yt7~Wos!Fc?D6P=Yjxo{=Kn6VP+E}L*028i| z>oAqEsHt_@86_Z7gqFMs5%Mg)U#?c?LYSMBCjxd>`#k(U8#P3yuIIX;4=hPPtB%gM zzJ$nD&$ozmvIp&+M`5mbIDcoD180UJrA<=T8ru%V2(K}#Iqz$=9U zl00@?Uq7X{ zsmlV$?r@r97ZMt(Ss-&UIycll4yVA8eSMeWkrIbPB_kv%)Z+o)0tIx#vI9)MjzxyV zhY~p&f%PRi)jBmJZg$=tRKvWnFWA8I4?7q4w++s>+#CxH;puqKkAX}iUt{}1lzzWA z`OLv{8m6i%?j>vRe7xE@CV{9lFlmm%D-N)T*DDGgEbzMMZ5c8t9L7sWru2p*&+h)k zRdZkIxhzW)ka8)x1?R*EQtPHS?XP{BA21jXvAQZ>$%jBVHGaaKElo+n(Ym|4nc#z8 zgBchYm^heaRGnzU*mEj=`olgkPj{*Tbo;U79WhmPr3Xqla>K#lN}+LS3UL6x z7tJ8GP6jl0gjax6Tw4BkFs};yK24dFH`A$AO8MG2aKlde(?v82!$TyK(h`9Jd-w@I zv2*?q#^wgfED@7vEU1gTdSwyCD3}`Zi;YGB6vFeI9ej5((A6>IdOYphx;@xMZC?8n zeE<-#T=FzQl}1B_@O<7A#|FaGAVzwSCw(a}`0AL-;wA2N*~71eJ5sHic3rAssi5Z7 zEoKQg@j!jSBLON={%GSG+t3MD)p*f9W zpk2B2I(7m%Qu!RXG?Oo2&?F<*Ct9puC`LAB1M&=TF4gnA3F^Wj-Uw?emcsNT3A0W3 z8&PI#&S%uCEAie9ZkHS;>Q%9EiP0Gy1UC!Gc{94WHk#~od8V;OG0GAe1q$nw1#ofW zkO-Gv@4BBkZF;k#1w2Bi_?V(d?Xzm6+`0M)?!QR^fX)6dzsJ>#nJE0M8$S$ zl7SY5qUx3WKb-9`7WQKnUc6#pLpPwQg^sgTsj{jRLhzGD~X=P z1OAyHxYKa9!+%0LLG*-vSrZ380RbT0@Sr*X)kg))Z9A^%9{eak6b#lCc_fgJRyE$s z!p~)O9ZKwg$^A%{MwaqO8E79zzMlKo@o>S&%ChKZq&vCsyG6E7cVu<7jN0-zg_FJy zN3Q*&wh}JKahyHT+4+DQTrvSUc^r_{(QAWAskO#pdDA3-fm$av)vzWiH`uqIh>bQ? zr|A=)#RyO^RX|?kp4a(IAc7KvyVj%fYj9_xG6c?Pz)Kp=w6A1uBuN1BqtlYyaR;lz zPa3Qh0xX8If?c*aI~3Xkwc3API8PF`l~fgrW)1&%Av7|lm?fx9(BLY=Pf}Np7(4VG zSL-~KS##H!zoym_*(V4od2%3_3zr=HoB&nMCb4lOK@Is#!oH}O`n{bnbiJiSEp$EvfOSzGb>CKFj zj6!(|h76xA8k{4`j*>+sxm*%8#C*rw89;O849gCMOTQfBQnxA_E0U6OiyF|;g3w&G z63eAv46t68S7vNnlarH02!yzS0XqNyK*rNUAdn)55|lEFbSRN71x$T_t3xz$;9oaw zir%}4u;;Z#9PlZEaY#rRz!!Yr`4J^2I~4RR;GHjH9J)z>UE=F_lJ87e)`inr+C$`6 zMNrmJ{MFNT!8tiwK6;=xwOVQNEQgO5akRYaNA=Aj&|Df!Lu!j%^8My(g@H*GUFa&- zCN0-bPL!EfG-81mTVZ?Q@Yxt#Z0UJR?t9E9p<-%Vpt?)N&t`7W_~lf%eA}l;T+@I+ zm#LFGX^F&cZ)G>;v+&4b^i1v#-Y6b|2iXZjHQ2 zevrpO#RJ~@3q;sC*xSP%tG9~955?}++Lp`xuV12kLcf-2J2jqvV&Dd{cG@_`e;ZF z!qLxCC8zHkqn8mGvi$~VxlY^s{YCc_PeKfmC}w_r)RH9gZ!XW3$hoYSG=3-qr%!P! zU&i!MvjGB~{j_3j_m)=|n&BT#Aj14FZd&6k7>O}dc_=Y!x&b6c5 z94DuzvFXV_%wUR^3i4(Rv!M*|D2^IfOHED9hnF)FsjvAr*JOEW1&)?>o$PZP_jlgP zw2f9}ahRMB)s$>1G<}a-=1t0J>YJT{!wTRnv_|p}X~~zd&+ZQjiHM4)felG%8tF)& z_5mIIN+?&(s^esYww_J`9HL21xq%OMrNtYVi};d}2?XmM3%gK_vrk*aarAJMoOGT> z9RFsjc1y4v(7uw$Qf}^ zVr>q0b%hdI-;rUz)pqasF`jCzUG)j~Bd1zgn)<^$5PbPs z&lzhhNJ|62A^zd|X?wK%DGgep2YyN|^-~>+ilcSuJEsjvpNjeD6npOM%q@JPR1>))fXWa0rJ(^(?6 ztlr44mPHr5x}SSKq3S47z@~uBkyJ#Ah|SBs0oO?;&(-`s?Uqk`ALEzVbOcD%q_g`48(3Wg_uEXwk04mvu9 ztd$gy&eS9(Ei0^_g>^rhmLC;G41y;P-+pw1K%?a#{{!uA?BBr4=UGr02WXZW{1VQ` z{yQ$1HY0(w{QRWkJ3GIB|9;chr_KOk1D)fX7Xy2A%m&*#evuc&0TS_T5Zs@MED*-2 z7|QG&%#TD(d6ubT|9IF|{GcdgS6)x#7Z0$P{2)VmLf0>hh16?0Z_aKo0%)lb z8aNyH^5r6GVN>c*)=J|>YYE3G?tYCC0kiSpyI>5v$L4q`d>2WnyT$ z;GF86N1j8r-&L~zjpf~eN1NwRL8D-aC3Qlb>29v~fR&us*0x=kG6n`+>-6UtjP zxWc3@5B{d6h}yCAObFPs2}1`xC(%K|4EzI4)7+<67_v)F_IOO3bHf?+>4~< zqhR)r3T<2EEFnpL3a?#Q2YMc6aTqYxn_`pH-nlQ-$10!o7j`f-P7HM=OZXb46o>cf6=O(SCLCQ zf4quHN@e|2G1PdfKA4qiXsYNdbVh%ceQQof$3aCq#*7}O+#MbQ6vlyct$i1m_s5T% zd%$maVAAl|_1NN$izAeuX*}y;;~$n-L%HuJjFK zbeq+4vPN5M25SzmL@+ZkeZcXfkh8d=D+a}0kUk?JKh;(?^l~Ue(rnv6ho!9$Vo;XqWlNrg~ges@8t_i-1i!bz#Bu;V>}mEgqDRo zIss-9{X$jxaIB{WvghmV)CzWUteHk~#g62{#|@cwa$zl-%F!b%u13r-kg1EtIGB}P zhz85RD(k&Mm|sd0ng_jF7crrZV@{2WW{xosRwPb~B0}HUPWGr-^=VBHg^X5_V6Dm5#H(I{)o4z7g+oe4(6{+tPRa)5E1mg|YMkioen z9O!71vA@eA9QE#r)SaAb#@PhI|-iaul* z5R(yv-j@}nX~<}84wFjVwr zP_6Tn_@iNG8`bB4^|hL&=1rNhPLB*t>uJL~{A0AeUxyy69+FP-DV3De&J{?age73C zajI7lDvv5c63-stx@6x_(zPk3EbzmS=2zxXqS~gBdUmm4T4T36TZEmV)NSD8%|YR~ox3m-TdR+_6o@2fJgU7KuG`@*2S~r@01AN?k7TLmwfRzx9ze z?|)o=Xf<#NC(q%kE zY2ZW(Ufr(xLtK?z(kq%TX-qod?7IbVZCBk}SCgFnr3yCM`VF)djrlz>06zfqCuGI0;%Ui&(Y4Wm6R+XL>gZj5!`AAg&D7d;_!H#h&i(50E{y@2 zw3?*jx!P?7&0BBBEgw`s-UOA~J^8~C-`ApY1l zQe7Wya#TNJ_U2iF*5)s@w66iVyzA=>^k9*f+)g=ZGas(5MShvKy+y~y=nY>+zY@Xw z80|0i*@x!x?pq>q{ur-!s5htK<_&tQ$8*PrO;ASbW-y@^^;*%PDUh){4-rc9++kco zlKE%A z#h!p@&BdBgj0+(l(&VT8CdF8pkIRh)Mjt7a`0x=et5ENl?Pmf^2_vg8@fT+S`XwQj zBZv==l+M`^$VB)qE8k>$ku;@siN>G*p5-C8DdYTRF zHpC$H6eBVz4e$yPs_E-eflQc2E8@4@(h8!hrXwO(fDYmWHA03UT|@@zB3QCS`X3m; zwLpkW#f*~$K>2ojUN?+w&rfPoxxhCA7BZiTK9Cv^@)u*q!=DdkFBYN5S>*;(c*I6< z=XV%5GLASR`ABj~gvh`N)-Ki&B(nDjY6^WMchQnjuY+SXKfegt;QyfQp4uRzFAF`U z25#C(8*XT7ni$K4sOEO;TVt{w=H#Dnvq@P`5^A&DIi0PDBpx*5Xc66A#*_IcXuayt zh4fZ1qPKh99=BalwztuEyxil2)w54C5pzlPPPW#m!8;-=v3{&-3T1ItH^46Th&$|f z&ZcW$;U^qZVVKb5a^||c{a$l}zYD1PpxC=gV_~GRv+ANUzJ)C$8d_9lNkF8JsVblF z16GNE{@KOgOrLSYkYK?0ph?w6!JIZ6FXa|db2l?lTT@2|diM%d1=KzG$K^P=%_q|6 z?#|_IWk9T0`BGROr;WpSC4*eM+BOT7Zz8)US=CP0DQOQB_5ofRfRxV_J0&_NKVW-w z@Y`WtQV#B$F`6E**}H(!r7Uoh*t4SlB)}A-;Yurp!5H>jN)nw8H(4@A^s9GSMTtMA z-th4mF1Q|vR^B7RwzwXuDqO% z^WcjrP8Y|(NnUqs1{^#O?uOY%L9tXd)kCVne25aw=*qvmc*~Eb^QTX4MDD$s0o(?%!DX ziZHDS=Vm-y%5I#%5JQ+|%CxIaSXveyJnP*$dDIBs;I4sPaFXujbj^R!MLF3>@mHKW zLXU^-hEKG*qR%>_Kc9)!0;_r14PaaH+KLvP^=ZBm4S(F$V^r2GvX-$e4X1qO(Ykz< zz|g)cYK;RnUMVT*Lw36F^&h7n5Tu^ICS42orzxsvBwPJcnnGOJOtKq-%;cqh+;cej zXKlH7+j1Vs7<2g$fH9KZZa8u!WXVZWUei4|B%PC=e1b)gLBR1}8hsxaF@VpW#S-U@KJ>d=Os&^1t*6-*Q88qc|0Li1F+!?zWQv^`R-QKEU09!MUpB!^% zv=0Tajbv@QLZKONK4k6phv%mmiUu|jP|hs!#O=gi0lGln#Q^+;^T2oqucNi~iz=l1B5716 zJt!)(0yfO#zT2E05}Tu4Vp~oJ=0m5SFh|~P(u|skhh$%I(X$ImL3nDn;AG4|b~)>N z@XJv7*K3y{Mo7;KlswVE3Yvr3a>~?&a9-`1G{71l+tLADq{ZOr7Lpn^BJkEHYq)Q9EKHLnY6syzHB6E2o)e_9kNK*p)q7|>Z~mA`o! zmTWvi?QdE1&xKNuiXNpi{y0ZN;oJEs@qxs;@63(ep6g%L;a_EAXq;huWzFlWFMJkb zZmG_5Kicg4D;K}IvUaiGiWGMK;Yl~}yd@YtjiIq*-f$e2=_O~%GJ7VBQ(n}+2J1r6 z-@WQDmDn!NT#t5HQ|Ni06Gag+r6JBgrk@i}6Ovg@im<*iY&G$J6qJr%3#2(Cd=QIH zE1wEzb1GJ>-#hZdT5dCZSa!J+02w-mn7uJi5vb${x~%)rxr-2FjNSP4x5?WepL;RR zA?nOc%$~lMnd9e0k57-Wg}5``(}#UEw&j)quxCzYDKhu_OF=@?b<=&em)1`*MO|Vt zCjELxEdpO7?6DvNtXGafmu3@Wo_tor&=4JE|w=~Qf5AZ=nq z5fvRrD=KmTuf)chv8{p#YTy$I{UxLLQM@R53i^(Qj$bsimb6l6$CtACp22Nz6f>vo zCN?y@Dlc#KMEF*vUyhNH58I1IoF3{M`3^q4ixhep4(}Ah?$I*zQg!B9uF%mk)q(aG zYedBX5)$rz?w~$w+a-}EOyYKRc=eNd*=VP#n5?J?8ZssPF82*DIM;k0Xj1i?8<{mV z{ZjGpNG8Y$?|XIOscqt4Qt$t_KkqZ5F^nnL&?k2^XCv$Udo-y z=I<1?$}p zRo00zRJI(@L5v@W;DHoDE%JDY9$3jZ2b0g!2pBy!3x4#Kl3w-~jNDHxE#4y4TQ4<> z6NuHmxNyn){o)iISxSg{U0dn7&sw2(OXks9miG4k#5=6}U*@p_&uG6&Zy1slNhXL* zYPokj&wB2|1|5BATpF9FlrB`Gq1cVDhT<*?dpVl?GFMAkeOSCryY%5^GFOOH1V2zv zPtfo2XJFaw@ZQtTn+T#EOJ?)=_7AYz<`tLDUlmD0w2g}X0*LW*>MuL7l4^l*wo$CG zKip|g1)E!PlPJ9^aLVxBZNqh{d(v#6_h1?(!pctMrIkiMvi~K%^ycnO#2fJm_t&_S zv+K}4T~TGTgiUxGOw>gh>O^qQ+tEK&P3@i57&9NV$q*PSFTXaPw2|>n^R#W{ktRRz zQOWOOrvu)zt9reF$amBPY)mxeY*BoN^pWoE8O%D^Db;YEco@h!>k~n=FOg}xHy6q9 znjT2GYj{r!YGH#IV<#EwMwFhVE-8P#5E?%IOyS~t8&#D?#tE64Ui@xg$AoWe(H$3I zJCX$?-!Y5(bQPOO3PF_&?^G7tCK%6Ji1lNaA7411e24QyE$1&RCvO?w5G}Kq( zr9MXLnx@IiC|$+Cco%Ow_TaiD`3%3PWE+G&aypdY zc72FFlgGp?7~`CSp`mX4c^>KA)0f;}J*A@V1X=c+Xsl?OoqfX+SX-RkWb=XA!;1@g z9{Yb8jP5sq%UnrW31UKg*ibfg@_`c-F92{*@OEKCM8u;ab`iauZr;9EskYx)+N*u8 z$WBhh|3&o-1SIwWA-INURn(qMA+%BK3|Lb0)5QdF9rN`-*+z&Sm0f@m^v3M&~$&ragRX*aw-vK=9 zkI~%3H@T@x?CuV7Kcc6N@#G4-0ZX-l6Ap-64z}=@w2R(v%SZwVLOnto`*qv3PhG|r zycz*(yMftd`8jV%>q4z;lj6cEO3pq@(;D?p(h)a})%DJ~3Z_==39JV!P{0>NV50Ky zt#AVBj##IYF{>s<&@tIJOf4wZk>wVmad)bmHelj_^!nmUK*-~Z*Ov2o=m=ycV|J?tsLlbOsHp ziN$T1hCuBWl(6-rRWyzx)|m^CDkJwk9(Cq34338NL`tOG+Q%{Lli7_20(1<#1TA3b zKK>_?tgbAwlCs|7uisy>0xx?sTzOSh0Rl~FyxjYg6M1d81ed8;1nlh=w{ctKcTITF zKhI4AHoSaza77Pkq$<`sV?{KA$u1(&FFD04hI~g7zVS=zR@$?~bbQQ`KaM&zbz+zw zuM*+p_NZzS_cJ7#y^sHw_&^TH^E&KqV zPSIYGl-#1WN?n#}y?8sR_=Ta@og4}#P1N_pLGLZc*YiY)$ji|t-*ZX3h2!nPz?L0C z_54p&6;8VLH>|9T#;Mc0vFY4EAY1-Lu?n_c@1~xZtoM<4>pXLn{XNsa&S6fp;RQv< zpSM*K6%A&!Z$k?XozMms!dDOf-nvjc9t1POZi_Z$A6iOLvQ* zF$tJX%{T_?`xDW(+_^#ieZIZ#P?HE6U!r~U>5J+1OocSskVquCe8c1KHP2)sb-_wo1&>mR?!&!UY}c>+M%T&i5}o?)R!X-mk6}?*C#c zzJ*3%qmL96GV)l>E5uTYknokM^etshO((104+wY-2->g9K&&PVc+zQCW~Z(n)Vl3` ziv5`qukGs03*EqwrS@>MLLL{cE4lAzi?iJQk4{xzpYCR^^Bzr+@7oDz((CW^++7m%o2j2NWOpLP>EV6D=(c&tY z3tMPYL+T_%`!kl+PK6lop_Oku`!A?|nvdZnlLb{5DZ`Tq!2Gd|e~J`e!LTar8=xvL zlvFaHusrt4wf%A+F;ahSvQ84s=7Q)i!DRDG(hI=9*&?;`CTX!QPn5PYQd@lzd;~o% zk0*O)c^h9W7F`-ZRzJj!Dq=tN3$u2>f|Q6kbhfVZ!*gA#TI*)R8He1dguy%N29zrO z;MX?|aW`8Hxz=-Tf|?S!=k*4*8v1UOvcz7IzDQdC7f){A1HSwA{x$-=SZd?=GE8!A z>u-sJzN|$M^e$y)ysi>m(#HucUOb?B`=I{xE!#fBE|&;Fhf&!aVK%jDu+Q@+o<-7o znkpDUe|V>50gTV}QHL(XOeYzd0@w zJ7}}q>l&R-wO{P;AEDT%-?urnE}WBU@-t_?aO5%+oO}Fb@2zg!4mV0&z=jPLwE&fw z->H({=?(Yk-)8^6P7YXg8gY>==QjMWl9zb8!}rn+-S>uze2ho<iB>cN~E=TJZ7hmoG; zTv@7qqhHh~c_NAJA2!RMfSq0HZ~Z4yZ4(q4QQWSx3jWZrFnSRY`5)^g-@a)!hG=2m zI~=I%+R)o8ypvPqfhv$ibGUh{&INsrWa(kLp14*gnnc2*t%y>=$=5v_`#;(umDxMR zI@(yimJ}AfCACfk3CLCsFlC~n{p&8xZgv~IqA-;yr{fVIX6DL~*HldT^sn;!w`atu zVJsypJ|A&7`M8OD)2OtyPmLbx-5y58HuW7&S%iRRT|&|{fJu=9m4)kHw0_IYSYlkE&a@K z*q-#cvqY-3bGo1@zQEkDkhuIot8UesMc_`3f#ppMSAoyKpo*+Jth#kbX{<;@R_Rss zOfQJfy26fQN^|OcP-(k9q^YKCxUn^@?fF`* zOWiHZs*kh(5(dqTWN&L`0Y33{oxyFeU~h}|4Jf)E*k zM5^1zzcXoo3+>*ucdg+(DtetkmN2rC@J#~8h01n&^?@Jq;5FnjewD4bQXd!2KaHoO zsGR{CY}iQY++Dpfn|Ly-WZq^&TFMPBwU}ia5{UkwF^XDeZ#4=ukYB;}nxFkVhoA_a zP9D9g&T*uY@S*V7;q0V+x+Vs~PLITa_uctCt|xf0WTh)RRth6{X&LzUZ$r^D1gv?> z)G|XWlbOx8r&$pg(Tg(xo6+RTobOZhr@$$eU?n@G?OL6pBa@KAh&P7!`%4(N1Y)9slR&IdLhgHSYM0NX z{eVQ6DyUkgvSG>b?e=e$8s+|$syWyDeXS)QciJ1-Um(Vo3dApY16dpn>)%M9D*+t1 z>+xGZn%85?y+QR}byxESOM#x0H(`4qNLWQRS5PBIz7?2s_8-dhbSeWA7s_ijlP*Yy z9aWnj?VPi*B+QTj1H*nEm_pSUIa5KGdV2fTw6v)e(n0kLC8bo*^d903V0R? zoV-?Uo08-4=;nU)AlU$@T>v#hH5}WqUA7;0xVs-?yg%4tF~(JuS4HRi@;x+^DgS6;SCx|+TlmJFg=I9fks+V= zi^U*_vjX<5DLHGsRZ9P$ez$0Z)VVf*_qNiF5u$UoP$HK;ZLF)AtoQMGi}g-qy{EkQ ztKYN90~}&O9oazMLdj{H%EyX|^&;>hkI^WbEW8RXBvicFBqZv*QOcA0y|j@aGp(Mb z)-N)4J*$Z(>}h#i%RA3A?}%<_eBLG zt@`a`8)YFSdHwiO%=#SdQsKt2T4qCKLpMnyP|ICWQ&*JI8gyx>{Zx2cC=5%^5~ut! zQHKHU!pkJD=p&c04ufNj*MW8O=fEN!I1=i)%WhDpjz584z&JyX1>eqqB}Fy zJBmjkZu-`<&tia9Z4O0Y!%50A&*d+wvrJa)ZRLdjObL5sWf?tYJX;ujre-Nm16H0{ zzXShdT@5I6O%p^j%Wvh5VVazE#CpvoLC1pTd-+shntpO%_CWDJn8JZshc0*RCY;qf>WV5Tt8UA#Q|rX{R-qAna8OmY zvhnkz?xaiE^AB+s6}44NEv&^(oJ9`u@$l^WbeHw>njP=!U33Z-Y$a?ZuE3qzP`Q$_ zorwRCF$k3rLwlBc=u165H~Y9=3ys_(S$X-5CNma+{D2^HBbxOy)aH|fdY4sFOy`ZE zt*g`J+kP@+FYOC~J99kj2$#TcRQYb#eK!n(Z_!Q(AN1%Lz__IM$!@o9C`S>cjA9*; zN23a=Y>FD1eF@&A1r?#Zrmafsb=y_q>KsX2EZzh-S9C zHPg+341c+@{*_K~={75RTmT9Jxi9XP9=Z+SB5sKFQl~c)$APi$cWAh9X$ceC9a%t& zOiUbe>=mh-Yxvu^pT-uY@d6W644kcC&1h*0PPA0TlFu0Yel<%aC`_>rrFQ){c!xFYV2UY zTv(olE$V&Y8XUeKPIT|w!u8uNg5H1Byn)?azC*=}C1e=%#!|t~ZXg$Zc78M5mu!1% zsa>vPM?Ubi+zI9P7LRsCFeK-v$7}!Ew}lS0OS8bdP7Q#FdxFE1PL`X2df|@QYIDa8 z=PPWAqJ^p0&G-x8w^z{l)C~;lwj=94d~ckWgk~Z$tmQX~|4i3}0e`sDeKA!olW1NK`nR|i}rL`#iYIzOi^)9^{UUZm#BjKU+nEO55o+0L zzm}luZjT$NyoX+lF)5S@Rkqg{!%Eg)3m`+@SR-HRSqjb+m$l0csX+1n{d0HQDWp|3 z@r}f6rcDNk$$9W~kScn$Gi#o$h5dg>5+%coTE3#IP3MfVasMcH&E_1)mD$hD%?*~3 zmL^A<&e2nD!^kWATJlsF4LU5V{OS3md(57N?kjc;SR+Ac^nHup+= zC=s4)qdf?skrL$gD;S7le}sfj6E#9dh&R*CWItFEj1ZRg*&2<($Ejq)w|ICtBO)#5 zUH5pPJ;D*gX-fFW5=pPOwqr5}*%&Ihu@HBER!4*aWaz-*D(%`dRCJ1n zzbs`mX0!bMWpH(f`0DFr7vGF&Sy|8;O*p!1jhea_S)9^Ib8Syz+Q-b?x&df8(GdAcS5z-12<4P7yY}@rO~q z>e2qXH;oW&rXZv2)SGL@yzWg&_~H+i!a8W2M;k?Pj}1z<1)n`)U($OtM>s>tz1x4u zbw;n_G33-F{}C}~X?nR19{TFFk`SpB8C)u=tAu^^-8eh?)V2Bc%xbIAB z$>`FKNX8$CK}8}`;!0*PFCXv1pXm|qmQA-7Pr;P@{D}KtzZsJ9f<($Y;)&h}tFX{; zU!rYsdxQgmNC%QyQGuWvB)%W8Rxt@=BVmeNwfHpw8n&9*CP1Ij+rf@dQ3|7NDt zT5l^q56GK4ak)Eu(@^g|MqQtzs0~=hxdt*D%}OoGy|!i#h$D1;4j~I9^{x%Ld6$Nb9uqEc+g{ij+t7bSYt~7t{O-kTqK0WLYfU5+8*Mzn zVG+$5UgH_ccS(_H>5!(%JSpz-u+jdUBAz8*Z(N62C+&YHy*p+V^55_L=G3AvmEtD6 zGn5>WY|%i66zIdO(L|Gz;F18r=Wgm{b(G44-@_!NIGxlN&_- z6J2(H;;123VUv`JQH+lwK=L$Ffi+|$M!lymf;E$sMX~?vUEopxLGbQ5Mo!yDT6_&j zgvm&*?-k1rV#zlx$cGd3do$6W$>q4G{d9eQyZuiK>;?Nj*1OMR**U>z8axWB#vZxF_-QY%Xfrui+=@ zQ9}xmXn-p%2^{}%7}Tc~F6Sj;Ox>#{dukHjn8Jle5`*5VpJJ$889xKlDLT7e^9O;) zdmCD#tx8pAY^(l+M}0cV4j1V_e33Mf#-_;Hjjt+I#V4dzJUeN#$SDnP`U!<0^MOi* zC?N0xuWxwPAwqdmm$_0oO9@up$gOU8m(mkly8Xub@D`l~3?UW-z=aFELOUXUIHSe~ ztR7pJTvTtTJgJTUCFy>Dy$6<{?{=3-z5F^*l1x;$(Z?kJL8S1b{YIQmJ{(2^$yj8y{4qYwJf5q)PP%K#Ku(Wl!e zkwq;j>EP~z_m%6gGN3JuKz!Nbv$34oK6d+eZXkNCepj$U-Qi^NqtwVhVkt5! zK>FNhbU-0uU?3`vmIIu!z; zKAN+7lcjua8?yw2n<%R?yekv}*X>CkP-!?LAN#A`H2#?~rndrU++FK-AiIKK=GDDd}Yp+9a1EjImp80U&J>F~dDt>rj1)d$gxW&x_1* zF?5XL|On7M0OQ#Ynl#xGjiGw`F}JloUR-lBUzYu z-zw%+Znhwg!#^3SyFEH*lQzU{=~`b%MBq|F^)S|jmy-&1t#NB)gx4`!OJ&W5yu_aK z(Y?V^i4VYhd{A$;H<;>6&>4zB!`1PZYG@E(6k>UnK(i$6|DuDaK8dTkl7(wj-ksOP zwW?YXcKP>D_~9W@>-D6two$MWsp{(9lt@a_L~jPKu!Agp^X zBN&3J2>X_(l^ZmS;D=|wgp&t2-k?UsX=tAHXu!~F1K5Cs@=dN#j^L#1$iOg}M}-@r zun;FTVF470N>_6&Zz84DrK1Pp2OINt=ct4E4N5`$FmFR0!AiDrfx-#R;!rtY%po9m zw)Id+9VY_tp6DvQoHH!Qf_ob1h(DNb>6wAjh{xgvB0f_@5a^3cND)dU4o`m_c1_hH zLRSe@u|xh<=0_|Xoe(yT&o7L+en|c?7^P$ffb8gbRW-Z#`H5LIHbc8(57@>ty~lor&CbR93EO-1I|HL@wNDN+$Eix`YzH6gDLba& zSDE=IFlXn&0}lvra_Dqj_L=k2Rd-l+g4_PSKUJG2q5NoG|CW(09=-?V>92&uEGS%? zEa>`NyJtL3&B}rx?`6dLWUjA}>%CBXu5eI9KywnDCPA9@#=iUJ|AxY~GVFZ*wK?K#BkYe$8_PXXDDNZ=m%Hi|}&4PbQO z3jWur90x-t%eITLoXNhs&MJ%gT;n~e(O7mPQW4MTS0AKoG5)>oG3O*wZRBYiGgQYzg@h^~!mr$fsTYg9?NJ>ip{Rkzzv*t9RK* zP}^QbTbpcKH9K|-bEl~Kd+1Ra;_Js=3t&?yXsyK(=`c$Ox%;?!T1@E~#3AJ*jW1Ab z5PDkt%6vWJC(9RAaMG$Wgm?>kkELR5pP3W#8wA-SW*w-Aj3^aI?CHzrb(R<$Xj#1S z?J*g=cL7qfOwowiB&rPk3!iAKIq!I^+(oCjP?ushzdEHQZK}NE~diLJLU}8Z#BbQDo0$oENN?rIj z%`U?axYjdQQ4uUvpOi%blGiiq&RbM}x$h+-j*c898+h-$jteU)aivvEgs7*`TF2!l zd7`;)CuBJA<=3J7On6XGDfHZgd5R}BElDo0oINXx@4s#I+r%VXdUIi*7_0HwNKIID z+AKqnKDN=Ghl3KmX;a$i&u;bw9WhfvCh?ZkPj z2?6WEC{S}HYe-W~C@*vW)<03>kpbR5uz>MoiAjC4K~Rplcawy{gY|7+Cs?Y-&-%qPR{y$CGwG8voBPDwIxM^IVP@CjuL zF0F99e8PQV#z2C)-o%@x^zl=-%8D4k65@DJopj8+XTR{>W~Rc#Y%vs0cLsf%;Sm%} z7ywV8$@vXRmsp9)s+#j)aIEoTNop==^?=0XjK9&sSyc>Q#b8NFC8v>x<@mKGu`vFs z;V!V$iH+VDB}y$xYUp9i-DG0q!^!-OJ}?Z`?vAbY27>Ix^YEHKvrcu}!7I}vbDytY z9yM@BH-&AFD9e5NNI`w)X|-j;@P#Km^q15@C6lB*Nb*f+-#bifT%#7Y=v8>8O+Xyx z6%2sIFsdhI;d1}?WF+pFCkP?`Vx>1IQ;WRv0B%=h6oyPM`m(dL*E#p{%E-%9Aj*^F z6W%YDVUvk@(^(W1tIKYT=7|PfROxow&c6>0e|d0wdoagiK8>b)Ngfx0t3ap785xVF zbH0de{9fizc){s)!{N4UjO6spPs{Ddgx%gb3(mHPATYvJqxe_pWopok~le1Zo#mn>}*A8)@_qW<^d9I~WrpcR? zR5we?SjJD|HY?L(NQmbYCmW#i>Ti8Z4RC=+2MoQhXmQ3&Q5c&2L7Sa^z-rp=DCeWo z^r>1M7 zChqL?cWd|U$P7@WTe8J|Iy(F34lJ^v!%L(C+&HpOAEI9#SkcuQ1B1AdFq>yl%4q0N z5LAu`9b-sY6eBv>oO29hFk1d0HPJDpsJ2f3LdUYsrm%no+vkRL037v;b2Tq`O2M1g zE>Bc@E^XY8q?L=PutF$ivV>lQS@uI`zgnL4&eU<%z{nU=;jh9Q4DA*E`)J~T7tO`v z^CjWxyg<8zD^p|KQ?6vY8>`;(J2r3*O6gv7oO23X0 z>n|uGiAPV+jdk=osT=w}oR0pD2IM7I@#)p^pPwPVS3tLwKnZ<$Z>vHxi*zh+GS}c0 zMhu3I^pC{VcS}D$5N2lX?HBb}B&R}2xm)kpI7Uk`&7Lpk%F=hxNsCRI=)=RZ1-Uv` zp5phNb7Q_?D#G11`dCE+-Cpb&6tZw_g;)RbB+ZiPDXtcO?gN4tfFR_lzZ9wz-nsiw zSya2BHTJ06C}r|m&j!g#dYj@YWZrv-{_+ifEgXPMe?V*IJ)&#ppZsWEg4LA<%?RN$ z%Jmulv3g*$H1z57i#l63o+GM&ScwqYjZurhd*ItUc4rYqwvBSxm(!1XeuX8as7-`wSoD%ow=dzpmrEWx(dP5Q$qXEEv;hpC6Sm>l0XX z^*z_|qxC_3P2ddAfM_t;E__`0Q?L$lj5;a3aj`Hu$97C8G#}<%7w~Ua$&Z>BnaB4f z6|p!nXRc$s6pyo{sp#-J;fa3=2+eg%sEbkWzGj}MK8~PW&$m#!=R1UYNB`()@3Eav zKcTvdq9x4Vc&GUc2lQ%{?o?}%uSAPUE+Q$u_^SyT0K0-+Zky`dY zg)%8ZJ?z&85H;!m-|PI|OxmN4t*~+p!3Q@#%G9_0oHLvEM~Cdd0ajUtCHz9qWvK@^ z>h+&ReR5{n(diO+CUX9F(d-w7AkIf-$Wq08BBe9Sa48=!cS@&Gsfqxk!E;I;1b9_z+QaC7gU#)^`8jxO0D%iTp_v{Kb;AFX zF$4edDdYv*>W3UJTtm=|w|dn0PZ^i)i3nq2Z@Jjnb7_4c zBhE}^1wo<|=qsTtF>-JS6{^nTSM3!&9d$4QW1lIS{YzoRIxk?&pc4OgT_S8U>%HrS zG$W%28pRbnM%>P>21C~7SAbPI&BToAZ1GDy5o&1wNt2o~=AQ-lhB3N-ROD z>@cThe~%zKa^0OG?QSv=7%{w79a55vBTCmv+z8VUi!3#*@}yV3EH&S89WGuNT})YO zYfBWyb|!$h^;20gnjawOs?r`bgOn&AX0-f;tPk-$%PE)T{4J}Cg3K7-k#`imN#!lo z9(0}5o>BGCBFW0mq-x+lK$O`SIx8uOYkb}&FQi%F@#^o6gJ zLYVtTijIqe5mTmq6Qq2%jCApWW@D@Yz?lDUuv9ujc`eW4nS`Aq%aaz~G~z=ytU< z3WvXZw_-0Rjv2!ea-0w}{|;D?XHo$lq#B8M}-^Z`z z?c>o z5~kcE4g(kg6lSq^#Mi|C@_Fx1q!wQA;!O}T?TRYhv$Mf%>N{+z!(1%#+PGt(=sPUwxNw!{ug6|2ZZg+9|9HrBDdW`ZY@v33bsaQM z`U6#B($(eMCMR+w28a{wL~`MD{uxLWB51>xw}_lq5mF4Kja&X~*@GT}#1Xe}2^xdLfjKq#?Ci>g~ZsCL)sxI+6vt(vgZAwM@`!ujCro|?@X zWb&<8UD$lIuf365Ix@Wp{kg&G@p(gAk=ndosdOYuqax&6gqa>KHq&;;N!Z@rBtC9HJOA^ZFywn;3IS@qb z7mfv3OVF$^_l7&@jm0ONv zeGodCGGA)BdX{PM+tZ|m$;Uxckl`q}G}tc;1$bmV6<)RFd(&otM!L;n2Q2XL_Jfa@>g|2vK5 z@*1mmJx&6Ug<^jKFil6Ss5P&ju8l-yqCNvBo+Q*HB+hDDYJ1*P9eZi{t`=GL?b{?r zv{DjI>MQdKURFzswwTMMkiw=yQw_C^{hO$l6tk{o1pF=#?5eDNjS2OLe|>ND4;<7r z^}?hGa!?3z?-wvOXHpomt(bolk=e_@Qh|I=aLGPFj~+37**CnTEgv-YF-dQOSMZ?^ zP?aLct5XoMm;{X7kMW)N%=+X!)Y-v1mVAWYo@Gn#m^%y@_co0S zUyEA_w3n}4eifdV3_Qll4KwLE`f6}Z?^$M{Hjj0PogehD#&^nCClMUp6BJ2)&FcON zM}D+tts+y1LQKgmR)|K7lG(y$!}HKFhkld*IG4FDwM3N@ml=J%?hB*b+eH+5RA9v@ zkvS%7)!@2vTXWHraAva8v4mRg8m;!0;wP<-=JLe+q%)!jT zE6R>Ex!7JJqplRSS>}d|t8L7|lY(c2 zXflKo*KnB#tMc|#tIAUHM&pv@$;ka}IcE*pRPyz1TA>h%Zu-{;2Nz zgGo9LvT`b{lQ0g2S}r*$9eN9POgx>W2v>L(odZ)+bm%v4Pbve+N zgG=eNqg3>1zTpo^3E&;<9e>a-)DKCecc^3YCY}wg?%PjH)hBEvs0vAY@3l$t;nXXB zRVuI=J4Y5pdc8Z8v#05#cb=vdPbA|j>O8qXe)w6PNDf+d1Z`Jl%e?d<<0T)yhr;{q z^>>?8R8~dX@ZsT~g%!d=Qh~IL@$zHfs7(3cepZUS_}m0Ow=*{`=jWq9RgQGkVoB<{ zkGn_q_72u1H5hy5XtYn}c{$;>6RQ-c3dD1>MR9SpNH;VVG)0w-q~PDeKtjZ&jlhK< z3`yNy!V-Nh#;U{k!NUccvQ_I|l0)W9gXr;`nI8As?;)c@6shqYJMqDMt|X89`xGz3 zLf?09AJ1$ob=+=!(Sb}i|LD+~QCD=7tDD|MFwfY8i+ez{o*tKMY@T5^4xel+Vv=z6 z)h_$4`fgDKcQd?aZA4JMRs-|BJs0qZQnnu<%pQI@aq2B6i071Qkymxh(S+Mqk>er*q_HD$=$dj~@XBIJ^%h0>?z!+_PA|6ad2 zpka|iz=Z+gSvK)c2KLGQKg!0q?Kls|9~SP0l&`2}e-1MqCr~wGMjcue$P(vyKthVn zkv2t9T>Nn$L2QuV1xWA%NU*VnLqMg1sihKB$LdlmPadOU$*D-;pe|#fHLf0IOptxp z%4?N4KVMolAPEZwa?I&v8!ceeH^7#GEpO$WieARILWBs@QM}k;F%l|m;N>Y3PLJ0RilD!6uB-~pbri;q?xLVRDXpTSHKPvV9 z2!Ao{ZTQ=Mq3%LumYGkaUhtibfPDgZW~m~KrkuOK_?*}~r4A)wii8mJ6y%SOP5M*9 z|IOe&0d>1Pj)Ol{aD5sbhZky>f+Mnlsp=4sH?UIQKfWXUdPvSR;Q44yMcf{OhJGy6V&83+)d&`Qi@?rVczV;{K$IUTf2P^&n^= z3&(c4h`{*23v4;tVC&F3a*IONnhPy300RP=nFF`n<6&DOXQ+P zoWYQ@u8$UyyEqmib#a?=F(XBZH9a;QOqm8$t>{V$j%f=eeR$bhAbt*kDkGuiDF z^7+yV8{${)oiGeZR+7r~Rg>m980!q8zJ8xkbR9gfaD)nlOl6kg%az%_6m;EsgMT;!73yk_Qnu0;fwuW$FV4SW|SW$#x7+D1yO7=eesp{Rb-U=J}Rvclp z(73=p0^ooe;%2y%`nD~wChvRnfKkNP938YVqtZ>Lw}CIL55t-~M>ECKO;5C}WCyrJ zqNd^03LFd1lrFR`HdimQo9n!Px%)k+xLibDjosK+NIdDJ4!Blg13^9jYgi6QQ53q> zh9UVlw7nxnSBWWb1jYIp!}&eG=Xw0&ybkw$#iu{->vP?^u49eA1CJXL5^fCAVYL>YC;dsT#1*}&t9fsKgX^i5o7 zjua{j*wd=U%u1#id*{MsrILZLbcFI{n4SG5@v62_`iF8p>rX^Ud z-8%}g%L{BQl)euFOyaxIiLWWsfz6hjlgiM4^`R18F^Gb+4&72!wRTrN;0#dLp-jv2 z%Dp_`*3cKS>g`5Rz;`M=@maGRX}~5WUGTjI1tWE%)235mj@Muk)cMlluC#ntT!ca8 z{gWQET4&=nfur{6U@?Xm*0~-V-w_2K(2PO+9J{2Rc=k}`$-4ZeYVsVBwwBRK(TP*Me zu|sRP{tMu$N_vG1%)x(DeJn8iTOc<*$;)mEN3)TGmzMzdD~kffyVn+U8gTBU0EAEUl|OxZ|L|D z4nTkVIkTpddtS$oDxVvXtDq)mb8PXWTSfr|P1}<_*}W3GLWBEM)Gj4p{ZWBvZ6e_lalP);c&2eh z>=tt&v)+U4DeI0`=<@d)pEhb}g%pxRPtJ`u5r1X4$M{fdf6?w;$*aM#6XYpGEPcFgr5Ep=!}--EZa_;AA6pZQXu4L|dF zLHpEjjJh3S*rcx2+S<@YrispPm#?57F$a9MJjoIh%e=P+otvoKxtn(4K5pYmNq5$r z8aOAUXC-_hCk;5IFd$#^#jqM39TeJ$f}%Fy!d(DH+dmfrd?P)72P&4F$)By57u@_Rifz2+bW;17 zhTWw*N-wwdh$B_&p@w(^8;YZX`77R@6pEJm(<>Zm88{|2MBlh3*FC>ke!C+CZ`!Wl~O^jRvfqbXDhH1m9pwFsF=E~{EJ6F0q(;@ zv&zF{UlW*E3p8!p+yFTt>v26Ly|UsU-1rpoD_H zg4>XNT4n^{jXLS&k3#b?Z+~kJNhFNFc{K3Q|LxB^Y{R_$7X+^xeL5fOd-mYs;+m{i z{%=AH z+`=^UH#7{?pum?T{lk~|gl;Fn;cL5~o!a~R{dTeJg(rU-NQu;or_D_Ybd_~Iysbuu z)qk-=@B~f*_HTJK=Vjo|SjN;On$oXF+IN7G zcG^|L^XD7|pI=6rQILtgG)yRBp-sVMGo|2D-MV>&L+cwBzo+FR!7)mR%(#XM=p zDgR5S-(EW1V2EvxLf}rqzkMn28aJZM#XH7dBLo_!=Lo!;xDDL@W~9k{Gz9Hf9D?ad zMP(=-s4)8sFu>bOE+>mL+CMTqDYi~k4JQve8d~l%RYVLjZy8R$0y=6WGPV_Lf0DLw zWD}@Nl4gF}RqJjH-D7Cpr=zqH2io9H(xIk=><2T7{|sgyI*?_#dRlPkI$b~j!#OZZ zKuV~Qz;XFi|MDW{TA-5_RCVN8D0P&Q? zil@h(+RhzO;NH>d?+WV@BoewV)+{rR)3UzZ1@2h)&V7fjNxbQwdBeqUPq{&#t9Eosaw&&p`zr0{iP{PSK7P}|P5_!EplKL_NQcja`XVK;112voq zRc)_66UipeSal5e@6B!>U1yePaH7&-j_P>02$=A1b#LEs$?pp?>b=g2naYg*E8j5S z@3znjwoG{?lQgNF-V=*Xh%RQ}tj>i&VzbrGlDN3UMUQ;Oyahor1+i|IK{S%MUDm9? z6U`|lyE|3t*k1skxN5V~H)P9n+fODhVPoq8_8foS!ozoHGQ&(b1?UAIZ{WK57GVZK z=H$o^fp(R9)z{9gp_*sY!#XXyC#;qCB6=!+ z{-`$4RmA$-Yxsy9t>G-=2G@Ba&N5k4Z`>lRZ>-A*fH;eKm!0Ie5?7j&(G|kyNQnbp_(MrRqm-ns#SaY`v$f(vhD)+%f(6pdl%Rm$2?BNv_ERzME9Bv}P&Cs- z&zkK0YojWkxFnT+B0&75Vav)j;OyPrsCcb=_L#>3`ZtqKG;9s^xyGYBV%WmlUb&VT z9aP(L$>1`|W{Dc%OrEu_mAmd)fs;5)pSv>2d^*;JGc8;DxgjQb-SO&NM$ZT77i6C; zowUn&r2~zziO>8d4<3s|yBk=kw7sf69EA^LDr+tpZ1&pacx;G)?efHWiTrE(Oet1^AM>+y`_ia~R6x+d4G3TwZ zJo%zsDJkKB-rF)Jg(!>O@Ul2Ik-+@xdD^^Wfzyu#puPRIAwCT?`Jd9b9?m>#@d9rA zxi;%6X4Esa|6@Ccne0TTjsi}jn1{x85Oo|fUR}?oPr-it>9(=Z0Kr`wdX?i-D%dz} z^2oVY>(I2QPoqGT2R}*r^rnWN3kR(AvuHJXoW$*=9=P6;MM^FewOJI15G^ z-zDql+W?KdiNF(REG|X@h!G)?Z`9o-cjD`W$en?JlYY3`O$tU8tCc?za=OGL7lA09 zvWnCOU`mw_N(t)E000;6!a7MHp0{AYYs(+ao>Up9z|NAQb6VmWQrlb7{dlYzTfq(cD(~XWhg=I6$TJgwnKwAa&c58@Vmit;Xaf^H);Kw+Q@N$D(mzuUl2ya;d&wT9M5ZckK-WJ+Ega|332@-_ z;fr#kxri@^^GUw@D?OD6iu`Z4Eg}C*R8tsnA?>+_5o?uudKAn6pcLc$?r(l#^K&;2x)som+oWF7TjfTVz5{z;31Eoaz%IkfR=kr{fkK)aUw~%a~EWMh~QY;kK#9wnajk z>>a4#*p`{95uu_|!ix#0v~1xGR0+{LWdH~Ke~0US5)G8i_Ob@r7w>>5jD z3}7AXDxbs>URB1AW4GJfhwZg7g*gdv`C_NbFTTaQx|A(-q+|$h4eiEPU?4%b?%mRy zS7O5bi`K@=vD^HF7cG5GRZbjo?Q>yTi+i^xem|+wus5i`EwR!+N00JxV?1Y);`gKi zg7i-LWa}J{+O2RsIp<-tRNg2(aZhDobDeY6Eq=usviU`3n+U4`?6u`okhV`I5k1cx zvyiDHz@GX#VxBox`(`h^)A)AEtk{G3`BQVhQ8V6OFkr6{EuLCBHw@OP2G8)b2Bw`l zeyN}_pm(l(Y2C^N`Z+L?2U0ZhWNQnrruI88(&6f7<%y#4~%=g>noON#6 zgn13R>S3nV25;M|oNBYfT#ym&?ABT-Z6o5{!IcJu7q@$5UeVWfgAtA<_IhwEds3WT zy`D*6sKtUrtu3ZfGi1IM!Dr^3EJ!hrK+uO(xwxnQiqIbKp}a&|e)D?L>l z_6OZkMdQ75lB$cM%uXqtWpc@t6Q6En)1)?jNsh1&YQwt-{_0I~G=SqP=m+|~@6+Rl zRx8H2kfVLb3K=Bz+_HP)^Xe==pRF=qdcyDhp+2Yf3P9$@9Sh?xxZ9et2a-+%dm6;`x>j*oHDF<0!>)7K7Z}&xFC30z5t91I9A`Ar z#0~YU_rOCoHK}~yB1`Z1G>2z~&n+xe+E_XwW!AaHLwa`c_3jfy-17BWYs@20l(bPZujbV*6v3Xo+{jq&Uv*(Ai8@9=sGW1 zM6snWpL*6fsq&PNhD>b{h$pJdfRpjJ2(rt*6%kTexC#HQGMLqf4SdZ{EVdhl@F1pu z>(vZU*zr)Un<$z*4{$Fy-^amiKYR^I^RDf=45#VbOx`QZ+@`mntg+FC#Qc>LFn zW$HQBIvl;D@lg&>B1&v)Xffj*m?g1VyeM|Jy;r88PqZBFwv#flRBll%g7KEHUfuVp z&L+yXfG@g~*{Aeiwg#3fHQg5pL{&i3c&w<0Ca@Md>&9X`8U6Nocbd|Zom-KM-!W6R zsjQ-wzfgJr9>CF8zB{wGV%qVKeBmj3c)5@H&V2Wv2p{Nem;Uq>{?l*Y7%_|iE2gGm zos44KpvoqKoV6Lj$H&5fJN=@M5Jwo$uW7!!=l&Bi6j(uFz@k5`Xz96F{^V;Cx(VZ2 z^lKEz+*=@~?}_eg>dwq|VW@t+q{B+fuB= zDna$(W;7ld-{ayba{?G{vhh1XSDXt45e9xe)CJCP6E&$_>SR2bsLG0Sc6>3{(|rqT z-(p0KwKGgohjL`j+9Ds2Y2^S2%Rq%UcRS}muH-qo3wf(xlTS41Ysm(OE|;FAH#Rp{ zRtv7S1-_B7|C&rfPOFov!kM!_hQw39pj{MlO6!GaAPrTo?1-if}%3exyUNUAqKAdQ_Dq>z?NW(46<3 z8spnO z>-vUM0BBWsRk!W<;RqYbCLZC$F&dLNM2UstQpRs@ZL)1Jyag7&DxKAdsJ(&A1R^>ryetT0I_xI7*UA6YQ()Er1xWasV$slmRAce>{HtzjP+K?lGjRF%X zhj9kg=5+q8rPKiTsE?v%BJKXb-@hUOmO@Ln`9;dkk(`daM4-L6?6({Q{~xvoz@wmA zc+4NH-|k+UY57aa+jlyKvKj#DIp#Oj+GBxL%@IK)p!^SyPw~NPN)y0+(>uGmpH$%~ zg&T4eC{dnA)T;L%ib6<`e}ESxF0t}oP4B;&P`zhduJ_;d$lO7rs97J^-;MyBf6c^N z|2s%q2MWONA*-EVf$*aITlVVbB(}eZ^m?_O2N?8+GXOK_5rZt2)<;tjz}G}2G^g6$ zF?eILoRu{~y>uoQYKx_RZb<{x4Ij(B5$ya6Uy@uVM<+L<5C=Rr9out&YxJIH3|J~v zB4#5cW7rx7=EOIKIi9QcMw3>7@{D8L0P~Pd&X8*_A(ep*z%F2i)MHKSYmOY-2^!aa z-+?}C4fnaYwaM;eW*AgrQ@$Y0S%4Y<8*Ab>tu+>}>e_#S6!xsUOJc5)OwzasSP5%G zga%<7*hsc92{)-sTV|>`s6gV)vf$v#TNxQqbOL#fxv+F=FhA4%MalkxxWx*glpdMj zfD#dK-R%N{B57Nz?Hp{`GCXe1LKqm-JuU@t=z78)$FTjN)E!j<*MN=$_9823~`~h87b}0e>m_VYU=A{x; zw%2P_Rd8^Rsg^(O0jA~c)0kgZf9XCw%Ykt*O^wiac#A8uMUBA1_Kh??>vM)$1Leb=FUxl!w~rJ{2rwX?=@|VuLS?D?#5$ z4sn-Tlb4QTk^t=sa_+}3*b$Fskr%q)TO@+q=C6L_b^qWLjp)_6U)TK#m(|?*IXXx*hNyEwJS{ zNh4gmjmT8~luGto6pt=80j!96I=Q8IH4ON-`_fZ>g6;R3AssC~;a!d^>vHXXvln8+AgD$I^ zEk(nZ|3l|~;r5*{<4SyQEL#dHEdLf+hII?-Tm#W-TL=3k<2Ub_90r4lP1XrOdG_|x zFgFmK({#tXpC&OQsYS(BxyU4uY3BWkxVL2^Y9Qt@Q$Ty|3k1AqaV^^eA}%yAfU-u& zSI>|n#Z6-$h4MM=?&W)cwm+^ca(Em#-R`!cc~Yb7SYHjILpA&YTlJ6P+?{Xb#(O67 zn+d({zzx%Us=@bUtS4Vdb>095@eU*DvJI>#>VD9#tp^>s3xn0MRU!0x&j6nsLVHtk z+j(y#X2cXr#ZHyQA+DPO+5tj~HY=c#{R7N*Rw=8|9H9Q~-;!G=8e~7Jts2sbXX}73pY_ z63a?(t$d<~@g{3E^{Hcbf@6G`D$K$c;vA?U#gDF0XQ2b)ZK(g_+S91xjUbcLOE zBRTeaUnenBK2G1z#g{tBGuolsI4O9GBPFY)(({LMHI!Fe@KTHHp1nn_E3LevNu7s@ z_|ZJnql9J3THtXp8|%}^@k;=ZS!5fn5l+T|K=sQ>+#8Z zCSm_DN1oItHI4P_I&%zL%V|aPUt*1uP%cu^ayKP$vOP}s{ascyL^Ds+fnLv=9Grbf zra!*T85!3;F{|i?xtlfEX z4mg?%eE7h0Bjq}goH!NWDgZ^PzI_a)N10Wjlk}i|A5XQBP^tf4Kikhgn3q%;{!cf^ zp@pfpq{e^eGxhFc@X7kq4NOwjl*qCFMjs2 zSHJTK*lHrdBJb0H$^x@y6RmZLyyQSe7Un*jxZ0;gp^X$5cjH6|6K!iRkE(iUIV6Sp z9uVDjoJPp?V4%=P4zQ*NT`cw7BDy>-;`?%E#^gJ;wORD${8nM}h2v&!h50h8Ks>>7 z?@bMW^MPvUNr(c(&Q932(1Ayj*byNoQ=I_UwGVaVszC6&&;#|oQ1WmD`a?0NO4abL zT2>Z6ZE1kN^5&zVf>hfH%@{%>ALvlZ2!NZTVUD6ZF~Gi&yI~mqTi>lTXMhJ&fMdWW z7#d@N(McS<;C2&TDD7NL_?}sfTtkvJo__U0NLx>~y$>@jwpj{W*v$+NSgNmONpI|k z47WcUOHtcs^#WL`5o+;x${iQM&TeTwdrv%w$p)d~pp-dFoLVOCqC^N&+<^f4PD>OO zK1uKB78P~s6gMu(HK)<~)xFO28!rfKq|G0o`^m zb$F7oG*_^e-BoFraJ)?e*Le&4JoHO~Ym~WQWBZreQ3(31Il9KafG(4QelF+R*d3oQ zy3AiM)`AxU+I57peH2*d-uNWR$g- z9|Ra$YW-5EX@t==T`cELx@}cg-DZHE)xRqu`^W{b@bTH`Xv7vDsAXLJ;V*oBFgpHi zj@L+wB&{}!f^!QFTIIM8md#t6#WjA+7;i-ZHav)`ypd;iZ#{jwssDBSbCjUGgiCPP zjmcf$_QOf+%cuT$mq4N2-NWbQm=2g3Z6B7(qef7`9rv6y#cadIn9JOqy93c3WP9Zq2ox!7lD z(>XQhCr0llZPa>lUmx*E$4p4!tu^Q@rmt}nW(Obnw(tIE`A$GhSC65KOZQd)e1U$y zl(fZqQ^Yjh*7}8X?JsL%>W~HV!WB3fit4=C+pR)G4tpzAsr#)dQenDzQ zQBRx~YyOm;_$(^=*8A72>61=Xi8-lDsb6WOWg|xQ^Cq7s3aS^>C#pklH%P&_KcFk* zRFZw!T}<-J_6d%Anw#ryI#2QM*!z(L=Ml^HNTGD{CcVtN;6ih;PG;{xcUq&&Ku1ZU z&p!RQJ=dHMIf`M%c6J>Wa#}Q`jLSGf1~!|^N1KtFHX8w$uk);_$&N`}Un}E$U_ms} zS$I)nG-v`5etO#VMTubvu<6K=9!;{TYEbT5|QrYk}>c9s= zV;?iKmzf*_@VyW1SyF4zQhaOuJ=gVCLz9FTwUWFPv%~$1}lr{vECCS3kol_ibN{3 zSY};&jVEPCk+2JASr&VHENl{GbkRx!xx>=&A4yC z$Ms2#`{inZV6p!j>jXiyfohx4aTB302{d0D3ILliHmWd=5XYKVRSot^Ib+Q*QYiBS zVRg-FpLsTNjMjbt9Rb)&$yn)d-tN_paMxFl3e!cw8L_esAkBG>DnHm5KL`!$|>$sH?$#{OadGUJqY1KmNS+KIv*Or;J(-GoOu{ z0B6A~&l#inB$K+i4|eO+RalyNU6J>aJKQ!@?4PeMU4Q$nMfuInmO*{f9kc5np;(K5 z&TT&H`stUu_HIO(4&%Ys9eoJX96WHBnqU4_M*HD1l&x)RFD%(8ZZcdum`&yi|8kAO zxfpH}z3a5+xbd$xcE3OE*-mT^P<^BVMK4TgqxXCvM_53! zL?xfNmYQ)6E>D@8LW5R!X_Nh-?u$pY~QKl~xHv&01Ieu#ESsZv2xQ8Bs!{lGNiRo$muD+;7i7QQ zrMyM|`s5<)m=w>k3E7B&irX>^*GaN zSB}y)%SorVa^vqb01e3pV9KO>*}#dJc>A*?&Ny|L3w%BGBRcBjDMU(i{Y!Oe>mA|+@xcuzn>QlVfEc_0cItwkTX(LPr&3Y9lS}6}IBW{xXj_Nl z{yBQvwDYCrc6%fn6_q(WH`vvDBdkVjjh;e=Cn|2{!?g&~w4|YwEbm5W;W65OroG#K zLy6AlK@s!PQ!jht?B##L0e!i6mfQ>1-}MwE5d zYXbxEV;i0sEO&LLwzZyHYlJ-{yg(9Hi)&FsCfw&i$)VhgAO{VSxj_?7Z{k(ZWfEH% z!z!iAK|#xM9b0?6Ighg}Cb@Kum2Z%pNWNeY4&_$Tv=}l;J!pO80U`jZ`2TsQH2aw& z!QC(Sjp31>e09YVzj%92Olie2867Ijsw6IVum6P3Fduk4-~AD4%(Ic3!l zgt#9H`409Kq^WEDx@!5pJ~{XKg;P3y1|M)L&9bRFrxDQF>BVV2u-#ZMoVz~mdm%(5*LLtXKNpiZvE4f=U#h-LV#5S^JkI<}c?hZ$Zoo}HlXJ`4UQPNZlbwq3ov*A@N78hsWNpw@fH z*V?dsdVg+4V7M4iqNSsfroRqzUV3W1Wf&WQ5QH2@8l6Ve&ir0C{PMuHQXRNG^43jg z$f5CY_NyQ6ht*Q*<6m3xC*Qf%>y+!Mq0cGr*h;9NuX@2D;J-AXg0z2X>~BTOeOL2x zlfk^t-NkfV(8 zG%&X{dM!ct@7O6{3I$Q=RO z#-=!kf34nO*7IGw90U}rMPP_aWEePw%W)Vc%$n7W7h|?kan+m}8_%AyoeD+Ft&cd1 zaf{ZSk+Jy~q)j}~M4Jy%qj(Q@wO8{3|0Z6)ENXOL?~Exx`d4p8SSlJ@?Q zA04YBWFGD}Ea%~!bV`$}>1ux&G$m|hJbj)2?*8`T5JL^d`6))2!+7na>O=IB5Z>5+ z97Br{U>8T<om?l5CL!0&>1OT1GqZxg~csBeGgG)-($%)x6uB4K!mtb?L*|UJc*c z^*SGm8?|2*XnaQys$QPrHL5y*Z5wj}?$aWlp{zNT^=i8%2w|kr*_zVhZ@M4+#R2v- zJ>0<3x(teTH>Ei|(0TW-sS*L%M~u}gE|?W5TEUbS&Fn<5&Im`hTWV}SpicSW)3Z7# zI~Qjs{-Yq6u3Jf$szb1 zTXU(ezp_R^+cxkWPz@otE_uXbEPkkU`NkeNf7o7jF%GiqQ}fjV^2vu06#m@Hr%Isn zXJppM!3zUc{tj(u1~*0?c2;P=?1@oq>dkF_nei_^0*mW2yNip2kgD-7iznY+wX)JM z?dOuaShju%>QqBeam3s(G#Pf?HmvJ}rEiIjGu`ub$R#THEM>yS=6kaUp&^JbL`xMU zegHqNGU=(LnRFD@1VFy>x{|)i=)rV;+d~z}u}fF)`FrY1u+WTUhzAS~S|tc*ZN>BB zr+j7v=BaUd>D#>`1p=_^rVvMMGtx5iCTgEo?Avk*nxjf}+dRt`G zFAxIV!q{)jyhBtlq-U1^8O_x7k(SY9XoJH&GB{GoO$ma6EYRPCYdLRz;%-NBeYs34q}yTvq;^GP24uoHk;LMd_6&(lvvQ1Fx2qB$glL64GR zdvEB?p!=O77z9|@Din=1fJKH^5gXX}gLI5CXUytgfG=GSQF-`Ay1cOS3#{Ka1jGdI2*Oq7#= zo+AMC5)Cmi;c${$=#P&*Wu88S9IX+Y^Yx~OQTtdgl4)l@FL;|PUqJ4CaUPtlJ^|M_c|QBs|3F0x&EtkiSY{b{tdDR9AUC%{J?aF_B%GIYyrPod`c^`{SR5M zD4Ilp_0MJdtCz`*W8n2aiAV{3_x&1o1e3%O5ji6Dm*XIN$H-`|*exZ5&AutO7e2k< z?6dc$-%|M8x_g@D@bC(NsFXDM{Bo@YF^i=RYq5g0+ZyC0&Nr_yd=7lNyLT?2_qS?$ zv{l_q5FLPyfQ8Pj19kMnTSt=(eO+{#Of3&aDB8OjezDab8UqQwq>{Vn-uXZ$qh32B z=HI#ZVw(QHJEyY)*X zfP0P*g8oEm+rG@PPPcTEF?6p9d>&$eTG}df)RzO+hXB1ll?TDkh9CRISvSFQ=K%Ft zKJ)V7kCS{pMeoc1JxT#>v+Ul18TyH%t-~u^EcB)Neg<^NZ=Uq}Wi>bZ#SK11xeQz)0>~*!P}Z zA|AglWvaR1HTMC0Tg;^Y7dI%I@X(%jme6|Y{=)uV{p5V>H#gY9K*g>bw5B0;aSqp| z6fUygxBl4%w`5D$U9NCPKUni^!j5NW#O@-OCm7fx3Gaqe_f?)MY+rmOL*VKzQT)Ro zbSMbmPGU>00}N=d#`{r=w628)pH4IZC)DX5mzulj&sqaRKX03X*j-Ny3vKgZcAtQ~ zjjlchU}&M2=i4O`h99V*-I1o8;(PNdL(gkVCP$Gp<=9XT9QfSGO2$^?ghj-N744#) z0I(pZOV9ptgaj_?*Yfv5_Ly}nR2;5sq?op9d(1BCd7k6jS$nW^+zwIPXIp(J{2FlO zOHkRlyMgLW)||5c>=N$?-H%>}<|M+RP#8_;A$N__nMUb?* zcl1lx)J78u#%w+RyzRr?aJO}MRcchjuJDxdA17Z+n!|v3uJF4LvkKo$)3F#9c$?!# zcsD8PB|JB7)gb&bb&Q_1?b^5c!zo1buQ{eCU(H5J( zr>bc;+je)J^GY259*1S#g5o*S6YHU?o?PUCVYg&4}KY%x>lg! zvp@=EmyYTmh2xQLv=5SVOEPX&?$QUa`|6GurnGB*8#`0Hq4VItvpbINIzcOZ`^%f) zeqYF&#oIgWbO5#kVrY7cvq_&$baeg7*w!M0(<}W>Bxl8V59~d2t;mHfCSO?(yMgM? zT!)bF_7KtQ>_>4bQp1gxxZr!V_yl5}0?FHRALErZqjlFFZYiq2-;-}*f4Z4feoT2Y zW9Wa59u4+Y+yn2+k>eDJQF58Y@rLgP|J2ocLn_~1WpDE+Z}L=VKl01XOIhB$DC?^c z#ju0XcDPro1-)`-d2q~-g`neIG5lw7bn!{`l)FZF4z*d2feN^Si;{nA%rm+G?i5Tg!5LmNT z>Pwk>cq%}1Xn#XeiH=R9){d&{vr#Rsf}C_ahi*vDEO#D+=gM2;4J?26J4MyyVp8Ki zx#SZBK%LzVmgS-aQt+v= zz1xoW15r$;i{?>hYq{>^9~B*w>JPHL_r1U{1;2&X?`8Me>h%ffJQG9AjZXIQJCB$_ zW2~YOuJa<_2{(?nkG*Q-?mhU)tpcm{DKARk(#Tr;r|jer^FRAAPPhSIe(2NUYM~({ z5RTbm^|Jx_e5u)IcYApH+}LND$SKJ6sdBf>xu@KafF>nAoecBV;cmu8?EQ6>lDD1O z&vh(J7(RlI7?16@|JfeodkG5tTH42NYs*D0859<-Gfnw$fKI9zrSl&KCevKl?CufY z%r-h;ilL9uMaNuGFdk#)Kgi8HP}Q6)!|i!wzrU*VSpVHaz8$Ibjv`)YL;tZCblI15 z@H+7m0Ja|nN?zi6?d18^G;jUOr_qUpA@3U!9VcaR-2qnGPWEG+DNA?54eX}jY^KK_GJ>)(YvKV) zT5CM%!}abqA#ug{#th5DO)3M$C+~BmuaT1f5dqP0_HAENeeR;s*I7Z;82uofQXWII zwJ3P9(9oF_`*Y>F*XsUZQRHF093axpU&npQ-kC`4l zSqZNp&bON3YNom`bh6tGMV`OQ`A;`D$Rl03R-Z*Uu{!xZu5`&bd;ShLSO zrXRbjxt6QJcUi}^`nT9Y#`WJN2yUzQla)I17W=GuQMqRf0Xutmme;Ipv*s>&ITj{p z`k_Q9J=^j-Jk{HNr)7TicoVG6uY~DYO0=28KQosx6}ao z$mLVrpv+r1`hJaj9it7p5z2;3^nStkutJuV{W-OYT3B13Z4hVhH5rlOn)KXmxTvrW z{_{pQuKF|e16S-3Ht^z6rxD$tN_ z9c0b9GXx>Y=69wCp{?KHUh6tjwI-9UHKtF6jYN1oukY@(meX&Bvr!d?lM%Iev8zTz zeZ3|c{b@-Cl*QTwTuQ#YuHZf0AtGZir4trki((85F)y>po9KxPuHZIBU)6y}=Kj;= zeT1$TLhXO9!2uI1xa`2oul#?);evkUWtEk+Q$mKvfy`raT@}6m01!M7lII3{0=*Yk zaKVWFJ7}ucaR@i)k#by$M&8G*tYNfY+}y0n3;u@+5t+Zu3Dm^r5;S*F<-UqQ$YrHH znK2Y(ZC4te8{A(~cKOhO@He}>N*aD&U%w_z$#l21?0!Iu4p033+gS(S&R)+;Np+~H zKyM2?4JA2oCRX#>vT*;c>07LY)VR$3FRi*Pa9;G-Ii%#a{!*7m2Xh}%DeadBmppb+ zG=Mbz>BOOp5Ub`=mMzN?MNmx)|lL>P4Ad)2M>a8M61kq>h*5#ZS0V zdb3wMJjezgNK%@I&!+R^uW>{EY!jpbt#>b*o;!K8ns4n}?D4?;UH@u)Hj2wIBn?H{ z_E^-fv9B!4IxW)6aLg6CsqeY%rHcw@Y}L%2^0x`HA9?MS?xZ zrU)K_us4Dz=`=pQ$x7Q|#+|)gZ~3fRpej~kI#Ch=kp+ZKh45QWnSWvwXK!;rTDeo% z4Xp%Q(8NvS3c(~Lyf#F7rQ@g1@3y=mZH`by^zlFs?C^{}I;>Pww@zW?9Bp87EFg|N zplbxsHR3L5r{nd>Vpyi7nelMHuLAHVRk_W!(!f-e_u|R=9)LrR(oyDGjYX#o&AJBw z38X)XR)s&--0Cm=nbLe?pDy8GO^+lGhc;L3dj;dM`1%7H62&85Mww~Y?SJmY9VU_~ z)`ufDF-~if+$8Bt#4e{isc|tZBvn1WfdB%Xh{&3?6C^cIp+2j$Hyb)FPNtG9gw!T;icHX9pJ)de6#oXpbp^7!d@IzBV`QNvk$se%JKmqKCLt3rWsP3=je;X$n z#tyaNNR=bf$R)*2cRR)o-W~A^(G~Z4EH*dJN0HW3a~<-xZ}0_8>>3HNj0>ta9pN@4G|FkvK*E|B5#z1Q`yTH$~12#trt{RlSytEznsF#kr25u ztwy1LPxqoVE`?M^CC4A%r*GlF-s@{Gq}LT`smmzOKhg)HNUM&=F6$v_O-7Rc2E((= zS}Rg~CdV=KM5YU`B}KrjtSM0)O0kre8>?k50&^6Z`~Yx{R}|%49lD~%Q&y2IgU{S~ zYT7?uj_z+UA5D@w4x1teggGFZbj7%AtXrK0h_e8Qi{yyLabjgi9wCa6>yG1y!v;%J zm_ir1aLxausf2LDz8drGKtp0As`f7M|tv7c%0V`SJQioBM}aSD<$X)-Ls9Me>KpH?fEdR zN|x0@B;t&8?8FhNi#p=*ky|N_6iPk!0;jVEqA2|~vXrMkbjVZQ>MrO=_sb~#F%Ttt zQv;LbB~l_H>k0xAM0p;W{9|~oN2T0fOA4+l^CrAtpqPK~bTP*=2PNPu5Y@Na$P>1E zqG`i^mYdG}6=Nbt>{f~nW%?*TKvw^A*2rM}1x^#nFy=1iS|@X2DOy#9-_!6UyE!R0 zy_vjrG0Eu2Jo_^&pBY3klV=1Bhc}3S=4;a}3T+GB7Z*77ul(WZ3h34~xyBrdj8!vR zrrn``?WoQO?ZQW%5U}HU?fhI|TjEInk*X0tUK;cK72_5|>-I4D%LYdDr72e5I_xyqi6;8G)LzOmNE>Tan1?h;n= zP53+|umojG?y39=&_lk%sw5q766Q%@QSY8~zS!-MJ48`aSWdd?$!+ zHzg%Io<`1JFE4y2Yc}&RAN3<>H0deB4fawKMO+3N`{;WS6%mSOcX6egu67fL!Dp{iBNf5Y=}J9k9V0fbLK-2BmOIGG!wdUO zzVRD1^1=Bz1PgbYY4n$(AH2*?WgE4JL%4wG4r{F6oU$NgB{j|Lj1pt0WQA>ZZa7Rx z0P{;A@}NS>ASG>b)Aw>Oc6fSM#aWocpn~&JR@biTFRDmDfy(jtUcBSrZ)YKFa9((G zbZx!!sp6qJMqC|K$;vgnF?fQ<#GzGB`txIKfi^NjXft!Y*cGrVI{VmJ=Lj91Q2MY8 z$<73Y)U*Jq25*($5pWW6s_@{xF{9~OW;!aTCy|B3)2~{11Zd1i#<={$H5-DX2ZVmh z5c}i~f_4ZTe;sFhBKM}KEL&K28AQ#H_tBGw#766&z3A*q*=Ll}9tb9yz~#56&aKZK zgwSglqM?>WYvk>M45PaT2UwVQAlspMpOLBqZe` zy4$aGv=cl-%Jg2aNn*Kg;+**jy6j~O3}Lqy6~OhtI&!A?gvB;89<4Yh;6N^ltvkvI zfj%4?E)umUL%|#~y4xU=Ho3GF5p>~pg6231LW^a{xRzR4MsF$e&mD$ zXg4GGbBFFi?iiKT z&FEnnR@bnIPv&jCg6)#Z^nfzn5$xUi`)0_A^!M2^cZSU>>)P3+}$i=Krr9{2GuAao`2LJ&#x&r;FK>sQ>n4~kn`KOlAelA1zShwenicE(lo{unWj_}5_Nsa~BcZ7U@;c4K_yFkiQ+&!NY=PDXx(a#)Qrr6#;wOck8rO?$Y^`st8!wC<1s?tww6nVQyg zn?%V8*^SxFo;;IN{q@!7b(%j*jYSLSiU1~Rb_umx4|eW zRg+d@ESW>aC?RIJ=!}&zmfTkgKEFSOiOPLA0!(-cOi-)eM^zYE{4A^qcs6xSeFlGj z$qRPVV*~juHLD5&+i#W_lC8WN&f0bec{dzhLd|tMycxpfxcm6Pa&dr-*P*TqdH2cd z6#*I~=3wUdD@{}ZQ?|gQ&Z_k6&ZnvIs6{l(BKn2bgV5Y2>%>B@_&I!Hbe`<7)cEAc zmj7rs&i-@sAm>K)A>3mRQ+1Uu>PEqL) zQ&rr`!pUwt=Wi8N)aB_Yi+5KdeKC^f?=4$+f`}WX&RsNGOL#e6iiO^8aW9452{cO-(CC zW>ziT+6>bg$&bStZ$L57o+7{FZmI=uSi%CQ%QAGKMiU z6;1$rl+h;8Jgs&=@TZ4C>bZKVmqplbG3dDsTQ2-KGNL|0c6uwpm3N1$hmCyE50 z;VUU)@%4j4if%v4#CUi2nrs~Ovw+%)m{E#0EyWclMsn&wPHA|-H~Gy@6CPW?N(}SX Wtvuk0{{%_|8G?ESdcWr58TY_Io8}tpH39+x8eJVtBLV^<9039G z4GJ>g6^hx>RNxPxkCC=ILB%NhI`9vPi`soP0)pyfsxy01;D1Ul9Sa`<0@|*tU&21m z4~_%`m&Ll8YLDPHTY03}B0WE1y#4?C5olCEUoLRY{rYvYk#X)$iX9~h5eW^m&iUb| zSr^>Q&yD>2UtbQNbsZ`jDk(@SeEVi??K|pkkhcTjrQnGIsZ;QR{5K4+NO$RY1cn&Ztm1GlOj68_s`-F-@YQZ~w?ex`F+dW@YvAC8sS zXXvw3&Z!z}H>NjpO?Pv@~|JgA^Q0}oS@WifC`D%+kc+Yku<>nHCdHa--_ zNcOQy$Iq0?eAVIWkvW)##rllOl}ry3v>jm+s&<+;W1?AXpk#DD!;;#HNdYT40vCC1 z6;1LsOQ+MJ^$q>J3EgA6p%*TRICdCPva^2n8QaBS`z6!7R9J#|8 z_3K|jd3?!=&!ND#i#Oa~MM{sZ^}lbxs$3o$UdPn|o7@Ed%r13Iu>o;GRl|#g59fRg zvtNAG?LzsCLNd)A;u;GyXyqKws3U^+C$#DAiGF@$9&)_gbxpV&bjk2$`1UvbhuwQB zZiR_5kB7@Wo7dm>Oe**+XPEiPP0o6@D_!$#n}@HxjqSWui2S-9>?dM;|BeYh{y(#3 zO%%+{v5$egJJP=g>qks6;Z)9cH7XMhuM^QoEt=T|`<`){GH$5Lho^=F0!h&-;mz?!byi-Kwo=10gFpF7ak3KA3>jAIvzFizC?e@9EQkHPFt;`_JEs z<6%?&_2Qe>V*BY%ORQ)6dHwWH0$RD>DOLDhw%E$H6CwA{KTIFC^3@%SNp0DNp8IA8 zAIx-lH2g9R;-$mpeSIy3f7YibHyp)i0A>r8`u;$p$6W=BnmW2iHs3y`m&~8*UgO~Q zpMAOR3*wVh+Yd2;2`+hyq3LfF@!gC)!sku9om6fKhXo-gg4do7dTva%`bdft9IvWe zLfTg&>6CBP%Mf%c5WT)UmFcA5d!cw&hmk_@?|0*#l4b{No)L;&n=AOm9POQLtFsL@ zNXV&J)QS9N`M34UA+Z+sIj+H%|2Y%sbz^K^xdc&OYI5Bx-4$FHor+a!i;5q;3kQBQ zx`M*{ab8VMmd#5+k@{(ehx+Zn4&VdfqNEQ;EK6xAcPUr6Up3*mc>HAP%;Y)5- z>5oaVd3NCn-{2JTjn>PgELI>|rTy{Ulg-M$)i(NWkh>S*Cg2kC&sAoQf0)^RnJ)d` zBM!dX8hUwt_;4!~f(gWZ>1sROnf>V9$FkGiDaxmmW%XRQp<5xMkz)tA09NHj8XG_t zqZ;WP8=FK6KY@0Y9J}e45dPiAr?_^mS}eQgwab!_Jb6F5Wli_o%WAqHvzA07&YcGPE6<2nnQ-Yo^%+xQxo7eo*l29Vs8>mb)qvg(@2F6tG&LlMWQ*(asL$)GuE1ya z)?`cNKS~rnHM{wMvk|>W_IRGFLj>BH$!ElI1@Aw+KAygFltKDBZY$Tbt!erX0cf|6 z-ABLi?9WiwVk{TuPV3$%JmJ0@aHyTn&X_ITC)Ry8R!j0y zsa`;jnd$EAc0RVU#UE!8Iu;vrT2LayQkfyQJF^{&br+etN%=8#sxS^ z2de*!Fz(99-O}FW4LhE=8Rhx&$Rbp#|7_l;hsmt&CT0=vOca1igEd~9Y}Rgv5z``O zi}YjNWh=c)vK!_@TBg-qMwL&ujzV^f4NZf`ln%EVYiSys9SiQa?sXZoj#d|W}ulqskz`ri)g6$s|eIHujlDoqpsPTSqmDZ}I) z#d78=OX-z*vmX^rE3eIYrF*U$zi6#rdzaArhwA9_yYE-!-%LHMw45;v`L{d}Ie-&GUDd%smMZ!xpth&lSPmt4(SPc5}pxK&kKedyq)lBH7kQ6=xX(LQ4+h0Q7?~QIwHCm!ao${|taor*OXBTk47KNJ`ck@CZwMPV zY2Te8_>vH(*@Y!{aAV4+?s%Pl5$SfEvH+$@VW?(Ej4g&M}h8$RM_ zqrY7xy7Qu|r_6ETTg%jR^6k$)1&2K>wu;KDM|;^k*$=h;`}kO8OBoHae53+z zCbgUeo?RgCh0*mACv2M-;2FH90SBxQ^6JI+huVpq4YXGY7}lk9(D}nmfm5ahc5gL5 zQ0&^dYe}9==2%gp?cLy`#n`358JQe-1f;F&@kwhb{?|eF*h4W*3AIey|K}5}_u7Cw zFJ^B{rG1FBIA4QK>300YQnE@Lyx8R`?mb+{2hL)T@Ta%kPDyerh=LLPxCUKxqRh`* z&R<)IPu01-fmALAFxpD9Ss>_}1SR~79c!Dnu@OIn`m>F-F}Yq`|I2$%SQAJn)RTAG*Sb+-MX<7u~Y2gj~C-GWuM^zwCeYx^i)SUMK4%vB0t_;giAB?JTxI)o_{JMXS)$ z?S`wx1^@lA2viQ#z`ZZy%{KPtFE1M4-wUpi_Mn3qm!8@RMW7m(!Ml%hxuCr7uD6|S zdxmb_7TZKln8IorjsSm^puOz_d}ifhY2q4N{ak|#M*}PDo4kcOV5X12ID`}&UZN5`pr1?)b50P*Z}Ktn+2WS zO>(RJA`^6m@54*(G1^)m*en5M5=AKB-CLZpEb%}o6~kz#SZzFSf)26r{bABm`#k89 zPV6Kd?!v8ddA9d(e-4OCi+TPS!HaJYP1=ag20E3qs!2-qBJTZ*y@Jc@mA~y5zWklE zv?jvlqsgyt_v@ zV1u(Z+(+|_8!JH#tPDQ=wCvM60-M0?&s~$2o*cFcxYj+as^MY5Ds;lCOM-{lSW;@e zC@n^tGoT1Q$#vi#FZiA!^yFIsRwif8%qGC;=o}Y1ud7<#h>c$a%tJKaH+qalVXJB} z%}`m;212mp4wMH;gt|<)_RA1$kmRg;ty6T33lLOy7#s=S<+t59dV61PIbHH7?5bqD zD3}5sK2Bl@DV@pMMogzD!4A}Lz?1KF{OMYU%k&pg)Li66fNd$r@P3T1O3ZYks?00yJ-tP%;-2+;DHL7}|*CAMH0 zpaSjn&RF_bl7FpsRNf5^Sl*IPo7;Tw;dUJj5e9foSlRikRte=|UFE%Rp|HK2WlQ_b zP$jr=Z&V@S)BY-OkH#``Ezct1G!^Q?WlyfS3TK5SO~9<))ULwkkjp@;}MV8 zu%|$ElJS$Ku@K|@|7oGM^_x1e#kb{uA#_QGfb{{Apaa5?8`>M_^$6ls`y-c$AoU7vjk+sOxN zV?6v!PGKR8xHB7;1Ys13OjG8;K&)ap{LF7tYfwvSmdK1L?!ACYL{g@-js3Lp8DUCv zx+W0(!^CVGK7ZBl5YUi6%KlwDrX1LJ8pHbZL)CWutRDs0J7b%&!BURr{XFg{j3xp#>szQVVFLXwRv;3f7vnsk{G0pR_Ng+t4?j)zRSN@pp+qHG_dwun zj=GoSUuz^&ZxB=Y(@!ls%@ePdG}pB0e30iG&wAqt@(32*=RS*9voh&|7$_hA<`^^1 zjjrk>w4ATDc6S{FN&?f@O~oqOVEZVs`iwT-HEbXyMy@^Nj#zXQv3ikSoqKf;^JgjC zRevM)e4l1^h<%K73hK*nZQVuZ0r%~}g+?PT=>j7}iCY-II> zr%$|SMaHl4(j_4~;VL{T_IfXZPE7I1Tfk7hz$Xj-PT98eec*nZzNgEX6x?>aviV&W z$rthJk@UEcC%0^g-O9n8MOk4&f%H+UFaFy~H&!G-!4nm0j&frc-~ zl$wV({;)desRV_@AmCv<*>|^y8438p2ubIBZ}^ng8Y+qs-zB(5{Nh`TZSh~H{J z)dxdEy+(t3DjYE|Nx`*LBF| zu|`x;S{gMaS?Zo)m1-EmeyL^q%%c_G%P|UB%wQxB;%CCulf=^RVe_^Fpe%lhPy-TP z3!+}-)fnn#722O9jQXJHU|J&1q@F`a@FoXgQWUOhtr%@Dd_)bqE@?u#gi!u{?rWK& zYIpes|96jv2K6<-jLhdYN7wKtA$(F52IyhQkDC1i&pW<->wc4v{`BiTaV>hS1+|m` z{IsH#=a;|o%0o@=OzDRtsB#u+!D%o_J~~9Q#DkWNA`0l*jRC0zsC*j!H;Hvt{|}*y zyM*@H@trCbwr7p@2cf+{zZJ47fO~5@R8zvvs6OR>M-6+`tkJqwf1Bn*RUZYVvc~(2 z)nPWNF#ddFH1V*@g?1G(tcyAI3{A@;pEK+13AwCSsRN!1e@G_5O#4ocsIc}lkvsS7 z^3gGM&X)Yyj(>Z??EZqlNW(Ztj-pu#gxiYU<~kp1?A@sr=hvq>dA$(Lq!l64OQ3ul zFI<68I|JhJFQ*`$)EV*m*s+&Dk&RV!5wTBz=iRs-OaU1DljXwA2>2lr84?E+hI$SL zt+kI4BhE-~P73`InPQ*JCN*qqbzELuOeSycmMyHMmBlji9>J>zU6*zVlbU>O{sS?k8R!pmpLa$02i^AR z)>Jsi@}@-*A2f+eO!u@<>PdyjK^MUu$ZC76(yF3Gy;BDgibZgY=1>lw(g$*85()r~ zU#ta!_|;)fm=t0%AaC0{B5p$hDo3FVucYK=#F-5J<&2V>5OQE7Pm!ihH>;9gu!rR0 zs$VuW_gRtlrVjMi6p{->;LB@+218zV^*nt1OD@NgI!n%6vxo(^^5N*-3hB~){?|1W zQXquaMwa)BbU*G#0i%AyZ}?KZOrZfpsuy1=m}fYP?p2}0kp*KPs!7KDU#GnW3b=QS z)vNq(ybzhow-|9qYg+?!lf*;h+vP?$2YGUe?&8_kf*_X8@FjG$7w4c9&Z(Gsi%$(? z_kog(LTcS*wjJV}&2!D6h6S1-^>+QO;X0S80azoFff0uy*W|rd1GY+v4jVbiKjcAt zZ9@|l-DH7!dWPCfXt8{{j)T&SzDjJWlPobcw~s!uDInC+FPb;>>Ye7#jp1`drsdQu zz2k{r!|jCa8ukdUrhMfn%z$f?yu{P)E7i|NG1w_s3|11W)s2w0WJord=v(F{hF zRup!aGL|pad9Y2ciI39FYV;S$j4ovNV^_Ju_-2-P_=ZCk&x}EGNWLv8Ka9leml2uS z>y+WSvHf&D)B`=iii-jTLU59yu+|0J50`&=gk3Ep}U#njyjgf7=) zNJF=yRoa+y?|;3K6~w(B2`aq>&j~Q|>%(3_U#KlFTVIu~p~b%8RtSabMo9;0v8P zC@aqYU?#y|IaX%zw0dS(wnA{xDkIK6@>tLANl4Q1wlwaD(KP<+!Yy*)`}+!QiTEhn zPO?2z6AT^Z%D51ilT|;MD9-Ek=~`piE-cE9y#V3KUw!XmW~et13N|$r6tCx?xu+40$Z%gozvAbZnq2ayUj&VjQzzO81bQ~azDVv&7-Gu+8zeavd*3r9b4@sTK;bGk}B7Vm_5 z70$Ep8%ojpF^6A*u=kAM-^{3Ri%L>U12I4K;G-+A(ZgDrZUck<)GM@t_bIH zo-ggKBURcGNEs;R%E>iJ$?4Nh&Kya zQ?3+x|B&$1$XCpG+z?YqbgElm^dp?>iOD;K58!faURtlF+V{^I!uX_D*vs#Ms|%Ou zUv~3R=7$nh^f`{f?p5@ze`dbx@Rdt)nzGRVMr3&sjN?PucxmpvKr12lQ_lH~ zel$V&7F)qh%NQ^1TUi+*MG~$-#|(FSYwqcH1J6H%6PR1oEVDYklAzr$`%#wmQ3j6! zrW$rJOFUIPg`SWQ)g$A<1@ZB2o`o||gtJ!w-Ov|B{;v23eJS1;%eceq)TBgxY$Te5 z5N0Au>T=QuPQc5FQ(vcrn#pLa%+;`QjuP*Qadds*!L0W+(|&4rEB*z4b61QJHzZQ4 zAGGy0i02LlnRVSX5U>>9SSguahSidCdJv=Lal)v#dwPpxuSIjQeoQ;mb0PHm+mpNF z>XQ`;UhE$i-qL})?)rBt6xBx@qegv52(Z`bWA00wYC30M*xNoKi8{!>%e}xuATZGJ zlp*J7Zo)7hNsVnLE)L!&kfQawHDJES*K*p7C`HKpm%9FvAxL{mxY7hIXJMBXBW9R1_#;z*fzotR| zx&b0KT>V9c44dkwZUydoh?O7;ys>tqILhX28to(ib>&3KMtqBWv+{+SyQ^CvDK;D> zQ`6z}n>sRM8Lr{t)#^B8^i#>1jxl^oRvjZQYwzWKL(ZPUF%f7`?yQYdvwsl%#p`Do z=g%&ZmOAB~sqfA>f+Wmr>Cc=krOtU%^8u_q)W*G^lk)x3vY31?=&@)Gy0Nx{CTQgs zn+&x@4&3Fe2DK(FzAtFDw3nyY*UxPSc4KGk8}wd534caFMKMEdUIsq?)7&jl68psv z3Oyt%S*RVtzy8-OHqX0vdgRy6H#>}EueTyQIU$XDg?_6sRgQX9+G)}YQY!C%3ejN~65&X_#5ck5F70|IS zpcbUf!r$jpa7%U-*~|+60MxM-i&8)7aY(^4%EaTREb3CSXVq2rZ4TAcY0Eri)zGk~ z9%XiSA`bB!g8QVG!i=aRp-}4-`<%_WqrIwYUDvvR`5>c5q_q$Fnn?>bZ(-zwq2Nh~ zpmlL4SBjM@DZ2UCzOBIHv(R6=XLw~y!Pio893fw!;C-@x0_JbEFNw2;7ZD`m6Q{j6znLLkp77BW!9|%WLoQz8lYkgm zQq`WWf84SRuL^XoEvxE?Ja=Bs3NCSE2_4G5Sv}x3`FyHTqCze!{i2E{NO(YdlwKZT zm#RrnpVu*EdPdF?Y0{dD@A&xg*2jgvb$EGTR^iA)pDZ}X5XY*Dk|*Ot=MI$<-kT3f z9xGx)SzW9~GsWbyDkaDHYZ4MGcsS)a^h3y~;9Er3=p3@$ZS@rTsG&EI6gO4b6^Jvp zWQTr%-S|ZqU*S4GtZEXIg*iz)yNrQj_n^vD?2j`>s@lQ!7+B@f8UbI#kpq_;?a+5g zH6<|J;3Lpu#|8=R+sJy#XLM;<1R|ne78N8&_?v@Q@|3F*vMj!q=LW2rg9I+rZ;>c> ziuq^Jc2uWW|E84`S+utb;_p64#_?O)jnT)E*r8OCW>JPb!gyl7A?=lV{nj+OeGqpleX;GiKcmj8w|`g;dCtnV44FutK&{v! zFCy;HttOn4k5+$j$jBI}W3YFsD$QiXDVNQ0;FA{iVL7REJ}XXM>^7}|x#I>iNbxjc z)E$R!PqbV4#6SkOH(crG_gVb1!*T;Cw-hQ(GTI5w2T#j`Quqx4XpbS>*giiQ|&3RyYD}$*{pdmj}0Y&(yNt2Fo@>*K$DyZTKiY zqV~XHiJ+y&?>X;;1~%a^K*5Dt1aDxJco@*44$H`>c7#!cKH$exZz4HPW(2Yui>p*J zfq9xAbHRXB)tiDC6#+zNiCrZA{>A0w*Eh2(rQ(*3C~q4%nXQUXWJ_j^_-OG7^(Tx$ zUeaMT3P0!c2vMS^o(*qydMIUw%52Bxhsp`z#@cDxSbk{B@Y3G~hj z3g?yv=zMIrLjYBm=L3c=P03bxNxP^9u16uqmtUG?#eQ0pQFY${l#!{n@aC9S>MJJ4 zn0OTLC4#U)3M31LqjS81I1l;~XbS>Xr?=n9DO+l{GS;QizfX8@I7{w#H|}iKl5iv%N+0ar%%{^dScdkNQNSg zxStdo@|KGp|Gky33Yxhe@dKqcX00Dr-RpJglfj5PD_CHC_~^%ng5T_W*+@u^RgIb; zR0c)%fCvHYlX>;|H@GpEW;LOYqHaG4?7R3g9R)v>DYM2KywQ;P(JQu#N@y#UP$Rej zIrF5Dh~1VH1@^88t5nQ^w=vyI679@P?I+w~7&AV7)d~L{?6_a`mZD^?XPwg>T!2n` z52RK{B<}w4)@-IsQBuheu3=H(T(q*?yw4rnz8j>e2GWsaJlJtL(pT#dWh-1BMYz>D z_no{X1-=;Ev|0c7uallN{+WYB^u-^@98if*+T|~jyPFVQsy>f*>nx9He>Q_egZun> z!US9Jca}_!nx3W%*DQ6DWszF(JQYqSw#jvBqi0FG-F(c*G^{y9XPXi9fGW%_TI5 zhWkOL1IU%H+yZ-0(4})!JZCjSU4+exL#%0?5nS@6MIh{pySthsB28C@kAuqGxsPtn zN#T=t>Ych#@RDat8a>qx*FoF}{!IR3uHKm_N^HuWCZDj~yo)gZNBC-lhIA2_O={cm z&w6OYl9e1imV^EtmpLW9Mc0dfI%~4eaF-z7VaP1P9!EXE{5r4WV=i9@x~}x^9nfUk zZz7vt#1NA%+{`aQMjffU| z_DWy7jq(Vmkl@H*abd%zH+{wn+;eLN(oG}Mn9y}die1m3B**)-raYhKlHLq4+|3Nv zx?O_hcx8Jx2TtBie;Of5LZp;$X06h3wyY%ce$7&k?Xk5=SZE1SO4fxe6D}SpxpP{j z*P6EN#2GQ7)h&7+R#}Lv{F*(6C(}`X(4_ngo*nqr|sx>E>}!Kwsg-nFdXsl#_a2sLV7rURI;kh^Ij@KzP{(s za>$8Nzcn!1&5=yf8O)ujIY3+A^@bV89_yqq5MtDx6X}hboSY1&hW|A59dri$M!JPQ zyj_JtJsXSs<-jyxno1FKfB%8u{glxo3H+#>P_3C`We%Ikd>_g{8s~WP{Os9Hj5osZ zeShYACl^%$y@JIedWaJ`hJ~bDDj+u{{;+h|{aG91u!BMs%k$oofe{`VMi8tq0? zQtY%kf=uF%rP`kl3h`BD+o#&x^P8xZSXnz)#MfN7$~c+>xrv2L+?E zFkOiu4WbCbnBC0)thp+={`mmAD#G}g10@w*<>IPt_Hj%4gV$)kK|L3E-en2PW7bHc zR+ud%?-|}C&Od^-wr5z2q~#YUbDkOzF?w*2vyHy}HzR@I5ywHnLLvi5xX1q4^V~_( zDO%uQ;{FO}4a;uX3hP|oe-H0-Ihi$=&J3CX3vW418RWoMFSpV@-`+D=COYVwI;;KK zG5z*91Y%C@hfkX3FB~MSeWCWAg}&3SJHXEIm@8&hj6@1=Ah4uL&;J7GN=7kV?#(VgAzR%xp?BXoUug~8< zV{eJ`IRu4q?^LxrZcyGD_9HwGZ{)SqsVUM2bC=SKUa*ob)NXN|M%*9G&?)A|(2uSV zLszF&iPTVX4Z-{Bd3#Zx(6&5&Bb;gG+)ow*A&i0tDkN1-X7s*@p!#SX(c0QiBm(b< z-lD6s-=O^$G=lP)1hy4=Iat;MK$@;Ac}02?D$~AE|FRSHxa+Fa)Oa7R#h6S3c&D z21`?5*?|r8iQ-Ok6QsCX1taNqb_+Y)b(=hTOvGM#b8tU9&Oa&HyZ0&4!K)u3WdVmH zvjPiH3QTYYy2AnJD|I~Z5ukndfIrEzwYNtx(}aW(*JOIY_}vN_Q|%N8rsS6#JD0ja zB-(J_4f6nEs?xVGASuzUFd=JUQ9o3@VC4nY4>HVyjfOMcWOep>X>PMe2(+OnvbfRW z8iaQ<%T>#qo-ce6VOteL-0Qmdzf_B?kb63Og`R(KOXIpJY6YIn>bv@;rZ+CLa%u*C^zgd1uY$$s{WAy z?I;XV7^XjGVZ}m8Y{GE7PDEHe{$SIz)-&wGu zPhFpLwyA5j^uaHBDjQ6*J2~#OXf%HSWy9X z0)hLzOslRpZQZkupE!viJ-3Jrrjrfbp9?YT48s?naLbHblq4c%b#Cvn zC=3S;1=GPIz10E|E~yh2CMtsaA8LEmq^f@wKSFP|D^XE_P8a}q@XDTi1cn^95K*p2Psq?8*ShsBRcpp{$VBUFKQ z%0CqsS}l!+yQ)k4-wvszxE{FJeG}+zLEG{1h3#p5pg&(VAmJF`KBOVGu7Bjp{o=z% zzS)j$L+N$I{EL>h0CLAFnhP_(Wl5sQOG}wz4zC#Kn3TDPU5CS?Z-lOO^3HU9+Vhro z**^R#&P3@$?uu^1s0k)M@`TY((J5o>zYCm~S;OYu@5m3ojH)ahMl{e95gN$SFMXV!s9Za+w&^X^bb zVSQE$?y{*KyfM3mX-gQEm_e?v23eL7gX=_UOP*(Q}v8dB78mdM^VSmR4m(6e9 z=-3Uvb_o-aa+x8EU_)!c0?SPqvZYv_tH++po_Zz{$oiKxUGKfsPLbGXcaiQCs5A{C z5ia0?f2@@!*kV!BU_uC*&aO?#hnJA&cFJv1POsL9SFxYLpR{jGs5>!+X>*H*JMIrrk2-aML@==MC*ky}dGNw8K=@H5O`WoeF9)yTE!gEgv$q_^!iuVyjgo{MM; zbX?T9V8T`l@m+2K3{A}q@c7&X{WQGKlLZQ6Kl@7w9;m@_`}A)ZnRMt$XmcYMwH8*9 z{7E3~qz|9??hZ;>bB^+n)d;oRkx<*pjC&d}=hqwl3Gv&`wcenh*vp_1bHg`Z&dXpj zc|FKswEE=st&^PKWo)k%Z;wV;L}Brz<(CEysGmE5dYs3%Sd?}uLmLKCx^i>emPEy| zW`>h@Qh-2{Gb-@s)VouV=JE=~(uA!W0n&9ZIVeWo_eZ>pn%~Z2!JuT@@ITzW^s~O) z>#32NJmGYNjN#0LxBAqN8H)3q(2N7MbEQ;hsPM4w=criNO?=ph0FU;r#wUe&t>+c) zTD)eT3AYp;7m4%W#kxJOGp6`P6#+zcTk_ViC-MJ%;mTWpF$Pei_MSq*EBb12v$9<* z|L-cG0H88d`uhl9E_{VdLI3pgEzR$wp1Lkx%~KZvX6sh|Uze8cda7i_KRWnwPWCYX zvwx(xIR?OpOg4bp0g#r20Ej8}Vg7$G*$KPv_lJwkn-#+O=O?;-Q$W8RJgRg!w+pZ} zOqDO9@rMAlRR*7Ass{umE{`s*{}n7jF#zmiHr68aih{2~ld(mOsaz^5+ddz-*+nJZ z3gT+$0ys3*`kznBb{pEyKMhU0v-E;z2k-zG)*Wy-7J5+&FFssQC>ssO1LS#3H1p$I zz~Gv#NBEZj2NeLQc^?51ns}EyykGYy3p+5{UmOr95Xt{R%=WySUi(G$eN^8SJrs2K z%fCnX?+k$Bbpi<3L&Z&NfR{+y9aX?xANzB~0R2bZ{apoMIXYk-ZHg~fx?+>OfE{o- zSF>&dh`y@tM)!OJxfTHRPoTNa$enwunoP)50062<$n%T^cJKBUAOy-=`Dtm(s_gi?I z>6Ta(V*GLec<%})GCwO3KKeC(zTkevO& zMj+SAwYOeZQjkBMzpmKxD@JVs0mlG5lf>Szv_I68{|Fc~nz%|p*VFFHSRD1KT+kOt zzbfmeOat0N| zISosu0k9%i$=Hz$FmH$gR5L|zeH!lX{cQ}Z5Gx(~5Ftn zRem{$KTpn++5wCY%6aZ)QbZ^ylXYVPfF>b;Lr8}DU1_N@9Vll50KAcDj0|uM3Q>S+ z;d8Nhrwlb9KH`{1U(7bm0J5v4Gg;fA`se7iZbn1))engy0K=+)x}v}EfKr9+u;-!= zhM6Bc)M)W5zP5tn@Smdx$cFq|ThGT?NH*obZfEU-1&`F)m4ST)^byYxu$zBB-JqQb z$r$T7+~fRac(=@>C+k`HjlPr!Qs0i z)D+3X{a|feXsw)_E2s+2j198{gn0`5G6Io^_&)s$`nzBrwqnnk0e){wPO_iRTDFOGQpbfs1605{Mf^3xSB;LGx!#%MS1P$$ME{^5QLOXdGkD z-1hs5(hOMhY^|pcd1AothBQTq7b9S-z{n4~`h{03a~Q=fjS2%ns%nguI+dbdl8n zidLLyOh&YQ`&P%BX8OV_2x@xT7?4PRB@YwELB0ECFo0C(j(Wi2}wv^Rps7hLR@ zNB|*5TfvIleFl(1Su3&;bnbOhiHqcCL~3vW7-=EA!`V+eh&bm|xS|nY>L3S^ZzRZb ztXAqNhidM=(G+HUDm@B?p;QFjXHV*xNOGCs*vS5;HZRwUCzAhs`Lx0zQHd}3sHF8m z!rA=(Q_=z#{jIuh1`~I^ZK`|#PZ5feRTO|1*@CbXdyf`U>-PL!UA(O%JOu()OK)G8 z;bV`_KjK}MUrbdLd9fe8*mJ>D785ZBegQ-`z?lde(c0XV!W9aB^aiCRDLrm z_gS-GdEHk%{2lJj7T`-_VFnTwyX^Y>RM)4Oa}EH&7|Ke*!R_2PEqSoHU` zm@SIneI11OojjHEuRt4OOJc*Z%O|lqUOF1JKuSb_lzfK=G_HtBNwSsKZWTvhK%LPF z?QJFwb|qqp9fYb$Gz`XMs7+FU*-*j}G}PD03XFsqxmtT0fmtDO%=a-RP3^J;h3LIH zAk6xcqz@khVXtxayeEJ=Y**r7aD|TcjsPYna+(LJaGuNTp3A zoM`vHa=@WhUJ)RQd*l|k-_k|s^4bOFu-sme7bcJ!Pesx7#y2FYUOrf~SCjX7-SLfF zdOuHPYW*62*~Pwp^S0lb4@>!ThxG?26lD0}UC2$=mw^U*e|28)b2u@w^Qi#vbkACe zUaL=yC0e()DTmL#9f1K!==WMp<`zREagz8XI}fwgC8U1qH(7*1y(`e`Q6m4@PF!wTrbf%Q`9!jZaP(yG4lBVxoVSairzi?)!9|eKYD_G)J(Rz=u z0R7O(0mKhd;=3`!gYu;tufDu-y@`QzebUo{a`ws^{AgpLSLLtFkWiyep~rJ$EJ_bW zn%CYH@5SB-XTd?KR(OYs%Lm7&kmms3E7+zYfH_vqd^rR3UIfr=Im%L2P<54x{s&l9 zMNCVYJcUz9dmf z$PFHKnObY8xJYiGSIWL6K+Qx1|EVXUzxVFlwNWOS7@Qg?)#E+gbDEZ}Ao0ir(!kCm zRf$|tUABX$8`N!5*7gyA`l`MjK9&&x>X6X(m`fezzITmc{+?J<(YHn?eaTE3n>~ko z)wlqv)*UkrbDlSzgWb{>-xK@?`G2#+TewXt%6MvSZqbtBQ(Dn5Z=~$(6`9sn2$GVyC{Ev^Dc52_4bvug&{P26L=JN_f(F zTov>am;tAB+7X5mM#__81^cd8);yj>ogdu_IV>cVbn0GE6Ko!%CpHgBQ!L7feDFid zjoMGDl=|tc0K3TS=hext?nboT?0xrFGIX*B9s`3%v;){k+aCKxfF(O1djUzVLZ5Tv zBNXW8=ZsUVntE9|F@os3UX=BhSY^dEluXi_?S%jZk&H_sp?CXu5MxBOvePWLGOFJmqeQ0C_|wL>*GeVU49H?6@9ROJ|xEw7G11rp%zmac<;uq7~5j#vxC%oJN?b$%a~< zoD3%U(h62?U-I=gWm)_Rak%$@)f<)bzZzsA%%_r`{sxZP7>SQ7RM4BYD#o{XxcGd*YdjA33!l7Z8pj@^K5e?k?e_N7k? z)QP~e+0M(GQoyV{k_Z-C#mlQ-TNA^AYnAmSp(a5}|K0gsJbO9N3cy6*Cnz!j0^&_^ ztRN#!(^#(m@vhSC8ft!w9J9=v_J9*>N4Qt}$r zKas~OMGtgV8;@n%*p4%TjMlqHNJF3vLK6C5GpXyD)`NFypvdI9{G5q>wHujXb3Kl~X3JN(_NX7UUEIzSenF1YO~9<&jy zpN9R2LBUtCCr9a9U2e05)zDkDlW6Sp#IfR_GC|j z!W;2wUy|h}qauJXm-(40Up0RL4reN?ackHu0XCn%y=Ek!LKqX+RRJE>9=!W)q2(GQ z&Ze=1GR;qIQ-XOna5!4tU*{dy5%u2ncCBrdGA+Sv_uLRWh4&`U0mU+@cSf`cVAjbC zRu;OhOhGCKVUGj!Y`4_mLG-#1+x)06i|@R*A`EF?>5KqlGP|v;5+H_=Pe0j$h7`2l zW++G}{LF`uBRk2GoZ~prpP?oqi>1{EzmsaQB;lQ@q0qE>kzepAv)B%MQci&7AddyT z<@pV1ROD|K8*1gdH8KH%4gu7j3VCnuLJROn(2ieUPOl2#cib?L-%v8L7!GLzF@H9( z2zqK!Y(YrvT~X=tIO)C0G#*%7=JI|sS#b++SKaObmx0~7=9|{m5}KH*K%>}5pR$N2 z1^w9oVx=eF=g7_}Q>-}#{~Ex~!fGvIz31yWUAKtTmo ze$yPLEi`|!lM!Ky34!ApZ#FM{`DGayecpcXFMjw-K6a0Lx4+|eyP7tF5#EeX$M4Nkhgom z(=S}MqD@A2kd3YCjF?viZ)MI|&?<7)SJJw??yI$ttZWdO>~-^%$%<(g$2(kgSL6OU z`;P54WCV8w0PzghQdR1nk&buT6=u&!fsq28!u2yelnepq7Ld!?>gi4o7hR4YBXisL ze%_t#MJW{5usM-xTjK>-E{K;2n&^ewU^eXago+abh#C=ex%2Owa)s0a?r9w|3P&S6 zT1N4HZnxLflS`grb32j(h7_gm8Ud~~-@gm>XX3q_pI-BgyS3>9HjS(DB{O1L4QwDbHD z&^7d9A9v}kp}o97iMtr98aFp0$Ci_XFAYTUMDJ=TH*^P1-Dq9qWg5_>A(BrKp>YZE z1}T71u3ryt>ni#F^PQ1U5A5&1AWXz9e%2R|YyN+*1UlyE?O0^HPfg~KGL1~*!MRU& znpw7P(nMU&E0jPO_v?N<$K0P3pa9qIu<(!CqJ!E*wtne343A&9Qi(p#X65E@YqJ;} zzCGWifsRC#R-SLm_78;4Pqf6<81hS|bU&r8Rh>-k)G#;j$ql@6)Auw-Uc8Sj+ikM> zP8It`X4I^emtanSnotyvWkD7J=HC1YKlMnbUtvT2wSI}!()s?wdImoEhybbS-WKG8 zW8|W)RT^9$|Kl#pLZW#ih5(DgnRqdZ@CXuu>HTfHq%?{Y`uc>8eOUutE9{UZXT3k` zbR0G!^p|Shm-7TJNvgn)+5)#1p2qgz7yb!}z;wVUch7)qVz)}7m=nX^FlwVK+B5IZ z{)S0-if$)Z_8%Zpe$ZjRNOH))p<+W3goCYs$BL{PkW3uMJ(BDpp_OQRu}P&pDPTzi z+ldNer{FCM+_>5_zXBi<8PP-50I@5Zp;?B1=nJrqn6{aNJNHIxwFYT?;{6^mZ+QAu z*%#ioS84Tnk3&9nLh+?h%;n@RL(l{2L%amV$o!V8W`PrQop@_Fe%>UPiJp^)l)ft_ zv-NsF2bHh=pHo&4-7a;p%aODD6?&%{4y7g76T9aqje&qQ&d``4x5@3Cv+Swd6x}a7 zE=@|;!G{0jlTiXy5Q|arqAx_Ao5uG=(~a#vT^di=uEsM%jMauuSCJ2t@q0HQo`3x!IJsad=$lwN&9C2FhtdCpu1)Ysfxn^x+?*;+0`RARdK zCh2FrJBJvZotFKpHA(Z$0%{byNS>DZRtg8Y{YRtpJ*eFf%~LoQ5@3EkYAgPRu-OB@ zXf>7s=!@(#>}S#C^lrE5vBw<%+v*-6@jrZQDmASIQ@8)@`VSgmSp3Rj=J5PyjGh!R z{h4q|HnIoHr;Ki0bsCpkXE3MQJ0Gda_iAQCYRf`PCik(nhf(nY5plF;`7BT(f3=%- zn_9y)_3I*uk$71yp2+s{$WDCP=g#_w#f(BXYc^DQjkUeM&F6bp6Yj!v{^i!WpHK)J zYyB!pnh#RzDKxC+aa_8WEgnITs^so<^TWQ#)y7P|dXYWMu_g@Lq?fGpJwSWWbmN4K zNWzKDQ*BPJ8po#R5CXE4;X?K2^qCaiw|t3Xe>Q3OincwDQIyqfZV&(2Q?$W-QBvZ% zN%_m%fG0`jA(bDv#WH=l`xLuB{i0jazpX+IU79QhyBwVQnLr9ltC7`UgRrfM;)eAj z32&Mufrz_uo5;~^T%gCl(XhRkm%OKG*i;UZRzy>GD#GPRos9vPWHTPN*mFPMTB~Tg zl@E9CbXZgLIl7{8-=cOmQ*KW64(U#$8w)0^K>Cn>u=6Yw&O#7hXiwV9tj!CcF2?kh zf_^9!y!^oZ<3h)H3$*t0>P>FQ04Yd7QLgGxBxVoa_m%$;Y)O9Jh%$ThAa*=^aFe^E zC%yS9pSX%e)Y*g>ok&elVnCBEeO%Aq0`3jWW)LG)@}1#7h$xiBljxV$OZ=iqY=*}* zj=Q{Z?Z0QUoB9;4h0rcPol`_)n(NYf7oL0M3mEjMXV?{9D$a#ytKqL^*RM>KTLx1x zi*dGKasxU!lYQbFh{6+%?_yCNGW+8puPC}{-C)fZ_l8(S-Ir5*aNA|xIhCODjGni@omVZaHm@-# zo%#sl`X8_n?M5QQ+jLWNLWRn7`Q>yT-?Vu_5l=x3k6Yeh8sWxGNa5)+4JoJ~!s$^9 zdja8pXL)aI{W;>aAF@^1?DcFj$9G97)%O!6q^}h`JnV6*Gg2uES7#Dmi?lYlaoZ`r zRj+bR2P#B5Enx)>CHvZ)4seIm;r$xqL*)$t&}dhN#YUgs&0mn?SRP=hcl1|`mfD*B zQ@{00bNHDQkIMM5pK@l}XPwGa7({i&PdM{?D(m**sKAm|SOs9#cCL0cS!VA0)+=oN zG3j?#qph>foFz3b?e}@X#;YcnSiYAICj@jB(tAbW5{8?XH!TP#)*XXpw9J}?9ORtZ z#Lecq)|FarGkw}0Nc2^r*e9mj(pwLNa%6(nx|-rn&4lN>a?)hY>6BelC~e+r+8SCk zXS;CQl`aa$8z{ia-mG3_)rPPZfqz~vRncg)VwSB=?ImCQ4MoizbxK}1W$j=+<5k)u z!4@G3M0eLJ!$L`A$VG5&KmyX`FZZzm%cxJ=GKibUk zz7nt4y`xI{AHo!y2>FR_J=tkVJCk91@C|qVdkFGc%9h84sS1GUZ%nS zT1jOl1{~Hfu9;hehz4Hw$prh!N}qHL_t~OQo!#q)CMo-;Xr~|-Gn1mK5EqW#(?eet zmZK}J2(PJW1F{alD5fD!8 zQXrch)NS-iT2vQ5oYUjTof)aae}2AD-RK*PH%;Sp<`7d4eQhR~ zEBpFQa~XFky@hA7??k6pq;0}AS3;-zg=&)I)|f+0o6&r4{(GUQ8NZ?+F-x$rQjCA@ zQoG>QBsyJ|WZ0I&(RC3$*?ardJb#q6HMM8z`}XkH0L53MQmFJt-pUQ^-iNz|_e9%e zF1$mr*{I_l-}@g3;ho7(jJ| zcr!0GfPMUP|11gw4V__Zdd=;<$P4vdEvf&y6Ob+HDiF08an5tuk`J;c+N*ev0Z5%ZJN# z-?1DU4$k5Gv+|fAw|=~R<)QG4#dza9p~ zr0a8RgnLT_dbA$fzHnY~)_!{SVh88;YVe-Gk3iF|Cg&4Ty{=Vml?8ua^he|FdQd963AXN%8-sIA53|HroI7VMggrtQgJbJ_9|}tib?5Xga}5jb2GX z-=UxreOC@UUr6YUIp?mMi*pN;!6pUn_4CEM6_|0xKcLNY=20NcfU${s$<^=S#%AX! z4u2!9a-}2eF>B%)HFN5TAxZQ!{8aZQmRDb3JUQ$K=LQ6t2}5=E*tpKV39yWz&B$K2 zDcqJqT+Ec7!{x%lE_9*w<{(rwbQKof{c7k7mpI z6ckQDACAM=sOh_xwn68ZGlOEG#&yQ=z7^P=)b)4jaaU(U)z0TDwuKPcCSvZLKA~Oa zjzde!xSi3bG7f3XN7Te@8ki&ee}@MS(+Gs0l=G&JeZWX-Tca#lLYux_a*rbF=oWA8yCuv_uUm{hx{Lbaw zEpUUj#C8`wvW6V>Yr6PF9t<^CNM$3T43Z}oJE~og?yO2J57nKDg_qCv&+$HK5snOKS!BLAkba46jAHuI>cuVoLsme#|W?tpyJNAwB z2fQvtM_;Xp5)l-3kC$pAWGzBzRgw;#xewEG;dyb~EGlu21M2*KT`2C|)sAf&aklT~ z8=_eYpK{lH<|54^COi@^nc3=+QLg*DHu+1|m(pRdly0BMzYB`rL~vn*5Qy87(0jC$ zw8Hmg#$8LU_mtx&6Fv(ocG7SDSUNMe!Lc1BQH%a}i&i4{;?Na$n3lpt^P9WE+(C0+ z*dD3{cSglg_O4Rgk`k4=W6p<*l2v~#w8r{NEq!v7Ybd{$(5WZ(En=a~XSCSQr9ItH z_%^ZTXRRwttKR;?Y56P`YK>$5>~lM=TN~l|eM0+17B=M0%nq`7s4oSYtu<-pU|8A5nH(S0t4?JJ( z^_O4x9ebJu8W%nBxRc8KWC$_XS_=b*8S^nM=dXD&yii=8g^sAvK@QgHxF;o{tqKiH zws}E&7)6{OL|6sVbU8~!BGOj~a?$UFQl$F5J}XSwihUD0N2ZW6VWc`m&CD zLq6}t>zpfqq6P)#_xHo(&wExr-c%2RGLO!FLv)2u zositv0=)9RAY5a{H&=o>E`hE3G0ToonW=NcFV*olwR0lB|3K(6_hx%m&DHpnnE6D* zz1_?gTQbHQY?VI+_%@{;bnXAN;rSjBYNUDd9}ApS=g-Phn_ODzxu~8yiw>H6H{|LZ z=?Y?K3?(76^*i^xz3L~gy2pJSE+4pW4QEUl8dk@JJz$;}^10LawNW8Z-Xf9b*E<)T zRY+(X%{PonCBtD#V`^eurp*NwHGg6YcbSrbQw8!eg~?_=Qgjl3(D+qSZdNQ@Hfqf~ z_pB^Zy*(@)hvFq2-Av^r*?4J0&{7u2b1LNodsS=TKRrre&0LITx%scEl}Rl1`M`uG zu>^n1wZvbHJjq|L%E>5~+vGz>uqL+v)*@G+hfHsC1Z=t&@$Sqn)S zI8)lsQ+I$M*shpqj}_Y=MnH~a{Ld`nV{I0oCUhjasU{R8LmK}>`L;``k&u; zHr%~ckigo5B=LiO8|<89ytp#-WWy1AwN zhjK+R-V4d9v8_Ok)>U`cLSy~iCNMt%u@v3%A^@QRfIN&vb5mE1EKLKvfOGTpVlo;Q z=I?#-@&Mo@PMUX_&@cE?fct{%S_4o3b7ReQB51yazis~8H*XgVewCgBvJuIme{#nR zQ@|r7pnbgAG5_q_@z&EPjAV1=R%HPo+?oS#GU;p$svVQzv|F@o1(=pX0CNFqEy`IW zWUGrCeA;E82dX-rc(kiJeg)8J&Sbl4lE-?+>454{TY&Y6`K5&&UB^$F3|T9>50qz# zw?0ND5B+mll_mp1S@jFREdzB9*)rS>3|VL=3mP< z*0%xZWpsb+f#5TsI6ewoNY3W`PKH9rqO?Shb;9yDK(CofT&JNuPuB#%sMs_k9!akc zQ~q23E@V3>H~KUB9nbB5;1#>%3rMJ0B0ua zv?9+p4g9|Q`v5LUB2thUm4-9FCqqGGK^xgV3C7w^W574+D6+9~t@Z4be>sl)C>WRo<~PY z5l4WeZG5F*PUhEH>&g1Vtx$o;`+W2ZoT5#mrqVH2RVKs|AMO4F>Plv^adndRY(b(g z06>JK4atFG@PbqeeETH%XF}I%x`{Q5dmdnhGLwzW^-sLZ!3ek&hka2q$YG%-tgQ_I zs&;@=ecNgUh?&gkn*Z0v?%fdyNuZ?D&jHR-`%7E~(3y>=Nko5jE@}xKvRaDUDe!sV zg<+sS|Lm#ZX%AlE0y2vbl7~)FZwFN!u442LFbzIg{AfG9E%-Me-9((eX|2{QP?9D~C{C!HL5Ys%I89z?;(#p(zp(v3^)nfiT_C&f$fV(C+AoxXPPze8oOyMk6mKe_h$s!zM$w>1Cq(3=pAt=pMe$q?$5nxf0KG*7Iu!Aw%eA&Ich^;uhFX&`uD zuN6|s3r7dwBd-Gh@-*Lud&sVwZAJB%(gb=K??Zq&0&%sgkTvZ#*G$g$M~BQzcB+K$ ziQ1yT&DKayh!8=PD~wsQQZ9I{M%p&4yvlz;=%(;t2U@_Qi$3f{S813uQlr0M{cc`{KEm>CC&v}FB>;zOe+ zBozMb)Wk)Pm@5w6tauVkP1W;Aa2CLkNhi_k7)FKVv9KL)r&oD*%P(H+7qTq|dS8H} zq4aa^2^pfcGrlN6GWGgvW9;-_ za?Nnfvk7sV0wdrBm)p(z$(TUt<;G76cqA~>eb9YH@k*{L-@~tcHVo3LjY64iv`l06 zCr?6%1n6%5X6&lb)tr zCWMRsrD1FuK1L!ZhHVgYJ++FPp5{h25CAENDZrqiA}f3lV->deyG`dJ3y2VXC6~^X z5C5fHlHy^jOIUM57xO?hOECTXzA4?xS68W9;)L9PeD_wm`TW{6(CtA zeYHvQ5HXQw-Ae4LP(cCF>$cW!&UKT3FJH|aGhiT-%qbSq@+7&@{+nvJtOUMWfGsfa z+TG+5KR`78wq22nTIhKeg_H~NWzy@}v!?M5ufj|Q!WKx%_C8(HEID*_XTdJB;>z5RS zyY6OAIy{RL4*7<-#F%vnC=qUal%5{D?Fjh@_rm2BtNC>`={<@UZr3I65Vy9K6o_ix z!9_-2TUxRblmWK%$c1#tv5cwL!6PbA@q#uXhWCwg}uFJ$q?Wp$G}Yz^V9Xa#;b7d{|!KD$T0u z-kdX5sg$EXAGn5;RkiU!xhwTr317c|od0|p;MeFCX6&~m6!VhTW9_S(oBV!V8oN|; z{SI~E@$0tuLA4L#Z28R}?zTc*2X_DG#+2O3sfp=$cgD7F^(`IUPA>rt=3X+n7t%#^ z@qMNd_v4IKC{r%bRT!0V7%<}3{*;MMgYDbC#Z1160Rqfm^YyE@yOTQ%F6MI(1=6(^ z)GAxyboH)k7fXu0zk3w=*&K&u?bZ0y>%bz3|1^I}+_ft+BtP?C1JE0};Xma|`i_YKvqjlk-hZ5-Abtn)g+5 zS7IDC7WP%Ct9EZka6Stg+q%0vz@rlLth9WVsX0&rNvKzU(E50YYP5%$L4Bt|Ka6S#R&K;a_)bz@A3lt{CK3Zq}_5Q+lj)@Q>B>X#W?q?wDB{%gTbKQuD z>O@3>0h_qnNc_?biLUEPu^Hx*ZLxVihoet)E^sKF@raZ^3p^VuKD}wyY>6O1y6QCD zew$N_cprW_cevOH23ZZL-rKJSCUW18x9AM6cxR-gUzMUeic}w$~F9rKFlw@6%EY|IP4;7CgT_^iff$dmgI>a9Z3QIm3zgGrYhve zmLTjQB!hyB7X9Ppyts+lLyuj8%~a*J^3<#k;0|0Ahq%1;h9^4vnHvns6)D^a#|y^u z8qlD4YorAX^luAlAlg!pStbtqf7y=nKG2mhSrWGF8(9by7n~VWK9y_6tdH52x`f&F za$jIt>3SM(!+r_EQ3-kF_X$V0cKLgbVy4dixNRureWgr}If1*>pZ&S9f4wQ|XaFd8 z>4hBf>`Hj-saE_JXH zXS_G9en2!%cOmGxhP(-&uFY~tSep}JQ}`9Hm*s!lc?CD?#d^=J%=WFq^^O_SW?naH zL}FV&?R}0|HDB@a4f$3`&q2wz+zl6+h=m1YzcZgi6pxyY_-cIL1fa;IU~l-;bRqiB zB37;k(5FiMv-DK@4TRgG?9H^ zeHjRzFy)D`lA89J7K8hab0F!CoA(A3`ehso6tTiI!Cx6_iEiTSFyCbDdDogrQ;G^& z8G@p-dht#bjj}q#K?jri|qT?-Xl!6qU{w9uNW- zp2RB?afF6{dhA#r5)|FB?IJFZ#6kM`&M;jxEt1w41_+zm!%rKSU{8M4UV(G$tL=?? zJrm6(E|z#<+*gIUu8=p<)7StzQ(>2$oZ6rwm3MKLsK8%>Yw#17?NppHeZl!P_T1H* zBc&)+);FFLjJ^1q%^5N>)XxV<=pw`|^()YTbnlf!8|EF#-OQJgGxzHYwvuP+DLBCW z6OZozj2BNLWekXp7aps^|c|8O_}b{4Rxs zpmEscI4N@j9`Hv{D}(&6Q;R&MGyuB|Y7cTRZl>OPcRN=B5g0E=3 z^S;$?bR?iIBHJ?Kguj#xVji$2rqMdurR+1ya*0oecg>F0j ztTY+N!Hftk3~#&}h6r1mL{zi6@+IkbDAmqkOp-x6Vl4<$*%2}Lg^d(o5s5zMbpwws z$l&v2wUVe93R*tos|#)MiOAM6ieA2(%qF}e8F`-2v)kZK4f`*1UAUxDxRMP?&1-1W-d-(mwW&-QgF{XtQ|R0o%R0yg=wZWBt5H5t>itoFxG}3jn1654_P#z z$AIQ}e6rBFeg^5MRcT*@^?xw$H`|z`@Do)stMWH&+u+crlsbkbDWTkcDU?`C)evF)a8L?9>%seAAE zZ>7C{t47eR<1;ae3V*rwf;Hv!-C*%AK1GbS;&c*%5nd;;b*>aHIk_b(ZOcsw_4Mca z7;j2%{XuS7#3tyOP34AWdBI=s<~U&3#Fx1VF>FJCq7muJ*N51LL3nSAFp~jD@cGa_vXj7tdy4 z61w6^6yc4R@g9*(HJ4ZDpR#FG@+~R|tEoJoaWDRFV#!Zce(<*G2>3N=qk zUQOg!&G=~SNdKH78v4k<)~l<_gu<=(gd+WwUGf1y1=U!absq0(t{Qqb0fmiRvq9(QaG+?)S6RSWNQTW!q| z#EAm?RPg3~?O74hg**3XPWm;aqZ*$IddB?$MSHmuxe%*Eo`sI#83k7SnvR{L+3Z2A z@gPkP32g>_3A_wz%RJcZQL%S=oC9d~II&}VTqTdof@DQ6X1az+ofRiG)u7Ao-09z2 zfTo@R^3|Y@DQD<;TSH41KE*IEZIR>89CvuU_$hgN>6ds<=qio#9`qCTY8evOd%u=v z7?@_xl+t& z{Rh%$Q6&{KIQm^1!c3oZ8OJ*-axvzCv$?qTTYXS!w!6lAvFPJ`G)Ay^#RZRqp9qz1 z31r>we{ool<`I5y#3@?d7Y)~Ahs!b28GQuOzM~mmMwn=%oPrF59Ri7mAIT8g3{*3u z_d*NIaKei!@wW=-x%FM3RddbzU~RW|dwbh)_A3V>HPc{!du%E%fJ#PTN-JidCa%S} zjw|YNGrGYW(sm#S13tjQ1#0QT z-aZjbplT!Rf8Pc5WEuJeF`s!QQ*K*5{PMS)jrdh1#kjgo{Lyu>HJDz(*N#zESb;oI zWKjZ2$LIQy!FX47uvzgT6Y&j8Iz1!yg9p0Rmq0lmA@dv{!f1WGV-*kF{WKkhKey^j zRn!*0KzG>RsXk$|M%V3m0Zwvija0w`bI|E`no_0R!R)wMXV8RER0J#^1^;*vuR@pb zj7u^V4r}&rk#U=%>unCd!QO`N^^CRn^w{V(KHS6ARC=qesW44fGiX7`?iWNb4fMfA zH@vuokLAahlpXaB(nQDL1N}{+e7)?gZHudqnU%P(^v*F^?G~>34R9zr^}t+L*Y!MQ zzM0MZ(Wd;4Y+jTQX$JWeYti1Hv}ZFi&d067)Uoz4mMJ zC86_WNfvq(k0iD&*1h@JelXyw)kApnIL2=V0uv-(+>Fh4wK&ZDRMO?ziBGcAxzY}- zZa@(=Y563CM(<&TH*j3B_O5hQH_ozXL}9mQA-4P?bw6(%-A)LwX(e%?i-~)p0-*b^ zrt;xgN6})~dGWykwwEvM1eY|VnZss$N1m1i?)j&cO#E=@G<*E~F(-tztWcI?!%Z%? z!|fF8rae;xd6#+Z+IEzmOyjNHzC&H_OBPeKN1FB5`<$wW9lnwJ1=?BL{$VJmx`@1? z(?4Yse0LFV|tsS2e07nFu6SXWZ71|K@z5m(Nsfu0xpv!)e@hgf7PG zdxQQgJM6}TJX)gUj%a<~EYgI6BNNhB6)E=CWS051F708%7+s6Jc@!|f$mTX z88ZvNm4v`6D3N$y+SX@kbEaY9F!+tuwZZEqK#P{uJ@%^*T~(*lBen(=CB2DONSY2Ik0y>gYD5zI5nC3lp1IiDc|jfy=}cGq zFC+FF(-~S6Lq9zWd>uRa)SmC-KhC4xFqkJQEh?QWI+1%8^3&nvZNIeVdYfs90XErv zC1O&t{1uU*X1AI)yJ znLfW!sZ^7RyW!FJEY$E_jY5w7Z3{gdQ11!b)7ov+vbUT+Ogr3p_p$5GUFz}s1z?tyd_2ZoiabX5LG0c{!70poQw7M8ubE8 zetWe@_A?D35j#JFi?6pC2?q7vJ;HG~bO~oXgQ+U1h>j4=gx0Lv@N2WV!Q8VytQ`63 zQe^KKxPsAn^|P}nBBwusnJ|8&9{Er-w@tIo$C|EBX;j_w!(yk-^(H67#{oQVkqG2n z@1$v^?V_xzAlMH`+UZBGhyTgy5?;Snfd!j|ca{rIxTd4s%4A`4HC2_b=cm{M1=b+g zwi%=IN5lq~xA>Ef=(HB|qu5%Jb0eR{F{kaQqMFMO9;t4pka@Fli%dO}s}nShez3Lq z!qS(MG!<&jQ8NEwX5M_RNOZqWR#eLlLU|3IJA_;L&%;ZsuW6zfM}M#gTY0y@xMzAU z)g2eM3mHIW-@$i6vb=6cO-5`;pL?t+(+wQ-DZEi%8ALq(q(A+iQc%Ff)lh>24FmOnpL(n=C+Ddq{d`-+X*?I_TJ>mo< zr_;r;6~OrFxJzgWVilI!LJJz3>hXdhVkbQf|9R%){Vw{x5F!?;JcYh!IpwTjP#SaO_kyA0BdEekU61n*mc$>CXK{c)6%}sbi5`J zxL5k$etxaFvI#rUlIPcKc4#C`YaBUP^m7wregLkpxDr#mM*Z*4x7YCj^3m89-lmmq zn%h*4aZLL1!qfD=zjYC5_BC|GBxgf3^YvFbkDioYZudz6<5~eW-3hl(=V!?Ru_sAa?zvs>Ejb#$)BN-e zqiFGTP~@G@&OI4Xly`Hd6=2aY6ia^xG*GT26&4N`ln;sVQGs|yBK^?p zb77v|I|>)aOrUC^^3zCDw}c6Cvl0L0SR1?>W+)olhD=?*tQ)*97@NvynTzx|tFmB< zH}+w7cw@7d=+(&<&{$SCnMF-Ee{WRNVeMY7X#q0S!X3#p6yDn#qm-2k%fWx?R&#gy z(ujy_w06&_oICcmsX}Q3nRF^jll@B?n+z5e63ZCte934(71MnU1a|DH-KJ95&E6su z=HKayL9Z zMhe;k!;*BpD39`n?s>80Rya^m?6cv^YvFwwJ*Mo&DC*l&{wYBNVR%N%!LU^?wzPt$ zALp4^S=_4BX`{tolyFwA3Fnw}vRchru6?99rwVr zakKW^t%$Q+m%mo-y0it@>)g{xvx`Ul3RSf5vRZ=aZpx)FmTTHkt%WBm^o?&Ob>m-M zhIC|LGu0@H=XlP~zF9ra6HbvRd?*?JvAhLg>okDrK*VAuQf-6~cAs74SYOUV5Ytd; z#+vH5J-m!#7MqI$hjBI`$K31!>1pjcW69%7S<2S;AG8qt51b&$>L_ z;&->L=M*t1UGmw~FJx7@;k-K^SSrhfW(R4?Al72+Ugc+0hL^8Ydh>Qvq*en?zSYYj$D@e zKK#}`Q@ZF{utwF;UGImHVTh(Q6|Y1~HH7xclMoJ9-ZN*F>KeaHd6Bj)GmP^5ov8BD z``li-58jt>?w8aabT`UK%ie$A9x+u?{OiNyZevyt1bZl53yE*Ga7K@>iA?jw2U9Vn zU#etZYDv<)D6#sx-NATW2wOIA$~OCq(7dIR7i~P`4q8^f^*?&x2zEOE7jb|2%l|jH zO6dO*ZiNl>Qv)|T$YHh@1rnw~%#{F?j8lQA$%oBbM*BZzPJsyteg;AV7k0ld0yzt# z&dJV=t;*0a0AP7fV6tOC-M2BYGyqhGA0}RDb^6r=VkJSsRxa7v)eK06uDa>hK={L_ zvp*XJe!l=LF$|#2X$Smazyx3w2rNFpUbFyQLBHQOX15<4pB`<1F!2A0nEpp`{bo2h z2A~F@vWCgwvSf0`yN!}A8W>P20^ciwAi?0*VaGdTmJ7?8HvY8lZy_Hzv>YMiudZqS1aR&qr8|7CXmL$#fP|KOip2u}_f>GCNd3n5%UXysEQZ*RS` z5ldLUKZ@d(I+4%?QqtK~rUMt|Cn$D-jScbHfW!Jy{*#m6&T~LXwmwRhq)LK;U^&pv8@xb3m&WqDGcu-TF)BxjtWeHzwCG z8;JlUzz4=}J_2M`=C#ilL$uF>$v+JXDO=S(>~TWP{J2l@HE#P-H!ZIh ztD!wV-mjpW3|0+217qm_^0j8PfHo|KOeRzU((W4UCkdEyE=^omqbUBjOc$&G$ecJ3 zirO5A8PRP+0$a&@{vL#px_k6_v&wXyGNT-M_)cyf9m8zUMzd>|L) z)7s7;eSY|(0s+GDj*%j~#{Zk0M+~50{L15kI)A+?GStuih1 zA0R@TZ3(1^W-TlO5m-F-(z-^wCTmi5Ene&o?ENb>vknH-Fa_+42S3*ZGAGKvVY^g0Y&ygxtJ z2l0zufWUGgM;)6bBPYRIaCsiXl_(N7%&0o)?X#I4v$Z+7al;NR!c%}^>^XnKoJ~B} zE&U=@`EJ)X2xsgz2?hiA%JQ8Ij^~tXENpvVBJ%RWYek=G)?&D5uVnvGJkbI{L7gp9 z{qK?{4kcEYX1|uM?W6WgD#{zas-P;w2^=^fj$Ib$RFf@b_ z7eq~XPYzKuX#s)Loygm9wHt#GH%>rZ^n9Jnw3PsG5^hZ%jeAcX^Mh8_=}1%nm^Xji zE{6W+e9OV7Ykta6c;98M1rUH;($uITg_a6(4CsG#jUee%!{8?XGzIEj?G~sTtMnAv z-+S+h1xcq}_l1p%!0?&>dRHw4n2eC_6UPl0!N9@Uqip*Jjq`RMtiQM#khf&0{YFhB zV#xWo+O!a9|Aeq2pgu&4<2mE_e2rCXrJ}Z@e(BvjM4E2)?@eHdl-)xMwF5}PG1-Ji z{#zbdA3dEV$cZ+Pv)R4JuBvuvzpy0B90M3&IcRIWe;{U^&jQHufI;ys$bZafuEEI> zxVHUJ>50y0@bgUM{7taFWAqUI%s)16@c^M=GXhL-VmFE7Fe~<|p_)BDF0^Y2`E9H* zUnTM-IZ@TU1!UH8q>V z7I6z#0YR5CEj?Lp~}FECV8~ z(QK&*IF`z&^;8!IuwcRNUec3)?i}0>CV@Va^36x}FbSSQv!CkU@BC-Dm1A^luHDId z83S^(QzU5UBE6TCqp@;kZS}c5@nYf{wA@kZz)9FS4$O;t^M%5i;8XJ->5KaQ)MAu6 zI|SS%$BgBxr|Z57JyvW%X=Oj7Kh)u<)coq#_3m&q{?*|Tc?@{lrxq_5XxWaEQ7-vp zig8U*A$~_=qUDP*$~;cs@vlG`nSb*IIe~5hUiO}DNofwK2%7mba?EQ^p__(VCW(1D z=2V6BYU2t-wzw#4GVTW%d)WSY{5%i_SESBwoT=Fdgn1&fVr@>l{1cS_1x?W z+KbHA*1h<0!pBL}C7t(1ID*JsW2xQr0o22Z$k=d+IZ835KK6@RG3G&1sh(nRuf;B& zNpbLNaI3nyG6u?6y!iHv#QBUAH0&Dy& z!Z9@q-3;hNw2K^v_ic*Er*+*piIl<(1?XW!W8~l!O@%*{&Uf2W)GbEtnKVhsq;?26 z0`AU7u!beK zQ+mOBO{0TR@zEu9C_6-OUOBlOmgClY@WgJH^L58rKka$i__HH(#)OZ;a|Z; z5q(2qjLdbrtaJLr`U&dAnA!{kfurG5Ia%lDpmcm7Dd>^b z?g7juKxXX%Bpuhnz_+$Rw@XUu1?`lyKcnN&M@Sn?0r;**&ejTn z>s*Lv5rAP@JsMu$^{3)L=#g?LZn^_o+zE%60i=N&U`{;+Ca-@SSc-PKm+ z>$D2ppKR!YAB?lT0VD3HqnUEIPFKYkirpRtiGGuBlS`;x#mXMWHAyp~uU%wr#J<91mF{wETPajrfQ1(-CV@ z^&Bqu@O_sr%f|>Y{=m(6G&3p=Ag(E4y~Jv~D#7K&Q@H(rncxU|oUO+zPF=TcBTCyw zgWerxRw-4AuraPh1+(ta2?V0zWG_3Xe)U+4tE~Q%VksVFf%v27wPIrU>={DZiX1M@7z%)h!6_!y+KQF-3e2eYlzH3x2T=Mu@S6<{c4aSpdh=XmfbjfDH{FW??ChjP&v}0O zKX7U!9tB7y2xW<-^?#ysCRvYx&HB3hl+(J|8X0@TCy^#RA9Mw-;cGGiT1uuycDUix z9Z~ZinHroT5mK9Jx_X8jva_>+dJ)^kqf+|Ysp!;Lm?0g)-2ocwh72<>2L3_f)w^1B2S^4w*H&<7r|in-(S4BD2zBt$i7-j5cHc=zW^(h!HPxP zyn7!zaz*fcc*?oe_i5w(t6)Sh@P5uqP61U;yE@SbCbF*jn@T_KEXB0%SJMGJ32 zVXP@cYe|jKQ71sw;YVslKTE>cw3Om-;$2euvf(+OKj1L%S%cUvYxX^nDCry6RygiK z3c+6q$eo*iWe5RpZA#eLeZ?0?X$sAN_eZRX;F&@EkA+mZ@#$usCOmkC1^hhT-z62q z+on_z?j)FY5LPAgndui91P%tItZPudwqy}HBMv|jkUjk3Eh)cT`RL<;aQzC;uuh9W zFpS)V&P1~6aq@3MzfbtjFz@KaLlnE(L^AwOAJgGoA+uY1TjoXiO zVdSbx5jbVH(xY|ZDWex+d10my2K#1_TC^ys@;)Ddl3_piB zu)u&d{nZJCu;z3^X^qnq=*=k1F-l~GK^j4_qZ;r4HD9I8WA}S`id_ip%7sg*?C8i! z38lw|eKjGX)CRAC?wb43C?hb6xjS@+g&K4qvkQ@c5knH~#jVrOpci`ODZT9XIM3O^D_c=IX1Y&adn*d`OB!J5=s%|6*u}yxwoi)d3G=R{vu) zB_UD4KJ@8LFtMc8?_u3=O^@;74CDnOR=U+!MFGsN%A_h1oh-FIzDCkd!dQ^(6u2rU za?Tv2vjWJWmp${3A-><(;RBkV5qTP%sg$m{x7;#rmw*0oFL(Ke8?i+A+&+VzJHDSF zG~Q)}O)-~Lm65%Ryo9a~c*O+8n4|cQ>6Ilsu&o$2747k)&w`-XF=cYgZ-lIlm}(*& zhE$B5gS89wk}b84<)^aE=~# zay<%>8*s3S$G!{Ydg`RwC(jrO>bsjn`aRtwan^2n_B*$HW$5d6^PfHM=LCnhjuzV~ z)t`F8-{YDqFX;hq85KtL6>rBBE-bXz5|TLe`BVBx{Kh zX%UAMaLK^5rahqwQ6lHZ^E3)KbNEBc`a|hR7=fgw=ps@Tcg) zX=G5e8=i@p*{EQY#cQO|%dH8W!J1!INzE)(8k81Vv$hvjAOj;|X9he)6QUIav8wxW z*`M}Fnh^}F%^8?q{h`SVvO&3LyQ*2-@KwT(nZ1cE$-6sq3*P;hu~Tw2a+|;O!-ZnF za0pQys>7hrINiNF7rQMsNTHrb8W7g_8l&Xs)LW6wcHoPYhlLgxzA0@^{9Y?}-{?au zr%x3<3obt<$JMz$QUpx{1OB9GDn*iWC%QoG>HZs;c#6pVUmm%iDlshIzdQL7;wW?y zj34Ccz#$`a0f7;`0O<%(?Gxry!JEa<>#usZwDFky4MAbGGK*V1`E~KcbsKEbc0Fofc|a#wy{2(RIdE zYX6k`#EXyTaK<3Kb9uyBUT)HgrWtY?HS+pLFmBx--;D!W$l z8PGYk&0X8ZIRaX=_d+^;$I0XA3oK|r`7wiTOob_oG-&`8&{^iAf=_tag4;~{J*J|e z-!0xGj)gd`YJLV5tcc*F@@3iHoc`VuOYj+X;@WZ9!E4w-I`ELc~(=bzEK&C4LUuCNZ> zz`dZJu5h`e>cnqYVmWEJw2;fN!%6X!$Uq^ne`G}497b4j-Y|2T`T$I)3dX{2yw7x7 zcQmts8+A&XX`V}~S=N69a(OVl@x;YO7UCRjPWY(hbAg{`0=3NfruE)1BFq{BDft@K z40Cp6)u@ILj2_=$?(9dac^bqx1jwODuBibC5@=9>Do~*fu-fC&v2!vfbQ3bqIx;Y+ zvQr`XS{pxpb-=-j)2W#!6}ji*{9EpskOn02m*27=Y+P3O6N{9$spd}-2UJ35H@C3) ztBKQdH$LprNncD1V*mBdCLI#!tx)F)#qmgoX<#odrBov*#h3d5U#_iyL#s3uy-L5{ znSd124Cw|}4@Gx>4!ZBm0WTF;4hQoP9a$$0X2b7>1X@p7TdNGx^MykUHFX>E&Or$0 zY81wq8kR*KD%tO8ex=#aG1YdiTaH%B1GH4vg)0+41&TghX=qk`Y7?* zsE=m-!PBRDIyl?R1=WApM4IG|Rr$hqs@wGj(?qyMkR}YHnOD1*KqYe{t3)bMhNbHj z*a3|+J>UbA>RE(_WHwP;r_a*Z|oEhB)_n6(>W-=|&aX#RQr-H=7odU~-0G82a7_wVXE^Gcxd#m5uh>mYSUUY^;g~uY#C*g*Q%hL)AsFp$|ol(}wR@T*6crtyZf;k^nY-a-AV(>2|5|!30 zdYEs!^BFINmD^S=G_qu_^pWI7|!-4UHj38`6eFan!gRy||?rvy;IuPUL{nTn3(dHU1biv72N1bf5@pLEajX$Kk_UDWW~{ ztUdZ(P4mPvwm+^j9Vify1blAGyZRHKo^~Kk$ciKF@xr=}mw151wUdcg=u0p?1B-~S z=>EusiiRs(=nAJ)GIxC;CN=$gQs<#+e$eQ2l_iXOh;{;zxB8xQ%2f0z2fSGdc0^LG zQs6y$k38tDlOA#Tr>>eArat`diCWlBXY|1snD{wScop|$v%Oem>Z~wBvTZEFbY-?B z&XxMgsPw+}Hur7LCz8z~U;boy&+dZNUK7LL_nH1q6>#)*ajJ?I>v^PQ$I%q*HdXU1 z6)oZfKX5wnuXvzkf=3al{kjIym2ESd4{ zxz9R<$-9R;ih2z|uo~bO((%Hf%qzl{QFCV#P%_#x`!R!FcG|t=#H>h<4$q?fv`My< z%FuRwNIWI;3zYOV%N$t>^>C2958Cv^nvtyZ!KSnoPD=m~=2lRmi52Xcc{O z$l~!TbwE8L?@?DT>jVoM<>gC(l5s0#i-T74Mh)C+b-`~vC5a+~+}e9=@8zQWOp1SY z)bR6^_q5zBR?x zsuNFY-}Kv#y)&29yDAXaWLubJQV+K7b2S6noz8dR;|2GQgx30l8bemijf*sa+6z05 zgB(zryKh5M*!h)QHKL4OGo~G)x>R)e{rD}}tDl25gr#bZH!X6{w!bAgijTc_cj@>V z4&yHVv_5FLAL47bn#8kci7!@9hm$QQlFt*zzgERuI3wEUlmL{I48Qxzvcx?re#rs9 z47ZEoaKN&N;uE@5VPCZ^l7ev2+(Wgt9Wl6Bi{e;gG%s`G^5#Zue5*PW2H64{*qP~5 zBy1lX5!0uVZ(e;)a_u!Ys)@4v`GTV(Q8>fl*GzZYyN6u7_JC5k(UBRG7L4rPop>Vi zJU9{T{RXTuE~V%^D~dsfe06B~8i=Sb#aG_@@j04fgm*x^g*#2!=!oLt#KURWY)_%! zWv`xlTrQHb=8*c1s29p3$dQHHY@w=PL3ymFrT%&1vLGa%Wuw=Gt}Md6tSodM%hx@!6mi3n@o{W0JF7^cWhTuV*?8xQ`p0A5!}cn@(#idc*!>-Um^6h# z8F2gdYpf~3l!E(v#z2#GuvmMl!>s?w#@(n}GuB-{h`?`Q2-M%YS)686Q z7pr^t%6%74;vJ?cW3stWe!r9 zhq(FSHCxxRclI$4a5G-K&*!>ukT+`>M#yVe7G>3lg5$)dAJAHfpd>fLzcN+$@N8j)IAKQXk-o~f zX}S~Q;&6C=2iw8!S!aiu0ZXD(`5d)%rZma~_pEi2L|xlxJ2kK)cP;lsc1Sp}c}A%5 ztCri~HkVSNx&xu4y-JD?2uvk5PVFoHMT24DQXo# zq@{RbkL~0w_VuhW>GpScC!2ajZGK$PywD!~TdR%fz&n|me-dzVb`JyJw~j4we9$sr z{F%G1M?iR&+YKR)yDzhY<)9=m17-fidx=dC60!@O7;5XcwS{md1h+mfv$)(f##82^ zNY{I*f`ccb!Wj{sLdJOqYe7(F&FopVscr}vZiJ_< z!*|G{5wki4{;v8~uHa!?5c7(%_Uj0;v0N>Rmow@j$+=ny-`B)L63C;TCs`uL?0u`~ z@a~gqU~6vvCZT(NVMg3jT)98esqjPJj?vG{JaAS&fkZZ4B22a`)XG4hs*~geW{ir; zTQb(GI9G>t$(MFcH_wCienMu%RXogye`FqbRa9oBHuv1@qSb~maJcl1m_x~iGKLWh zEHZ}8oH^f(A9Xf}th@hE)9vIkd}&12h3jVjyhpApZQq>30B1ERg(YN6i~#0|C$&9y zn`FN#z2v7~`swSICn7I`b=3o;vo807pAnA`y$v-ZypC4*La-ixHB|0GH*DmGJ-@c= zBu%;m_8@PEEwA1=?GXh+T@5>W&j&GGE-?Ht?i6Od)pO@m7)ia;FFU#TI_?;n!(N)B^ zHF-+}R5tul5g;ZNMzA(HDEk$t;NFF_bUftgvi?JDmQ|vxk>0 zJWi#>VSZHe}JdH}|_sKdex2 zb%Tf&IfHqjT`_8EUHa%^NrfLnE4yTcSR$&zb1;u^jd&e0*?Z!Uv)||UQ%;|wjD;pH zX_>wGK1;9MJ#LCOYuJ4I;nm7Evfvag@0@Zxmz#H$$XSe!@+PqwOO zOt)zQ*cvVH?j(G5is%Hc#%akFeL@jZ4aV(jEPJd$6_zk*rZvi|uezAjGn~=zy664( zAm=T2UE3Z_Xk%tbd{y+rr#MeO^9#K(buEFlPld`aZE?m05=U>z2vwZOjiQ6Kb$!48 zWHL5%7Y56?L9*_Jw*3^ar?KH06w&c~;r&;r8Suc70fWn9c zM^HkNmUlQ>rb|RkVBGNy*U4+I;gqV^^+*TNL*0BhF}bg@*BT$x^r-n8hH66Rs318~ z8ILuLR9OuBf0Wywaseq)SF!mLh|h%ESGG2IbArp^vGzD;g6xtPaP`{jz#^f9$<*$C z+ll}hItl<8k?iID=e8~+HYpI707t+FqAU)>HNH#%Co4kWz$t<&-Fq-a-2bN-n<9@#FjV(#b$$1mwtpKOi2OA~Ntloa_cp zfG;6q*Vnw|b~6H>mL_J>d+ooe60s# z=HP0;<4xLT22H%6eE}8!d3%pD5J83m^ybiISQr|H7CIVMyuMfg(oFau*R6^60PF%h z0XaHp@3Nlf6~U2Vzy<*s{%Zfr!|4^^Mns7A^sA;qKPEiZfZK$6D9wgTkb#X#TnC0l zd*G&^(0rgpC7dxtn>K6==!;&_e_t$nkPQmAWa*C4xC#THl~%yzh}R1O1Ee zoYBH>QX8<80o@K%b0mS`G~jIv^lAYk6p2=$I!XNZK8Vl4yw%cx9pnV6ZP#iFs5i_T zj0d2Bugl{lMfm4mh<0i-kER-)%B9DCGh~y}X)(4uJ(+oYz;MjSrDA`hQz3 z?Bq~rMikj>`si24xFp=0{njZ+7E0VY0lzGPnsrC|d0qZS0^hHpk6bORYIGEbn712pAwfn=ICu=6)sOE@0D#rST^L8+PBZEp2!`+Q3<+@k^dqF!1FOIb%qyU0V=Cu0@7(V17XStz z)G;4CGgR~6u3Ca7(ZHnZjusoUu{2yE9`W5od8}9`O@206P?0LH@NR?w!`1d!*g#q>d51le$=AWJyqK@|@%=3?3T+V!)r|#BAvoV(!k&hY&HX``6j|m?noF8iH7Go7 z?A|NFaOQn9Ynupd0qSz$pqT`mLhqRYQ6WNP+qqM9`W4Nml=5}IQ*xH2nWKL8#069? z($KCby(>jsfDTLe?^LCo2o`;wX*7)31@KztA>CJ2L1dZ0_EF{+Z`7k6E@ianmJ_I4 zsYXMHv#iesQrP`w`;yg|=uEeGtZK;W!K3m}V`pzgQ;|r#YO#_8@5;M5U~$s2@Vo#c zYWEHt)b?8}0;f}6i_Ky16d9(B-M=S9?0ps}=qO<{&|cpEJE?xO1uN+lxC^hlu_%6h ziTl2w-xU5Ry7TE)%?zF+Ce~wR0CwjCQi>Z$b8({f(_j|>KNh?i_cxHf*Hmoihlvx` zfC5NwbCGv(K?!sTZEzU=$vR&4_-SPT_#V^++axro1ckGW>WVyjEN+5tKyhjHakoIr zHu({76;4pS_aLL47+bFFGXy*U;U*T@f7aKxeZU#a${Pwsz5((5&kOX{40um=>ky_~ zqVfHo>Ovg^8uj=>U%V~kLgdL7?aiV~l^1}cWpAncDnO&-vUfn|ss%F-0CxSGfOZwS zrvmpsly7OzIe?HzZ(e|KY_W*-0#q!nozP;$N3HJ)GU>^BGZ%@Z^|;_N3_&RBT#9eo zmr;{)dvDl^9HdP?r58m+vG=))Z&!8q@yX8yVB$9Xd%LOy+&L(8+*Yl5n{2@GCK3Q) zCo=VuRuMeG9~2;rgFWZq?r6|qQ-bH{0~)I9O%fW&F2H!JkMizeCJ))Z#cXV=Bd5cp zSt4zVT0>*CZH?f;hNRH@8r$15QhsTT*iq_#59_9 zHSv4b)xaZ+U?5}B09WY^JnKHLS(Krn`@2L&xt*nXuV1aD*(5dpf&x*a2@9Pwi>_oN z!ZQNSt*4yuQxuy?qiRMg;h?HFiL#_uahB)uOp`U6mj^1IP-50mWDmTk0N_I2>omJ9 zZ2(mE{8ln8sVBA}%H&?)8A1}Mw7t`~#N>Sb(8WR=xiGp8zFVwP550XE*?E|w3u^1l z_!FAY;=68$yfHdGoj1M@(c>X1e-!A_&c3PXKqG=^i93XSl;^Hg=&Lnl&1?6|9dK2A zJks`D)Mdqy+aw(9kflL= zGr)63RcgCyJq26zN9SmZ*8Th-DVyHTfMGmPHo6z8bwR50cIl1C?nKM_GQz;=5)Z7< zj@#^*lp(Y=yT(<69=H?L?h9fjg$t1_<1D}3JJV>8*mMi+1sV#CxmGQHm7Uf2f7|U0 z4BY_0jXiMfe`(!RdrJ}TXRoZ6HJa5&^robhJ`Kz_aWRba?2+A5fWz9JK2siu!k*&ZWDTq(@R`WzeCrOc0Yzd7_t0cn7uvOW2^MohG32=##64%=z)8p<^sRTm2Wo1d z!Nv_ilRPI2EKMJG^O+lzHz=&MTLQt-g?bPf!>!^ zRYD!ikd05^fOFs`8=1D2zf}A13tW-uh0471o<=M$yAMA@TPj`D`zRY8v8OID&M+sW z28CP70GsQW>w|SLgC<^fdQF7S%d&mjykB!PQQ8Pc~^NNDEeaF3AxQY(B`zWu*KBh26t*%9q_8HT%TjYEg;?X zJGT<^{&jMt^(0+7?uy>oWWp{q*GmW?%Nm$t2O_ND0@ z&gaW!gcj_`9%gl&X^+d`?%A~WS*`Y3XUhb%cSKLii%N0qQ#$>H$s)(v^G@@4qQ>8( z?dla(Hd!ty1Kp@~lWFVQb7hO8Gk{oS7zn%ADUy!DYElC1b8Q{Gj6WbTim?-Iu$=9SmymPh-qzuS`|u^M+EOWNiK!hJCx zWsa}EdO~%O9&&95M_kA$$oJeLb^9g0;3zf7_9y3e1 zxOmqI#S?mg=ACGl@BUa0YPzz&5c6HYO!~It`1A4a3=MOK9h&FXj;E87QJzEj1uk$R z?TdWx&UkYWfF~C0BVqNsa|N}PZH=+}!f^eTdU=yx)6XeIFS~PQ z57jpnnMEyXKQff%HkdtS-&t(F4Di%KJRm# z07C}+a7FFgn)qn>1@z;uN0O=07Ztpcl9oaGCrXL8<-0?s^o#{UE)X?Ib!H zqW3RG!ZQpM8c=7_wLphefUo-Eclx}xy=JO6a5Y=%QV!pj_CN#>gf;VSUT7 zT4(0;Sk2QfqNn2n*GmRb*woPm%`*GlME;sJefXgiUkm-TeNwX55m;kR=e{ zm7Hgd@gT=peIn$VTMHz+2=@8vRO+a%y%0BNcTOUNz)2cem*M4A3L&j^op4u-z2m|! ze*(dJi!9H+*{<@yD|^4T?Ymp5DD|oQ%eKvA$<-~a?yK!4BpJHf5`)g@9@*OClsM;X znkZWwnDQ%;2F?({Y~It9VpdQqF}Gm}&UcI?=1%EsvPF-WJp=N?Gvlt;vs4-EehRJh zq#n=jVw)odJ`+waUO&#fqi;iR4>K zq0>@qLA<*iu6rg;6n0K)8BcK}z5O$x$fV6Zxk&Gpq};()?|bzhf%Kxk9x6KKCHDP zC?$1rs*)O+)?Ou-!<)lue;>!Tpj#8acBKBEpQ8GAUnVyT==wF7G|j(d+av;+7HPU7 z6lboK&3n#wRxv`OpLF_)tQq3{`{>ojZB2ax{p31TQX_bZvxSGneA_SStS2^3Z1UW% zstz98M;b5 z4V`L6D2{6>L`P)w2{*|8L^+3Tg27H&J2MSm3gk#uRc&o2qAgtV?Ax9&Xua*(wDMQ* zyugx+Gtc7PtH`npI6a5V%nxG(NC@bo~h4{K_l(N373{&AdfX=sz~(WQF~ z`C;D3qfc)O!I!y$p)7rY8)}ivP#MJ2SofFIERBinWC*$HS-Km;V|%Hze}-D1Y_?cRy@GsfX8e^)`~|)-_I4ey`E|$S}wK>OnVRsC){QU3&ig%fk89 z9+aT_;8I1f)OE|T&64(uDQVjkwQTRVW1i3XA7Z0Er6t@6mN)gB^sw|9t`q$ZA3af& z*nMva+dMGDt_sWD#Sn+V|BvTh_(9=6^`9apXL(Alc;&QH|$W^u`;THLY zJ@&BCKH5^t@Q|&@$GyJQV~;wNg6^9dtS!PtUnnXGqTsdvL=yETjxCJd4#QL4YO0=_ zY+lu4zxjL4xAz4Y>~(p94eiR~YaPF3+a{`iqggszKcNf3VIWEfZkLi|7{pL3ptH%h zgl|ClWejh-{?wMqD274)?0RGH6WiAb_iY>GLkDyuA9oA$H*9}J3D@UF#ahCeKaU5D zyX5OUk+p0;t{}&v74h?vOo+W?neVeqV7C3j=eM8JH#i#&p zsIo1f490oV*ms;D^7~b~*YHQ}nyz!hf$seB)`5oE;~jd(wXjhWmi$KwW~ReORnHz_ zhNaNu3pSnnG5@`3^Sddczj1et`8RAJ?mRtc-`ShH!eVZJT(DiVf-TJ&UhWW~OSmm~ zl*588+p-^^raBLd>;Bhw(8yPozrAtC-*W}#*~o6R2@1HWdMpLUsEV!79y(1K}{ zp@2(~KnB6Lk_Sb*{@Ll%(T2V?Poy{)C=DT0(+g5E1B}Pgknv-7Vp0M;?2M)6+FtUZ zO0wgdD~c#9o!)IKFKaV9X|K`p7yIu(LpRh*E-GYvUAUMrn!O$;mf6i6BNVabuuPOx z;yd4~bSLATu9$KEJv~4?zn?15#z81QEL7ct{UJ6Uk-#&oOEFfbJGIC+$JQP=F>0B^ z-OAdM=<+!&{12@ICWm0GprTn3i{lKY-mNOenPjkVv)Wuj3tYys49wCo%-dBITblmJ zFJzn&Oq>L55eks z##=E|PR8o$iR(Ihw5k`Wj&6fqR;3iP1zrL`wi}G?Rwt)@IByX+?7fDYf z&0Uup;g%?_WI&weqp^ouN%6cCzZkL(1OUka?yx1ph))=7WBC+OI$gG~FP3T! zsnx{^xqOFir4=;27j>c|^y>nF0|u$I%UxdQeBXEB%8pW9+5Xknt{4i3TSs!!!0tDN z_9&W9#xpL6#VfWqe~$U+_NZcC*6N#@d2Ckp1hHqv_`m$4yb^f1;9p$1nrO{?l4S)9 ztPjas>>JykueGj&eFiPq<+RTAU!C|Ck2h^$WQ+OcQy>>4vt?zH=(=5#>Z=Lb%80}d zevC@bx{JKzW6cR_zv`SuT%WR1*En4iSerA5Xoj^zY}5z1as%%d`@aW5tJbC}HxgUD zp_}t0#mm^m+v_F$IA`y4UO#D^I}Gw38facK6_as(?NaWlh6gX6+U7*TTjI<1

1G z>?fMVS5=L6riz3!*G=DKZ`-aLS$#S2Uh3A0-(Pfce3&OkV?F0Ppio&mdxR3UmYhig z-Mws;m^aE@K$GK9N1iozy7bk;R<}ZAK0{?>=hSS2-%#}NB8iMd0F&(c(w5O(c=b!X z9miv-PqE(XXH2|Lwu#Q~%gdiT!t9ET-Fzv3uD`r~>Sw|UC%c{jofuP~M|Pg=Hmp2! zddG{&r=Z6dmhg{UVmXxJ0@WyTby}MqxiooPiscSC;lFu4_-`iCSk0^ylY?~5= zECObAr?;BqIWTi;7@d@$j!ezWuGtiah&<*;9|Eo>)SY5st={X@P9{Hd*u~ce6i)k| zDKu8D3e%*ZE|ynEc1|EK+|jdQ!=`P%s7?H;U*6k$KajVT(+DAfJMRPb?S=z7Wq+|; z402n$&fIirj&d{?sC{jVEY8R?)%b-<0}&jt)LL29F|%e2A`ezkGh$P19NrvbP@Itu zg{Urfh>PbSf1KjRz5+IUxzK>8dKQ(ata<&p{pS$py2D*?%=jz=$k_heqdN;W50qF6 zK+?(?xP8)q?60avc{L0Pv%=SRk6+q5)p-yGN#QP7WF9|+9G5+U5CG*1$M=!~Y^!X# zz9z*E5yPi0-6Tt!nKy<2F?M<$?Kbo4ri7k)>6?P8tT@!D;j7B$=C@L++?hTPz?h zoVgI8&wRN)`ED8v$4Xa89u=li+np${-`}z=Efacsvn>w^y10mIhlNdZk0**LI$#R0 z5JsdeJYm*3V4l&8m~WS%J5kIP#XalrdcN5^qfGV?k@l{Nt!Xho^3B4!e`A0IXE}u= zstw8tjRZ5f)u67PiErx3Rm2Lszs&$$o8E-+`vtxfGkNnqI-uO zU+y9=Wa9UKLY%kv<@W9UK(zh>GJXSRsb*R%4AM?yS&__&P%h642vmXE8z;TsfUoB| zj|xHkVpX{MQ>3iLtP+L?e1$uFT`i=vj%bQOv=iCyALII7ib2FD;M|x+eJTJBb{Rwa zQcmXu)@^!AEP-5k9B0zJ85QHxlkb+$jhXDaE+8al^NZ+q$7}t$l44HLUB#B3Tczk7 zlW<1IjD6Z0mv!160YyqHn(P$*wW;U@EI3?!mAWp<>w3-{?7zYVi#QjMdE}5fv80xl zj;-fP)jc*bb~bT_Zom5_m&^+iwq?AU&D(iMKHUkA6XOjkyEQC~>_WZGe~|f-V=kXH zlK$)cpGK?D&;16lmc3`F$c(0Y6IatlN9z;n$S7VMW5VIynt;RF>qQ&YUA7Zx5(de{ z>cRuE&Q8wx9lAs!=Agwj3pfR=T^L?^RaSa-9aI0p_dio1+$r!+UKU;9Rc=}4WmbxK zfH@V{n(2^uE)$K(icr5_b=WW?n;WudrLGAtzQ{J@rob4&Gtt;j^>ZG9mTL(l)3-Nu zWmPYAA_B4CHFI8dqWD_!R3S_;A%$=B8E^R{OsSm8UW(?W%`fk3i?ExAC4M-OJ#Mn+ z{fmwc1!XG^_3UbIiO)j>lV)MhP-@iT%~yNOx$bbBO#elm+wg1TH8rB zyhbst4wQ#U@M2v>mdtqVUTWeeUK4s|Tp5~wCn{XDy}r1%OPgSU55SABbxJ{3K_5y< z{Gj)W?EG>%r$wI-WmJ4R{gr-JR7L7=J2L-`>yffGBAQpO!qms!jn^+-R@tl9 z-fX=j+4d%ibV}U$C}A)4cJOsc9@o6Wxf}u1+B=tGylOp|V5V50c$!|vX~=4-=My~-%R!Kd5eYvLRn7jJ6> z2WtCn=3^5s#83yzKT`YD^rtV=?St` z%P_97*?8jjwR61tR^W}t<^Sp0;HXjl)!#GC(2xI2%>P|yjR5j6^*O9BbO}5v*XmAn z_WOuFjqEsbt+N#UF6Mrr?ipzP!H*StDM$i#{Zn7Z(v+_Q?oI`ffbq1h}3ErkiOwpz^(by#t4W4 zv_udA_)=M`X-FGJ`+gV-5IC;p=D!Kac|KK&<}Uf5}ssSOJbE7E=Kl zFA1lOVDy~X0~iivWnJWdsFl_pko&s5HOq{K64FP|c!)U=BjL}lPyDZ!bfEby&b&8c zRRH&(seH4BMtQofKt_$%#E$ttpxj$9*ZWZbwV?beki5+_iTZ{n*utq_0No4u|MhF4 zQ?LdO)xBLGV+H7exKs;ba>T{d%Zc3wpb}J-Z%F>@^EyEOm`0VswZ{c~XatZuf)s+5 zv+b2t1{nkSE}&Y(fL3jy{@=X^z*$V9NITz^aGDseuqu!h5Bo=Y!~Z|G@c(Hj=)ajU z`kx>7ucF)k@944r`DFh)o~%$0nuJ2HF#rCX1*CeTQ-c5e*gyQg`rG);e_7oBaWL`! zF!=C)cAx)_?(@GDbNqh+rFs$Q>x{t!{od+aJUl%7WKhE{N5owxA}u@n{5qW{oO0}Q zl1NdKh-gt(o3)M8;P6?SQNHC+jg9A&3Do4gxl%n-z83t@Z*EAd+13GQOeOEXzTy9q zf6~SUcEO6fhtsC81{JRd{{&qhF|RL=3tE0<7}b?r2@g zc>qMGTF3G?xBy|pCx65T!zeU2fJ6)-Acv6Fwq^N%ryM`ro*jQ8{VQ!3m=X6MHIVpC zfw%q!2<>a2!FS#az^sL7r9>uqKSO|TE&#QZe8xN&NP4aTYLMX=1Tfb}1fo^YPkeWY;D!Qd?0mxf7fWFtYfVeB?0ZHugJ`OR%225$f4a(^C z=032Y1<|IOr-}j)=qsbS=YM|W0ZIrm<^kHfxZD}K2=I}2jH5S{hbs2L4s_&5Zw-WV zhlrHpm*9c{O90lK^{%M-1>l}TBtHNSD_lw|zJ2utrmD5_r+(mG&_a~%w;ig20o{JM z0Kz|`yKaja-vlfGb9;0wp9rAZ$(MjVp4C%d1JwY6yYqt}a^2{4AFZeCyu1R@-G%&n z1#|&`nr^q)zzEn)s38>W_Yu;D;F7`(CZ_xOL zhm>txQ`XV)jZh`pWmw^37UEy9OxkiU|-A-R@rl zVX&Z6H<6@9TcYy8Az(HK5}aIK0I^2$>p9>yoU>Ct3@GMlZ%qnll<2&E1KPy%s?`Sq zn13fw2yzHj0AA6va520Iv=MNx?NiSgb6mlDI&}>dLqS+GdMI@GY-`l}RNv5hDMA` z_mV&xT+HfWeYy^FOnbwifCL}Ve@i%IrcWf_2z z%e|y*RII{)$`)f%dn3q6i3HmruiB84Ilz`LTEy~Cc@zEuBc&g{$nY@-)TtyWqAm4M zJ}_evGN+z9=VUq5!GuZ+GpFF0>wAF`l4hVlIS6CW0QC(4itDOzbjIxGpvS%ewD*#= zZ|p3fDldJ3#$1JimODyQOrj$4`6<|%)p|Al1RZ5>BqFc&AtY6x^Kw<{<1R2ke(!ac zSZ0GoFljar;HgX{AwX|9o=_8U;K>aN~*Lm{G6pWM0+EyY`rH1{_41{cDoXd}jgiU;YrS}~t z-_pi^rtuJW#XFaooe~L*ckLP)J(lm0)i>;G$Mm#FtA4`o-K)A&ne5BBp3n#$zVfYs zesZMBWV7Dy3i|D~k;y~@peQH5P6fPEZ1(dzkk z+AZ+~n|T|>Jsl^2$2d4!d!JA$Q5Ty%XNPxw>`Vg|%3SmFNjVzthJe%aGMdzOaCRqs z4-ur^+%^T4(*(V6$Hv8}ljaZIZeSNEu`Br48UtGa+G|H$Pm0V7<9~ghe&A!Y5w~s~dnWMf%dQ{S#3_Pl^c_jTz_1Ts>klR8V zOZRaHi1X0-N$~pYDf~$<{q-qT^AC~(CTmQP^Xr)J_#7+%!$%Ealjc$pz6QdA|Vgt=XoU4Ma=T zW4)e*H0kxYiO=}2?#C=E*;Y{5X6mN8$aHr-me0k-6%OF%vmSGQ%?kISm38L)+`@{k zrun#AJ!#$VQ*m=L#;fW%l^zBU7UDIi=h;V^|H^qiy{)=EbIkdezB?rhqDN`108VT! zg~4f%PAqfRmvHaI=^KLV@F!-q7LS?mRAsfYfAP$}n8xA#RrOe%sa_*T82S~+0N{Ge zEAzX<=kJ0m=W-|-&TfJVj1iN~wtpVHebigg4V@TlQ}H@gNbTKQ$S-LrN&>Q&V-?vK zTT?%|QuEEHvmPhoxkGi-Z?R29WADo>NrFkI3>9ygrayRVOa!sWkOGFmFy-ovl};-o=60DoBa4O)7UKq`i!|1ZBNw3Nu!5Xb!_Aw)mhEDOIM{Li>n`D0v^{LlPtSZ#$hb_{ zC)ueCNqT*Yl;6}5TKCBMtUv<50%hy_LYb*OFH-JU?zQ$bPDrwQl1_mdsH{kKS4i}j zIc)=>NG5&7^%6Z8%K7zX)}Po;k~uS~2&37NM{+8;5rw(O8UHq_0cMg?0eOW2dAFd< zoa>j6J>eJZa56SJgF9hT0oSJJjUw}#HU2Ea!=a2g!7Nd8_glyV#)_u^UtP*J$Lj?e5@OaIY4WF zO5F2-$sZdx6f?+?RDm*<6WydaWjd7RWz8QLkYL>0U)pE++P2^}WNk#$16+2aPvmSE zl<&Zez)>RTj1@|0bKM_RboZrzu{^{8Z-`u-Z)Hi%4xCKB{!(<|Yd~C0k1n?9vp1XV zlQX!LY~NrR%Rm)+xNS(1w|e@4J@mrjya?2SOFZCrgIf+pd7TRvq07tW$H@a+hDLPk zbkmb+Jn}-Avl0Fm-+0?K-ra?a)Z%=Z=DxW1+z_Q1Rps^Zpm^-U6!X_G=piK|nmfK|tx05)lw7X*h_qgh(hM z3WA_C2kAaENC=W5f|ztkx1@y9ohooB>6m?d-tT??|5@LBGvCCTS;JaB;T%E%M0 z6C@JuujJ`uJkj712ey{epT9g$r)=n{*$j|W8q#@z!djrkqhy$Ho%Ry5@tF!OcE*Un%>j=|Km@5u-sRoGbT)!+oNQ6y3(}i|L~H zU#i$Vwc(twcFJ?kGN|egNj?)Ei+&pVA7^6QH9kL9QOt+LE~`&LXshpuFog97OSBw$ z^EiLmSReX0i$thH%@I+1gI?iD+0iq;iYbBWEuC#u_avGm%a_)N62at5Bg-Mr!x9ab z;StFSHW&J?ZzKetIfNcJiP8S;%1?yuCzmY@2^T*Gq07EIzjGO|Q2_@G3TmfxNN6vQ z_RC$K*wess{A2N->rBn;et?21>J5z&vf#3s71lZuZ58GNU6qfeln(=LdJ^>-nQ)}B zpWYjFMY#78QFcJnLo1fsYX*$4yG`<#4<2f7JST=E`hX6-<`C+r9+Ff>|S?cGpxa;$}|CRGaXX#5!^8s|` z%o9;Cr`n0Itxuf$3x(c0)kKwdo`jrquNiWqchM#(BnrsQsRfvMJ$I)q-@-72Ui(oJ zT6u}>>c{*I;@`PYYOHuOITD7Xy@u-Hn0wy>{Wf~=>tdvjZ!nE0lDkUN2J!d@12m1P z&sI>roOa1p{Z&L}oECJAs)JYHT=F;V8K#>TrfDsi-f{#Ol6`4~>girMc5DQmueQa6 zvh;$vnu^X-_jpQdC;ghBP!Ff`MOau{v22RL4~#VeXO5scbAydjX)1B)#!NNmKh+8% zy91hSWlWp{gGjD7h)ncUPJUQtK3NJ6-6?$Ybh1Wf^7`qHpN52K3L`|_1hQrUX6B}c z9kCc4;~)99c^C8fd(s*z_(BV#sIeS3A|6qXe7M+T!$tDU_{MXu#$d9Js3%z>F87F< zW}(R>*6vMx!PKErR?0&ZU#Q!s7uP;S1y7=;4vLkkaBaFWztUBGMj)6nG)q3-pGCik z`ETp=3UO_giiz{?@0aHCQ|pQv?vKqcK-z-eCu(qXnoWO;L!O9NYEIqQ#2bBuIr9*r zZXpMQ+}+^T1l|Nf(O6f>(np*ZUUM`{#t;SQKCr%`kC~H!Y-(7WKd@s>II?Ex|KXM}KJQZ`c$8DOpbfb>V{B)+#cQ=t+xrgTjei|OG(RHY7c)hzv zF_}4Guh8)93$*MVcAj}$<0RYW)T;eP)@X!&XFQ$3Tt%0;FA@DT>hEs5a`u#e$W@hu z>1o*?&u=6-Q)ABkptrJfY0`P@{j=zcJazgTw$PcvAI}VJZV!@lv)9`tSv0)6Mnq2f z`#aT&7&p5~WSiMSF!-V!Y3CTpOAi-j=|9_EPOdhRCLltrxm-~EMc+2svtIjh`AT4B*ZaSTiULWj z@1tiWvZoSS;lPSJ8a&4wsMP6tes|m-s(0DZcg%hF+Hd_F4zNGX(;N8TSPYl{#LE5; zf2Tm<9ehXWKfm70lGe5u2Q%YxKV9wr{Q6mb?zqpEQZPwyRn^|L>YIM@H29F$vjn; zLg9SxotibDonb7V8}#j4+Ne4!U!1tDr>AFg3x1zrU;m`j0l^*G9cXB166mQz-4e>7 z8)Bdk@)RJf;5ok`0x*XYIyWwrT>eLa3r{&uJ{El^6f$d7e)tdcLHtkt$T#WD2Q+R{ zE8SoA(=F!@f3LdTnb`aA<)9)u4ohb^pT)r9dL&Tub$p{~^y{Fc)6e#qqhMlF>t0JD z6ORlA&yLyEsN6}d8mkBKzgIna(_Dt_R$qFgYt@+az{P^v3iohDc>Y|TxMS?5JNQ~T z`a!b84~g-LJL74dru^+CJLEeV(FByWu15p{73I_y4cEV|dosPX8 z@u`!viE`{Ws_s7rEp%>DW&8UnV%NPq7#$Ugc78ZPX$);1VPRpaWU6AFsS;CoRjnUdk=HbjuYKb?E=k*w zY!4Uoh-CkJMQ&Nk)5nq-$8{Q#V6;?nZ~Mfj%jET3Nk~3*34h=H&b-%Ycb$69dY^zQ zefz+5=zyfQx`#4%*Di`|()8b6%RTKX3i^%ANl?*Qh>$*RcOdw*rv1#MNFm$1jX*$* z*=h6j({h@@p*m%=m83IVFNc(Gx--RIsL4=xN$|O=x-RQ@=tR=Oeiqt9(%#R7x}|F* z-G66&^td&{>*4IN>Po%pn^L7w5>t-8XpTqS%u)EQ_w2`yyiFkx#;uN3QH+Mhpop-f}5=mrmDem>8?vLU;B@43<4rWzMhsr0PJlV+0Ss&fJ zT#lY4_|);Ks&q0$?)R7P-A{%Ser$}!Q}uiqQND8rWcn>$j6UCltoC-8C8r$4whF|K zPPQwXJQgo;O<12TremKR^BF-N+%fd9a2qUQ5n(pXleSk+E-eA!Q{@@%m)Q=JmZRAD zC(q{ov^cG2iY!*{uP)N>H1it%G5XhqcALe3>G85dm0Th52`0TTjMA6PG))iytbc^}Q!O&k9U~_x6Z``>76-7ijF=<|Ypl`BdZLDq9bp z{?egAr}WcDrSnyBs*R%a4Ghff<9D$Cx})yNSH-3KVrrIua911L$Q&kkGk3vhIijd@ zx@<>!W59AT34XxgaoV@qS*RH6P>OoKMlTXBl8IqMJ&Bs3ad1s;}7CP0Aj@Mfqr(&bq^8J9pJAzZ;PWjO!vIof9u8es! z%i-bGS76turlS{$U+Nopd7Zor{ZqK|N`3Uc>1X!~8>0uzE-xo@VxBeDtZa)nJ)OnN zmp1NkXNb<*`Ipl;{uAqj;qBmoU={9+c3E^=o-b)L4&Z~)7}S4V2kP6FUD!~4vF%Nu6oyh;4mJp$3^|HO}UPD1;D5(Nj_&7LCH%A*;7+DFm(AF&97hE0F_OOm9YYe_9PBwANEnW zhV$HU;Lh-LEagOv;)-=@ckBWVc|egtBIJIvD%=Q`8QdK*iwOQ8b#X$8A07a%CeS8; zKY%DF3x`zTa>lp#=dkP`0MW)((U7=F96~||AEF0n<{adHHc(5#4^2yi|2;VldHk@x z#Kg1T{AJ*{PzfGIqN8yO0A+U`cPs+F?gZpc%>mSDh0+RhU>LIj|Fi_kVz>&;F6fn? z8@zc8o;gL*3HA9O0bySScEb^vmr4e4`^+!Pg&i*wz_{eQG#CX8OZMRmX^xMCz<4Kq z6kw4tK+NM-D51d)|g!aQ%BXs}>tCF9EZ%#FdV|Uk07`l`34xP5hwSS%qtFk3tH;qn)|uOfLg^p&ft- z%6PcboS);&92m;>eBdrNV_zZ(cM4jWQ|v@=a-eb;H&uTGgvM|>5fTfIL~5nqp92qd ziOwY?ewGz7=r+X}=?t)H>L*qO^9GLEBN$;;0T1B^@qH9Mytwr%*U9GcWI=l*^YjRS zdb`UwQ~iOx z%WaE_wT81t>UB^mrZDlN2*&SK%?_A=Bh@NgamV(xIww9DF!#9hyL2qN$0}Co{JJ%U z4aaGv07g*APYEv?_t>pq*h%Lx-vX4JPuM0@o(_YUsOTftM$-X2bu7%^aul;2%D2^` znj3!#mLtch=IxQl%(gF1;A8Rvd>#tMz&mB744fNeAg7}c`1M5?3@r_M9|O~~)594w z21G>7cm%Bw`zQyXRoq_Me$myG;2gDK*MbD(T3eUM;N4+;syrX!(r$JEq@EPfmfa+&FawTWPLS~5ExP+B9_<5isk@UkUPm7H+d9U;NT!gV z4ffzfoti-P9FDTgFcF2~pIXMa?_LaAD}YHkdlKvz;O!fni8#W!p_D2I{@szid9*T~ zn_bScOH0DiowH8%6pY| z7Z?$^kX0CUSetR081>IVu(VaoWw!v+^z5rWcD6fi(1Xob4$N))et7ZVG;d%iPWxRd?&B+crNgK;(ZiN1&6WL7BMeezaE>WE&!d!B$oYKlcY4eVMDT@eyk z^*;=AZE+N}z#6Jmg)3BkK`$!*&^ItYow0!|#1YhFqC=U+Cv(+J9zvMyH;G2=Jp;&~ zS{RpCcn3xL&ptmr7hS}Tpm-B38>W{Rm?v~}u(KokPLHtS7lIsT6<3-oad=Cwd<3DU z2qU##$((G!F7MeU?LDXTuV;Pl!(G^iMJHiw+%i~so~(ewTe_VfVoW~b#+@j!pig{@ z!;Nqtrj7646X@Om4iCeD!yE&JlY z=@R&+y%`0n^ZDnzw|d5HM&%HUu8MG0a^MgF41H!XU2I67C5m5rBmxfb|JjTE@5ISo zwtvFnN=Ms1Bip})P$8XNuw5C0{Wy=~zG1c>nOHNmZaK&gBt1$bE|{QSNrFRN;YT8H zW#TJ?>3IjW-}8YuE(dIyWAt4oF!(=%5p>V(MCxBw;tsRY1f21Z0}#>CCnpeFodJ`5 zev)wnaP;Ss6IgGqV5b#)V(QHQZx^DiyNe$RJVMt!+{q10pgj(|95o9d8-vLF`%2{! zd#xz{<3oUu7fsr741l*Ahr&4JSHHdTwfLn^FPam^BK3|Jdz2_vWLdw++hL z*u!^WC@{!AIo*XT>|(2U{d(Sjuj|7@L)rc|b@fU*@zRs%MS`87#cE zm3CO1KcD^iHP7)APPaRyVi_qgF%fgI&|JtYn&!`&tkT(IeeP`98YNFWig4HA<1=4EgsoB`0w0T*H`VOL&}ti;b50jEI=H(+BA z@O>a0JHaT%$Fl^vr~;gYP==bxjXJ7&Hq~w`$~=m*0fZSevYo2lK=9Z33AUxk?k~MQ za;Kc?ByGZ4iB3fbcdu!?v9G~f4flYM=k-ad*HtFP*&klFj7P|ls|e2i!&OH78RSQKzlV!*GwvmzKS%t1_97um`wD0I=Wud`lQr(W-yk%KoaACp zKSiKvatN8AS6DmbQ^t=}*q^8n}k0(gG@ z={b%0q~vx1t0lD_c)>*c1DllcRj@mIXgp38y5mXmJcjwJEsy-U(4F>wQiLaF5kl># zOq?}gEroU`>o&}}++Cp!TmdVgq20Q3d_BktMV`1ye*$}$V!UsGiEkA=QkA*>lV3jaZ( zAv5#-iOO=4GPn*SwDyT56b<}>6Ra^~anJp~anA?e=0l7B0io8`Pcei)YMydf2zS04 z0~5x;f+Uld8zT6`R@|&5v)42Z5|_wWx2BShHyYoGpnAXdx1M2B?NPn%zQz=KIC@F! zE+2U-96$?YN`u*7!rf9$11}tj1eBHewcS&HA51kc}NWu-*L)70o<6V-|t2uRUVu6-bfX zaLJSw0lQsDF=MaG(&|iFykOvkD0>o7vqVG7ucejTf3H*kLNZ*hNQfR4`=a{mQR?dr zsi|xB3CR%0We+~%v-c;OP$^zQEOt?0L2hI{8!baQ&o!9-{hq;ka4j_>$-yM4wdjq@ z6DmH_(~{jvTa#wK1+#du-Gy<*R{DMBbgGQ!9hdkA#}jiOh%jZv;AAUqgs8z+@aXng z8u*?Je&{RiQ|0?-Av)fydI6X*lya_q)E7{fBqn^(-0d1$X`U|LTRaqwZFbG)b*zv_ zToDTE%nK1Ae6?$eH}h!jS*E%CSgyTBvUaN~j=9lB0<)tbHeM{0kw#;!u&#M5Lop@; z_Es`(%(R}ELIR2k`qXI8UGy7z?GxNyPDy`K`Lilt(7t?6WPbI^UCw`7XFs{5)>J-~ z3qb%9$$87#Mp=A_37-#&Q)nQ)(!pPrs`aG;Rv&||Wm~K))QW#|SMyuOv0Q=kjC7YR zE`_@Na4+j&a|t1S__d$=bS}@vlYDkfo{7)~0!lQ&dUrrk*6-f&X2~_*{kN~9ez8pD z$RZswY~JM=&DFb!{o9%+-5W#bWQXS`N}fs?h=W3*e7N!_Bs~c%1C6E<58qs1HX@T> ze(ri7t7I0}PyQiI^P+5Us#Bs9VUx7B=LiF39XsYnoEQZPYgcWvU38`DO${<((Z~W_ zp7=)0wZB>N$A>=lXGvEseekT(BcLnagk@csu`YOnds5gfvQWLp}w z=HBDr8xI_p9(QnC?+UaJ)gtVEiO?k2bl{|)J_Jh6rq|W0YT?Npb1#aGJmUBVk2#dP zV^bSO>h}(3hr9POOts_bM*W@Sa6LQ~m{)Svhsz157j>|0->B<*T&7WO@~f{Fs1njvM7rT#x@v4M7#D;yrU z%`U+TOcq_heb&76b|*+o=OK<>!J`#bnShCLphH<=1bUhhK@{p%I*(M|rF z?<~EJUIoitg4&)YN!dG5isnHUJ(5@{F(78jAsruPVYrH3Gm~}72QgwfG-U~ljs}MA zfcC5P4|Y-(t`_3Xk0pbfRc^2^73LgBHd_j)?pdOAh-geu?1xfT#4lmWf1TJ-`7yuU|#aWYVt^|-%D(=ll3lUB_~Hsdu_ z=V!8}^QnA>6j$5q-bA;-O#3;QRj%g-ilYY}FLxn@EjqarzJn`al?N4(oK=falB@PG zbUpMW<2Q-Wx;N;(4r*UD%9Ag`JobgnHFu4f>fdbZtB1l|#7xdHZr$*feL{B-kn-er z5lY=uYO1-$J$;4>d%M9b_9RxLJ>8GSAqVFn3gz}==F?;iH2k3lFL)X zU1(Op^%~GVp$p`3zSm%qJ3rGG74U=mH&&!oTJ$_sXFF9LJ^gkq!o+(^R>o_8_hhq45+}7i7SV6OXU^eFTPW_=+#F>)e{a#;2-7S{lsG^) zviB;4`PYt0mD|0G6Db_)6M+yV|Hf?`WZ5M@@Z9^kf7K2w0NK$?%7!3uTB|R#IOL(C zsE`2@cSwA<6*ZJ*j=)XU3F2o(3RppVR(60Z?sW9Ld_OfwDNdYp!V>PbF+FTK?lvL` z2f%;tqco=dv~^TP-N@&#?h!vSB>?ES-zdq*mwI8L|6Xaj+#f74Lj zfI(@7Y1w=LS7L-yr20v9%N*GHEK_Mo^(s^~raE;GtJnQ+eG=WZM==L*oE3gdj0yJ7 z)DVKI#0_59zNsqNpxBl{mj z-2Xdpq5n115>8Hq1x|6l*^dI|ajVr}7xQ7cEZ)C_c-RNKCPya6zT)rkuN;Ctm1 zY}_Lj?~^09@e~XWiaGeaxefvH!AWRrJudnlasLX15?bis^Hp&7RNOXoI)*Nt<=XuK zp*tAz3s@)+)BX}C|6m07p(gM4`iOuOAuh$aPi0(UF*R<*0motd%5TAyXjJ<+}6R(MPW%$KX-pnq2US8K+VlfNTl?h5l z7~!0WgFnP_*l>XY`}Qn<@hv3>j6+V`RlMMbIEP+1OO0nm$$Z`<=-asAN1KHb2SI*V zo@~Dh%W51lXMLfWUj;pPjXA0f=4!Fvx?CPA(-Z-WTO2|yq1M#sX3{R?PDZl4feo z2se1+i}%s~L#%B#H1t%homCxB!2y~lR&~E8Yim8=9UZ!I{?iwZ7!9FXJHA#MR?DDxh<4UwTx z=$@ao7}HsJ2Tssv|EMn!fX$B+3!632iPsID0V>`nxJDsd=h}(v6y7c6tr8q^D!HgM zwe=bL^SkyL8$y1!6}=)Veb7Q@wdI9*+&Zxiet_s#*v%oA(vO~i)eTFg2m=~ji8Fo} z*8e?a)FVENkgZ{@v!~VZ3Ut5-iMpmDQr%5*1?aYnw}Vbkf8FVDx=FI69U^WdG&BN( zRWg$`X48Ej?Hks2`f<Xmc@lz?#7>9{C+#ft zHZq7_=Lt?(!S%pF8D(_r6xL+UUq@vE;CKodp63%q5;Pnv zCHN#>iWY^*KkrAIY1g}r3_=*OAs#?lcu%QOX^YEK;Jzm?t6xh~FPsvOakrNue^ZYL z4SitdD^_kfqRvb^6Uz1St+t*M^N6>xxhq>07M5HH15RUpo32T0CwzL zwuG>+1N!I;J%=`>-%}w?8a+!TM=c~td{_682Qm>jj@Le3(2%#abD5&(?9gZ4oTM!6 zT_Fx}=nh;Y)kQ-*7y~9JF?Am0Y#!aNU>s(3#R7TEE7`ILr^ZH&bhOA11MjNrkA;x| z^gceH!Usu2v$Nh0FnreKCi>G>qi25jmFk%?vwJp+KmikUv)!{Wgl+{-LDsP{NN~PD zN2VCv$3>BArzbPE6&?(o!W*(X&gDO+_Y$ytHR6jl_>*3L@pMBu4^H-{JI@cyw@DAI z?2@rfNpZOj-!A^;i8mq=BDCv1IM|-pU)3cS%COoNyiDSq`U@>vnsEJm$?N{PDvK#= zgtHBM?s(AC6P8&GY2`Y3EZ?i>#Z}^m!aKfZVpKJYAPuWMy^{WHb4yEl~C=3wW=$9O=_y z6fmXzd%pEuD8^nNovY$nBrT@{(!z@0)O`!-6){GpSSj6QqmL`rMY!D^a zNRKFi>aLOaW~_ftP7fY7FNhWuVPHC4BS_WqL0e>Mx0zCqJq?WCmCmyHTAVLCGexg+ zbb9@X|7D6m*@hDJcUp*@7g*aJhWqlOMR(X3 zEiCZx$tRTMA`FdeuMDzWIJ@85sxkB$ABI*DPA=we4xvjM7XBIzVXBBh)Y6&!DU5?@zSh8L3#SS32!4(jWmf7VGwovt3^~1_-XI{T zTG4uQ#gTD4%v*yk=Fv%RJFfqRDX)s|qP8^CrHK>l$?@mp@`ktU4{j=D#@%NPongPV zm!Yr~alrkL~TyM?zfB$Pk?U<=NNFscG+) zKS7+y2*ocQbNrNW5Vuo}qe5i)8C`8s1%L4b9_U`2NS@&ftFkCw{v(*?j~^y~l{(y$ zo5TGPQ8_9cd4xC8YZRx^IX-(C$r-f2qT{(%qm^EM#EsYR_9>6{J6k|)O5Dnp ze*eQ{YgTCl+DbplgR!(aUofT4EYUyDf{M1&na!W?&p0ycCA{Jh=^d^Q+?LPmm-dc9 zQ0ZR%5X#Y&z+>ZhnVZu6=lLXTwzvZ=f6>Loqg(5(f_V;YyXz5rF35n_f%a#y7aD}s z-%lMchPn~*@P;!gRk8jQg?G_!5)E4cO8Xi`lhMqK6ko!o+Hs5Y zE`{vYAZOuIJiN3AZ%4B{l87z1u#vj>WHk(SoT(MU>zdz!4XJe66y6G$L^n(FTJhSO z(LT+0d00cR6XVn$vh+D`fH`yAQH$iIxj^~k;Zyl*sn-rnh93AUxwDs5*QMXOlO0IY z)khn_7f~|gyqxofc^ZR6&q%h+^32+a^ED>X65YDI5>cZ@%Kt5Q>FJP!rQhrnW2Skz zYd>4WckxGw{-{dw45csuFFy}I4XTniip`Q_6!>5Dt_s>aG%7wCLmVo7V-+f848NeU z*vSVS%26kGM|1q5FRNEk4U+_k5=q^qA)bv|Z~C$z5JcX4aB_jyS#Q+pbZqOvSFuKd zsL*Cf?FSP97Ss#uIx}sOte&*?bYn;?dQ5ahi~0dH zXmrVI(?Z;U8So9A1e&Za;jFBczUbT)Jo0;pEN;fOJg4^p>~BO9RE*B`Mt_r-qF>%4 zB$Y@a+DSf82_v68Gc8yD=)St$C@BG3?9MKm1iRG$@gxUzYpMk>kdI4yNXZ?OmxLz6 zd4Hr!dpu*)N)wv8>T-{)id)@@$3GcX0C(7pYy839+82u-nPy*gm?S~2ebXNz%6n?5 zY^%>l`07!Q^Q{XQyTGR+F=bC#r8ZDplOL=5Ete)yBS=$39pQ~f#%#r=se&f6w50z0 z-rpi+P(EBty-^$+wwlPJahZ@|Vh>F`$_59at;l#?%&i-#fjbDc3)gAJPO6?Yw@~pu zI3GdB^q6nV_*c`^vGF|+9hEl7Ww-iM$*ag_AL~S^C#|XwJ{MK~MYKYS|9I`Le_G16 zFGj20Dlp32FkkYnZ0|Srw`I37Q_$Q~N^++p=|`^r3Lor%Hss3-(xT*4oveM`2n0U+ zd*u;k>$d|mf8_VyYhSF|^W4Ip{TTV86VLw1F?Rw*ef!DQij-AO;*_&scczj(d%1Uw z>?A+Mh~nX0%;`W{i*oLDgVu6nPL_GC!?~ZbmK_LxU$!mtK6hB+#ldIXWPF0@EFUHQ zvYs-VdN6CBor>2hdR@vcxb0N1FXp1pPZZn3rZ0X%mYEMSr=Gr>x-5t^+OtmQ9 zh!MoQPu*~ioSo=KK;GR{CbbkH+Q2p{rNFC6ERJn#U;WPRlJhRI2M<#s)R__F82OsB z5{vGqEn12lY3o~Vu`>(mk5QCXa3?+sbO^^%1TfC95e7tKIQ)awZqOn{=89&nHygHx zr_*8X2Vh77Ui!V_)M40(WEWhT`?#Q#dy~Mr$1pbuhAyvMc*Vwn!XJqXEc$Eg85z;T92E^gN#Ab0xV&&{V|zkDw(aIH7BTM zLm%b%lL-x_-+JIgQNb<#=)2iWT0tP4+A&3j1$5|fKkM{(#O-UA9c`A8e7ZTk@5v+G zy8_(;{_%#c$5xCN?Rc^7v{cw)3){Dmaa*THyv1F0bY`tS)`xPM1(b^}#$KN{xiEZ_ zvBduF%$HbZL_|d=QdpnzB74k@y3?cQ8+N;fdM+a^E*~X64s|)x>*epEgwMQ6>D9gO zLRv%7b2IZE%I>HAdKBCA!c{Y2xhCje4G~-u*ZsCm$3vMcT1|g}-5zDWA&2hw3$NNU zY8>_@`(k5m7Q;LUdVIenM1ay=!8LV_P1zRd`E?81%fHAxpL!&5%~zS3 z&2qAl=?G!WkP_1#RKvNNm#=Eo4=YqHlo)3MiO9w*Sbmr4M3;8R{-#4_yT7?oCY6NR ze5jN3LzehYr+L@YFIeA?iENgvXh1pe_lRfTtPvkJW8m>L3yn|6PaN$?({&$unka&61=q*qeBDFW6=*V~PkMo#Y^VO+Rrq=f+CWhS}OedQ*m75M7{++#`D? zgum2V4V#y5t~uC|Ojo`2G@f>vQINH?FT(~PTLC9;}PLb3X&BqU(H1Xmq?A z+AbDRxX+|*EAB^8hPm0Q*qlDko}`(l&sXHjkX z7_G$5!9CuPOzy28)^%;cdGkYQ!T@mB?$^&g-() zgn8RUyz5cZ7f+oL7bh8vZ#y%6Jx`YK?z@<)I_H1IZ=I$pN4bj*nGsAzW8U4m8IBoM z`#5E8z)0K_b5Hgt%-Z^w@a4SQp7+jzq}-jaaKL=k9zPtU$wH^NqPPQ7_<+m(J^%MUtd~sdQv9Nxf#0lg9Lj zM3fL|zSa*-#6I-_$uF>>5SCd_AG(o(wi1oo3=Ucks<9a*%(eGklC7H|C45<~DU%V8 zYC$lF+3zca#H^oU(0a!{Yhja9_;F3T;>EPMZ*uX?&Bjdp{@#X?0>yV<-CO%F zYDLY4*7V_{Nndt<6+NxR`1&QWZWtZxEq@&<}XY8rOJ0<`j$&>O9$5NkWC zOLfskK}7LAUk^01@g1(Do{4x)L-fsF^0N80c)#d2Qi5~A*HdjSa*L)`UI|N_tM^qQ zWV-sF9=vSYiSHyw)UkaXwi=4I^f@=O%`*;=O^v6~P_HeR+V=W>fh=b8%X zl5n+GT=_+XEXekzhF&vK<*15!uez_ZuN3!vNHU1$9_LzmBC-r~)eP=62pBAzj=%mtbTx8}XC#uFuo z;*bH_814x_&qH+S3vZeUtNkQ+r2Hpw$6u40#F-nDzFPIU(Z2r1GhqCdZ1--9&}ixX zvwC`2M(diaiDrD0%6iHnVQx7kl)=s>>GL!bxjVLJQDr9jFWX=lF>!?%_?0Jei*2Ndk8|z@jMYxV>#U*4Z-|9Uh zzJ;aLh_FxUkK)N*<;iO^M-Yg%TxX1E&=Iu@erztNapsmKJ(6+DuaG@YU(aHo@w;Wx z^z<`}rBPRk%|1(nBSx3fo2WKFqvV3rXE~NPF<1Q4RJB#Agyk&wHYZF&Ho!(#Rq`t~Pnd7-8JCofOMVCl=u5_Ip zjG_`)iN1Xzd5hdrCfP*L6xoWebt2X|&>u7d>-daRX{Ob@auV{o2h-gT0}(u+Bo@zkjxO7xTjl-y zf(GlUjPfaWjPUDMWXi28m>X$FhP$Q9Ht-gdh7iz1Sqlx()lgXnKU_v5b_6~N1T1!L zGGuqiJgyIzm1&eBPj}&&T>3vw0K{L*IGE1 zOxIx3EQxK6C4KGaD_;Ld|CDxDbaWt;!^I*w8h#-!_}SHDvgnXh*t&ph%=iFnNZYF` zD)?v2w}XE^?W?h+uO?}dB)CrbQZKasjE*3yaCkGGDWTmcvlOEtEC9+p%;nT%`?XM^ z+=A!m+{mDgEjqB}ipzRX%(F4k3 zDmJrTXAcdb<-gn)jeU%IYi9NKP9Lv?fL-*k*eQ}c!_#%!Gi@>bDgI82XGFV`Ne%D@ zF(1Y1Lso8f`RWn)g;m{tcvE(E!oIq5!61xtJL=K3&y>@m#2i{x0TNE}V0n`G_6}(& z@nWP$b3w$)Iy+HzxLLRgc8=MQG{!F=>D(dj{q^pofCX0WbdLxN?JafuZ=d+_4Af{} z@Et9g+)VN&jyTITp(64?k}yQ_2Mys=m~CepHFn74Yz?Jg<8kPQb2(ah?pvs}AgY>j z+FU-Vuih>Nb9v@FGv*W#!S?VL>t4ZhUwElHW0bFpLZGC3{j1z|-y5saCZY=ON(5=m zr`pda-YBjbr1s3XRYk@7`qNVC07dtWDt{DbLsdHxVV%BfVIR(6F^$)H0LSmfi;6|5 zsz%mWBZV-J2LxV}>MoAe*=n(iH=iN<_YxB2I4WE4+UqpFG-h&yA$dJnh_s2wg&i@j zD3#0K@N;=RWlkv*wc=?9`m()XJfCk)JD*LZasZ*@Ax3`C#OkG&z)D zH=kFsYfAfRvGOuZtj(Q7K_s?wW_TlpdRcDw7Uxu3Uyh1I@hq~;fvJB-JB*vluqf}jtH$^N&vHATj^sLlGSQb?#dl2+qA@kyI}1K7 zMOhfGl?-q^Bsg85aj!-8vniBs$4$Qr&=fry=2cnJ=1z_47wlQfEuBVwmUX_JI&{Dm zY^G-Hb4G^JJ?e`>9#%c^I;-L9l_}lQLvN3D(BF+Bacdz^<5jOuQb_wjKjLJgf01I} zf~317)a|$hU%5reaZhpg%K7rEwAkerT4yjNA?VyEv!-_-KAQGE>?BEw<7w}mo=I!t zWTKC4%#6G_E#NBv76@v?gxQ@~h#TB$eNS2iufR5s97O^-N8}&Gh&)YE%X1J}H<5>G2b}u~(Zr zNBWgKN4HX%ud(w-c`z$u74mssO=W(%d{5x1QgH0)orrDKz_{P9SQg}|$zn~8-!KqSf-lYh>>2-l*%18fBbJBd(`RUck`!ndL_5kdu2Q(IwIL-9j!z(4ZtJ z8+q3eLoqOH`2aj~$_lV@67nykOVDV}DK;uHzc+dn)VWl1vb*uf4+3g@N0& zbC*tyTGki+xE@l{&>|X8fLK?q3rbe@Ag^f&q1D@$bhlFKEw-a*zR^-GSCE}zeZZ8u5D*5qjM5v#i>UViWtNjUb$6ecngL%Mu6UAZVs4*2MAk0$s&C4 zSpviaWe1?@Df+na4SKk@M{VCrfe_YkI|K7dBa{nxQ-K}$FiYd_v4a!vPY)C%g|CvV zXd8|;?Yxp1q58%3c>=NAjFT1FeLrtI1L}fgyM$cnWe-je)>JIZ_I_WYp24*&|2f4m z2f`I6Xi0v500N96X)>IL*(xYYyGr}+0?m%o#613xl(+e%CknH_X!M&>&>DA+(8ocS1R;pWpuC$#>GB)X`SN$9XgJmlDxq|XAHDG z6AkNTzITB`#d)MXU*YX}_x{r_kTw0u#^a?&4;nv}b^~eiLt_orhFlP$yi4OJS|<}5 z`?dl%ay#@Dd}6~2PVfXR=3lqx;v7BS`E6f=o-;Slr%)&2y5{&nlDzt{Y@&U_P#R~n z`kqNW;J6Ta<@B6MzMRDgFn{;H4)K6HERyc}`WQPz+d?wI;)Jtm1%=0_tk=$l0E=N$9cD=Xw69D5xjL`F&^Bb#zk93A@@$EK{ZN2G-al|4&ll$ngm z$lfFQKF;g?{S!XFxpb-Hbe@mrIFH-)e!YRk#<9nJGz&(epZKt~FEj#WV$&)=;0dN* zgZU~9z?N%2CmHHC4y{YRz25;CoZHzj*q|60>niy^23V8t0OkV!lz6F&&pDo!k?ZF= z%Y4jtZb`e()Z0DxP$5wKT_EJ*>79zX~;KQ43%(;4hY0LVF8arnIh zvP&6`-kcJ{2i1{96gVkb-y8YS*z|DSewGA!cIwX&D zlZUo}^cDjqil)dY`^vLDY9tp|H5lsaz5#HlaqHv%35LC?4QvH1+NBKb*zJ6^1Ae9& z)Q+73N9?h-6JUM&`v-Y)y1{8P4u2p>CJ(a#(G5Gi9c72swYn+cH7}DM$1)jHg|AlslUQHa1h43Fs^Hj4 zxzY{5?Ol^@u-&&wV`_a8eChW-8$u2cIn#jFDe*hh-wZB(CpL^c>abV6j` z1OAf0n330vf?*WZtK{*<_z&R77N-ff%Rhe4}= zJRuK>-$q7KQE35jUG6cMUALvFK=B`V6AR3j^L#2>A!~qH#U-n4k?IV{+}rx2Dd8Od zJxk2hys;p_rcO0%_y1YF{gGU9@27PYSqz%fkNt zFY?HHchrXc5mi4VTxMc}ia}~-Qp)+JLiM++06&~p*w&PPHKJgu92|~I^il?+p%0lx zz%219SxkMZ>2sEc@GgnSr1J69jJMO7a+PbccX!@*9YizJsV(JzlP?R(t|U1B0&Oo_ zyAM4jU(JH`LLLYUsQt?GTKQ`o<#ELKAAn;2`_`6UNc_ng^%23<&-B4}z{1?#lasNf zbW8RB0EPqu4WwjdI!{ypN&KDN)_c|;@NS{}uP(_=b}k@Iq^Two=V@zRY+Rqe+eRmL zFzy_$P|Wovlg!zCZ9OoXypqpiz9Xy#g+xAyVE9xjGHQ+GM)X`vqlDIM`<_ zFlUFM5;L29&a_{=*U7~+R7*BH!o>wqQVBG<<3-yjR~9<_6!xs{#(Q1&mqFhEG5xzD zpAuDN_%r|H!qHyDJ=%m2_h%&2;YtH`*n=RmBBQrqhJsxr${~6pC6UE^**DZ~Yl3O6 z9bzZ{7v)*>3=k1M5Cl6$$I&qioH>ElSIW=_mK?CKbgjXDxzAGez8Sm}z9{e?mc5hq z&NM-U_=OCxXr2OP!gh4>X)Kp?zV#<}1FadW-+Q5vwl%V)nYDFP|1(t^^s1d-pMUOgaD@C)f4c4nQoh)erY6P1sJh zY%Q3&?#t?IkRG1H9D%>JS17ep{HFhGM8x~~Cfn}V6{%J44E0q8cZ-NPAJHsiN3ye zU_Ig2P7HQZh2Mj%YhR{Lf=t>K-?(#a&WoZ;U^#XFX+#-Dp&`1sJ*z`O_H|^qVAsVx z=j19?^6W(@eBDPnS9HtN+2}rup6w3xI$5vU_<{#mB|II|wgi}ohDMBAtQJCTt&GHO ztz9s;>gwi>xI85w=H!-)J>-c0lsG%r@4XHl)Q_?F>4ERZck` zA%`Sd%!@*BwTNMoiR-1g9P18e@pFN^RW4}v$ozp#l+Bk29a;vQ`+{Pb=vnq!a_a_`OI`n%-^~RlaLUq{c5!)0{eU9^1QP@s z;M#6hlGBy~%zd*a;PH%e?48oyIBbrjMnmVr9&;DKyIZTgj>%z0;fYl?+^!0hA}#83 ze-*vjvn+3|*TZ+D>d_I|q!-H}Frw(`5NuVeOIzHrhT=k3^u?#g5eC!P!14a54*q!s6~CEZz68w|1F z82!zG=T|*YjbJ9{|GpJ?(@w$VqrTETC046>_>-lXm&iC@{Suyym+`8=S>c%Qa1r)( z8VGK>{epX!betN`Um~RUeV*y2q1D(`ul-0W2~?cCOTU!y=D&PMt>}4pIxqM&qgvTQMHfW3h_b(`N%|!d4Ey1PNI{1bdfGGe9%oDPOK4=0uJ>%niA%j5u^6`| z8j5kTFf^kejp&m&D;AjbxPO0G->#E5Y0NwTe~8^Ar3r>1o6EOlkF{=m5v?DE^-M`p zi*?>T{;a}^X@>dda5%DzO7C(Rybu4=35_liNU)=DiX^B3J3@`GMVR3)^5oEI*);MB z%49-eBNIGQ$3K?GS}YS}Q8trB=at;Isy=1=qG4=z^kR1F^I zQEI6wTow51F1dH&Q4RD(g&fz%6pP*r=7BO)a8nW`L7Csh6*A&XBha#A%2b*^mAJtx z?QDWe|M$>S^fTwEXEICT<@@s{gGtiR_Ieh3+FH)+_$=*)=zWpMG{qwpMP38?)Rt@Q zjRNmKE%?G8>s_RKgYvFY)^MDh{mUMhTj zoWbn2mrkPF;zF)pY}odun5PlX98P+|R?)cF1(Iq$@5S_eMsdhg;pU z#mi2ZOKM1g(ACd8&_CPdvQf1rrI1#IVi3Q)q;bZS`(P-66@T5@4X48BtkN&T710#G z7N6@@8+d22!%DXdv3^00>usw;S6b}-+mO`C;^DyU1RH2>T)&pCDdXN(om+!jhg&nE zr5&nyGPz=3-QA}g|J@#HiN4$}NT-L^;Y)2JpoRXrJW)u>5*mB_UXY&?*@A;2v%iQK z^jY{}y6)yWZ`%LfMwnr}@QLGeDio*NH`?dXN3gI4S4$rf`kxbu5zE@oavZqfMwZ;A zjtvg_sU5HSN#JfPMC2~A=BBjDv5#U~KBc>CFfyjK7JvXa0mjQZ%c6e?eGbbTr)9VK zz1@bje}MIdjk_cYRa6JHoKP!*52f@-Djlq0UD4hsfvunIIp?-Is89-F&SBdWz2y!fK1f8lo`^<&G7DdlzR=uCFzzR>tQkTe`hC?= zapK_3kB+}5a1QPqHD1eU>po}PrXz@B(np$yYuH{~;VN+AJCEf z>6X@jFAV4Su8Ami)V@mDVkv{yMS~%oX-y(h=criuY#?H>aJ3}D8lp&C=e7X5o&rYp znsQR#r4t&cgC!#gy*LaKvYL$(izf6}IhqE6kV%WnCyS8ZV@Poi`9m{$hOIkh9t%^6 zsVPY77uN+L7Z(+upi*X+Ywn}$@Ik$f%i&WfLSn>$(8J4gkQ*w92#D}?x=1=|`)ez+ z%rxhn3JnpI-A_AIml%F73>D0kThX|Q`+GaI;|FKm$J9~`LxhQzs9oolv-J8GdLVQ# zp(F@ndk1^OV?U=0ueJrl5Z_5A+!W`Y_NASuWlz(W{VO-4se7tR0bw(D^$;FGDt9-G zf{Z>C+gHD?crY0It{KJ6BFHmvj5t(_*D9f#=Ze^V^yIhejKPTG$9Yl+bTxHJ%_~0W zP7$@5NpEmfOjG?G3^LHyr-lU<2;G-pU7va}_5wb8Kij`JBv$H+b?-Yp@r6sDZB(_M z4Z|6iQy&O%MGVIhu@~r5W4ALO4AK$JZj_Y%R?ef0QmOK1*Rd@QMdUip{5pyixXU{N zC!$ANTlAY3@RC)QrnUw7tiSfD+M=fVtxDn*J$)$VvjGM6cF20O|8TB=;zV>sRm(Q1 zQ*|`9TK}g+O)6{Nm4eWYBB*POoq6+KZM&T-{=g%q+#A$V0upH^yhBcV!^&|jW~+mUAj4TF~{3GmCkKBd=wQ^IjJ~_ zJuOYfN!Liy+%n9=53mIE;v@Gk>>^OLCR>rV8U>Q@I*pNGe%vgde6~J!>1zxVlJ6V; zYT{}X1(8v6j!&H(AgPHXVM$>S1?!=sUTw9Cj8@MW41g2Co z^1txSY(EMJ4llKLw(Oxbakxl!(?M1r_ zU&hR5r#E>ibbAO{58;j}uFXJVJK>gnjEE4w)qH9DF}``LNAkoUMvWjEpNr_&mFLYg z`a{x$5Cc-io5E1Yjuqm6~`PV$U-j` z)s!f8j1EvFZX5p;5ph6tLH}Kj9JKdnNBI>^VUl-5j*!Elo52)YgB~|gttdz$n35Ki zxJNN>s;b?PeOYI4qTLU{*aFjt=vNUJU5MW(neC!NhCKds1-HQF;n zS3ZAKl@P$uYujwv)2s@yI=E<~QiTxu74MWX=s{k*!1ib0GGGMHB@Ck`g0P&(iL^^) zyn}ZZ|Ll#^@c8QMINky!IhPu{qV@(r8e{NrNYtHH0wG_nK?Sv4VcVAr(o70#RhYv^ z`D>W27x72>FsVjdqdUVj}47x&?vrBK-UhRKQvhp4i`5L zXfJd%k>l>liuhjluZ7_8$Ick$gPi2f@a?L8h+iP!)?4L!|6zZ_wK zWO}(=)(V=>+IRp>f>cAX$C&7dD(w=Yx}ov+$GFnQuCC}>(y;cVVQj#fW~w1^&wD>- z{dVg6YYn#dvO{9(XOG8bh^=l2Se4?%A8j_RvcIljxr6(s%ZXY$8)Ji0UTG=x+dFqab>Sw~^*1< zGw)xbefp34aAw-7Pp3&;!x_pNthZiW%$`+EdDA+RBR0KsJR2Y~=xA;#v|x8tYP$V6 z68&3Q+N+|5kW+r3EJj`EWPBL4p&UfpC`w-_6OGiPNLer%LYSJsI%7ll36na>f_qvqyiPEIrwMYMK~ zJ#9JI8gB_>)~I*Px?H>d#IvLjFLNA-T_p+loflfg|0CJo&ASwa?(6xp8T?i}j1!u` zJqfihJ)U<;{Lw+k`a*#Tg`LmIe5Q6PFOMkY67c85dviM)-V-w6pujpFXz^I4IhKs( zU|&=qU<{_r<_s|J9`~!l)8VZYx}C~CgC>j*F&{G^jt+yk}E9}5qs?GV;m4+tSnN9NJ5^#pJfYe_TRr+^b%k9?1nvE*-H;N zuH>_T81JO+`$W1WKzr;F_XkDmD-te}a81UG*Y0Y*IL7q6qx%@T4ZpVB@a}TzudzuhCNw?lDi1sB_`AF15{Bpd2eN_y)YH)5r zT?Ww|{96O3?)dY2OR8MB;fV5A&B|sdi2Ax%dGKre&L!i8a&x@g+PSi>=r!L1`?vy#m23>0;@-udOJaKE%@=F+0Eg{+V@3^9Tz7-!hpMgTTu_Fo@X|)CtXp_G8ZC z?MlNs5B)p|ZNCnyN85Z4#imzd5YE@a!sac*I}pnsRwB;H=Kc=^|xbb8lINRB8Yc(&3=7g@DnJg!8 z(Jz2B_&qx3cj|Dtlm&kqVeU91g1|Y=p~9ch4x)RT`RDj<2?w1rGJ;_KFjGl zpYs6$*|$2!SedUq5~ChqtBXao&-WfM3xKv`@EO6bW+7Uu+1852%yWWrJFlRUK=oEhk zpMYC&0r5vqX`)_HI7T2QiHvU^=b*ZfNp*_WukdcAgB@(u_OsMwf_8UM%BE!e2tI+N zVr%874KP-qS&r~0p>#J8Ei>xug=GV1dm)QU8_blVt5F0NO&Tap)zMX$b>inn>540C z-V0nD11D!sl7!b2>h!cRk%|Kf=J^S>y?<>G(N=5|l$YV<|H3t(94QpbOq2aErrl5K zzh!DEW8xook9C=klJ2|Gp@=Y^`>(@~yI(>j2Yk{QJz^-QeMgrE zPrM!pli(V2 z?`Uu}v(2VR5>~j!v}a4*6;{bR%BYj-o~91%q)y^-OXY!f62=FFg?xtShyw*{h82`5 zV#G^-Qxa~x;Do+@yowoRbZiaj5G?5+z`D`y-DEf`f1}(#Aykb)TTDbK^FhJ660n$x z6WzNo6BHaw4{I)!CS8hr>L40BdQql8MrbN_>pE6|eLZl9X2LM5%nRHPV0NNuh=r0B z^vujh`FLVhU0b84%qHJ!#r6P~3L;cSSOjkOLx$De<@qv3s8S6LDQaU zp!cj6Y*f@pyY3?Hs@XEv?l&AKWigz|)uZ%Kb=-*EOc*Is^BsYGx%4R$?r7)W`il9b z#<%O6{nz4eBp9zxH=gWHDpFGMlpSzUR&@kx%UlC+1L;IyH_EWQFT&6Jd8otaMSh({ z;Rl?5DwUwPYGS(3`XUFztpXpN%}fzuExq*9i9FOx|&xRQ; z-?&8<@czOTmSg5||6mtTtIFPD7~@{1D4h&K4Ep?olnarHIs$1`nG_}{D|t`p>2X)h z;BPb252G9&Ghu|Gfjo;TYBwx1{#!Lz_#y=>1Q+khBJtM!eAknP&)^Qx=6)?OFdU-K zv(9-3(aOmkSo8sUxpenXs^I|r>r6eLkWNl~HV2np=@>w%J=R%aSyc-z)ZF^uu6SD@bbBJ<0Xz8rn*T-h~!2O0N5Op#8&d zR1qE4EjDDP1fkvbsCE(FmNZ|_9?6e{tuY?!P`6si9cM+%%g6d}+(7sIF3$wqyd&v* z7PvMOyBb^R9JRF4HV+}W2wk(|Tbe%I%fb+9TkD2-beB9T?Bnkb8_IUc+O~AG7cJ?{qielpH z>&VXzw^CUlHTaBA6WQP@6XxSs`+4F4z3bLNh-^(U{&({B72)aFgUplZF=?#Mn7v1Q z`Byxsz|`gDV9ycF{?)#=psh-m*)O8=iGb=rw(MN|H+O58wvA_`mJ~pxj2r9}7oL8X z$^NcPJyqpmez6&gb}~_TQ)NzHP1hOTG*{C-r!L}u=)K0_jG}_uCQ6fLX9>$y%wzj% zj;xbUS$90B?&Y-8`yja4*Q%L`q&GEPXdg&SB#x+}c(8`+p;n1_FX{qo)&KEy%}}9D zaY(W7As)W{!Gq}d+{KV{v;V+bl0$Zqb+R}GOlNVmMEFA#+wVcb&-EK<{v+@0PVX?ZgIU8T4KfoQvLU{UEZONgK_HGZPbA)?HA{dV{rd z#=i7zEF97i7%sr^AwEIBBUIR?J+5V$w~!oD<|Wi&Fvggr04~+sq!>Y`A+5;tafSvR zh!PiPqFiKac21Cx)!v50P@FGXVmlCKdhbDz0Cr-v+V}N=M&U-0?0ky@#Y(p%2GZ^- zpvdWf=nN9g&HV!_`>33^&!(Oem4dy+1!F}?!R%A<3)`Fx?(tL3FlZNqNE&n&J!{v@ zBbKrkg%RYJ$$>zGUe^RdtU`eG#1*Nq0-uEE$8R%p@pMp|mgwCd?}Bcrqgv*#h>j(1 zLi0xpPM%t*)aRjl^wS>yqk{2_;Ld%IZbFFI}}Q zG>fYC(*yG=Yux1&j@(qPF>}GPBQmQgc@}qn6SHnyAd`_ zOpz7rq|O|hu56t2c7gdsK6o>aplR`wa-4t($@@cn6OcA)QjB)A{b&8tk2>@%-F6%; zE@x4;m(PWIE3YRD&T&pixH7sc)zCHR@<1hZa}=Ei_1)*KN5_J{pbkFoBE#QmG43g? z{nGkAu^S=vZ`DA$+K`vbp4-#P!CK*S9+oi%NS)m|^SZukLcB#Rxc{#f{6J`+! z4AZ=pz3+hoP1kwWn3fi9gF9IfZN75#?6H^3ZP7-KG*6Brw)K`Tn|Gu9Q)aNKYNIgS9>L#@d-pxfN!vhqqZlB(L(X^W@B40YX@vU zhrk^{eY5MCQ^DgC!3pm6f_%9hLDG|kf!QZ*SF#SIB9TNNPQ*o6T)DWNS0V4^I+7*L z#Q=yZzlsG^is$N@Ifgrvc3(ZAG-fr|AIadu@=JDS3H{L#zU%mCMOn1Py0iLAf;PrU zaE$c}YgW3z_oNwyA9OM7V(DRLs%ZjWxFaay`QMl1J1LQ@V}8if;LNln*FJnRTWT*q z8N2;iM3m~bgFMt}tb0xv+0^HG^4iQ?-zqxmA}E)6WU4o`kkYVV zgHoHfQ78&oH4oLwKW}U+B=%KhwGbnrtMH?kD{gD#1H;t5)z8PQ&#pC;wjg_|c}MQ> zT%#{;&3$Y|j~cAAb>@Eby2u*%+OL)1?*Z(r^^`$aa zP-!9<3HpEkSG)?$U*=-uA{6jP|7Snlv)TLyR7~#yh$J@Y$xU_{&6`Ox$jW*A8Svb$ z{{D8Emi#6b@hYI28FZ>o0gmJk5QjH=C;O2_?SPs(`Ok>{85D2)%&@zAaUW!2E(Waf zfP4A?P#<8;ocpgrMRLHNu=?v8u%vq%-=jtJ{a5Y!wS#Qq`UhUnTe6Q#0%d?6_4S>n zfHqTobIMf@?Bi2{F+6kq0PPBBJ;QM!gN*z1f%f$^P+9UZ$$JjqGWW=qrrPuYGKBIU zuVhUA*mh0JVjE;Y{I~|hd7o>!I#k<$<~n5aR}_c6FA!?^l#9;+*Vh8DcH9g2a#2iy zMVG92&vuOFY@m1%4NPS}{#P?{><2tH?|?i>L6R(dQ3V7=(Al?*hXDBd4p^rwALTkw z23j94(}bDy3?+N;PjmC}bFtoLll6dt_)hkNLYR2QUaFV$0D<8G@OoXY>*gcWgEuk; zh?q;`He4;Kwl3*cxOn>jang0lsC^CSdxS^L)qq=n3V5#Fz(ZB#k5Yb*o6RRdu{?cq%+7H{JsO+%7m#)*Rj-zA3Xc2%FOvsctOpyjx1-ps-C;?C z)^h`7OMGK+2oPSK$m&0DjH(rW%8gp6*DTlJUvY;pa*ep(iF03nK-DF@d?vewtmFb5 z8)&Hw-&->tIWzi%)|saw=Ka$rO;}Cn9~#@vYoTNw5wuxIt3IdfTHF}3s;c6>K3OI? z?FayMapA{bs#JSz>8EFStY*6lY zi0kpQn^Z_3MtAwzuTQvKdq*z512-o9A|Ke&-T@e}e?6b9^aCjCL*DONkB{hD!wdLd z0m09Bo+u&$Tq|BT^Y>~XYaAzYoSi{6&Q5T>`l89n=QZwq;gy@chza$_Ky5iimHItOAHM%jehd^lpcV+!JzJ!9L|vkUezq6FQIvw+t=}<^{*TpON2ou=~Bc z(R5`vvwi_MVzix4hGfLDz2!o^2lCXj&v4&v*wk+h1*gv)HI4IyUEY`S&+C@;1$J8s zPI!ZF%;d%<)tNBrDUO>#v%(IL2rr23`A9N^@eX|;_(7PrytqbQo7rQ@}+OAy^qC-i(U=YmBvEo9AF~BD`nh`mHRgdEZ zsE~4>>RJi{D!Dhs+3ixy(R1KB5dcaOtluO$`N~e9xQ}AYU)9%x6?hU%*Q_~MhPaIT zAPY)8=5DrEZgT)&ZZ4Nn0U}0Lp>I}b9?THOr$rC`HDrwH$1-m|5HBU)RGKSHmXTy( zssCMU3iP92ES>?o=-7{-ENP+mg%*|xXGo|0bDn}D*xGC9zXLw>50#_SWn`axhSO^K zW>=+Sd&8rSDo{Zm!IrRIsIH#|Fv;hjISJc&6_{&Jl@+PeMyJV4_?>M$;}B;=EC zt5p*#;pxfhye!7qrlRr$(Ejk1pA2}r5hm(nu1HS5ST!c?TcH=grFo-UZjHM%wI_l1 z)#|Xz;)S_faetJASPwhXPkbo3A0vOQv{*ionJiK~f~E(mqvXHvp=xAd=?xx{m%XRL zC7#xAg=gRJ->86S#AiQw^1y9yPNB&QdVhaV7aoYb2UNDdO^;`_<a%U;5?_5kRasWAGd2Nfonlbk5ODP7a%CP*+f?$i%C!Wu{P9?Bi2WxsWy-$<0 zVZWdDSxKHZRsO{qdehg`39SX7>#B-o)R%;VBw%2BtMstkojmp#|M02B*>kb+iHZ{+ z;Tp2N-m|P$5$=Q_A28l(*gUt3ZY(iTAG{4^?|2Ec`ytjvu=FFI+L0XXFH)6fN|vAU z^~g*rImdOV3P4ed?co2QI8Dq|6VL|VBiX&P_I*zf3jg>g|t~3)oR9oysce%qvLR3?q>VU zF{1Fc^q4I-HD_i%;9*zNA^6-st;z-PFaI#-6<$-HJS?CJ=gH}>jSF!1Qf~xL93iS9 zYjHNt-Z!O2CSUyj1rRvLiwdo3)>oKod>i~81{_w%n<%cL1QVpZyJIh>FS=LuLXZkZ zgzv%<0;VH~I$L@URdUhgSqHcmUwMnalN@BF5zn2s48AhQv#>CIga($z1j2`H|GM;u z^_LfgkRWo5WCivS;9IPfNY`MPW94WbX;LTQ@xZ*slYk_Fs&bpst+sjh5m-w@wEHia zVWYo{XQ<{f$~E?cI~Ki5q#~8`cm_g_?dW|zwaCWOLIFq!<1Gi{zE~kvf2@Foe&#(+ z0!4PME&);$>3T2hh$(g;s`&FJ*=wDDSY?ydN~EoGPkzg~-b;1441n{tooRgY;H(Ax z8Uy@`3ntB7Ns!%s90;iipZ^4PXBo{!962w`xdKjlcQ`X$KrHJYv&wsrNez^3yw|(Z zGeQhb9`S?q_7B$1KQ2mn6P%=2MF#Q4vG#5hvoij2Ieh0Ql`O58>3()cQ&o7YQojCi zq`s%lzW&X+-av3HV6S_gW}qEy$-Yoqo8CXt3}y-mrZIL?2TpwaxKDAiH(8n{vQpZGqoXDDX{fBd(@oS>WzGI%WFf#pWY1n1yLTUgOX?bb|WeoFhZfLHYdH3*}h3mL}q-t)ohj3{) zq7l>;GuFw+?vv*m0u+V1u!;z76vOf-hsw^&P9&)qE^6$wW;8`OEo?f6#n~m1Za2F(0e>?`-*(a>)v+CZ7_~dus?hu??>QLYiP4xFJM?xhan%Rs6 zA*-QAJe{Gyhu_%#xv?#^n)W)c=Xq_|E!|AF7gpV+D~PDO`2O zMCEv#=5kx9hV%+A4eE0)K4XdW_l*1SuwI}~N`!>`)i5v-!dIhuWN!%O=^5n@zI=Oi zlKv{DAv|j;G%2}wQPAa>$0uSwE48wz{eGp4iGtLy(zZA=9ZBJftIp7k+7KtOXGv%y z%#Y|yFdaK{x2!;qm+Ib@$nVOqtdr#a+)M-FN|8r3D&1MxLzK&^B_G4OiDwThdgD;wRM%=Q4B=#zTF7d16XMgwuvc;XR-Ctz zAKNIfBY`(0csD^y-c7dD(9ZWJUb@%jLZw)PH7m@aHqzOUNLRI&gezl`prLyv6DbkZ zMDuloT2k3}`mz>+?H0d?x0tNU5l)PhTRYF?3La^4P*rNl!I`X-0(ojb4!^X{8VdBKPTfqu$>0eq6i{oYqXjhx# zSykkPH?*?4syFo0zR-FHiS;Do4X!=T6To+yT+m@kOrgDRq9y%WhCA8YwY!7x*N$hN z?HCtL$s5jsggjYn$I!ZT5(r;ewBfD{Pyt!X1P$TDBnPfNA^V!*#v_ZjbG*-&jHmnv z>gUG>&_8}$u&|HqF86$0%%zeJdSXx!l`vZCt@1cEl@5eutI4Tc{fu<7#6X8Shu27M zT;F%ykbNCEcH!>dghZg%F(N%M&-zsydiOi~t7y;V@V&?^N6jGuy<&VwcavOol3p;A zJ4-pxS)$9Ty?^w!W2r1ptumxHUj>s}wcQw^fUzWpgD*u!a(ePb9)`A?#gK8f zVK#u#Be|)gIw8nD?^RdR_5=5;I_GvpK$bMQ!#>ZLMByyv!>Q`*6Scn?l2e1O_ZGQr zDVR=P15feYi(4W~hU`~5FUtm}MnrcM3_NGXs(+d+o|C|<-J_cP9j;gU*=93L+yz=R zu+^aZY|*MFU7T}?Qx=Q2I9zs--ON*=-PLh^qfJ>HGnyOm3rb@E2n_IohO zn>A#fs9ETeoP5u#1x7O7H?wMqq*0D;;M3IVTA?_;Bp@&{-bF2HgyfJ<5}lSV;%E=J zRj`1O?EQ)U>J6S|J?_-JLZ=f=%~+p)!~jdy#q2^Ku8{ykh1C5lq0J=i9^-XNh;T<{ zc!8*k*qKy18pnf~^Agvmk{g&y-(=zIRAi;Te7@(LH~aeR`FeiXYgy=AL#=m~ANRsU zHh$o9AiTVkFYF^<^(74D7?wtzC_cQdm$u}ml?|<9ENT&*{=CFT-BX&Mhs za3`Ojswm5Q%Fx<{$Z7i|6=9|E#TfB?M|n9qX6Z2DT0=J#2cb8FWgT1fn3B|b2*j1( z_`1t@KeA`j@q`{*YNzfk8rMi@$oPL`{Puj|{tnV=G83`x9?O~$9n;QGn%X8{!}rzR zK;fRsWb>RZ0+8 zpsrdLxtct_n7sKd!0yDUDXP@7<)nJ@U31~I=zt5+QnP8+x34e}6@5hWEMUOtnfh&y zdEL$#NMo7f3NPu=lPvCP;<8{J5cBtHS)blqplDJha#IPPq2>$BuXVZ%K=0+a(X9~H z(ueg9<(GI$P?47B=GfZOR2Gti&A?Uf?QU3$$u0q=X1*iTv!e`xtpAQx+`i`@@<~be zY-4=(ZnoC6?D70KjW@?JE(7L@k&?4sO+MlTkKf?w2mRsG%H24?hWwng9TY3cC>qIQ ztmNmI(>CQ3f(;9XJ@|zQnGuI?r7K5Q3Fpww3tI2lzQ1j=Y5K$T=^r6cgIav@pV+F@ z)oX;uH+~+Z>@6FsRdgM1N22eeCh9$pm|0^37;asQGX{^^6MvpXn~F>y>PbS9D|H9W zNl8&&QXJuUx1Ja#-C0LeDbgqVD>HDQ@R<}|dDO1gLCiKLdNJzFfx5P?jWEVHRU`qf zz7Q{8lyL213wU9ZN4?_rTV@6^@Zw1FWj1w=mHVs)k(Rij7=GMKL9AwR8ug?K_i|Ou z>pA;9>IAC!4A@{h1$hO|+TEZAkDs=sNhDX;z;%JRtk+$Kg_d2Z#x1fg1vOrRnzHQc zuqYcGD$|0vrpFNYO4JU^=&7p-hkqeRr`(dg$jXgzEq(H(0e z;zPQIYoi&3{MW%%n)=+X5tAFwr6}-hZKG@tr)640zH2HM_lEv>G$69YYhm4R)fSEw zxL60Jru*%1mAMz(VnJx{a_q|Y-@#=8U9Oms-r5eLtW!MaN4yAo#^Stu+ZA_r%Z#Qp zG1R%C$46Je_qPuIitg&6!D%q@VA}V5)F{pA^qDF)ZQRIMS?GprB%$*kJ_jbN%{_VL z54R$Vopr;cTQr=3B~2*UN zJ|@1h-e9@^DL&_FTL%H8^1)>#i2Kfa;V0PX$AxI`L&YYs;ZVRndi134E4iUd?EC+9|rHt#iTJFaYR2+5e_EZlUvT`3EJCy zX|Ra$<+HAyRoE(CavM351l>=ok?_;W`lT%Zj^wqUDSwDUn@kzR?@#VO^Wgv6Pn`tY z)hmPxf4FyP>+bY=d|um zj#Rh%U@ge2ww<`XEI7XykRY-uG5z@)3;I!u7ZmT!Ts>N2aKYAuuq#qoAbt{-=5hqt zPf;n$dv>SzNfS*DvDPg2S|eiTmxf;wdb@~g(|+|nm?S~2OYyt@v8SG9rOr6PP}tLh zR5~(iR(m*2ycHu)fm1sJN2WSYq6U49%3!2ns}cpcirbXqi*P2bb~=Xp+6%3Rq(n(x zD%sCkT~cSvVUdng=2^>5q7e|?TX7A6TuxAZ##Te!YVA~7Wt~)u-`k5XN4WQ4#kcZ1 zRjPvW(L#x{XJ1hYM-Dr@I5WO=y+yzvPtYlMpd)ow1!n|HS^%l`vI40|7>`)3sjw=M zg2T{6t{)0bGSIu&qF)TxSuX@Fa+w=_clcZGjHTV@Hy_yMMwz+>AG~H~bfSNB+rlxdNf@k#;ycUxi`d(Ok%X!DC zc2?;Qru^9XbOWzt%KGLJnUm-c!%D#hx4^VjKQ;7|2mhi}VyU@Zj$G+! z0Sz@0jgDJL}!ls^Kj;&jIpceYLB1ABGE1pTr->5)(GW$Uc*TQxP%0a~yxEqo)o0A%vChO|E?k*fy&Lg;b!z_$fdt;dI;+eu}i`6>yV`lX0 z!l=sGDS0Y1w$7)sAVn_t(@YMoaibS8@5ysn=vUlmRg}xK-zv`whe-h~+xqSTR)#nd zH*++?G2&|6nAv@~4tT1NkVbjLeumr1wm{Jp>ju9|vlA(7la(X;6AQ#bQ+V!Mu%S>JV~^iB`?gkcVWcF6NPc0ddQyX~Nax;% zz8cnCbEoJwnVxW7p>r&!m2uBPQGTS?vTKopnGc@qn4BCS^M=HBQk0U26=Zq-`$km5`3zVZXm6qxoj-V4{A#z#VO6T zzwBa1!_sBj_?K9C8LIQtZa(aJ%AU);`;^>C{9msS;(o;c*-yN^v!9%TB@_N`c2}!Q1Fgf&DKPoH z1Zp){>OfE!=s0}+x?dvMAfUNc6o0;Fk98a5Iv@I!eyB|vwJ+Sy$QKO(am>m7F*(;# zmktEIv`@Zro=G(d&I4tC@76&K8hlbkZkOF-wX~8UH`J&u77(XOvu`g?@`3@u>n&WFItM>xl7{sD+`W9VE{^J(T^vzUwPr6 z$%J3^??(H{X?fe*m+yW*X}bMivP`y&f?a%SB@jNo2b)Ezlk-z0k4%?AKZBhTNOhGm z$nDXIp!WW?K{B5`KISjj8NUt2&2b=ODYXUt+|`YJ+Bs!J1iZo(KAvN4!HcNi8Fm zX1PH=z#Ox^YeTo}2}+`RYq=JO%gm|?8yzfWXLGgozz*rBX%G5NgVY9i5P65h?@-W80r$!iABFH| z*FlL=!N_C#h{2o^r$pKngp({?{QSXwlpBCUqmlvtkqciv1*N38n^r@V0JM z)I>g8g30&JBpZX_g;R3CezR<(7*EcXs?{$|fpyoECpvm8BF5_ z;sd75(w;yy7Z%1mJ5)W`GjI4mHan@bN=8_yA-q8QSPZ#*DM-a4$J!|f^zBUJ-jkDh z&_h1uy2&K@vND3(r)G$&Q(@GAmt3fGdvUPvADC4nRD?>Gm^7y3wW;Glrv>N$6qr!X z`}ih&(2ZY045E`+gOZ%$$7&4S;TZ(wqi;vfAUY&%?h zb&e%)eX{Nj=(qYatG1Jh&ONgLcKb~?lg{kd!)$%trr+rff=hzL?1fn(Sf--~jYn+Sv|E7Ios>cw*O=csL>z+tSBKW^?v7j$p^A z3*h(dr}N(WI>^OH5?y9h6vaxW4kVJF?V}3zE{7F&x^JDd&x%PIN8C4~I|%X$7d+nv z8pwDYF4?ZYMPQx8ERv;K?;r@T(3zp6bdIHA6OoJ*5}D|%LCW>}Zc28#>=u6uiLx)X6FFY@$&YSDj^Swirlsv9ldDk``G#?- zcL2X*ZSx#dR%v5o-YOxDDi~L~rF^(wal!ixcor-(5|RCuh=vtkkGfGA@>cFt&e{qG zSu!DMCTvqC9UM96cIc?b=xHc+w90fDD10I>unXvF!~1@E@d*6*AD>@(u65YYDhF^p z2A)*QOZkuz3?ciA_N*df`bj)Lzg7k~+5{SBvxeZm_5uaYRs7eXIiTv8E4T=#L>n(G zHyHx*_X3rvz{ao`GwutK5;y2>>vfTn6z;_72Ej~HjKtW5BZs6$r)++@Trrc0O}^!F&GUAeA0 z_dro<%bzW^w~u#;Y?mKDlm*960bmH2zN4)h8V+;MaVL+#W3>nc9*J#nXm$kH8&-Ej4=+n#loUn7A|IMdh$p-*)} zWU9UYd(*ru7CjM?Z$vLfF+FGyCi1;?;-y!h$So9@=}lB39y;j0CEKBvxiSyEdG8q} zP7KR1XGK4BARS{|E3)8Mxn8nfb=SYSM=i<~DKJ5@*?9uxNlq=wAU^NS1h7iBXv1@c zxWPQhkVd^i)MX`hE<^>_au1T@(vOx3H{r00u? z$m%KW6a#*u(Wzd!_mLQvv9I_izSRC-6gfd1nK?VdyH%iKveowjqrud^^IF%Wr z+#w~ZQ1WBYm5Nl1dfs|#l`o5t1KPfK<#{h#oXMRXq$=cq)T4$g_e$LCEoTGC(Nn#9 z#LavnfQjQoZ*DhaO14h z$RLHhrYjz%plT#JfYlYjT^)Bq&im~N_tQs&tKYp(FZH(FM%TbxyIg3;@H*#bx|^pK zS;MN|!4H_Az;%PBRw=`*!k_Y!JN9+Gda2plG&_$NB=<6sbweZf_ZLj3V?#$zC`y?l z5e-`GdQ`tQg|pPve1(_lhF+T=9ehL~aGTU*nvFWat-U#mk`Q@%0<6;8{Krdr9&S&I zk~vunTbA_Dyw|)<4DOl)gG_s8Yuv8rj>Z-S%=tkosA9u2lVzukh>IW??kVmLpupSmbkn`tasXoCp7cw)s0wrv&i z?J?s{pFW>_%JOPYPQlS+tIuJ>8#E1p<oN+sD^h>C^eRw z#tm5r6NhPSE3;pJZ)1Yo6CMXYXtSV*M1c_K11L%r88n&2QyfAV`Nvn`aM2r0Oz0r6%Y@(06JiOMos2M`tyu>2=mbq znhSH=)?h|RieYF4iWb9W?Ds$WSrYuMj@@d1wLjZVxPm)1B3z0fP7>`Z)?51(nUR61 z$^tlD<%d1p&!U^Rh!3?`>sMETpmn=paU6tqW^m`8zU+D(g0;W0@6k?yr3NgaV!8_6 zF|Ssf(r18j@e^v}LBi)N2bFwX@4jxhgw_-2(+{cq+KNZJNG2$RQ0`}UsPpl{Kp#{R{x6#Md?ZR$=W>( hp$z^1za1BiZz-hKRQJV`j5_7O Date: Mon, 6 Dec 2021 09:58:10 +0800 Subject: [PATCH 5/5] modify board name in readme --- Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md index 518e6d2f3..0221f42a4 100755 --- a/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md +++ b/Ubiquitous/XiUOS/board/gd32vf103_rvstar/README.md @@ -1,4 +1,4 @@ -# 从零开始构建矽璓工业物联操作系统:使用risc-v架构的gapuino 开发板 +# 从零开始构建矽璓工业物联操作系统:使用risc-v架构的gd32vf103_rvstar 开发板 [XiUOS](http://xuos.io/) (X Industrial Ubiquitous Operating System) 矽璓工业物联操作系统是一款面向工业物联场景的泛在操作系统,来自泛在操作系统研究计划。所谓泛在操作系统(UOS: Ubiquitous Operating Systems),是支持互联网时代人机物融合泛在计算应用模式的新型操作系统,是传统操作系统概念的泛化与延伸。在泛在操作系统技术体系中,不同的泛在计算设备和泛在应用场景需要符合各自特性的不同UOS,XiUOS即是面向工业物联场景的一种UOS,主要由一个极简的微型实时操作系统(RTOS)内核和其上的智能工业物联框架构成,支持工业物联网(IIoT: Industrial Internet of Things)应用。