This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 107b7a9aa1f boards/nucleo-h743zi: Add nxboot bootloader support
107b7a9aa1f is described below
commit 107b7a9aa1fafc45cd0a9c7dea1edee7adfb6e68
Author: Neil Berkman <[email protected]>
AuthorDate: Tue Mar 10 07:06:51 2026 -0700
boards/nucleo-h743zi: Add nxboot bootloader support
Add nxboot bootloader board integration for nucleo-h743zi.
nxboot uses a three-slot layout (primary, secondary, tertiary) with
no scratch partition.
- add STM32_APP_FORMAT_NXBOOT board support and nxboot-specific OTA
slot defaults
- gate scratch partition configuration on MCUboot, where it applies
- select nxboot linker scripts in the board build logic
- add tertiary OTA partition support in stm32_progmem.c
- add nxboot-loader and nxboot-app defconfigs and linker scripts
- validate the fixed nxboot flash layout used by this board so
mismatched config values fail at build time instead of producing
a silently broken image
Signed-off-by: Neil Berkman <[email protected]>
---
arch/arm/src/stm32h7/Kconfig | 31 ++-
.../nucleo-h743zi/configs/nxboot-app/defconfig | 65 ++++++
.../nucleo-h743zi/configs/nxboot-loader/defconfig | 70 +++++++
boards/arm/stm32h7/nucleo-h743zi/scripts/Make.defs | 6 +
.../nucleo-h743zi/scripts/flash-nxboot-app.ld | 225 +++++++++++++++++++++
.../nucleo-h743zi/scripts/flash-nxboot-loader.ld | 223 ++++++++++++++++++++
.../arm/stm32h7/nucleo-h743zi/src/CMakeLists.txt | 20 +-
.../arm/stm32h7/nucleo-h743zi/src/stm32_progmem.c | 9 +
8 files changed, 643 insertions(+), 6 deletions(-)
diff --git a/arch/arm/src/stm32h7/Kconfig b/arch/arm/src/stm32h7/Kconfig
index 1cd87460313..3b178fb0596 100644
--- a/arch/arm/src/stm32h7/Kconfig
+++ b/arch/arm/src/stm32h7/Kconfig
@@ -674,6 +674,16 @@ config STM32_APP_FORMAT_MCUBOOT
comment "MCUboot support depends on CONFIG_EXPERIMENTAL"
depends on !EXPERIMENTAL
+config STM32_APP_FORMAT_NXBOOT
+ bool "NuttX nxboot format"
+ select STM32_HAVE_OTA_PARTITION
+ depends on EXPERIMENTAL
+ ---help---
+ The NuttX nxboot support of loading the firmware images.
+
+comment "nxboot support depends on CONFIG_EXPERIMENTAL"
+ depends on !EXPERIMENTAL
+
endchoice # Application Image Format
endmenu # Application Image Configuration
@@ -6593,29 +6603,44 @@ config STM32_OTA_SECONDARY_SLOT_DEVPATH
string "Application image secondary slot device path"
default "/dev/ota1"
+config STM32_OTA_TERTIARY_SLOT_DEVPATH
+ string "Application image tertiary slot device path"
+ default "/dev/ota2"
+ depends on STM32_APP_FORMAT_NXBOOT
+
config STM32_OTA_SCRATCH_DEVPATH
string "Scratch partition device path"
default "/dev/otascratch"
+ depends on STM32_APP_FORMAT_MCUBOOT
config STM32_OTA_PRIMARY_SLOT_OFFSET
- hex "MCUboot application image primary slot offset"
+ hex "Application image primary slot offset"
default "0x40000"
config STM32_OTA_SECONDARY_SLOT_OFFSET
- hex "MCUboot application image secondary slot offset"
+ hex "Application image secondary slot offset"
+ default "0xc0000" if STM32_APP_FORMAT_NXBOOT
default "0x100000"
+config STM32_OTA_TERTIARY_SLOT_OFFSET
+ hex "Application image tertiary slot offset"
+ default "0x140000"
+ depends on STM32_APP_FORMAT_NXBOOT
+
config STM32_OTA_SCRATCH_OFFSET
hex "MCUboot scratch partition offset"
default "0x1c0000"
+ depends on STM32_APP_FORMAT_MCUBOOT
config STM32_OTA_SLOT_SIZE
- hex "MCUboot application image slot size (in bytes)"
+ hex "Application image slot size (in bytes)"
+ default "0x80000" if STM32_APP_FORMAT_NXBOOT
default "0xc0000"
config STM32_OTA_SCRATCH_SIZE
hex "MCUboot scratch partition size (in bytes)"
default "0x40000"
+ depends on STM32_APP_FORMAT_MCUBOOT
endif # STM32_PROGMEM_OTA_PARTITION
endif # STM32_HAVE_OTA_PARTITION
diff --git a/boards/arm/stm32h7/nucleo-h743zi/configs/nxboot-app/defconfig
b/boards/arm/stm32h7/nucleo-h743zi/configs/nxboot-app/defconfig
new file mode 100644
index 00000000000..b89f0608ebd
--- /dev/null
+++ b/boards/arm/stm32h7/nucleo-h743zi/configs/nxboot-app/defconfig
@@ -0,0 +1,65 @@
+#
+# 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_STANDARD_SERIAL is not set
+# CONFIG_STM32H7_USE_LEGACY_PINMAP is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="nucleo-h743zi"
+CONFIG_ARCH_BOARD_NUCLEO_H743ZI=y
+CONFIG_ARCH_CHIP="stm32h7"
+CONFIG_ARCH_CHIP_STM32H743ZI=y
+CONFIG_ARCH_CHIP_STM32H7=y
+CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_DTCM=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_BOARDCTL_RESET=y
+CONFIG_BOARD_LOOPSPERMSEC=43103
+CONFIG_BOOT_NXBOOT=y
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_EXPERIMENTAL=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FS_FAT=y
+CONFIG_FS_PROCFS=y
+CONFIG_FS_PROCFS_REGISTER=y
+CONFIG_HAVE_CXX=y
+CONFIG_HAVE_CXXINITIALIZE=y
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LIBM=y
+CONFIG_LINE_MAX=64
+CONFIG_MM_REGIONS=4
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_MOTD=y
+CONFIG_NSH_MOTD_STRING="Welcome to NuttX from nxboot, this is the FIRST
firmware."
+CONFIG_NSH_READLINE=y
+CONFIG_NXBOOT_HEADER_SIZE=0x400
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=245760
+CONFIG_RAM_START=0x20010000
+CONFIG_RAW_BINARY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_LPWORK=y
+CONFIG_SCHED_WAITPID=y
+CONFIG_SPI=y
+CONFIG_START_DAY=28
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2021
+CONFIG_STM32H7_FLASH_OVERRIDE_I=y
+CONFIG_STM32H7_USART3=y
+CONFIG_STM32_APP_FORMAT_NXBOOT=y
+CONFIG_STM32_PROGMEM_OTA_PARTITION=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_TASK_NAME_SIZE=0
+CONFIG_USART3_SERIAL_CONSOLE=y
diff --git a/boards/arm/stm32h7/nucleo-h743zi/configs/nxboot-loader/defconfig
b/boards/arm/stm32h7/nucleo-h743zi/configs/nxboot-loader/defconfig
new file mode 100644
index 00000000000..725d45a29f3
--- /dev/null
+++ b/boards/arm/stm32h7/nucleo-h743zi/configs/nxboot-loader/defconfig
@@ -0,0 +1,70 @@
+#
+# 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_STM32H7_USE_LEGACY_PINMAP is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="nucleo-h743zi"
+CONFIG_ARCH_BOARD_NUCLEO_H743ZI=y
+CONFIG_ARCH_CHIP="stm32h7"
+CONFIG_ARCH_CHIP_STM32H743ZI=y
+CONFIG_ARCH_CHIP_STM32H7=y
+CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_DTCM=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_BOARDCTL_RESET=y
+CONFIG_BOARD_LOOPSPERMSEC=43103
+CONFIG_BOOT_NXBOOT=y
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DRVR_INVALIDATE=y
+CONFIG_DRVR_READAHEAD=y
+CONFIG_DRVR_WRITEBUFFER=y
+CONFIG_EXPERIMENTAL=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FS_FAT=y
+CONFIG_FS_PROCFS=y
+CONFIG_FS_PROCFS_REGISTER=y
+CONFIG_FTL_WRITEBUFFER=y
+CONFIG_HAVE_CXX=y
+CONFIG_HAVE_CXXINITIALIZE=y
+CONFIG_INIT_ENTRYPOINT="nxboot_loader_main"
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LIBM=y
+CONFIG_LINE_MAX=64
+CONFIG_MM_IOB=y
+CONFIG_MM_REGIONS=4
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LIBRARY=y
+CONFIG_NSH_MOTD=y
+CONFIG_NSH_MOTD_STRING="Welcome to NuttX nxboot Loader!"
+CONFIG_NSH_READLINE=y
+CONFIG_NXBOOT_BOOTLOADER=y
+CONFIG_NXBOOT_HEADER_SIZE=0x400
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=245760
+CONFIG_RAM_START=0x20010000
+CONFIG_RAW_BINARY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_LPWORK=y
+CONFIG_SCHED_WAITPID=y
+CONFIG_SPI=y
+CONFIG_START_DAY=28
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2021
+CONFIG_STM32H7_FLASH_OVERRIDE_I=y
+CONFIG_STM32H7_USART3=y
+CONFIG_STM32_APP_FORMAT_NXBOOT=y
+CONFIG_STM32_PROGMEM_OTA_PARTITION=y
+CONFIG_TASK_NAME_SIZE=0
+CONFIG_USART3_SERIAL_CONSOLE=y
+CONFIG_WQUEUE_NOTIFIER=y
diff --git a/boards/arm/stm32h7/nucleo-h743zi/scripts/Make.defs
b/boards/arm/stm32h7/nucleo-h743zi/scripts/Make.defs
index 378a7d43b8d..abea07c1bd3 100644
--- a/boards/arm/stm32h7/nucleo-h743zi/scripts/Make.defs
+++ b/boards/arm/stm32h7/nucleo-h743zi/scripts/Make.defs
@@ -30,6 +30,12 @@ ifeq ($(CONFIG_STM32_APP_FORMAT_MCUBOOT),y)
else
LDSCRIPT = flash-mcuboot-app.ld
endif
+else ifeq ($(CONFIG_STM32_APP_FORMAT_NXBOOT),y)
+ ifeq ($(CONFIG_NXBOOT_BOOTLOADER),y)
+ LDSCRIPT = flash-nxboot-loader.ld
+ else
+ LDSCRIPT = flash-nxboot-app.ld
+ endif
else
LDSCRIPT = flash.ld
endif
diff --git a/boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-app.ld
b/boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-app.ld
new file mode 100644
index 00000000000..6dfa2df91d8
--- /dev/null
+++ b/boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-app.ld
@@ -0,0 +1,225 @@
+/****************************************************************************
+ * boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-app.ld
+ *
+ * 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 <nuttx/config.h>
+
+/* The STM32H743ZI has 2048Kb of main FLASH memory. The flash memory is
+ * partitioned into a User Flash memory and a System Flash memory. Each
+ * of these memories has two banks:
+ *
+ * 1) User Flash memory:
+ *
+ * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb
each
+ * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb
each
+ *
+ * 2) System Flash memory:
+ *
+ * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector
+ * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector
+ *
+ * 3) User option bytes for user configuration, only in Bank 1.
+ *
+ * In the STM32H743ZI, two different boot spaces can be selected through
+ * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and
+ * BOOT_ADD1 option bytes:
+ *
+ * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0].
+ * ST programmed value: Flash memory at 0x0800:0000
+ * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0].
+ * ST programmed value: System bootloader at 0x1FF0:0000
+ *
+ * TODO: Check next paragraph with nucleo schematics
+ *
+ * NuttX does not modify these option bytes. On the unmodified NUCLEO-H743ZI
+ * board, the BOOT0 pin is at ground so by default, the STM32 will boot
+ * to address 0x0800:0000 in FLASH.
+ *
+ * The STM32H743ZI also has 1024Kb of data SRAM.
+ * SRAM is split up into several blocks and into three power domains:
+ *
+ * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with
+ * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus
+ *
+ * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000
+ *
+ * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit
+ * DTCM ports. The DTCM-RAM could be used for critical real-time
+ * data, such as interrupt service routines or stack / heap memory.
+ * Both DTCM-RAMs can be used in parallel (for load/store operations)
+ * thanks to the Cortex-M7 dual issue capability.
+ *
+ * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000
+ *
+ * This RAM is connected to ITCM 64-bit interface designed for
+ * execution of critical real-times routines by the CPU.
+ *
+ * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA
+ * through D1 domain AXI bus matrix
+ *
+ * 2.1) 512Kb of SRAM beginning at address 0x2400:0000
+ *
+ * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA
+ * through D2 domain AHB bus matrix
+ *
+ * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000
+ * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000
+ * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000
+ *
+ * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000
+ *
+ * 4) AHB SRAM (D3 domain) accessible by most of system masters
+ * through D3 domain AHB bus matrix
+ *
+ * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000
+ * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000
+ *
+ * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000
+ * where the code expects to begin execution by jumping to the entry point in
+ * the 0x0800:0000 address range.
+ *
+ * The nxboot application image starts at 0x08040400, after the bootloader
+ * region (256K) and the nxboot image header (1K). The application slot
+ * size is 512K - 1K to account for the header.
+ *
+ * Keep these fixed addresses in sync with the board's nxboot partition
+ * layout. On this board the application vector table is linked at
+ * 0x08040400, so the nxboot header size must remain 0x400.
+ */
+
+#if CONFIG_STM32_OTA_PRIMARY_SLOT_OFFSET != 0x40000
+# error "CONFIG_STM32_OTA_PRIMARY_SLOT_OFFSET must be 0x40000 for
flash-nxboot-app.ld"
+#endif
+
+#if CONFIG_STM32_OTA_SLOT_SIZE != 0x80000
+# error "CONFIG_STM32_OTA_SLOT_SIZE must be 0x80000 for flash-nxboot-app.ld"
+#endif
+
+#if CONFIG_NXBOOT_HEADER_SIZE != 0x400
+# error "CONFIG_NXBOOT_HEADER_SIZE must be 0x400 for flash-nxboot-app.ld"
+#endif
+
+MEMORY
+{
+ itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K
+ flash (rx) : ORIGIN = 0x08040400, LENGTH = 512K - 1K
+ dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
+ dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K
+ sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K
+ sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K
+ sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K
+ sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K
+ sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K
+ bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K
+}
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+ENTRY(_stext)
+SECTIONS
+{
+ .text :
+ {
+ _stext = ABSOLUTE(.);
+ *(.vectors)
+ *(.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
+
+ .bss :
+ {
+ _sbss = ABSOLUTE(.);
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = ABSOLUTE(.);
+ } > sram
+
+ /* Emit the the D3 power domain section for locating BDMA data
+ *
+ * Static data with locate_data(".sram4") will be located
+ * at start of SRAM4; the rest of SRAM4 will be added to the heap.
+ */
+
+ .sram4_reserve (NOLOAD) :
+ {
+ *(.sram4)
+ . = ALIGN(4);
+ _sram4_heap_start = ABSOLUTE(.);
+ } > sram4
+
+ /* Stabs debugging sections. */
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .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/stm32h7/nucleo-h743zi/scripts/flash-nxboot-loader.ld
b/boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-loader.ld
new file mode 100644
index 00000000000..59c8a48c78c
--- /dev/null
+++ b/boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-loader.ld
@@ -0,0 +1,223 @@
+/****************************************************************************
+ * boards/arm/stm32h7/nucleo-h743zi/scripts/flash-nxboot-loader.ld
+ *
+ * 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 <nuttx/config.h>
+
+/* The STM32H743ZI has 2048Kb of main FLASH memory. The flash memory is
+ * partitioned into a User Flash memory and a System Flash memory. Each
+ * of these memories has two banks:
+ *
+ * 1) User Flash memory:
+ *
+ * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb
each
+ * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb
each
+ *
+ * 2) System Flash memory:
+ *
+ * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector
+ * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector
+ *
+ * 3) User option bytes for user configuration, only in Bank 1.
+ *
+ * In the STM32H743ZI, two different boot spaces can be selected through
+ * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and
+ * BOOT_ADD1 option bytes:
+ *
+ * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0].
+ * ST programmed value: Flash memory at 0x0800:0000
+ * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0].
+ * ST programmed value: System bootloader at 0x1FF0:0000
+ *
+ * TODO: Check next paragraph with nucleo schematics
+ *
+ * NuttX does not modify these option bytes. On the unmodified NUCLEO-H743ZI
+ * board, the BOOT0 pin is at ground so by default, the STM32 will boot
+ * to address 0x0800:0000 in FLASH.
+ *
+ * The STM32H743ZI also has 1024Kb of data SRAM.
+ * SRAM is split up into several blocks and into three power domains:
+ *
+ * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with
+ * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus
+ *
+ * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000
+ *
+ * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit
+ * DTCM ports. The DTCM-RAM could be used for critical real-time
+ * data, such as interrupt service routines or stack / heap memory.
+ * Both DTCM-RAMs can be used in parallel (for load/store operations)
+ * thanks to the Cortex-M7 dual issue capability.
+ *
+ * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000
+ *
+ * This RAM is connected to ITCM 64-bit interface designed for
+ * execution of critical real-times routines by the CPU.
+ *
+ * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA
+ * through D1 domain AXI bus matrix
+ *
+ * 2.1) 512Kb of SRAM beginning at address 0x2400:0000
+ *
+ * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA
+ * through D2 domain AHB bus matrix
+ *
+ * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000
+ * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000
+ * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000
+ *
+ * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000
+ *
+ * 4) AHB SRAM (D3 domain) accessible by most of system masters
+ * through D3 domain AHB bus matrix
+ *
+ * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000
+ * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000
+ *
+ * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000
+ * where the code expects to begin execution by jumping to the entry point in
+ * the 0x0800:0000 address range.
+ *
+ * The nxboot bootloader occupies the first 256K of flash (sectors 0-1).
+ * Application image slots begin at 0x08040000.
+ *
+ * Keep the nxboot loader configuration in sync with the fixed board image
+ * layout used by flash-nxboot-app.ld.
+ */
+
+#if CONFIG_STM32_OTA_PRIMARY_SLOT_OFFSET != 0x40000
+# error "CONFIG_STM32_OTA_PRIMARY_SLOT_OFFSET must be 0x40000 for
flash-nxboot-loader.ld"
+#endif
+
+#if CONFIG_STM32_OTA_SLOT_SIZE != 0x80000
+# error "CONFIG_STM32_OTA_SLOT_SIZE must be 0x80000 for
flash-nxboot-loader.ld"
+#endif
+
+#if CONFIG_NXBOOT_HEADER_SIZE != 0x400
+# error "CONFIG_NXBOOT_HEADER_SIZE must be 0x400 for flash-nxboot-loader.ld"
+#endif
+
+MEMORY
+{
+ itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K
+ flash (rx) : ORIGIN = 0x08000000, LENGTH = 256K
+ dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
+ dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K
+ sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K
+ sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K
+ sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K
+ sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K
+ sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K
+ bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K
+}
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+ENTRY(_stext)
+SECTIONS
+{
+ .text :
+ {
+ _stext = ABSOLUTE(.);
+ *(.vectors)
+ *(.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
+
+ .bss :
+ {
+ _sbss = ABSOLUTE(.);
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = ABSOLUTE(.);
+ } > sram
+
+ /* Emit the the D3 power domain section for locating BDMA data
+ *
+ * Static data with locate_data(".sram4") will be located
+ * at start of SRAM4; the rest of SRAM4 will be added to the heap.
+ */
+
+ .sram4_reserve (NOLOAD) :
+ {
+ *(.sram4)
+ . = ALIGN(4);
+ _sram4_heap_start = ABSOLUTE(.);
+ } > sram4
+
+ /* Stabs debugging sections. */
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .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/stm32h7/nucleo-h743zi/src/CMakeLists.txt
b/boards/arm/stm32h7/nucleo-h743zi/src/CMakeLists.txt
index 3d1b736ad4a..280ab93a551 100644
--- a/boards/arm/stm32h7/nucleo-h743zi/src/CMakeLists.txt
+++ b/boards/arm/stm32h7/nucleo-h743zi/src/CMakeLists.txt
@@ -116,9 +116,23 @@ target_sources(board PRIVATE ${SRCS})
if(CONFIG_STM32_APP_FORMAT_MCUBOOT)
if(CONFIG_MCUBOOT_BOOTLOADER)
- set_property(GLOBAL PROPERTY LD_SCRIPT
"${NUTTX_BOARD_DIR}/scripts/flash-mcuboot-loader.ld")
+ set_property(
+ GLOBAL PROPERTY LD_SCRIPT
+ "${NUTTX_BOARD_DIR}/scripts/flash-mcuboot-loader.ld")
else()
- set_property(GLOBAL PROPERTY LD_SCRIPT
"${NUTTX_BOARD_DIR}/scripts/flash-mcuboot-app.ld")
+ set_property(
+ GLOBAL PROPERTY LD_SCRIPT
+ "${NUTTX_BOARD_DIR}/scripts/flash-mcuboot-app.ld")
+ endif()
+elseif(CONFIG_STM32_APP_FORMAT_NXBOOT)
+ if(CONFIG_NXBOOT_BOOTLOADER)
+ set_property(
+ GLOBAL PROPERTY LD_SCRIPT
+ "${NUTTX_BOARD_DIR}/scripts/flash-nxboot-loader.ld")
+ else()
+ set_property(
+ GLOBAL PROPERTY LD_SCRIPT
+ "${NUTTX_BOARD_DIR}/scripts/flash-nxboot-app.ld")
endif()
else()
set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/flash.ld")
@@ -128,5 +142,5 @@ if(NOT CONFIG_BUILD_FLAT)
add_subdirectory(${NUTTX_BOARD_DIR}/kernel)
set_property(
GLOBAL PROPERTY LD_SCRIPT_USER ${NUTTX_BOARD_DIR}/scripts/memory.ld
- ${NUTTX_BOARD_DIR}/scripts/user-space.ld)
+ ${NUTTX_BOARD_DIR}/scripts/user-space.ld)
endif()
diff --git a/boards/arm/stm32h7/nucleo-h743zi/src/stm32_progmem.c
b/boards/arm/stm32h7/nucleo-h743zi/src/stm32_progmem.c
index 96647c4883c..b021079090f 100644
--- a/boards/arm/stm32h7/nucleo-h743zi/src/stm32_progmem.c
+++ b/boards/arm/stm32h7/nucleo-h743zi/src/stm32_progmem.c
@@ -96,6 +96,7 @@ static int init_ota_partitions(void);
static struct mtd_dev_s *g_progmem_mtd;
#if defined(CONFIG_STM32_PROGMEM_OTA_PARTITION)
+
static const struct ota_partition_s g_ota_partition_table[] =
{
{
@@ -108,11 +109,19 @@ static const struct ota_partition_s
g_ota_partition_table[] =
.size = CONFIG_STM32_OTA_SLOT_SIZE,
.devpath = CONFIG_STM32_OTA_SECONDARY_SLOT_DEVPATH
},
+#ifdef CONFIG_STM32_APP_FORMAT_NXBOOT
+ {
+ .offset = CONFIG_STM32_OTA_TERTIARY_SLOT_OFFSET,
+ .size = CONFIG_STM32_OTA_SLOT_SIZE,
+ .devpath = CONFIG_STM32_OTA_TERTIARY_SLOT_DEVPATH
+ }
+#else
{
.offset = CONFIG_STM32_OTA_SCRATCH_OFFSET,
.size = CONFIG_STM32_OTA_SCRATCH_SIZE,
.devpath = CONFIG_STM32_OTA_SCRATCH_DEVPATH
}
+#endif
};
#endif