| 
					
				 | 
			
			
				@@ -0,0 +1,182 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Customized linker script for building bootloader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Entry Point */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ENTRY(Reset_Handler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Highest address of the user mode stack */  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_estack = 0x20020000;    /* end of RAM */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Generate a link error if heap and stack don't fit into RAM */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_Min_Heap_Size = 0x200;      /* required amount of heap  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_Min_Stack_Size = 0x400;     /* required amount of stack */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Specify the memory areas */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+MEMORY 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    CCRAM (xrw)    : ORIGIN = 0x10000000, LENGTH = 0K 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FLASH (rx)     : ORIGIN = 0x08000000, LENGTH = 32K 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Define output sections */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+SECTIONS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Discard interrupt vectors that are not needed for bootloader. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * This way unnecessary code doesn't get pulled in. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /DISCARD/ : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(*DMA1_Channel4_IRQHandler*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(*DMA1_Channel1_IRQHandler*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(*EXTI3_IRQHandler*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(*EXTI10_15_IRQHandler*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  DMA1_Channel1_IRQHandler = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  DMA1_Channel4_IRQHandler = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  EXTI10_15_IRQHandler = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  EXTI3_IRQHandler = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* The startup code goes first into FLASH */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .isr_vector : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP(*(.isr_vector)) /* Startup code */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* The program code and other data goes into FLASH */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .text : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.text)           /* .text sections (code) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.text*)          /* .text* sections (code) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.glue_7)         /* glue arm to thumb code */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.glue_7t)        /* glue thumb to arm code */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.eh_frame) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(.init)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(.fini)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _etext = .;        /* define a global symbols at end of code */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Constant data goes into FLASH */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .rodata : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.rodata)         /* .rodata sections (constants, strings, etc.) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .ARM : { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    __exidx_start = .; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.ARM.exidx*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    __exidx_end = .; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .preinit_array     : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE_HIDDEN (__preinit_array_start = .); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(.preinit_array*)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE_HIDDEN (__preinit_array_end = .); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .init_array : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE_HIDDEN (__init_array_start = .); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(SORT(.init_array.*))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(.init_array*)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE_HIDDEN (__init_array_end = .); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .fini_array : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE_HIDDEN (__fini_array_start = .); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(SORT(.fini_array.*))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP (*(.fini_array*)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE_HIDDEN (__fini_array_end = .); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* used by the startup to initialize data */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  _sidata = LOADADDR(.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Initialized data sections goes into RAM, load LMA copy after code */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .data :  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _sdata = .;        /* create a global symbol at data start */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.data)           /* .data sections */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.data*)          /* .data* sections */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _edata = .;        /* define a global symbol at data end */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >RAM AT> FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Uninitialized data section */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .bss : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* This is used by the startup in order to initialize the .bss secion */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _sbss = .;         /* define a global symbol at bss start */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    __bss_start__ = _sbss; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.bss) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.bss*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(COMMON) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _ebss = .;         /* define a global symbol at bss end */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    __bss_end__ = _ebss; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >RAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* User_heap_stack section, used to check that there is enough RAM left */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ._user_heap_stack : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE ( end = . ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    PROVIDE ( _end = . ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = . + _Min_Heap_Size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = . + _Min_Stack_Size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >RAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* uninitialized CCRAM objects (like, buffers) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .ccram_bss : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    __ccram_start_bss__ = .; /* define a global symbol at ccram start */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP(*(.ccram_bss)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    KEEP(*(.ccram_bss*)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    __ccram_end_bss__ = .; /* define a global symbol at end of *used* CCRAM (BSS) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >CCRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* initialized CCRAM objects (like, initialized variables) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  _si_ccram_data = LOADADDR(.ccram_data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .ccram_data : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _ccram_start_data = .;    /* create a global symbol at data start */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.ccram_bss)             /* .data sections */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *(.ccram_bss*)            /* .data* sections */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    . = ALIGN(4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _ccram_end_data = .;      /* define a global symbol at data end */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } >CCRAM AT> FLASH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Remove information from the standard libraries */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /DISCARD/ : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    libc.a ( * ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    libm.a ( * ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    libgcc.a ( * ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .ARM.attributes 0 : { *(.ARM.attributes) } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |