TIDUEY4D August 2022 – December 2022
Where remapping of Flash banks is not available, each Flash bank is mapped to a fixed memory address. During LFU, the firmware executable is programmed to the Flash bank that is currently inactive, while the application continues to run from the Flash bank that is currently active. With this approach, the user needs to be aware of which Flash bank their firmware executable is targeted for. Thus, they need to maintain 2 linker command files for their project (if they are using 2 Flash banks). This can be cumbersome, so an alternate solution is proposed and implemented here.
In this approach, the firmware executable is always built to be Loaded to Flash Bank1 and Run from Flash Bank0. This can be done with just one linker command file. Similar to how functions in an application are Loaded to Flash and Run from RAM for performance improvement, a memory copy is needed here as well. This is implemented in the LFU bootloader i.e. Flash kernel. The Flash Bank1 to Bank0 memory copy takes about 1 second to complete.
As mentioned before, this example can be used as a reference for FOTA, with a few functional features not implemented:
Rollback – to support a rollback, a copy needs to be done from Flash Bank0 to Bank2, prior to the Bank1 to Bank0 copy. This can done exactly along the lines of the Bank1 to Bank0 copy illustrated in the Flash kernel.
Reset – this example does not implement a full device reset after the Bank1 to Bank0 copy. That is how FOTA would work. In this example, once the memory copy is complete, the Flash kernel directly branches to the entry point of the application, where c_int00 is called and then main().