#! armclang --target=arm-arm-none-eabi -march=armv7-m -E -x c

#include "zephyr/include/generated/autoconf.h"
#include "zephyr/include/generated/offsets.h"

#define ROM_ADDR	(CONFIG_FLASH_BASE_ADDRESS + CONFIG_FLASH_LOAD_OFFSET)
#define ROM_SIZE	(CONFIG_FLASH_SIZE * 1024)

#ifndef CONFIG_SENSOR_RAM_SIZE
#define CONFIG_SENSOR_RAM_SIZE 0
#endif

#ifndef CONFIG_SENSOR_RAM_CODE_SIZE
#define CONFIG_SENSOR_RAM_CODE_SIZE 0
#endif

#define SRAM_DATA_SIZE	AlignExpr(ImageLength(ER_SRAM_DATA),1024)
#define CODE_RAM_SIZE	(CONFIG_SENSOR_RAM_CODE_SIZE * 1024)

#define RAM_SIZE	(CONFIG_SRAM_SIZE  * 1024 - SRAM_DATA_SIZE - CODE_RAM_SIZE - CONFIG_SENSOR_RAM_SIZE * 1024)

#define SRAM_DATA_ADDR	(CONFIG_SRAM_BASE_ADDRESS)
#define RAM_ADDR	(SRAM_DATA_ADDR + SRAM_DATA_SIZE)
#define CODE_RAM_ADDR	(RAM_ADDR + RAM_SIZE)

#define SHARE_RAM_ADDR		0x2FF1A600
#define SHARE_RAM_SIZE		0x5900

#define PSRAM_SIZE (CONFIG_PSRAM_SIZE * 1024)
#define PSRAM_ADDR CONFIG_PSRAM_BASE_ADDRESS

#define INIT_STATUS_SIZE	(((((ImageLimit(ER_DEVICE_SMPX) - ImageBase(ER_DEVICE_PRE_KERNEL_1)) / _DEVICE_STRUCT_SIZEOF) + 31) / 32) * 4)
#define DEVICE_BUSY_SIZE	(((((ImageLimit(ER_DEVICE_SMPX) - ImageBase(ER_DEVICE_PRE_KERNEL_1)) / _DEVICE_STRUCT_SIZEOF) + 31) / 32) * 4)

LR1 ROM_ADDR ROM_SIZE  {    ; load region 1

    ER_HEADER ROM_ADDR  EMPTY CONFIG_ROM_START_OFFSET {

    }

    ER_VECTOR ROM_ADDR+CONFIG_ROM_START_OFFSET  FIXED {
        * (.exc_vector_table)
        * (.exc_vector_table.*)
        * (.gnu.linkonce.irq_vector_table)
        * (.vectors)
    }

#ifdef CONFIG_HR_ROM_BASE
    ER_HR_BIN CONFIG_HR_ROM_BASE FIXED {
        * (.hr_rom)
    }
#endif
#ifdef CONFIG_SENSOR_ROM_BASE
    ER_SENSOR_BIN CONFIG_SENSOR_ROM_BASE FIXED {
        * (.sensor_rom)
    }
#endif
#ifdef CONFIG_SENSOR_SLEEP_ROM_BASE
    ER_SENSOR_SLEEP_BIN CONFIG_SENSOR_SLEEP_ROM_BASE FIXED {
        * (.sensor_sleep_rom)
    }
#endif

    ER_APP_ENTRY +0 {
        * (.app_entry)
    }
    ER_SRV_ENTRY +0 {
        * (.service_entry)
    }
    ER_VIEW_ENTRY +0 {
        * (.view_entry)
    }
    ER_TEXT +0 {
        * (.text)
        * (.text.*)
        * (.gnu.linkonce.t.*)
        * (.glue_7t)
        * (.glue_7)
        * (.vfp11_veneer)
        * (.v4_bx)
        .ANY (+RO-CODE)
    }
    ER_ARM_EXTAB +0 {
        *(.ARM.extab*)
        *(gnu.linkonce.armextab.*)
    }
    ER_ARM_EXIDX +0 {
        *(.ARM.exidx*)
        *(gnu.linkonce.armexidx.*)
    }
    ER_INIT_PRE_KERNEL_1 +0 SORTTYPE Lexical {
        * (.z_init_PRE_KERNEL_1?_ )
    }
    ER_INIT_PRE_KERNEL_1X +0 SORTTYPE Lexical {
        * (.z_init_PRE_KERNEL_1??_ )
    }
    ER_INIT_PRE_KERNEL_2 +0 SORTTYPE Lexical {
        * (.z_init_PRE_KERNEL_2?_ )
    }
    ER_INIT_PRE_KERNEL_2X +0 SORTTYPE Lexical {
        * (.z_init_PRE_KERNEL_2??_ )
    }
    ER_INIT_POST_KERNEL +0 SORTTYPE Lexical {
        * (.z_init_POST_KERNEL?_ )
    }
    ER_INIT_POST_KERNELX +0 SORTTYPE Lexical {
        * (.z_init_POST_KERNEL??_ )
    }
    ER_INIT_APPLICATION +0 SORTTYPE Lexical {
        * (.z_init_APPLICATION?_ )
    }
    ER_INIT_APPLICATIONX +0 SORTTYPE Lexical {
        * (.z_init_APPLICATION??_ )
    }
    ER_INIT_SMP +0 SORTTYPE Lexical {
        * (.z_init_SMP?_ )
    }
    ER_INIT_SMPX +0 SORTTYPE Lexical {
        * (.z_init_SMP??_ )
    }
    ER_INIT_ERROR +0 SORTTYPE Lexical {
        * (.z_init_?*)
    }
    ER_DEVICE_PRE_KERNEL_1 +0 SORTTYPE Lexical {
        * (.z_device_PRE_KERNEL_1?_ )
    }
    ER_DEVICE_PRE_KERNEL_1X +0 SORTTYPE Lexical {
        * (.z_device_PRE_KERNEL_1??_ )
    }
    ER_DEVICE_PRE_KERNEL_2 +0 SORTTYPE Lexical {
        * (.z_device_PRE_KERNEL_2?_ )
    }
    ER_DEVICE_PRE_KERNEL_2X +0 SORTTYPE Lexical {
        * (.z_device_PRE_KERNEL_2??_ )
    }
    ER_DEVICE_POST_KERNEL +0 SORTTYPE Lexical {
        * (.z_device_POST_KERNEL?_ )
    }
    ER_DEVICE_POST_KERNELX +0 SORTTYPE Lexical {
        * (.z_device_POST_KERNEL??_ )
    }
    ER_DEVICE_APPLICATION +0 SORTTYPE Lexical {
        * (.z_device_APPLICATION?_ )
    }
    ER_DEVICE_APPLICATIONX +0 SORTTYPE Lexical {
        * (.z_device_APPLICATION??_ )
    }
    ER_DEVICE_SMP +0 SORTTYPE Lexical {
        * (.z_device_SMP? )
    }
    ER_DEVICE_SMPX +0 SORTTYPE Lexical {
        * (.z_device_SMP?? )
    }
    ER_APP_SHMEM +0 SORTTYPE Lexical {
        * (.app_regions.*)
    }
    ER_NET_12 +0 SORTTYPE Lexical {
        * (.net_l2.init)
        * (.net_l2.init*)
    }
    ER_BT_CHANNELS +0 SORTTYPE Lexical ALIGNALL 4 {
        * (._bt_l2cap_fixed_chan.static.*)
    }
    ER_BT_BR_CHANNELS +0 SORTTYPE Lexical ALIGNALL 4 {
        * (._bt_l2cap_br_fixed_chan.static.*)
    }
    ER_BT_SERVICES +0 SORTTYPE Lexical ALIGNALL 4 {
        * (._bt_gatt_service_static.static.*)
    }
    ER_LOG_CONST +0 SORTTYPE Lexical {
        * (.log_const_*)
    }
    ER_LOG_BACKENDS +0 SORTTYPE Lexical {
        * (._log_backend.*)
    }
    ER_SHELL +0 SORTTYPE Lexical {
        * (._shell.static.*)
    }
    ER_SHELL_ROOT_CMDS +0 SORTTYPE Lexical {
        * (.shell_root_cmd_*)
    }
    ER_FONT_ENTRY +0 SORTTYPE Lexical {
        * (._cfb_font.*)
    }
    ER_TRACING_BACKENDS +0 {
        * (._tracing_backend.*)
    }
    ER_RODATA +0 ALIGN 4 {
        * (.rodata)
        * (.rodata.*)
        * (.gnu.linkonce.r.*)
        .ANY (+RO-DATA)
    }

    ER_SRAM_DATA SRAM_DATA_ADDR ALIGN 8 {
        * (.sleepfunc)
        * (.sleepfunc.*)
        * (.defunc)
        * (.lvglfunc)
        * (.sleep.data*)
    }

    ER_ATTDATA PSRAM_ADDR  {
        * (.attruntimedata)  
    }
    ER_RAMFUNC +0 {  
        * (.ramfunc)
        * (.ramfunc.*)
    }
    ER_DATAS +0 ALIGN 8 {
        * (.data)
        * (.data.*)
        * (.kernel.*)
    }
    ER_AAC_P_OVERLAY_DATA +0 ALIGN 4 OVERLAY {
        aac_a_1.o(+RW)
        aac_a_2.o(+RW)
        aac_a_3.o(+RW)
        aac_s_1.o(+RW)
    }

    ER_MP3_P_OVERLAY_DATA +0 ALIGN 4 OVERLAY{
        m1.o(+RW)
        m2.o(+RW)
    }

    ER_WAV_P_OVERLAY_DATA +0 ALIGN 4 OVERLAY {
	    wav_s_1.o(+RW)
	    wav_w_1.o(+RW)
	    wav_w_2.o(+RW)
	    wav_w_3.o(+RW)
    }

    ER_APE_P_OVERLAY_DATA +0 ALIGN 4 OVERLAY {
	    ape_c_1.o(+RW)
	    ape_d_1.o(+RW)
	    ape_e_1.o(+RW)
	    ape_i_1.o(+RW)
	    ape_p_1.o(+RW)
	    ape_s_1.o(+RW)
	    ape_test.o(+RW)
    }

    ER_FLAC_P_OVERLAY_DATA +0 ALIGN 4 OVERLAY {
	    fla_p_1.o(+RW)
	    fla_s_1.o(+RW)
	    fla_s_2.o(+RW)
    }

    ER_WMA_P_OVERLAY_DATA +0 ALIGN 4 OVERLAY {
	    w13_i_1.o(+RW)
	    w13_s_1.o(+RW)
	    w13_a_1.o(+RW)
    }

    ER_DEVICE_STATE +0 SORTTYPE Lexical {
        * (.z_devstate* )
    }

    ER_PM_DEVICE_SLOTS +0 SORTTYPE Lexical {
        * (.z_pm_device_slots* )
    }

    ER_DEVICE_INIT_STATUS +0 FILL 0 INIT_STATUS_SIZE {
    }
    ER_DEVICE_BUSY +0 FILL 0 DEVICE_BUSY_SIZE {
    }
    ER_INITSHELL +0 {
        * (.shell_module_*)
        * (.shell_cmd_*)
    }
    ER_LOG_DYNAMIC +0 SORTTYPE Lexical {
        * (.log_dynamic_*)
    }
    ER_STATIC_THREAD +0 SORTTYPE Lexical ALIGNALL 4 {
        * (.__static_thread_data.static.*)
    }
    ER_K_TIMER +0 ALIGNALL 4 {
        * (._k_timer.static.*)
    }
    ER_K_MEM_SLAB +0 ALIGNALL 4 {
        * (._k_mem_slab.static.*)
    }
    ER_K_MEM_POOL +0 ALIGNALL 4 {
        * (._k_mem_pool.static.*)
    }
    ER_K_HEAP +0 ALIGNALL 4 {
        * (._k_heap.static.*)
    }
    ER_K_SEM +0 ALIGNALL 4 {
        * (._k_sem.static.*)
        * (._sys_sem.static.*)
    }
    ER_K_MUTEX +0 ALIGNALL 4 {
        * (._k_mutex.static.*)
    }
    ER_K_QUEUE +0 ALIGNALL 4 {
        * (._k_queue.static.*)
        * (._k_fifo.static.*)
        * (._k_lifo.static.*)
    }
    ER_K_STACK +0 ALIGNALL 4 {
        * (._k_stack.static.*)
    }
    ER_K_MSGQ +0 ALIGNALL 4 {
        * (._k_msgq.static.*)
    }
    ER_K_MBOX +0 ALIGNALL 4 {
        * (._k_mbox.static.*)
    }
    ER_K_PIPE +0 ALIGNALL 4 {
        * (._k_pipe.static.*)
    }
    ER_NET_BUF_POOL +0 SORTTYPE Lexical ALIGNALL 4 {
        * (._net_buf_pool.static.*)
    }
    ER_NET_IF +0 SORTTYPE Lexical ALIGNALL 4 {
        * (.net_if.*)
    }
    ER_NET_IF_DEV +0 SORTTYPE Lexical ALIGNALL 4 {
        * (.net_if_dev.*)
    }
    ER_NET_L2_DATA +0 SORTTYPE Lexical ALIGNALL 4 {
        * (.net_l2.data)
        * (.net_l2.data*)
    }
}

LR2 AlignExpr(ImageLimit(ER_NET_L2_DATA), 512) {    ; load region 2
    ER_SW_ISR_TABLE +0 ALIGN 4 FIXED {
        * (.gnu.linkonce.sw_isr_table)
    }

    ER_WAV_P_OVERLAY_BSS +0 ALIGN 4 {
  	    wav_s_1.o(+ZI)
	    wav_w_1.o(+ZI)
	    wav_w_2.o(+ZI)
	    wav_w_3.o(+ZI)
    }
    ER_FLAC_P_OVERLAY_BSS +0 ALIGN 4 {
	    fla_p_1.o(+ZI)
	    fla_s_1.o(+ZI)
	    fla_s_2.o(+ZI)
    }
    ER_AAC_P_OVERLAY_BSS +0 ALIGN 4 {
        aac_a_1.o(+ZI)
        aac_a_2.o(+ZI)
        aac_a_3.o(+ZI)
        aac_s_1.o(+ZI)
    }
    ER_MP3_P_OVERLAY_BSS +0 ALIGN 4{
        m1.o(+ZI)
        m2.o(+ZI)
    }
    ER_WMA_P_OVERLAY_BSS +0 ALIGN 4{
	    w13_i_1.o(+ZI)
	    w13_s_1.o(+ZI)
	    w13_a_1.o(+ZI)
    }
    ER_APE_P_OVERLAY_BSS +0 ALIGN 4{
	    ape_c_1.o(+ZI)
	    ape_d_1.o(+ZI)
	    ape_e_1.o(+ZI)
	    ape_i_1.o(+ZI)
	    ape_p_1.o(+ZI)
	    ape_s_1.o(+ZI)
	    ape_test.o(+ZI)
    }
    ER_BSS +0 ALIGN 4  {
        * (.bss)
        * (.bss.*)
        * (COMMON)
        * (.kernel_bss.*)
        * (.bthost_bss*)
        * (.btsrv_bss*)
        .ANY (+ZI)
    }
    ER_NOINIT +0 ALIGN 4 {
        * (.noinit)
        * (.noinit.*)
        * (.kernel_noinit.*)
    }	
    ER_PSRAM_NOINIT +0 ALIGN 64 {
        * (.UI_PSRAM_REGION*)
        * (.RES_PSRAM_REGION*)
        * (.BMPFONT_PSRAM_REGION*)
        * (.font.bss.cache*)
        * (.tile.bss.cache*)
        * (.lvgl.noinit.malloc*)
        * (.vglite.noinit.mem_pool*)
        * (.vglite.noinit.malloc*)
    }
    ER_RAM_END (PSRAM_ADDR+PSRAM_SIZE) EMPTY 0 {
    }
}

LR3 SHARE_RAM_ADDR SHARE_RAM_SIZE {    ; load region 3
    ER_SHARE_RAM_BSS +0 ALIGN 4 FIXED {
        * (.DSP_SHARE_RAM*)
    }
}

LR4 RAM_ADDR RAM_SIZE {    ; load region 4

    ER_SRAM_BSS +0 ALIGN 4 {
    }
    ER_SRAM_NOINIT +0 ALIGN 0x200 {
#ifdef CONFIG_IRQ_VECTOR_IN_SRAM
        * (.srm_irq_vector*, +FIRST)
#endif
	    *(.interrupt.noinit.stack*)
	    *(.main.noinit.stack*)
	    *(.uisrv.noinit.stack*)
    	*(.lvgl.noinit.gpu*)
    	*(.spinand.bss.BLK_ARRAY*)
    	*(.spinand.bss.PAGE_CACHE_BUF*)
    	*(.system.bss.sdfs_cache*)
    	*(.diskio.cache.pool*)
    	*(.jpeg.bss.temp_buffer*)
    	*(.ram.noinit*)
    	*(.decompress.bss.cache*)
    	*(.lvgl.noinit.vdb*)
    	*(.ram.noinit.stack*)
    	*(.audio.bss.ouput_pcm*)
    	*(.audio.bss.input_pcm*)
    	*(.act_s2_not_save_mem*)
    }
    ER_SRAM_SLEEP_SHUTDOWN +0 ALIGN 0x200 {
        * (.ram.noinit.sufacebuffer*)
    }
    ER_SIM_SRAM_NOINIT +0 ALIGN 4 {
         * (.sram.noinit.actlog*)  
    }

    ER_SRAM_END (RAM_ADDR+RAM_SIZE) EMPTY 0 {
    }
}

#if CONFIG_SENSOR_RAM_CODE_SIZE > 0
LR4_1 CODE_RAM_ADDR CODE_RAM_SIZE {    ; load region 4_1
}
#endif