How to boot from flash (S32V234 A53)?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to boot from flash (S32V234 A53)?

1,618 Views
sunghwanpark
Contributor II

Dear.

I am now trying to boot from Flash in the S32V234 A53 project.
By the way, I have a question in the built-in source, so please contact me and give me your answer.

First, I set up S32 Design Studio as follows.
1. Generate S32V234 A53 (Single) project

2. Modify for Flash booting.

  (1) Change from S32V_CA53_ram.ld --> S32V_CA53_flash.ld

      - Properties -> C/C++ Build -> Setting -> Standard S32DS C Linker -> General

      - Then, all options are : -nostdlib -T "D:\40.NXP\DS\A53\IVT\S32V234_Flash\S32V234_Flash_A53_1/Project_Settings/Linker_Files/S32V_CA53_flash.ld" -Wl,-Map,"S32V234_Flash_A53_1.map" -Xlinker --gc-sections -march=armv8-a -mcpu=cortex-a53 -mtune=cortex-a53

  (2) Include "S32V_CA53_flash.ld" file and Exclude Include "S32V_CA53_ram.ld" file 

      - Properties fo flash_config.c -> C/C++ Build -> Settings -> Uncheck and Check "Exclude resource from build"

  (3) Include "flash_config.c" file

      - Properties fo flash_config.c -> C/C++ Build -> Settings -> Uncheck "Exclude resource from build"

  (4) Add START_FROM_FLASH

      - Properties -> C/C++ Build -> Setting -> Standard S32DS Assembler -> Symbols -> Add

      - Then, all options are : -c -I"D:\40.NXP\DS\A53\IVT\S32V234_Flash\S32V234_Flash_A53_1/include" -x assembler-with-cpp -DSTART_FROM_FLASH -O0 -g3 -mcpu=cortex-a53

After building project, I found some strange parts in data_init.c which has in charge of copying data from ROM to RAM.

The _DATA_ROM is the same value with _DATA_END in map file result from build.

In this case, copying data from ROM to RAM is whether or not that's possible as below because n equals 0(zero).

-----------------------------------------------------------------------------

    data_rom = (uint8_t *)__DATA_ROM;
    data_rom_end  = (uint8_t *)__DATA_END;
    n = data_rom_end - data_rom;

    /* Copy initialized data from ROM to RAM */
    while (n--)
    {
        *data_ram++ = *data_rom++;
    }

--------------------------------------------------------------------------------

I copied map file contents because I couldn't attach.

Please let me know how to boot or whether there are any further modification with S32V234 A53 with Design Studio.

Thanks,

Dylan Park.

<< Map File Contents >>

Memory Configuration

Name             Origin             Length             Attributes
FLASH_CONFIG     0x0000000020000200 0x0000000000000140
FLASH_APP_HDR    0x0000000020001000 0x0000000000000040
FLASH_BOOT_DATA  0x0000000020001040 0x0000000000000010
FLASH_DCD        0x0000000020001054 0x0000000000000030
VECTOR_TABLE     0x0000000020001400 0x0000000000000800
FLASH_STARTUP    0x0000000020010000 0x0000000000010000
FLASH            0x0000000020020000 0x0000000001fe0000
SRAM             0x000000003e800000 0x0000000000100000
*default*        0x0000000000000000 0xffffffffffffffff

Linker script and memory map

LOAD ./src/main.o
LOAD ./Project_Settings/Startup_Code/startup_S32V_CA53.o
LOAD ./Project_Settings/Startup_Code/mmap.o
LOAD ./Project_Settings/Startup_Code/flash_config.o
LOAD ./Project_Settings/Startup_Code/data_init.o
LOAD c:/nxp/s32ds_arm_v2018.r1/cross_tools/gcc-aarch64-elf-4_9/bin/../aarch64-elf/libc/usr/lib\libc.a
LOAD c:/nxp/s32ds_arm_v2018.r1/cross_tools/gcc-aarch64-elf-4_9/bin/../aarch64-elf/libc/usr/lib\librdimon.a
                0x0000000000001000                STACK_SIZE = DEFINED (__stack_size__)?__stack_size__:0x1000
                0x0000000000001000                HEAP_SIZE = DEFINED (__heap_size__)?__heap_size__:0x1000

.QSPIFlashConfig
                0x0000000020000200      0x140
 *(.QSPIFlashConfig)
 .QSPIFlashConfig
                0x0000000020000200      0x140 ./Project_Settings/Startup_Code/flash_config.o
                0x0000000020000200                config_param

.flash_app_hdr  0x0000000020001000       0x28
 *(.flash_app_hdr)
 .flash_app_hdr
                0x0000000020001000       0x28 ./Project_Settings/Startup_Code/flash_config.o
                0x0000000020001000                start_app

.flash_boot_data
                0x0000000020001040       0x10
 *(.flash_boot_data)
 .flash_boot_data
                0x0000000020001040       0x10 ./Project_Settings/Startup_Code/flash_config.o
                0x0000000020001040                boot_data

.flash_dcd
 *(.flash_dcd)

.startup        0x0000000020010000    0x10000
 *(.startup)
 .startup       0x0000000020010000    0x10000 ./Project_Settings/Startup_Code/startup_S32V_CA53.o
                0x0000000020010000                __startup
                0x0000000020010214                _exit
                0x0000000020010218                _kill
                0x000000002001021c                write_ttbr0_el3
                0x0000000020010224                write_tcr_el3
                0x000000002001022c                write_sctlr_el3
                0x0000000020010234                write_mair_el3
                0x000000002001023c                tlbialle3
                0x000000002001024c                read_sctlr_el3
                0x0000000020010254                flush_dcache_range
                0x0000000020010288                flush_icache_range
                0x00000000200102bc                IRQ_NUMBER
                0x0000000020010300                TCR_EL3_SETUP

.text           0x0000000020020000      0x104
 *(.text)
 *(.text*)
 .text.main     0x0000000020020000       0x28 ./src/main.o
                0x0000000020020000                main
 .text.init_data
                0x0000000020020028       0xb8 ./Project_Settings/Startup_Code/data_init.o
                0x0000000020020028                init_data
 *(.rodata)
 *(.rodata*)
 *(.eh_frame)
 *(.syscall*)
 *(.secinfo*)
 *(.interp*)
 *(.note*)
 .note.gnu.build-id
                0x00000000200200e0       0x24 linker stubs
 *(.gnu.version)
 *(.gnu.version_r)
 *(.dynstr*)
 *(.dynsym*)
 *(.dynamic*)
 *(.hash*)
 *(.eh_frame*)
 *(.rela*)
 .rela.iplt     0x0000000000000000        0x0 ./Project_Settings/Startup_Code/startup_S32V_CA53.o
 *(.got*)
 *(.jcr*)
 *(.gcc_except_table*)

.iplt           0x0000000020020104        0x0
 .iplt          0x0000000000000000        0x0 ./Project_Settings/Startup_Code/startup_S32V_CA53.o

.init_array     0x0000000020020104        0xc
                0x0000000020020110                . = ALIGN (0x10)
 *fill*         0x0000000020020104        0xc Whether or not that's possible

                0x0000000020020110                __init_array_start = .
 *(.init_array*)
                0x0000000020020110                __init_array_end = .

.fini_array
 *(.fini_array*)
                0x0000000020020110                __DATA_ROM = .

.sdabase        0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
 *(.sdabase*)

.sdata          0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
 *(.sdata*)

.sdata2         0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
 *(.sdata2*)

.sbss           0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
 *(.sbss*)

.data           0x000000003e800000        0x0 load address 0x0000000020020110
                0x000000003e800000                . = ALIGN (0x10)
                0x000000003e800000                __DATA_RAM = .
                0x000000003e800000                __data_start__ = .
 *(.data*)
                0x000000003e800000                __data_end__ = .
                0x0000000020020110                __DATA_END = (__DATA_ROM + (__data_end__ - __data_start__))

.igot.plt       0x000000003e800000        0x0
 .igot.plt      0x0000000000000000        0x0 ./Project_Settings/Startup_Code/startup_S32V_CA53.o

.bss            0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
                0x000000003e800000                _BSS_BEGIN = .
                0x000000003e800000                __bss_start__ = .
 *(.bss*)
 *(COMMON)
                0x000000003e800000                __bss_end__ = .
                0x000000003e800000                _BSS_END = .

.xlat_table     0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
 *(.xlat_table*)

.note.gnu.build-id
                0x000000003e800000        0x0
                0x000000003e800000                . = ALIGN (0x10)
 *(.note.gnu.build-id*)

.heap           0x000000003e800000     0x1000
                0x000000003e800000                . = ALIGN (0x8)
                0x000000003e800000                end = .
                0x000000003e801000                . = (. + HEAP_SIZE)
 *fill*         0x000000003e800000     0x1000

.stack          0x000000003e801000     0x1000
                0x000000003e801000                . = ALIGN (0x8)
                0x000000003e802000                . = (. + STACK_SIZE)
 *fill*         0x000000003e801000     0x1000
                0x000000003e802000                __SP_INIT = .
                0x000000003e800000                __SRAM_START_ADDRESS__ = ORIGIN (SRAM)
                0x0000000000100000                __RAM_SIZE__ = 0x100000
OUTPUT(S32V234_Flash_A53_1.elf elf64-littleaarch64)

0 Kudos
4 Replies

1,201 Views
jiri_kral
NXP Employee
NXP Employee

Hi, 

this is how initialization of data is performed. For example if you define int x=5; you need to store somewhere the 5 number in flash and copy it from FLASH to RAM Variable x. 

In your particular case you can see that the size of initialized data is 0 (the address range is 0x3E800000-0x3E800000) and technically init is not performed. 

Hope it helps. 

Jiri 

0 Kudos

1,201 Views
sunghwanpark
Contributor II
Dear Jiri.
Thanks for your support.
You are right.
I thought there was at least one global variable in the default source, but it did not have any variables to store in the data area as I checked the source.
I have another question as below.
Is the Flash Boot source code of S32V234 A53 created by Design Studio basically for XIP?
Why I got this idea is that I could not find a definition for copying from ROM to RAM in a LD (LinkerDirective) file.
Ex)
.data:> RAM_memory_block
.ROM.data ROM (.data):> ROM_memory_block
0 Kudos

1,201 Views
jiri_kral
NXP Employee
NXP Employee

Hi, 

yes, by default is executable build as execute in place. Anyway, S32V234 is pretty complex device and is good idea consider using linux on it. There is already Linux image for S32V234 - https://community.nxp.com/docs/DOC-335023 

But I'm not sure what is your EVB. 

Jiri 

0 Kudos

1,201 Views
sunghwanpark
Contributor II

Dear Jiri.

Thanks for your support.

I have the EVB S32V234 SCH-28889 EVB.

I'd already confirmed Flash Boot using Linux(u-boot) with reference to the User Manual.

However, I just want to use the Design Studio to generate the boot code and application code, and test it to behave in a non-XIP fashion (copy it to RAM).

0 Kudos