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 f8a5ef2fe47e9803284e2e17bde6fceb603932e7 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 -> 211344 bytes .../arm/ht32f491x3/boards/esk32/index.rst | 177 +++++++++++++ .../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 | 32 ++- 7 files changed, 554 insertions(+), 5 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..9422d707cc5c670708460f7872d2d9e9cd25c1d2 GIT binary patch literal 211344 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%0A{R0O5U*hu?aVD5_mwm$JCBZ_5C?J;X4X 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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: + +* Holtek HT32F49163 MCU from the HT32F491x3 family +* ARM Cortex-M4 core with FPU support +* 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 +=========== + +The current port uses the following MCU pins: + +===== ========== ========== +Pin Signal Notes +===== ========== ========== +PA9 USART1_TX Default serial console TX +PA10 USART1_RX Default serial console RX +PD13 LED2 User LED, active-low +PD14 LED3 User LED, active-low +PD15 LED4 User LED, active-low +===== ========== ========== + +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_100LQFP + $ ./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 + +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 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..39f15246bfe9c --- /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_100LQFP" +} + +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..eeff2de93d879 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)