2025-02-18 15:40:42 +08:00

744 lines
16 KiB
C

// *INDENT-OFF*
#include "app_config.h"
/* ================= BR30 SDK memory ========================
_______________ ___ 0x2C000(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;
#ifdef CONFIG_BR30_C_VERSION
UPDATA_BREDR_BASE_BEG = 0x2c600;
#else
UPDATA_BREDR_BASE_BEG = 0x2c000;
#endif
RAM_LIMIT_L = 0;
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;
RAM0_BEG = RAM_LIMIT_L;
RAM0_END = RAM_LIMIT_H;
RAM0_SIZE = RAM0_END - RAM0_BEG;
//============ About EQ coeff RAM ================
//internal EQ priv ram
EQ_PRIV_COEFF_BASE = 0x02D860;
EQ_PRIV_SECTION_NUM = 10;
EQ_PRIV_COEFF_END = EQ_PRIV_COEFF_BASE + 4 * EQ_PRIV_SECTION_NUM * 14;
//internal EQ cpu ram
/* #if (defined(EQ_SECTION_MAX) && (EQ_SECTION_MAX > 10)) */
/* EQ_SECTION_NUM = EQ_SECTION_MAX - EQ_PRIV_SECTION_NUM; */
/* #else */
/* EQ_SECTION_NUM = 0; */
/* #endif */
//=============== About BT RAM ===================
//CONFIG_BT_RX_BUFF_SIZE = (1024 * 18);
MEMORY
{
#if (USE_SDFILE_NEW)
code0(rx) : ORIGIN = 0x1E00120 , LENGTH = CONFIG_FLASH_SIZE
#else
code0(rx) : ORIGIN = 0x1E00020, LENGTH = CONFIG_FLASH_SIZE
#endif
ram0(rwx) : ORIGIN = RAM0_BEG, LENGTH = RAM0_SIZE
}
ENTRY(_start)
SECTIONS
{
. = ORIGIN(code0);
.text ALIGN(4):
{
PROVIDE(text_rodata_begin = .);
*(.startup.text)
*(.text)
#include "btstack/btstack_lib_text.ld"
#include "system/system_lib_text.ld"
. = ALIGN(4);
#include "ui/ui/ui.ld"
. = ALIGN(4);
update_target_begin = .;
PROVIDE(update_target_begin = .);
KEEP(*(.update_target))
update_target_end = .;
PROVIDE(update_target_end = .);
. = ALIGN(4);
*(.classic_tws_const)
*(.classic_tws_code)
*(.LOG_TAG_CONST*)
*(.rodata*)
*(.fat_data_code_ex)
. = 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 = .;
gsensor_dev_begin = .;
KEEP(*(.gsensor_dev))
gsensor_dev_end = .;
//mouse sensor dev begin
. = ALIGN(4);
OMSensor_dev_begin = .;
KEEP(*(.omsensor_dev))
OMSensor_dev_end = .;
fm_dev_begin = .;
KEEP(*(.fm_dev))
fm_dev_end = .;
fm_emitter_dev_begin = .;
KEEP(*(.fm_emitter_dev))
fm_emitter_dev_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 = .;
storage_device_begin = .;
KEEP(*(.storage_device))
storage_device_end = .;
. = ALIGN(4);
ai_server_device_begin = .;
KEEP(*(.ai_server_device))
ai_server_device_end = .;
. = ALIGN(4);
adapter_idev_begin = .;
KEEP(*(.adapter_idev))
adapter_idev_end = .;
. = ALIGN(4);
adapter_odev_begin = .;
KEEP(*(.adapter_odev))
adapter_odev_end = .;
. = ALIGN(4);
adapter_enc_begin = .;
KEEP(*(.adapter_enc))
adapter_enc_end = .;
. = ALIGN(4);
adapter_decoder_begin = .;
KEEP(*(.adapter_decoder))
adapter_decoder_end = .;
. = ALIGN(4);
adapter_encoder_begin = .;
KEEP(*(.adapter_encoder))
adapter_encoder_end = .;
/********maskrom arithmetic ****/
*(.opcore_table_maskrom)
*(.bfilt_table_maskroom)
*(.opcore_maskrom)
*(.bfilt_code)
*(.bfilt_const)
/********maskrom arithmetic end****/
. = ALIGN(4);
#include "media/cpu/br30/audio_lib_text.ld"
. = ALIGN(4);
__VERSION_BEGIN = .;
KEEP(*(.sys.version))
__VERSION_END = .;
*(.noop_version)
#ifdef CONFIG_MOVABLE_ENABLE
. = ALIGN(4);
_SPI_CODE_START = . ;
*(.spi_code)
. = ALIGN(4);
_SPI_CODE_END = . ;
#endif
. = ALIGN(4);
*(.media.audio*)
*(.media.mixer*)
*(.media.media*)
*( .wtg_dec_code )
*( .wtg_dec_const)
*( .wtg_dec_sparse_code)
. = ALIGN(32);
} > 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):
{
//cpu start
. = ALIGN(4);
*(.data_magic)
*(.audio_dec_data)
. = ALIGN(4);
#include "media/cpu/br30/audio_lib_data.ld"
. = ALIGN(4);
*(.wav_data)
*(.wav_dec_data)
*(.wav_mem)
*(.wav_ctrl_mem)
. = ALIGN(4);
*(.data*)
/* . = ALIGN(4); */
/* EQ_COEFF_BASE = . ; */
/* . = EQ_COEFF_BASE + 4 * EQ_SECTION_NUM * 14; */
. = ALIGN(32);
#include "btstack/btstack_lib_data.ld"
. = ALIGN(4);
#include "system/system_lib_data.ld"
. = ALIGN(4);
. = ALIGN(4);
} > ram0
.bss ALIGN(32):
{
. = ALIGN(4);
#include "btstack/btstack_lib_bss.ld"
. = ALIGN(4);
#include "system/system_lib_bss.ld"
. = ALIGN(4);
*(.bss)
. = ALIGN(4);
#include "media/cpu/br30/audio_lib_bss.ld"
. = ALIGN(4);
*(.wav_bss)
*(.wav_dec_bss)
. = ALIGN(4);
*(.audio_dec_bss)
*(.os_bss)
*(.volatile_ram)
*(.btstack_pool)
*(.usb_ep0)
*(.usb_msd_dma)
*(.audio_buf)
*(.src_filt)
*(.src_dma)
*(.mem_heap)
*(.memp_memory_x)
. = ALIGN(4);
*(.non_volatile_ram)
. = ALIGN(32);
. = ALIGN(4);
} > ram0
.data_code ALIGN(32):
{
data_code_pc_limit_begin = .;
*(.flushinv_icache)
*(.cache)
*(.os_critical_code)
*(.volatile_ram_code)
*(.chargebox_code)
*(.media.aec.text)
*(.os_code)
*(.os_str)
*(.fat_data_code)
#if (TCFG_ENC_LC3_ENABLE || TCFG_DEC_LC3_ENABLE)
*(.lc3_codec_ari_c_code)
*(.lc3_codec_e_code)
*(.lc3_codec_c_const)
*(.lc3_codec_c_code)
#endif
#ifndef CONFIG_MOVABLE_ENABLE
audio_sync_code_begin = .;
*(.audio_sync_code)
audio_sync_code_end = .;
. = ALIGN(4);
_SPI_CODE_START = . ;
*(.spi_code)
. = ALIGN(4);
_SPI_CODE_END = . ;
#endif
. = ALIGN(4);
data_code_pc_limit_end = .;
} > ram0
.moveable_slot ALIGN(4):
{
} >ram0
#ifdef CONFIG_BR30_C_VERSION
.heap ALIGN(32):
{
_HEAP_BEGIN = .;
. = ALIGN(0x1FC00);
_HEAP_END = .;
} >ram0
#endif
__report_overlay_begin = .;
OVERLAY : AT(0x200000) SUBALIGN(4)
{
.overlay_aec
{
. = ALIGN(4);
aec_code_begin = . ;
*(.text._*)
*(.data._*)
*(.aec_code)
*(.aec_const)
*(.res_code)
*(.res_const)
*(.dns_common_data)
*(.dns_param_data_single)
*(.dns_param_data_dual)
*(.ns_code)
*(.ns_const)
*(.fft_code)
*(.fft_const)
*(.nlp_code)
*(.nlp_const)
*(.der_code)
*(.der_const)
*(.qmf_code)
*(.qmf_const)
*(.aec_data)
*(.res_data)
*(.ns_data)
*(.nlp_data)
*(.der_data)
*(.qmf_data)
*(.fft_data)
*(.dms_code)
*(.dms_const)
*(.dms_data)
*(.agc_code)
. = ALIGN(4);
*(.aec_mux)
. = ALIGN(4);
aec_code_end = . ;
aec_code_size = aec_code_end - aec_code_begin ;
}
.overlay_aac
{
. = ALIGN(4);
aac_dec_code_begin = .;
*(.bt_aac_dec_code)
*(.bt_aac_dec_sparse_code)
aac_dec_code_end = .;
aac_dec_code_size = aac_dec_code_end - aac_dec_code_begin ;
. = ALIGN(4);
bt_aac_dec_const_begin = .;
*(.bt_aac_dec_const)
*(.bt_aac_dec_sparse_const)
. = ALIGN(4);
bt_aac_dec_const_end = .;
bt_aac_dec_const_size = bt_aac_dec_const_end - bt_aac_dec_const_begin ;
*(.bt_aac_dec_data)
. = ALIGN(4);
}
} > ram0
//加个空段防止下面的OVERLAY地址不对
.ram0_empty0 ALIGN(4) :
{
. = . + 4;
} > ram0
//__report_overlay_begin = .;
OVERLAY : AT(0x210000) SUBALIGN(4)
{
.overlay_aec_ram
{
. = ALIGN(4);
*(.msbc_enc)
*(.cvsd_codec)
*(.aec_bss)
*(.res_bss)
*(.ns_bss)
*(.nlp_bss)
*(.der_bss)
*(.qmf_bss)
*(.fft_bss)
*(.aec_mem)
*(.dms_bss)
}
.overlay_aac_ram
{
. = ALIGN(4);
*(.bt_aac_dec_bss)
. = ALIGN(4);
*(.aac_mem)
*(.aac_ctrl_mem)
/* . += 0x5fe8 ; */
/* . += 0xef88 ; */
}
.overlay_opus
{
*(.opus_mem)
}
.overlay_mp3
{
*(.mp3_mem)
*(.mp3_ctrl_mem)
*(.mp3pick_mem)
*(.mp3pick_ctrl_mem)
*(.dec2tws_mem)
}
.overlay_wma
{
*(.wma_mem)
*(.wma_ctrl_mem)
*(.wmapick_mem)
*(.wmapick_ctrl_mem)
}
#if 0
.overlay_wav
{
*(.wav_mem)
*(.wav_ctrl_mem)
}
#endif
.overlay_ape
{
*(.ape_mem)
*(.ape_ctrl_mem)
}
.overlay_flac
{
*(.flac_mem)
*(.flac_ctrl_mem)
}
.overlay_m4a
{
*(.m4a_mem)
*(.m4a_ctrl_mem)
}
.overlay_amr
{
*(.amr_mem)
*(.amr_ctrl_mem)
}
.overlay_dts
{
*(.dts_mem)
*(.dts_ctrl_mem)
}
.overlay_fm
{
*(.fm_mem)
}
.overlay_pc
{
*(.usb_audio_play_dma)
*(.usb_audio_rec_dma)
*(.uac_rx)
*(.mass_storage)
*(.usb_hid_dma)
*(.usb_iso_dma)
*(.uac_var)
*(.usb_config_var)
}
} > ram0
__report_overlay_end = .;
#ifdef CONFIG_CODE_BANK_ENABLE
//加个空段防止下面的OVERLAY地址不对
.ram0_empty ALIGN(4) :
{
. = . + 4;
} > ram0
//bank code addr
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);
}
.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
#ifndef CONFIG_BR30_C_VERSION
_HEAP_BEGIN = . ;
_HEAP_END = RAM0_END;
#endif
}
#include "btctrler/port/br30/btctler_lib.ld"
#include "update/update.ld"
#include "driver/cpu/br30/driver_lib.ld"
//================== Section Info Export ====================//
text_begin = ADDR(.text);
text_size = SIZEOF(.text);
text_end = text_begin + text_size;
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 !!!");
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);
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 = SIZEOF(.overlay_aec);
aac_addr = ADDR(.overlay_aac);
aac_begin = aec_begin + aec_size;
aac_size = SIZEOF(.overlay_aac);
/*moveable_addr = ADDR(.overlay_moveable) ;
moveable_size = SIZEOF(.overlay_moveable) ;*/
//===================== HEAP Info Export =====================//
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;
BR30_PHY_RAM_SIZE = PHY_RAM_SIZE;
BR30_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
//============================================================//