From 41c53e7fdc37ac647adf9af74257136b2bbb3cfe Mon Sep 17 00:00:00 2001 From: Felipe Moura Date: Wed, 25 Mar 2026 08:19:45 -0300 Subject: [PATCH] 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 6c77ccc7614..63101384692 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 00000000000..596c5765594 --- /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 00000000000..79ce98ccbc2 --- /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 00000000000..0d3de5606a1 --- /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 00000000000..3712e95600c --- /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 00000000000..99d87e3aad8 --- /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 00000000000..f2dfc6f3d7b --- /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 00000000000..61475bb974c --- /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 00000000000..79c67f5ba5b --- /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 00000000000..80d92936023 --- /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 00000000000..0b75f7b8613 --- /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 00000000000..7bf2fe0e93a --- /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 00000000000..25d3635deb1 --- /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[@]}"