Here is my problem summary:
I’m trying to use the “Software Boot Configuration” defined in 25.4.4.4 in the TRM, to transfer the ROM boot from using the strapped sys.boot (to a NAND flash) to boot to an SD card (on MMC1) after a software reset. What I am finding is that:
- After the software reset the ROM bootloader is not executing with a cold reset.
- The ROM bootloader is not finding my Software Boot Configuration previously configured in the internal memory.
Here is my background information.
The issue is we have an OMAP3503 on a board that has both a NAND flash and an MMC/SD card (connected to MMC1). The sys.boot pins are strapped to boot from NAND flash. This client has had issues with reliability on the NAND flash. Even after we supported them with ECC on the flash and periodic scrubbing of the NAND flash they are still seeing too many field failures.
Originally the x-loader, U-boot and Linux kernel was stored in NAND ( There was also a boot strap kernel and root file system in the NAND flash). The primary root file system was on the SD card to facilitate upgrades.
They have asked us to change the bootloader to minimize the amount of code/data in NAND flash. My approach was move all of the data/images to the SD card except what I term a NAND boot redirect program that will still be in NAND flash.
I have first had a board moded to allow me to select the sys.boot setting through a set of switches. I have verified that when the sys.boot is set for a SD boot (with my formatted SD card) it will boot an x-loader successfully.
My issue is in the NAND redirect program.
I created a stripped down program of an x-loader. It still performs the nominal x-loader config as before, however afterwards in the start_armboot() function (board.c attached) I take a reserved copy of internal memory and configure a structure for the “Software Boot Config” (section 25.4.4.4 in TRM) and then update the pointer in scratch memory on the OMAP. I then issue a software reset.
It would boot into NAND correctly the first time. But after I configured the System Boot Config it booted into NAND flash again. It would keep doing this cycle indefinitely.
I have the output of this program (listed below) that shows the tracing of the ROM bootloader and the system reset status over the cold boot and then the software reset.
Notice on the first execution the Software Boot Config is not initialized (its initialized after this output). The reset status is a cold reset (POR) as expected. The tracing of the first ROM execution is as expected also. The pointer in scratch memory was also garbage before I initialized it.
On the second boot the Software Boot Config is correct (read from the internal memory). The pointer to Software Boot Config in scratch memory also points to my expected internal RAM address. According to the ROM bootloader tracing after the reset its stating the following:
- It was not executed after a cold reset.
- It did not verify my Software Boot Config booting section.
Texas Instruments X-Loader 1.4.3 (Apr 30 2013 - 12:29:39)
Reset Status = 0x1
SoftBootConfig U32 1 0x4430f88c
SoftBootConfig U32 2 0xb7902d81
SoftBootConfig U32 3 0x28a63869
SoftBootConfig U32 4 0x0fd5c989
SoftBootConfig U32 5 0x0dc4c10a
Sys Boot Pin Values = 0x3b
Current Trace word 1 = 0x0045085f
Current Trace word 2 = 0x00020004
Current copy of PRM_RSTST = 0x00000001
Cold reset trace word 1 = 0x00000000
Cold reset trace word 2 = 0x00000000
Software Boot Config Pointer = 0x8ec7dae1
Current Boot = 0
Texas Instruments X-Loader 1.4.3 (Apr 30 2013 - 12:29:39)
Reset Status = 0x2
SoftBootConfig U32 1 0xcf00aa01
SoftBootConfig U32 2 0x0000000c
SoftBootConfig U32 3 0x00060000
SoftBootConfig U32 4 0x00060006
SoftBootConfig U32 5 0x0dc40006
Sys Boot Pin Values = 0x3b
Current Trace word 1 = 0x0040081b
Current Trace word 2 = 0x00020004
Current copy of PRM_RSTST = 0x00000002
Cold reset trace word 1 = 0x0045085f
Cold reset trace word 2 = 0x00020004
Software Boot Config Pointer = 0x4020ef00
Current Boot = 1