Updated and Validated
[betaflight.git] / src / link / stm32_flash_h723_1m.ld
bloba0ff4662925972749ed28bf21e2d414a90742c70
1 /*
2 *****************************************************************************
3 **
4 **  File        : stm32_flash_h723_1m.ld
5 **
6 **  Abstract    : Linker script for STM32H723xG and STM32H725xG Device with
7 **                320K AXI-SRAM mapped onto AXI bus on D1 domain
8                        (Shared AXI/I-TCM 192KB is all configured as AXI-SRAM)
9 **                 16K SRAM1 mapped on D2 domain
10 **                 16K SRAM2 mapped on D2 domain
11 **                 16K SRAM  mapped on D3 domain
12 **                 64K ITCM
13 **                128K DTCM
15 *****************************************************************************
18 /* Entry Point */
19 ENTRY(Reset_Handler)
22 0x00000000 to 0x0000FFFF   64K ITCM
23 0x20000000 to 0x2001FFFF  128K DTCM
24 0x24000000 to 0x2404FFFF  320K AXI SRAM, D1 domain, main RAM
25 0x30000000 to 0x30003FFF   16K SRAM1, D2 domain
26 0x30004000 to 0x30007FFF   16K SRAM2, D2 domain
27 0x38000000 to 0x38003FFF   16K SRAM4, D3 domain, unused
28 0x38800000 to 0x38800FFF    4K BACKUP SRAM, Backup domain, unused
30 XXX TODO join isr vector, startup and firmware to save some space
31 0x08000000 to 0x080FFFFF 1024K full flash,
32 0x08000000 to 0x0801FFFF  128K isr vector, startup code
33 0x08020000 to 0x080DFFFF  768K firmware
34 0x080E0000 to 0x080FFFFF  128K config
38 /* Specify the memory areas */
39 MEMORY
41     FLASH (rx)        : ORIGIN = 0x08000000, LENGTH = 128K
42     FLASH_CONFIG (r)  : ORIGIN = 0x080E0000, LENGTH = 128K
43     FLASH1 (rx)       : ORIGIN = 0x08020000, LENGTH = 768K
45     ITCM_RAM (rwx)    : ORIGIN = 0x00000000, LENGTH = 64K
46     DTCM_RAM (rwx)    : ORIGIN = 0x20000000, LENGTH = 128K
47     RAM (rwx)         : ORIGIN = 0x24000000, LENGTH = 320K
49     D2_RAM (rwx)      : ORIGIN = 0x30000000, LENGTH = 32K /* SRAM1 + SRAM2 */
51     MEMORY_B1 (rx)    : ORIGIN = 0x60000000, LENGTH = 0K
54 REGION_ALIAS("STACKRAM", DTCM_RAM)
55 REGION_ALIAS("FASTRAM", DTCM_RAM)
57 /* INCLUDE "stm32_flash_f7_split.ld" */
59 *****************************************************************************
61 **  File        : stm32_flash_f7_split.ld
63 **  Abstract    : Common linker script for STM32 devices.
65 *****************************************************************************
68 /* Entry Point */
69 ENTRY(Reset_Handler)
71 /* Highest address of the user mode stack */
72 _estack = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - 8; /* Reserve 2 x 4bytes for info across reset */
74 /* Base address where the config is stored. */
75 __config_start = ORIGIN(FLASH_CONFIG);
76 __config_end = ORIGIN(FLASH_CONFIG) + LENGTH(FLASH_CONFIG);
78 /* Generate a link error if heap and stack don't fit into RAM */
79 _Min_Heap_Size = 0;      /* required amount of heap  */
80 _Min_Stack_Size = 0x800; /* required amount of stack */
82 /* Define output sections */
83 SECTIONS
85   /* The startup code goes first into FLASH */
86   .isr_vector :
87   {
88     . = ALIGN(512);
89     PROVIDE (isr_vector_table_base = .);
90     KEEP(*(.isr_vector)) /* Startup code */
91     . = ALIGN(4);
92   } >FLASH
94   /* The program code and other data goes into FLASH */
95   .text :
96   {
97     . = ALIGN(4);
98     *(.text)           /* .text sections (code) */
99     *(.text*)          /* .text* sections (code) */
100     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
101     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
102     *(.glue_7)         /* glue arm to thumb code */
103     *(.glue_7t)        /* glue thumb to arm code */
104     *(.eh_frame)
106     KEEP (*(.init))
107     KEEP (*(.fini))
109     . = ALIGN(4);
110     _etext = .;        /* define a global symbols at end of code */
111   } >FLASH1
113   /* Critical program code goes into ITCM RAM */
114   /* Copy specific fast-executing code to ITCM RAM */ 
115   tcm_code = LOADADDR(.tcm_code); 
116   .tcm_code :
117   {
118     . = ALIGN(4);
119     tcm_code_start = .; 
120     *(.tcm_code)
121     *(.tcm_code*)
122     . = ALIGN(4);
123     tcm_code_end = .; 
124   } >ITCM_RAM AT >FLASH1
126   .ARM.extab   : 
127   { 
128     *(.ARM.extab* .gnu.linkonce.armextab.*) 
129   } >FLASH
130   
131   .ARM : 
132   {
133     __exidx_start = .;
134     *(.ARM.exidx*) __exidx_end = .;
135   } >FLASH
137   .pg_registry :
138   {
139     PROVIDE_HIDDEN (__pg_registry_start = .);
140     KEEP (*(.pg_registry))
141     KEEP (*(SORT(.pg_registry.*)))
142     PROVIDE_HIDDEN (__pg_registry_end = .);
143   } >FLASH
144   
145   .pg_resetdata :
146   {
147     PROVIDE_HIDDEN (__pg_resetdata_start = .);
148     KEEP (*(.pg_resetdata))
149     PROVIDE_HIDDEN (__pg_resetdata_end = .);
150   } >FLASH
152   /* used by the startup to initialize data */
153   _sidata = LOADADDR(.data);
155   /* Initialized data sections goes into RAM, load LMA copy after code */
156   .data :
157   {
158     . = ALIGN(4);
159     _sdata = .;        /* create a global symbol at data start */
160     *(.data)           /* .data sections */
161     *(.data*)          /* .data* sections */
163     . = ALIGN(4);
164     _edata = .;        /* define a global symbol at data end */
165   } >FASTRAM AT >FLASH
167   /* Uninitialized data section */
168   . = ALIGN(4);
169   .bss (NOLOAD) :
170   {
171     /* This is used by the startup in order to initialize the .bss secion */
172     _sbss = .;         /* define a global symbol at bss start */
173     __bss_start__ = _sbss;
174     *(.bss)
175     *(SORT_BY_ALIGNMENT(.bss*))
176     *(COMMON)
178     . = ALIGN(4);
179     _ebss = .;         /* define a global symbol at bss end */
180     __bss_end__ = _ebss;
181   } >FASTRAM
183   /* Uninitialized data section */
184   . = ALIGN(4);
185   .sram2 (NOLOAD) :
186   {
187     /* This is used by the startup in order to initialize the .sram2 secion */
188     _ssram2 = .;         /* define a global symbol at sram2 start */
189     __sram2_start__ = _ssram2;
190     *(.sram2)
191     *(SORT_BY_ALIGNMENT(.sram2*))
193     . = ALIGN(4);
194     _esram2 = .;         /* define a global symbol at sram2 end */
195     __sram2_end__ = _esram2;
196   } >RAM
198   /* used during startup to initialized fastram_data */
199   _sfastram_idata = LOADADDR(.fastram_data);
201   /* Initialized FAST_DATA section for unsuspecting developers */
202   .fastram_data :
203   {
204     . = ALIGN(4);
205     _sfastram_data = .;        /* create a global symbol at data start */
206     *(.fastram_data)           /* .data sections */
207     *(.fastram_data*)          /* .data* sections */
209     . = ALIGN(4);
210     _efastram_data = .;        /* define a global symbol at data end */
211   } >FASTRAM AT >FLASH
213   . = ALIGN(4);
214   .fastram_bss (NOLOAD) :
215   {
216     _sfastram_bss = .;
217     __fastram_bss_start__ = _sfastram_bss;
218     *(.fastram_bss)
219     *(SORT_BY_ALIGNMENT(.fastram_bss*))
221     . = ALIGN(4);
222     _efastram_bss = .;
223     __fastram_bss_end__ = _efastram_bss;
224   } >FASTRAM
226   /* used during startup to initialized dmaram_data */
227   _sdmaram_idata = LOADADDR(.dmaram_data);
229   . = ALIGN(32);
230   .dmaram_data :
231   {
232     PROVIDE(dmaram_start = .);
233     _sdmaram = .;
234     _dmaram_start__ = _sdmaram;
235     _sdmaram_data = .;        /* create a global symbol at data start */
236     *(.dmaram_data)           /* .data sections */
237     *(.dmaram_data*)          /* .data* sections */
238     . = ALIGN(32);
239     _edmaram_data = .;        /* define a global symbol at data end */
240   } >RAM AT >FLASH
242   . = ALIGN(32);
243   .dmaram_bss (NOLOAD) :
244   {
245     _sdmaram_bss = .;
246     __dmaram_bss_start__ = _sdmaram_bss;
247     *(.dmaram_bss)
248     *(SORT_BY_ALIGNMENT(.dmaram_bss*))
249     . = ALIGN(32);
250     _edmaram_bss = .;
251     __dmaram_bss_end__ = _edmaram_bss;
252   } >RAM
254   . = ALIGN(32);
255   .DMA_RAM (NOLOAD) :
256   {
257     KEEP(*(.DMA_RAM))
258     PROVIDE(dmaram_end = .);
259     _edmaram = .;
260     _dmaram_end__ = _edmaram;
261   } >RAM
263   .DMA_RW_D2 (NOLOAD) :
264   {
265     . = ALIGN(32);
266     PROVIDE(dmarw_start = .);
267     _sdmarw = .;
268     _dmarw_start__ = _sdmarw;
269     KEEP(*(.DMA_RW))
270     PROVIDE(dmarw_end = .);
271     _edmarw = .;
272     _dmarw_end__ = _edmarw;
273   } >D2_RAM
275   .DMA_RW_AXI (NOLOAD) :
276   {
277     . = ALIGN(32);
278     PROVIDE(dmarwaxi_start = .);
279     _sdmarwaxi = .;
280     _dmarwaxi_start__ = _sdmarwaxi;
281     KEEP(*(.DMA_RW_AXI))
282     PROVIDE(dmarwaxi_end = .);
283     _edmarwaxi = .;
284     _dmarwaxi_end__ = _edmarwaxi;
285   } >RAM
287   .persistent_data (NOLOAD) :
288   {
289     __persistent_data_start__ = .;
290     *(.persistent_data)
291     . = ALIGN(4);
292     __persistent_data_end__ = .;
293   } >RAM
296   /* User_heap_stack section, used to check that there is enough RAM left */
297   _heap_stack_end = ORIGIN(STACKRAM)+LENGTH(STACKRAM) - 8; /* 8 bytes to allow for alignment */
298   _heap_stack_begin = _heap_stack_end - _Min_Stack_Size  - _Min_Heap_Size;
299   . = _heap_stack_begin;
300   ._user_heap_stack :
301   {
302     . = ALIGN(4);
303     PROVIDE ( end = . );
304     PROVIDE ( _end = . );
305     . = . + _Min_Heap_Size;
306     . = . + _Min_Stack_Size;
307     . = ALIGN(4);
308   } >STACKRAM = 0xa5
310   /* MEMORY_bank1 section, code must be located here explicitly            */
311   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
312   .memory_b1_text :
313   {
314     *(.mb1text)        /* .mb1text sections (code) */
315     *(.mb1text*)       /* .mb1text* sections (code)  */
316     *(.mb1rodata)      /* read-only data (constants) */
317     *(.mb1rodata*)
318   } >MEMORY_B1
320   /* Remove information from the standard libraries */
321   /DISCARD/ :
322   {
323     libc.a ( * )
324     libm.a ( * )
325     libgcc.a ( * )
326   }
328   .ARM.attributes 0 : { *(.ARM.attributes) }