Other Parts Discussed in Thread: HALCOGEN,
I am using TMS570LS0714 microcontroller and have enabled Flash ECC in Halcogen. ECC generation has been added to the linker file. My application is to load a custom bootloader and the application firmware with ECC on the flash.
The issue I am having is that when Flash ECC is enabled (calling assembly function _coreEnableFlashEcc_();) generates a 'flashErrorReal' error. My question is, can only a section of BANK0 can be set to have flash ECC enabled? What is causing the flashErrorReal abort to trigger?
This is my linker file:
MEMORY
{
VECTORS (X) : origin=0x00000000
length=0x00000020
fill=0xffffffff
BL_MAGIK (X) : origin=(end(VECTORS))
length=0x00000040
vfill=0xffffffff
FLASH_API_LIB (RX) : origin=(0x00040000)
length=0x00000E10
vfill=0xffffffff
FLASH0 (RX) : origin=(end(FLASH_API_LIB))
length=(0x00040000 - size(FLASH_API_LIB))
vfill=0xffffffff
FLASH7 (RX) : origin=0xF0200000
length=0x00010000
vfill=0xffffffff
RAM (RW) : origin=0x08002000
length=0x0001E000
STACKS (RW) : origin=0x08000000
length=0x00002000
/* Flash ECC Section */
// Bank 0 ECC
ECC_VEC (R) : origin=(0xf0400000 + (start(VECTORS) >> 3))
length=(size(VECTORS) >> 3)
ECC={ algorithm=algoR4F021, input_range=VECTORS }
ECC_BL_MAGIK (R) : origin=(0xf0400000 + (start(BL_MAGIK) >> 3))
length=(size(BL_MAGIK) >> 3)
ECC={ algorithm=algoR4F021, input_range=BL_MAGIK }
ECC_FLASH_API (R) : origin=(0xf0400000 + (start(FLASH_API_LIB) >> 3))
length=(size(FLASH_API_LIB) >> 3)
ECC={ algorithm=algoR4F021, input_range=FLASH_API_LIB }
ECC_FLASH0 (R) : origin=(0xf0400000 + (start(FLASH0) >> 3))
length=(size(FLASH0) >> 3)
ECC={ algorithm=algoR4F021, input_range=FLASH0 }
// Bank 7 ECC
ECC_FLA7 (R) : origin=0xF0100000
length=(size(FLASH7) >> 3)
ECC={algorithm=algoR4F021, input_range=FLASH7 }
/* Flash ECC Section */
}
/*----------------------------------------------------------------------------*/
/* Section Configuration */
SECTIONS
{
.intvecs : {} > VECTORS
flashAPI :
{
..\Debug\periphCode\source\Fapi_UserDefinedFunctions.obj (.text)
..\Debug\Code\FlashAPI.obj (.text)
--library= F021_API_CortexR4_BE.lib < FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.SetActiveBank.obj
FlashStateMachine.InitializeFlashBanks.obj
FlashStateMachine.EnableMainSectors.obj
FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.ScaleFclk.obj
Init.obj
Utilities.CalculateEcc.obj
Utilities.WaitDelay.obj
Utilities.CalculateFletcher.obj
Read.MarginByByte.obj
Read.Common.obj
Read.FlushPipeline.obj
Read.WdService.obj
Async.WithAddress.obj
Program.obj > (.text)
} load = FLASH_API_LIB, run = RAM, LOAD_START(af_api_load), RUN_START(af_api_run), SIZE(af_api_size)
.axio_bl_magik : {} > BL_MAGIK
.appl_start : {} > BL_MAGIK
.text : {} > FLASH0
.const : {} > FLASH0
.cinit : {} > FLASH0
.pinit : {} > FLASH0
.stack : {} > STACKS
.bss : {} > RAM
.data : {} > RAM
.sysmem : {} > RAM
FEE_TEXT_SECTION : {} > FLASH0
FEE_CONST_SECTION : {} > FLASH0
FEE_DATA_SECTION : {} > RAM
}
/* ECC Configuration */
ECC
{
algoR4F021 : address_mask = 0x003ffff8 /* Address Bits 21:3 */
hamming_mask = R4 /* Use R4 build in Mask */
parity_mask = 0x0c /* Set which ECC bits are Even and Odd parity */
mirroring = F021 /* RM4x and TMS570LSx are build in F021 */
}
Thank you,
Gustavo Del Valle
MEMORY{ VECTORS (X) : origin=0x00000000 length=0x00000020 fill=0xffffffff
BL_MAGIK (X) : origin=(end(VECTORS)) length=0x00000040 vfill=0xffffffff
FLASH_API_LIB (RX) : origin=(0x00040000) length=0x00000E10 vfill=0xffffffff
FLASH0 (RX) : origin=(end(FLASH_API_LIB)) length=(0x00040000 - size(FLASH_API_LIB)) vfill=0xffffffff
FLASH7 (RX) : origin=0xF0200000 length=0x00010000 vfill=0xffffffff
RAM (RW) : origin=0x08002000 length=0x0001E000
STACKS (RW) : origin=0x08000000 length=0x00002000
/* Flash ECC Section */
// Bank 0 ECC ECC_VEC (R) : origin=(0xf0400000 + (start(VECTORS) >> 3)) length=(size(VECTORS) >> 3) ECC={ algorithm=algoR4F021, input_range=VECTORS }
ECC_BL_MAGIK (R) : origin=(0xf0400000 + (start(BL_MAGIK) >> 3)) length=(size(BL_MAGIK) >> 3) ECC={ algorithm=algoR4F021, input_range=BL_MAGIK }
ECC_FLASH_API (R) : origin=(0xf0400000 + (start(FLASH_API_LIB) >> 3)) length=(size(FLASH_API_LIB) >> 3) ECC={ algorithm=algoR4F021, input_range=FLASH_API_LIB }
ECC_FLASH0 (R) : origin=(0xf0400000 + (start(FLASH0) >> 3)) length=(size(FLASH0) >> 3) ECC={ algorithm=algoR4F021, input_range=FLASH0 }
// Bank 7 ECC ECC_FLA7 (R) : origin=0xF0100000 length=(size(FLASH7) >> 3) ECC={algorithm=algoR4F021, input_range=FLASH7 }
/* Flash ECC Section */
}
/*----------------------------------------------------------------------------*//* Section Configuration */
SECTIONS{ .intvecs : {} > VECTORS
flashAPI : { ..\Debug\periphCode\source\Fapi_UserDefinedFunctions.obj (.text) ..\Debug\Code\FlashAPI.obj (.text)
--library= F021_API_CortexR4_BE.lib < FlashStateMachine.IssueFsmCommand.obj FlashStateMachine.SetActiveBank.obj FlashStateMachine.InitializeFlashBanks.obj FlashStateMachine.EnableMainSectors.obj FlashStateMachine.IssueFsmCommand.obj FlashStateMachine.ScaleFclk.obj Init.obj Utilities.CalculateEcc.obj Utilities.WaitDelay.obj Utilities.CalculateFletcher.obj Read.MarginByByte.obj Read.Common.obj Read.FlushPipeline.obj Read.WdService.obj Async.WithAddress.obj Program.obj > (.text)
} load = FLASH_API_LIB, run = RAM, LOAD_START(af_api_load), RUN_START(af_api_run), SIZE(af_api_size)
.axio_bl_magik : {} > BL_MAGIK .appl_start : {} > BL_MAGIK
.text : {} > FLASH0 .const : {} > FLASH0 .cinit : {} > FLASH0 .pinit : {} > FLASH0
.stack : {} > STACKS .bss : {} > RAM .data : {} > RAM .sysmem : {} > RAM
FEE_TEXT_SECTION : {} > FLASH0 FEE_CONST_SECTION : {} > FLASH0 FEE_DATA_SECTION : {} > RAM}
/* ECC Configuration */ECC{ algoR4F021 : address_mask = 0x003ffff8 /* Address Bits 21:3 */ hamming_mask = R4 /* Use R4 build in Mask */ parity_mask = 0x0c /* Set which ECC bits are Even and Odd parity */ mirroring = F021 /* RM4x and TMS570LSx are build in F021 */}