I am trying to use the Swap Control Command as used in AN4533 from an Uninitialized State.
/* Report current swap state */
ret = PFlashSwapCtl(pSSDConfig,addr,FTFx_SWAP_REPORT_STATUS,¤tSwapMode, \
¤tSwapBlockStatus, &nextSwapBlockStatus ,pFlashCommandSequence);
ret = FTFx_OK
currentSwapMode = 0x00 (Uninitialized)
currentSwapBlockStatus = 0x00 (Block 0 at 0x0_0000)
nextSwapBlockStatus = 0x00 (Block 0 at 0x0_0000)
Which that is all fine with me.
Next I go into this in PFlashSwap.c:
/* If current swap mode is Uninitialized */
if (FTFx_SWAP_UNINIT == currentSwapMode)
/* Initialize Swap to Initialized/READY state */
ret = PFlashSwapCtl(pSSDConfig, addr, FTFx_SWAP_SET_INDICATOR_ADDR,¤tSwapMode, \
¤tSwapBlockStatus, &nextSwapBlockStatus , pFlashCommandSequence);
This time I am Initializing the Swap System to UPDATE-ERASED, but this where I run into problems.
I get back
ret = FTFx_ERR_ACCERR
Based on the FTFE Chapter in my manual, there are 4 errors I could be having.
- Command not available in current mode/security
- Flash Address is not in the lower half of program flash memory
- Flash address is in the Flash Configuration Field
- Flash address is not 128-bit aligned
I'm not sure what my problem is, but I'll throw in some snippets of information that might help.
Memory Segments in my linker file
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_interrupts_ram (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00000400
m_text (RX) : ORIGIN = 0x00002000, LENGTH = 0x0007E000
m_data (RW) : ORIGIN = 0x1FFF0400, LENGTH = 0x0000FC00
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00030000
m_swap (RX) : ORIGIN = 0x00001000, LENGTH = 0x00001000
I added a separate section called m_swap to hold my SWAP_INDICATOR.
That block is 128 bit or double phrase aligned.
#define FLASH_SWAP_INDICATOR_ADDR 0x1000 //!<Address for the Flash Swap Indicator
#define LAUNCH_CMD_SIZE 0x600
#define CALLBACK_SIZE 0x100
Also, I have defined the address for the swap indicator address.
I went a little overboard on the Ram size for the Launch Command Size, but I checked my map file and found out I needed more room.
flash1_InitConfig0.CallBack = (PCALLBACK)RelocateFunction((uint32_t)ramForCallback , CALLBACK_SIZE , (uint32_t)flash_callback);
flashLaunchCommand = (pFLASHCOMMANDSEQUENCE)RelocateFunction((uint32_t)ramFunctions, LAUNCH_CMD_SIZE, (uint32_t)FlashCommandSequence);
Putting the functions into RAM.
I manually removed program flash protection in debug and I still error out.
I think I am having trouble with either 1 or 3.
I am using KSDK 1.3.0 and FreeRTOS on a K24.
Any ideas would be appreciated.