/**************************************************************************************** * @file flash.ld * * @brief This file is the link script file (gnuarm or armgcc). * * Copyright (C) BouffaloLab 2021 * **************************************************************************************** */ /* configure the CPU type */ OUTPUT_ARCH( "riscv" ) /* link with the standard c library */ INPUT(-lc) /* link with the standard GCC library */ INPUT(-lgcc) /* configure the entry point */ ENTRY(__start) StackSize = 0x1000; /* 4KB */ HeapMinSize = 0x1000; /* 4KB */ __EM_SIZE = DEFINED(btble_controller_init) ? 32K : 0K; __RFTLV_SIZE_OFFSET = 1K; __RFTLV_SIZE_HOLE = 2K; __RFTLV_HEAD1_H = (0x46524C42); /* BLRF */ __RFTLV_HEAD1_L = (0x41524150); /* PAPA */ MEMORY { fw_header_memory (rx) : ORIGIN = 0xA0000000 - 0x1000, LENGTH = 4K xip_memory (rx) : ORIGIN = 0xA0000000, LENGTH = 4M ram_code (wxa) : ORIGIN = 0xA8000000, LENGTH = 4M itcm_memory (rx) : ORIGIN = 0x62FC0000, LENGTH = 20K dtcm_memory (rx) : ORIGIN = 0x62FC5000, LENGTH = 4K nocache_ram_memory (!rx) : ORIGIN = 0x22FC6000, LENGTH = 44K+60K ram_memory (!rx) : ORIGIN = 0x62FE0000, LENGTH = 320K-20K-4K-44K-60K ram_wifi (wxa) : ORIGIN = 0x23010000, LENGTH = 160K - __EM_SIZE } SECTIONS { BOOT2_PT_ADDR = 0x63027c00; .fw_header : { KEEP(*(.fw_header)) } > fw_header_memory .init : { KEEP (*(SORT_NONE(.init))) KEEP (*(SORT_NONE(.vector))) } > xip_memory .rftlv.tool : { . = ORIGIN(xip_memory) + __RFTLV_SIZE_OFFSET; PROVIDE( _ld_symbol_rftlv_address = . ); LONG(__RFTLV_HEAD1_H); LONG(__RFTLV_HEAD1_L); . = ORIGIN(xip_memory) + __RFTLV_SIZE_OFFSET + __RFTLV_SIZE_HOLE; } > xip_memory .text : { . = ALIGN(4); __text_code_start__ = .; *(.text) *(.text.*) /* section information for finsh shell */ . = ALIGN(4); __fsymtab_start = .; KEEP(*(FSymTab)) __fsymtab_end = .; . = ALIGN(4); __vsymtab_start = .; KEEP(*(VSymTab)) __vsymtab_end = .; . = ALIGN(4); /* section information for modules */ . = ALIGN(4); __rtmsymtab_start = .; KEEP(*(RTMSymTab)) __rtmsymtab_end = .; /* section information for initialization */ . = ALIGN(4); __rt_init_start = .; KEEP(*(SORT(.rti_fn*))) __rt_init_end = .; /* section information for usb usbh_class_info */ . = ALIGN(4); __usbh_class_info_start__ = .; KEEP(*(.usbh_class_info)) . = ALIGN(4); __usbh_class_info_end__ = .; /*put .rodata**/ *(EXCLUDE_FILE( *bl616_glb*.o* \ *bl616_pds*.o* \ *bl616_common*.o* \ *bl616_sf_cfg*.o* \ *bl616_sf_ctrl*.o* \ *bl616_sflash*.o* \ *bl616_xip_sflash*.o* \ *bl616_ef_ctrl*.o* \ *bl616_romapi_patch*.o* ).rodata*) *(.srodata) *(.srodata.*) . = ALIGN(4); __text_code_end__ = .; } > xip_memory . = ALIGN(4); __itcm_load_addr = .; .itcm_region : AT (__itcm_load_addr) { . = ALIGN(4); __tcm_code_start__ = .; *(.tcm_code.*) *(.tcm_const.*) *(.sclock_rlt_code.*) *(.sclock_rlt_const.*) *bl616_glb*.o*(.rodata*) *bl616_pds*.o*(.rodata*) *bl616_common*.o*(.rodata*) *bl616_sf_cfg*.o*(.rodata*) *bl616_sf_ctrl*.o*(.rodata*) *bl616_sflash*.o*(.rodata*) *bl616_xip_sflash*.o*(.rodata*) *bl616_ef_ctrl*.o*(.rodata*) *bl616_romapi_patch*.o*(.rodata*) . = ALIGN(4); __tcm_code_end__ = .; } > itcm_memory __dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region); .dtcm_region : AT (__dtcm_load_addr) { . = ALIGN(4); __tcm_data_start__ = .; *(.tcm_data) /* *finger_print.o(.data*) */ . = ALIGN(4); __tcm_data_end__ = .; } > dtcm_memory /*************************************************************************/ /* .stack_dummy section doesn't contains any symbols. It is only * used for linker to calculate size of stack sections, and assign * values to stack symbols later */ .stack_dummy (NOLOAD): { . = ALIGN(0x4); . = . + StackSize; . = ALIGN(0x4); } > dtcm_memory /* Set stack top to end of RAM, and stack limit move down by * size of stack_dummy section */ __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory); PROVIDE( __freertos_irq_stack_top = __StackTop); PROVIDE( __rt_rvstack = . ); __StackLimit = __StackTop - SIZEOF(.stack_dummy); /* Check if data + heap + stack exceeds RAM limit */ ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack") /*************************************************************************/ __nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region); .nocache_ram_region : AT (__nocache_ram_load_addr) { . = ALIGN(4); __nocache_ram_data_start__ = .; *(.nocache_ram) . = ALIGN(4); __nocache_ram_data_end__ = .; } > nocache_ram_memory __ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region); /* Data section */ RAM_DATA : AT (__ram_load_addr) { . = ALIGN(4); __ram_data_start__ = .; PROVIDE( __global_pointer$ = . + 0x800 ); *(.data) *(.data.*) *(.sdata) *(.sdata.*) *(.sdata2) *(.sdata2.*) . = ALIGN(4); __bflog_tags_start__ = .; *(.bflog_tags_array) . = ALIGN(4); __bflog_tags_end__ = .; __ram_data_end__ = .; } > ram_memory __etext_final = (__ram_load_addr + SIZEOF (RAM_DATA)); ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow") .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss*) *(.sbss*) *(COMMON) . = ALIGN(4); __bss_end__ = .; } > ram_memory .noinit_data (NOLOAD) : { . = ALIGN(4); __noinit_data_start__ = .; *(.noinit_data*) . = ALIGN(4); __noinit_data_end__ = .; } > ram_memory .nocache_noinit_ram_region (NOLOAD) : { . = ALIGN(4); __nocache_noinit_ram_data_start__ = .; *(.nocache_noinit_ram) *(.noncacheable) . = ALIGN(4); __nocache_noinit_ram_data_end__ = .; } > nocache_ram_memory .heap (NOLOAD): { . = ALIGN(4); __HeapBase = .; /*__end__ = .;*/ /*end = __end__;*/ KEEP(*(.heap*)) . = ALIGN(4); __HeapLimit = .; } > ram_memory __HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory); ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow") .psmram_data (NOLOAD): { . = ALIGN(4); __psram_data_start__ = .; /*__end__ = .;*/ /*end = __end__;*/ KEEP(*(.psram_data*)) KEEP(*(.img_buf*)) . = ALIGN(4); __psram_data_end__ = .; } > ram_code .wifibss (NOLOAD) : { PROVIDE( __wifi_bss_start = ADDR(.wifibss) ); PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) ); _sshram = . ; *(SHAREDRAMIPC) *(SHAREDRAM) _eshram = . ; *ipc_shared.o(COMMON) *sdu_shared.o(COMMON) *hal_desc.o(COMMON) *txl_buffer_shared.o(COMMON) *txl_frame_shared.o(COMMON) *scan_shared.o(COMMON) *scanu_shared.o(COMMON) *mfp_bip.o(COMMON) *me_mic.o(COMMON) *(.wifi_ram*) . = ALIGN(16); } > ram_wifi PROVIDE( _heap_wifi_start = . ); PROVIDE( _heap_wifi_size = ORIGIN(ram_wifi) + LENGTH(ram_wifi) - _heap_wifi_start ); }