// *INDENT-OFF* #include "app_config.h" /* ================= BR25 SDK memory ======================== _______________ ___ 0x32000(136K) | isr base | |_______________|___ _IRQ_MEM_ADDR(size = 0x100) |rom export ram | |_______________| | update | |_______________|___ RAM_LIMIT_H | HEAP | |_______________|___ data_code_pc_limit_H | audio overlay | |_______________| | data_code | |_______________|___ data_code_pc_limit_L | bss | |_______________| | data | |_______________| | irq_stack | |_______________| | boot info | |_______________| | TLB | |_______________|0x10000 RAM_LIMIT_L | Reserved | |_______________|0 =========================================================== */ #include "maskrom_stubs.ld" EXTERN( _start #include "sdk_used_list.c" ); UPDATA_SIZE = 0x80; UPDATA_BEG = _MASK_MEM_BEGIN - UPDATA_SIZE; UPDATA_BREDR_BASE_BEG = 0xf9000; //depend on loader code & data RAM_LIMIT_L = 0x10000; RAM_LIMIT_H = UPDATA_BEG; PHY_RAM_SIZE = RAM_LIMIT_H - RAM_LIMIT_L; //from mask export ISR_BASE = _IRQ_MEM_ADDR; ROM_RAM_SIZE = _MASK_MEM_SIZE; ROM_RAM_BEG = _MASK_MEM_BEGIN; RAM_BEGIN = RAM_LIMIT_L; RAM_END = RAM_LIMIT_H; RAM_SIZE = RAM_END - RAM_BEGIN; #if MIC_EFFECT_EQ_EN MIC_EFFECT_EQ_SECTION = 8; #else MIC_EFFECT_EQ_SECTION = 3; #endif #if (EQ_SECTION_MAX > 10) EQ_SECTION_NUM = EQ_SECTION_MAX+MIC_EFFECT_EQ_SECTION; #else EQ_SECTION_NUM = 10+MIC_EFFECT_EQ_SECTION; #endif //=============== About BT RAM =================== //CONFIG_BT_RX_BUFF_SIZE = (1024 * 18); MEMORY { #ifdef CONFIG_LARGE_PROGRAM_ENABLE code0(rx) : ORIGIN = 0x1000120, LENGTH = CONFIG_FLASH_SIZE #else /* #ifdef CONFIG_LARGE_PROGRAM_ENABLE */ code0(rx) : ORIGIN = 0x1E00120, LENGTH = CONFIG_FLASH_SIZE #endif /* #ifdef CONFIG_LARGE_PROGRAM_ENABLE */ ram0(rwx) : ORIGIN = RAM_BEGIN, LENGTH = RAM_SIZE } ENTRY(_start) SECTIONS { . = ORIGIN(code0); .text ALIGN(4): { PROVIDE(flash_code_begin = .); *(.startup.text) bank_stub_start = .; *(.bank.stub.*) bank_stub_size = . - bank_stub_start; . = ALIGN(4); // must at tail, make rom_code size align 4 clock_critical_handler_begin = .; KEEP(*(.clock_critical_txt)) clock_critical_handler_end = .; chargestore_handler_begin = .; KEEP(*(.chargestore_callback_txt)) chargestore_handler_end = .; . = ALIGN(4); //mesh scene begin _bt_mesh_scene_entry_sig_list_start = .; KEEP(*(.bt_mesh_scene_entry_sig)) _bt_mesh_scene_entry_sig_list_end = .; . = ALIGN(4); _bt_mesh_scene_entry_vnd_list_start = .; KEEP(*(.bt_mesh_scene_entry_vnd)) _bt_mesh_scene_entry_vnd_list_end = .; /********maskrom arithmetic ****/ *(.bfilt_code) *(.bfilt_table_maskroom) /********maskrom arithmetic end****/ . = ALIGN(4); __VERSION_BEGIN = .; KEEP(*(.sys.version)) __VERSION_END = .; *(.noop_version) . = ALIGN(4); *(.tech_lib.aec.text) . = ALIGN(4); #include "btstack/btstack_lib_text.ld" . = ALIGN(4); #include "system/system_lib_text.ld" . = ALIGN(4); update_target_begin = .; PROVIDE(update_target_begin = .); KEEP(*(.update_target)) update_target_end = .; PROVIDE(update_target_end = .); . = ALIGN(4); . = ALIGN(4); *(.ui_ram) . = ALIGN(4); #include "ui/ui/ui.ld" . = ALIGN(4); #include "media/cpu/br25/media_lib_text.ld" . = ALIGN(4); *(.text*) *(.LOG_TAG_CONST*) *(.rodata*) *(.fat_data_code_ex) *(.fat_data_code) . = ALIGN(4); PROVIDE(flash_code_end = flash_code_begin + 1M); } > code0 . = ORIGIN(ram0); //TLB 起始需要16K 对齐; .mmu_tlb ALIGN(0x4000): { *(.mmu_tlb_segment); } > ram0 .boot_info ALIGN(32): { *(.boot_info) . = ALIGN(32); } > ram0 .irq_stack ALIGN(32): { _cpu0_sstack_begin = .; PROVIDE(cpu0_sstack_begin = .); *(.stack) _cpu0_sstack_end = .; PROVIDE(cpu0_sstack_end = .); _stack_end = . ; . = ALIGN(4); } > ram0 .data ALIGN(32): { . = ALIGN(4); *(.data_magic) . = ALIGN(32); . = ALIGN(4); #include "btstack/btstack_lib_data.ld" . = ALIGN(4); #include "system/system_lib_data.ld" . = ALIGN(4); #include "media/cpu/br25/media_lib_data.ld" . = ALIGN(4); EQ_COEFF_BASE = . ; . = EQ_COEFF_BASE + 4 * EQ_SECTION_NUM * 14; . = ALIGN(4); } > ram0 .bss ALIGN(32): { . = ALIGN(4); #include "btstack/btstack_lib_bss.ld" . = ALIGN(4); #include "system/system_lib_bss.ld" . = ALIGN(4); #include "media/cpu/br25/media_lib_bss.ld" . = ALIGN(4); *(COMMON) *(.volatile_ram) *(.audio_play_dma) . = ALIGN(4); *(.non_volatile_ram) . = ALIGN(32); } > ram0 data_code_limit_begin = .; .data_code ALIGN(32): { data_code_begin = .; *(.common*) . = ALIGN(4); #include "media/cpu/br25/media_lib_data_text.ld" *(.flushinv_icache) *(.os_critical_code) *(.os_rewrite_code) *(.volatile_ram_code) *(.chargebox_code) . = ALIGN(4); _SPI_CODE_START = . ; *(.spi_code) . = ALIGN(4); _SPI_CODE_END = . ; . = ALIGN(4); data_code_end = .; } > ram0 .vir_timer ALIGN(32): { *(.vir_rtc) } > ram0 overlay_begin = .; #include "app_overlay.ld" #ifdef CONFIG_CODE_BANK_ENABLE bank_code_run_addr = .; OVERLAY : AT(0x300000) SUBALIGN(4) { .overlay_bank0 { *(.bank.code.0*) *(.bank.const.0*) . = ALIGN(4); } .overlay_bank1 { *(.bank.code.1*) *(.bank.const.1*) . = ALIGN(4); } .overlay_bank2 { *(.bank.code.2*) *(.bank.const.2*) *(.bank.ecdh.*) . = ALIGN(4); } .overlay_bank3 { *(.bank.code.3*) *(.bank.const.3*) *(.bank.enc.*) . = ALIGN(4); } .overlay_bank4 { *(.bank.code.4*) *(.bank.const.4*) . = ALIGN(4); } .overlay_bank5 { *(.bank.code.5*) *(.bank.const.5*) . = ALIGN(4); } .overlay_bank6 { *(.bank.code.6*) *(.bank.const.6*) . = ALIGN(4); } .overlay_bank7 { *(.bank.code.7*) *(.bank.const.7*) . = ALIGN(4); } .overlay_bank8 { *(.bank.code.8*) *(.bank.const.8*) . = ALIGN(4); } .overlay_bank9 { *(.bank.code.9*) *(.bank.const.9*) . = ALIGN(4); } } > ram0 #endif /* #ifdef CONFIG_CODE_BANK_ENABLE */ data_code_limit_end = .; _HEAP_BEGIN = .; _HEAP_END = RAM_END; } #include "app.ld" #include "update/update.ld" #include "driver/cpu/br25/driver_lib.ld" #include "btctrler/port/br25/btctler_lib.ld" //================== Section Info Export ====================// text_begin = ADDR(.text); text_size = SIZEOF(.text); text_end = ADDR(.text) + SIZEOF(.text); ASSERT((text_size % 4) == 0,"!!! text_size Not Align 4 Bytes !!!"); bss_begin = ADDR(.bss); bss_size = SIZEOF(.bss); bss_end = bss_begin + bss_size; ASSERT((bss_size % 4) == 0,"!!! bss_size Not Align 4 Bytes !!!"); data_addr = ADDR(.data); data_begin = text_begin + text_size; data_size = SIZEOF(.data); ASSERT((data_size % 4) == 0,"!!! data_size Not Align 4 Bytes !!!"); data_code_addr = ADDR(.data_code); data_code_begin = data_begin + data_size; data_code_size = SIZEOF(.data_code); ASSERT((data_code_size % 4) == 0,"!!! data_code_size Not Align 4 Bytes !!!"); //================ OVERLAY Code Info Export ==================// aec_addr = ADDR(.overlay_aec); aec_begin = data_code_begin + data_code_size; aec_size = o_aec_end - aec_addr; /* aec_size = SIZEOF(.overlay_aec); */ wav_addr = ADDR(.overlay_wav); wav_begin = aec_begin + aec_size; wav_size = o_wav_end - wav_addr; ape_addr = ADDR(.overlay_ape); ape_begin = wav_begin + wav_size; ape_size = o_ape_end - ape_addr; flac_addr = ADDR(.overlay_flac); flac_begin = ape_begin + ape_size; flac_size = o_flac_end - flac_addr; m4a_addr = ADDR(.overlay_m4a); m4a_begin = flac_begin + flac_size; m4a_size = o_m4a_end - m4a_addr; amr_addr = ADDR(.overlay_amr); amr_begin = m4a_begin + m4a_size; amr_size = o_amr_end - amr_addr; dts_addr = ADDR(.overlay_dts); dts_begin = amr_begin + amr_size; dts_size = o_dts_end - dts_addr; fm_addr = ADDR(.overlay_fm); fm_begin = dts_begin + dts_size; fm_size = o_fm_end - fm_addr; /* fm_size = SIZEOF(.overlay_fm); */ #ifdef CONFIG_MP3_WMA_LIB_SPECIAL mp3_addr = ADDR(.overlay_mp3); mp3_begin = fm_begin + fm_size; mp3_size = o_mp3_end - mp3_addr; wma_addr = ADDR(.overlay_wma); wma_begin = mp3_begin + mp3_size; wma_size = o_wma_end - wma_addr; overlay_code_end_addr = wma_begin + wma_size; #else overlay_code_end_addr = fm_begin + fm_size; #endif //================ Bank Code Info Export ==================// bank_code_load_addr = overlay_code_end_addr; //===================== HEAP Info Export =====================// ASSERT(_HEAP_BEGIN > bss_begin,"_HEAP_BEGIN < bss_begin"); ASSERT(_HEAP_BEGIN > data_addr,"_HEAP_BEGIN < data_addr"); ASSERT(_HEAP_BEGIN > overlay_begin,"_HEAP_BEGIN < overlay_begin"); ASSERT(_HEAP_BEGIN > data_code_addr,"_HEAP_BEGIN < data_code_addr"); PROVIDE(HEAP_BEGIN = _HEAP_BEGIN); PROVIDE(HEAP_END = _HEAP_END); _MALLOC_SIZE = _HEAP_END - _HEAP_BEGIN; PROVIDE(MALLOC_SIZE = _HEAP_END - _HEAP_BEGIN);