S32K3 sharing data between Bootloader and Application

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

S32K3 sharing data between Bootloader and Application

ソリューションへジャンプ
3,350件の閲覧回数
HemantKapoor
Contributor II

Hello, 

 

Another Bootloader and application question.... How do I share data between bootloader and application.

I am using S32DS to build my application and have tried following "unified_bootloader_Demo_V2.0" as a reference.

My linker file looks as 

MEMORY 
{         
    int_flash                : ORIGIN = 0x00410400, LENGTH = 0x0007FC00     /* 511K - 176K (sBAF + HSE)*/
    int_itcm                 : ORIGIN = 0x00000000, LENGTH = 0x00010000    /* 32K */
    int_dtcm                 : ORIGIN = 0x20000000, LENGTH = 0x00020000    /* 64K */
    int_sram                 : ORIGIN = 0x20400000, LENGTH = 0x0002DF00    /* 183.9K */
    int_sram_fls_rsv         : ORIGIN = 0x2042DF00, LENGTH = 0x00000100    /* 0.1K */
    int_sram_stack_c0        : ORIGIN = 0x2042E000, LENGTH = 0x00001000    /* 4KB  */
    int_sram_stack_c1        : ORIGIN = 0x2042F000, LENGTH = 0x00001000    /* 4KB  */
    int_sram_no_cacheable    : ORIGIN = 0x20430000, LENGTH = 0x0000FF00    /* 64KB, needs to include int_results  */
    int_sram_results         : ORIGIN = 0x2043FF00, LENGTH = 0x00000100
    int_sram_shareable       : ORIGIN = 0x20440000, LENGTH = 0x00004000-0x80  /* 16KB */
    ram_rsvd2                : ORIGIN = 0x20443F80, LENGTH = 0                /* End of SRAM */
    ram_boot_apploader_share : ORIGIN = 0x20443F80, LENGTH = 0x00000080		  /* Reserve 128 bytes */
}

 When I try to write data in bootloader

*(uint32_t*) 0x20443F80 = DataToShare;

 

it throws hard fault.

 

Can you please let me know what I am missing.

 

The "unified_bootloader_Demo_V2.0" seems to do something similar but it writes to  0x20443F80 + 14.

 

 

0 件の賞賛
返信
1 解決策
3,205件の閲覧回数
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi Hemant,

I found this function in file boot_Cfg.c:

/*when power on, clear all flag in RAM for ECC.*/
void Boot_PowerONClearAllFlag(void)
{
uint16 infoCrc = 0u;
uint8 index = 0u;

/*clear RAM with 4 bytes for ECC*/
for(index = 0u; index < (gs_stBootInfo.infoDataLen >> 2u); index++)
{
*((uint32 *)gs_stBootInfo.infoStartAddr + index) = 0u;
}

infoCrc = Boot_CalculateInfoCRC();
SetInforCRC(infoCrc);
}

 

So, this piece of memory is initialized only when needed - after power on reset.

However, I think that it is not correct because RAM needs to be initialized by 64bit write as mentioned in the reference manual. I have already contacted authors of the unified bootloader if they can fix it.

To initialize this piece of RAM, you can use something like (just copied from startup files, modify it as needed):

/* Initialize STANDBY RAM if chip comes from POR */
if (MC_RGM->DES & MC_RGM_DES_F_POR_MASK)
{
/* Initialize STANDBY RAM */
cnt = (( uint32_t)(&__STDBYRAM_SIZE)) / 8U;
pDest = (uint64_t *)(&__STDBYRAM_START);
while (cnt--)
{
*pDest = (uint64_t)0xDEADBEEFCAFEFEEDULL;
pDest++;
}
MC_RGM->DES = MC_RGM_DES_F_POR_MASK; /* Write 1 to clear F_POR */

I can see that the access is translated to use STRD instruction which should generate 64bit write.

Regards,

Lukas

 

 

 

元の投稿で解決策を見る

0 件の賞賛
返信
6 返答(返信)
3,231件の閲覧回数
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi @HemantKapoor 

I guess it's caused by ECC error because the SRAM is not initialized. The unified bootloader uses this code for SRAM initialization:

RamInit:
/* Initialize SRAM ECC */
ldr r0, =__RAM_INIT
cmp r0, 0
/* Skip if __SRAM_INIT is not set */
beq SRAM_LOOP_END
ldr r1, =__INT_SRAM_START
ldr r2, =__INT_SRAM_END

subs r2, r1
subs r2, #1
ble SRAM_LOOP_END

movs r0, 0
movs r3, 0
SRAM_LOOP:
stm r1!, {r0,r3}
subs r2, 8
bge SRAM_LOOP
SRAM_LOOP_END:


Values __INT_SRAM_START and __INT_SRAM_END are defined like this in the linker file:


__INT_SRAM_START = ORIGIN(int_sram);
__INT_SRAM_END = ORIGIN(ram_rsvd2);

But you added your segment after the ram_rscd2:

ram_rsvd2 : ORIGIN = 0x20443F80, LENGTH = 0 /* End of SRAM */
ram_boot_apploader_share : ORIGIN = 0x20443F80, LENGTH = 0x00000080 /* Reserve 128 bytes */
}


So, it's not touched by this SRAM initialization. You need to initialize also this piece of memory.

Regards,

Lukas

0 件の賞賛
返信
1,021件の閲覧回数
zq1
Contributor III

hello, there is a  question to be wroked out , i want to know ,in S32K312 's link file , if i want to set a flag which is used for app vaild flag   in ram ,and after soft reset,the flag will not clear , i must set the flag in  the standby ram or not?  in demo called unified_bootloader_demo_v2.1 ,i found  the flag was set in the lastest section as blew:

zq1_0-1711090569086.pngzq1_1-1711090620877.png

hope your reply ,thank you very much.

0 件の賞賛
返信
3,221件の閲覧回数
HemantKapoor
Contributor II

Hello Lukas,

 

Many thanks for the response.

I followed the unified bootloader linker file usage and it is also doing something similar,

 

ram_rsvd2 : ORIGIN = 0x20443FF0, LENGTH = 0 /* End of SRAM */
ExchangeInfo : ORIGIN = 0x20443FF0, LENGTH = 0x00000010

 

So not sure what I have missed.

 

Regards,

Hemant Kapoor

0 件の賞賛
返信
3,206件の閲覧回数
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi Hemant,

I found this function in file boot_Cfg.c:

/*when power on, clear all flag in RAM for ECC.*/
void Boot_PowerONClearAllFlag(void)
{
uint16 infoCrc = 0u;
uint8 index = 0u;

/*clear RAM with 4 bytes for ECC*/
for(index = 0u; index < (gs_stBootInfo.infoDataLen >> 2u); index++)
{
*((uint32 *)gs_stBootInfo.infoStartAddr + index) = 0u;
}

infoCrc = Boot_CalculateInfoCRC();
SetInforCRC(infoCrc);
}

 

So, this piece of memory is initialized only when needed - after power on reset.

However, I think that it is not correct because RAM needs to be initialized by 64bit write as mentioned in the reference manual. I have already contacted authors of the unified bootloader if they can fix it.

To initialize this piece of RAM, you can use something like (just copied from startup files, modify it as needed):

/* Initialize STANDBY RAM if chip comes from POR */
if (MC_RGM->DES & MC_RGM_DES_F_POR_MASK)
{
/* Initialize STANDBY RAM */
cnt = (( uint32_t)(&__STDBYRAM_SIZE)) / 8U;
pDest = (uint64_t *)(&__STDBYRAM_START);
while (cnt--)
{
*pDest = (uint64_t)0xDEADBEEFCAFEFEEDULL;
pDest++;
}
MC_RGM->DES = MC_RGM_DES_F_POR_MASK; /* Write 1 to clear F_POR */

I can see that the access is translated to use STRD instruction which should generate 64bit write.

Regards,

Lukas

 

 

 

0 件の賞賛
返信
3,105件の閲覧回数
HemantKapoor
Contributor II

Hello Lukas,

 

Your solution worked like a charm.

 

Thanks a ton.

0 件の賞賛
返信
3,335件の閲覧回数
HemantKapoor
Contributor II

 

The hard fault is die to IMPRECISERR and my best guess is that I have limited the int_sram_shareable to 0x00004000-0x80 so somehow RAM region from 0x20443F80 got inaccessible.

 

I don't see how ""unified_bootloader_Demo_V2.0"" is getting away with this.

0 件の賞賛
返信