Эх сурвалжийг харах

Give error if bootloader exceeds 32kB

Petteri Aimonen 3 жил өмнө
parent
commit
27f4f8e291

+ 2 - 1
lib/AzulSCSI_platform_GD32F205/azulscsi_gd32f205.ld

@@ -30,8 +30,9 @@ SECTIONS
   {
     KEEP(*(.text.btldr*))
     . = ALIGN(32768);
+    CHECK_BOOTLOADER_SIZE = 1 / (. <= 32768);
   } >FLASH
-
+  
   /* The startup code goes first into FLASH */
   .isr_vector :
   {

+ 182 - 0
lib/AzulSCSI_platform_GD32F205/azulscsi_gd32f205_btldr.ld

@@ -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) }
+}
+
+

+ 1 - 0
platformio.ini

@@ -6,6 +6,7 @@ board = genericGD32F205VC
 board_build.mcu = gd32f205vct6
 board_build.core = gd32
 board_build.ldscript = lib/AzulSCSI_platform_GD32F205/azulscsi_gd32f205.ld
+ldscript_bootloader = lib/AzulSCSI_platform_GD32F205/azulscsi_gd32f205_btldr.ld
 framework = spl
 lib_compat_mode = off
 lib_deps =

+ 6 - 0
src/build_bootloader.py

@@ -23,6 +23,12 @@ for nodelist in env["PIOBUILDFILES"]:
             dep_objs.append(node)
 # print("Bootloader dependencies: ", type(dep_objs), str([str(f.rfile()) for f in dep_objs]))
 
+# Use different linker script for bootloader
+if env2.GetProjectOption("ldscript_bootloader"):
+    env2.Replace(LDSCRIPT_PATH = env2.GetProjectOption("ldscript_bootloader"))
+    env2['LINKFLAGS'] = [a for a in env2['LINKFLAGS'] if not a.startswith('-T') and not a.endswith('.ld')]
+    env2.Append(LINKFLAGS="-T" + env2.GetProjectOption("ldscript_bootloader"))
+
 # Build bootloader.elf
 bootloader_elf = env2.Program(
     os.path.join("$BUILD_DIR", "bootloader.elf"),