vtx: fix VTX_SETTINGS_POWER_COUNT and add dummy entries to saPowerNames
[inav.git] / src / main / target / link / at32_flash_f4_split.ld
blob5a246379741889b86a8f1e84c741355996269311
1 /*
2 *****************************************************************************
3 **
4 **  File        : at32_flash_f4_split.ld
5 **
6 **  Abstract    : Common linker script for STM32 devices.
7 **
8 *****************************************************************************
9 */
11 /* Entry Point */
12 ENTRY(Reset_Handler)
14 /* Highest address of the user mode stack */
15 _Hot_Reboot_Flags_Size = 16;
16 _estack = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - _Hot_Reboot_Flags_Size;    /* end of RAM */
18 /* Base address where the config is stored. */
19 __config_start = ORIGIN(FLASH_CONFIG);
20 __config_end = ORIGIN(FLASH_CONFIG) + LENGTH(FLASH_CONFIG);
22 /* Generate a link error if heap and stack don't fit into RAM */
23 _Min_Heap_Size = 0x200;      /* required amount of heap  */
24 _Min_Stack_Size = 0x400; /* required amount of stack */
26 /* Define output sections */
27 SECTIONS
29   /*
30    * The ISR vector table is loaded at the beginning of the FLASH,
31    * But it is linked (space reserved) at the beginning of the VECTAB region,
32    * which is aliased either to FLASH or RAM.
33    * When linked to RAM, the table can optionally be copied from FLASH to RAM
34    * for table relocation.
35    */
37   _isr_vector_table_flash_base = LOADADDR(.isr_vector);
38   PROVIDE (isr_vector_table_flash_base = _isr_vector_table_flash_base);
40   .isr_vector :
41   {
42     . = ALIGN(4);
43     PROVIDE (isr_vector_table_base = .);
44     KEEP(*(.isr_vector)) /* Startup code */
45     . = ALIGN(4);
46     PROVIDE (isr_vector_table_end = .);
47   } >FLASH
51   /* System memory (read-only bootloader) interrupt vector */
52   .system_isr_vector (NOLOAD) :
53   {
54     . = ALIGN(4);
55     PROVIDE (system_isr_vector_table_base = .);
56     KEEP(*(.system_isr_vector)) /* Bootloader code */
57     . = ALIGN(4);
58   } >SYSTEM_MEMORY
60   /* The program code and other data goes into FLASH */
61   .text :
62   {
63     . = ALIGN(4);
64     *(.text)           /* .text sections (code) */
65     *(.text*)          /* .text* sections (code) */
66     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
67     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
68     *(.glue_7)         /* glue arm to thumb code */
69     *(.glue_7t)        /* glue thumb to arm code */
70     *(.eh_frame)
72     KEEP (*(.init))
73     KEEP (*(.fini))
75     . = ALIGN(4);
76     _etext = .;        /* define a global symbols at end of code */
77   } >FLASH1
78   
79   
80     /* Critical program code goes into ZW RAM1 */
81   /* Copy specific fast-executing code to ITCM RAM */ 
82   tcm_code = LOADADDR(.tcm_code); 
83   .tcm_code :
84   {
85     . = ALIGN(4);
86     tcm_code_start = .; 
87     *(.tcm_code)
88     *(.tcm_code*)
89     . = ALIGN(4);
90     tcm_code_end = .; 
91   } >RAM1 AT >FLASH1
94    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
95     .ARM : {
96     __exidx_start = .;
97       *(.ARM.exidx*)
98       __exidx_end = .;
99     } >MOVABLE_FLASH
101   .busdev_registry :
102   {
103     PROVIDE_HIDDEN (__busdev_registry_start = .);
104     KEEP (*(.busdev_registry))
105     KEEP (*(SORT(.busdev_registry.*)))
106     PROVIDE_HIDDEN (__busdev_registry_end = .);
107   } >MOVABLE_FLASH
108   .preinit_array     :
109   {
110     PROVIDE_HIDDEN (__preinit_array_start = .);
111     KEEP (*(.preinit_array*))
112     PROVIDE_HIDDEN (__preinit_array_end = .);
113   } >MOVABLE_FLASH
114   .init_array :
115   {
116     PROVIDE_HIDDEN (__init_array_start = .);
117     KEEP (*(SORT(.init_array.*)))
118     KEEP (*(.init_array*))
119     PROVIDE_HIDDEN (__init_array_end = .);
120   } >MOVABLE_FLASH
121   .fini_array :
122   {
123     PROVIDE_HIDDEN (__fini_array_start = .);
124     KEEP (*(.fini_array*))
125     KEEP (*(SORT(.fini_array.*)))
126     PROVIDE_HIDDEN (__fini_array_end = .);
127   } >MOVABLE_FLASH
128   .pg_registry :
129   {
130     PROVIDE_HIDDEN (__pg_registry_start = .);
131     KEEP (*(.pg_registry))
132     KEEP (*(SORT(.pg_registry.*)))
133     PROVIDE_HIDDEN (__pg_registry_end = .);
134   } >MOVABLE_FLASH
135   .pg_resetdata :
136   {
137     PROVIDE_HIDDEN (__pg_resetdata_start = .);
138     KEEP (*(.pg_resetdata))
139     PROVIDE_HIDDEN (__pg_resetdata_end = .);
140   } >FLASH1
142   /* Storage for the address for the configuration section so we can grab it out of the hex file */
143   .custom_defaults :
144   {
145     . = ALIGN(4);
146     KEEP (*(.custom_defaults_start_address))
147     . = ALIGN(4);
148     KEEP (*(.custom_defaults_end_address))
149     . = ALIGN(4);
150     __custom_defaults_internal_start = .;
151     *(.custom_defaults);
152   } >FLASH_CUSTOM_DEFAULTS
154     PROVIDE_HIDDEN (__custom_defaults_start = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) : __custom_defaults_internal_start);
155     PROVIDE_HIDDEN (__custom_defaults_end = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) + LENGTH(FLASH_CUSTOM_DEFAULTS_EXTENDED) : ORIGIN(FLASH_CUSTOM_DEFAULTS) + LENGTH(FLASH_CUSTOM_DEFAULTS));
157   /* used by the startup to initialize data */
158   _sidata = LOADADDR(.data);
160   /* Initialized data sections goes into RAM, load LMA copy after code */
161   .data :
162   {
163     . = ALIGN(4);
164     _sdata = .;        /* create a global symbol at data start */
165     *(.data)           /* .data sections */
166     *(.data*)          /* .data* sections */
168     . = ALIGN(4);
169     _edata = .;        /* define a global symbol at data end */
170   } >RAM AT> MOVABLE_FLASH
172   /* Uninitialized data section */
173   . = ALIGN(4);
174   .bss (NOLOAD) :
175   {
176     /* This is used by the startup in order to initialize the .bss secion */
177     _sbss = .;         /* define a global symbol at bss start */
178     __bss_start__ = _sbss;
179     *(.bss)
180     *(SORT_BY_ALIGNMENT(.bss*))
181     *(COMMON)
183     . = ALIGN(4);
184     _ebss = .;         /* define a global symbol at bss end */
185     __bss_end__ = _ebss;
186   } >RAM
188   /* used during startup to initialized fastram_data */
189   _sfastram_idata = LOADADDR(.fastram_data);
191   /* Initialized FAST_DATA section for unsuspecting developers */
192   /* init in startup/system_at32f43x.c */
193   .fastram_data :
194   {
195     . = ALIGN(4);
196     _sfastram_data = .;        /* create a global symbol at data start */
197     *(.fastram_data)           /* .data sections */
198     *(.fastram_data*)          /* .data* sections */
200     . = ALIGN(4);
201     _efastram_data = .;        /* define a global symbol at data end */
202   } >FASTRAM AT> FLASH1
204 /* define FAST_DATA_ZERO_INIT part  Initialized in startup_at23f435_437_.S */
205   . = ALIGN(4);
206   .fastram_bss (NOLOAD) :
207   {
208     _sfastram_bss = .;
209     __fastram_bss_start__ = _sfastram_bss;
210     *(.fastram_bss)
211     *(SORT_BY_ALIGNMENT(.fastram_bss*))
213     . = ALIGN(4);
214     _efastram_bss = .;
215     __fastram_bss_end__ = _efastram_bss;
216   } >FASTRAM
218   .persistent_data (NOLOAD) :
219   {
220     __persistent_data_start__ = .;
221     *(.persistent_data)
222     . = ALIGN(4);
223     __persistent_data_end__ = .;
224   } >FASTRAM
226   .DMA_RAM (NOLOAD) :
227   { 
228     __dmaram_start__ = .;
229     *(.DMA_RAM)
230     . = ALIGN(32);
231     __dmaram_end__ = .;
232   } >FASTRAM
234   /* User_heap_stack section, used to check that there is enough RAM left */
235   _heap_stack_end = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - _Hot_Reboot_Flags_Size;
236   _heap_stack_begin = _heap_stack_end - _Min_Stack_Size  - _Min_Heap_Size;
237   . = _heap_stack_begin;
238   ._user_heap_stack :
239   {
240     . = ALIGN(4);
241     PROVIDE ( end = . );
242     PROVIDE ( _end = . );
243     . = . + _Min_Heap_Size;
244     . = . + _Min_Stack_Size;
245     . = ALIGN(4);
246   } >STACKRAM = 0xa5
248   /* MEMORY_bank1 section, code must be located here explicitly            */
249   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
250   .memory_b1_text :
251   {
252     *(.mb1text)        /* .mb1text sections (code) */
253     *(.mb1text*)       /* .mb1text* sections (code)  */
254     *(.mb1rodata)      /* read-only data (constants) */
255     *(.mb1rodata*)
256   } >MEMORY_B1
258   /* Remove information from the standard libraries */
259   /DISCARD/ :
260   {
261     libc.a ( * )
262     libm.a ( * )
263     libgcc.a ( * )
264   }
266   .ARM.attributes 0 : { *(.ARM.attributes) }