Hello

I did that and it works in a consumer product with a stm32 since, well, 2018 I think. Also in an open source product.

my board uses a custom linker script that locates the start of the flash a bit farther than the usual start (one stm32 block or 16k IIRC) . Then I compile nuttx as usual.

The bootloader happens to be built by the same process, and all the bootloader code goes into a separate named text section and memory zone. It could be built separately but this is convenient. Only problem is I cant use inline strings for debug because I could not find how to control the section these litteral strings are affected to. So I use global const arrays. ugly but it does the job.

when the boards are manufactured the whole HEX file is flashed, which includes BOTH the bootloader and the initial OS.

After that the board can be updated "over the air".

A python scripts extract the "OS image" from the ELF file and wrap it appropriately, then an update file is built.

Our NuttX then includes some applicative code to retrieve and validate this update file.

The contents are written to SPI flash (via a char driver wrapper to MTD devices to bypass the nuttx FTL)

The board reboots

the bootloader code detects the update in the SPI flash and writes the contents to the STM32 flash.

once complete and verified, the SPI contents is disabled. Else the bootloader can restart the process. We could have emergency serial code to upload an image from the bootloader, but we never had to, this process works fine, we never had bricked boards.

This method prevents updating the bootloader.

So we can ship special OS updates that includes an updated bootloader as a static const.

The nuttx board start code is then able to update the bootloader. We rarely use this feature, only once IIRC.

In our case, the bootloader has to disable the SPI peripheral before booting the OS, else NuttX will find it initialized and will not initialize it correctly.

Our system is rather complex but is also quite failsafe.

Sebastien

Le 21/04/2021 à 20:54, Flavio Castro Alves Filho a écrit :
Hello,

I intend to use a NuttX firmware with a custom bootloader on a
STM32F4DISCOVERY board.

The bootloader will be executed on the first available memory block in
flash, and the firmware will start from the second block - position
0x08020000.

I believe I know what to do regarding linker script.

But I don't know if there is anything to be done directly in NuttX source code.

I ask this because in a standard STM32 firmware using STM32Cube, there
is a FLASH_BASE constant that must be set correctly for the firmware
to work correctly. My worry is if there is something similar in NuttX
for the board.

Best regards,

Flavio

Reply via email to