Files
99_7018_lmx/cpu/br28/sdk_ld.c
2025-10-29 13:10:02 +08:00

422 lines
9.8 KiB
C

// *INDENT-OFF*
#include "app_config.h"
/* ================= BR28 SDK memory ========================
_______________ ___ 0x1A0000(176K)
| 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 |
|_______________|0 RAM_LIMIT_L
=========================================================== */
#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 = 0x1A0000;
RAM_LIMIT_L = 0x100000;
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;
#ifdef TCFG_LOWPOWER_RAM_SIZE
RAM0_BEG = RAM_LIMIT_L + (128K * TCFG_LOWPOWER_RAM_SIZE);
#else
RAM0_BEG = RAM_LIMIT_L;
#endif
RAM0_END = RAM_LIMIT_H;
RAM0_SIZE = RAM0_END - RAM0_BEG;
RAM1_BEG = RAM_LIMIT_L;
RAM1_END = RAM0_BEG;
RAM1_SIZE = RAM1_END - RAM1_BEG;
#ifdef CONFIG_NEW_CFG_TOOL_ENABLE
CODE_BEG = 0x6000100;
#else
CODE_BEG = 0x6000120;
#endif
//============ About EQ coeff RAM ================
//internal EQ priv ram
EQ_PRIV_COEFF_BASE =0x1A0600;
EQ_PRIV_SECTION_NUM = 10;
EQ_PRIV_COEFF_END = EQ_PRIV_COEFF_BASE + 4 * EQ_PRIV_SECTION_NUM * (5+3)*2;
EQ_SECTION_NUM = EQ_SECTION_MAX;
//=============== About BT RAM ===================
//CONFIG_BT_RX_BUFF_SIZE = (1024 * 18);
MEMORY
{
code0(rx) : ORIGIN = CODE_BEG, LENGTH = CONFIG_FLASH_SIZE
ram0(rwx) : ORIGIN = RAM0_BEG, LENGTH = RAM0_SIZE
//ram1 - 用于volatile-heap
//ram1(rwx) : ORIGIN = RAM1_BEG, LENGTH = RAM1_SIZE
psr_ram(rwx) : ORIGIN = 0x2000000, LENGTH = 8*1024*1024
}
ENTRY(_start)
SECTIONS
{
. = ORIGIN(code0);
.text ALIGN(4):
{
PROVIDE(text_rodata_begin = .);
*(.startup.text)
*(.text)
. = ALIGN(4);
update_target_begin = .;
PROVIDE(update_target_begin = .);
KEEP(*(.update_target))
update_target_end = .;
PROVIDE(update_target_end = .);
. = ALIGN(4);
*(.LOG_TAG_CONST*)
*(.rodata*)
. = ALIGN(4); // must at tail, make rom_code size align 4
PROVIDE(text_rodata_end = .);
clock_critical_handler_begin = .;
KEEP(*(.clock_critical_txt))
clock_critical_handler_end = .;
chargestore_handler_begin = .;
KEEP(*(.chargestore_callback_txt))
chargestore_handler_end = .;
/********maskrom arithmetic ****/
*(.opcore_table_maskrom)
*(.bfilt_table_maskroom)
*(.opcore_maskrom)
*(.bfilt_code)
*(.bfilt_const)
/********maskrom arithmetic end****/
. = ALIGN(4);
#include "ui/ui/ui.ld"
. = ALIGN(4);
__VERSION_BEGIN = .;
KEEP(*(.sys.version))
__VERSION_END = .;
*(.noop_version)
. = ALIGN(4);
. = 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(32);
m_code_addr = . ;
*(.m.code*)
*(.movable.code*)
m_code_size = ABSOLUTE(. - m_code_addr) ;
. = ALIGN(32);
} > code0
. = ORIGIN(ram0);
//TLB 起始需要16K 对齐;
.mmu_tlb ALIGN(0x10000):
{
*(.mmu_tlb_segment);
} > ram0
.boot_info ALIGN(32):
{
*(.boot_info)
. = ALIGN(32);
} > ram0
.irq_stack ALIGN(32):
{
_cpu0_sstack_begin = .;
*(.cpu0_stack)
_cpu0_sstack_end = .;
. = ALIGN(4);
_cpu1_sstack_begin = .;
*(.cpu1_stack)
_cpu1_sstack_end = .;
. = ALIGN(4);
} > ram0
.data ALIGN(32):
{
//cpu start
. = ALIGN(4);
*(.data_magic)
. = ALIGN(4);
#include "media/cpu/br28/audio_lib_data.ld"
. = ALIGN(4);
*(.data*)
. = ALIGN(4);
} > ram0
.bss ALIGN(32):
{
. = ALIGN(4);
*(.bss)
. = ALIGN(4);
*(.volatile_ram)
*(.btstack_pool)
*(.mem_heap)
*(.memp_memory_x)
. = ALIGN(4);
*(.non_volatile_ram)
. = ALIGN(32);
*(.usb_h_dma)
*(.usb_ep0)
#if TCFG_USB_CDC_BACKGROUND_RUN
*(.usb_cdc_dma)
*(.usb_config_var)
*(.cdc_var)
#endif
*(.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)
. = ALIGN(32);
} > ram0
.data_code ALIGN(32):
{
data_code_pc_limit_begin = .;
*(.flushinv_icache)
*(.cache)
*(.os_critical_code)
*(.volatile_ram_code)
*(.chargebox_code)
*(.fat_data_code)
*(.fat_data_code_ex)
*(.ui_ram)
*(.math_fast_funtion_code)
. = ALIGN(4);
*(.pSOUND360TD_cal_const)
*(.pSOUND360TD_cal_code)
. = ALIGN(4);
*(.SpatialAudio.text.const)
*(.SpatialAudio.text)
*(.SpatialAudio.text.cache.L1)
. = ALIGN(4);
_SPI_CODE_START = . ;
*(.spi_code)
. = ALIGN(4);
_SPI_CODE_END = . ;
. = ALIGN(4);
} > ram0
.moveable_slot ALIGN(4):
{
*(movable.slot.*)
} >ram0
__report_overlay_begin = .;
#include "app_overlay.ld"
data_code_pc_limit_end = .;
__report_overlay_end = .;
_HEAP_BEGIN = . ;
_HEAP_END = RAM0_END;
. = ORIGIN(psr_ram);
.psr_data_code ALIGN(32):
{
*(.psram_data_code)
. = ALIGN(4);
} > psr_ram
.psr_bss_code ALIGN(32):
{
. = ALIGN(4);
} > psr_ram
}
#include "app.ld"
#include "update/update.ld"
#include "btstack/btstack_lib.ld"
#include "system/port/br28/system_lib.ld"
#include "btctrler/port/br28/btctler_lib.ld"
#include "driver/cpu/br28/driver_lib.ld"
#include "media/cpu/br28/audio_lib.ld"
//================== Section Info Export ====================//
text_begin = ADDR(.text);
text_size = SIZEOF(.text);
text_end = text_begin + text_size;
bss_begin = ADDR(.bss);
bss_size = SIZEOF(.bss);
bss_end = bss_begin + bss_size;
data_addr = ADDR(.data);
data_begin = text_begin + text_size;
data_size = SIZEOF(.data);
moveable_slot_addr = ADDR(.moveable_slot);
moveable_slot_begin = data_begin + data_size;
moveable_slot_size = SIZEOF(.moveable_slot);
data_code_addr = ADDR(.data_code);
data_code_begin = moveable_slot_begin + moveable_slot_size;
data_code_size = SIZEOF(.data_code);
//================ OVERLAY Code Info Export ==================//
aec_addr = ADDR(.overlay_aec);
aec_begin = data_code_begin + data_code_size;
aec_size = SIZEOF(.overlay_aec);
aac_addr = ADDR(.overlay_aac);
aac_begin = aec_begin + aec_size;
aac_size = SIZEOF(.overlay_aac);
psr_data_code_addr = ADDR(.psr_data_code);
psr_data_code_begin = aac_begin + aac_size;
psr_data_code_size = SIZEOF(.psr_data_code);
/*
lc3_addr = ADDR(.overlay_lc3);
lc3_begin = aac_begin + aac_size;
lc3_size = SIZEOF(.overlay_lc3);
*/
/* moveable_addr = ADDR(.overlay_moveable) ; */
/* moveable_size = SIZEOF(.overlay_moveable) ; */
//===================== HEAP Info Export =====================//
ASSERT(_HEAP_BEGIN > bss_begin,"_HEAP_BEGIN < bss_begin");
ASSERT(_HEAP_BEGIN > data_addr,"_HEAP_BEGIN < data_addr");
ASSERT(_HEAP_BEGIN > data_code_addr,"_HEAP_BEGIN < data_code_addr");
/* ASSERT(_HEAP_BEGIN > moveable_slot_addr,"_HEAP_BEGIN < moveable_slot_addr"); */
/* ASSERT(_HEAP_BEGIN > __report_overlay_begin,"_HEAP_BEGIN < __report_overlay_begin"); */
PROVIDE(HEAP_BEGIN = _HEAP_BEGIN);
PROVIDE(HEAP_END = _HEAP_END);
_MALLOC_SIZE = _HEAP_END - _HEAP_BEGIN;
PROVIDE(MALLOC_SIZE = _HEAP_END - _HEAP_BEGIN);
ASSERT(MALLOC_SIZE >= 0x8000, "heap space too small !")
//============================================================//
//=== report section info begin:
//============================================================//
report_text_beign = ADDR(.text);
report_text_size = SIZEOF(.text);
report_text_end = report_text_beign + report_text_size;
report_mmu_tlb_begin = ADDR(.mmu_tlb);
report_mmu_tlb_size = SIZEOF(.mmu_tlb);
report_mmu_tlb_end = report_mmu_tlb_begin + report_mmu_tlb_size;
report_boot_info_begin = ADDR(.boot_info);
report_boot_info_size = SIZEOF(.boot_info);
report_boot_info_end = report_boot_info_begin + report_boot_info_size;
report_irq_stack_begin = ADDR(.irq_stack);
report_irq_stack_size = SIZEOF(.irq_stack);
report_irq_stack_end = report_irq_stack_begin + report_irq_stack_size;
report_data_begin = ADDR(.data);
report_data_size = SIZEOF(.data);
report_data_end = report_data_begin + report_data_size;
report_bss_begin = ADDR(.bss);
report_bss_size = SIZEOF(.bss);
report_bss_end = report_bss_begin + report_bss_size;
report_data_code_begin = ADDR(.data_code);
report_data_code_size = SIZEOF(.data_code);
report_data_code_end = report_data_code_begin + report_data_code_size;
report_overlay_begin = __report_overlay_begin;
report_overlay_size = __report_overlay_end - __report_overlay_begin;
report_overlay_end = __report_overlay_end;
report_heap_beign = _HEAP_BEGIN;
report_heap_size = _HEAP_END - _HEAP_BEGIN;
report_heap_end = _HEAP_END;
BR28_PHY_RAM_SIZE = PHY_RAM_SIZE;
BR28_SDK_RAM_SIZE = report_mmu_tlb_size + \
report_boot_info_size + \
report_irq_stack_size + \
report_data_size + \
report_bss_size + \
report_overlay_size + \
report_data_code_size + \
report_heap_size;
//============================================================//
//=== report section info end
//============================================================//