KT25-1014_AC695x_BTE_SDK310/cpu/br23/sdk_ld.c
2025-10-14 16:57:01 +08:00

807 lines
15 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// *INDENT-OFF*
#include "app_config.h"
/*
| updata |
|_______________|
| ram1 |
|_______________|
| TLB |
|_______________|
| isr base | (HW fixed)
|_______________|
| ram0 |
|_______________|
| DCACHE |
|_______________|
*/
RAM1_LIMIT_L = 0x2C000;
RAM1_LIMIT_H = 0x30000;
/********************************************/
/* 0x2FF80 ~ 0x30000 */
/********************************************/
UPDATA_SIZE = 0x80;
UPDATA_BEG = RAM1_LIMIT_H - UPDATA_SIZE;
RAM1_BEGIN = RAM1_LIMIT_L;
RAM1_END = RAM1_LIMIT_H - UPDATA_SIZE;
RAM1_SIZE = RAM1_END - RAM1_BEGIN;
#ifdef CONFIG_PSRAM_ENABLE
RAM_LIMIT_L = 0x04000;
#else
RAM_LIMIT_L = 0x00000;
#endif
RAM_LIMIT_H = 0x2C000;
/********************************************/
/* 0x2BF00 ~ 0x2C000 */
/********************************************/
/* ISR_BASE = _IRQ_MEM_ADDR; */
ISR_SIZE = 0x100;
ISR_BASE = RAM_LIMIT_H - ISR_SIZE;
/********************************************/
/* 0x00000 ~ 0x2BF00 */
/********************************************/
RAM_BEGIN = RAM_LIMIT_L;
RAM_END = RAM_LIMIT_H - ISR_SIZE;
RAM_SIZE = RAM_END - RAM_BEGIN;
BANK_SIZE = 5*1024;
PSRAM_BEG = 0x800000;
PSRAM_SIZE = 2M;
CODE_BEG = 0X1E000C0;
UPDATA_BREDR_BASE_BEG = 0xF9000;
#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
MEMORY
{
psram(rwx) : ORIGIN = PSRAM_BEG , LENGTH = PSRAM_SIZE
#if (USE_SDFILE_NEW)
code0(rx) : ORIGIN = 0x1E00100, LENGTH = CONFIG_FLASH_SIZE
#else
code0(rx) : ORIGIN = 0x1E00000, LENGTH = CONFIG_FLASH_SIZE
#endif
ram0(rwx) : ORIGIN = RAM_BEGIN , LENGTH = RAM_SIZE
ram1(rwx) : ORIGIN = RAM1_BEGIN , LENGTH = RAM1_SIZE
}
#include "maskrom_stubs.ld"
EXTERN(
_start
#include "sdk_used_list.c"
);
ENTRY(_start)
EXTERN(
lib_update_version
)
SECTIONS
{
/********************************************/
. =ORIGIN(psram);
.psram_text ALIGN(4):
{
#ifdef CONFIG_PSRAM_ENABLE
*(.text*)
*(.LOG_TAG_CONST*)
*(.rodata*)
#endif
} > psram
.psram ALIGN(32):
{
#ifdef CONFIG_PSRAM_ENABLE
*(.bss)
*(COMMON)
#endif
} > psram
. = ORIGIN(code0);
.text ALIGN(4):
{
text_code_begin = .;
PROVIDE(text_rodata_begin = .);
*(.startup.text)
bank_stub_start = .;
*(.bank.stub.*)
bank_stub_size = . - bank_stub_start;
*(.aac_const)
*(.aac_code)
*(.alac_const)
*(.alac_code)
*(.alac_dec_code)
*(.bt_aac_dec_eng_const)
*(.bt_aac_dec_eng_code)
*(.bt_aac_dec_core_code)
*(.bt_aac_dec_core_sparse_code)
*(.dts_dec_const)
#if (!TCFG_LED7_RUN_RAM)
*(.gpio_ram)
*(.LED_code)
*(.LED_const)
. = ALIGN(4);
#endif
#if (!TCFG_CODE_RUN_RAM_FM_MODE)
*(.usr_timer_const)
*(.usr_timer_code)
*(.timer_const)
*(.timer_code)
*(.cbuf_const)
*(.cbuf_code)
*(.fm_data_code)
*(.fm_data_const)
. = ALIGN(4);
#endif
*(.cvsd_const)
*(.cvsd_code)
. = ALIGN(4);
gsensor_dev_begin = .;
KEEP(*(.gsensor_dev))
gsensor_dev_end = .;
. = ALIGN(4);
hrsensor_dev_begin = .;
KEEP(*(.hrsensor_dev))
hrsensor_dev_end = .;
. = ALIGN(4);
fm_dev_begin = .;
KEEP(*(.fm_dev))
fm_dev_end = .;
. = ALIGN(4);
fm_emitter_dev_begin = .;
KEEP(*(.fm_emitter_dev))
fm_emitter_dev_end = .;
. = ALIGN(4);
tool_interface_begin = .;
KEEP(*(.tool_interface))
tool_interface_end = .;
. = ALIGN(4);
cmd_interface_begin = .;
KEEP(*(.eff_cmd))
cmd_interface_end = .;
. = ALIGN(4);
/* . = ALIGN(4); */
/* storage_device_begin = .; */
/* KEEP(*(.storage_device)) */
/* storage_device_end = .; */
/* . = ALIGN(4); */
/* ui_main_begin = .; */
/* KEEP(*(.ui_main)) */
/* ui_main_end = .; */
/* . = ALIGN(4); */
chargeIc_dev_begin = .;
KEEP(*(.chargeIc_dev))
chargeIc_dev_end = .;
. = ALIGN(4);
/********maskrom arithmetic ****/
*(.opcore_table_maskrom)
*(.bfilt_table_maskroom)
*(.opcore_maskrom)
*(.bfilt_code)
*(.bfilt_const)
. = ALIGN(4);
#include "btctrler/btctler_lib_text.ld"
. = ALIGN(4);
#include "btstack/btstack_lib_text.ld"
. = ALIGN(4);
#include "system/system_lib_text.ld"
. = ALIGN(4);
#include "ui/ui/ui.ld"
. = ALIGN(4);
#include "media/cpu/br23/media_lib_text.ld"
. = ALIGN(4);
update_target_begin = .;
PROVIDE(update_target_begin = .);
KEEP(*(.update_target))
update_target_end = .;
PROVIDE(update_target_end = .);
. = ALIGN(4);
*(.text*)
*(.LOG_TAG_CONST*)
*(.rodata*)
. = ALIGN(4);
__VERSION_BEGIN = .;
KEEP(*(.version))
__VERSION_END = .;
. = ALIGN(4);
text_code_end = .;
} >code0
. = ORIGIN(ram0);
_data_code_begin = . ;
#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*)
. = ALIGN(4);
}
.overlay_bank3
{
*(.bank.code.3*)
*(.bank.const.3*)
. = ALIGN(4);
}
} > ram0
bank_code_run_end_addr = .;
common_code_run_addr = bank_code_run_addr + BANK_SIZE;
ASSERT(bank_code_run_end_addr <= common_code_run_addr, "bank overflow!")
. = common_code_run_addr;
.common ALIGN(4):
{
*(.common*)
. = ALIGN(4);
} > ram0
#else
bank_code_run_addr = .;
common_code_run_addr = .;
#endif
//cpu start
.data ALIGN(4):
{
/// 放在data 里面的code 必须放在这个位置保护起来
*(.data_magic)
. = ALIGN(4);
*(.flushinv_icache)
*(.volatile_ram_code)
*(.os_critical_code)
*(.chargebox_code)
*(.os_code)
*(.os_const)
*(.ui_ram)
*(.fat_data_code)
#if (TCFG_LED7_RUN_RAM)
*(.gpio_ram)
*(.LED_code)
*(.LED_const)
. = ALIGN(4);
#endif
#if (TCFG_CODE_RUN_RAM_FM_MODE)
*(.usr_timer_const)
*(.usr_timer_code)
*(.timer_const)
*(.timer_code)
*(.cbuf_const)
*(.cbuf_code)
*(.fm_data_code)
*(.fm_data_const)
. = ALIGN(4);
#endif
#if TCFG_FM_INSIDE_ENABLE
*(.fm_code)
#endif
. = ALIGN(4);
#include "media/cpu/br23/media_lib_data_text.ld"
. = ALIGN(4);
_data_code_end = . ;
_cpu_store_begin = . ;
. = ALIGN(4);
*(.data*)
*(.cvsd_data)
. = ALIGN(4);
dec_board_param_mem_begin = .;
KEEP(*(.dec_board_param_mem))
dec_board_param_mem_end = .;
. = ALIGN(4);
*(.sbc_eng_code)
. = ALIGN(4);
. = ALIGN(32);
#include "btstack/btstack_lib_data.ld"
. = ALIGN(4);
#include "btctrler/btctler_lib_data.ld"
. = ALIGN(4);
#include "system/system_lib_data.ld"
. = ALIGN(4);
#include "media/cpu/br23/media_lib_data.ld"
. = ALIGN(4);
} > ram0
.irq_stack ALIGN(32) :
{
*(.stack_magic)
_cpu0_sstack_begin = .;
PROVIDE(cpu0_sstack_begin = .);
*(.stack)
_cpu0_sstack_end = .;
PROVIDE(cpu0_sstack_end = .);
_stack_end = . ;
*(.stack_magic0)
. = ALIGN(4);
*(.boot_info)
} > ram0
.bss ALIGN(32) :
{
*(.usb_h_dma) //由于usb有个bug会导致dma写的数据超出预设的buf最长可能写超1k为了避免死机所以usb dma buffer后面放一些其他模块的buff来避免死机
*(.usb_ep0)
*(.dec_mix_buff)
*(.sd0_var)
*(.sd1_var)
*(.dac_buff)
*(.bss)
*(COMMON)
*(.cvsd_bss)
*(.volatile_ram)
#include "btctrler/btctler_lib_bss.ld"
#include "btstack/btstack_lib_bss.ld"
#include "system/system_lib_bss.ld"
#include "media/cpu/br23/media_lib_bss.ld"
. = (( . + 31) / 32 * 32);
. = ALIGN(4);
#if TCFG_USB_CDC_BACKGROUND_RUN
*(.usb_cdc_dma)
*(.usb_config_var)
*(.cdc_var)
. = ALIGN(32);
#endif
} > ram0
//cpu end
_cpu_store_end = . ;
_prp_store_begin = . ;
.prp_bss ALIGN(32) :
{
//bt
//
//sbc
//
//audio
. = (( . + 31) / 32 * 32);
} > ram0
_prp_store_end = . ;
.bss ALIGN(32) :
{
NVRAM_DATA_START = .;
*(.non_volatile_ram)
NVRAM_DATA_SIZE = ABSOLUTE(. - NVRAM_DATA_START);
. = ALIGN(4);
NVRAM_END = .;
_nv_pre_begin = . ;
*(.src_filt)
*(.src_dma)
. = ALIGN(4);
} > ram0
overlay_begin = .;
OVERLAY : NOCROSSREFS AT(0x200000) SUBALIGN(4)
{
.overlay_aec
{
LONG(0xFFFFFFFF);
/* *(.aec_bss_id) */
o_aec_end = .;
*(.aec_mem)
*(.msbc_enc)
}
.overlay_mp3
{
#ifdef CONFIG_MP3_WMA_LIB_SPECIAL
*(.mp3_decstream_const)
*(.mp3_decstream_code)
*(.mp3_decstream_sparse_code)
*(.mp3_decstream_sparse_const)
*(.mp3_dec_sparse_code)
*(.mp3_dec_sparse_const)
*(.mp3_dec_code)
*(.mp3_dec_const)
/* *(.mp3_dec_data) */
/* *(.mp3_dec_bss) */
/* *(.mp3_bss) */
/* *(.mp3_data) */
*(.mp3_const)
*(.mp3_code)
#endif
LONG(0xFFFFFFFF);
/* *(.mp3_bss_id) */
o_mp3_end = .;
*(.mp3_mem)
*(.mp3_ctrl_mem)
*(.mp3pick_mem)
*(.mp3pick_ctrl_mem)
}
.overlay_wma
{
#ifdef CONFIG_MP3_WMA_LIB_SPECIAL
*(.wma_code)
*(.wma_const)
*(.wma_dec_code)
*(.wma_dec_const)
/* *(.wma_dec_data) */
/* *(.wma_dec_bss) */
/* *(.wma_bss) */
/* *(.wma_data) */
#endif
LONG(0xFFFFFFFF);
/* *(.wma_bss_id) */
o_wma_end = .;
*(.wma_mem)
*(.wma_ctrl_mem)
*(.wmapick_mem)
*(.wmapick_ctrl_mem)
}
.overlay_wav
{
LONG(0xFFFFFFFF);
/* *(.wav_bss_id) */
*(.wav_bss)
*(.wav_dec_bss)
*(.wav_mem)
*(.wav_ctrl_mem)
}
.overlay_ape
{
*(.ape_mem)
*(.ape_ctrl_mem)
*(.ape_dec_sparse_code)
*(.ape_dec_sparse_const)
*(.ape_dec_code)
*(.ape_dec_const)
*(.ape_dec_data)
*(.ape_dec_bss)
LONG(0xFFFFFFFF);
/* *(.ape_bss_id) */
*(.ape_bss)
*(.ape_data)
*(.ape_const)
*(.ape_code)
}
.overlay_flac
{
LONG(0xFFFFFFFF);
/* *(.flac_bss_id) */
*(.flac_mem)
*(.flac_ctrl_mem)
*(.flac_dec_bss)
*(.flac_bss)
}
.overlay_m4a
{
*(.m4a_dec_code)
*(.m4a_dec_ff_const)
*(.m4a_dec_const)
*(.m4a_dec_data)
*(.m4a_data)
*(.m4a_const)
*(.m4a_code)
*(.m4apick_mem)
*(.m4apick_ctrl_mem)
LONG(0xFFFFFFFF);
/* *(.m4a_bss_id) */
*(.m4a_mem)
*(.m4a_ctrl_mem)
*(.m4a_dec_bss)
*(.m4a_bss)
*(.aac_ctrl_mem)
*(.aac_bss)
*(.alac_ctrl_mem)
*(.alac_bss)
}
.overlay_amr
{
*(.amr_dec_sparse_code)
*(.amr_dec_sparse_const)
*(.amr_dec_code)
*(.amr_dec_data)
LONG(0xFFFFFFFF);
/* *(.amr_bss_id) */
*(.amr_mem)
*(.amr_ctrl_mem)
*(.amr_dec_bss)
}
.overlay_dts
{
*(.dts_dec_code)
*(.dts_dec_data)
*(.dts_data)
*(.dts_const)
*(.dts_code)
LONG(0xFFFFFFFF);
/* *(.dts_bss_id) */
*(.dts_mem)
*(.dts_ctrl_mem)
*(.dts_dec_bss)
*(.dts_bss)
}
.overlay_fm
{
LONG(0xFFFFFFFF);
/* *(.fm_bss_id) */
o_fm_end = .;
*(.fm_mem)
*(.linein_pcm_mem)
}
.overlay_pc
{
#if TCFG_VIR_UDISK_ENABLE == 0
*(.usb_audio_play_dma)
*(.usb_audio_rec_dma)
*(.uac_rx)
*(.mass_storage)
*(.usb_msd_dma)
*(.usb_hid_dma)
*(.usb_iso_dma)
*(.usb_cdc_dma)
*(.uac_var)
*(.usb_config_var)
*(.cdc_var)
#endif
}
} > ram0
overlay_end = .;
ASSERT(overlay_end <= overlay_begin + 64k, "overlay overflow 64k!")
RAM_USED = .;
. =ORIGIN(ram1);
//TLB 起始需要16K 对齐;
.mmu_tlb ALIGN(0x4000):
{
*(.mmu_tlb_segment);
} > ram1
.bss1 ALIGN(32) :
{
} > ram1
RAM1_USED = .;
/********************************************/
/*
. =ORIGIN(ram0);
.ram0_data ALIGN(4):
{
_VM_CODE_START = . ;
*(.vm)
_VM_CODE_END = . ;
*(.flushinv_icache)
. = ALIGN(4); // must at tail, make ram0_data size align 4
} > ram0
*/
/********************************************/
}
#include "update/update.ld"
#include "driver/cpu/br23/driver_lib.ld"
text_begin = ADDR(.text) ;
text_size = SIZEOF(.text) ;
text_end = ADDR(.text) + SIZEOF(.text) ;
bss_begin = ADDR(.bss) ;
bss_size = SIZEOF(.bss);
bss1_begin = ADDR(.bss1) ;
bss1_size = SIZEOF(.bss1);
data_addr = ADDR(.data) ;
data_begin = text_begin + text_size;
data_size = SIZEOF(.data) ;
psram_vaddr = ADDR(.psram_text) ;
psram_laddr = text_begin + text_size + data_size;
psram_text_size = SIZEOF(.psram_text) ;
bank_code_load_addr = data_begin + data_size;
//================ OVERLAY Code Info Export ==================//
aec_addr = ADDR(.overlay_aec);
aec_begin = text_begin + text_size + data_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 = SIZEOF(.overlay_wav);
ape_addr = ADDR(.overlay_ape);
ape_begin = wav_begin + wav_size;
ape_size = SIZEOF(.overlay_ape);
flac_addr = ADDR(.overlay_flac);
flac_begin = ape_begin + ape_size;
flac_size = SIZEOF(.overlay_flac);
m4a_addr = ADDR(.overlay_m4a);
m4a_begin = flac_begin + flac_size;
m4a_size = SIZEOF(.overlay_m4a);
amr_addr = ADDR(.overlay_amr);
amr_begin = m4a_begin + m4a_size;
amr_size = SIZEOF(.overlay_amr);
dts_addr = ADDR(.overlay_dts);
dts_begin = amr_begin + amr_size;
dts_size = SIZEOF(.overlay_dts);
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;
#endif
_HEAP_BEGIN = RAM_USED;
PROVIDE(HEAP_BEGIN = RAM_USED);
_HEAP_END = RAM_END;
PROVIDE(HEAP_END = RAM_END);
_HEAP_SIZE = HEAP_END - HEAP_BEGIN;
PROVIDE(HEAP_SIZE = HEAP_END - HEAP_BEGIN);
_HEAP1_BEGIN = RAM1_USED;
PROVIDE(HEAP1_BEGIN = RAM1_USED);
_HEAP1_END = RAM1_END;
PROVIDE(HEAP1_END = RAM1_END);
_HEAP1_SIZE = HEAP1_END - HEAP1_BEGIN;
PROVIDE(HEAP1_SIZE = HEAP1_END - HEAP1_BEGIN);
_MALLOC_SIZE = HEAP_SIZE + HEAP1_SIZE;
PROVIDE(MALLOC_SIZE = HEAP_SIZE + HEAP1_SIZE);