/* ****************************************************************************** ** ** @file : STM32F446XX_ETHCOMMS_OCTOPUS_BL.ld ** ** @brief : Linker script for STM32F446 (Octopus Pro) ** Remora-ETH with Bootloader ** ** Flash layout: ** Sector 0-1 : Bootloader (32 KB) ** Sector 2 : JSON Upload (16 KB) ** Sector 3 : JSON Storage (16 KB) ** Sector 4+ : Application ** ****************************************************************************** */ /* Entry Point */ ENTRY(Reset_Handler) /* Stack top */ _estack = ORIGIN(RAM) + LENGTH(RAM); /* Heap & Stack */ _Min_Heap_Size = 0x2000; /* 8 KB */ _Min_Stack_Size = 0x400; /* 2 KB */ /* Flash sizes */ _FLASH_TOTAL_SIZE = 512K; _FLASH_BOOTLOADER_SIZE = 32K; /* Sector 0 + 1 */ _FLASH_JSON_UPLOAD_SIZE = 16K; /* Sector 2 */ _FLASH_JSON_STORAGE_SIZE = 16K; /* Sector 3 */ _PGM_FLASH_AVAILABLE_SIZE = _FLASH_TOTAL_SIZE - _FLASH_BOOTLOADER_SIZE - _FLASH_JSON_UPLOAD_SIZE - _FLASH_JSON_STORAGE_SIZE; /* Memory regions */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K FLASH_BOOT (rx) : ORIGIN = 0x08000000, LENGTH = _FLASH_BOOTLOADER_SIZE JSON_UPLOAD (rx) : ORIGIN = 0x08008000, LENGTH = _FLASH_JSON_UPLOAD_SIZE JSON_STORAGE (rx) : ORIGIN = 0x0800C000, LENGTH = _FLASH_JSON_STORAGE_SIZE FLASH_PGM (rx) : ORIGIN = 0x08010000, LENGTH = _PGM_FLASH_AVAILABLE_SIZE } /* Application vector table location */ _FLASH_VectorTable = ORIGIN(FLASH_PGM); /* JSON symbols for Remora */ _ls_json_upload_start = ORIGIN(JSON_UPLOAD); _ls_json_upload_end = ORIGIN(JSON_UPLOAD) + LENGTH(JSON_UPLOAD); _ls_json_storage_start = ORIGIN(JSON_STORAGE); _ls_json_storage_end = ORIGIN(JSON_STORAGE) + LENGTH(JSON_STORAGE); _ls_json_upload_sector = 2; /* FLASH_SECTOR_2 */ _ls_json_storage_sector = 3; /* FLASH_SECTOR_3 */ /* Sections */ SECTIONS { /* Interrupt vector table */ .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > FLASH_PGM /* JSON upload region */ .json_upload (NOLOAD) : { . = ALIGN(4); KEEP(*(.json_upload)) KEEP(*(.json_upload.*)) . = ALIGN(4); } > JSON_UPLOAD /* JSON storage region */ .json_storage (NOLOAD) : { . = ALIGN(4); KEEP(*(.json_storage)) KEEP(*(.json_storage.*)) . = ALIGN(4); } > JSON_STORAGE /* Program code */ .text : { . = ALIGN(4); *(.text) *(.text*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); _etext = .; } > FLASH_PGM /* Read-only data */ .rodata : { . = ALIGN(4); *(.rodata) *(.rodata*) . = ALIGN(4); } > FLASH_PGM .ARM.extab : { . = ALIGN(4); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(4); } > FLASH_PGM .ARM : { . = ALIGN(4); __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; . = ALIGN(4); } > FLASH_PGM .preinit_array : { . = ALIGN(4); PROVIDE_HIDDEN(__preinit_array_start = .); KEEP(*(.preinit_array*)) PROVIDE_HIDDEN(__preinit_array_end = .); . = ALIGN(4); } > FLASH_PGM .init_array : { . = ALIGN(4); PROVIDE_HIDDEN(__init_array_start = .); KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array*)) PROVIDE_HIDDEN(__init_array_end = .); . = ALIGN(4); } > FLASH_PGM .fini_array : { . = ALIGN(4); PROVIDE_HIDDEN(__fini_array_start = .); KEEP(*(SORT(.fini_array.*))) KEEP(*(.fini_array*)) PROVIDE_HIDDEN(__fini_array_end = .); . = ALIGN(4); } > FLASH_PGM /* Data copy source */ _sidata = LOADADDR(.data); /* Initialized data */ .data : { . = ALIGN(4); _sdata = .; *(.data) *(.data*) *(.RamFunc) *(.RamFunc*) . = ALIGN(4); _edata = .; } > RAM AT > FLASH_PGM /* BSS */ .bss : { . = ALIGN(4); _sbss = .; __bss_start__ = _sbss; *(.bss) *(.bss*) *(COMMON) . = ALIGN(4); _ebss = .; __bss_end__ = _ebss; } > RAM /* Heap + Stack */ ._user_heap_stack : { . = ALIGN(8); PROVIDE(end = .); PROVIDE(_end = .); . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(8); } > RAM /* Strip unused libs */ /DISCARD/ : { libc.a (*) libm.a (*) libgcc.a (*) } .ARM.attributes 0 : { *(.ARM.attributes) } }