From fb32c5fd3164f99c5579c4f18a25c33a7682c466 Mon Sep 17 00:00:00 2001 From: Felipe Moura Date: Tue, 24 Mar 2026 21:51:04 -0300 Subject: [PATCH 1/3] arch/arm/ht32f491x3: add initial support Add initial HT32F491x3 support with startup, IRQ handling, serial console, GPIO helpers, custom vectors, and CMake build files. Signed-off-by: Felipe Moura --- arch/arm/Kconfig | 12 + arch/arm/include/ht32f491x3/chip.h | 69 ++ arch/arm/include/ht32f491x3/ht32f491x3_irq.h | 130 ++++ arch/arm/include/ht32f491x3/irq.h | 61 ++ arch/arm/src/Makefile | 9 + arch/arm/src/ht32f491x3/CMakeLists.txt | 37 + arch/arm/src/ht32f491x3/Kconfig | 67 ++ arch/arm/src/ht32f491x3/Make.defs | 34 + arch/arm/src/ht32f491x3/arm_vectors.c | 108 +++ arch/arm/src/ht32f491x3/chip.h | 43 ++ .../src/ht32f491x3/hardware/ht32f491x3_crm.h | 249 +++++++ .../ht32f491x3/hardware/ht32f491x3_flash.h | 50 ++ .../src/ht32f491x3/hardware/ht32f491x3_gpio.h | 83 +++ .../hardware/ht32f491x3_memorymap.h | 127 ++++ .../src/ht32f491x3/hardware/ht32f491x3_pwc.h | 48 ++ .../src/ht32f491x3/hardware/ht32f491x3_uart.h | 147 ++++ arch/arm/src/ht32f491x3/ht32f491x3_config.h | 53 ++ arch/arm/src/ht32f491x3/ht32f491x3_gpio.c | 78 +++ arch/arm/src/ht32f491x3/ht32f491x3_gpio.h | 63 ++ arch/arm/src/ht32f491x3/ht32f491x3_irq.c | 310 +++++++++ arch/arm/src/ht32f491x3/ht32f491x3_lowputc.c | 287 ++++++++ arch/arm/src/ht32f491x3/ht32f491x3_lowputc.h | 43 ++ arch/arm/src/ht32f491x3/ht32f491x3_serial.c | 658 ++++++++++++++++++ arch/arm/src/ht32f491x3/ht32f491x3_serial.h | 46 ++ arch/arm/src/ht32f491x3/ht32f491x3_start.c | 114 +++ arch/arm/src/ht32f491x3/ht32f491x3_start.h | 39 ++ arch/arm/src/ht32f491x3/ht32f491x3_timerisr.c | 95 +++ 27 files changed, 3060 insertions(+) create mode 100644 arch/arm/include/ht32f491x3/chip.h create mode 100644 arch/arm/include/ht32f491x3/ht32f491x3_irq.h create mode 100644 arch/arm/include/ht32f491x3/irq.h create mode 100644 arch/arm/src/ht32f491x3/CMakeLists.txt create mode 100644 arch/arm/src/ht32f491x3/Kconfig create mode 100644 arch/arm/src/ht32f491x3/Make.defs create mode 100644 arch/arm/src/ht32f491x3/arm_vectors.c create mode 100644 arch/arm/src/ht32f491x3/chip.h create mode 100644 arch/arm/src/ht32f491x3/hardware/ht32f491x3_crm.h create mode 100644 arch/arm/src/ht32f491x3/hardware/ht32f491x3_flash.h create mode 100644 arch/arm/src/ht32f491x3/hardware/ht32f491x3_gpio.h create mode 100644 arch/arm/src/ht32f491x3/hardware/ht32f491x3_memorymap.h create mode 100644 arch/arm/src/ht32f491x3/hardware/ht32f491x3_pwc.h create mode 100644 arch/arm/src/ht32f491x3/hardware/ht32f491x3_uart.h create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_config.h create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_gpio.c create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_gpio.h create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_irq.c create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_lowputc.c create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_lowputc.h create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_serial.c create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_serial.h create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_start.c create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_start.h create mode 100644 arch/arm/src/ht32f491x3/ht32f491x3_timerisr.c diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 52b1e3e88da72..de81c0fb81c85 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -779,6 +779,14 @@ config ARCH_CHIP_CXD32XX ---help--- Sony CXD32XX (ARM Cortex-M4) architectures +config ARCH_CHIP_HT32F491X3 + bool "Holtek HT32F491x3" + select ARCH_CORTEXM4 + select ARCH_HAVE_FPU + select LIBC_ARCH_ATOMIC + ---help--- + Holtek HT32F491x3 (ARM Cortex-M4) architectures + config ARCH_CHIP_ARM_CUSTOM bool "Custom ARM chip" select ARCH_CHIP_CUSTOM @@ -1207,6 +1215,7 @@ config ARCH_CHIP default "goldfish" if ARCH_CHIP_GOLDFISH_ARM default "at32" if ARCH_CHIP_AT32 default "cxd32xx" if ARCH_CHIP_CXD32XX + default "ht32f491x3" if ARCH_CHIP_HT32F491X3 default "csk6" if ARCH_CHIP_CSK6 default "mcx-nxxx" if ARCH_CHIP_MCX_NXXX @@ -1748,6 +1757,9 @@ endif if ARCH_CHIP_CXD32XX source "arch/arm/src/cxd32xx/Kconfig" endif +if ARCH_CHIP_HT32F491X3 +source "arch/arm/src/ht32f491x3/Kconfig" +endif if ARCH_CHIP_MCX_NXXX source "arch/arm/src/mcx-nxxx/Kconfig" endif diff --git a/arch/arm/include/ht32f491x3/chip.h b/arch/arm/include/ht32f491x3/chip.h new file mode 100644 index 0000000000000..bc843a01c3313 --- /dev/null +++ b/arch/arm/include/ht32f491x3/chip.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * arch/arm/include/ht32f491x3/chip.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_INCLUDE_HT32F491X3_CHIP_H +#define __ARCH_ARM_INCLUDE_HT32F491X3_CHIP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32M4_SYSH_PRIORITY_MIN 0xe0 +#define HT32M4_SYSH_PRIORITY_DEFAULT 0x80 +#define HT32M4_SYSH_PRIORITY_MAX 0x00 +#define HT32M4_SYSH_PRIORITY_STEP 0x20 + +#define NVIC_SYSH_PRIORITY_MIN HT32M4_SYSH_PRIORITY_MIN +#define NVIC_SYSH_PRIORITY_DEFAULT HT32M4_SYSH_PRIORITY_DEFAULT +#define NVIC_SYSH_PRIORITY_MAX HT32M4_SYSH_PRIORITY_MAX +#define NVIC_SYSH_PRIORITY_STEP HT32M4_SYSH_PRIORITY_STEP + +#if defined(CONFIG_ARCH_CHIP_HT32F49153) +# define HT32_FLASH_KB 128 +#elif defined(CONFIG_ARCH_CHIP_HT32F49163) +# define HT32_FLASH_KB 256 +#else +# error "Unsupported HT32F491x3 device" +#endif + +#define HT32_SRAM_KB 48 +#define HT32_NUSART 8 +#define HT32_NGPIO 6 + +#define HT32_HICK_FREQUENCY 8000000 +#define HT32_HICK48_FREQUENCY 48000000 +#define HT32_HEXT_MIN_FREQUENCY 4000000 +#define HT32_HEXT_MAX_FREQUENCY 25000000 +#define HT32_PLL_MAX_FREQUENCY 150000000 + +#define HT32_SYSCLK_FREQUENCY CONFIG_HT32F491X3_SYSCLK_FREQUENCY +#define HT32_HCLK_FREQUENCY HT32_SYSCLK_FREQUENCY +#define HT32_PCLK1_FREQUENCY CONFIG_HT32F491X3_PCLK1_FREQUENCY +#define HT32_PCLK2_FREQUENCY CONFIG_HT32F491X3_PCLK2_FREQUENCY + +#endif /* __ARCH_ARM_INCLUDE_HT32F491X3_CHIP_H */ diff --git a/arch/arm/include/ht32f491x3/ht32f491x3_irq.h b/arch/arm/include/ht32f491x3/ht32f491x3_irq.h new file mode 100644 index 0000000000000..201431f885c05 --- /dev/null +++ b/arch/arm/include/ht32f491x3/ht32f491x3_irq.h @@ -0,0 +1,130 @@ +/**************************************************************************** + * arch/arm/include/ht32f491x3/ht32f491x3_irq.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* This file should never be included directly but, rather, + * only indirectly through nuttx/irq.h + */ + +#ifndef __ARCH_ARM_INCLUDE_HT32F491X3_HT32F491X3_IRQ_H +#define __ARCH_ARM_INCLUDE_HT32F491X3_HT32F491X3_IRQ_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* External interrupts. These values follow the Holtek CMSIS device header + * and startup vector table for the HT32F491x3 family. + */ + +#define HT32_IRQ_WWDT (HT32_IRQ_FIRST + 0) +#define HT32_IRQ_PVM (HT32_IRQ_FIRST + 1) +#define HT32_IRQ_PVD HT32_IRQ_PVM +#define HT32_IRQ_TAMP_STAMP (HT32_IRQ_FIRST + 2) +#define HT32_IRQ_TAMPER HT32_IRQ_TAMP_STAMP +#define HT32_IRQ_TIMESTAMP HT32_IRQ_TAMP_STAMP +#define HT32_IRQ_ERTCWAKEUP (HT32_IRQ_FIRST + 3) +#define HT32_IRQ_FLASH (HT32_IRQ_FIRST + 4) +#define HT32_IRQ_CRM (HT32_IRQ_FIRST + 5) +#define HT32_IRQ_EXINT0 (HT32_IRQ_FIRST + 6) +#define HT32_IRQ_EXINT1 (HT32_IRQ_FIRST + 7) +#define HT32_IRQ_EXINT2 (HT32_IRQ_FIRST + 8) +#define HT32_IRQ_EXINT3 (HT32_IRQ_FIRST + 9) +#define HT32_IRQ_EXINT4 (HT32_IRQ_FIRST + 10) +#define HT32_IRQ_DMA1CH1 (HT32_IRQ_FIRST + 11) +#define HT32_IRQ_DMA1CH2 (HT32_IRQ_FIRST + 12) +#define HT32_IRQ_DMA1CH3 (HT32_IRQ_FIRST + 13) +#define HT32_IRQ_DMA1CH4 (HT32_IRQ_FIRST + 14) +#define HT32_IRQ_DMA1CH5 (HT32_IRQ_FIRST + 15) +#define HT32_IRQ_DMA1CH6 (HT32_IRQ_FIRST + 16) +#define HT32_IRQ_DMA1CH7 (HT32_IRQ_FIRST + 17) +#define HT32_IRQ_ADC1 (HT32_IRQ_FIRST + 18) +#define HT32_IRQ_ADC HT32_IRQ_ADC1 +#define HT32_IRQ_CAN1TX (HT32_IRQ_FIRST + 19) +#define HT32_IRQ_CAN1RX0 (HT32_IRQ_FIRST + 20) +#define HT32_IRQ_CAN1RX1 (HT32_IRQ_FIRST + 21) +#define HT32_IRQ_CAN1SE (HT32_IRQ_FIRST + 22) +#define HT32_IRQ_CANSE HT32_IRQ_CAN1SE +#define HT32_IRQ_EXINT95 (HT32_IRQ_FIRST + 23) +#define HT32_IRQ_TMR1BRK (HT32_IRQ_FIRST + 24) +#define HT32_IRQ_TMR9 HT32_IRQ_TMR1BRK +#define HT32_IRQ_TMR1UP (HT32_IRQ_FIRST + 25) +#define HT32_IRQ_TMR10 HT32_IRQ_TMR1UP +#define HT32_IRQ_TMR1TRGCOM (HT32_IRQ_FIRST + 26) +#define HT32_IRQ_TMR11 HT32_IRQ_TMR1TRGCOM +#define HT32_IRQ_TMR1CC (HT32_IRQ_FIRST + 27) +#define HT32_IRQ_TMR2 (HT32_IRQ_FIRST + 28) +#define HT32_IRQ_TMR3 (HT32_IRQ_FIRST + 29) +#define HT32_IRQ_TMR4 (HT32_IRQ_FIRST + 30) +#define HT32_IRQ_I2C1EV (HT32_IRQ_FIRST + 31) +#define HT32_IRQ_I2C1ERR (HT32_IRQ_FIRST + 32) +#define HT32_IRQ_I2C2EV (HT32_IRQ_FIRST + 33) +#define HT32_IRQ_I2C2ERR (HT32_IRQ_FIRST + 34) +#define HT32_IRQ_SPI1 (HT32_IRQ_FIRST + 35) +#define HT32_IRQ_SPI2 (HT32_IRQ_FIRST + 36) +#define HT32_IRQ_USART1 (HT32_IRQ_FIRST + 37) +#define HT32_IRQ_USART2 (HT32_IRQ_FIRST + 38) +#define HT32_IRQ_USART3 (HT32_IRQ_FIRST + 39) +#define HT32_IRQ_EXINT1510 (HT32_IRQ_FIRST + 40) +#define HT32_IRQ_ERTCALARM (HT32_IRQ_FIRST + 41) +#define HT32_IRQ_OTGFSWKUP (HT32_IRQ_FIRST + 42) +#define HT32_IRQ_TMR12 (HT32_IRQ_FIRST + 43) +#define HT32_IRQ_TMR13 (HT32_IRQ_FIRST + 44) +#define HT32_IRQ_TMR14 (HT32_IRQ_FIRST + 45) +#define HT32_IRQ_SPI3 (HT32_IRQ_FIRST + 51) +#define HT32_IRQ_USART4 (HT32_IRQ_FIRST + 52) +#define HT32_IRQ_USART5 (HT32_IRQ_FIRST + 53) +#define HT32_IRQ_TMR6 (HT32_IRQ_FIRST + 54) +#define HT32_IRQ_DAC HT32_IRQ_TMR6 +#define HT32_IRQ_TMR7 (HT32_IRQ_FIRST + 55) +#define HT32_IRQ_DMA2CH1 (HT32_IRQ_FIRST + 56) +#define HT32_IRQ_DMA2CH2 (HT32_IRQ_FIRST + 57) +#define HT32_IRQ_DMA2CH3 (HT32_IRQ_FIRST + 58) +#define HT32_IRQ_DMA2CH4 (HT32_IRQ_FIRST + 59) +#define HT32_IRQ_DMA2CH5 (HT32_IRQ_FIRST + 60) +#define HT32_IRQ_CAN2TX (HT32_IRQ_FIRST + 63) +#define HT32_IRQ_CAN2RX0 (HT32_IRQ_FIRST + 64) +#define HT32_IRQ_CAN2RX1 (HT32_IRQ_FIRST + 65) +#define HT32_IRQ_CAN2SE (HT32_IRQ_FIRST + 66) +#define HT32_IRQ_OTGFS1 (HT32_IRQ_FIRST + 67) +#define HT32_IRQ_OTGFS HT32_IRQ_OTGFS1 +#define HT32_IRQ_DMA2CH6 (HT32_IRQ_FIRST + 68) +#define HT32_IRQ_DMA2CH7 (HT32_IRQ_FIRST + 69) +#define HT32_IRQ_USART6 (HT32_IRQ_FIRST + 71) +#define HT32_IRQ_I2C3EV (HT32_IRQ_FIRST + 72) +#define HT32_IRQ_I2C3ERR (HT32_IRQ_FIRST + 73) +#define HT32_IRQ_FPU (HT32_IRQ_FIRST + 81) +#define HT32_IRQ_USART7 (HT32_IRQ_FIRST + 82) +#define HT32_IRQ_USART8 (HT32_IRQ_FIRST + 83) +#define HT32_IRQ_DMAMUX (HT32_IRQ_FIRST + 94) +#define HT32_IRQ_ACC (HT32_IRQ_FIRST + 103) + +#define HT32_IRQ_NEXTINT (104) +#define NR_IRQS (HT32_IRQ_FIRST + HT32_IRQ_NEXTINT) + +#endif /* __ARCH_ARM_INCLUDE_HT32F491X3_HT32F491X3_IRQ_H */ diff --git a/arch/arm/include/ht32f491x3/irq.h b/arch/arm/include/ht32f491x3/irq.h new file mode 100644 index 0000000000000..16d1f314af8a1 --- /dev/null +++ b/arch/arm/include/ht32f491x3/irq.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * arch/arm/include/ht32f491x3/irq.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* This file should never be included directly but, rather, + * only indirectly through nuttx/irq.h + */ + +#ifndef __ARCH_ARM_INCLUDE_HT32F491X3_IRQ_H +#define __ARCH_ARM_INCLUDE_HT32F491X3_IRQ_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32_IRQ_RESERVED (0) +#define HT32_IRQ_NMI (2) +#define HT32_IRQ_HARDFAULT (3) +#define HT32_IRQ_MEMFAULT (4) +#define HT32_IRQ_BUSFAULT (5) +#define HT32_IRQ_USAGEFAULT (6) +#define HT32_IRQ_SVCALL (11) +#define HT32_IRQ_DBGMONITOR (12) +#define HT32_IRQ_PENDSV (14) +#define HT32_IRQ_SYSTICK (15) + +#define HT32_IRQ_FIRST (16) + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#endif /* __ARCH_ARM_INCLUDE_HT32F491X3_IRQ_H */ diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile index 00581e6a1c1be..7c6da2a3eaabe 100644 --- a/arch/arm/src/Makefile +++ b/arch/arm/src/Makefile @@ -21,7 +21,16 @@ ############################################################################ include $(TOPDIR)/tools/Make.defs + +# Allow cleanup targets to run even if the configured chip dirlink is gone. +CLEAN_GOALS = clean distclean +ifeq ($(strip $(MAKECMDGOALS)),) +include chip/Make.defs +else ifeq ($(strip $(filter-out $(CLEAN_GOALS),$(MAKECMDGOALS))),) +-include chip/Make.defs +else include chip/Make.defs +endif ifeq ($(CONFIG_ARCH_ARMV7A),y) # ARMv7-A ARCH_SUBDIR = armv7-a diff --git a/arch/arm/src/ht32f491x3/CMakeLists.txt b/arch/arm/src/ht32f491x3/CMakeLists.txt new file mode 100644 index 0000000000000..1231e5546bdf4 --- /dev/null +++ b/arch/arm/src/ht32f491x3/CMakeLists.txt @@ -0,0 +1,37 @@ +# ############################################################################## +# arch/arm/src/ht32f491x3/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +list( + APPEND + SRCS + ht32f491x3_start.c + ht32f491x3_irq.c + ht32f491x3_timerisr.c + ht32f491x3_gpio.c + ht32f491x3_lowputc.c + ht32f491x3_serial.c) + +if(CONFIG_ARCH_HAVE_CUSTOM_VECTORS) + list(APPEND SRCS arm_vectors.c) +endif() + +target_sources(arch PRIVATE ${SRCS}) diff --git a/arch/arm/src/ht32f491x3/Kconfig b/arch/arm/src/ht32f491x3/Kconfig new file mode 100644 index 0000000000000..3a32d32146a23 --- /dev/null +++ b/arch/arm/src/ht32f491x3/Kconfig @@ -0,0 +1,67 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +comment "HT32F491x3 Configuration Options" + +choice + prompt "HT32F491x3 Chip Selection" + default ARCH_CHIP_HT32F49163 + depends on ARCH_CHIP_HT32F491X3 + +config ARCH_CHIP_HT32F49153 + bool "HT32F49153" + select ARCH_HAVE_CUSTOM_VECTORS + ---help--- + 128 KiB FLASH, 48 KiB SRAM. + +config ARCH_CHIP_HT32F49163 + bool "HT32F49163" + select ARCH_HAVE_CUSTOM_VECTORS + ---help--- + 256 KiB FLASH, 48 KiB SRAM. + +endchoice + +config HT32F491X3_SYSCLK_FREQUENCY + int "System clock frequency" + default 8000000 + range 1 150000000 + depends on ARCH_CHIP_HT32F491X3 + ---help--- + The reset clock tree runs from the 8 MHz HICK oscillator. Adjust + this if board-specific CRM/PLL setup changes SYSCLK before the + generic timer or serial logic runs. + +config HT32F491X3_PCLK1_FREQUENCY + int "APB1 clock frequency" + default HT32F491X3_SYSCLK_FREQUENCY + range 1 150000000 + depends on ARCH_CHIP_HT32F491X3 + ---help--- + APB1 clock used by USART2 and USART3. The default matches the reset + configuration where APB1DIV does not divide HCLK. + +config HT32F491X3_PCLK2_FREQUENCY + int "APB2 clock frequency" + default HT32F491X3_SYSCLK_FREQUENCY + range 1 150000000 + depends on ARCH_CHIP_HT32F491X3 + ---help--- + APB2 clock used by USART1. The default matches the reset + configuration where APB2DIV does not divide HCLK. + +menu "Peripheral Support" + +config HT32F491X3_USART1_SERIALDRIVER + bool "USART1" + default y + select USART1_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + ---help--- + Enable the standard lower-half driver for USART1. + +comment "In this current version, only USART1 is exposed by the esk32 board support." + +endmenu # "Peripheral Support" diff --git a/arch/arm/src/ht32f491x3/Make.defs b/arch/arm/src/ht32f491x3/Make.defs new file mode 100644 index 0000000000000..e8fee89b83f77 --- /dev/null +++ b/arch/arm/src/ht32f491x3/Make.defs @@ -0,0 +1,34 @@ +############################################################################ +# arch/arm/src/ht32f491x3/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include armv7-m/Make.defs + +CHIP_ASRCS += + +CHIP_CSRCS += ht32f491x3_start.c ht32f491x3_irq.c +CHIP_CSRCS += ht32f491x3_timerisr.c ht32f491x3_gpio.c +CHIP_CSRCS += ht32f491x3_lowputc.c +CHIP_CSRCS += ht32f491x3_serial.c + +ifeq ($(CONFIG_ARCH_HAVE_CUSTOM_VECTORS),y) +CHIP_CSRCS += arm_vectors.c +endif diff --git a/arch/arm/src/ht32f491x3/arm_vectors.c b/arch/arm/src/ht32f491x3/arm_vectors.c new file mode 100644 index 0000000000000..bfd2bcd551151 --- /dev/null +++ b/arch/arm/src/ht32f491x3/arm_vectors.c @@ -0,0 +1,108 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/arm_vectors.c + * + * SPDX-License-Identifier: BSD-3-Clause + * SPDX-FileCopyrightText: 2012 Michael Smith. All rights reserved. + * + * 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 NuttX 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 OWNER 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "chip.h" +#include "arm_internal.h" +#include "ram_vectors.h" +#include "nvic.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define IDLE_STACK (_ebss + CONFIG_IDLETHREAD_STACKSIZE) + +#define HT32_VECTOR_RESERVED ((const void *)(uintptr_t)UINT32_MAX) + +#if defined(CONFIG_ARCH_CHIP_HT32F49153) +# define HT32_VECTOR_FWID ((const void *)(uintptr_t)0x00049153u) +#elif defined(CONFIG_ARCH_CHIP_HT32F49163) +# define HT32_VECTOR_FWID ((const void *)(uintptr_t)0x00049163u) +#else +# error "Unsupported HT32F491x3 device" +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +extern void __start(void); + +static void start(void) +{ + /* Zero lr to mark the end of backtrace */ + + asm volatile ("mov lr, #0\n\t" + "b __start\n\t"); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +extern void exception_common(void); +extern void exception_direct(void); + +/**************************************************************************** + * Public data + ****************************************************************************/ + +/* Holtek reserves vector slots 7/9/10/13 and uses slot 8 for a device FWID. + * Keep the NuttX exception routing semantics for all real exceptions/IRQs. + */ + +const void * const _vectors[] locate_data(".vectors") + aligned_data(VECTAB_ALIGN) = +{ + IDLE_STACK, + start, + [NVIC_IRQ_NMI ... NVIC_IRQ_USAGEFAULT] = &exception_common, + [7] = HT32_VECTOR_RESERVED, + [8] = HT32_VECTOR_FWID, + [9 ... 10] = HT32_VECTOR_RESERVED, + [NVIC_IRQ_SVCALL ... NVIC_IRQ_DBGMONITOR] = &exception_common, + [13] = HT32_VECTOR_RESERVED, + [NVIC_IRQ_PENDSV] = &exception_common, + [NVIC_IRQ_SYSTICK ... (15 + ARMV7M_PERIPHERAL_INTERRUPTS)] + = &exception_direct +}; diff --git a/arch/arm/src/ht32f491x3/chip.h b/arch/arm/src/ht32f491x3/chip.h new file mode 100644 index 0000000000000..6e9ff9162a5fb --- /dev/null +++ b/arch/arm/src/ht32f491x3/chip.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/chip.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_CHIP_H +#define __ARCH_ARM_SRC_HT32F491X3_CHIP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "hardware/ht32f491x3_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define ARMV7M_PERIPHERAL_INTERRUPTS HT32_IRQ_NEXTINT + +#endif /* __ARCH_ARM_SRC_HT32F491X3_CHIP_H */ diff --git a/arch/arm/src/ht32f491x3/hardware/ht32f491x3_crm.h b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_crm.h new file mode 100644 index 0000000000000..2d0387e2778b5 --- /dev/null +++ b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_crm.h @@ -0,0 +1,249 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/hardware/ht32f491x3_crm.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_CRM_H +#define __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_CRM_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define HT32_CRM_CTRL_OFFSET 0x000 +#define HT32_CRM_PLLCFG_OFFSET 0x004 +#define HT32_CRM_CFG_OFFSET 0x008 +#define HT32_CRM_CLKINT_OFFSET 0x00c +#define HT32_CRM_AHBRST1_OFFSET 0x010 +#define HT32_CRM_AHBRST2_OFFSET 0x014 +#define HT32_CRM_AHBRST3_OFFSET 0x018 +#define HT32_CRM_APB1RST_OFFSET 0x020 +#define HT32_CRM_APB2RST_OFFSET 0x024 +#define HT32_CRM_AHBEN1_OFFSET 0x030 +#define HT32_CRM_AHBEN2_OFFSET 0x034 +#define HT32_CRM_AHBEN3_OFFSET 0x038 +#define HT32_CRM_APB1EN_OFFSET 0x040 +#define HT32_CRM_APB2EN_OFFSET 0x044 +#define HT32_CRM_APB1LPEN_OFFSET 0x060 +#define HT32_CRM_APB2LPEN_OFFSET 0x064 +#define HT32_CRM_PICLKS_OFFSET 0x068 +#define HT32_CRM_MISC1_OFFSET 0x0a0 +#define HT32_CRM_MISC2_OFFSET 0x0a4 + +/* Register Addresses *******************************************************/ + +#define HT32_CRM_CTRL (HT32_CRM_BASE + HT32_CRM_CTRL_OFFSET) +#define HT32_CRM_PLLCFG (HT32_CRM_BASE + HT32_CRM_PLLCFG_OFFSET) +#define HT32_CRM_CFG (HT32_CRM_BASE + HT32_CRM_CFG_OFFSET) +#define HT32_CRM_CLKINT (HT32_CRM_BASE + HT32_CRM_CLKINT_OFFSET) +#define HT32_CRM_AHBRST1 (HT32_CRM_BASE + HT32_CRM_AHBRST1_OFFSET) +#define HT32_CRM_AHBRST2 (HT32_CRM_BASE + HT32_CRM_AHBRST2_OFFSET) +#define HT32_CRM_AHBRST3 (HT32_CRM_BASE + HT32_CRM_AHBRST3_OFFSET) +#define HT32_CRM_APB1RST (HT32_CRM_BASE + HT32_CRM_APB1RST_OFFSET) +#define HT32_CRM_APB2RST (HT32_CRM_BASE + HT32_CRM_APB2RST_OFFSET) +#define HT32_CRM_AHBEN1 (HT32_CRM_BASE + HT32_CRM_AHBEN1_OFFSET) +#define HT32_CRM_AHBEN2 (HT32_CRM_BASE + HT32_CRM_AHBEN2_OFFSET) +#define HT32_CRM_AHBEN3 (HT32_CRM_BASE + HT32_CRM_AHBEN3_OFFSET) +#define HT32_CRM_APB1EN (HT32_CRM_BASE + HT32_CRM_APB1EN_OFFSET) +#define HT32_CRM_APB2EN (HT32_CRM_BASE + HT32_CRM_APB2EN_OFFSET) +#define HT32_CRM_APB1LPEN (HT32_CRM_BASE + HT32_CRM_APB1LPEN_OFFSET) +#define HT32_CRM_APB2LPEN (HT32_CRM_BASE + HT32_CRM_APB2LPEN_OFFSET) +#define HT32_CRM_PICLKS (HT32_CRM_BASE + HT32_CRM_PICLKS_OFFSET) +#define HT32_CRM_MISC1 (HT32_CRM_BASE + HT32_CRM_MISC1_OFFSET) +#define HT32_CRM_MISC2 (HT32_CRM_BASE + HT32_CRM_MISC2_OFFSET) + +/* Clock control register ***************************************************/ + +#define HT32_CRM_CTRL_HICKEN (1 << 0) +#define HT32_CRM_CTRL_HICKSTBL (1 << 1) +#define HT32_CRM_CTRL_HEXTEN (1 << 16) +#define HT32_CRM_CTRL_HEXTSTBL (1 << 17) +#define HT32_CRM_CTRL_HEXTBYPS (1 << 18) +#define HT32_CRM_CTRL_PLLEN (1 << 24) +#define HT32_CRM_CTRL_PLLSTBL (1 << 25) + +/* PLL configuration register ***********************************************/ + +#define HT32_CRM_PLLCFG_PLLMS_SHIFT (0) +#define HT32_CRM_PLLCFG_PLLMS_MASK (0x0f << HT32_CRM_PLLCFG_PLLMS_SHIFT) +#define HT32_CRM_PLLCFG_PLLNS_SHIFT (6) +#define HT32_CRM_PLLCFG_PLLNS_MASK (0x1ff << HT32_CRM_PLLCFG_PLLNS_SHIFT) +#define HT32_CRM_PLLCFG_PLLFR_SHIFT (16) +#define HT32_CRM_PLLCFG_PLLFR_MASK (7 << HT32_CRM_PLLCFG_PLLFR_SHIFT) +#define HT32_CRM_PLLCFG_PLLRCS (1 << 22) + +#define HT32_CRM_PLLCFG_SOURCE_HICK 0 +#define HT32_CRM_PLLCFG_SOURCE_HEXT HT32_CRM_PLLCFG_PLLRCS + +#define HT32_CRM_PLLCFG_FR_1 (0 << HT32_CRM_PLLCFG_PLLFR_SHIFT) +#define HT32_CRM_PLLCFG_FR_2 (1 << HT32_CRM_PLLCFG_PLLFR_SHIFT) +#define HT32_CRM_PLLCFG_FR_4 (2 << HT32_CRM_PLLCFG_PLLFR_SHIFT) +#define HT32_CRM_PLLCFG_FR_8 (3 << HT32_CRM_PLLCFG_PLLFR_SHIFT) +#define HT32_CRM_PLLCFG_FR_16 (4 << HT32_CRM_PLLCFG_PLLFR_SHIFT) +#define HT32_CRM_PLLCFG_FR_32 (5 << HT32_CRM_PLLCFG_PLLFR_SHIFT) + +/* Clock configuration register *********************************************/ + +#define HT32_CRM_CFG_SCLKSEL_SHIFT (0) +#define HT32_CRM_CFG_SCLKSEL_MASK (3 << HT32_CRM_CFG_SCLKSEL_SHIFT) +# define HT32_CRM_CFG_SEL_HICK (0 << HT32_CRM_CFG_SCLKSEL_SHIFT) +# define HT32_CRM_CFG_SEL_HEXT (1 << HT32_CRM_CFG_SCLKSEL_SHIFT) +# define HT32_CRM_CFG_SEL_PLL (2 << HT32_CRM_CFG_SCLKSEL_SHIFT) + +#define HT32_CRM_CFG_SCLKSTS_SHIFT (2) +#define HT32_CRM_CFG_SCLKSTS_MASK (3 << HT32_CRM_CFG_SCLKSTS_SHIFT) +# define HT32_CRM_CFG_STS_HICK (0 << HT32_CRM_CFG_SCLKSTS_SHIFT) +# define HT32_CRM_CFG_STS_HEXT (1 << HT32_CRM_CFG_SCLKSTS_SHIFT) +# define HT32_CRM_CFG_STS_PLL (2 << HT32_CRM_CFG_SCLKSTS_SHIFT) + +#define HT32_CRM_CFG_AHBDIV_SHIFT (4) +#define HT32_CRM_CFG_AHBDIV_MASK (0x0f << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_NONE (0 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_2 (8 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_4 (9 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_8 (10 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_16 (11 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_64 (12 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_128 (13 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_256 (14 << HT32_CRM_CFG_AHBDIV_SHIFT) +# define HT32_CRM_CFG_AHBDIV_512 (15 << HT32_CRM_CFG_AHBDIV_SHIFT) + +#define HT32_CRM_CFG_APB1DIV_SHIFT (10) +#define HT32_CRM_CFG_APB1DIV_MASK (7 << HT32_CRM_CFG_APB1DIV_SHIFT) +# define HT32_CRM_CFG_APB1DIV_1 (0 << HT32_CRM_CFG_APB1DIV_SHIFT) +# define HT32_CRM_CFG_APB1DIV_2 (4 << HT32_CRM_CFG_APB1DIV_SHIFT) +# define HT32_CRM_CFG_APB1DIV_4 (5 << HT32_CRM_CFG_APB1DIV_SHIFT) +# define HT32_CRM_CFG_APB1DIV_8 (6 << HT32_CRM_CFG_APB1DIV_SHIFT) +# define HT32_CRM_CFG_APB1DIV_16 (7 << HT32_CRM_CFG_APB1DIV_SHIFT) +# define HT32_CRM_CFG_APB1DIV_NONE HT32_CRM_CFG_APB1DIV_1 + +#define HT32_CRM_CFG_APB2DIV_SHIFT (13) +#define HT32_CRM_CFG_APB2DIV_MASK (7 << HT32_CRM_CFG_APB2DIV_SHIFT) +# define HT32_CRM_CFG_APB2DIV_1 (0 << HT32_CRM_CFG_APB2DIV_SHIFT) +# define HT32_CRM_CFG_APB2DIV_2 (4 << HT32_CRM_CFG_APB2DIV_SHIFT) +# define HT32_CRM_CFG_APB2DIV_4 (5 << HT32_CRM_CFG_APB2DIV_SHIFT) +# define HT32_CRM_CFG_APB2DIV_8 (6 << HT32_CRM_CFG_APB2DIV_SHIFT) +# define HT32_CRM_CFG_APB2DIV_16 (7 << HT32_CRM_CFG_APB2DIV_SHIFT) +# define HT32_CRM_CFG_APB2DIV_NONE HT32_CRM_CFG_APB2DIV_1 + +/* Clock misc1 register *****************************************************/ + +#define HT32_CRM_MISC1_HICKDIV (1 << 12) +#define HT32_CRM_MISC1_HICKTOUSB (1 << 13) +#define HT32_CRM_MISC1_HICKTOSCLK (1 << 14) +#define HT32_CRM_MISC1_PLLCLKTOADC (1 << 15) + +/* Clock misc2 register *****************************************************/ + +#define HT32_CRM_MISC2_AUTOSTEP_SHIFT (4) +#define HT32_CRM_MISC2_AUTOSTEP_MASK (3 << HT32_CRM_MISC2_AUTOSTEP_SHIFT) +#define HT32_CRM_MISC2_AUTOSTEP_ENABLE (3 << HT32_CRM_MISC2_AUTOSTEP_SHIFT) +#define HT32_CRM_MISC2_HICKDIV_SHIFT (16) +#define HT32_CRM_MISC2_HICKDIV_MASK (7 << HT32_CRM_MISC2_HICKDIV_SHIFT) +# define HT32_CRM_MISC2_HICKDIV_1 (0 << HT32_CRM_MISC2_HICKDIV_SHIFT) +# define HT32_CRM_MISC2_HICKDIV_2 (1 << HT32_CRM_MISC2_HICKDIV_SHIFT) +# define HT32_CRM_MISC2_HICKDIV_4 (2 << HT32_CRM_MISC2_HICKDIV_SHIFT) +# define HT32_CRM_MISC2_HICKDIV_8 (3 << HT32_CRM_MISC2_HICKDIV_SHIFT) +# define HT32_CRM_MISC2_HICKDIV_16 (4 << HT32_CRM_MISC2_HICKDIV_SHIFT) + +/* Peripheral independent clocks register ***********************************/ + +#define HT32_CRM_PICLKS_USART1SEL_SHIFT (0) +#define HT32_CRM_PICLKS_USART1SEL_MASK (3 << HT32_CRM_PICLKS_USART1SEL_SHIFT) +#define HT32_CRM_PICLKS_USART2SEL_SHIFT (2) +#define HT32_CRM_PICLKS_USART2SEL_MASK (3 << HT32_CRM_PICLKS_USART2SEL_SHIFT) +#define HT32_CRM_PICLKS_USART3SEL_SHIFT (4) +#define HT32_CRM_PICLKS_USART3SEL_MASK (3 << HT32_CRM_PICLKS_USART3SEL_SHIFT) + +#define HT32_CRM_PICLKS_USARTSEL_PCLK 0 +#define HT32_CRM_PICLKS_USARTSEL_SCLK 1 +#define HT32_CRM_PICLKS_USARTSEL_HICK 2 +#define HT32_CRM_PICLKS_USARTSEL_LEXT 3 + +/* Peripheral reset registers ***********************************************/ + +#define HT32_CRM_APB1RST_USART2RST (1 << 17) +#define HT32_CRM_APB1RST_USART3RST (1 << 18) + +#define HT32_CRM_APB2RST_USART1RST (1 << 4) + +/* Clock enable registers ***************************************************/ + +#define HT32_CRM_AHBEN1_GPIOAEN (1 << 0) +#define HT32_CRM_AHBEN1_GPIOBEN (1 << 1) +#define HT32_CRM_AHBEN1_GPIOCEN (1 << 2) +#define HT32_CRM_AHBEN1_GPIODEN (1 << 3) +#define HT32_CRM_AHBEN1_GPIOEEN (1 << 4) +#define HT32_CRM_AHBEN1_GPIOFEN (1 << 5) +#define HT32_CRM_AHBEN1_CRCEN (1 << 12) +#define HT32_CRM_AHBEN1_DMA1EN (1 << 22) +#define HT32_CRM_AHBEN1_DMA2EN (1 << 24) + +#define HT32_CRM_AHBEN2_OTGFS1EN (1 << 7) + +#define HT32_CRM_AHBEN3_XMCEN (1 << 0) + +#define HT32_CRM_APB1EN_TMR2EN (1 << 0) +#define HT32_CRM_APB1EN_TMR3EN (1 << 1) +#define HT32_CRM_APB1EN_TMR4EN (1 << 2) +#define HT32_CRM_APB1EN_TMR6EN (1 << 4) +#define HT32_CRM_APB1EN_TMR7EN (1 << 5) +#define HT32_CRM_APB1EN_TMR12EN (1 << 6) +#define HT32_CRM_APB1EN_TMR13EN (1 << 7) +#define HT32_CRM_APB1EN_TMR14EN (1 << 8) +#define HT32_CRM_APB1EN_WWDTEN (1 << 11) +#define HT32_CRM_APB1EN_SPI2EN (1 << 14) +#define HT32_CRM_APB1EN_SPI3EN (1 << 15) +#define HT32_CRM_APB1EN_USART2EN (1 << 17) +#define HT32_CRM_APB1EN_USART3EN (1 << 18) +#define HT32_CRM_APB1EN_USART4EN (1 << 19) +#define HT32_CRM_APB1EN_USART5EN (1 << 20) +#define HT32_CRM_APB1EN_I2C1EN (1 << 21) +#define HT32_CRM_APB1EN_I2C2EN (1 << 22) +#define HT32_CRM_APB1EN_I2C3EN (1 << 23) +#define HT32_CRM_APB1EN_CAN1EN (1 << 25) +#define HT32_CRM_APB1EN_CAN2EN (1 << 26) +#define HT32_CRM_APB1EN_PWCEN (1 << 28) +#define HT32_CRM_APB1EN_DACEN (1 << 29) +#define HT32_CRM_APB1EN_USART7EN (1u << 30) +#define HT32_CRM_APB1EN_USART8EN (1u << 31) + +#define HT32_CRM_APB2EN_TMR1EN (1 << 0) +#define HT32_CRM_APB2EN_USART1EN (1 << 4) +#define HT32_CRM_APB2EN_USART6EN (1 << 5) +#define HT32_CRM_APB2EN_ADC1EN (1 << 8) +#define HT32_CRM_APB2EN_SPI1EN (1 << 12) +#define HT32_CRM_APB2EN_SCFGEN (1 << 14) +#define HT32_CRM_APB2EN_TMR9EN (1 << 16) +#define HT32_CRM_APB2EN_TMR10EN (1 << 17) +#define HT32_CRM_APB2EN_TMR11EN (1 << 18) +#define HT32_CRM_APB2EN_ACCEN (1 << 29) + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_CRM_H */ diff --git a/arch/arm/src/ht32f491x3/hardware/ht32f491x3_flash.h b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_flash.h new file mode 100644 index 0000000000000..6cea92716b7f3 --- /dev/null +++ b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_flash.h @@ -0,0 +1,50 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/hardware/ht32f491x3_flash.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_FLASH_H +#define __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_FLASH_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "ht32f491x3_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32_FLASH_PSR_OFFSET 0x000 + +#define HT32_FLASH_PSR (HT32_FLASHREG_BASE + HT32_FLASH_PSR_OFFSET) + +#define HT32_FLASH_PSR_PROGRAM(wtcyc) (0x150u | (wtcyc)) + +#define HT32_FLASH_WAIT_CYCLE_0 0x00 +#define HT32_FLASH_WAIT_CYCLE_1 0x01 +#define HT32_FLASH_WAIT_CYCLE_2 0x02 +#define HT32_FLASH_WAIT_CYCLE_3 0x03 +#define HT32_FLASH_WAIT_CYCLE_4 0x04 + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_FLASH_H */ diff --git a/arch/arm/src/ht32f491x3/hardware/ht32f491x3_gpio.h b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_gpio.h new file mode 100644 index 0000000000000..451c466726968 --- /dev/null +++ b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_gpio.h @@ -0,0 +1,83 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/hardware/ht32f491x3_gpio.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_GPIO_H +#define __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_GPIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* GPIO register offsets ****************************************************/ + +#define HT32_GPIO_CFGR_OFFSET 0x0000 +#define HT32_GPIO_OMODE_OFFSET 0x0004 +#define HT32_GPIO_ODRVR_OFFSET 0x0008 +#define HT32_GPIO_PULL_OFFSET 0x000c +#define HT32_GPIO_IDT_OFFSET 0x0010 +#define HT32_GPIO_ODT_OFFSET 0x0014 +#define HT32_GPIO_SCR_OFFSET 0x0018 +#define HT32_GPIO_WPR_OFFSET 0x001c +#define HT32_GPIO_MUXL_OFFSET 0x0020 +#define HT32_GPIO_MUXH_OFFSET 0x0024 +#define HT32_GPIO_CLR_OFFSET 0x0028 + +/* GPIO helpers *************************************************************/ + +#define HT32_GPIO_PIN(n) (1u << (n)) + +#define HT32_GPIO_MODE_SHIFT(n) ((n) << 1) +#define HT32_GPIO_MODE_MASK(n) (3u << HT32_GPIO_MODE_SHIFT(n)) +#define HT32_GPIO_MODE_VALUE(n, v) ((uint32_t)(v) << HT32_GPIO_MODE_SHIFT(n)) + +#define HT32_GPIO_ODRVR_SHIFT(n) ((n) << 1) +#define HT32_GPIO_ODRVR_MASK(n) (3u << HT32_GPIO_ODRVR_SHIFT(n)) +#define HT32_GPIO_ODRVR_VALUE(n, v) ((uint32_t)(v) << HT32_GPIO_ODRVR_SHIFT(n)) + +#define HT32_GPIO_PULL_SHIFT(n) ((n) << 1) +#define HT32_GPIO_PULL_MASK(n) (3u << HT32_GPIO_PULL_SHIFT(n)) +#define HT32_GPIO_PULL_VALUE(n, v) ((uint32_t)(v) << HT32_GPIO_PULL_SHIFT(n)) + +#define HT32_GPIO_MUX_SHIFT(n) (((n) & 7u) << 2) +#define HT32_GPIO_MUX_MASK(n) (0x0fu << HT32_GPIO_MUX_SHIFT(n)) +#define HT32_GPIO_MUX_VALUE(n, af) ((uint32_t)(af) << HT32_GPIO_MUX_SHIFT(n)) +#define HT32_GPIO_MUX_OFFSET(n) (((n) < 8u) ? HT32_GPIO_MUXL_OFFSET : \ + HT32_GPIO_MUXH_OFFSET) + +/* Compatibility aliases for board pinmux code that still uses the older + * CFGLR/CFGHR naming for alternate-function selection. + */ + +#define HT32_GPIO_CFGLR_OFFSET HT32_GPIO_MUXL_OFFSET +#define HT32_GPIO_CFGHR_OFFSET HT32_GPIO_MUXH_OFFSET +#define HT32_GPIO_CFG_SHIFT(n) HT32_GPIO_MUX_SHIFT(n) +#define HT32_GPIO_CFG_MASK(n) HT32_GPIO_MUX_MASK(n) +#define HT32_GPIO_CFG_VALUE(n, af) HT32_GPIO_MUX_VALUE(n, af) +#define HT32_GPIO_CFG_OFFSET(n) HT32_GPIO_MUX_OFFSET(n) + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_GPIO_H */ diff --git a/arch/arm/src/ht32f491x3/hardware/ht32f491x3_memorymap.h b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_memorymap.h new file mode 100644 index 0000000000000..fbe0c1228f37b --- /dev/null +++ b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_memorymap.h @@ -0,0 +1,127 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/hardware/ht32f491x3_memorymap.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_MEMORYMAP_H +#define __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_MEMORYMAP_H + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Address blocks ***********************************************************/ + +#define HT32_CODE_BASE 0x00000000 +#define HT32_SRAM_BASE 0x20000000 +#define HT32_PERIPH_BASE 0x40000000 +#define HT32_XMC_MEM_BASE 0x60000000 +#define HT32_XMC_BANK1 HT32_XMC_MEM_BASE +#define HT32_XMC_REG_BASE 0xa0000000 +#define HT32_CORTEX_BASE 0xe0000000 + +/* Code region **************************************************************/ + +#define HT32_BOOT_BASE 0x00000000 +#define HT32_FLASH_BASE 0x08000000 +#define HT32_FLASHREG_BASE 0x40023c00 +#define HT32_SYSMEM_BASE 0x1fffa400 +#define HT32_USERDATA_BASE 0x1ffff800 + +/* SRAM region **************************************************************/ + +#define HT32_SRAMBB_BASE 0x22000000 + +/* Peripheral region ********************************************************/ + +#define HT32_APB1_BASE 0x40000000 +#define HT32_APB2_BASE 0x40010000 +#define HT32_AHB1_BASE 0x40020000 +#define HT32_AHB2_BASE 0x50000000 + +/* APB1 */ + +#define HT32_TMR2_BASE 0x40000000 +#define HT32_TMR3_BASE 0x40000400 +#define HT32_TMR4_BASE 0x40000800 +#define HT32_TMR6_BASE 0x40001000 +#define HT32_TMR7_BASE 0x40001400 +#define HT32_TMR12_BASE 0x40001800 +#define HT32_TMR13_BASE 0x40001c00 +#define HT32_TMR14_BASE 0x40002000 +#define HT32_ERTC_BASE 0x40002800 +#define HT32_WWDT_BASE 0x40002c00 +#define HT32_WDT_BASE 0x40003000 +#define HT32_SPI2_BASE 0x40003800 +#define HT32_SPI3_BASE 0x40003c00 +#define HT32_USART2_BASE 0x40004400 +#define HT32_USART3_BASE 0x40004800 +#define HT32_USART4_BASE 0x40004c00 +#define HT32_USART5_BASE 0x40005000 +#define HT32_I2C1_BASE 0x40005400 +#define HT32_I2C2_BASE 0x40005800 +#define HT32_I2C3_BASE 0x40005c00 +#define HT32_CAN1_BASE 0x40006400 +#define HT32_CAN2_BASE 0x40006800 +#define HT32_PWC_BASE 0x40007000 +#define HT32_DAC_BASE 0x40007400 +#define HT32_USART7_BASE 0x40007800 +#define HT32_USART8_BASE 0x40007c00 + +/* APB2 */ + +#define HT32_TMR1_BASE 0x40010000 +#define HT32_USART1_BASE 0x40011000 +#define HT32_USART6_BASE 0x40011400 +#define HT32_ADC1_BASE 0x40012000 +#define HT32_ADC_BASE HT32_ADC1_BASE +#define HT32_ADCCOM_BASE 0x40012300 +#define HT32_SPI1_BASE 0x40013000 +#define HT32_SCFG_BASE 0x40013800 +#define HT32_EXINT_BASE 0x40013c00 +#define HT32_TMR9_BASE 0x40014000 +#define HT32_TMR10_BASE 0x40014400 +#define HT32_TMR11_BASE 0x40014800 +#define HT32_ACC_BASE 0x40017400 + +/* AHB1 */ + +#define HT32_GPIOA_BASE 0x40020000 +#define HT32_GPIOB_BASE 0x40020400 +#define HT32_GPIOC_BASE 0x40020800 +#define HT32_GPIOD_BASE 0x40020c00 +#define HT32_GPIOE_BASE 0x40021000 +#define HT32_GPIOF_BASE 0x40021400 +#define HT32_CRC_BASE 0x40023000 +#define HT32_CRM_BASE 0x40023800 +#define HT32_FLASHIF_BASE 0x40023c00 +#define HT32_DMA1_BASE 0x40026000 +#define HT32_DMA2_BASE 0x40026400 + +/* AHB2 */ + +#define HT32_OTGFS1_BASE 0x50000000 +#define HT32_OTGFS_BASE HT32_OTGFS1_BASE + +/* Cortex-M4 system control space *******************************************/ + +#define HT32_SCS_BASE 0xe000e000 + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_MEMORYMAP_H */ diff --git a/arch/arm/src/ht32f491x3/hardware/ht32f491x3_pwc.h b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_pwc.h new file mode 100644 index 0000000000000..94f80da49453d --- /dev/null +++ b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_pwc.h @@ -0,0 +1,48 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/hardware/ht32f491x3_pwc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_PWC_H +#define __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_PWC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "ht32f491x3_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32_PWC_LDOOV_OFFSET 0x010 + +#define HT32_PWC_LDOOV (HT32_PWC_BASE + HT32_PWC_LDOOV_OFFSET) + +#define HT32_PWC_LDOOVSEL_SHIFT 0 +#define HT32_PWC_LDOOVSEL_MASK (3 << HT32_PWC_LDOOVSEL_SHIFT) +#define HT32_PWC_LDO_OUTPUT_1V1 (1 << HT32_PWC_LDOOVSEL_SHIFT) +#define HT32_PWC_LDO_OUTPUT_1V2 (2 << HT32_PWC_LDOOVSEL_SHIFT) +#define HT32_PWC_LDO_OUTPUT_1V3 (3 << HT32_PWC_LDOOVSEL_SHIFT) + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_PWC_H */ diff --git a/arch/arm/src/ht32f491x3/hardware/ht32f491x3_uart.h b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_uart.h new file mode 100644 index 0000000000000..3d059206c2a24 --- /dev/null +++ b/arch/arm/src/ht32f491x3/hardware/ht32f491x3_uart.h @@ -0,0 +1,147 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/hardware/ht32f491x3_uart.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_UART_H +#define __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_UART_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define HT32_USART_STS_OFFSET 0x00 +#define HT32_USART_DT_OFFSET 0x04 +#define HT32_USART_BAUDR_OFFSET 0x08 +#define HT32_USART_CTRL1_OFFSET 0x0c +#define HT32_USART_CTRL2_OFFSET 0x10 +#define HT32_USART_CTRL3_OFFSET 0x14 +#define HT32_USART_GDIV_OFFSET 0x18 +#define HT32_USART_RTOR_OFFSET 0x1c +#define HT32_USART_IFC_OFFSET 0x20 + +/* Register Addresses *******************************************************/ + +#define HT32_USART1_STS (HT32_USART1_BASE + HT32_USART_STS_OFFSET) +#define HT32_USART1_DT (HT32_USART1_BASE + HT32_USART_DT_OFFSET) +#define HT32_USART1_BAUDR (HT32_USART1_BASE + HT32_USART_BAUDR_OFFSET) +#define HT32_USART1_CTRL1 (HT32_USART1_BASE + HT32_USART_CTRL1_OFFSET) +#define HT32_USART1_CTRL2 (HT32_USART1_BASE + HT32_USART_CTRL2_OFFSET) +#define HT32_USART1_CTRL3 (HT32_USART1_BASE + HT32_USART_CTRL3_OFFSET) + +#define HT32_USART2_STS (HT32_USART2_BASE + HT32_USART_STS_OFFSET) +#define HT32_USART2_DT (HT32_USART2_BASE + HT32_USART_DT_OFFSET) +#define HT32_USART2_BAUDR (HT32_USART2_BASE + HT32_USART_BAUDR_OFFSET) +#define HT32_USART2_CTRL1 (HT32_USART2_BASE + HT32_USART_CTRL1_OFFSET) +#define HT32_USART2_CTRL2 (HT32_USART2_BASE + HT32_USART_CTRL2_OFFSET) +#define HT32_USART2_CTRL3 (HT32_USART2_BASE + HT32_USART_CTRL3_OFFSET) + +#define HT32_USART3_STS (HT32_USART3_BASE + HT32_USART_STS_OFFSET) +#define HT32_USART3_DT (HT32_USART3_BASE + HT32_USART_DT_OFFSET) +#define HT32_USART3_BAUDR (HT32_USART3_BASE + HT32_USART_BAUDR_OFFSET) +#define HT32_USART3_CTRL1 (HT32_USART3_BASE + HT32_USART_CTRL1_OFFSET) +#define HT32_USART3_CTRL2 (HT32_USART3_BASE + HT32_USART_CTRL2_OFFSET) +#define HT32_USART3_CTRL3 (HT32_USART3_BASE + HT32_USART_CTRL3_OFFSET) + +/* Status register **********************************************************/ + +#define HT32_USART_STS_PERR (1 << 0) +#define HT32_USART_STS_FERR (1 << 1) +#define HT32_USART_STS_NERR (1 << 2) +#define HT32_USART_STS_ROERR (1 << 3) +#define HT32_USART_STS_IDLEF (1 << 4) +#define HT32_USART_STS_RDBF (1 << 5) +#define HT32_USART_STS_TDC (1 << 6) +#define HT32_USART_STS_TDBE (1 << 7) +#define HT32_USART_STS_BFF (1 << 8) +#define HT32_USART_STS_CTSCF (1 << 9) +#define HT32_USART_STS_LPWUF (1 << 20) +#define HT32_USART_STS_TXON (1 << 21) +#define HT32_USART_STS_RXON (1 << 22) + +/* Data register ************************************************************/ + +#define HT32_USART_DT_SHIFT (0) +#define HT32_USART_DT_MASK (0x1ff << HT32_USART_DT_SHIFT) + +/* Baud rate register *******************************************************/ + +#define HT32_USART_BAUDR_DIV_SHIFT (0) +#define HT32_USART_BAUDR_DIV_MASK (0xffff << HT32_USART_BAUDR_DIV_SHIFT) + +/* Control register 1 *******************************************************/ + +#define HT32_USART_CTRL1_SBF (1 << 0) +#define HT32_USART_CTRL1_RM (1 << 1) +#define HT32_USART_CTRL1_REN (1 << 2) +#define HT32_USART_CTRL1_TEN (1 << 3) +#define HT32_USART_CTRL1_IDLEIEN (1 << 4) +#define HT32_USART_CTRL1_RDBFIEN (1 << 5) +#define HT32_USART_CTRL1_TDCIEN (1 << 6) +#define HT32_USART_CTRL1_TDBEIEN (1 << 7) +#define HT32_USART_CTRL1_PERRIEN (1 << 8) +#define HT32_USART_CTRL1_PSEL (1 << 9) +#define HT32_USART_CTRL1_PEN (1 << 10) +#define HT32_USART_CTRL1_WUM (1 << 11) +#define HT32_USART_CTRL1_DBN0 (1 << 12) +#define HT32_USART_CTRL1_UEN (1 << 13) +#define HT32_USART_CTRL1_DBN1 (1 << 28) + +/* Control register 2 *******************************************************/ + +#define HT32_USART_CTRL2_BFIEN (1 << 6) +#define HT32_USART_CTRL2_LBCP (1 << 8) +#define HT32_USART_CTRL2_CLKPHA (1 << 9) +#define HT32_USART_CTRL2_CLKPOL (1 << 10) +#define HT32_USART_CTRL2_CLKEN (1 << 11) +#define HT32_USART_CTRL2_STOPBN_SHIFT (12) +#define HT32_USART_CTRL2_STOPBN_MASK (3 << HT32_USART_CTRL2_STOPBN_SHIFT) +#define HT32_USART_CTRL2_STOPBN_10 (0 << HT32_USART_CTRL2_STOPBN_SHIFT) +#define HT32_USART_CTRL2_STOPBN_05 (1 << HT32_USART_CTRL2_STOPBN_SHIFT) +#define HT32_USART_CTRL2_STOPBN_20 (2 << HT32_USART_CTRL2_STOPBN_SHIFT) +#define HT32_USART_CTRL2_STOPBN_15 (3 << HT32_USART_CTRL2_STOPBN_SHIFT) + +/* Control register 3 *******************************************************/ + +#define HT32_USART_CTRL3_ERRIEN (1 << 0) +#define HT32_USART_CTRL3_DMAREN (1 << 6) +#define HT32_USART_CTRL3_DMATEN (1 << 7) +#define HT32_USART_CTRL3_RTSEN (1 << 8) +#define HT32_USART_CTRL3_CTSEN (1 << 9) +#define HT32_USART_CTRL3_CTSCFIEN (1 << 10) +#define HT32_USART_CTRL3_RS485EN (1 << 14) +#define HT32_USART_CTRL3_DEP (1 << 15) + +/* Convenience aliases ******************************************************/ + +#define HT32_USART_RDR_OFFSET HT32_USART_DT_OFFSET +#define HT32_USART_TDR_OFFSET HT32_USART_DT_OFFSET + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HARDWARE_HT32F491X3_UART_H */ diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_config.h b/arch/arm/src/ht32f491x3/ht32f491x3_config.h new file mode 100644 index 0000000000000..459d4d29bc8cf --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_config.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_config.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_CONFIG_H +#define __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_CONFIG_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#undef HAVE_UART +#if defined(CONFIG_HT32F491X3_USART1_SERIALDRIVER) || \ + defined(CONFIG_HT32F491X3_USART2_SERIALDRIVER) || \ + defined(CONFIG_HT32F491X3_USART3_SERIALDRIVER) +# define HAVE_UART 1 +#endif + +#undef HAVE_CONSOLE +#if (defined(CONFIG_USART1_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART1_SERIALDRIVER)) || \ + (defined(CONFIG_USART2_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART2_SERIALDRIVER)) || \ + (defined(CONFIG_USART3_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART3_SERIALDRIVER)) +# define HAVE_CONSOLE 1 +#endif + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_CONFIG_H */ diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_gpio.c b/arch/arm/src/ht32f491x3/ht32f491x3_gpio.c new file mode 100644 index 0000000000000..92d3def504d8e --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_gpio.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_gpio.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "arm_internal.h" + +#include "ht32f491x3_gpio.h" + +#include "hardware/ht32f491x3_gpio.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void ht32f491x3_gpioconfig(uintptr_t base, unsigned int pin, + unsigned int mode, bool opendrain, + unsigned int drive, unsigned int pull, + unsigned int af) +{ + modifyreg32(base + HT32_GPIO_CFGR_OFFSET, + HT32_GPIO_MODE_MASK(pin), + HT32_GPIO_MODE_VALUE(pin, mode)); + + modifyreg32(base + HT32_GPIO_OMODE_OFFSET, + HT32_GPIO_PIN(pin), + opendrain ? HT32_GPIO_PIN(pin) : 0); + + modifyreg32(base + HT32_GPIO_ODRVR_OFFSET, + HT32_GPIO_ODRVR_MASK(pin), + HT32_GPIO_ODRVR_VALUE(pin, drive)); + + modifyreg32(base + HT32_GPIO_PULL_OFFSET, + HT32_GPIO_PULL_MASK(pin), + HT32_GPIO_PULL_VALUE(pin, pull)); + + modifyreg32(base + HT32_GPIO_MUX_OFFSET(pin), + HT32_GPIO_MUX_MASK(pin), + mode == HT32_GPIO_MODE_ALTFN ? + HT32_GPIO_MUX_VALUE(pin, af) : 0); +} + +void ht32f491x3_gpiowrite(uintptr_t base, unsigned int pin, bool value) +{ + putreg32(HT32_GPIO_PIN(pin), + base + (value ? HT32_GPIO_SCR_OFFSET : HT32_GPIO_CLR_OFFSET)); +} + +bool ht32f491x3_gpioread(uintptr_t base, unsigned int pin) +{ + return (getreg32(base + HT32_GPIO_IDT_OFFSET) & HT32_GPIO_PIN(pin)) != 0; +} diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_gpio.h b/arch/arm/src/ht32f491x3/ht32f491x3_gpio.h new file mode 100644 index 0000000000000..aae7b3ecf7204 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_gpio.h @@ -0,0 +1,63 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_gpio.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_GPIO_H +#define __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_GPIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32_GPIO_MODE_INPUT 0u +#define HT32_GPIO_MODE_OUTPUT 1u +#define HT32_GPIO_MODE_ALTFN 2u +#define HT32_GPIO_MODE_ANALOG 3u + +#define HT32_GPIO_DRIVE_LOW 0u +#define HT32_GPIO_DRIVE_MEDIUM 1u +#define HT32_GPIO_DRIVE_HIGH 2u + +#define HT32_GPIO_PULL_NONE 0u +#define HT32_GPIO_PULL_UP 1u +#define HT32_GPIO_PULL_DOWN 2u + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +void ht32f491x3_gpioconfig(uintptr_t base, unsigned int pin, + unsigned int mode, bool opendrain, + unsigned int drive, unsigned int pull, + unsigned int af); +void ht32f491x3_gpiowrite(uintptr_t base, unsigned int pin, bool value); +bool ht32f491x3_gpioread(uintptr_t base, unsigned int pin); + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_GPIO_H */ diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_irq.c b/arch/arm/src/ht32f491x3/ht32f491x3_irq.c new file mode 100644 index 0000000000000..49f45c0f10497 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_irq.c @@ -0,0 +1,310 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_irq.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "nvic.h" +#ifdef CONFIG_ARCH_RAMVECTORS +# include "ram_vectors.h" +#endif +#include "arm_internal.h" +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define DEFPRIORITY32 \ + (NVIC_SYSH_PRIORITY_DEFAULT << 24 | \ + NVIC_SYSH_PRIORITY_DEFAULT << 16 | \ + NVIC_SYSH_PRIORITY_DEFAULT << 8 | \ + NVIC_SYSH_PRIORITY_DEFAULT) + +#define NVIC_ENA_OFFSET (0) +#define NVIC_CLRENA_OFFSET (NVIC_IRQ0_31_CLEAR - NVIC_IRQ0_31_ENABLE) + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_FEATURES +static int ht32_nmi(int irq, FAR void *context, FAR void *arg) +{ + UNUSED(irq); + UNUSED(context); + UNUSED(arg); + + up_irq_save(); + _err("PANIC!!! NMI received\n"); + PANIC(); + return 0; +} + +static int ht32_pendsv(int irq, FAR void *context, FAR void *arg) +{ + UNUSED(irq); + UNUSED(context); + UNUSED(arg); + + up_irq_save(); + _err("PANIC!!! PendSV received\n"); + PANIC(); + return 0; +} + +static int ht32_dbgmonitor(int irq, FAR void *context, FAR void *arg) +{ + UNUSED(irq); + UNUSED(context); + UNUSED(arg); + + up_irq_save(); + _err("PANIC!!! Debug Monitor received\n"); + PANIC(); + return 0; +} + +static int ht32_reserved(int irq, FAR void *context, FAR void *arg) +{ + UNUSED(irq); + UNUSED(context); + UNUSED(arg); + + up_irq_save(); + _err("PANIC!!! Reserved interrupt\n"); + PANIC(); + return 0; +} +#endif + +static inline void ht32_prioritize_syscall(int priority) +{ + uint32_t regval; + + regval = getreg32(NVIC_SYSH8_11_PRIORITY); + regval &= ~NVIC_SYSH_PRIORITY_PR11_MASK; + regval |= (priority << NVIC_SYSH_PRIORITY_PR11_SHIFT); + putreg32(regval, NVIC_SYSH8_11_PRIORITY); +} + +static int ht32_irqinfo(int irq, uintptr_t *regaddr, uint32_t *bit, + uintptr_t offset) +{ + int n; + + DEBUGASSERT(irq >= HT32_IRQ_NMI && irq < NR_IRQS); + + if (irq >= HT32_IRQ_FIRST) + { + n = irq - HT32_IRQ_FIRST; + *regaddr = NVIC_IRQ_ENABLE(n) + offset; + *bit = (uint32_t)1 << (n & 0x1f); + } + else + { + *regaddr = NVIC_SYSHCON; + if (irq == HT32_IRQ_MEMFAULT) + { + *bit = NVIC_SYSHCON_MEMFAULTENA; + } + else if (irq == HT32_IRQ_BUSFAULT) + { + *bit = NVIC_SYSHCON_BUSFAULTENA; + } + else if (irq == HT32_IRQ_USAGEFAULT) + { + *bit = NVIC_SYSHCON_USGFAULTENA; + } + else if (irq == HT32_IRQ_SYSTICK) + { + *regaddr = NVIC_SYSTICK_CTRL; + *bit = NVIC_SYSTICK_CTRL_ENABLE; + } + else + { + return -EINVAL; + } + } + + return 0; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void up_irqinitialize(void) +{ + uint32_t regaddr; + int num_priority_registers; + int i; + + for (i = 0; i < NR_IRQS - HT32_IRQ_FIRST; i += 32) + { + putreg32(0xffffffff, NVIC_IRQ_CLEAR(i)); + } + +#if defined(__ICCARM__) + putreg32((uint32_t)__vector_table, NVIC_VECTAB); +#else + putreg32((uint32_t)_vectors, NVIC_VECTAB); +#endif + +#ifdef CONFIG_ARCH_RAMVECTORS + arm_ramvec_initialize(); +#endif + + putreg32(DEFPRIORITY32, NVIC_SYSH4_7_PRIORITY); + putreg32(DEFPRIORITY32, NVIC_SYSH8_11_PRIORITY); + putreg32(DEFPRIORITY32, NVIC_SYSH12_15_PRIORITY); + + num_priority_registers = (getreg32(NVIC_ICTR) + 1) * 8; + regaddr = NVIC_IRQ0_3_PRIORITY; + + while (num_priority_registers-- > 0) + { + putreg32(DEFPRIORITY32, regaddr); + regaddr += 4; + } + + irq_attach(HT32_IRQ_SVCALL, arm_svcall, NULL); + irq_attach(HT32_IRQ_HARDFAULT, arm_hardfault, NULL); + ht32_prioritize_syscall(NVIC_SYSH_SVCALL_PRIORITY); + +#ifdef CONFIG_ARM_MPU + irq_attach(HT32_IRQ_MEMFAULT, arm_memfault, NULL); + up_enable_irq(HT32_IRQ_MEMFAULT); +#endif + +#ifdef CONFIG_DEBUG_FEATURES + irq_attach(HT32_IRQ_NMI, ht32_nmi, NULL); +#ifndef CONFIG_ARM_MPU + irq_attach(HT32_IRQ_MEMFAULT, arm_memfault, NULL); +#endif + irq_attach(HT32_IRQ_BUSFAULT, arm_busfault, NULL); + irq_attach(HT32_IRQ_USAGEFAULT, arm_usagefault, NULL); + irq_attach(HT32_IRQ_PENDSV, ht32_pendsv, NULL); + irq_attach(HT32_IRQ_DBGMONITOR, ht32_dbgmonitor, NULL); + irq_attach(HT32_IRQ_RESERVED, ht32_reserved, NULL); +#endif + +#ifndef CONFIG_SUPPRESS_INTERRUPTS + arm_color_intstack(); + up_irq_enable(); +#endif +} + +void up_disable_irq(int irq) +{ + uintptr_t regaddr; + uint32_t regval; + uint32_t bit; + + if (ht32_irqinfo(irq, ®addr, &bit, NVIC_CLRENA_OFFSET) < 0) + { + return; + } + + if (irq >= HT32_IRQ_FIRST) + { + putreg32(bit, regaddr); + } + else + { + regval = getreg32(regaddr); + regval &= ~bit; + putreg32(regval, regaddr); + } +} + +void up_enable_irq(int irq) +{ + uintptr_t regaddr; + uint32_t regval; + uint32_t bit; + + if (ht32_irqinfo(irq, ®addr, &bit, NVIC_ENA_OFFSET) < 0) + { + return; + } + + if (irq >= HT32_IRQ_FIRST) + { + putreg32(bit, regaddr); + } + else + { + regval = getreg32(regaddr); + regval |= bit; + putreg32(regval, regaddr); + } +} + +void arm_ack_irq(int irq) +{ + UNUSED(irq); +} + +#ifdef CONFIG_ARCH_IRQPRIO +int up_prioritize_irq(int irq, int priority) +{ + uint32_t regaddr; + uint32_t regval; + int shift; + + DEBUGASSERT(irq >= HT32_IRQ_MEMFAULT && irq < NR_IRQS && + (unsigned)priority <= NVIC_SYSH_PRIORITY_MIN); + + if (irq < HT32_IRQ_FIRST) + { + regaddr = NVIC_SYSH_PRIORITY(irq); + irq -= 4; + } + else + { + irq -= HT32_IRQ_FIRST; + regaddr = NVIC_IRQ_PRIORITY(irq); + } + + regval = getreg32(regaddr); + shift = ((irq & 3) << 3); + regval &= ~(0xff << shift); + regval |= ((uint32_t)priority << shift); + putreg32(regval, regaddr); + + return 0; +} +#endif diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_lowputc.c b/arch/arm/src/ht32f491x3/ht32f491x3_lowputc.c new file mode 100644 index 0000000000000..c22c40ae9d29a --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_lowputc.c @@ -0,0 +1,287 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_lowputc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include + +#include "arm_internal.h" +#include "chip.h" + +#include "ht32f491x3_config.h" +#include "ht32f491x3_gpio.h" +#include "ht32f491x3_lowputc.h" +#include "ht32f491x3_serial.h" + +#include "hardware/ht32f491x3_crm.h" +#include "hardware/ht32f491x3_gpio.h" +#include "hardware/ht32f491x3_uart.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef HAVE_CONSOLE +# if defined(CONFIG_USART1_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART1_SERIALDRIVER) +# define HT32_CONSOLE_BASE HT32_USART1_BASE +# define HT32_CONSOLE_APBREG HT32_CRM_APB2EN +# define HT32_CONSOLE_APBEN HT32_CRM_APB2EN_USART1EN +# define HT32_CONSOLE_CLOCK HT32_PCLK2_FREQUENCY +# define HT32_CONSOLE_BAUD CONFIG_USART1_BAUD +# define HT32_CONSOLE_BITS CONFIG_USART1_BITS +# define HT32_CONSOLE_PARITY CONFIG_USART1_PARITY +# define HT32_CONSOLE_2STOP CONFIG_USART1_2STOP +# elif defined(CONFIG_USART2_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART2_SERIALDRIVER) +# define HT32_CONSOLE_BASE HT32_USART2_BASE +# define HT32_CONSOLE_APBREG HT32_CRM_APB1EN +# define HT32_CONSOLE_APBEN HT32_CRM_APB1EN_USART2EN +# define HT32_CONSOLE_CLOCK HT32_PCLK1_FREQUENCY +# define HT32_CONSOLE_BAUD CONFIG_USART2_BAUD +# define HT32_CONSOLE_BITS CONFIG_USART2_BITS +# define HT32_CONSOLE_PARITY CONFIG_USART2_PARITY +# define HT32_CONSOLE_2STOP CONFIG_USART2_2STOP +# elif defined(CONFIG_USART3_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART3_SERIALDRIVER) +# define HT32_CONSOLE_BASE HT32_USART3_BASE +# define HT32_CONSOLE_APBREG HT32_CRM_APB1EN +# define HT32_CONSOLE_APBEN HT32_CRM_APB1EN_USART3EN +# define HT32_CONSOLE_CLOCK HT32_PCLK1_FREQUENCY +# define HT32_CONSOLE_BAUD CONFIG_USART3_BAUD +# define HT32_CONSOLE_BITS CONFIG_USART3_BITS +# define HT32_CONSOLE_PARITY CONFIG_USART3_PARITY +# define HT32_CONSOLE_2STOP CONFIG_USART3_2STOP +# endif + +# define HT32_USART_CTRL1_CLRBITS \ + (HT32_USART_CTRL1_SBF | HT32_USART_CTRL1_RM | HT32_USART_CTRL1_REN | \ + HT32_USART_CTRL1_TEN | HT32_USART_CTRL1_IDLEIEN | \ + HT32_USART_CTRL1_RDBFIEN | HT32_USART_CTRL1_TDCIEN | \ + HT32_USART_CTRL1_TDBEIEN | HT32_USART_CTRL1_PERRIEN | \ + HT32_USART_CTRL1_PSEL | HT32_USART_CTRL1_PEN | \ + HT32_USART_CTRL1_WUM | HT32_USART_CTRL1_DBN0 | \ + HT32_USART_CTRL1_UEN | HT32_USART_CTRL1_DBN1) + +# define HT32_USART_CTRL2_CLRBITS \ + (HT32_USART_CTRL2_BFIEN | HT32_USART_CTRL2_LBCP | \ + HT32_USART_CTRL2_CLKPHA | HT32_USART_CTRL2_CLKPOL | \ + HT32_USART_CTRL2_CLKEN | HT32_USART_CTRL2_STOPBN_MASK) + +# define HT32_USART_CTRL3_CLRBITS \ + (HT32_USART_CTRL3_ERRIEN | HT32_USART_CTRL3_DMAREN | \ + HT32_USART_CTRL3_DMATEN | HT32_USART_CTRL3_RTSEN | \ + HT32_USART_CTRL3_CTSEN | HT32_USART_CTRL3_CTSCFIEN | \ + HT32_USART_CTRL3_RS485EN | HT32_USART_CTRL3_DEP) +#endif + +static uint32_t ht32f491x3_bauddiv(uint32_t clock, uint32_t baud) +{ + uint32_t div; + + div = (clock * 10u) / baud; + return ((div % 10u) < 5u) ? (div / 10u) : (div / 10u + 1u); +} + +void ht32f491x3_usart_config(uintptr_t uartbase) +{ + if (uartbase == HT32_USART1_BASE) + { + modifyreg32(HT32_CRM_PICLKS, + HT32_CRM_PICLKS_USART1SEL_MASK, + HT32_CRM_PICLKS_USARTSEL_PCLK << + HT32_CRM_PICLKS_USART1SEL_SHIFT); + modifyreg32(HT32_CRM_APB2RST, 0, HT32_CRM_APB2RST_USART1RST); + modifyreg32(HT32_CRM_APB2RST, HT32_CRM_APB2RST_USART1RST, 0); + } + else if (uartbase == HT32_USART2_BASE) + { + modifyreg32(HT32_CRM_PICLKS, + HT32_CRM_PICLKS_USART2SEL_MASK, + HT32_CRM_PICLKS_USARTSEL_PCLK << + HT32_CRM_PICLKS_USART2SEL_SHIFT); + modifyreg32(HT32_CRM_APB1RST, 0, HT32_CRM_APB1RST_USART2RST); + modifyreg32(HT32_CRM_APB1RST, HT32_CRM_APB1RST_USART2RST, 0); + } + else if (uartbase == HT32_USART3_BASE) + { + modifyreg32(HT32_CRM_PICLKS, + HT32_CRM_PICLKS_USART3SEL_MASK, + HT32_CRM_PICLKS_USARTSEL_PCLK << + HT32_CRM_PICLKS_USART3SEL_SHIFT); + modifyreg32(HT32_CRM_APB1RST, 0, HT32_CRM_APB1RST_USART3RST); + modifyreg32(HT32_CRM_APB1RST, HT32_CRM_APB1RST_USART3RST, 0); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/* Configure the board-specific pinmux for the selected USART. The physical + * mapping comes from BOARD_USARTx_* macros in . + */ + +void ht32f491x3_usart_pins(uintptr_t uartbase) +{ +#ifdef BOARD_USART1_GPIO_CLKEN + if (uartbase == HT32_USART1_BASE) + { + modifyreg32(HT32_CRM_AHBEN1, 0, BOARD_USART1_GPIO_CLKEN); + ht32f491x3_gpioconfig(BOARD_USART1_TX_GPIO_BASE, + BOARD_USART1_TX_PIN, HT32_GPIO_MODE_ALTFN, + false, HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_NONE, + BOARD_USART1_TX_AF); + ht32f491x3_gpioconfig(BOARD_USART1_RX_GPIO_BASE, + BOARD_USART1_RX_PIN, HT32_GPIO_MODE_ALTFN, + false, HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_UP, + BOARD_USART1_RX_AF); + return; + } +#endif + +#ifdef BOARD_USART2_GPIO_CLKEN + if (uartbase == HT32_USART2_BASE) + { + modifyreg32(HT32_CRM_AHBEN1, 0, BOARD_USART2_GPIO_CLKEN); + ht32f491x3_gpioconfig(BOARD_USART2_TX_GPIO_BASE, + BOARD_USART2_TX_PIN, HT32_GPIO_MODE_ALTFN, + false, HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_NONE, + BOARD_USART2_TX_AF); + ht32f491x3_gpioconfig(BOARD_USART2_RX_GPIO_BASE, + BOARD_USART2_RX_PIN, HT32_GPIO_MODE_ALTFN, + false, HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_UP, + BOARD_USART2_RX_AF); + return; + } +#endif + +#ifdef BOARD_USART3_GPIO_CLKEN + if (uartbase == HT32_USART3_BASE) + { + modifyreg32(HT32_CRM_AHBEN1, 0, BOARD_USART3_GPIO_CLKEN); + ht32f491x3_gpioconfig(BOARD_USART3_TX_GPIO_BASE, + BOARD_USART3_TX_PIN, HT32_GPIO_MODE_ALTFN, + false, HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_NONE, + BOARD_USART3_TX_AF); + ht32f491x3_gpioconfig(BOARD_USART3_RX_GPIO_BASE, + BOARD_USART3_RX_PIN, HT32_GPIO_MODE_ALTFN, + false, HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_UP, + BOARD_USART3_RX_AF); + } +#endif +} + +void arm_lowputc(char ch) +{ +#ifdef HAVE_CONSOLE + while ((getreg32(HT32_CONSOLE_BASE + HT32_USART_STS_OFFSET) & + HT32_USART_STS_TDBE) == 0) + { + } + + putreg32((uint32_t)ch & HT32_USART_DT_MASK, + HT32_CONSOLE_BASE + HT32_USART_DT_OFFSET); +#endif +} + +void ht32f491x3_lowsetup(void) +{ +#if defined(HAVE_CONSOLE) + uint32_t regval; + + modifyreg32(HT32_CONSOLE_APBREG, 0, HT32_CONSOLE_APBEN); + ht32f491x3_usart_config(HT32_CONSOLE_BASE); + ht32f491x3_usart_pins(HT32_CONSOLE_BASE); + +#ifndef CONFIG_SUPPRESS_UART_CONFIG + regval = getreg32(HT32_CONSOLE_BASE + HT32_USART_CTRL1_OFFSET); + regval &= ~HT32_USART_CTRL1_UEN; + putreg32(regval, HT32_CONSOLE_BASE + HT32_USART_CTRL1_OFFSET); + + regval = getreg32(HT32_CONSOLE_BASE + HT32_USART_CTRL2_OFFSET); + regval &= ~HT32_USART_CTRL2_CLRBITS; + if (HT32_CONSOLE_2STOP != 0) + { + regval |= HT32_USART_CTRL2_STOPBN_20; + } + else + { + regval |= HT32_USART_CTRL2_STOPBN_10; + } + + putreg32(regval, HT32_CONSOLE_BASE + HT32_USART_CTRL2_OFFSET); + + regval = getreg32(HT32_CONSOLE_BASE + HT32_USART_CTRL1_OFFSET); + regval &= ~HT32_USART_CTRL1_CLRBITS; + + if (HT32_CONSOLE_PARITY == 1) + { + regval |= HT32_USART_CTRL1_PEN; + } + else if (HT32_CONSOLE_PARITY == 2) + { + regval |= HT32_USART_CTRL1_PEN | HT32_USART_CTRL1_PSEL; + } + + if (HT32_CONSOLE_BITS == 9 || + (HT32_CONSOLE_BITS == 8 && HT32_CONSOLE_PARITY != 0)) + { + regval |= HT32_USART_CTRL1_DBN0; + } + else if (HT32_CONSOLE_BITS == 7) + { + regval |= HT32_USART_CTRL1_DBN1; + } + + putreg32(regval, HT32_CONSOLE_BASE + HT32_USART_CTRL1_OFFSET); + + regval = getreg32(HT32_CONSOLE_BASE + HT32_USART_CTRL3_OFFSET); + regval &= ~HT32_USART_CTRL3_CLRBITS; + putreg32(regval, HT32_CONSOLE_BASE + HT32_USART_CTRL3_OFFSET); + + putreg32(ht32f491x3_bauddiv(HT32_CONSOLE_CLOCK, HT32_CONSOLE_BAUD), + HT32_CONSOLE_BASE + HT32_USART_BAUDR_OFFSET); +#endif + + regval = getreg32(HT32_CONSOLE_BASE + HT32_USART_CTRL1_OFFSET); + regval |= HT32_USART_CTRL1_UEN | + HT32_USART_CTRL1_TEN | + HT32_USART_CTRL1_REN; + putreg32(regval, HT32_CONSOLE_BASE + HT32_USART_CTRL1_OFFSET); +#endif +} diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_lowputc.h b/arch/arm/src/ht32f491x3/ht32f491x3_lowputc.h new file mode 100644 index 0000000000000..c900b58dd41dd --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_lowputc.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_lowputc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_LOWPUTC_H +#define __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_LOWPUTC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifndef __ASSEMBLY__ +void ht32f491x3_lowsetup(void); +void ht32f491x3_usart_config(uintptr_t uartbase); +#endif + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_LOWPUTC_H */ diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_serial.c b/arch/arm/src/ht32f491x3/ht32f491x3_serial.c new file mode 100644 index 0000000000000..06ff5013159a8 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_serial.c @@ -0,0 +1,658 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_serial.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include "chip.h" +#include "arm_internal.h" + +#include "ht32f491x3_config.h" +#include "ht32f491x3_lowputc.h" +#include "ht32f491x3_serial.h" + +#include "hardware/ht32f491x3_crm.h" +#include "hardware/ht32f491x3_uart.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if defined(CONFIG_USART1_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART1_SERIALDRIVER) +# define CONSOLE_USART 1 +#elif defined(CONFIG_USART2_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART2_SERIALDRIVER) +# define CONSOLE_USART 2 +#elif defined(CONFIG_USART3_SERIAL_CONSOLE) && \ + defined(CONFIG_HT32F491X3_USART3_SERIALDRIVER) +# define CONSOLE_USART 3 +#else +# define CONSOLE_USART 0 +#endif + +#define HT32_USART_CTRL1_USED_INTS \ + (HT32_USART_CTRL1_IDLEIEN | HT32_USART_CTRL1_RDBFIEN | \ + HT32_USART_CTRL1_TDCIEN | HT32_USART_CTRL1_TDBEIEN | \ + HT32_USART_CTRL1_PERRIEN) + +#define HT32_USART_CTRL3_USED_INTS HT32_USART_CTRL3_ERRIEN + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct up_dev_s +{ + uintptr_t uartbase; + uintptr_t apbreg; + uint32_t apbmask; + uint32_t apbclock; + uint32_t baud; + uint32_t ie; + int irq; + uint8_t parity; + uint8_t bits; + bool stopbits2; + spinlock_t lock; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int up_setup(FAR struct uart_dev_s *dev); +static void up_shutdown(FAR struct uart_dev_s *dev); +static int up_attach(FAR struct uart_dev_s *dev); +static void up_detach(FAR struct uart_dev_s *dev); +static int ht32_interrupt(int irq, FAR void *context, FAR void *arg); +static int up_ioctl(FAR struct file *filep, int cmd, unsigned long arg); +static int up_receive(FAR struct uart_dev_s *dev, + FAR unsigned int *status); +static void up_rxint(FAR struct uart_dev_s *dev, bool enable); +static bool up_rxavailable(FAR struct uart_dev_s *dev); +static void up_send(FAR struct uart_dev_s *dev, int ch); +static void up_txint(FAR struct uart_dev_s *dev, bool enable); +static bool up_txready(FAR struct uart_dev_s *dev); +static bool up_txempty(FAR struct uart_dev_s *dev); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct uart_ops_s g_uart_ops = +{ + .setup = up_setup, + .shutdown = up_shutdown, + .attach = up_attach, + .detach = up_detach, + .ioctl = up_ioctl, + .receive = up_receive, + .rxint = up_rxint, + .rxavailable = up_rxavailable, + .send = up_send, + .txint = up_txint, + .txready = up_txready, + .txempty = up_txempty, +}; + +#if defined(USE_SERIALDRIVER) && defined(HAVE_UART) + +#ifdef CONFIG_HT32F491X3_USART1_SERIALDRIVER +static char g_usart1rxbuffer[CONFIG_USART1_RXBUFSIZE]; +static char g_usart1txbuffer[CONFIG_USART1_TXBUFSIZE]; + +static struct up_dev_s g_usart1priv = +{ + .uartbase = HT32_USART1_BASE, + .apbreg = HT32_CRM_APB2EN, + .apbmask = HT32_CRM_APB2EN_USART1EN, + .apbclock = HT32_PCLK2_FREQUENCY, + .baud = CONFIG_USART1_BAUD, + .irq = HT32_IRQ_USART1, + .parity = CONFIG_USART1_PARITY, + .bits = CONFIG_USART1_BITS, + .stopbits2 = CONFIG_USART1_2STOP, + .lock = SP_UNLOCKED, +}; + +static uart_dev_t g_usart1port = +{ +#if CONSOLE_USART == 1 + .isconsole = true, +#endif + .recv = + { + .size = CONFIG_USART1_RXBUFSIZE, + .buffer = g_usart1rxbuffer, + }, + .xmit = + { + .size = CONFIG_USART1_TXBUFSIZE, + .buffer = g_usart1txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_usart1priv, +}; +#endif + +#ifdef CONFIG_HT32F491X3_USART2_SERIALDRIVER +static char g_usart2rxbuffer[CONFIG_USART2_RXBUFSIZE]; +static char g_usart2txbuffer[CONFIG_USART2_TXBUFSIZE]; + +static struct up_dev_s g_usart2priv = +{ + .uartbase = HT32_USART2_BASE, + .apbreg = HT32_CRM_APB1EN, + .apbmask = HT32_CRM_APB1EN_USART2EN, + .apbclock = HT32_PCLK1_FREQUENCY, + .baud = CONFIG_USART2_BAUD, + .irq = HT32_IRQ_USART2, + .parity = CONFIG_USART2_PARITY, + .bits = CONFIG_USART2_BITS, + .stopbits2 = CONFIG_USART2_2STOP, + .lock = SP_UNLOCKED, +}; + +static uart_dev_t g_usart2port = +{ +#if CONSOLE_USART == 2 + .isconsole = true, +#endif + .recv = + { + .size = CONFIG_USART2_RXBUFSIZE, + .buffer = g_usart2rxbuffer, + }, + .xmit = + { + .size = CONFIG_USART2_TXBUFSIZE, + .buffer = g_usart2txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_usart2priv, +}; +#endif + +#ifdef CONFIG_HT32F491X3_USART3_SERIALDRIVER +static char g_usart3rxbuffer[CONFIG_USART3_RXBUFSIZE]; +static char g_usart3txbuffer[CONFIG_USART3_TXBUFSIZE]; + +static struct up_dev_s g_usart3priv = +{ + .uartbase = HT32_USART3_BASE, + .apbreg = HT32_CRM_APB1EN, + .apbmask = HT32_CRM_APB1EN_USART3EN, + .apbclock = HT32_PCLK1_FREQUENCY, + .baud = CONFIG_USART3_BAUD, + .irq = HT32_IRQ_USART3, + .parity = CONFIG_USART3_PARITY, + .bits = CONFIG_USART3_BITS, + .stopbits2 = CONFIG_USART3_2STOP, + .lock = SP_UNLOCKED, +}; + +static uart_dev_t g_usart3port = +{ +#if CONSOLE_USART == 3 + .isconsole = true, +#endif + .recv = + { + .size = CONFIG_USART3_RXBUFSIZE, + .buffer = g_usart3rxbuffer, + }, + .xmit = + { + .size = CONFIG_USART3_TXBUFSIZE, + .buffer = g_usart3txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_usart3priv, +}; +#endif + +static uart_dev_t *const g_uart_devs[] = +{ +#ifdef CONFIG_HT32F491X3_USART1_SERIALDRIVER + &g_usart1port, +#else + NULL, +#endif +#ifdef CONFIG_HT32F491X3_USART2_SERIALDRIVER + &g_usart2port, +#else + NULL, +#endif +#ifdef CONFIG_HT32F491X3_USART3_SERIALDRIVER + &g_usart3port, +#else + NULL, +#endif +}; + +#define HT32_NUART_PORTS (sizeof(g_uart_devs) / sizeof(g_uart_devs[0])) + +#if CONSOLE_USART == 1 +# define CONSOLE_DEVPTR (&g_usart1port) +#elif CONSOLE_USART == 2 +# define CONSOLE_DEVPTR (&g_usart2port) +#elif CONSOLE_USART == 3 +# define CONSOLE_DEVPTR (&g_usart3port) +#else +# define CONSOLE_DEVPTR ((FAR uart_dev_t *)0) +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static inline uint32_t up_serialin(FAR struct up_dev_s *priv, int offset) +{ + return getreg32(priv->uartbase + offset); +} + +static inline void up_serialout(FAR struct up_dev_s *priv, int offset, + uint32_t value) +{ + putreg32(value, priv->uartbase + offset); +} + +static uint32_t ht32f491x3_bauddiv(uint32_t clock, uint32_t baud) +{ + uint32_t div; + + div = (clock * 10u) / baud; + return ((div % 10u) < 5u) ? (div / 10u) : (div / 10u + 1u); +} + +static void up_setusartint_nolock(FAR struct up_dev_s *priv, uint32_t ie) +{ + uint32_t regval; + + priv->ie = ie; + + regval = up_serialin(priv, HT32_USART_CTRL1_OFFSET); + regval &= ~HT32_USART_CTRL1_USED_INTS; + regval |= ie & HT32_USART_CTRL1_USED_INTS; + up_serialout(priv, HT32_USART_CTRL1_OFFSET, regval); + + regval = up_serialin(priv, HT32_USART_CTRL3_OFFSET); + regval &= ~HT32_USART_CTRL3_USED_INTS; + regval |= ie & HT32_USART_CTRL3_USED_INTS; + up_serialout(priv, HT32_USART_CTRL3_OFFSET, regval); +} + +static void up_restoreusartint(FAR struct up_dev_s *priv, uint32_t ie) +{ + irqstate_t flags; + + flags = spin_lock_irqsave(&priv->lock); + up_setusartint_nolock(priv, ie); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static void up_disableusartint(FAR struct up_dev_s *priv, FAR uint32_t *ie) +{ + irqstate_t flags; + + flags = spin_lock_irqsave(&priv->lock); + + if (ie != NULL) + { + uint32_t regval; + + regval = up_serialin(priv, HT32_USART_CTRL1_OFFSET); + *ie = regval & HT32_USART_CTRL1_USED_INTS; + regval = up_serialin(priv, HT32_USART_CTRL3_OFFSET); + *ie |= regval & HT32_USART_CTRL3_USED_INTS; + } + + up_setusartint_nolock(priv, 0); + spin_unlock_irqrestore(&priv->lock, flags); +} + +#ifndef CONFIG_SUPPRESS_UART_CONFIG +static void up_set_format(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + uint32_t regval; + + regval = up_serialin(priv, HT32_USART_CTRL1_OFFSET); + regval &= ~(HT32_USART_CTRL1_PEN | HT32_USART_CTRL1_PSEL | + HT32_USART_CTRL1_DBN0 | HT32_USART_CTRL1_DBN1); + + if (priv->parity == 1) + { + regval |= HT32_USART_CTRL1_PEN; + } + else if (priv->parity == 2) + { + regval |= HT32_USART_CTRL1_PEN | HT32_USART_CTRL1_PSEL; + } + + if (priv->bits == 9 || (priv->bits == 8 && priv->parity != 0)) + { + regval |= HT32_USART_CTRL1_DBN0; + } + else if (priv->bits == 7) + { + regval |= HT32_USART_CTRL1_DBN1; + } + + up_serialout(priv, HT32_USART_CTRL1_OFFSET, regval); + + regval = up_serialin(priv, HT32_USART_CTRL2_OFFSET); + regval &= ~HT32_USART_CTRL2_STOPBN_MASK; + regval |= priv->stopbits2 ? HT32_USART_CTRL2_STOPBN_20 + : HT32_USART_CTRL2_STOPBN_10; + up_serialout(priv, HT32_USART_CTRL2_OFFSET, regval); + + regval = up_serialin(priv, HT32_USART_CTRL3_OFFSET); + regval &= ~(HT32_USART_CTRL3_RTSEN | HT32_USART_CTRL3_CTSEN | + HT32_USART_CTRL3_RS485EN | HT32_USART_CTRL3_DEP); + up_serialout(priv, HT32_USART_CTRL3_OFFSET, regval); + + up_serialout(priv, HT32_USART_BAUDR_OFFSET, + ht32f491x3_bauddiv(priv->apbclock, priv->baud)); +} +#endif + +static int up_setup(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + uint32_t regval; + + modifyreg32(priv->apbreg, 0, priv->apbmask); + ht32f491x3_usart_config(priv->uartbase); + ht32f491x3_usart_pins(priv->uartbase); + + regval = up_serialin(priv, HT32_USART_CTRL1_OFFSET); + regval &= ~HT32_USART_CTRL1_UEN; + up_serialout(priv, HT32_USART_CTRL1_OFFSET, regval); + +#ifndef CONFIG_SUPPRESS_UART_CONFIG + up_set_format(dev); +#endif + + regval = up_serialin(priv, HT32_USART_CTRL1_OFFSET); + regval |= HT32_USART_CTRL1_UEN | + HT32_USART_CTRL1_TEN | + HT32_USART_CTRL1_REN; + up_serialout(priv, HT32_USART_CTRL1_OFFSET, regval); + + return 0; +} + +static void up_shutdown(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + uint32_t regval; + + up_disableusartint(priv, NULL); + + regval = up_serialin(priv, HT32_USART_CTRL1_OFFSET); + regval &= ~(HT32_USART_CTRL1_UEN | + HT32_USART_CTRL1_TEN | + HT32_USART_CTRL1_REN); + up_serialout(priv, HT32_USART_CTRL1_OFFSET, regval); +} + +static int up_attach(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + int ret; + + ret = irq_attach(priv->irq, ht32_interrupt, dev); + if (ret < 0) + { + return ret; + } + + up_enable_irq(priv->irq); + return 0; +} + +static void up_detach(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + + up_disable_irq(priv->irq); + irq_detach(priv->irq); +} + +static int ht32_interrupt(int irq, FAR void *context, FAR void *arg) +{ + FAR struct uart_dev_s *dev = (FAR struct uart_dev_s *)arg; + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + uint32_t status; + + UNUSED(irq); + UNUSED(context); + + status = up_serialin(priv, HT32_USART_STS_OFFSET); + + if ((status & HT32_USART_STS_RDBF) != 0) + { + uart_recvchars(dev); + } + + if ((status & HT32_USART_STS_TDBE) != 0 && + (priv->ie & HT32_USART_CTRL1_TDBEIEN) != 0) + { + uart_xmitchars(dev); + } + + return 0; +} + +static int up_ioctl(FAR struct file *filep, int cmd, unsigned long arg) +{ + UNUSED(filep); + UNUSED(cmd); + UNUSED(arg); + return -ENOTTY; +} + +static int up_receive(FAR struct uart_dev_s *dev, FAR unsigned int *status) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + uint32_t regval; + + regval = up_serialin(priv, HT32_USART_STS_OFFSET); + if (status != NULL) + { + *status = regval; + } + + regval = up_serialin(priv, HT32_USART_RDR_OFFSET); + return (int)(regval & (HT32_USART_DT_MASK >> HT32_USART_DT_SHIFT)); +} + +static void up_rxint(FAR struct uart_dev_s *dev, bool enable) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + irqstate_t flags; + uint32_t ie; + + flags = spin_lock_irqsave(&priv->lock); + ie = priv->ie; + + if (enable) + { + ie |= HT32_USART_CTRL1_RDBFIEN | HT32_USART_CTRL3_ERRIEN; + } + else + { + ie &= ~(HT32_USART_CTRL1_RDBFIEN | HT32_USART_CTRL3_ERRIEN); + } + + up_setusartint_nolock(priv, ie); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static bool up_rxavailable(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + + return (up_serialin(priv, HT32_USART_STS_OFFSET) & + HT32_USART_STS_RDBF) != 0; +} + +static void up_send(FAR struct uart_dev_s *dev, int ch) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + + up_serialout(priv, HT32_USART_TDR_OFFSET, + (uint32_t)ch & (HT32_USART_DT_MASK >> HT32_USART_DT_SHIFT)); +} + +static void up_txint(FAR struct uart_dev_s *dev, bool enable) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + irqstate_t flags; + uint32_t ie; + + flags = spin_lock_irqsave(&priv->lock); + ie = priv->ie; + + if (enable) + { + ie |= HT32_USART_CTRL1_TDBEIEN; + } + else + { + ie &= ~HT32_USART_CTRL1_TDBEIEN; + } + + up_setusartint_nolock(priv, ie); + spin_unlock_irqrestore(&priv->lock, flags); + + if (enable) + { + uart_xmitchars(dev); + } +} + +static bool up_txready(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + + return (up_serialin(priv, HT32_USART_STS_OFFSET) & + HT32_USART_STS_TDBE) != 0; +} + +static bool up_txempty(FAR struct uart_dev_s *dev) +{ + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->priv; + + return (up_serialin(priv, HT32_USART_STS_OFFSET) & + HT32_USART_STS_TDC) != 0; +} + +void arm_earlyserialinit(void) +{ + unsigned int i; + + for (i = 0; i < HT32_NUART_PORTS; i++) + { + if (g_uart_devs[i] != NULL) + { + up_disableusartint((FAR struct up_dev_s *)g_uart_devs[i]->priv, + NULL); + } + } + +#if CONSOLE_USART > 0 + up_setup(CONSOLE_DEVPTR); +#endif +} + +void arm_serialinit(void) +{ + char devname[] = "/dev/ttySx"; + unsigned int i; + unsigned int minor = 0; + +#if CONSOLE_USART > 0 + uart_register("/dev/console", CONSOLE_DEVPTR); + uart_register("/dev/ttyS0", CONSOLE_DEVPTR); + minor = 1; +#endif + + for (i = 0; i < HT32_NUART_PORTS; i++) + { + if (g_uart_devs[i] == NULL || g_uart_devs[i]->isconsole) + { + continue; + } + + devname[9] = '0' + minor++; + uart_register(devname, g_uart_devs[i]); + } +} + +#else + +void arm_earlyserialinit(void) +{ +} + +void arm_serialinit(void) +{ +} + +#endif /* USE_SERIALDRIVER && HAVE_UART */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void up_putc(int ch) +{ +#ifdef HAVE_CONSOLE +# if defined(USE_SERIALDRIVER) && defined(HAVE_UART) && CONSOLE_USART > 0 + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)CONSOLE_DEVPTR->priv; + uint32_t ie; + + up_disableusartint(priv, &ie); + arm_lowputc(ch); + up_restoreusartint(priv, ie); +# else + arm_lowputc(ch); +# endif +#endif +} diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_serial.h b/arch/arm/src/ht32f491x3/ht32f491x3_serial.h new file mode 100644 index 0000000000000..0f24273524956 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_serial.h @@ -0,0 +1,46 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_serial.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_SERIAL_H +#define __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_SERIAL_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +void arm_earlyserialinit(void); +void arm_serialinit(void); +void ht32f491x3_usart_pins(uintptr_t uartbase); + +#endif + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_SERIAL_H */ diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_start.c b/arch/arm/src/ht32f491x3/ht32f491x3_start.c new file mode 100644 index 0000000000000..c688976e243d3 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_start.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_start.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include "arm_internal.h" + +#include "ht32f491x3_lowputc.h" +#include "ht32f491x3_serial.h" +#include "ht32f491x3_start.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_FEATURES +# define showprogress(c) arm_lowputc(c) +#else +# define showprogress(c) +#endif + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +const uintptr_t g_idle_topstack = (uintptr_t)_END_BSS + + CONFIG_IDLETHREAD_STACKSIZE; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void weak_function ht32f491x3_clockconfig(void) +{ +} + +void __start(void) __attribute__((section(".entry"))); +void __start(void) +{ + const uint32_t *src; + uint32_t *dest; + + up_irq_disable(); + + /* Let the board tune CRM before the early console computes its divisors. + */ + + ht32f491x3_clockconfig(); + ht32f491x3_lowsetup(); + showprogress('A'); + + for (dest = (uint32_t *)_START_BSS; dest < (uint32_t *)_END_BSS; ) + { + *dest++ = 0; + } + + showprogress('B'); + + src = (const uint32_t *)_DATA_INIT; + dest = (uint32_t *)_START_DATA; + + while (dest < (uint32_t *)_END_DATA) + { + *dest++ = *src++; + } + + showprogress('C'); + + arm_fpuconfig(); + showprogress('D'); + +#ifdef USE_EARLYSERIALINIT + arm_earlyserialinit(); +#endif + showprogress('E'); + + ht32f491x3_boardinitialize(); + showprogress('F'); + + showprogress('\r'); + showprogress('\n'); + + nx_start(); + + for (; ; ); +} diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_start.h b/arch/arm/src/ht32f491x3/ht32f491x3_start.h new file mode 100644 index 0000000000000..68b1235245421 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_start.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_start.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_START_H +#define __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_START_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +void ht32f491x3_clockconfig(void); +void ht32f491x3_boardinitialize(void); + +#endif /* __ARCH_ARM_SRC_HT32F491X3_HT32F491X3_START_H */ diff --git a/arch/arm/src/ht32f491x3/ht32f491x3_timerisr.c b/arch/arm/src/ht32f491x3/ht32f491x3_timerisr.c new file mode 100644 index 0000000000000..17b05d2eedf54 --- /dev/null +++ b/arch/arm/src/ht32f491x3/ht32f491x3_timerisr.c @@ -0,0 +1,95 @@ +/**************************************************************************** + * arch/arm/src/ht32f491x3/ht32f491x3_timerisr.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include "nvic.h" +#include "clock/clock.h" +#include "arm_internal.h" +#include "systick.h" + +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32_SYSTICK_RELOAD ((HT32_HCLK_FREQUENCY / CLK_TCK) - 1) + +#if HT32_SYSTICK_RELOAD > 0x00ffffff +# error HT32_SYSTICK_RELOAD exceeds the SysTick reload field +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#if !defined(CONFIG_ARMV7M_SYSTICK) && !defined(CONFIG_TIMER_ARCH) +static int ht32f491x3_timerisr(int irq, FAR void *context, FAR void *arg) +{ + UNUSED(irq); + UNUSED(context); + UNUSED(arg); + + nxsched_process_timer(); + return 0; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void up_timer_initialize(void) +{ + uint32_t regval; + + regval = getreg32(NVIC_SYSH12_15_PRIORITY); + regval &= ~NVIC_SYSH_PRIORITY_PR15_MASK; + regval |= (NVIC_SYSH_PRIORITY_DEFAULT << NVIC_SYSH_PRIORITY_PR15_SHIFT); + putreg32(regval, NVIC_SYSH12_15_PRIORITY); + +#if defined(CONFIG_ARMV7M_SYSTICK) && defined(CONFIG_TIMER_ARCH) + up_timer_set_lowerhalf(systick_initialize(true, HT32_HCLK_FREQUENCY, -1)); +#else + putreg32(HT32_SYSTICK_RELOAD, NVIC_SYSTICK_RELOAD); + + irq_attach(HT32_IRQ_SYSTICK, ht32f491x3_timerisr, NULL); + + putreg32(NVIC_SYSTICK_CTRL_CLKSOURCE | + NVIC_SYSTICK_CTRL_TICKINT | + NVIC_SYSTICK_CTRL_ENABLE, + NVIC_SYSTICK_CTRL); + + up_enable_irq(HT32_IRQ_SYSTICK); +#endif +} From 166197e29fc6d40bf5d0ab46481a02b237f40c72 Mon Sep 17 00:00:00 2001 From: Felipe Moura Date: Wed, 25 Mar 2026 08:19:45 -0300 Subject: [PATCH 2/3] boards/arm/ht32f491x3: add ESK32 board support Add the ESK32 board with nsh configuration, linker script, board bring-up, flashing helper, and user LED support. Signed-off-by: Felipe Moura --- boards/Kconfig | 11 ++ boards/arm/ht32f491x3/esk32/CMakeLists.txt | 23 +++ boards/arm/ht32f491x3/esk32/Kconfig | 10 ++ .../ht32f491x3/esk32/configs/nsh/defconfig | 54 +++++++ boards/arm/ht32f491x3/esk32/include/board.h | 95 ++++++++++++ boards/arm/ht32f491x3/esk32/scripts/Make.defs | 42 +++++ boards/arm/ht32f491x3/esk32/scripts/ld.script | 119 +++++++++++++++ .../arm/ht32f491x3/esk32/src/CMakeLists.txt | 35 +++++ boards/arm/ht32f491x3/esk32/src/Makefile | 37 +++++ .../arm/ht32f491x3/esk32/src/ht32_appinit.c | 101 +++++++++++++ boards/arm/ht32f491x3/esk32/src/ht32_boot.c | 117 ++++++++++++++ .../arm/ht32f491x3/esk32/src/ht32_userleds.c | 106 +++++++++++++ boards/arm/ht32f491x3/esk32/tools/flash.sh | 143 ++++++++++++++++++ 13 files changed, 893 insertions(+) create mode 100644 boards/arm/ht32f491x3/esk32/CMakeLists.txt create mode 100644 boards/arm/ht32f491x3/esk32/Kconfig create mode 100644 boards/arm/ht32f491x3/esk32/configs/nsh/defconfig create mode 100644 boards/arm/ht32f491x3/esk32/include/board.h create mode 100644 boards/arm/ht32f491x3/esk32/scripts/Make.defs create mode 100644 boards/arm/ht32f491x3/esk32/scripts/ld.script create mode 100644 boards/arm/ht32f491x3/esk32/src/CMakeLists.txt create mode 100644 boards/arm/ht32f491x3/esk32/src/Makefile create mode 100644 boards/arm/ht32f491x3/esk32/src/ht32_appinit.c create mode 100644 boards/arm/ht32f491x3/esk32/src/ht32_boot.c create mode 100644 boards/arm/ht32f491x3/esk32/src/ht32_userleds.c create mode 100755 boards/arm/ht32f491x3/esk32/tools/flash.sh diff --git a/boards/Kconfig b/boards/Kconfig index b67776a957f77..de9c1a07aae06 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -3481,6 +3481,13 @@ config ARCH_BOARD_AT32F437_MINI ---help--- AT32F437-MINI board based on the Artery AT32F437VMT7 MCU. +config ARCH_BOARD_ESK32 + bool "ESK32 board" + depends on ARCH_CHIP_HT32F49163 + select ARCH_HAVE_LEDS + ---help--- + ESK32 board based on the Holtek HT32F49163 MCU. + config ARCH_BOARD_FRDM_MCXN236 bool "NXP MCXN236 CPU EVK board" depends on ARCH_CHIP_N236 @@ -3927,6 +3934,7 @@ config ARCH_BOARD default "hpm6360evk" if ARCH_BOARD_HPM6360EVK default "hpm6750evk2" if ARCH_BOARD_HPM6750EVK2 default "at32f437-mini" if ARCH_BOARD_AT32F437_MINI + default "esk32" if ARCH_BOARD_ESK32 default "csk6011a-nano" if ARCH_BOARD_CSK6011A_NANO default "frdm-mcxn236" if ARCH_BOARD_FRDM_MCXN236 @@ -5041,6 +5049,9 @@ endif if ARCH_BOARD_AT32F437_MINI source "boards/arm/at32/at32f437-mini/Kconfig" endif +if ARCH_BOARD_ESK32 +source "boards/arm/ht32f491x3/esk32/Kconfig" +endif if ARCH_BOARD_CSK6011A_NANO source "boards/arm/csk6/csk6011a-nano/Kconfig" endif diff --git a/boards/arm/ht32f491x3/esk32/CMakeLists.txt b/boards/arm/ht32f491x3/esk32/CMakeLists.txt new file mode 100644 index 0000000000000..596c576559471 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/CMakeLists.txt @@ -0,0 +1,23 @@ +# ############################################################################## +# boards/arm/ht32f491x3/esk32/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +add_subdirectory(src) diff --git a/boards/arm/ht32f491x3/esk32/Kconfig b/boards/arm/ht32f491x3/esk32/Kconfig new file mode 100644 index 0000000000000..79ce98ccbc2ef --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/Kconfig @@ -0,0 +1,10 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_ESK32 + +comment "ESK32 note: only USART1 pin routing is available in the current board port." + +endif # ARCH_BOARD_ESK32 diff --git a/boards/arm/ht32f491x3/esk32/configs/nsh/defconfig b/boards/arm/ht32f491x3/esk32/configs/nsh/defconfig new file mode 100644 index 0000000000000..0d3de5606a1a6 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/configs/nsh/defconfig @@ -0,0 +1,54 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_FPU is not set +# CONFIG_ARCH_LEDS is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="esk32" +CONFIG_ARCH_BOARD_ESK32=y +CONFIG_ARCH_CHIP="ht32f491x3" +CONFIG_ARCH_CHIP_HT32F49163=y +CONFIG_ARCH_CHIP_HT32F491X3=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=8499 +CONFIG_BUILTIN=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_EXAMPLES_LEDS=y +CONFIG_FS_BINFS=y +CONFIG_FS_PROCFS=y +CONFIG_HT32F491X3_PCLK1_FREQUENCY=75000000 +CONFIG_HT32F491X3_SYSCLK_FREQUENCY=150000000 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_LINE_MAX=64 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=49152 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=14 +CONFIG_START_MONTH=3 +CONFIG_START_YEAR=2026 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=0 +CONFIG_TESTING_OSTEST=y +CONFIG_TESTING_OSTEST_NBARRIER_THREADS=3 +CONFIG_TESTING_OSTEST_STACKSIZE=2048 +CONFIG_USART1_RXBUFSIZE=256 +CONFIG_USART1_SERIAL_CONSOLE=y +CONFIG_USART1_TXBUFSIZE=256 +CONFIG_USERLED=y +CONFIG_USERLED_LOWER=y diff --git a/boards/arm/ht32f491x3/esk32/include/board.h b/boards/arm/ht32f491x3/esk32/include/board.h new file mode 100644 index 0000000000000..3712e95600c85 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/include/board.h @@ -0,0 +1,95 @@ +/**************************************************************************** + * boards/arm/ht32f491x3/esk32/include/board.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_HT32F491X3_ESK32_INCLUDE_BOARD_H +#define __BOARDS_ARM_HT32F491X3_ESK32_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Board USART Pin Mapping + ****************************************************************************/ + +/* Populate BOARD_USARTx_* for each routed USART on the board. The selected + * console still comes from CONFIG_USARTx_SERIAL_CONSOLE in the defconfig. + */ + +#define BOARD_USART1_GPIO_CLKEN (1u << 0) +#define BOARD_USART1_TX_GPIO_BASE 0x40020000u +#define BOARD_USART1_RX_GPIO_BASE 0x40020000u +#define BOARD_USART1_TX_PIN 9u +#define BOARD_USART1_RX_PIN 10u +#define BOARD_USART1_TX_AF 7u +#define BOARD_USART1_RX_AF 7u + +/**************************************************************************** + * Board LED Pin Mapping + ****************************************************************************/ + +#define BOARD_LED2_GPIO_CLKEN (1u << 3) +#define BOARD_LED2_GPIO_BASE 0x40020c00u +#define BOARD_LED2_GPIO_PIN 13u + +#define BOARD_LED3_GPIO_CLKEN (1u << 3) +#define BOARD_LED3_GPIO_BASE 0x40020c00u +#define BOARD_LED3_GPIO_PIN 14u + +#define BOARD_LED4_GPIO_CLKEN (1u << 3) +#define BOARD_LED4_GPIO_BASE 0x40020c00u +#define BOARD_LED4_GPIO_PIN 15u + +#define BOARD_LED2 0 +#define BOARD_LED3 1 +#define BOARD_LED4 2 +#define BOARD_NLEDS 3 + +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) +#define BOARD_LED4_BIT (1 << BOARD_LED4) + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +void ht32f491x3_clockconfig(void); +void ht32f491x3_boardinitialize(void); + +int board_app_initialize(uintptr_t arg); + +#if defined(CONFIG_USERLED) && !defined(CONFIG_ARCH_LEDS) +uint32_t board_userled_initialize(void); +void board_userled(int led, bool ledon); +void board_userled_all(uint32_t ledset); +#endif + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void); +#endif + +#endif /* __BOARDS_ARM_HT32F491X3_ESK32_INCLUDE_BOARD_H */ diff --git a/boards/arm/ht32f491x3/esk32/scripts/Make.defs b/boards/arm/ht32f491x3/esk32/scripts/Make.defs new file mode 100644 index 0000000000000..99d87e3aad8a1 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/scripts/Make.defs @@ -0,0 +1,42 @@ +############################################################################ +# boards/arm/ht32f491x3/esk32/scripts/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv7-m/Toolchain.defs + +LDSCRIPT = ld.script + +ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) + +ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 diff --git a/boards/arm/ht32f491x3/esk32/scripts/ld.script b/boards/arm/ht32f491x3/esk32/scripts/ld.script new file mode 100644 index 0000000000000..f2dfc6f3d7bab --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/scripts/ld.script @@ -0,0 +1,119 @@ +/**************************************************************************** + * boards/arm/ht32f491x3/esk32/scripts/ld.script + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +MEMORY +{ + flash (rx) : ORIGIN = 0x08000000, LENGTH = 256K + sram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K +} + +OUTPUT_ARCH(arm) +ENTRY(__start) +EXTERN(_vectors) + +SECTIONS +{ + .text : + { + _stext = ABSOLUTE(.); + *(.vectors) + *(.entry) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > flash + + .init_section : + { + _sinit = ABSOLUTE(.); + 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)) + _einit = ABSOLUTE(.); + } > flash + + .ARM.extab : + { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : + { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > sram AT > flash + + .ram_vectors : + { + *(.ram_vectors) + } > sram + + .noinit : + { + _snoinit = ABSOLUTE(.); + *(.noinit*) + _enoinit = ABSOLUTE(.); + } > sram + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/arm/ht32f491x3/esk32/src/CMakeLists.txt b/boards/arm/ht32f491x3/esk32/src/CMakeLists.txt new file mode 100644 index 0000000000000..61475bb974c0e --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/src/CMakeLists.txt @@ -0,0 +1,35 @@ +# ############################################################################## +# boards/arm/ht32f491x3/esk32/src/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +set(SRCS ht32_boot.c) + +if(CONFIG_BOARDCTL OR CONFIG_BOARD_LATE_INITIALIZE) + list(APPEND SRCS ht32_appinit.c) +endif() + +if(CONFIG_USERLED) + list(APPEND SRCS ht32_userleds.c) +endif() + +target_sources(board PRIVATE ${SRCS}) + +set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/ld.script") diff --git a/boards/arm/ht32f491x3/esk32/src/Makefile b/boards/arm/ht32f491x3/esk32/src/Makefile new file mode 100644 index 0000000000000..79c67f5ba5b25 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/src/Makefile @@ -0,0 +1,37 @@ +############################################################################ +# boards/arm/ht32f491x3/esk32/src/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS += ht32_boot.c + +ifeq ($(CONFIG_BOARDCTL),y) +CSRCS += ht32_appinit.c +else ifeq ($(CONFIG_BOARD_LATE_INITIALIZE),y) +CSRCS += ht32_appinit.c +endif + +ifeq ($(CONFIG_USERLED),y) +CSRCS += ht32_userleds.c +endif + +include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/ht32f491x3/esk32/src/ht32_appinit.c b/boards/arm/ht32f491x3/esk32/src/ht32_appinit.c new file mode 100644 index 0000000000000..80d92936023b8 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/src/ht32_appinit.c @@ -0,0 +1,101 @@ +/**************************************************************************** + * boards/arm/ht32f491x3/esk32/src/ht32_appinit.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include +#include +#include + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static int ht32_bringup(void) +{ + int ret = OK; + int tmp; + +#if defined(CONFIG_USERLED) && !defined(CONFIG_ARCH_LEDS) +# ifdef CONFIG_USERLED_LOWER + tmp = userled_lower_initialize("/dev/userleds"); + if (tmp < 0 && tmp != -EEXIST) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/userleds: %d\n", tmp); + ret = tmp; + } +# else + board_userled_initialize(); +# endif +#endif + +#ifdef CONFIG_FS_BINFS + tmp = nx_mount(NULL, "/bin", "binfs", 0, NULL); + if (tmp < 0 && tmp != -EBUSY) + { + syslog(LOG_ERR, "ERROR: Failed to mount binfs at /bin: %d\n", tmp); + ret = tmp; + } +#endif + +#ifdef CONFIG_FS_PROCFS + tmp = nx_mount(NULL, "/proc", "procfs", 0, NULL); + if (tmp < 0 && tmp != -EBUSY) + { + syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", tmp); + ret = tmp; + } +#endif + + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +int board_app_initialize(uintptr_t arg) +{ + (void)arg; + +#ifdef CONFIG_BOARD_LATE_INITIALIZE + return OK; +#else + return ht32_bringup(); +#endif +} + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void) +{ + ht32_bringup(); +} +#endif diff --git a/boards/arm/ht32f491x3/esk32/src/ht32_boot.c b/boards/arm/ht32f491x3/esk32/src/ht32_boot.c new file mode 100644 index 0000000000000..0b75f7b86137e --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/src/ht32_boot.c @@ -0,0 +1,117 @@ +/**************************************************************************** + * boards/arm/ht32f491x3/esk32/src/ht32_boot.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include "arm_internal.h" +#include "chip.h" + +#include "hardware/ht32f491x3_crm.h" +#include "hardware/ht32f491x3_flash.h" +#include "hardware/ht32f491x3_gpio.h" +#include "hardware/ht32f491x3_memorymap.h" +#include "hardware/ht32f491x3_pwc.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define HT32_BOARD_HEXT_FREQUENCY 8000000u +#define HT32_BOARD_PLL_150_NS 75u +#define HT32_BOARD_PLL_150_MS 1u + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void ht32f491x3_clockconfig(void) +{ + /* The ESK32 board has an 8 MHz crystal, so follow Holtek's 150 MHz + * HEXT->PLL startup sequence for this board. + */ + + modifyreg32(HT32_CRM_CTRL, 0, HT32_CRM_CTRL_HICKEN); + while ((getreg32(HT32_CRM_CTRL) & HT32_CRM_CTRL_HICKSTBL) == 0) + { + } + + modifyreg32(HT32_CRM_CFG, HT32_CRM_CFG_SCLKSEL_MASK, + HT32_CRM_CFG_SEL_HICK); + while ((getreg32(HT32_CRM_CFG) & HT32_CRM_CFG_SCLKSTS_MASK) != + HT32_CRM_CFG_STS_HICK) + { + } + + modifyreg32(HT32_CRM_CFG, + HT32_CRM_CFG_AHBDIV_MASK | + HT32_CRM_CFG_APB1DIV_MASK | + HT32_CRM_CFG_APB2DIV_MASK, + HT32_CRM_CFG_AHBDIV_NONE | + HT32_CRM_CFG_APB1DIV_2 | + HT32_CRM_CFG_APB2DIV_1); + + putreg32(HT32_FLASH_PSR_PROGRAM(HT32_FLASH_WAIT_CYCLE_4), HT32_FLASH_PSR); + + modifyreg32(HT32_CRM_APB1EN, 0, HT32_CRM_APB1EN_PWCEN); + modifyreg32(HT32_PWC_LDOOV, HT32_PWC_LDOOVSEL_MASK, + HT32_PWC_LDO_OUTPUT_1V3); + + modifyreg32(HT32_CRM_CTRL, HT32_CRM_CTRL_HEXTBYPS, HT32_CRM_CTRL_HEXTEN); + while ((getreg32(HT32_CRM_CTRL) & HT32_CRM_CTRL_HEXTSTBL) == 0) + { + } + + putreg32((HT32_BOARD_PLL_150_MS << HT32_CRM_PLLCFG_PLLMS_SHIFT) | + (HT32_BOARD_PLL_150_NS << HT32_CRM_PLLCFG_PLLNS_SHIFT) | + HT32_CRM_PLLCFG_FR_2 | + HT32_CRM_PLLCFG_SOURCE_HEXT, + HT32_CRM_PLLCFG); + + modifyreg32(HT32_CRM_CTRL, 0, HT32_CRM_CTRL_PLLEN); + while ((getreg32(HT32_CRM_CTRL) & HT32_CRM_CTRL_PLLSTBL) == 0) + { + } + + modifyreg32(HT32_CRM_MISC2, HT32_CRM_MISC2_AUTOSTEP_MASK, + HT32_CRM_MISC2_AUTOSTEP_ENABLE); + modifyreg32(HT32_CRM_CFG, HT32_CRM_CFG_SCLKSEL_MASK, + HT32_CRM_CFG_SEL_PLL); + while ((getreg32(HT32_CRM_CFG) & HT32_CRM_CFG_SCLKSTS_MASK) != + HT32_CRM_CFG_STS_PLL) + { + } + + modifyreg32(HT32_CRM_MISC2, HT32_CRM_MISC2_AUTOSTEP_MASK, 0); +} + +void ht32f491x3_boardinitialize(void) +{ +} diff --git a/boards/arm/ht32f491x3/esk32/src/ht32_userleds.c b/boards/arm/ht32f491x3/esk32/src/ht32_userleds.c new file mode 100644 index 0000000000000..7bf2fe0e93ae3 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/src/ht32_userleds.c @@ -0,0 +1,106 @@ +/**************************************************************************** + * boards/arm/ht32f491x3/esk32/src/ht32_userleds.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include "arm_internal.h" + +#include "ht32f491x3_gpio.h" + +#include "hardware/ht32f491x3_crm.h" + +#ifndef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct ht32_ledcfg_s +{ + uint32_t clken; + uintptr_t base; + uint8_t pin; + bool active_low; +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct ht32_ledcfg_s g_ledcfg[BOARD_NLEDS] = +{ + {BOARD_LED2_GPIO_CLKEN, BOARD_LED2_GPIO_BASE, BOARD_LED2_GPIO_PIN, true}, + {BOARD_LED3_GPIO_CLKEN, BOARD_LED3_GPIO_BASE, BOARD_LED3_GPIO_PIN, true}, + {BOARD_LED4_GPIO_CLKEN, BOARD_LED4_GPIO_BASE, BOARD_LED4_GPIO_PIN, true}, +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + unsigned int i; + + for (i = 0; i < BOARD_NLEDS; i++) + { + modifyreg32(HT32_CRM_AHBEN1, 0, g_ledcfg[i].clken); + ht32f491x3_gpioconfig(g_ledcfg[i].base, g_ledcfg[i].pin, + HT32_GPIO_MODE_OUTPUT, false, + HT32_GPIO_DRIVE_MEDIUM, + HT32_GPIO_PULL_NONE, 0); + ht32f491x3_gpiowrite(g_ledcfg[i].base, g_ledcfg[i].pin, + g_ledcfg[i].active_low); + } + + return BOARD_NLEDS; +} + +void board_userled(int led, bool ledon) +{ + if (led >= 0 && led < BOARD_NLEDS) + { + ht32f491x3_gpiowrite(g_ledcfg[led].base, g_ledcfg[led].pin, + g_ledcfg[led].active_low ? !ledon : ledon); + } +} + +void board_userled_all(uint32_t ledset) +{ + unsigned int i; + + for (i = 0; i < BOARD_NLEDS; i++) + { + board_userled(i, (ledset & (1u << i)) != 0); + } +} + +#endif /* !CONFIG_ARCH_LEDS */ diff --git a/boards/arm/ht32f491x3/esk32/tools/flash.sh b/boards/arm/ht32f491x3/esk32/tools/flash.sh new file mode 100755 index 0000000000000..25d3635deb180 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/tools/flash.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +############################################################################ +# boards/arm/ht32f491x3/esk32/tools/flash.sh +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TOPDIR="$(cd "${SCRIPT_DIR}/../../../../.." && pwd)" + +DEFAULT_BIN="${TOPDIR}/nuttx.bin" +OPENOCD_ROOT="/mnt/c/Program Files (x86)/Holtek HT32 Series/HT32-IDE/xPack/xpack-openocd-0.11.0-4" +OPENOCD_EXE="${OPENOCD_ROOT}/bin/openocd.exe" +SCRIPTS_DIR="${OPENOCD_ROOT}/scripts" +FLASH_LOADER="${OPENOCD_ROOT}/FlashLoader/HT32F491x3_256.HLM" +DEVICE_NAME="HT32F49163_100LQFP" +FLASH_BASE="0x08000000" +FLASH_END="0x0803FFFF" +SRAM_BASE="0x20000000" +WORKAREA_SIZE="0xC000" +BIN_PATH="${DEFAULT_BIN}" +DRY_RUN=0 + +usage() { + cat < 0)); do + case "$1" in + --bin) + BIN_PATH="$2" + shift 2 + ;; + --device) + DEVICE_NAME="$2" + shift 2 + ;; + --openocd-root) + OPENOCD_ROOT="$2" + OPENOCD_EXE="${OPENOCD_ROOT}/bin/openocd.exe" + SCRIPTS_DIR="${OPENOCD_ROOT}/scripts" + FLASH_LOADER="${OPENOCD_ROOT}/FlashLoader/HT32F491x3_256.HLM" + shift 2 + ;; + --dry-run) + DRY_RUN=1 + shift + ;; + --help|-h) + usage + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + usage >&2 + exit 1 + ;; + esac +done + +if [[ "${DRY_RUN}" -eq 0 ]]; then + if [[ ! -f "${BIN_PATH}" ]]; then + echo "Binary not found: ${BIN_PATH}" >&2 + exit 1 + fi + + if [[ ! -f "${OPENOCD_EXE}" ]]; then + echo "OpenOCD executable not found: ${OPENOCD_EXE}" >&2 + exit 1 + fi + + if [[ ! -f "${FLASH_LOADER}" ]]; then + echo "Flash loader not found: ${FLASH_LOADER}" >&2 + exit 1 + fi +fi + +BIN_WIN="$(wslpath -m "${BIN_PATH}")" +SCRIPTS_WIN="$(wslpath -m "${SCRIPTS_DIR}")" +LOADER_WIN="$(wslpath -m "${FLASH_LOADER}")" + +OPENOCD_CMD=( + "${OPENOCD_EXE}" + -s "${SCRIPTS_WIN}" + -c "hlm_SRAM ${SRAM_BASE} ${WORKAREA_SIZE}" + -c "hlm_loader {${LOADER_WIN}} ${FLASH_BASE} ${FLASH_END}" + -c "ht_flags erase_sector" + -c "set WORKAREASIZE ${WORKAREA_SIZE}" + -f interface/htlink.cfg + -f target/HLM491x3.cfg + -c "set_expected_name ${DEVICE_NAME}" + -c "program ${BIN_WIN} verify reset exit ${FLASH_BASE}" +) + +printf 'TOPDIR : %s\n' "${TOPDIR}" +printf 'Binary : %s\n' "${BIN_PATH}" +printf 'Device : %s\n' "${DEVICE_NAME}" +printf 'OpenOCD : %s\n' "${OPENOCD_EXE}" +printf 'Flash loader: %s\n' "${FLASH_LOADER}" + +if [[ "${DRY_RUN}" -eq 1 ]]; then + [[ -f "${BIN_PATH}" ]] || printf 'Warning : binary not found yet\n' + [[ -f "${OPENOCD_EXE}" ]] || printf 'Warning : OpenOCD executable not found\n' + [[ -f "${FLASH_LOADER}" ]] || printf 'Warning : flash loader not found\n' + printf 'Command :' + printf ' %q' "${OPENOCD_CMD[@]}" + printf '\n' + exit 0 +fi + +exec "${OPENOCD_CMD[@]}" From 981ca6152726b69e2f5908d34312e60a90e9da70 Mon Sep 17 00:00:00 2001 From: Felipe Moura Date: Wed, 25 Mar 2026 08:19:45 -0300 Subject: [PATCH 3/3] ht32f491x3/esk32: add docs and flash helpers Document the HT32F491x3 ESK32 board, build steps, flashing flow, and validation commands. Add WSL and PowerShell flash backends plus a Python wrapper. Signed-off-by: Felipe Moura --- .../boards/esk32/ht32f491x3-starter-kit.jpg | Bin 0 -> 266565 bytes .../arm/ht32f491x3/boards/esk32/index.rst | 173 +++++++++++++ .../platforms/arm/ht32f491x3/index.rst | 14 + arch/arm/include/ht32f491x3/chip.h | 6 +- boards/arm/ht32f491x3/esk32/tools/flash.ps1 | 239 ++++++++++++++++++ boards/arm/ht32f491x3/esk32/tools/flash.py | 91 +++++++ boards/arm/ht32f491x3/esk32/tools/flash.sh | 30 ++- 7 files changed, 549 insertions(+), 4 deletions(-) create mode 100644 Documentation/platforms/arm/ht32f491x3/boards/esk32/ht32f491x3-starter-kit.jpg create mode 100644 Documentation/platforms/arm/ht32f491x3/boards/esk32/index.rst create mode 100644 Documentation/platforms/arm/ht32f491x3/index.rst create mode 100644 boards/arm/ht32f491x3/esk32/tools/flash.ps1 create mode 100755 boards/arm/ht32f491x3/esk32/tools/flash.py diff --git a/Documentation/platforms/arm/ht32f491x3/boards/esk32/ht32f491x3-starter-kit.jpg b/Documentation/platforms/arm/ht32f491x3/boards/esk32/ht32f491x3-starter-kit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c22aac3ac45f68d07465e43fd3c8fe1e48e1bfb GIT binary patch literal 266565 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
tun+Pxe;a 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®91{9!ckJDl`oMSUnv?z&-B{$atE+WI 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
a61^L zM1-fUDqoV*ILGf#S3cVGReUUlgGq!J@pXM%6)mT_<4b`JFe>h}%ZWn?L0NDPROm-q zPZ-X4_tyQ=_d2_C_RCuGpxShtc`65M?Y%0gx0h9FrB<5-t5FoSRVmcv6~~g}&lIv| z5<*XxoFzQ;lar3xE!!u(!KK#Z`W3QJuEr!+T+CzxXg6K!O zAxd#9GY~l8Au00Kql5PhYb7&_C06>h+S20efSnQ1_);FQcS^*d+|;NyTXab4uTv_} zo^Rn=l=Epp6(wP`=cok?5CQ%MR?A(!rh96<6DE6?7=4R-XfJoVjS~!DjdkYF7NzVLiG0 ze*vXl*L@qn5zfbE(tdlBz0iUKu7@!?pM@Dr=ETI*6S)_3slk$$mFGs$be%=smxJ<5p?+h zOX(}}o?B}|Mg~=aNXOiCGqyAw`x}FEGCP&V$`MY~F&)Gxm6dnf^qRaHoT=s!rY(|( z63JLlX;~zsjAV>~#*r4=wzJ!Xqh4vrPSU}>eRJ+gePZC3T{S5XX;SKolktg&rve#M zonZk5AthZWvHneAW#3V(!xCaO-oDMCabIraTvna$U8j5vUVT#Eq{34TyE%m>Th6UT zYg_98jAdSwqy(in17A0F-CB!CAW1xOh4lLEev9J0DpuWY$EI4g{YF(y*ixfNTk_aa zegTv+P~#~n1bJkiNC{6ooSl1PyK7UfYCJ$APCVDmTHv<`UdvwLux(o^rX&!rqr-Aj#q$q?UH!atruZc)`CN_jE3_a%cO`9yrnHnHN>rME+5q$Lz~dZ#8q>106PotlS;G!~@9UScYgE{clkka^B}z+du-XArjw|e> zdwYM6)rDGtqjJST&v}V~yv~7gY4mm{OK{0)r2#*z!fsT!$oN$@9f-sJwGyGsnHk`?u5q07jcU_oEY54&ZLF7I zY0r5X4#CNA>d1=QjxUi4LK06J$ovcvV0Nu`)OO;(xpwmDQWYAdMShzg4x-Ga z6vLPx^U$<|$sP5DxLufo*$O(d_mpR~HlD%U4XC(N0_3--+qT_lki$1EVX7=h^tO;3 z^H}qe68hakNkwl;Egxcn4MYr584yCPrLDSa|X z=~pF9(F)k1&8$vzsZN+NU6xp3BP(%eZ7RnY#(2((t#*dej6@0Is;rbnQc2DRoJx&b z_Y~?a$4HdZvL<{a_Eg(-1_Mh&?5Qp!lw&yRP6#^I728>c41*(v0?o1R8S zM@4pS?-%q6&C??BxV$&oRa?S*Z#r#aHD0j==YAClZ$D7@9Yp{DdyISNBBsZ;bIfPB zE2}2a8iGrAfvMiVTk(riq}R5BwQg;N2GphPfvB#VMvo?RrllIgYBGKzQ|fWhPfMzDVv@!EAlVP*7h4=Z_Kyu zYf>epKHZe;r9w?HgXN{Re799!0#GZ-;sdDxuUJmrib7%UhPyGN2Tx4~Ct1g?nKtBn)b?n-0Q#p8f$^ zSK5a$q~V;Kzlz~C;_hPNZUrvx+DmHwq}?}5w~MglOP>u?`RZvSraQ5mN{T{L=_Kcq z-;7&Zc1e{$0pww58ceMV9sK5dA?)2F!c>;s@s}B=XU(8&9U6^U{NH++7NqTduQ^eo zRGL~AmYI;XBPkyJ&&+DRj>WN#1ibD#1+#D3Tn&hsBx}J@ImIj6*D#!gD1EHw1=H{Q zG-&3-VGYpxoj*Mj^zbU;TJXuW?l{^?L|G|PM?GN4d(;kf&pStzvZul+*JI9`djhxu zlW)~k=08#THbO@QXv#?AA7uLtR56Tkl3`|Zh#3i0v&4?j?d|lpYS-(|-tno?Qo4Jx zR^k&+>hvkLP|}+ou92MNpL~sM)UF!rjPqX<>5?Giv%Pz~%eNI#Fy%~@PKPb%u#G`o zZ?_q@78+?oCjluK02~c%FwSdL?S&e3N#rO5f<`dePJeE`!uejuNg+86KOaZ zqV;k9E|lDsWIoV&REmo-R~1ezrOh2k>unDuwFdn@>OHfJo;7o0rYbWA@~i8-vDmmK z^S3{g_UX4-iEl#LS{LSoR#40aUbqS!Wwamx<~#6f3hj*a58JDn8y{KXLxRw>Z6y$T z!PCege~J$n6rJg`YSx_xYgo19*8?ufmfc;M4I#u3RFoh_WRaBTBN;!pJC;3+sZOYS zoB#%LSZi%fCsQo}(nMwue{5fsC&TB6d2cpejYvhjl?GCx`iiA5B_%!12PErvYv^LY zID_U|do=!xmkwTZ4XIo^gGz-?MYP1{sPh|BvDrj2>IdiCGEIZlzK&4T#7Xi$Cm4lF&`3Ssw)b3#*9~i<|rg%<=`}KqnWkOrfzu^+U9mTo@7jBogSppZwsWk(r&Q@PC9@TlDzTh#O~ip&o)DK-{y_8< zdUz@Xju;k4)1_6Wo_dbNoVFL%V}tUY{8f63S55Z?t*+ef@gBeJm55Xel4?R0j0_^5 zQdz-M3c&K5=cgm}aiY3-sGgRVZ92Ek5T!sJ>vc66A2JOt6#6}ST_U8%!&PZAOleFK z73H`%?vh435JzxzebS1Jk-bq`sFnf>Wq*^wuP<_`;EcKOH6^KC@)TL@bgA0&>+#4V z&5ia1_W4u7(2_S^YAC<|(0`hWFEtcdU-1aFxxJgHu%JK0o~O@#M1_qp?t$wK>`QCR zj-B)FiVPuGK~_pahHx?8R!++$Ttf9NL|~~w2v-A->}%5Q3oA&`e=)Hs7sX7X;etclH!U&o9YPQk(Fgwz#aSR>k%3+wlou-N_n>s=@pBv*ri;v z#TJKDsWBR%IPe&bw*pq?eSinQVc*+XO{vUjEzHK8R=+^kyaHenB&*SX?YD>P4$#~s z#i&QBR~Ja9rX4y|=+#G|nKMjx9c9KAl$EKJmGtsk2Pah`(`dEB9x^jI5DW!%>RJ|Q za~;;oGnma$9~FC5Ot5zbYmX)dKS z@`q;Rr=YA8h86+iC0fe+9vfD@Rq`wP)D2fd!aW+)ymr@oEuYQ$wRdtM(52RCvm!o* z7>fhmLakTL0B$aW4-%|Oo%~rXF8aFSyw$ThB`I4eO0^?d2F6vgS{lK^CS5(`s zkfvyerYQBIOHPHnR-i!vNIm{z@75dU#OJZ5k&M<$9igo!9%`~(6l$bv%JHR6VQ?hT zD|6wy8P$1?G8=uwA-5Kj(o~R~D<1jL=Fi=9t5OBooTs%2-&WUBc^i(4`lnLFW)uoA zr!cQb_8HH8G3Zch00VLmwA!({S4=UKBovaI^<%g4>tSmb=DU!XNkWOrx_CGz_&EGE zyG$)Q&&_oJ!U|hLlg36*8OQSLJ{{{*wK1KAlr0|(wv~3@v#r|Y(|hid)CqM8#U+ZP z&A<`5kCq=89V$q`&$;6#N}ad1)McX!TtE#O0zl0%HfF(2r94h(CUt;Ss=R2?sZuTr zTI05@8l)Qj+19Jbb}hRC8sgL;HqV#k%Vi*yBs-pxGMsnNt<`zeHQED@vK!A8Z+Ts` zg%=Xhq1-qjWw%Ckh&~v0_RY3z+E?dgj?KYbtW>S2RavqhTg@RwPD(zIe8m+jIRuVC z*2VjIR`o;S$Jrg_d30U0O#pC>2H?6o!EI0-wQqYmuV`Bl>QI8Lj$G*2VZt|*X8F9&v-ggX&(!Xx%A)w(Ik-I%n3MH_szje1> z&7xVGXKq?MeR}*04Ff-x#ZEH%$=H z3?0En={CKsUb^;beb={^lhv4Zz2hpY5*;bHup~^REVUg*C{oZ+Fh~TRNyoOWEO(uD z*`7m>vTpOuR@yGg9;gEYbUT9M!lKMh)&Br$J=?c?TTYcM!;-scc7!IJayr~j9$Hr` z%pYt3qE0*GI;S_iVDDyrF;>pIDGeGjNULZFLnQPM`P-&2!j3dK<+F4}Hm}geQPhR8Jp0IQDw0>e(3Q89C;AQpWY7)><6UAV|x=7vJE;Wx~(g8 zsdmL-#5oGhx8p;nPL)z}rBIa>!lj35G9F87^NGm9k`6F(bDe5z)kd<;>W&}`M48A1 zlJ%tL)(iqn4r*87-)naA>e%MDM!!p>RH57T+J#QB@yxiXQ{q$EDUAt*t>(fTFC4f6 zaIxvmhA+LZZ%u-cC9wdEv))k+-?I}>6-{_5nY>rMk9aQAxGcIwI^3zdM{T>B1vV>? zBK;&BUKJWTihxf?NF_J~OQCpA-y>S_@}5I+Y2hczf7O>g(7EcHOl;nP=_{YnAGh zIMs<#nv#klR2W+lUTK$-m6T^aDdQO#)!mP1>%PwSk_i}K#}cZoHzg)l3>)TiUp+Hy zd@j^>vVQf?**B@y+f@|8i4p74TXW_}it?ILT5sWT){c|u1cDDFbBbTJMW7tqJA%7z z&QgpZ9S-xqRn)9_cG!zwad*ajM%J#?EN!;1X;*w3eVUrtkf{?JD{-Ys30jZYz{of` z@4(RweWI=`tf`hF=K^Dbp|jj{UtQGmfCm05Zl4Yw8>zItuddZLtg#Dmt4&g(ie>3C zT!?N|N(Y*xt^;X5Xmue)3QmXFwf2zjWIKYmtFv@m(g-`Z@X-(1*Rz!R&x*J-T`!-Rn>1m(P{+q-9IypUwW zjAt5lB0W#T=Z3awHJeJEU@n}f)qjdd+N5s zwU&p}0}wfl!;0Cr?8OWioDNb(d-X}SYDn9}DPz{6lhio`myVi`JyZ{8`Uq!5vl1RyY;zu~wI_+27xBMcVb^$cUU{**!mEd!ao`wO1zlIRYcxN)! z-CZuc5%rN2$`t9q1cTD9dti-a6<6CCpL)#1hl<~nm9MGaiFr;hIT;H%Is9}*Ok_J1 zGxa^Ce-4q-N}W@R9OFC@_nhnPe3ku|T2NR^SW)35e7NtZq^ncmUuE|1ajBc9cHi_$ zyOw6RS3Dh?b$|!K9QqbcrCDziUC#eLEq>?rEZ6=t>W}##ij3f5b&G5@kwpR}P z*%qr8GhS$yH3>o?J%t>px54xQ@&IG!ucLieZb8oQ6}L*^r&O6O5yw@=-|Nq6s+&t) zrPw0VRM0Q065;cTI5AQrjM zU=R#*%>db{Rih+8YyjXAJmD-dh?wT|0G`00D6k2MVP;EuBq$}aMNdqJ2ooQ9L z=@XDTaa-)SI}DyG9N&s<>`GSG=Pf)TwXL*+MW%IN9N?1|S`E6H!^X3lNnA;uB=?d; z#~o_F0LXnkD=DN?(%45i1tK;*`)dR2tOf$e%BCc*L@y9KxFt0nEnb`o(opG58k_=A z?0AeYbt%|b=RjUmuZ6gZ?$q~ZaVyE8{Uvg`hi$29olSBREW#{FRx=icGYWh^*S!o+lzbL6w^hxZu-S?m+_09V$7K9%$Y9zr-~G!I*2D%)=M2Q zaR3Hf6&1F#+#r(+`?>Dg&B;`@qgCbna;dPKikV74_=jVl{Znr{_MGy^2`c0cGp*)Q z6pvSaYgeQ-DH82O0HgG&FN)Po#W?Hd;y~(IDpvpwPET!R#g=Oot$@>SVr^fOu(aj( z1=iN3B~WJo419QVYheg6OrGA^vBv~me$c;{XJ00^#z>1@R9r`wBLaI2N*Z^ydO!rO+@ z6qjTCLq2Fq%8m&M?nl0<8MSncXHp=HGoNC<8!1rJ6(naFD!{9j6R1+qmkA>PkU7Ec z-%1;c6po0U8{awV&$nu zqfwxK$ag|T##xoKu)omAV} zH|B*Y9U`vPd8Pnc(Nr>9i~;)cuSqxw1zH|-lI$AGr-XV{O}gql&hsM%&89fPL|ZH{cl)LPzOJ^K~zJ%P)XvAUO=bdUHzH2FKdgy z_5T1!wWx2^1C{CW-eI)#d9m3Hy7RfnE(9gBkUL=g`uVp9bljzRP74<=zy-TdH~-1Y~s&V~lGh>epfsz%ML>091d#MZa`I@g;TA zsPJBkRi@Bu(5eYXtp(9HdEJeIv|Ge*cSzpyIYY% zx~Z$A+=8fyk|H?jUOh7c-b%xb-o<2kkwY7k#2O@^=M<5h*C@BMx z_x<`~)1-tMQG9+M~y_>JRP&YtZ^c$+VSBU+-^m$D` z0gp8hstu_#m4@Om(4Leh>o9tG!iI1Fc0$g_T0wsw9^^^1)tuWojtj50yQjSJHxkXD z)$Td8S_E4c=&CAPrN=^~)1$bBG}|TUu9rfT30l%dLVnQ3HD|VTDATDl^(Q>#Y3!x0 ztElzHLr%m$xi{;3?yLUpfhMf=X5WKafJ47Uw1f#Xi4F>C99kmB^%MG~DN?u|+TYlV zJtyLG&Ukw=I;#D#w7sov9HGFY?#f;C z(^8=V5Zeudm1F^qGERnes)ZUgfTUzcY9YBT6`w>Jf)#(U_p`(cU2oCn)GKMX>DL7+ zfi>z$l((sK9dT1+f}rA^P{w@4DM0`Mp7|}hELL||NqN^ZoIx5PyVl!Tw#M{gcX-!R zbN4@Ro!R}rxsAk*FLw!v)wJEU;M5HCPHUK~XaoG3L{*5*|yg0y}QMIA& z6y$3N3%K{a&v;!`8=rFJhA&$3ns#F^#}HPP1R)4Wi-eQ_kN^aJ-9IkDPL&olhbYT5 zq_i@nTCQ{*Oru|hTc*FYmn7ZcG{s8WiXz*f-EXoQazYbQO3ZH|g*t+=ms?7XKU5K( zb*X<@+i7P)4_M|r8m+6kze4P1O*_#ScW-UE-K$T0E0%Q;F3W{)P$NyONrN7g?M9$# z4lUV=VGDbqJqb#AUQRj3154}X$yUo}41QAMl%kuivny7_(YsW)BvbAR;fo%XaJ_~Q zLyV#KkkCp_a8dw48V|`6Nnca+n#_m^l>J^4?m=*7Dy6mY0D=KfVMHv0_;%-6sXh#> zFK$SQW>q0nu1(CA^*%95?OMyMvRFdeWz`1K6qJn z(-Uwp4inU6R9lk;#3>&RmqAI!0UbIO*Hw543;K~+tUJ5PL1*vjP}a%=Q<+uF*-290aiC&P~#Q?1lxQ@rSMksmEB&Xr+n2|l60 zB!y7c%-QfAZA+Bn zEx4|qh*ElpNyr$~CWYH{~Gn$gOKtc9!CAx*U^g@QTz;;@j)PckU>XXf>_G zz3Pw4jYpj=sQz0*I|yY-%7V~5tRApI_ZZTS`=jc5#+>L;^@_2nNv`A-JKZl5^0uRS zpPx`Biw0OQrza( zz<9@v9c6|&=Ep;fZIrJ;B$E)V- zt8fR|8ZmnrbneV0wHw^B+3bCh1DbVI%5^ClZAPy~r=o25R+ANjC21IK$netVN}LM- zImR>4PBf2vwyZSo*TV^v>Qhb}mG<0tfwyn!O`~trEtqv%g6-ah>(byzl=4L~B(xUQ zKM6n%1a*{vqm1Q5cEdYpuE&ZZr1eEM=7er5Yh3e8>Pc6t#GOXn*zJzK?|VMarG%-p zP;(SB4N@Da<~N)iVG1QJhf0D}IU_+kEkV_7O>0h5zGnD-U@O~ zOJnALby4T<<6Rc-Vmt{uL+*RLK0u$>gx7u_!w$|ek4KqC4g`)yRO6k2_SZUXTfW`Y z9{i_u-aT!-fm!-R3T0*FwHFI;4x@qq#~IFbOGeCIa$9vOhKVRAy);H@w&lrcN?}u6 z=~HEdp02042^@Qa$krN^jN#_CDZeaSLe0%iob@iTQHJ>Gc09Q$R!2Dwp5sK6k5no* z49fVW@Po=!q@GH0pOF{sG^e*fHkcu^VT`|Ea|%37QxHbTWx`?Jn(f~&WRjot9s zx)gOt*{U_uL$A+MV8WM8_$aNr<|i2leQC$PVl%C)9?9A%)DLrD4Rc;T{{W)q76*b( zSWzaW=XDwUavwkxcjE%^HHl+?EimPz~S&K3pV&{_gr3pNN&sG9>)zy~J zTEgZyfZXtqCM8l@TQ1CIcgcjNt||%(?S&iaVS*z6Ws7pv~NpvfxsWKKjAD%nwSke(Z%G`6vJ^;Q1F!+xlXh91qSp@eu z<0tlLZPgkkPI6VFT1g1AY;Aq-QnhLqZ4%X}RPFjg3zZ6+4fQn0##W`TBZ2So)>?Ok z8YDHuO2JymR<2-VqU}jY&QemcGK1`YZmsOr`g}sJtzdZ3OQ?vIQL4kIQ)0O)RP`a2 zTV**eICu#I?>e-z-t<}QoCk$gRl4dtWC<#Fc-dEti(jEJc~E4~-j@~SM@*D~))S7d zk_pZU0RB4Ovfi|9Inr=3s?oGv^(^$rc!?oH>B@C=DQGIkT#=Fq=Q`OnWouem0|#Pm zpObZvo5}*n=isUs#~qf?JZWXMW^4C(5njrB5`KE8fuVF@ywp*D|I&Y&iZ3-3S+J<> zjTY>=cVBR?>!CK~l@{cxMfj#v+NH>y=dENVqk+IzQipOg)03l0H-|$_jA)Wt5G$+# zrB}V?1|#KFmw24IDAOIa?)j3d^mpL{K$iO55nqg)B0R{+Ry`dFz~h|@-pycqv;aRi>n9 zbs=oM*2+Xv#jj*9g1@nwpSDx%>vBa=b}BEq3NYM_UR*d$$ZRALF~(eNEv+dj&sQK2 zJMpcGV$Wy=!~=(1mM2!V&>^^^7MX?h*ESz^Hh#N9r?Xf~H*V&;@bKEU>+de1P*bi2 zCD;6y8grnyu%M?21zh~~v1F%Zv@rF0t=2|BEOx6!vd-bw&DsIIb9Xafw}Qc-w|?#m zW?L00$b}-MBB*L}7V~{bXU%bITFMj~P(ddI4lp!FaoX(8aivEn8bYeP?ADK>*3NR& zAe{6ixm_R@!+||WB>Gf9IR5}2qZ)1Ahp3rq_`IS4LxViz1%3L-u1hh01?mYx3E=(z z0KuOB0JmEJLi&@vK_eJA90T&t;jdSancmdWZYqa{4TY0M+edd=mrdNdysGUX z5!EHJ1wqz}t|1{v`;TO8EzFWqkh_3dYTu9`sKNO#jnxZt5cb^gk~O!96)vCN)b@v zQi3{_m4tvh9yLeM5cyY5tk^w?eR#=Slz5ch2EK$6go=t-4xvpCF#I!Z{*a|4sC285 z(ns>?$8g!)Y|K2qdZoSNQKqq%L>)8Beo^O9t)`Fhw#Ch2Tz7SD+S~P_Enc$i7T;ZU zN|OMo3@z~5+FLEBtzM$69@x&Tt^Tux-~!+yGZ`%kE*0KEFb;Z8&s1jIi!X2NO|HL2 z-PCH;s5LuA+MQFER*LLLl`dqrlopuopm{*0Bhm`Ge|&TSw3h0X=?;(q4lx;`+m_18 zRXU`es$Nvu!!)F!rm6Dk)oJdAnT;MfbPV<=IT=|efHR{aFFSojAxIt{OIJu1cB=}jYRsTQTJQDQUIH>qrXaJx%GaFV$!MRX)A z0u-gKDM07cPK{XiQl!^6T|8(&^{P9xp-tgzSXRf0`y$q~ArnFm(7rM|@*bMfW=VCE zA(o^%+eOwvUkWM0zVXJdtoFCQi7q+ec570louEL|5KN}T@e4+^H$!^1Mwu>;WPWAV zDs^azsTgsfK62BBG-g~=8CTj;y-5R-4wRRL7rpqU99bc(iQJ>~n3nzVxjQLzRjt|u zN$bMjzw31g2#XokWsvL0X=*6*66guXNy@nAKKd!UOW9(45;JO|uS`192>`Bk+xW0$ z-H?*1Eh>#xV#21eL#+H=K~QEgl`>_Y|4wp48chG05+~NjAD?4xQN@H3ZTkw}vy*@4XC97Sy(H9X*ONwm`bhw{1ElTM)JpMf~?b>xhz+QDfEDR0~K{k*qpwYxUjr?YgccCI>Ga$z$a4hRA(g>eep81jK^ z5{}$tbIy+Ms*kHpw23j%w=Kw4=wlgBz68n5PcKOlubNH633cjy`L#7&xvJG>K#;>L z_zQ*{Vo;T=GzchBB>^fR5uW(a{l#SUHE>#Yk1lH3_O$f0h&<9DmQ>!{MN5aPDrg1g zut=)l*B7L_>foU{KYnwqIv}tuoEXd%N4$RCHEMp!{&DTJnys^1 zeQY~dtJCBvJD6I+Ty081(zLBZf}zK@bFI2`+UE?Gv)thzq?2;TlT4o*;*~M!6XD04 zwJ7dNSu1%Nt^ z6MzRlfEm$d z#k*Z>Xn^zF7B*~^o~KyGyU9@<^LJteuIen^v!PnGG_+l&Dw!fvlRDC*dY)U4D0)88 zNgUw*8nd{zhSg}aHl0UHTwsE=@5_S6WV1S@Aua+z86mBOcX)@X)Atv3;O+`3QLE22 z0478xX1!gwT4fDHk4bj$N_jaQjqgh}mXU2D-1W%BH<{pq>~@;f8eiq( z$x-T*N}D%ym{qnPX0U*?PHtCHUlKgy=7+ku>gp$`pM2}=xJbjnd_lpVx>o-He>X~{ zw>LF*0FOX$zshoInI!K< zG%T&&27yqgmh82cl;>LBQBu@+^&b7W$A7y+-65G)VW4Do;Y5R{I4%wkvYx=FYoWAWywp*D|I>e(iZ3-3S#+0t{%dZH=xR_? zU9xJo6tAbP=T-VV`0Yw_r#T*#qd7{3K1YIdz-5e8pxDX5q7Mv`_13%#!r0Zswc#&Ad;_!`McvR1p*v9{_d zli`B*O&(H%(QfNuoFBW7mWuBBSeyqWJ#2mwQDw&C}XFbi+&|GF{_G)NT;_3Y`KvcM9H-Vo^AJBTd&AV zku&Eg45baBXCMM`(~Zlvi+xE@wr43=E!7XI7!NqrP5e&OA=NH@gq==^(-o=LyHcQ3 zVTYJZic%EPQ0%#8GFF$0_y|u?NEybyt}1a(s5)TrudCXqFQ>;Ji9^3A6L)%Olo&74 zB1E+%+&*ksY}8~uCSuVSp}#sBqqNH@Kq?8!)P6u^TD91wFw}A19674(si@|#aFf51 zS1V;arQGwJoPsib@uq`BpkU*jE#)d(WRj2+0+azb$OPvc<5G#m zoI?6ziS+LCFO0XyN>-!nq~LIMvUFJi-dF3b2A78NprDl=usV`dGE%OUC}eiPCtoad ziP1o3Uz5fajPTyY&vW1O8xAF6{{T$}yC5c1D;}=pG05R+NOE(FD)QTDl#-_vfJoyx zIu_cdF|2Ag%`J0W?fRUujPgcXehjL{$Xk1{cHO)G042(uUM;lD3I$-H za@Qfyl~kd($?}l1(bl7q0mg^#W;T_f)Y#TQ6Q-QIRn^q@zKdMwqpLFGwz%$D<|=N?d59%`IX zB}G{8o^;I(0iXdIWP_a~=b9~Sj^SS0cU7%dHtyV2%XQ4BISr7Vw@n&Uq;izzcc!53@zhSQG50;6`fkgY(@2%gPZQ?%ky{%>1Rq4Xi zjZliYF0;f~ziTxt6Np;BbUXo-spq`H`l@(wRqJ8n(R;&=TADUoOFa6=Nw>Idi zZ06rCOZSK`CgZ|t~7_!BBkS^(3Lf`A>#D?uvC}2fC=ky#Z$_N9ga?OstT7|ac4;UV6CXy z9T_-l!9?r3y<3sHdwE%B#dQ{--M>tj%uBjGqV!sIDKbIxVYy92FkBA=k5EAaj@lrz z-R(AK0ZfS_tBW%m1JXX-cd@hY9-aTH1P58sLn| zeyx_F7^F4iWP{Y6bH`V)HL~h&saORk9dZsBo7XW;mT3^y@&@_H_ge{ zY*KLnpi5i_fm7Yq_m-Z!bvlAk0_WYq2FAT2+ukL%hM?@qB-R|G(Ja^L(&skv3Rc4p zBqb~k^_%9Owp&@fNUS|rpHyZn$a3he`9Y^tuPC_E$x4vYx`#4p{1CRM?bh*^7-~d4O2UVuz zv}h^2;+0@;N_v+zJ3^v+@ontoc0y0!Z9t1^hDa(sstWyHf0{u>#1bqFkDDvZ10w z6x!?UCAMU|>Kigp%EEeF@{W6ZXG{&Hy83a_Fm;B!#{?;H+heHhH+G_zi7lz4-3~75 zRp$bsyZdo&#Hd}YL!~YZS@BMC~JsSlMjjuhzw9k7w@ zs?ycE9V@uT5|p$LQc_QUbK9L`UdsJ_T?ucg#003QbfD#6rx+xA1D-V$T?8T3!|Fq8 zWFDTELa;lIuW!dvRw89t4-WhBFJ@~~T6&PxYS_6QVd|R!JyRQU3LZ;t#tU%`m2}8b zNM2HNoDwmjJDTrxa88Pz^0l^{N@2T+x4UV)v|Ycgn#!q{E!#_GHL%?=Dw7>ArMDzW zOotGa7cj3&(i}KJ9X<1lo4(mn%;Lf%1Dc||tWB=mK;}kVIH`B!>xkt(^ECIKY3E@@ zp3;=kg3zTVRtl0q#yIcK@#?c_OxEu5EZZn$hv&UIeGa1a=Aw)L)PI_aFX6`$({4Jy zu-ZzMj(7tnQAL&dm4kZjJ>`6=&7erEw-Tj3L+-W$8%liV70_0!0n_@^fgSo6z8gC(6scd5F!GnQ6FI-p+QW@QBip$kdjH`BUn~NYc?muO*3We zz00=RvlCmaZUaG)mEJ9Ta(u2 zQq#&R^E$aCo=S($TMvoJYl6KM2(hQMhF%>>Z|tk}(xMMO+1IQvSItcokg=`#^zRCL zjUH@K=1JTd1C8}Kq@iu545t#}xQzp3>ROPJT6D{2Wy2 zbX)%LHL8N){W)y80!0=jGG$oSL$9)-@XbKO=|~CdQ9&5S4;sOLu)2_q$63=Qp6RR_ z@(IX{vNPDN%C4Ji_>hAlJ$j&LAJq%3`tfRG0|A+cR}XgpLCh=UB*EfB@J^1*0eX^bKz+Goruw)gIJ%}KX5dvhXR z_NDJWgL%{@K!t9!@6m`jTI;hpMsA^ zMmoEmdw&kT)_Ilqcv1#%gZ6mO>>c&?DV6jW)qs+;l0wcqr=Q1wKZ{;CEJ(eym3sz~ ztKKf+(eDe64R+sholT}#(jAXceoCHYY6??pNbUg7CUwm2;J!_fy>{N)x9T*@ojaQ@^_y|isx&w| zbt%Z|D1yVp$dsIxmK##I3rde{0m;@)sIye6_Tj;X2Md;+;U_`A=b~PhB?`tqCcic<+S#jEuV0a(3YnNk zTMkQXNN`OG>OCqd`rfSZ)t`McEbpi+7>I`odPex*fz1}1No?hdS=~HU&`p(fm|eYBiiH;Bkf~Xe)9OG7&sbkq>tjK}v)a}NQv$5E4h)tfu2kdQ^Eo8ikfw059ER20feqs*uEM->HOhSb{@ZDg>5(Y#q+GOu+&GI{jIfa{uFG+1Q9NXld;Et0X0hrX z!iXvRAc_7iTAc3x0PfRqqx^Iw%xzy1$^dNzEF-BUKz9d%bDwQ%-G|n~`?m>qfmA9w zJo>dAw-tnmOd%&Dv2+am*wvj!NLqCDMo$z~7bNdJ(ixPp!zhgybY-wmh8s>gMlv|o zrIEc~3e8={W0D+5l@00(2#*nQo=-?|&`(P7#t+L|tkr6i-8O=Z^#1@7^|H~pgGsb$ zG`fJK!w=HTX*6a~;wmrvOm`UjKUTD5U0sfh>l`*_p(crO?JAu3m8#ULTlsdeI;lvk z{SO*FDjU=?wL?Tmh(l~N6yuJltqA}uscJo0Bwvax8{$6Www%xBpjq9XYo2Kp-4864bB^u ze31Fgs8zqaJ-CGZ- zl$hvj^nmF|2~Z#sR9_T4%e4ovK}P@5b`iAzbtuhiR=E zb+J@T*xyJsV=+&DGcCTPu(oC)mdk5eI#twpImpJeZmYhNYBku&BX%-#?3KTK*Y&qF z0jos7;VbO$;a9dOGj~d_Q>9U>R~Yq!Pr775qparnv zzS59^fKab-?0ahq*teU8&;wp@xM<^{94Cr~)gGq0(wi2u%qdC7QlfA~b;h2NAbF`!!rD@Tx;k*9^ZlAE+1s)7i=9w{TxTRVds^CD z19uHjP76qE0-zA#;W$t1#z4`SX=p=r+)DZs(t$Vw4t}zI`}6bm*UO)lYZ!3uP@3$w zJmF1-+FqLI^^^8mM{KLO2kzBPqPF3xyRlLc(mx@)nx0)7tGhKi6_vJ^Jro(Q0DQIV z`i`yL@%_| zTF?tMC>dq$_T*c(#bU&zU6SG2wI|(e$O*wHLx(Q5%cVYJXmI_sAwVmfj&y9x4L3U( z5>UOa((z9KI)IvooT(Pk^_Je2TNK9%<+zdT{oS|7Dfuj4qo->4S zLl&GP*>P6Z$G&#ocI}PN+`Y%RB-M89<`UEPrAkalPFqqb%##=`mWxJ1uPO4}MIk5B z09Yh?ehn&=o*K<~uN>CBrOwPkryDW7vG!)_yec${UD~auaKw6${XRs;A=K%S9DNQl z<1=E8v;_pDD5H-2_Q_qc?)6IpNrF42Qqi^wE+h$&-{Ink5BRH=?(@?3rln{;91koVA*b4Z06DLY-Zb)THR$fv-bEE(W*OtdyI*%Xz>zzq7*&>L~z>px_*V)zj7A-v=MTtd4Pv zmLONLKm{wy;~_t+R5C#70Fa!FlY@bguZGDPuLha?_#?K(?lqOSkM0XM)Y`?nOuj9r zt@iF)emW%7=?aqTeQS<|DJL$V7RgBj1M<#>cACLbwKkejEp)-i6?t&iV=5NAdq|%d zQ|;8R2O)3E!iWZ9Mt>ta^-0eFLhI&wxD?E1norbQNpj8x|m@DCq!yzA7gmQTyzc13Cv&UM> zh(71Pd<{WNop`ME9%nBs`G<13{s~=vowyghQZ06kZnp;2bx!>{*;FYjT!`smmsXdV zS_hg^N|H~=j2#B;qj6AZf_nS485MPKxZ@^t2VT&wEoMgTL#Wi%R;bx)lNQmYD!VqY zJYe9j0A>*rsezV#=${jT&NLi+%98KJI_I=4 z9sdBP*QmDLB1OjiuQ8_WHr-;HsLltRL*cm#E`_)`S6J%z)~)vTx`QyzMC!LLnH5|Q z4a%~3Z>Vimzb>_MZY`9H#;Hhp6q-ts>i#Mc*mx~&MPNG8R=xoNM;v3Z&`q(AaE9+i zc5={V$W^`f;}`bh-M1wjnQ`eAX^y!Wsem;90G4hfhjK<61@UWCn?nw=f50Rb*;RH5OG+jqx<}O>H7N zPnHTwvB5~=R&-BTPZgn2x`3GlPkVOvXE%#-Df@$GPPo~qCWG)&=}C&~i7;TclrpqR zEu^$oQm#2AI3SH3n=_wDxKN!ca^pPJK;8@H-P~Q+u3fgRwfU__sl;h0hNQCE*5hdj zazltS*bqZrjp30EnKnV{N_~ zu{Ms>x?M@OlR4Qj+KQE_VG48-;Xx_sU#lbMqHC&|7GNhRcVeQiQ`ZTNN?<6uykGwS zYdeyn*w<>dJ=@iriE+I44Q0AJH2(l4$OwumJt8@9b(VT^RnI-NAZ*kNJ&?zzF5M9r zv^xwzh~TMbhgs&6;-ZOhGeD}r~2f33_@~`!d1^VM<8LWk9Quj1%pn`__-! zBH05b=5*8{Yr4}lMqAGA)oh_(ek@_y7tAgFvM!&@3U=MssIAIvu{cVo%9fSGn^yuu zpeeQqNN@lWk%BYMge>-29Wy#73|PTEoCZq%-)MJ0@ZfaIE=s@nNu736rf&pG3ZGY% ze%0)kV%zfQ?ImU$zlmoKy7I_NN%<)I@!v&TO4dEJ`a%Ok^PS=l-Op5l>;RJ)M`|(e z&F8*VErY+J@8zLYqf~0u+A8P^Lr9ZKVVIEC+>A;?j(JWxv~`rIj-?ZhIMr3zXS1@> zJxt(62TvKE3wH9YQS`v52sqmrWzULNj*z={)J6y;_QV{KO$&dUt!xSuwrqToxpO{ zd=7q2x&cG(x4aYNCLd2%l}1S`3Qz$^CQt+daDG}Jci7)o?;+pvE0OjY(~t{@nbtgO z;jI2n>t347na*y#RdXPvC2fjJO@|Oj3P@3Wf=5?6_Mh0#R2->+;rSNjkL)t1ScYRT zPa_HiPwzNwVb=qV-C zBsPbfZ=nl3@;C&I9=mE8R+G&ME^9%8GSAR}#mwq;0I8uQYr#sMrEInR2Yf9WX3;;i zcLvZ=Cr)%i``kKib#2j-}A+h^@_zkR6~7DW3rvC+B$s5ZM1VlTdtsVEXbXKVH6cf!tD#`1^g?Wk`1$N^`S53Lj zJsXDU2bVM-dQigIZ)9-!73%z(O!@UtSsfv&OOh4Tdx0s$oOkCc9B4~v$FH9UkzZ_} z>K~r;<@7d-SDK11|JHw+iZ6nzkD}^X?eMQ>{t&H23dl9q!b%TQ zhwXIa;~Hqub{axAGx=hqK z%ZhQJ+B#B63P>DdKX)q|W$jYZ;@60S!7(h?eL4bLtSTKIESCb3w@RBTQ5ae5dv+Ss zTOcb{vzt4$cShH4Rr`JJ6Vz*h)@|>h?a0ztW<BufSl~!g$pX?c{DIE0_J zMovK(&IZ2e7%Lq`WbJ8l-SCS0?n*AZCw16w%ylj}dRe3>gd7~4WMiCrXwK(7V14hM z3|>G<2vaRZ5`L0#ElX_!$&`@Vk;y)g^JJ6wD@8QMa;fRWV9apNdz68MsnkV%hYMhO zB1v% zndd#u9+0^;T5GI4aL1kFesxZXGpq<8)I`^3-C)ZJ({cAFf#jtmGb$?+ zVY(L;%!Cx+C>-*Y4Dd&|)uk88p@PR2yH)Wy)sjC`vG?z-m6faHN)kO_k4eW!KX)b_~`?Cqoamjf))V2E+ zxnVxIJ010344A6S3au0ucU=%r7DuM%8pN*Eu zQBqRPI1J$OWaoqJ!0r8=Yg#jO_AUDpdVuq(^{QVbVMWv3YEdL()B81LOk@>3Fup}H zv6lz|DFHt`<5^Z<{mS2XC#1=%-kXvYXR~-y*|X%gDU{1ZY3XU_TMJA@KGK^GI0u#p zP&g!l4hDiY$;Fh|COX+=zBi&fk)lphmU<55FW+kJ@nejD4(~P+e508cr3+J#G090^PP&dtd8vG8$%lNH12UZWCKA zy*FO(((VCWtz47<4oj&mxS7gN zPB_O#QnS_a#y(od8LZ2b5`IHE*rsy} z;q1t!&2DVHJ96(`-K|QpDD@h{6Y24(m5arc+`siUTK zC5Z}KEg^?vJ=G_vM0!>_hi-V*OU0&(=5lusvRU2K`TX~xHTio~uie#`dnS?eHGWlE zC&1D0R3kYJO|=?3pZ5r6@?PUPjk%Z^kGea+|>}1CEf1uQ?pY6@6 zd%ImyYsAB0%DhxM0N^b)$+UE_6r- z79Au)tJ?!tzK4kGex+#9Ay#jR6$+b=QmPU@4TqBJGCnz?_zLor5LeK70YGG9Iyt_L zBV{4R1PsP}Aq!na;;1n>ly9KUv+X-?#5`@O+bi~qep9G#QZCwU@m!4|blPP?TD~S+ zXf1%Zl7%Ay!H^PD?0FKq>Eo|R)NqNGz}_?jtLw_4Z5QAKot}x=+Po-z! z)I*Jr>Bq?9MlCr7PUnVKcy?HWgzoETdlZOBYHJ9Y3Ew(9hlO@m92BS=5JB!Wxk13H z^Gwq?Uy&a^<>-`}sQ6_=F_#MkQj3`@7$Y435%+`6zA6U;lt%TEiKm`9ozbFkw*^LB zzr4FmRb|#2qcvn(F4Vl(?MWdGMkNa9aDMlzq~{%8`a#}6km&bL@}}k3M2X-$ir!3S z4bxAXCZ8wiNR#C}{8?^~DP=Az?cq4a0V4y0_-mDR!Orz-$j?1=+?*Fxq|gjHbwq)f zTtwQlBgT3YGFnSbGv&ovvQ?6_xO~C)6yuEzx}=DX&iPj+^J|6CR02uAc6%%d>AV+berAu+ulJl-|w+Zg09R2z!eIU?>-CLw|ox>nEFI;&d zHAdY`nJaQ6dX!+xN>Ne~=04d_Z5)Brd*i>psV!tNr11x}Sy=H@a2ydA#l=oUZTQ{D zZpLO$#n#j1^yjU#1{vw;1CB?&mUfywKuR^UK1?do%PoCMoN%crI3T1Bob#XAst1TF z!x2U_Y_{ROx6-#wiW+}2VJwFqazkl!qX35x(K%91cq8A9VRcX)gz8pc#}P1uEB zS&H#W&U3)X9r2v&C|@K>n^`m&mz~2%wWzFvKD#9`TJyR>P!zAUrDP0%bFWLIHT8ya zMP1R_dX~m+G<#rG{yI!(ZB(MwBB->b6%ay^gOsTbB!PqNoiH|CwCdC9_7oR>nv8c_ zh=uZ2HzNAnx$vgncQmT&)NoIGec;td8nfQ z*MENa$L-Wna_g&8bV|C?g5r}6@)9r!`n7z>AIGQ{hee)Ex}{sSD?%MA%(UrOrOkCq zkc+WZ*=@&m6D<|>r39p@mi9VpQr8+*Cy}CN&M=A(X6uu#Yp0l=X5r=e~pO^#h(rMiy3KXax!u%$N&6Woc7t z9ZEUu2*~_3s0^*07ttJ{FP>INK=dTD;#9tXvV-C0l}FK$aqklv4Pn;ikEJmhWd4RnO8NlciU%i zrcx!`Y}yo9?=er4Y(pq*l*dZa7l7CqdETEnXV4EPTh>e82@QB7bn{xZEOIhD;BMv> z5h-?#r7Xl+p)G2SKA$NnL(!ZEmLw%(DLLgQ`3{SykV2|>#&AC;4G$iEkh)pxEV|3% z3rCj3mcg{=jw+M!NG8A6u053MP`v1QD2XTCqitW(UeaQv-{?i+#hXbYoj8z?6#2T zr%=c`IPc_nsRahSiOnipRE11;nuG-KB%vdh*&JcOJCA*3Yq00JXNAK9IH;A16Qd*uB4XIQPeg__1^ z7t(!l`{~WM@HC>NB)9N!$pkBpKZ#3A z5J~{0q=Waqdz|Z5uCdwWTh=e3iTq3Ts#_)00{2#OrFR1y`yMlmT2pMQnoVA)>k30^ zcL{I|tv!BV7$>LHP>;LY_;vIrditm!<)>tM$~0IPg%aP|z0{@B9;z|BHyqkiG-F3< zPsAE~4w(}VnIF=WrD#FqXE?{c2k(nJs?}qi7yxw4Yr9o(Vs;i7)Wmiu73X(v#U8x| z?7Z%Ku8VSAl(wIbG3jr^l_r{!Lm;K4v_oKn(vk-}<0n;?do7-$OIjL0J-MyNR;brz zNH94fF|J&9XN4`#pLE~S?kOm{sHs9K@})~$PKMp+X$y3$Bsx`|4hA{W`)e$rwHg@M z%a&-azz_z)S8YI&qxIhw3Vg5bPOI$ELIR7q==AEJ*1Ym!w5xZ_^saUuc4~ev#uI^ zIz(7)w-d~zL3Q|~JQNn&>SL`+$o}*yAGa9UwOzF9I$Sq#E8@#m8{s}lP`cgYa$L7W ztIoGl_`9N^DHGqG8f}#-QhHP!2x$mFAf$Fr-;EO4s0OnD(jpZbjFNe)DA$hN&vkze z?TNSRsG6eZimGWYrf97g-wtabe-cyiC8N{Zryr}K#@saV>SA=9qgYp!EvKW?+RXFO z25c?Hxa=#{i{^@B$*;vs)TGWqTP}QSPBQX}P^28;!bc+q8YHb}ZEAQOrd}jBPNAej zf+A47RPIeq)0Jmdqfu(Ls_hZV8t*AFb8#+)+xPAzZm1KR| zG<_Do*#KjRLUgN^>E&E@zBT2BS2^_{;~r|3;z8v=ob>_ton&Je+`x(87HYMz4z_+D z0^~|!L`iuxrdArNw3N7>$~aO= zhCN9=h}LlYOXS#UgPTgdFZkcun#?K_x4z4+t#eXn@TjiTX_qtbT9C{Zyr$2R89g}} zI63@IfUP?o>}0Z_f=Pne)Xx-UM)YWvE!O;U=xtT zC0f(lTSf_}NP*a-F+5;x9Gkiwc5cmG)mpU_H7T^uy&jPltu7^LDqzP-3F|;4l=}@{ z*!B#tbZl?{aBs?~?R!ohI!6Lz#;Qwg_`adlZr!(j@3vJ&q}kVf%X7+<+P;uUO>vn* zG=CvTNj_5E0ZR7+AtP6ZWSvQl=-nm3qlSkvhmOz(mX|go7d=KwKmDp(B;}#H*DF-_ zZL7<2XbPj%Huf|wx;pCN;JDT35|j#ALPt`IX9`M+fXE>0H`!&RJ&ZZEj+}Fxdy*Ej z?Y4K*bB3-FhBQ1uRsR5EwvD~xyq9mutuaNU(WCt@()gT)tEb{i!&OIXuPQCoW>Bh?4Z3b!J*jUz>r)z` zPWYhHv0Z(y-EvcqzMKxOm3oFW8AkUufN}dMJc2Q0-YFPvo-`%#S4fO^(|GFv^)2S^ ze}zwQ0u;hmk(_+ADQc{6hO3G!g<{|LS&{%2y3lNansO%qDl20zm}7Y5Q@l?qJQ zlI2^j%y3dGPBNrNp4I^cw-2R7IRRMr?UAGV6|uI4;u`N95MAL+vm%>s^Wt$X<=jSQEXl)cPH56a}(0`hWE;Yoii+;MV z-qWQY;AwjFFPCVteQsVi1&>@e9kVy+`jQgk3N9foG~+8dQ%^RqQnc_mBN+huX_{>9 zs=(LgASH#K(CSab-fQ1{?agvUw{&iv;hEH1j;#DyRKJZvS{0`!I!nq*agorEP{sy6 z>}V4DHgN1TOp%dH3!qjl#ZyC~tRiaUAf!eBd(ex(pFk&K*?p9_O>;=YjP%l`$B^tXB@QE=yp(be7zA^ziUneRkgcs|rq$Eodu(2xh$*OU4Q4xS zpy4R^YFrjjPI)*9_xb($HMu~|ot-~b1?96gi?|E;S zn~}Mf1^N|0l-AyV4w zHlvHjv7JV(JWy#XO*sxa(p4sdDPB~D9sSXT=Z2ieVln7f^XlEL1$&F7>YSW3JVzf$ zUEhc6R96tN^UF_{4ojE~$!~&UN*sW^9uL15*V9B5T;f|GjJJWP_rsF*vht8vQ*Npv z<0!Dpu5zfWR&y3eIm=4y3Hj?P!uHQO%z?k(4r(t}q)4Z{?P`jJ!*Uy;bD<+8Q5VSz zM|`%gW9{#+rkGY1TTrMvI+@7oyNKXWfZqsX3ebAgED z{{R8@*Tt()wk#(ncC+i3LMj7LX}w7Vd@OJ{>`Q6Z-5+8Wty3>_d#8C+ey7b=XymJ| zlmQ)&)~Mj?O1HA^RyI@XL$a@tNT#IqdYn>GoPP#;>e7H!v`$Os4f)6_Njl=qdiTUvE;4w(Hphk;xt;mk9dI;mi48gupb6w-T9?4H)`vKbuQ0akT`O{EJ<2HFj^8tz*aC$ zJ8NdiP>O(qyekc?qe9nWsK-G#9l(*2TUU)~cP;UDT`s|D6uR|NOt&M(7-gd4icxK` z`_Y~?(pPmX6x;Aek$!JpkHuBPaB)z{*m3y^#s`qrbB-|J?XSASKLGNq6fy&}`4qd% zXQ?R*0AK;1pWUl!IVzkbaAUgDH6%RhfNiRpi;6#F1tSALAakuUNOpWy{YIBlfvIL) z0Ifh$zvzgxGPe}8G!c~Kt&HTL zJF*zs-3j_vVY~ZEVkGMZCZCO&U zxT;%KkkdGsBzVE#S3{~HD(RHaQ1u)v9x_4hb+e2uaMy4>%keG7;a?EXP$RO(anBs< z>8)A_Em>`5$=NaH+yI@KeJ*%Zg#pIp8N6jV}GY`EFSapiNb zm;-XyVEjqtU!&t2!eP)>!|n_R7toXdeaTO-BVQqa=og0$u6&Le&y7r|)F$c8IJpme zOsOO(*RTdvj>#V(o;ANom_nzvTTM~`5C(yJ-IYs*>rB5frd(O!Dp&{Z`}Mfe8Dg6s)B4#jCl$#t~59eGROW#xb412zy!{$OI0{m}1xCl}~WJqzK z>;9#EVNnERk~Hg}F~!q5z*o$+2aigHc(Z<^IK9HPnx$B0&(UfbtoTUoM-RW zAU7yoD5thJmG!chyJ~0Y8dK4pWp&C6uC6n4qNQnBjVT?+Qb_>gARmz^aQAkpo+Vv{17Y(ZOdB(9>{LVNRCY_^o7GNRLLw2UPo80yDT zzFHu$p zVEWPd?oY~?%#`Ms^(qPezWnusmhcU#JSbG}lO zH>qlDxC6mJ6sRted&B=o$5kXG5`XXZF4yX}pxaE*8&+k0I^2S;xL6lIvKR#M$6rc4`-2n&lbC-+b} zONcytxf;J?azoW?8b_pNZ90w|mnA|%?&Ww<=0YP9f8Uu%X$fI~1)Ss;z7=f*`HQHF7yUyf^b4LEfaP zXsyOwZbNb%eX`pRxsNVuU~?KzI1VIsKf$k{UP8$9G-bMiXd zqf;nYZB%fQ_T~vapzj58YG?_o%K=0sGO0+&!2tCuTFyOXw`Ma)d>Xz*A)19PP9Yp9 z5>9?Yk~L{f(5tAJ%&*2=C~cMrQS#H$1Bz1ALX=g>Q784kXKi}MhKL?K*VRnS`7&1H z!`9YWH;tov-BayXH-7xLB}ZnRx2;q@itC2(PgO;34_lxTQWBm49QPUx+FQ!48jYq7 z29cY{ocJs2rpCvxz6*%T0gnm}Z@d@mD$PU8*l4>xnw1bR)gENU)E@=chgA5>d07h~ zB?;hx$sFTrB9=e>w7u+E)+;rscW<91 zx`T;mDmqruQiKq+br1;82TI#hT~LEMCIyY{VUi_Q?Ypi}AYAsFtWw@p(wmhIIW^~h zMs6V~N)U!X&tFj_sGpXx+NS~RMjICP{g~5{k$4@FQwX_gD6ha>DzQ&8p(;yHyxAwE z-zi~XKY_&&H3 zu+yXzr7Bn?6r_CeHB4$b;XJOdu-b(Z%9R{TngoDgN+n0R68#E#ODYUg;H)~89_d45 zWhdu>t%?--?T#T>Z5@bN?DZT^wRe$I=e#dhZyF7qTH5E?y@kOL$*s$BqY5)Iro8d} z5e+!=ZzW9*94Z{1-z`6Ex071Psg^^JnSOlR>9|&LXA{GUuN#qKS2oh}tywo3SZ=jO zDTyIWI3123PfLLz!Hnc9zO6%rP#)a~T2#*CxS1Q*J`a~LspRz~_D4$DQjbax&l$&m zeOc0Us`~QGw;k)>CW$6NGGern{{T-*h+o)!AH7%K@;dvgM-h>)m3&jSwY^tqyNE09 zqDwU77Tu2Y_}M8)LVBKzq1~qw+=1+MmWV77^Xyn{v^rBDhMyC;g)VO5h@=D>JwT@? zff+<&Ta9w5b=>f08-6fRSu92K6x>M9{2Gds)5ep?)q!v@}s1yEJXo0z#kT$?0+7yxK2VmYc?aq z{X+gy)Kzw78bLf{%LnfRKjU?S56?C3H*r5uzf#m>oCe}?>|K?NeDRHErpWvEn^inB1Q`m#?W`K&=mDpG@_6zb75ni&ZBh41 zkAKi9w&iBrt?i^KcaW|@r}$Rb5#(pxOaLGr@-K|Lz&MlfS{XBl_X=#R!Gn6*6hO9BYG!ntebY9xmJYBx;c8-flz7L z&5_ifED?ZGc>6;-#PgO~thAsQD$s8orpE5?^!B!LE4O7rtwM8PJa5UQ$w$U4o_>L8Kac5hvGVz8XSAPk9oyyzuVwy*etXJpx}Zf1 z%|#dg(tnzYAx8Q*TG{=?bSR-sQDiMD9nz$XgWPr_UbIOAnDVcRj)syrA0p4~seIJ; zMjEVIjdhED@v1VRQn=-<0qcgJ6r{(Zt!gc$wEC1)g$}SeBqC2G%6glfbL5|X%TGq6cG)P`ZB%X1N z2VNAO*W!P+%^O&2G0no?Ym%>1RKv(CQ;oTT6ZVsw^YS{-TZMlNI@(4&#NZ5lp{TqC zbrT{wqpQ})SWi!@r03_~I`MsEqOKwwN$1Rzh{b8i7|0}!2?Lyc`q{IxOqHiwA(Fip zCgIer4Yu&txVDNT%auU8Zfd+my2_N7J|Ezt5U`>TNeLs^;N%cSjV`-5sfZm22x`$& z2}HUDQr_J(Qg(xCWz*?b&iXp-ZltQSGG3$FPBsIs)2OL*Jm;G%v{vkZtf+LS)7WHd z9c6b)?HiSs6}v&tgk1%f+^a;u#(r(1pIp`y0;op5lcrEp^t+DcPso)W82e>-+I4!(w0AW2@ z>brYS1Ic_WIw*(C1DPh%s8mO?5`-|8-I-hPcoqe+Y4vrq>ud7dKr!RG`hL%` zgEV`C*(%mW^ycahX#?xq=L#iMqRWK;0Mi!pPcXI}9&|(!UWoR45IeSgkITNjm1SqP zHRGeJ8H|qS4@&;rs!Qam->JrR0Rn<=yTw@A5-$_ousz%y5z!GK9^GF22;;**z4qyR*j~Esk}r7ZXiQkI7b!q z;$5_#y@&kok$Pmuj#z4Z0-;O`>PpfN zn@@Z7u%7(~KBW6<0}CZOj*`dwDDXUbcopcB^Y1Q7l`*i@vk_JC_XRJg=_pflh`*pYX{`h-qW`%vuS{9ow4zqOL zH?;68uo2XxfO=2y{s%hTm84w>gLq(4>N`tPhqY+1o87t{*0FF*y=l(8lS*}@sg`5O zKu9VI2ZXN)_Z*EZcB-Z;R8%g(gg^&=^m%Zw3IV_gGp`NEN8@rscO;q>BAZBuQopTg z6jv{LwY5%lno*LsTrD!g%RnkaXjVzd1GaOV1YQh15h7z2Q>-F;5tru^8h@La>);8E<`!9Dp46-F>W}iF>};0g%Xn5mC3;!_35XG zLff)h-9_S~axEZ_0%z7W-44BL&?=8ejJIV$Xu4Lkg?YUoFQ{jOkaRa%kzvBSGUmQ1 zTP)0~9wp5L<~4=is=G<4vfEEej+CKYKsMq*&+zL5spAl?EVq*>84ey27aeRsK^{1$J}eqgL2(%?95Y%z9l1o0k8Yj+02nQkGn=!V+*La9>Esv;_fE^`2=-a6G1K8@#w8K_Nbynuy&~osCx+u7wCm&5T zkPdQTsE?V*3ij97$!nXvzTo_Ck$+HN8^++I(qdKPw^**tk4|AqX;GV7(i}@|sn-b! zNa|S0J%+w2xKjnka9ehIPGG_tmp20n$L`j_?e5S~Yc#s1@Yf}7g}Ccc=Ti}FR9m8# zmJ+43%~1VXuoc3yg%N-?O<}#?UH--!#}J<7y;8~moQdHcbXByx9_{5;iDjnh@gMoE zdS4WpEn*E3H08J*MZoHqgxqy1OKW*SW9vFo=p3Fo)~$V^sMk0(k{U>v;jZP8w|h%u z;TdpHJ%RAJjqcqo$J!CR5$(&u&W$Y76t~D|3E*;GS}vzk(ShBVeCnXS#K>|N9!=V~@)%J|%)9Yzt+fpLRF$DB z1bgwKYE^@Tk1VRU2*}d<)$*xQI&v>SNcQWHGyVfvT1j4r`^&`NO7JRZALa9Gr6aL+ zKm+(us6zCHpSrwF^sm&ack144Cq44(|6c^>BaSN2UnB_s2_j1YM9p5s0L z08`&yFOXUHneHBy{dHB6pg%ifEB)7BKXyt6zJ#w2Mn}-kaP+Rk#%h%4F(orrT~XPN zh~_Ja3T@!9Rn*xFQBcnr!cKMfqSmD9bsSn+8vf6CY zY>X5(N9*Idy}uoN9wld{z*{FOV@@ZT<-jgt(jpbpDX93`tfA#eeIBHzBh=GJ<@@D- zHnnO6u+xvO{F*ZZ&V0dN4U^yTA8lZ5m0x!*dJW@f)xDfHFXXVmE7wu3ZkGp?1Q zGMjO-6s4yMLbx~>&_(HV#X{zR1aW{56hmgW;-@alw^ah)4YaOP_cF=dwyk4pQFm_f zj{EcylzeRxT4l7c7GrIkHeYCbKp0L!lrS-^Y8H;6rZa$Z#FW}%EeJ_*#V8c@dklQFT12h3=aTjmI1t%& z9JzvpXFWr(=U!l6Zer-uK8h6>qP}G}N$1a0Bq4G!f)mgdLQgo(PtRTvE7Q$+GGi^b zAr$X0Hl<-5U?qJ&H4&Xa)#HpSZQ&<=D0^r0-J^BW+xi;jmL@${a2FduM0K_qp4)A> z>#PL?tqE+UL4No-1ovHm)oGH|LwVW*NW`T((R1wW)k>$=ZOgaw%XH+`9&)Qzg-L#s z7Gzg~oa>O=e(iXnFO(_gIZMfpgIw6`Xy zNp>SjQNmKUu!NFucm-PYItV-n@~?`G#L_r}+D4NI)5I^1;BrrGc)o(O)QWe9kL|Zrrq6v2_<(w2#w2p=fRx5Bw%bG?Bs0S) zQm{!mIr#yDtettc+bkLXfU)ylc=k~8hj z4X&!eq@F*qr4{-K|Y#H-uwW|sG?L4~cAxnob6#2jhLvA)g($mQWE(DOQ za6me|YguS%0toUIOe(&Ev)6Yq!5_Rpc&3rN_Vtsuw&kkE-dmQ#3`j_AZLO*D8*H}P z87N2%#vMxO9H^@bS8NY1dymwwH3^fuv1hz(;?qnt47ZKos`f-%jyQ3IDxFxSs1OJ4 zj5-J3$w~eKG*?R`6z00j?{wF95$Rt)rn*xR@F~|lGYU$Z(99T zcJ-;dS@L$SDP_efU@-#abad3|xgohNjy%>+&)gqve3l(n>uLc69KEZzwD2lCmjw@@ zAeq*!MR-Ea1FSebkMCST{vBjyc`fHRr{z$05$6R-Ph5p{B}kVhLuDvhh8n3bpVd}# z((->C=U&7r>BGna;bG(OSFMQ=(1f`uGS<*anPyW3VnQ*D$C4Z8)9i81vSCs5+;VJj zAjT8#gs-`|^v{P-4o*^3I$ZM?EXW)lpCurH$?ixzY8DlU(y2M&<~j*-jxRl7)Mx+h0oCNTXXepJMI@hi?MAuqV^! z!B$iK!?>@mU>v(oeE$G?Bj2E&#CF%o3qrk}^xyBd9nTy)SG7x-Pnt1@CAfi{5#>}F z8Og_QG!Nk#`UQ9cYO|0&79aDzMe2~l369kGE-4h=vZkCIyH9lRprPN(J(QE%P_L?W z33dnjD9?k&?+*gL7uo~NLYpl4N=weR$t6rE@+HPT=snam;9CrLhH?b&_pax_sXY#{ z=SXTC_Yj$Q3vJ>1o9G+`xA*+Vwzk<;L@KLolL*AkH;v%%D(>ti?OM>bCT`wJ-kP?- zS1DJGQmW;4n-I!O=(7qs0>eO`t0Nd!-HiJIUl(0RS2Y6z!4a%PBFin{*0q$e7LW!| zOyrJrZxQ=VT6Vu-UUzL)Wf@jFEtfBORM%gbRhp-I-FZ=41!xIQa8Gld*cqg>Y`t?x z5CoSKhIAdPJ)ZvnqG~`o4`mvaM5gT@h67NO9qs=Bl*C}OC~dCtD8?EOQZ zN8UkOc733D>b3F65){5Z(Re3H7uUa8bR6}nJyj|1$p$?jX``>Nc{ zL-C4(NZ5Z3PF$Z!!|`26Zi0srMJebNPO{h-QcIz+$tOAK<5q0h_lCiuXO2ry-}On6 zQ2b(w?CsBkrsE|McczA3Nx^VETmc{gN%XUf>bcu9RBKPk>06E3O2bNr;}z1kZT|oY z_Jwcrl^fe`)#Jf|I3k$aRauY8b=DS!653?4P!twH&NKYF+_CKSRy+|*jK+Bdqj+D{ zD$^}>LPrTD2v3V!W}i@`OQv{l+sUf7;jslZDx`O0NRaC-2Fmc#nL>)WI4C&JCq^G> z(&?Iq#oUIOX#jf>KRn8+RoaWS>eW)RDUoREsmgL!(Ugd2Oh`#}MPZ~RWb~yyTnwBI z5YeO2fG0s3O0IoCNj@^-C$bkQD3DKAL*4K{LS+5=&j;og!EojA+`Y}A?4PQ1q!2%# z8t0$5>%;TOe7VDj_~lP_@*E0<`)0wbTa#{jT*|~oW>O&2n@qXPIO0O%u%MyRwf0HK z!S~i1Q1!P#jE-bv7nHLxJNG=3+^&ZA_=clOuy0M2{Mg+JOD^co0CyjFlrQJ+77$_|ZN801Z3Qxy^VYmAW%!%iR0&jWVFcIjWd+$ebCN7>^l2 z0J={}z&w-RCrV55$4!>QO}$p-*d!y{6<0oxam>Q`cbCE}uNF*Lcm00TrEGQX)OELT zw&EMAzb-n!Q%#c5jylk+^1eVlC$_TPyFhOIOlij5+mIk^4c_%^kZw-JQqMt7>fI`xm>tP)+ghp}QLZQ!@FsX>Z%^ zE2XOCCM1b;;;z99alEOuA7HRDduK&AZqixpLn8-))l=GTy414k5yUup7v}!}_-L!_ zJwI&gHOHwF>D!k?YN;K@VaQ6N$_=)+;y9GJuzEwuDOVj_@Ceq`(S6gm7d4_Vp7FS> zcFP4@Fa){AN4jsED$b-+`qVtSU_6iu632didc49GkT3V$>|cv&m_`c}utrY}%LM-b z4mIu&pnXm*?_&O&TP-1f2>b|dDJ22c(Z@yAG+h)i>z(1wYJEYVkrt{QV_F`e|(NLQEj9g!qc3s>obc_Nc^}C9+H^MY8KE^qr`F9bUM9}bh$>U(k`d# zZq;u~hUs!dMYSQw=yReoO)YC>P4!3f2bNXlsVP}NJ-|5m>YlX;r--fkH8X?}j)kKhPzAI0!5=fh*$y*_D5Nx?Ziv(B-)uxY|pVA4dOoTsLT z5~P-ndPyl6831<~`Hppv=DaRbZMd~&?hWN@T5+2|e!oy^8r9TOfVB>?2ROnr?XL@i zb32wcu)M-6Zyw&n+U?-FZCY~yiW4m*`bhIU)hZi`A+;?2{Pdo$mYJJ7Xk~gJvn-(Y zpnLAl`bP`>*NF~jT_KVXljH56a})PI_aAfJf&a$syu>CJ}v<4cQg%5|5U zJt}R)fKsH8K?D(=`pZF>o&nxRm0+~L1vfZu2gs8ppB5hU+cim5HrHuw{InHZe?}|f zDs@WLJ(Re)H7RbTYH5rdw2nH+>FVWrXo;6wGQV1iYHay7kl_;{DQJL7wczQ0{Ws-3!~r6xOZDwPJp zQA~#kvI3m*m?BD6I#83;0OXz9Gv7|QZ6Vv(wQW=y`en~cv24eFDRFHrx@cYPd=n9o<_DL0Xvo}J)O;XZ9cPKyXU+v6gOR- z?M1b)nT#!=ye2ebq^)GSPD^`8Gue@r-v|C87`U%(95nlP`2l* zsh84l<4zBM>0C#+_tZSr(Qm2*h!1X~aUO6~p-YHR9h}^kopB(dToT}FOMQ~1hVg}t z$2$7~R$zF^ksjsIEj*`k_Ohxv7=O__)SRfT$znriKA$ZiBoKMYCyZ+#IjULbU%cZzt+)zDAPf16{Aw2b^2la^VpM7|&nG9|knX%p+CxrP5`I5gh zIbETpEKZM~q-prb!Qo3nPI80JN4BEMM0(X+!S*imcKKI!pE?BCP9aHG(MwWPwCC$! zJ?x~B&qhxN+g=gDXjh{8Z;|Yy!13u{P*kdH#VsgHvK>#>AtMb>XlE-&uy79J-(I+J zSjcTw@B>4=hk@nfUn`N26Bbk#Rq#(Z8;s!laUWU7mY{hkQOF?n)X`;SLS?Vi2|OG) z_O7*oW8OQTa89ISy8&%U5FigRO?0{hhf<uufU~&a z1FeWVcA_$#e9@Ne*&WQ=OB$oK8gfEgny~9$TdrnBLVxZpr1$OW`2?rmTQ-W}jarv|m!v0f8lRr@ zIC6C9Ds!e|(oa#!*oqe4Q9SgloZ~vJZCqM;5esNBn}F?f74t31iW8A0S5fQ)Je3|v z_x8tqeU}sXOCwoK?jIQ({4m}O+FRXd)h-yb>Jc9JntKUqlxC@^lOwpyX&(*}vb40~ z!iY*q`;To_Ud?l;k=e^B;n(s}#ykE*6kOK4VCC7)l8NWP6m3 z{`zI(69l2=f<`R-$-(WbVV$3|YPK^@TJVJ$l?|#{wf-q`s;iJblBi5|aHOf$7T!uq z7C(ow;`4ijX9pR~=ZkjXs=l&-<^$&MOB2LJM%}4zF5tas(cZVM&!tv`#d0d)yrrcn z3rlg75~ljr3bBEJduXofd%6~fnaOHBfH=p4faXxCmV}Tw;Q-uP@}GamTH?Oj%W-SZsAL?CP+d2> z-%wJ9!5Lwkp>0;P5-|dG-qz>Xj5}?(8=GO!wp(QA*5s${4a2rtezPt6f%8*g`m-*W z38zZ{w*V-&nC&R~`y3rs+bqgU2^_<<|RcCYo-CH!++8 zA!}WB(MXW?lRoq(L*f4b#6N`#o{-g*vlmqo)_K*vGBvX`0-p0vyuP;!ao#Bk^{XT{ zqxW&8b?0^3sXG;5Pd$8S%FSq|@zn0o0X#_fukk10YW1Quc3U4HjE;dgA#1cMuJZhTsx+>V8h5iG$t;;>3wOfh5DzLL5 z#HdAj4MH1Jp-4|dj6Tv_ZD9K;Dg+%>wZv$%rIGnity=X@X{=i14vOr$9iLcrby<-f zOmj|Y=2FW_UkB>SxIV!2=i5fR5ov8ZK@Ks9Wz4D#p`c$#5HvaEJ|u`%r-GEFNq7P= zgw+}+KYto&hwm=_F_UESk?5`HnRgm`4Hl%&%bh-ds!4@%rD~iv*LA z$>Uxx4il&!jNHGc67$Wer#>~toET6uqmV)N?fm-j(!6O6GBEr{E@Y}~v_|+Ebavs# zkaGKu$Y{8{5OAfWj3pzGJ@u_n9ahylLrKK*BxwyX_-f^NBBgA??>f=EYEg~n5ylv| z*s3#%bd^7r)cOO6S{`|&l=)HAN12j&H~=$gUsa5XV8-*m@Rj}6#?*Eykv`SFe%0CE zPYxB!Gkk5!^4y}(Xxn2^yeLx}rBkOcW-{ZmqcI`n!U`lL$?F{`Doc3@By*}OEw`kk zTJ1nPxhpD^g*VS1oGQ2CQlA`de)Uf*s7-TnYHTILk(l{$Kx4KFxzN?Q#|uX#XJ!Ec znPNAU=M&HyI9MMncgKBJg|-ycz0tlQ+A{X?EotVgsfkj4iF74xC#^|YT1iepDo8vL ztZt+nac^59&_i&c*oxbjK*Cg`fsAAJ>nK5y6*vKY;PL#LARX)Pq6PzJMwWUA4mCU2^hEHEnPjy zQ}cOOA9w7~7SMgjcWLt?otyd$eD|iasx(Br)KP!`)qk3bAQy^b)8XTHj&c4YvPVCE zNY=%Z=#BV8%C#;306~AjK1H4FmAz%zyNyDX9+InxH8}{UrjQ=;+L0;p8(~TcCA_6- z7*dk1kVzclN7uauzKJJxa)Itzg|z?~$%WeSiB_vBt5Bw27Q_lo{PjthP@Sigx`rtT zVdmRu$Icexj<`yQBLDz+7#dib?0M>E#WGoDbuljAqN0duW5{JMJhs-@897D{2l8q! zQGK0_+*NHG``9DLYQbt!;fYI-+Fx6Vb+$b%VEeE{^5a zliRQNz;^>WAYj5}Qq_5-k<)iBOQ{A@<+{_XtS)eDwtCJHDZbuQnf-6xllW@FkRv_H zy3ZUPRck zk=6zddK^LLgUCNEWv2McimEmJOVoIgGSV{fuXH*~RPg)de-%DyOKMO_LJ-<>(%Vgg z!bUZ{OlQGiuWU7l8Uddi_>#F5N>bS}Tud_}B&3B+hz0|JJbBHMFqaea9s6tAjRkGl zZBqc4BiOr#Bgt{;@##?@i0-pGO9f?YNQk$JT}SU$+7F>=JP>~!VZv7BqNPW=T3Qb9 z;4(ak)GmjcMoR!8sj6wfLy1~tDo9bsN0xfP2^cxZ*RVp@ilpXSJF{qSImv%zR`@5& zYP603AJHKG-`lTx(W>|YzVlD&SB@fpfYOPpr@2Y$e?0#H4!#B=qg`10kEv0~PC}hA zG}KCQii-p)pE>lF+{nodI!`(ID_LP#QfsNV8345VCXB~u^e>fcOL_57hy)v=oJyoe zPp9HSe$vvB@5dt;J@w?Qji}a)4$hmjKIfGA7s?1(RepfjZPpM4Mw&;b)xwHX?t}bV z`dLViS*@Y=FZu6XGgEBQOYj?1h>R@`AsNfC9tsBs+@OGPe`dT|zNR9qKO#XKo;@qy zQgRQ+(j-8X8~Q?fCHUxC6o)_{heA?vp7`e(*Uows^Jio5IjmP`=qC$F%PqlOy4_~o-AfUemdyt8t5_S&y42S0$+tx0=9sj~Y%T>olsfB;GNR$> zQ3(M!Aajr-Nv^WExR4ymX9yels|udFKoUcoB=F?DcaF_%&EZwu8a0Wqmc=~n3HCC62gI5^}ENY;O~liN-k?6|BWWmxyiv{vhF?d^oz zTei2iHD3;uTRx`(kyM`Da8}-t8_lOQRuT|U**!@wM3Enb*rQx#HdQ6u2 zRbcSBTQT?2-C~D8saz6gB77p$UY2A;j`J=yxv6o`hR|3_y0W4N9rLC=^!B>WXDttJ zBoTMnUfR5~(5rvCwoDzW*`3U8&#hehoXz0eXjMsdTI4#cN-|REU&MKF-hE+eKAiAA zXN?ct4>jwwx*LZ`1WL5MM?*;JXT+6cm~AC$b>_lLX+EV6*!l6>N29BmLsaV$Aa71v zVyt0m?OnARpL1On<@s|{Sd=OgY7k`_bXg!2id8;UL&|I^C(xxdPq+Z-UwqnnTJAYv z2XNQ7Bx!fj!Axs0+>}o3(5e>p>EBfP-0GaFl|HW}r{>kvmnRZbR21P#mK5`Vg=7(%RHmvfYkb;o$sp{5;T=DBN-S@ks_Zs4<3G z0OkM->Gp!`i5<>PFKyF%!J_R2t!8euI^eed05sr8yW+@&OLnFG%2O@Z&7FRg6`qn`GVahMsw&oGGSmtg^V{-y`*bBSP=m3rzun(@uHBe2V6U+eOD6 zBjY}mFY)|_EXI5`T(w$X=XE;QsJR}gZ7bCVqJ~ckly!s@g%6m>)-9Bpy(<}! zEy(W+CGO_41D~Kf$yT?+MbY5y;AS1+v(%en$GvKC{F#)w0jO2Die5a(t8HouDe6yj z5`|z8PKU3nHL}EU>bYdzxA~`F1+7g{O!e{{W8)_4JICmU5xb z_f`+j1C2%O^Za-%{3Z)MuOYX1Nb)wgldVMkL8HwkYo>V$Pjkos6k0ddt1rJr-j=R%e2 z44}tg5g_>y6$-AXL!AWj&?r}ktE4Y?cb?mMoTWR1SD4f3#t>5bjTB?t9B1*+MXHH# z2a>+CkPt*X(ws;+V7ilxlY*bT{yM6KxV@>73AMN%L3^nrAxR`)(8vA2p!iOYCq_uTy zzUI8cPqj|HHu`dr=d=UOB2!8|X~L2M&_+QR!3RtmqU~s<4$eS5=tA?h5^)X3$fq}! z>|DFII+r%K%nD2zBt=7~(kV@RGzhIFOIhe>sa~b6YEdUAoDMWYci34$u-!?{byPQ< zV&k7EPIK~dAz=<-I8WxZ2Nm-flQlX0r%R2X`a8Z6MSC=TYrD>x?x@ik^HD|r)_j_54Llx)^?Kc8?1<0_NO(p++U;_ zNXF#`>7&wj8qu)Y+xd2-Rx@@yHlwZCwcyx7(#j(=oIUW$NpWwU6qAF_ieBSRX;gMB zLq14efDdr1O}Jp?%qmm6mv!a3S5(@C?I??inxh^RO>{qh+Yi}r{!^BJJRY*1!0^GPJ zsud9_RQb5Lry-balAxB5q>o#NAS4mojTu;RmYf>%Lsgp6MkOZP?Y5%cwtIW6VA_bqvXg=fP`QY~3SC z19GX3u!_S=sljiiq|ob`6ek{Pecx>(9k&b#z;zl z$@kZw&Wmc8sssl&E+ii)UZ)(TCOHU)J3jgNkoZ_51vohA#&gcS!wc=LsX3PYP8eT9 zOQVog@U?JA!SzTyj{f@j60te8be4Te@zX;n1E#b)oRa>gYsQMx_g~bg)j?F*&ixT3 z=a8~G;7pW)hZ|8pxjIiJC)oRHPUUAnKA7nm2fk=B4>8Sr!B5F`6uO3B+^{_`<*4-e zq#sHaubw{1{hEs;28?XZo4u2Dj((88v>7kH?D$Ab3yPjk#l;E2UrK)3!f}p&SvvY& z94#0fn;oIyzQ<6P|%k82Teu+J&VKW;6kvoFduO6-egRFzkd^m=oRp_kSIK|@Gq?F6KfN7_Az<$}N~wcuhW z0m4Xtx2<-bj;jVh6Q3M{;#Ke6q=Qr4CDA-cSgu?9p(v*(4!I1=?S-_a(xQ)G zQaRAAt7q#tLz+S)p?*>WA`B`+u^Yj8+562(E8YrIc9j+RagjFRVf4{uLTxTK*i#XZ zhm+UWlyWh~cp9*&vMr}fIg(u(Eoys6T;kV=34_!3!pLQ+rCRac&994ELybb zaV9+c$m?mgx>lzF$5(U7KKj?PZ2h2A9Yd(y16A#=_@Y>I-NsVp@a-n;p>Cx*UfxOZ31GKWH9!Cv;4@Y} zRRx+3((ju#2F5F6;zSUeyrtHw3aUFGCGMot;h`xFp}?heEl09Q0CT|Q-%>3U@w*hv z03lr7fYhMi(WbJN&0eA^gtX9GboD5-o{!xmueKBK)AKqwsNo8Z$!F+uKFeNB9+hgE z@d33Jl-gGg>TIm5i*T$8R4QCLr7pI(a9ve59|_kSwBhQ)M_v?t{{R3VR^_N1dN%;l zPNGPaeA{zKfj>R!y6zSIT-;mYy?xgsvWtf0nz?9&93LVebA%)UNh%2dWd0}Rq8lBQ zP+(x(6?In%gq;TS$K+9{v1J#`Sh$f_eJWeh0m@lG8CV4I)CY6>HNQ?4v)U2JOl8j+ePwJ8e z3R_9+2Yq-B_3b8?7~$MKC3*k|2}GnvZTE*?lH6dmr6-ZqgTdop1$~n_wqS2AfWJ#g z=_ko(g&gDHRl(2WuL6PG&&OXve2jfyU@L+OpsWG-VDYcExneWAemGXj%Cl-M?H$#( zDzl^~bazSmUBzYuLUE@i(IF-GCaEq3dQeiFgcT0Fj037WMMj%IsUr(yABDMC({bp| zMsnYrW{SQEHk!lS$_I#gUHNNM>h4jf3>c3*!kCj!kdZA#O_gCuP*X!V`C#iyX>SUa zXHzuHNi)Fcwr;y9s@GzjGBYH1FQ&8Ll3Y379cJy7?8P3ryRZxCnIt_OP$#hjPFkb8 z6=7itNGSt32j&kNP1;6OWkFT5hr_-%t;%<6>A9t@IqRC6eo#%zv+o-}YVE3Z#SW!) z*>yUFI^?B3r(Kl>WM&#=-!&)+I4emhQQ=_ZXPtSmwnw(3>JbefLELj*UsZu<0O!CF zJ~c%)I^x=UM{}*~hjs0-a@rKvdfjf8sZ30ZB_%6jV|Xd+4J|n+>KX6c07~zhB}(*5 zX%G)R{6ed{tsNWX_@lM4;!LXfmuhZZ^sU+OHN3H@o7M2is8?+#9+M3f<{ASlOefOQ zPQEeqjg%g&=P5ju{hrEbH=?%F>YW`L9?$^SKq$Y7s#Y#I={jR{>X>hZz4?26_W8<% zcAl$uaxD3ViFr{J(~KCECWla38+|EQZPa0D$l&EUJvq>o?O+yKm|A70FnKF$HGY-2 zwB(Z4h-FnB%nfy=o{Lg3Qis(RRG6-`B&33--%3;h(oYAG#;E;U>WT&N z64xtA7Dm#khj=_pcOicN08$p_?Qa!gN+TvBuiC{u3JC$g<8obbN+TTSBi}*R%T!Yg z2!_p1IYCzAIOC0kBg|1F2N@)T*bkZcYK?D&auauKWDgHBElD(bbdB16Fnx*YfK*GR z?!rn=5Tv8HP#uW(8qs@RY63Lgw%XQUld7f1j^EW{!m(w? zL$ar>h1O*>Rbjd`e||JQ$-iYnRT1!2Do`@*7d4GgFL6#FUu zeQsU<07h@Z3qtiiu>SypQVQF>-DcWNQlEEKE8hY18Klu_6o(LJ(j)od`4OR)P8&pw z1gS|mNbRF*ecRIJ$eGWY4ZCj)891FFAXeqmB2T5t-Po#4Ig7&Ls65t(K6 zJg3|}P8E5Bte@67_s~u4U>0haL7b%;-FCxWl17CCU6b(#si^8&cqHXH{!yy6W=yZ{ zJcipUQ;1r6NXP{_`}?1LMFCwFry=GXZ_8L%%91*hgZF)}zqU2v_Ebex$n;)iVyXzG%!r-#oK7R5E0F?Yr!X}0YKg%S)k)9FciT+smZ#Eno`DpT#C zbcPb3meO*ioP?9{cwEkL#YcJ1HIC104C>V3mo-nf66uR{UpE#10BzDyY|$%K1<7id z!5OClKu=ne!n(-nQu}q2*l3oL@ctI6zP#=qy)T_huv?fJ<1dmcsa;A`VzIADwEZ4j&KV39cJHJh!JX7P|3n& zD~x@_{{SYw+W6kRrYr6(`jzlK9^6Z0gwzs}ae|p#{K3|7RPkBbYtF6upF;i=<-F5L zQd@aVp0unl;=KO8IywmBr@nLdd+Xz;gA%@)%Eo3VD2x%$!o6sdZgrN*r#9I*{{T51 zy}8c5%|RIz@@dzJ>Ys|bQDIPLIHsb?mR~^X^49C9IQgU!Gpvo0C2Li!T9}ss9AFjj zR;UcBCrp<-%72&}W=faT>^D?05aG^B6glK^tYq-qwk&qzids6`#6WNx$2AdJ43e4+ zY>1UOqZIk7?67%C7O!-l)jrzvJz9f@*J)f`0Ma_R&$88&525j6_T= z>oapMs3pu3BP>B%jjP#BhTjT3opICl%lk=bg5`cR$|H3%Ihyq@mmJNI>m@-hbcFzg z`bT_ck)fN$^|aWDq~`}n5Mm-#g__Aq)>~LegS@Hj8lOnNZ2Ru(O^>$}QE$!iDHH@- zuSs}Cacc}NOrrZq>J5yZk>4YY0bZBYdKs4!;V9znx#(7bhcc?J-*{=24!?2U?@za` zBS(!UpeYq9dc+45>W@opw1-jw1wbb%<687K+O>Az0uLSQYSpq-Xgd+i9n04SuIqK` zEe8GAsvR2EzNaRJnzVXTv1G)RD=1;+9qLkeUO4$`!ppQ4rnnqu!=kLW+?HcZ;TggW z?dI0Wx_3smVk+RM+b!AONy(c~rKw1&h|mdBh>8%jsJOfU27USCOxsnsiUOe%iZb0L zE$nm)Yh+?4#gZ{pZToSL51Y$Z+RDZ67L@z+#_qTmwJ{Ogs+CCkryKczwlzwX0TOiFIQSQC95xvV1q%3b3foEasbxRj&y$QGdk=kOfO1-OYL|BD*~oL| zzlqYAWd&s_bi2!Kxx$}N?6&~yfuBlv&b5tkyDdkQe(51u=L+tW1MlznYspxN#&}0? z`B%=YB=jxDl2P1zV))K73FlrcgFM9iK);172HXY2pGn|OR&k7uF^zfi)j%`+0&#Yp z?OBuyQpt~WZl2INaZ_ztWQen;d}^xk<;IEn155aIDXg{DQlJRxJdy3C-CHd~RDjpP zam#kOqIO~E_edJ}5X16y#lCABt+{o$6W~d-ABE9(CTsry5Q&PG>#JpP(1a(UT|sA% z6VgceV#{n?!AXri%5w9p7Z`CQ?%$LqQ+?c9F=<|VYA<^Eux4%d#m}|baRfoA#auN< zc`TGAz~E`MXQzcH0OK6!7SBelK;cYG#P_TBmb8L$g`e%}x**;AySVpV0#lCB?i%#T zaGq{sY=;C1Fbbs7z8wG9Xk+flVDIF38mN)~m>#yr_7A1{w(K;yR~ z+nrg3s}1Gx3i~36&PzvvE@anHq)&-j#9SVM@o`M%pH7GrXDc3NIQ!9 zr%=;4n*fh^<#=|h$JX!d?OmF+!*9~>_r)<(sS{v`nIZTj3RHStf zqm^@=3EmqULb&P@+~tL=Nrm>p z9PA?u_PKIo$y;F$ygrqoO&(H-Z3uM=#!5*_eJcl%>__d^2e)$ErA~4kR}N%@=?Y1= z`;&fboyMD=Z|)bV$*Hnqt!PSA#HLO?F0$fQg5zpAPEvYQGBrzh*(uj<8iPe;X0feMoQr-!@Z+{xW+=A^7_d0F~R91e6%HP z1_xrhvgm*@rzsKE(`fqQu(0lMQUEy}z4QE9ts!lWYtTBJc}h~clvGqfKR*8ej-ryj zx7YR2`p}f6w$POHq$jB(I8p7AM{}%BSsF55bEurS6(?Y_;v&ao3z)QaOABx|lCDPu zcpr|vXw7*!6=S?RZ?#`-9H-k)&RlyIbML!TTy|3BMxJG*Og%1|;*Zt3rpkJ|mFOzfU~2o;;%WV^5o4fG?cC@VN9~( zn?jS-)aF!4Jf7sT=do0$E`C^!P2h#^S2U2(sNcmkFUi2JszpGA6r=NUm{LjZ3(~#6 z5ui)_`un>|DcQjkdy`1jA|PIBD8K*Ef0~La!{YH0>YE{VS}=rmq+PL-5KEZySdSGA zzQe9O>ea_eP?AqR+RtUJ(ba3U&1&1I^t7DWi3t=`w))4h@B2Qci% zNf8`rNb?fvTPs0j{QXf1%7#WVG-X=c`nGrB7+)P;Xim#vWh%`i%V#pH*NOX@)va!P zxqEWNX6%Myw9HuW*)24J0P{+aKpkay>OTJfvrERhp&q(q^GBtv9>754feh6n`qIz= zY6Kh%0tm)^we+AW+)msbk$b}>8*V8U#B}cRpJ>%9(&_0*>0GBCe6=hoN+cjQ-ynK( zfvsvye@IKciuN8zAbhEiI=>&OCJRAsba9_kp;CCfyC6x;BopP?(xz z=j>)`Qfcri(&O|Y=9zhHCD)J&gKfxDYAq#15}tV&Choy)Wp=>Vg4VAXedwZl=4BAC-Eu^m>I>oa2dw<^ofn zTt^S;D3Qt!vHged`UVUYjOK7VUlAUa?UNOmEIC!CBs5X=lcBfS3eWD$q;e8_sD7`0 z+SzNPBEB0?wBUb$`HJXM-%O6F41~Vylo2K=AfjV<ceMH! za8l`SMrKVuM4yFlbfh8Y2SyG`2q%Iutn8AiDq3o>(CF?N^H%F`w+lv`o9idJ^N z3rQ{@^?R4oyPIiE-|g^bCg0Ac+tFcKQ7V_cVk?fuq0^+a+MJf~=}Hoyo}{NK7*e}? zoqSj?abmKQSdwuN(K(Q}trjC_uZEBSKqSC`R4Sw3r3<#|_gxcvBixZ8w571zD3jEw zPLwHau+hSYTb+}w0k+i3vuPaVS+{1Y##m3%p=Q^3TD`AzTn}7zIlE&{x1+Tw=~oj{ z(1%juiU2~Af}cqow31>P^S=ab`^*1IcRpRXzdDpd3arwZteYBaBV%%qHbLp z(oz>%6q4wu(L&YGm)6^<3R6Vzv5vrzop0S+T~5JDmB6(2ELG`)^3xo@OTvxs!1k%u?3?Evb@jF+%yGD{lM?BtkQ#9D@c|&7g?~-Q2j5fSGKa4i@{qelg}`$KGC9(l&_cdmQhBfL4#6>>qLZngDKgI8OQ z%%&TChZ<{zEx6%9N$Lm-JtSoF$fyf2A2Y|H-McC8Mr^oz4wnMi5RIoWQlOIh<0lhW6(1S{<)jWb0G zVSTNAJy|K)l!dGVe-tFGp8cJwa{^3Y%t=X`>^M8$)d&zM`Dt zsafglHRYD?r9|RmKs;Bqt#7NoZ!tbEXTl_O0T(ks4*T zklGsQWj|P!+~ANn^Pl^;;X3*Qa?z^tOr3O*}~M!;t61uZYHdnH_5%7g&6CC@+*o2lbVc_J_-`*Rr$pfVMPf z?{fBrlNCKJAjy#_T|+-^LeFwfvOkw!B&>Lg^~et4^7$9&P$AbA;ZI5ElP?^T?96fe z`k5&a0C)%Aiv9~uf*TDkKcp1Lj)W|%!Ia95tEdNfLPgzn{{waEUn} zllnV9+0@N@)#dS=npV>6#@aLC!t0k>+AHeps$Ef9sis@BntKzXy3}T=*(32#_x%pQgz)gOcNwmC6(r3*OYjSO)G8}15 zH5tcQjUHlLEhHaVN|v6Xjxs)a%e8bI^G(1=nD2%0a@Av6;0W)ZD!nwg?p3ZI1hbli zYE*<<6(5O^rhMj-rzp%N330*{5LM1O=eC0y^G&rIp^@S$_-0$#=1D7mDKO}}*}9b4 zWihA}_*XSS3^5v>g)-ZIaUl(mKz^dUp&$lDQgTxcUm{$a( zW}K78F~QEQLf0L?j|%-rK?kNfa-Vfmfc`xF+Vn38BY)$?`WigtqykCD_a1xvyWnal zUGwP|@Rr&j{ZkkR-UFZ6*P+YOB7*dwx3l$;&fb+e3J9;tKxUQX-*s8hb)b9zY141!pR2C+w(> zar?#lAHQ1lGEu!_f%!Ol7jgOT3#Dw@mj%;Si*4DoDVLw;0=}XICd;zIkdmczq(A)Y5;KWSw%S#gUmpBeAw}to`kt2eF8kvw_&_z~J1<^|VWYgiGD) zKB-FH{m7+4qOGL3^R-y8V4*ICDewJzWF@ai2ttQY94Gc^rEuEmRHhsV%mLv*7qtgd zI9<4uFQF)=FdfpQxH0ksobpDAo9tCBv`f2|fxjmsYef!mbA=mrmJ%_KPnjTt{CZSh z6?i2?6@;UMgX)nR{5aO#-rQB#IjZa7 z(Pn>O@})<$Pi^+%!-Z#D@}lkD+gVifRcmy{zb&-m2nyhw0mvYl z^QTgmUAsC)B2jG}6&a5?E>D`=3`< zFqNkuoQ(6J%S8v%bUZ;u_FCQ0Nq^T0QR3{=*?h0)AQ`v~b3XC_`=Mo4*Zl!7< z0DC1l*4>n6D^9$`D?_~(B-?v%b{@5D$PG`UZSA#Fro7^O#$8$@N|MlZwR%*Zybu&I zof};gg-T8i-bx*{OLO7#l*6nG)`{YF$*4ho4Ol%#W?y-KV|aSuas0*UK=NI*Vv6Wf8`jR)JQ)%8=VQgFlo>hTep zBd}CsZ0w~`rX-2?(~>hzs4n-PzS~(vp;a2Z-P`+aolH$t4Zx{fOj3%RlPtC}0dy@s zp5zXF@FQ!oIh5O2<_UDhU>*pX&1-Ak>O&#`%_Zy?3t?Yq4}ZrOcRbXrz~6K{s*>H44DcylT9s5Rvr4N-b~lyk zr%GuBZnF6x1YiS{D<>mQ22_DMLR(v`QcKt-bsLEEqFd7133?@6A{_QyQ&QM?bgMWA zAuGY@Az2#SWp=tCgW*GuuvDh$XfdeEPnAR}QEAfH_*GA7al(RPKh`|PRzW^m$8v+) zKHO`}KyOxdQ&F9KCU=O)^X*)(DN=411Gn{c)Q^de^UDFi6guwdK#}qWJRi-Cbsuff}b2 zexFZJ%2c1%P*1uKxc1lCSuz8oshdx+cay@cSA^}OxAzlxAX9E67VP_Bxz}B0GI;oi zuwyo}A3R_wZloW(Jm`C9?e4PBntsTb2ZZliS6x3#CQu z8+~k2DCwBEOo~e1bVfs~YCoRgc|B@UPzs3BhVi`X(UM$Db4+U$+ez@)K+US~cTjHY zs#hPV&@NW#bh(uj(&tm0R5RP932iT+j*_e=lY#p+qf2Zn)fh%my;)jzVvQcL&Px0C z?ul;JE(bQ6{@I#E5sk$7id<^67;nUr0%=34jHUyMSP9Mn`Hpk#t2;IQX=8!JU~b&1 zt=BaSGSQm;Zf(K3cG}n2`x|R6C#+;alB;&-Z|E@cBvlxwA(v+PuElfWQl`lv4HX}3 z1EShgy-;6Lrg=!uOteC;swugxXvmW}DzV~bvq-IPhUC_5>T|TJd}+~QM?{FmBFmmy z5d4u9Ko-l31warFIU_nKxr3WQq1m4O>Z;v@)POQFPU(Px^B}bqK1?MT?!J<#k{wu5 zn{SSCk;hldx$UcfVOG+tUz@Xy0N#E@=xvlVhTClc31|mWhd#*X_jw(^zNcA5P#3Ow zCQkga@((#*LggkhK_OBkKg(>WkQ$x9a2|5MSZYHKlaGq6 zx&d*;{g}xklCIz=e-^&Wqa_~ZxNu*vgnBSNgoz3Jqu6yl4N?c2V8j3+mx)S*vUoNDdZ@XU@WoBcXbj9^PMD3wk)%s;$ zZ0hsu`bEXLE3=z}M!)0Co*~mFF-lXB;?!wOnN)>unltKmWeJ@97~gCyD7+Poa~4GCC1kw0Zu7O^EpWzDCh3eJ+!1}rbtjZ;N^?z zRm9nE9ecC0Hl#};JZpaMw&@5{bcX82QY1h@B!+f`VwA{wJkv?#{--JqFX%% z(O_eAXn?7z)N|ZPoX-ZR;*4-PR8R@_mhky=*y}R+7`gmbuR7TsB`S}|?j}3fdmb^b zLh=tkh}G>&jF7H{v7G+2=K)FY#zv%ZUnCxX5HIBP7Q)u^jIy#3@eIpT$!TiONpTz; zAD+Dn(K7%E;93DAkzd2?E_(g~q7uzzvIJQ<0l5f2WeQhre^p(=F(`(wH>iJ7$O zH-pF07tImoytgQ|v@MpJSq->H*2Hw4ah~ZUdXxJ{I><)wvQ=T8mY%!D=MPT;z2!=$ zt#nGmeN^?3;v7P{ytDeU7(8VpcTRcxju#i!tGg1ISAT9n9mjBf{a`M|s@kQ7yK~FR(ykYUozUBhCN;xp+{>t1kT1Hl2NihI zBqB7*b4>LG(d zW{5%NBO$nmotDZAg`l3W9qPwX!gHRS5zo(6q^+qcYVPXY(rmM~-%4iGNJ;ot8cFhs zSLOt^ymfc`@O6Z+V#Klvga|{Vu)~W=6hX-YsPG8w+Zy^VmF)3T>pJqR?L~H*dRjA4 z4(NbFqPnCZD;^v2MSAy}LepDXcU8$sPmDJ+m zU9@_vi;4GYe?ikDNsejJrl;Z=BhF3>cwb04&mD%C7e%$zsX+%Ur0+pDojeYJQ*->B z{eMH$^1h^tewB{i<fzw#_lwq@?C=UW>`l46s%|#dg(tnzYDkJ$r71OX) z9{F6R5>Lo{Lj<4V)s4<3($5c(RbPfI&hU9sG`BWx{=C<0y8?+OJqGKjCY=th`)c@4 zFcku|kV?8iK>(ECk$`ifi*@Zv%)(u(cW**BW!U=e0w5jg5#j<3cEpoM**k(%CAVe# zRJ6Ghtd+l0@|3?ZO28c`Z6G9Z&U^M-+V3H4d8z~i!?V~$m7$0X+(t@4DN4s=`cg1^ zkDj$jS>Yb;?+$k*pR+dR_Ef7>_HE0n;Zq6#3RK0JAw@YIAs_^xsPcHn&sZr|4tZeJ zeK~{)RrW9oQdS;9fFP&P25@t&h4B)j)ti1q%7R>`Hssglx)bn-%A8u(cnyx{KP_(A z4r^MtfUXwzQ6){d_Fk0&6Z311?QNqPBnDDledRe7Y7HR?Pgh=5!1w%gZFJNPVeKet z(&8Kjp+xDGOZ#nWl{#|{)~tJt<~{TR03e|(N)?B zrVL02#EI9|>D)VqMQYZ!WHW2nkWj&mVnqoMk|P7_e61;4vJ|3Jw@J#0>;M35*{;S? zIL>bOMN--?7tRtPo1=F$28%5eqU4yZsZ_PA$dMjM>MRrXnS2wHllrRuajOQiijQwe zk=Ia0{$tL%N@!D3-1tcNsuaQ+b+>(9N|ZmL-Wlvq*;n)HCb=C}A7|BeP8uFO$Dw*q z9ih72T9&0Mp7P2PqH4JkjgTe}YJ_g4?^L%2 z_kn-gDwAh5L#0BbTdRRJ)lH2G1AbFw*=h3Br&I~+AOX%hceT6jmeQlpzpW-rjHIE< zeeU;H#>s4D%|c~vX7AUTevMJw`<|yBsE>zS2~{bM$CBHsOKNSxTqwcn9+G((<5;TQ zHhLyQ23gE-S=)NntT5s^kTuUWaQ2hI4MKqekv{XkZcAdXS4)%T)98}?h_6LUm}P~Q zm()~x!j5s$IPavE(%*F|RUizvN_AZqV_8g2yZezte*8M@yn6y|Yv{|KsV<7ci-iHo z^!K6%(%OJqY(BS>*0M%^e|D;F%l@sJpddjeIIYV~*xHOTbP}i^fyOCo->8wQ^!5wT zY1JgDxoxG?Hl!o~aK4}vm3CLR-JV+ePi`-=j3+Y_9f&6CpgL1Irf*xWpp`H>}PoN&44meu2*HxN0j>1tAo_nUx(e;PRwqVChL_=RbGiPGU)ZlY2j~ErbcNmd3hier=Tey_r^W-d3{}G+ef1Y z2r@WIsJiXq%=}K%3?B=Mxt3=3cw*ZKwX1%}-0RAh277P1h!5N4;M8}Pr;81#KW_?G z1musNmo}Y|wLd2`cZ79k+Dbv8%|0Wl2JC-|Sv2eRqf)%@2k7=w&C6}4Ayb3zxY+f z8FFi(88RM;!>8|Nmo*_oc=o3p|UodLl}X)%KCoL(RM)Qy_T9)xmI4z z)b}rA?`rMQGJ_SWO=8@3F@p>}AWcP9DKE9<$aTP;uA!6xoSkQ^!$Hn#93UL$$i4(V z96{uk$BCN#LgL=-+o;v3u3Ob5SJ+|L4!DzYW&vkST zGr{0%&X>x(b0B>n@u>?2pY&LIJ1A9hd&)yI99b$#v-O^jvN}g&&*80xyoIFvSn#{p zv}QMQUkhGLbTZUb{95HHT^&S%`A&MBb0>r(_8$8B>B7kAaV6PDi+~*0;Bl~m>ZGa0 zmcE$}qakt^{*5#5)5kjWRRw#5%tv6{2NJ!WV~ARo=|p$qAS41lrW0qd`__GjePj*= zeBlQnm_6=3h5RAF=xZ&grD`gV8At0MU%S!|?|&V5=YYK}k2%~q4r}{cjioO*sU2up z^5n`u8FfRSA~@&M?UAS+3h*@P9fOCyE6%5ai)s!fMFB!Ab%Y^?y^D)E^&Nc!!Fhxn z^6er?Jck86r0(A6P|a{sZ|i~}xnQ?Vswp*8ui~Pzk1ez)tEi5YdO;XaPZ`Fr)VpZZ zAi1JOnJvcKDl`xdzV*rkRVbBos!ut<64^h@HNLd^yW`@ye@QZN(p4!rJOLq-!2O3h z^FA)CyRvu%4LDpRpwv^tPpYllrRn>~-|h z3+=BI#x`ctsNi_|LiwUeL#?WdTI+3w)}YJeePl;7>dzS{C+!c~KK}q8mSJV7OoP%> z*Ld9F>EKtPN9gxlqE}L-(^vJay51J1N{6N959=iRk8$^nYdB)fWM{4pl9swglgO@H z&C8%jL!riZ+{$x~8etAIJ~IQ&!h9cWeoZZL}N;6d<%^Y27$kB)@zcF{_vsH&SP z^r0cCq6BM2BPmym}-f@P%P;xv+&vK4$4PvDmaQ7nIc&2S3 z7p-z?3rY2d+?MJTqDUu>kTLSm9k#?=!2U>v$!L=ZN|%zCJhcT7v5-a&IpAYMyVaRq zz?ahJ^fTV0ob>Q>?XQv-tJd_g*&kNC=LDPrKaXEHSA@!zTJ$k@-1e=p5@3ra=c_}d zG~>u6rj;$!G8U{8oEI~XyYJRYO%5==TwqF_`v)RUCtbCITP%VcdfVFOr{4SCvKQw#JmS4iA7>$+R@+oH8HyEa?(P@EPV1DPE51)Qcl~>{Q z_jaEuH`(u?4+3VIr&p`ZMHm0mf0~La2l+;nQ?P3xMLDX)9Di15^Y?M9JCseKz8@l{ z+7Gy{@Oe`0+wI1Mb0(*DQxy{5xTti>RT6CyrCBiO?bG3(F;zBO=}U=2URMn?N{ZA; zCxNZ&+QQ~YIfEu+KEeTOhkw(1yG_!Z7s@$H_B2}a>)l6`K12< zXJ25fcvtsly5cVjXW|mBmMYN~o<;&(N$0m5YktHtT2`lIucW=lw(LFdw`bMh)f{r* z+1qM^O{r1V%X4WGr&HPKmkrnQgfFExRR()bxcyQSh4qM@->(OtL){>Jsb4gcymzNeN9y0 zUTGptB2n@lY2nx9l5kjf5&r-QSM%#6%Co6Uq{!sqm?M8N=UsIc=_oQ|=A%HIJhvHi zWFVZMDbPK}eJc0wsjfw9&q#2boIY|q>*sJiLXj4uN_WquNm&gzuUD6xbujq-xF0dB zZgA1dBnqIh`uy_?=#3UTb&5qopY<`S5`qkDl395LDp*3j)6XBluZC4R74Y|*4r{do zULjil01X>YZtmQBqK$CKs!`WXW=!a{_7d086vET)DQc>%#V4V)gyAJ8=c?P<^?i|{ z%>c>Me}QGO-A%RBaB(6U-1lj{d$;#!sQWOBLYGRFQMjs=Xsf76xr$pw0&-jlC~B3^ zrxc*xPg2xIaxgXR(|Wqv99#eccK-kh!Ft_ovKEGtXF2pM-{Ib$SfuRzfZaywnQ=E# zx8AEXWuZP~cVN>7{1ix>a`r5pi)fuvs5G&a=m+@PN-cqcpgRb_>sA% z&~{ehszz;>YET+4G9LlPJj|z{I)Q>xbMw&UnwLphn@;xyZ)vH~(R;WxD9w_!s29b> zI^DUewR=|PuR(Pb2~=~J@oohf!hqgX{aHUJ}jC2+b{It07?nt1A(iny7{JD0jAyA#%jLXV5k9b zam#Y+Z6}8Nmf^E@Qo4^3leYT#xrJf47qQWOxue1cR68O}XgFRgr0 zYs*bA;gpm<+HN3qy8@nDcE0c3J56`(-7CfWHJhf`weDone5O6CHL#GUG&awBtpTAub@}kVqgOeOw#b&c{QZ0UXt9Zu+lb zA*V1SE@ZBSXTy&4OJTCDthrf~+3RXTV7L~7JNpcexa;lr)s@5OjqhGrZu>br5evLw}I zOtCJBGG)(Y#mJFQl(oE|4_eC9f>qBXldqwA&}e|+mo=~II)s8j(636i+i_C&HVwh* ztEELkohPM913g3P`2*+MSgKz1ec10`BEwQN_L1RV)IGJ_SDc6CSQiV0x`WO*kxh~c zTRoJ1uePza`JxZ99qK;ssAn%~0{WrtX6Le+YTVn~jR|DTTC+`&gp3>#e6xUY#>KV&iJ|*dow_B3aH1^!EZYE1`WRew4kP1qQuodVWpKqSNKF+AmvK{Nn zmu*5xk8Ix(@w*EBWw@>`$FH=wbd@cxs%(rl@|DL0v+6nR-(O<-rS6A#Sf602oP(Rh z^9%8IW!}gk>n^gk>9A2KvbYiec2lGhR(!rst2o!#zUgU*cZHACH8>F_Cxchw?JJ$L zB@!*F;(A#_v)@b?i;pQ_6vkuf_yaui+g^+2nbpI*FFi$2MqBa`kmh)=Pv+Ig+l-~l zdUGInTE_*2O#Co4v5_3+2{V3CPC&E5+`}H+m2jeg7%cCo=Gb3<6(jvjh`!m+&rkxPv(@15j2Ey;q!EKE5DWcphj*U%?4zh&MyuzdslneE zFJVMgvLr`aL4>F$;^GGoSYAg#aSA_V{PC=Ps~F;4xi}I$3o`36_D#Len(<(@Jb(t-$b3w(25)|^f z$4)v<2Lm6DwazSYxowazD!Tg*z3K$0m2~s?eD$5VEktVA8cm@yb8VQrl|2;8K?TR& zn&XZ#8GoT)4no`Y0$d5?9y{wB-eOy-%}KfDuM|%YyHj>wR~6$&lTf^N{^Y1NZ^0A^ zATCzK6y5znqbZ}xv9sH2Z>tJR+T(>HJac%8)ZtD}N zRa$jMJv9=hGfJpVh~!jHVV4L)$V-VC>PZT~`RMw|Xcbr-2=%74?3skAD9Ee!Yc_&QMwP zdc``T=S!vstd`zJN2DGPQ0MqHV`7X@wCm`uSBNFI9{02$zrr2c%RdqjvJ}$(hKxsS z6z4e_Il9~Ham=9`YfdafcH|&jIdNqnwWG_aAw6ukpGsySIOGs;9Rv7vc)`I{dZ0LR z-^=7*QETZD@$mZ7IjpK&WT&LK2X|Wo7;q8lNF4VZ>pNOlSIDW+^-gU%9v>p?M0Pxs zI{RHty6a?1j?#(@mWKsRk%E^JJLA9Ot){%h6{T912#*0dfPD-5nMsV?Z>8<=@v$Ck zCQMfkQe9{a6d!)1X-$zB_9RwK2hc*FMj%D?hXsj?i2CZ*tIg zQrft#V{lGo*o;u87%1|iy84{>jJOc9)TEFUg?`R;scXCI)pK1$v_#G!E9%Q_qe!{6 zac74^$#XY)`rB)on`BTn($cP3v^z>XmfdQxQC#G{xhqP-+Ha{yY~UP}fu1?F9sLG=^N<|h6R2W5SmzXY3icvA`m#)&G#`v0qq8meNQBP0{ zN{&bboFymN=Tx_SK+9D!cM?^d;ZGHv;BN^`Sr=pWCBaCz8@1PR)v0v%+>aG6EwdI$ zDG7bR+EhqK?|A1QwYz;ewW&4I64z&#>Q8te>a8~5c&6O@riU)=tL+`zZ&hn7w3S!k zRH_hY>QhNb3;1M5N)HJc`p$jy1ybx|+(~dK)wY*3KnvRc0FG_IxU9NH-&A&uxshX9 z>bKEQD|A#A(pxxrrKyT0!Za0SD1thL%q9EzCi*NZ#m(Aw?4rZuwl z%YwnNXjNKecIb@|xhzYR^Nuq*ojA0lv>6UzX;I|+j13ysxmx$mF(ilu4)pLe+*jEb zbGC8+01neA7VU+(R-9_{$(e9hW5tftONOkZsJbQ83W;($a7s~tlB{HBTQqDnMR4ai zhBOnWfmd4UwY0Da&tCp3kH1@iwDnz+wJi<2w08=`q*0?Oba+)5ti+>KpHm@HCQN)d zwMuuOkb}rcJY!qeU6!jY1@#MEJHe7Ua$0uk%;>{gAV}RC^;16)Td%pBdu;exqFC3} zX4QjI+h%0UVw)*!q2~~k1Sx$u6ODq*m$zl#d$ z=_7;Glfl&$;d5Eq32O#Q?!kE0bHH=8D#ldzS9;@9?%9;z5qET%7WIikxu7=US^?=b z1@uiS>S&OLIlw%hz-e7t+{qv?YM3Z--L`x1WCHiyjF%@P? zYHcBEeQc?ou9dAtEspsb(5q<&K(@t)3gk@OZTyP5`>gn!tEw$7_@Y{DsrqXqqMuo9 zwVBR?7~q1k0yEXY)+1bSUW+36sn_=Z0KZqH(7+MT&;}#-+Fm z2P$-&1m`2?^7%D~1@EaB(?`DiL{(q1nRCRf*bBMttA^g3r{l$FL~e`b7E(x!g5$xw zjCSe(l6cpxst)BHV>_2#+`qg@Rif?tuXvbh6L*_e0_QGDAOR6nbuYBUQZYQTy*qmQr-Rqyf|$u0Sn zj9Hi6H+4KsTeQ3KMMrk1^{4IYGK+D-ctxhRgh{Hohceh;sl+yvt38O|oqV{3;Iobj zO?YlkiE3oc)QN9j6bZu2O{)Ay#CQvi#Cq?c_mriyJirz~@5i>h4u$e;Ctc`eI2F$oOUjG32soVM`!E@Iu zR+P$huX}!HxKTogqE+Q}d7z}@l0f&zI={H7Q?ynT-#PFqlKE{)6pH|-Kv=)p219sI z@vX+)mxHu%J&*ZTsl2So# zn$Ls%?XFI=EiJmIN~$6QlO9aVZBZKxbtMW=an=x=%bE*D^8=0>`wN=jVfykL1*aj$#Ns zhljl@+J&q*melGbt@g?z$X5-_XCJvc+Y27Y*z4~&UoLJ^GJ}}j)5LOKhhxW)8K~~M zrsAc~ExSvhSbrHk85|$r_tr8NRy?%G*LWH@d!f&Y`D8HVO~t^Pksje>VYe5; zWuy)erFQGaI#25kHLCL&thC+Hj7-gk>Us8Y8<)Dxy{gt#$w96_oT`0h)t=PqY_+7Q zF#9ec!pqH)I@nr}0?>aEs;k1v+RcNZ3eu5vCv=pz>NhxgRilf)_h#_;gxES&R)Y@E zp-}G{I-t?14!mQ0OZ7J7IVny&;=I7Mtz9Fs0m5d9(6^w z8Er&Nb;jC{9keg5N}N#`KuA32+uu6)!#M>VQ+k$K6)M%SE@d!IsX&Go8Op6TG?$_W zi!SvRok|WmhfXq5NIu+Yle5+^+Ff8Ijo}AhR>^R}a+Go1P4K%n-nk0DaW>ot6u63u zNu|bG+-55QSSnK7B(2qSjQq zl}v-dIl%aKG0*YoZ+)4r?$hN)*9XuCVDctQs+DxS)KP!`)qk3bCA;}d($cnu$u6j& z0_$igX-`s;g+_cRr9R{iMy~dLdVIaf^C}&qBcRXSH_oY@hbwNZ%fgn$CcuGl+i{_$ zMZI=XT6UoHg}&0!DXPnfXr;H7NKiolG&m<;H{VZMnd=Z|Ht4ckri~|n1c=D$m7eKV zS9V{wMc+qBOgjBWRItEGP*4==ic`{&fO>J;Lo`7G3L|-wAwc8JeeAUJWhzcmtdGMQ z%D!b=P0rtIdvG>8Yc`e*yCR7{Z=<%3bDJ?B!9YsAr z@&_Nwt@{>6R;8!drU>5MQEQvkxQn>Ft;nqHwS#WXq}mc>w@gKKe?&nDLyr=iH5IjW zDG2o|fDe5aGS=qM7&4a-PXs+ukj2(f&BEK-MN--R)yq}`bUm`H&WlbIr<`#W3wE%! z`dyCeZ=@(PWH#tzge;;Y>FGZ~r)1-iRHx|Ow* zqH}5ecE@1qa56pr038wrg;_?>Bi{XK^e>56n1?FV->aN}U6UQGr>h@n_JHi5PpKpE z1HQ16hp}w57WGbJccaj|RGPB<)k=-hWXL1pBd4S{B_w*CMsO17@5kEwb(yY(rE9VX zgQnxdmuHcCrTrM|&OZ@oFshIyd_q7yD{+SUlh%TGP(Jv`*V~CYt!h}BAnF|0@Sh_1 zDWz>OX^;<6Seo%U2R%tg^NnG&J|%3_GF~~fD}`!Wn<-%J?}z%X;279Hmhy2twygG9$atj-Zs41iGR?D)t)Je$m;U(Wra+$Df?A$*63E@brnj?7Fd$eenf{K3i92P9H*tHKFB1Kjs}w3 zMR#JXU5X^8<=1WXup>Z?+xfm$Wd-VWBD1yk*@Ci}^jd_PLvYxgJ(kOeZN(}}ic2V1 z^$w6!GDb&zOP^;QXsQbg#~hd4<9)J)Gtv+xQ9lc}4&TJz25bAZ9yJvevQ`$zOL1FD z)D!At`Vx<_6_fY;^lyJ%PoqVx8V(3*;=CDXdz{lbrV+YT9iNdURIfCJE7HEoB;!|?Z3haCiPS3FZBQCVYVT|6hg2G><)=-R4R0&!S+Kw8X?v=hURx1xTyUKHvC%N z9%}a;*0%2IW$8z5m1^5bL@2i1r$g#NVxv+?OKC42pfEB|bsToGV5Ius2@xcmt)?9 ztN5_0yX~_~4o&i??&J7jx_0wo?d|KXTy&S9TuFpmrbP1;>QhipTPpJpq>z)90o&)T z+cwfRwR2~KB6Ho6(yMU3n*~|O##{4Ljo1|m(k4@>%_-;0C0R-oq1i+NKp+)#kdS+w zXkVA5J2N5YHv<7%T^0vbcyQ6DHE8c!gKsJyp2ps@t~E7Q+v-ggkLEcqsdXsJ22vhL z1aL9Z52Rq@Bh(1-*6I+&J>aD?A+;%zdR9t&!g(h>weAwV>4YLS-CvtQ4gIH8 zewAE)9Wvs%sx>xL`E4x;D09e2QDBhE#a+%wKKk|-ogj>ta)-HFF6Ap~qE;zY#+OL9 z?-=j1@!f2+W<27cLMbi!P?X~e$tu9-oNL%qrO#dJDQ(tvDinKOHAQv#%WrGz49Y2x z+Xd?5s!3uinNOiD0D5tfql1rQ^9$2Z9{&Imm&&_#Im%6POl4N&N~mn~YFTnh<8{lc zC0Hs_ItN3Ij1ZB@86Mf!geV`J^Ix|e<+SplZsd4%8q2I!cJ|aT-~Am9KU9X{^PcDl z7*lB@>cPfypP2Nucpd=@`P@5$W9n<&2{3L-%x9}L3n4Vt3rxIQ>F5w(>lo zfC%r;5y5&N=Rz zD$RC~Rb}SGR+(=lSm`y^-HRGC%Ti?_86ft4+8>9v)6)~^DIK!WibSI!CaErPz{9?@~$(3?W=pL$7yRS2yp7~JXXD;r8xwVuBzzT7w*&DRY&1i zmn{OdRb`Unt!FZ9Do|*X(~>#uolshAwW()N5j;U2Rkup3U+hRdg)7bW-W|L< zscmhAel*7_lzqvrzcosXU1~Zf$3t*=FA7cSyvf3F|zeGKd z+`i5I-c7%;Q1!;*g(8n!u`1SNXpkFq^}9Ld(x|F*6b_t(s18!T1QlrUX(xy`6h%PH0Y8E>EDfdsOKaRRNfRPDDPP2%?R1us9 zaNNI^)P<@OEfpm)7*wbZbLO$p)Kt=s8BS1thw;~o($XZI#vC^u2e&oka)}CUD`=)Q zRx8pRX*?w_G8grYZ)p7SxInZFE)iG zDJlo`uunbv9bzl(^zes)?O={ZC3>HT>#!Izh)iPhtU{VeC50hnA*a8jQ5+v_YrHSE z)dA!;SOv}FBT>yw_TOo1+s#*~KyBF8>o&UymvLOxMR_#H5J~CtWjnz0KX?Z#{h8Gj z<7{o6vh7ZTc~*8BCVHO4_`XFm+q*8{+aDFXWwv)}SerhBdeIdQV+-nS#vgf!5#C{V z8Ew{mEZ=c;Q>t(9!oDe_l)-ZR}wq*Er`)o+G-r=+Q3 zO4hWbjPZp6e;o{7c9zqm8>u6?TiEGhGopt_Ys-{{Eh|#GdQ;Pnm?Js%(231l0|=K` z+KZZtX2HJdR2i`Cx{_O5Im=Q@ZuzTH5;!>kl$?C^jK4Sw>jBjX-EE?Bo}_{I>qZIR`o^rUn2;^+j$O&tlOh zL z^_eY9b+*>F*2CyNrLf~_Nl%y#7CRB`qPtz*%H3i!^C62Jx}_%JZjytSWve#IiEPfB zCAkpp>RM{h{H&FwmA>>~hf|If)X6+?f;6|b*~KcQqj5}I4Wp)}9(RQRb>`e(T2kk+ z&q3!My|t>giuzk|uz;^oC+;}|whtQhdKXFAF`q+hl`U!+835xSc_WQ@y?|75hjY?s zHw1c*lBp=BJg15qP(fKrR02{+Jmp%jvbQy%Uqxs9K~0dyh-%$ZoTCn*N`-DN3xy#E z%wmxNT`rCRS5O|<_U)s4qL?(G^FwyrjEz2dsTS;SuHo;64wDwQB0Drn8C#O=+H(Rc zQYN^iE$PpsDP2+ul%fw|lYz<2z2A3Jpi7&n-c>EK@N|YdA-Iht2q8~yqY5Z&c0mG;VUa#8P#^3@xC(Ly^l20@tLZ|9!U?OscfeqA;$?QbpR97k`71kYvckK z+iDiO0nSEUoEK}P3Y_N>6ic*KysY!o;+R)6cd}MGcYN z+oaYD&-GMesnX$0X>IvoSOq0X_W1%=wpF20rXkfNiH_uV(6Xojr!fTPi#2$btq*E^ zNz2%(x}SwA{G`(AGwIS?koy#(QmII8M^SN287o-o$?8wJ9P3T*eMd31@&Tp>gM2Tx zGouc5ElY%+NQp|f?8&=D9yLY!T)Tp&RB2NpO(DRj%_pq^A=N289Gv@-InXue=d^Vu zXL3Bd3n#A;3)w`ncFL_}-IQy2`(B@ONR)>NhU*Qu5D)`oC4~hmB%VK;T2@f^iG1t6 zR%>ZvPg6+Tt5rIWGA7P=s<-YstJPa}%#}c!K$Ri)BqB9tV~RtuqdK*(g4jtZNxI3GW|jTvoit<)OaJLh)=L9rHK>TYq|Fa8z`drbGY!pf z8gv#I>T*Pf*U+CZhJopAC#g!uVUwlz+4W*T5!@31*ct&oa)?{W;M-vK^KNb`eI=UO z<-&t%|?PFMJsNKzL*Snj9lf#M%?bn5krMfoz zYJ|!S=BuA_EXtMA_4f`>O%j6qK_P8NlG#WJN`eT+dFSVy8`Qq4GNBz(1AvIkq0?pr zZ_!AseV^HV!P}=Ar&q69WLh|+Q(n6&kD?tCwNRXJ>{G6>8yf*_x_5^(QVE)kw6$w2U_V zR>@mRbty?o1~5)Y*2U3#KCN6YfKGWf30n7!h%f>PFh-_SJI14sjoIPmkv5`>eWteJ zgvzJNX~!bA)XX8(5ZY9u(2x~@o;CAv+j<7oc+aftmd&oq(!G?RrB->WP znc|7-#>9^zI#`Pu6z7|P@e4`{;=?6jK`B;8NbSJ;$Lnp8bIXM`f^{QQMBSTi5YkKy z(xZ>is8)5|T(j-#tyfhp-|`ucQF4^3W9lv`_Y{|dh(g>@{rMOJ0Cv!|<9R;T>~2mCuvA`>f&)nk%dYhfr5+MTasEG1Mf@s32~by3Qqpqy z2PXru;P=}2-Hn#eR>um)3vGexMqVfv#7Zd_l!EFAwPDoifBRY%ed}Uc_ zwJkx{N|aU90s=tx3dg>p^e<~^E;f_aQcu`z2?@e|@NwHweJ|xM4ul~IWIBRUkdy#Y zlivpz175F{^e~j6wJEZOz7(lAErLK%Bcu`AIXrg8yd^`D`Wbnc{{W&0=mD^?%SkD0 zD1~&K1mF|f*lWp!?@9CD+o=p=(l5meQ|L9DKO<(LKq0 z8zIE2FAKO@8yu0V`%1SO7T?uxc@+9@(6qF)T_~KDIH4mw9U}mL9(2yScDjwB!kiFK zat60-%c%O{IY`{JX<=D5wfnFeZ);vOIJN2wn`)5b@TE7F6kCkSljuJq+e&L)cQVlD zvm=PX@RY!!-k=A7@-BM(CU|sp;OW|mAX-owN`pA`XE@-FGIgD|<)ykjtZuPWA_xnI zV9<7NZ+GIUw>B=@Gj3f?+K8;bT8fm0mkrqguZBLNto0--wm8;HWot!xBCS^v+(ZdG z;bNf5be>qi0f{gbHr=hFv*us%ucXoyP`fUx&gYJ|U422O{*Ft345T9oPEb%l1oBBa z*O!&HtxF$3-2fRao377Jout+}ls4Xtl@N2-vc8qGBR5v^pk)`$a4I;MR7V2Fnr4X>%2fb@{z}w=B}Mva(0S-=4@q`OS@X# zYxaKU!?}@h`7E}oTqmZwTZp&N%Suy=j^k)85<)z_F~HCx?3IHaTrhy$IHH<$8z8qi zI;DMk$Z1r?4=|{v`MH+7a7J8>g=dcX9lVJob}MT(iWrAsrazcf<~T}$Xnn4ej+51@ z)v$?IHv3-}Zrjl|o~o#Snzr+eE)Z@wL*XqI6eVsCv;kLqXIMoL9gB+E=?P>6B#0XG z0u}-iPC>`;4P^m*2Ers*SM675tLnO~S0ley@{D{sfa6|Uqt=`fJ+d{4?8lMOWv5dH zYToR(h{^kfc*M6i0h%oaZBn%TX5G2nL&|E8R+$+QTXo33U~SSoq=r=C0kVEtF1hS6 zM7f}t)Nu%6_N)y+G$lqi_OZ5=8nqf7oRKc>pr&m;>8mjSQ=?Ci%Yg`U$q&2~=TcNw z;8qo!=+f$CR2rOEv^%u< zQKrxR#~u$NVLGW-i_JwB|JQ$-iY24@Oyf(a?e5mmsqC3E>eq2%Ga~@F>Y==pC#ggM zlCOPVZ25|$@M-ddIke3#q8c~6c?w(Of;DAt+Cyh)b^{s--n8!fgjFH9vy9}>asDA)P6ZxQke)|Bvs%%JD4srlcDBe^8ds35M(#U?1bS?i;Y*h3JxU)|dJ?A&aoZsn&bMr2 z%F?yO>8e)bq1PeAN72!egp@WE;+#^OAqYq$fKOmf ziKt#8%}f%holg-cJ9k-k9@yTsOH!uePgdye1h*lq{4G*4l7|~pYgRMVg#wa!2hwmx zi) zThxDm?(FPeIw~ehbhxs*Uy|IWor64a=Cl+7f{4KiPH>^GqU}oiZ2>ND$U&C#+_}pE z5Uc6$nyYvN=jXhm*nPuTiOe2LalXl)1o;B#ER@cut!nBm&@xJJFn%3ee;zgSCNko* z&R~8l^RJlH8-j~wN|GFH5#=_l`cl5N08yWrN#kD?2BBqT3{HD_kHc4o!^O$rM{X_J zoXh&TSFKiVDjSs9bgA@q-H4xxkjZg~5)i!k!3jy~QAYrg^3YxNLeo{_0LUDm`B6>P zQi~dKoXF2FA_iI8!B^R9?)0i`y5%=#+zvSi(=JMTGNaUBp+!-hl@%`}CFJDtm2=9J>PY&$LgX+&LenUER;|1Grn4K&Dy_ z(`goUsZ5e*s+VoiT!$W1vXF#5B|dwF#UyZ_Ve%&$-np(SR!2*7JEwBcyl<0hZWjOt zCu`zSZI9oZ-()Vzjp=8;#Y$aXn5rb!B-0k+9AnK72GT>VbP}|HRh)tCt1H&yZMmR0 z#Bf<|%gopTYd`?!o4jbFxE?AuUh;=QksMI$>w=ju)J;N>5yU+jQ*QM|R7VTTQc4k& ztw%jsJY!VUKEv8LrNo{QlHU7UJji2L=Hd9q-<$f|snKpnEs4(D5tmMN=ybRWCw|*5)7M8bqN>)#BPd?hlE&1BTwFlPcLlXp+FW`#134peha!sJGU^P(-VK9g`-%D|!PwTi-jE>*idZ8g zJR|h4tfb`h;OBvZp(`8DLs#KBUIu#eGT@HejeDx6cU!DP-kRM>$0bmj0)=6?)TM+v z*b7fwe0TK`j!4Emv;ya5j#$we4)s?zCaWTD@NNUMYqi?@%*ceum2uP2OOygbx&0g= zzepXuBRSW~)~c$q=~s+{pj>$bmP9V;t;SSeNin< zn&jxwM0lQaifNpEmWe7rU-#T+TF|{;%9Kh(r1?sS=UZq>6_T(!sAr6hb?Wf0U``j7 zkl}ssrIdu6r2`lscIQ0%=U!q^h3!*8v^nM>OAaj@AdKXL)=qu0JAKDra=Z)Fl$i)n z2?9!+=;}wLgaQXqA1}CS6*FFz+fh)8;*y5KRz?ZwTD`gX>&afPS!HLXDJfc83LyIe z4>=s<>(W$T(w=clprz3AO2U>Bp5Dbge6=Ndy%C#AR)*E(;l}_gbAXhSje4Xn=oi~k zqXdPrq^Y$iD=9rEo9w^f zmdF?cq1J&?&o}{n`Nz4txF3el-wLh0*@~2QCreARsvCjf=WcD9W!+P<6JSudx zluB(aMrB zaq_`lt$xpF{o>CW(fco{_oKXCg%jAj61}&+F0XnG!+F&=0$MiqB$U?bxl`&(vp^Bg zBm|?UBOgDHLnT*_edyWTB-h=O}=!7%$CmF>aVz?gok^PN)FN(g~ z@ne4axl1xl8jCh26ll)7=7GxFQr49=r6=TYIqj^_0b5OukZM^Sqrj0%W?NZf#$oD1208ddXpj~r01vY0u}gw zkJc)%;hNB+A>0U3ZHA)CqffO~c)kU7wu^1;x% zen&KAb=onWd&itA_jS_@qAa9sn?$jz$UX z{2GfSq9)$as5h1AWLtH~uTiNrn$$Qm<|L&(EI#T`zLhH&I9GGqJ++pI4sZoysgp?y z>Z!wxPr9!vTqltA>>QjeMdhFovfMf zUz8J=NNl7lEh`^!&%Uj|>dLCOdnx9$q2K~kH#Vo?7)pf5acO2@IO!^OH&b0W{{U9N z&)=OWZ;*XZZcf!O*Y z5s-fFtrBd@W~ul-aE11z(Mi7x%u>CuHx|LMEc%S5EtzTEKRw8dR9dJ>j??g^0-&-Q zP(oC~(v#4kh2V3X>dO7QYgg)sE%Ftkab7g&W@db$Q!0}WPnjj!s#Lmz=dH&a9V>II zkiJ0AR&$^SGov_8?a1-24;Z+vAHcU6L(A&v$vG$XV~@jLs6;6%6)EL}G`ViBJ4HP$ zI^v5%0|@~Hl>Y!0zA(m%>k(YZbhu9sJhlS)JPHHn+qzleN`) zv{|t(JD!TTRO+n(rwumUasYNj_a!ObgeEgiyb|)=S6hU7I0WjF&04L7p=Se_;;lNB z+7A$wT{^C)vY&bz$d@iFuC(cB{Y^?cN>W3KKFh$$Pq@H5_h8Yfh)NH)Sei23$AR=O zkt=E0bm<&Y>8=N>$|)j12t#ddlxI#2JJ*9YX^3A5==Sqo)h1HdBs%(%(Mk zw;K83*s_DyX!obgx=$1twVvLZD`@-w0B}Ze+xa!~=~_-XH{qWtUv+khW5-0O(M-q_ z5Yv*OCzYjP044Tw*+b>;tih7B?AF%mI<2PAMk z`|CBMXsJ*=b2GttO5m+fWFy1!A|BxQX}|Wy+J|^nQAVxXvmf|xkGG|!Sd91`NlMns zt4bHaz*hu}XE@cJ(X=#cy9n2w^;>vdHEhEZwC$1M$wYReZ?3)3+zM@vYN44m3e%_K zRPuvy(-ZvO($b{CP??>;iCWYyI+Y8W8ySt< z6@|S#99&haI=ND@w@%mGTBV5%RVlP6F343;#u`a0Q1g??=>+r2h{t_t(Aw%192h|o zb&(5kmlaDnFFW@Pp%Nj++Fi8UeT|zZX5sH8UwNtPT*=dF&P7~l=qO=S)*5JG1SEu> ztRADzu|Cmgv_7U6;0(}4qghq$v(ci_EyX+Me5%jlGj1%cu-%*P-rFLn)M`7imSB8i zQyXvM8bgv`r~}oOR0XT2JQWSdT_it4S}V^hIFxq>rmdVy@und`^4O;HQ@5P%l|>zqLyGku4Ww z*WFxnE=Bf)8lsBOupQ_|5|nY2W83Ag3eu`GQTF8qqI906E#-L)rCGuTPFK_JGq0T1 zC|^Eaj?<`dXj-0a&Oqu=LVIvK1B`*MRE6@TK`gLKYAZjvHrW8E5E4{Vz{k&@$6giT zFo~93DVbDd2WiyjWi?z&avrIvZLo-mi0a*KCAA@080tt*>i~Hm4Qjc>ErvE%!+*12 zFv6d;Ay-sjS=N=uGOt4f71%12+rprg#`4XBao1A(0L zt!j@ly)95>L1o*mFk#WDZ?LzLhUt+iE-ovM6!j=IIbO4q&QIa5viz5rRL5~_==2J8 zGGrSibVub!jO3Z$N|(^Y$IATJzYba*L?u6KJZr{1eYv?H>dH#p&r7){)S@`YV0-X? z4Q&O8FVqJLlOe^0ttB7?at9a$OEN?1rgat0Oz)K;`u=q zo{E}|;rY$mYjMe`Ehe#%C=mMjjB+rHA7AX&(9wOhTdl}ul-|VF8H-5USnktbf#yi0 zO!K6Iroj!Pp(yK8h$>O!0sK0$y6Rx63e~p>Y$qdk?#;us{uuV+w`tQFs^1qiI^LjA zBF$Hq8|f;OEV9a;JbDsNaqrt&bg7E9h&c@9edrO|m2|ymP0NQb zZan(RnJzliWRbu<3MmKJYv|IFaEyY8bGKW8bT52&8*4B6H7UCFG6Plm1!9yva;P#M zTWzx~Dk@T4X=54BO0$p#wrbg;lWGHzBzQvj4wDH}H+QPh-On1b>9Oi`tGYp-I+b)$ z;VD5#Yv0mmab8oRlyVuh{YnKU$I zGoKZqZ?rnC5iQPh1Sz{Mg`>pSF;v8Ik~j> zjOd_|+32WJf>sDkA>p5&rSf?G9eFu;RpZ?(cjCeK)#`*?l@=3}^9at&(Y7rW*s?f&}{{Uj+uLGx>BE2eF+exib5)g*cQ8p17NC)i<9_^@q2E7^N zSJ)HlRX&y9J?onDNoS_FMFlatKFK*T)O(?M?t|=mV}s7IRCHuk%O8mJRW;mr^X*m_ z!!66UluPPOM*jeo#WFKg*Ui5ssU34Ebc*pK;pEJY->qzqS3u+ij`dCyVpMB$n`;4; zy6Nd@vO0@t1dR&WD^zuwppK{p4Cr_*`jkU!H18)d;MFR9!KXrDwA9o~v+8$M%7@-r z^{KWbH|2t!!vVwlNzm2u;tN_%Z0;TbrhWwb~zK@72Qc|WIF6FMkb(Hjxtv0#lp%IeYdq4n<>ZyGjCDwz@ z^#<0pHWlsEl!Yi~=Yy@ajtED6gSBkR_1P+$xJzy|1(<4In)Ckv4g8xUM>Ft1jHQUYA{|K(EHHJ@GP|x1zKb!YNIX5`5(KDaj>Y zRuk=w7hSgMuBC|1S`p_$cb%QBsTpron{qa;2Hm|xt6O&zORmMd6E;N#d~o7NL}%2~ zjVL^X6@(lFxCctdBS#l?zo%po1*kUkq*!&;JYUJ~;9ZSzbmW9ax6z+$ifVEP@ab`V zk6t~e%8oXC`oQpc0%3ZmSBuR>7yr?Jnu;Y&`BEpra?slvYF$FA3|1z-w)yHqW-pV?iW{8s>*AwknQr036gGa_*+@S$6BNspgWKdWB7*E6gLUhMmA6%AyVwqk^H&t!Mf5fo6sF&7;=o!H!ehs5y5S8BsDz|s zfRqwX$aAJe+Thv^oU%*%XmO}uZ$rl~JJOeAT$Yt0>Z#JLdcYE=)1t{+ailH0W334| zAm9ZjvbfH1t;*IqZ*Zvqk-vJ?p=^5yU^x?_gF}zgURp>>8}btJl8gbB#q$-hB7g9-A#oPx0U))nZ_!%s<@5a8ViSJr_oA8g6q9Xdy5rpx> zE%KiK0Avn6?QONFYM_^RO1qESdq;ZGc4C`m)oC;x(6*>ldZVkJrTqt7aKF`1gDt>M zM5c;*k07WXpKb!`+iO|fP}CCF7Xid@@Fq1Y6)Mc9hgOE3M~do3g}3#)U&YnGw&
  • oK}vDQR&mecp&Fq3UMRAgn+jceSNt#TMLMf* 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. + +.. figure:: ht32f491x3-starter-kit.jpg + :align: center + :alt: HT32F491x3 Starter Kit + + HT32F491x3 Starter Kit board photo + +Features +======== + +The current port provides: + +* Boot and clock initialization for the ESK32 8 MHz external crystal +* System clock configured to 150 MHz +* USART1 serial console at 115200 8N1 +* ``/bin`` mounted through ``binfs`` +* ``/proc`` mounted through ``procfs`` +* User LED registration through ``/dev/userleds`` +* Basic internal GPIO helpers used by the console and LED support + +The default ``esk32:nsh`` configuration also enables these built-in +applications: + +* ``hello`` +* ``ostest`` +* ``dumpstack`` +* ``leds`` + +Buttons and LEDs +================ + +Board LEDs +---------- + +Three user LEDs from the development kit are currently mapped by the board +port. They are active-low and are exposed through the standard NuttX +``USERLED`` interface and the ``/dev/userleds`` device. + +===== =========== ========== +LED Port/Pin Notes +===== =========== ========== +LED2 PD13 Active-low +LED3 PD14 Active-low +LED4 PD15 Active-low +===== =========== ========== + +The generic ``leds`` example from ``nuttx-apps`` can be used to validate the +LED interface. + +Board Buttons +------------- + +No button is currently exposed by the board port. + +Pin Mapping +=========== + +USART1 +------ + +USART1 is used as the default serial console. + +===== ========== ========== +Pin Signal Notes +===== ========== ========== +PA9 USART1_TX Console TX +PA10 USART1_RX Console RX +===== ========== ========== + +Configurations +============== + +nsh +--- + +This is the currently maintained configuration for the board. It provides a +serial console with the NuttShell and mounts ``/bin`` and ``/proc`` during +board bring-up. + +Configure and build it from the ``nuttx`` directory: + +.. code-block:: console + + $ ./tools/configure.sh -l esk32:nsh + $ make -j + +After boot, a typical prompt looks like: + +.. code-block:: console + + NuttShell (NSH) NuttX-12.x.x + nsh> ls / + /: + bin/ + dev/ + proc/ + +And the built-in applications can be listed with: + +.. code-block:: console + + nsh> ls /bin + dd + dumpstack + hello + leds + nsh + ostest + sh + +Flashing +======== + +The board directory includes a helper script for flashing through Holtek's +Windows OpenOCD package from a WSL-based development environment: + +.. code-block:: console + + $ ./boards/arm/ht32f491x3/esk32/tools/flash.sh + +The script expects: + +* ``nuttx.bin`` already generated in the ``nuttx`` directory +* Holtek xPack OpenOCD installed under + ``C:\Program Files (x86)\Holtek HT32 Series\HT32-IDE\xPack\xpack-openocd-0.11.0-4`` +* an HT32-Link compatible debug connection +* Holtek xPack OpenOCD can be installed together with the HT32 IDE, available + from Holtek's website: `Holtek Downloads `_ + +Useful options: + +.. code-block:: console + + $ ./boards/arm/ht32f491x3/esk32/tools/flash.sh --dry-run + $ ./boards/arm/ht32f491x3/esk32/tools/flash.sh --device HT32F49163_64LQFP + $ ./boards/arm/ht32f491x3/esk32/tools/flash.sh --openocd-root /mnt/c/path/to/openocd + +Testing Notes +============= + +The following commands are useful for validating the current port: + +.. code-block:: console + + nsh> hello + nsh> ostest + nsh> dumpstack + nsh> leds + +When ``leds`` is executed, the example opens ``/dev/userleds`` and cycles +through the LED bitmasks supported by the board. + +Current Limitations +=================== + +The current port is still intentionally small. In particular: + +* only the ``nsh`` board configuration is maintained +* only USART1 routing is described by the board port +* LEDs are supported, but board buttons are not yet implemented +* internal GPIO helpers exist, but there is not yet a board-level ``/dev/gpio`` + test interface in this port diff --git a/Documentation/platforms/arm/ht32f491x3/index.rst b/Documentation/platforms/arm/ht32f491x3/index.rst new file mode 100644 index 0000000000000..c468b5d7e6852 --- /dev/null +++ b/Documentation/platforms/arm/ht32f491x3/index.rst @@ -0,0 +1,14 @@ +=============== +Holtek HT32F491 +=============== + +The HT32F491x3 family is based on the ARM Cortex-M4 core. + +Supported Boards +================ + +.. toctree:: + :glob: + :maxdepth: 1 + + boards/*/* diff --git a/arch/arm/include/ht32f491x3/chip.h b/arch/arm/include/ht32f491x3/chip.h index bc843a01c3313..8b3393a1cf7a0 100644 --- a/arch/arm/include/ht32f491x3/chip.h +++ b/arch/arm/include/ht32f491x3/chip.h @@ -56,10 +56,10 @@ #define HT32_NGPIO 6 #define HT32_HICK_FREQUENCY 8000000 -#define HT32_HICK48_FREQUENCY 48000000 +#define HT32_HICK48_FREQUENCY 48000000 #define HT32_HEXT_MIN_FREQUENCY 4000000 -#define HT32_HEXT_MAX_FREQUENCY 25000000 -#define HT32_PLL_MAX_FREQUENCY 150000000 +#define HT32_HEXT_MAX_FREQUENCY 25000000 +#define HT32_PLL_MAX_FREQUENCY 150000000 #define HT32_SYSCLK_FREQUENCY CONFIG_HT32F491X3_SYSCLK_FREQUENCY #define HT32_HCLK_FREQUENCY HT32_SYSCLK_FREQUENCY diff --git a/boards/arm/ht32f491x3/esk32/tools/flash.ps1 b/boards/arm/ht32f491x3/esk32/tools/flash.ps1 new file mode 100644 index 0000000000000..2dc08cb4cca4e --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/tools/flash.ps1 @@ -0,0 +1,239 @@ +############################################################################ +# boards/arm/ht32f491x3/esk32/tools/flash.ps1 +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +param( + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$RemainingArgs +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version 2 + +$ScriptDir = $PSScriptRoot +$TopDir = [System.IO.Path]::GetFullPath((Join-Path $ScriptDir "..\..\..\..\..")) + +$DefaultBin = Join-Path $TopDir "nuttx.bin" +$WindowsSetup = "Windows 10 Pro" +$PowerShellSetup = "Windows PowerShell 5.1 or newer" +$HT32IDEVersion = "HT32-IDE 1.0.6 (Build Date: 2025/12/04)" +$HT32IDERoot = "C:\Program Files (x86)\Holtek HT32 Series\HT32-IDE" +$OpenOCDPackage = "xPack OpenOCD 0.11.0-4" +$OpenOCDRoot = Join-Path $HT32IDERoot "xPack\xpack-openocd-0.11.0-4" +$OpenOCDExe = Join-Path $OpenOCDRoot "bin\openocd.exe" +$ScriptsDir = Join-Path $OpenOCDRoot "scripts" +$FlashLoader = Join-Path $OpenOCDRoot "FlashLoader\HT32F491x3_256.HLM" +$DeviceName = "HT32F49163_100LQFP" +$FlashBase = "0x08000000" +$FlashEnd = "0x0803FFFF" +$SRAMBase = "0x20000000" +$WorkAreaSize = "0xC000" +$BinPath = $DefaultBin +$DryRun = $false +$ProgName = $MyInvocation.MyCommand.Name + +function Get-AbsolutePath { + param( + [string]$Path + ) + + if ([System.IO.Path]::IsPathRooted($Path)) { + return [System.IO.Path]::GetFullPath($Path) + } + + return [System.IO.Path]::GetFullPath((Join-Path (Get-Location) $Path)) +} + +function Format-CommandArgument { + param( + [string]$Argument + ) + + if ($Argument -match '[\s"]') { + return '"' + ($Argument -replace '"', '\"') + '"' + } + + return $Argument +} + +function Show-Assumptions { + Write-Host "############################################################################" + Write-Host "# Assumptions:" + Write-Host "#" + Write-Host "# - $WindowsSetup" + Write-Host "# - $PowerShellSetup" + Write-Host "# - This is the native Windows backend; use flash.py from the same" + Write-Host "# directory for automatic backend selection, or run this script directly" + Write-Host "# - $HT32IDEVersion installed at:" + Write-Host "# $HT32IDERoot" + Write-Host "# - $OpenOCDPackage available at:" + Write-Host "# $OpenOCDRoot" + Write-Host "# - Holtek HT-Link probe using interface/htlink.cfg" + Write-Host "# - ESK32 board with $DeviceName and FlashLoader\HT32F491x3_256.HLM" + Write-Host "#" + Write-Host "# Update this script if any of the above are not true." + Write-Host "#" + Write-Host "############################################################################" + Write-Host "" +} + +function Show-Usage { + Write-Host "Usage: $ProgName [options]" + Write-Host "" + Write-Host "Options:" + Write-Host " --bin PATH Binary to flash. Default: $DefaultBin" + Write-Host " --device NAME Holtek expected device name. Default: $DeviceName" + Write-Host " --openocd-root DIR Holtek xPack OpenOCD root." + Write-Host " --dry-run Print the OpenOCD command without executing it." + Write-Host " --help Show this help." + Write-Host "" + Write-Host "Examples:" + Write-Host " .\$ProgName" + Write-Host " .\$ProgName --dry-run" + Write-Host " .\$ProgName --device HT32F49163_64LQFP" +} + +function Fail { + param( + [string]$Message, + [switch]$ShowUsage + ) + + [Console]::Error.WriteLine($Message) + + if ($ShowUsage) { + Show-Usage + } + + exit 1 +} + +Show-Assumptions + +for ($i = 0; $i -lt $RemainingArgs.Count; $i++) { + switch ($RemainingArgs[$i]) { + "--bin" { + if ($i + 1 -ge $RemainingArgs.Count) { + Fail "Missing value for --bin" -ShowUsage + } + + $i++ + $BinPath = Get-AbsolutePath $RemainingArgs[$i] + } + "--device" { + if ($i + 1 -ge $RemainingArgs.Count) { + Fail "Missing value for --device" -ShowUsage + } + + $i++ + $DeviceName = $RemainingArgs[$i] + } + "--openocd-root" { + if ($i + 1 -ge $RemainingArgs.Count) { + Fail "Missing value for --openocd-root" -ShowUsage + } + + $i++ + $OpenOCDRoot = Get-AbsolutePath $RemainingArgs[$i] + $OpenOCDExe = Join-Path $OpenOCDRoot "bin\openocd.exe" + $ScriptsDir = Join-Path $OpenOCDRoot "scripts" + $FlashLoader = Join-Path $OpenOCDRoot "FlashLoader\HT32F491x3_256.HLM" + } + "--dry-run" { + $DryRun = $true + } + "--help" { + Show-Usage + exit 0 + } + "-h" { + Show-Usage + exit 0 + } + default { + Fail "Unknown argument: $($RemainingArgs[$i])" -ShowUsage + } + } +} + +if (-not $DryRun) { + if (-not (Test-Path -Path $BinPath -PathType Leaf)) { + Fail "Binary not found: $BinPath" + } + + if (-not (Test-Path -Path $OpenOCDExe -PathType Leaf)) { + Fail "OpenOCD executable not found: $OpenOCDExe" + } + + if (-not (Test-Path -Path $FlashLoader -PathType Leaf)) { + Fail "Flash loader not found: $FlashLoader" + } +} + +$OpenOCDArgs = @( + "-s" + $ScriptsDir + "-c" + "hlm_SRAM $SRAMBase $WorkAreaSize" + "-c" + "hlm_loader {$FlashLoader} $FlashBase $FlashEnd" + "-c" + "ht_flags erase_sector" + "-c" + "set WORKAREASIZE $WorkAreaSize" + "-f" + "interface/htlink.cfg" + "-f" + "target/HLM491x3.cfg" + "-c" + "set_expected_name $DeviceName" + "-c" + "program $BinPath verify reset exit $FlashBase" +) + +$CommandParts = @($OpenOCDExe) + $OpenOCDArgs +$CommandText = ($CommandParts | ForEach-Object { Format-CommandArgument $_ }) -join " " + +Write-Host ("TOPDIR : {0}" -f $TopDir) +Write-Host ("Binary : {0}" -f $BinPath) +Write-Host ("Device : {0}" -f $DeviceName) +Write-Host ("OpenOCD : {0}" -f $OpenOCDExe) +Write-Host ("Flash loader: {0}" -f $FlashLoader) + +if ($DryRun) { + if (-not (Test-Path -Path $BinPath -PathType Leaf)) { + Write-Host "Warning : binary not found yet" + } + + if (-not (Test-Path -Path $OpenOCDExe -PathType Leaf)) { + Write-Host "Warning : OpenOCD executable not found" + } + + if (-not (Test-Path -Path $FlashLoader -PathType Leaf)) { + Write-Host "Warning : flash loader not found" + } + + Write-Host ("Command : {0}" -f $CommandText) + exit 0 +} + +& $OpenOCDExe @OpenOCDArgs +exit $LASTEXITCODE diff --git a/boards/arm/ht32f491x3/esk32/tools/flash.py b/boards/arm/ht32f491x3/esk32/tools/flash.py new file mode 100755 index 0000000000000..74ae8a6a46265 --- /dev/null +++ b/boards/arm/ht32f491x3/esk32/tools/flash.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +############################################################################ +# boards/arm/ht32f491x3/esk32/tools/flash.py +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +# Wrapper that dispatches to flash.sh in WSL and flash.ps1 on Windows. + +import os +import platform +import shutil +import subprocess +import sys +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent + + +def is_windows_host(): + system = platform.system().lower() + return os.name == "nt" or system.startswith("msys") or system.startswith("cygwin") + + +def is_wsl(): + if "WSL_INTEROP" in os.environ or "WSL_DISTRO_NAME" in os.environ: + return True + + release = platform.release().lower() + version = platform.version().lower() + return "microsoft" in release or "microsoft" in version + + +def build_command(argv): + if is_windows_host(): + powershell = shutil.which("powershell.exe") or shutil.which("pwsh.exe") + if powershell is None: + raise RuntimeError("Unable to find powershell.exe or pwsh.exe in PATH.") + + backend = SCRIPT_DIR / "flash.ps1" + return [powershell, "-ExecutionPolicy", "Bypass", "-File", str(backend), *argv] + + if sys.platform.startswith("linux"): + if not is_wsl(): + raise RuntimeError( + "Unsupported host: this wrapper supports Windows native and WSL." + ) + + bash = shutil.which("bash") + if bash is None: + raise RuntimeError("Unable to find bash in PATH.") + + backend = SCRIPT_DIR / "flash.sh" + return [bash, str(backend), *argv] + + raise RuntimeError( + "Unsupported host: this wrapper supports Windows native and WSL." + ) + + +def main(argv): + try: + cmd = build_command(argv) + completed = subprocess.run(cmd, check=False) + return completed.returncode + except RuntimeError as err: + print(err, file=sys.stderr) + return 1 + except OSError as err: + print(f"Failed to start backend script: {err}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/boards/arm/ht32f491x3/esk32/tools/flash.sh b/boards/arm/ht32f491x3/esk32/tools/flash.sh index 25d3635deb180..70e138253d032 100755 --- a/boards/arm/ht32f491x3/esk32/tools/flash.sh +++ b/boards/arm/ht32f491x3/esk32/tools/flash.sh @@ -27,7 +27,11 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TOPDIR="$(cd "${SCRIPT_DIR}/../../../../.." && pwd)" DEFAULT_BIN="${TOPDIR}/nuttx.bin" -OPENOCD_ROOT="/mnt/c/Program Files (x86)/Holtek HT32 Series/HT32-IDE/xPack/xpack-openocd-0.11.0-4" +WINDOWS_SETUP="Windows 10 Pro with WSL2" +HT32_IDE_VERSION="HT32-IDE 1.0.6 (Build Date: 2025/12/04)" +HT32_IDE_ROOT="/mnt/c/Program Files (x86)/Holtek HT32 Series/HT32-IDE" +OPENOCD_PACKAGE="xPack OpenOCD 0.11.0-4" +OPENOCD_ROOT="${HT32_IDE_ROOT}/xPack/xpack-openocd-0.11.0-4" OPENOCD_EXE="${OPENOCD_ROOT}/bin/openocd.exe" SCRIPTS_DIR="${OPENOCD_ROOT}/scripts" FLASH_LOADER="${OPENOCD_ROOT}/FlashLoader/HT32F491x3_256.HLM" @@ -39,6 +43,28 @@ WORKAREA_SIZE="0xC000" BIN_PATH="${DEFAULT_BIN}" DRY_RUN=0 +print_assumptions() { + cat < 0)); do case "$1" in --bin)