refractor device composite example
This commit is contained in:
		@@ -0,0 +1,6 @@
 | 
			
		||||
<!DOCTYPE Board_Memory_Definition_File>
 | 
			
		||||
<root name="ATSAMD51J19A">
 | 
			
		||||
  <MemorySegment name="FLASH" start="0x00004000" size="0x0007C000" access="ReadOnly" />
 | 
			
		||||
  <MemorySegment name="RAM" start="0x20000000" size="0x00030000" access="Read/Write" />
 | 
			
		||||
  <MemorySegment name="RAM2" start="0x47000000" size="0x00002000" access="Read/Write" />
 | 
			
		||||
</root>
 | 
			
		||||
							
								
								
									
										23643
									
								
								examples/device_composite/ses/samd51/ATSAMD51J19A_Registers.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23643
									
								
								examples/device_composite/ses/samd51/ATSAMD51J19A_Registers.xml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1227
									
								
								examples/device_composite/ses/samd51/ATSAMD51J19A_Vectors.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1227
									
								
								examples/device_composite/ses/samd51/ATSAMD51J19A_Vectors.s
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										128
									
								
								examples/device_composite/ses/samd51/SAMD51_Startup.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								examples/device_composite/ses/samd51/SAMD51_Startup.s
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 *                   SEGGER Microcontroller GmbH & Co. KG                    *
 | 
			
		||||
 *            Solutions for real time microcontroller applications           *
 | 
			
		||||
 *****************************************************************************
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *               (c) 2017 SEGGER Microcontroller GmbH & Co. KG               *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *           Internet: www.segger.com   Support: support@segger.com          *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 *                         Preprocessor Definitions                          *
 | 
			
		||||
 *                         ------------------------                          *
 | 
			
		||||
 * NO_FPU_ENABLE                                                             *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, FPU will not be enabled.                                    *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 * NO_STACK_INIT                                                             *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, the stack pointer will not be initialised.                  *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 * NO_SYSTEM_INIT                                                            *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, the SystemInit() function will not be called. By default    *
 | 
			
		||||
 *   SystemInit() is called after reset to enable the clocks and memories to *
 | 
			
		||||
 *   be initialised prior to any C startup initialisation.                   *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 * NO_VTOR_CONFIG                                                            *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, the vector table offset register will not be configured.    *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 * MEMORY_INIT                                                               *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, the MemoryInit() function will be called. By default        *
 | 
			
		||||
 *   MemoryInit() is called after SystemInit() to enable an external memory  *
 | 
			
		||||
 *   controller.                                                             *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 * STACK_INIT_VAL                                                            *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, specifies the initial stack pointer value. If undefined,    *
 | 
			
		||||
 *   the stack pointer will be initialised to point to the end of the        *
 | 
			
		||||
 *   RAM segment.                                                            *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 * VECTORS_IN_RAM                                                            *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *   If defined, the exception vectors will be copied from Flash to RAM.     *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
  .syntax unified
 | 
			
		||||
 | 
			
		||||
  .global Reset_Handler
 | 
			
		||||
  .extern _vectors
 | 
			
		||||
 | 
			
		||||
  .section .init, "ax"
 | 
			
		||||
  .thumb_func
 | 
			
		||||
 | 
			
		||||
  .equ VTOR_REG, 0xE000ED08
 | 
			
		||||
  .equ FPU_CPACR_REG, 0xE000ED88
 | 
			
		||||
 | 
			
		||||
#ifndef STACK_INIT_VAL
 | 
			
		||||
#define STACK_INIT_VAL __RAM_segment_end__
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
Reset_Handler:
 | 
			
		||||
#ifndef NO_STACK_INIT
 | 
			
		||||
  /* Initialise main stack */
 | 
			
		||||
  ldr r0, =STACK_INIT_VAL
 | 
			
		||||
  bic r0, #0x7
 | 
			
		||||
  mov sp, r0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef NO_SYSTEM_INIT
 | 
			
		||||
  /* Initialise system */
 | 
			
		||||
  ldr r0, =SystemInit
 | 
			
		||||
  blx r0
 | 
			
		||||
  .pushsection .init_array, "aw", %init_array
 | 
			
		||||
  .word SystemCoreClockUpdate
 | 
			
		||||
  .popsection
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef MEMORY_INIT
 | 
			
		||||
  ldr r0, =MemoryInit
 | 
			
		||||
  blx r0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef VECTORS_IN_RAM
 | 
			
		||||
  /* Copy exception vectors into RAM */
 | 
			
		||||
  ldr r0, =__vectors_start__
 | 
			
		||||
  ldr r1, =__vectors_end__
 | 
			
		||||
  ldr r2, =__vectors_ram_start__
 | 
			
		||||
1:
 | 
			
		||||
  cmp r0, r1
 | 
			
		||||
  beq 2f
 | 
			
		||||
  ldr r3, [r0]
 | 
			
		||||
  str r3, [r2]
 | 
			
		||||
  adds r0, r0, #4
 | 
			
		||||
  adds r2, r2, #4
 | 
			
		||||
  b 1b
 | 
			
		||||
2:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef NO_VTOR_CONFIG
 | 
			
		||||
  /* Configure vector table offset register */
 | 
			
		||||
  ldr r0, =VTOR_REG
 | 
			
		||||
#ifdef VECTORS_IN_RAM
 | 
			
		||||
  ldr r1, =_vectors_ram
 | 
			
		||||
#else
 | 
			
		||||
  ldr r1, =_vectors
 | 
			
		||||
#endif
 | 
			
		||||
  str r1, [r0]
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (defined(__ARM_ARCH_FPV4_SP_D16__) || defined(__ARM_ARCH_FPV5_D16__)) && !defined(NO_FPU_ENABLE)
 | 
			
		||||
  /* Enable FPU */
 | 
			
		||||
  ldr r0, =FPU_CPACR_REG
 | 
			
		||||
  ldr r1, [r0]
 | 
			
		||||
  orr r1, r1, #(0xF << 20)
 | 
			
		||||
  str r1, [r0]
 | 
			
		||||
  dsb
 | 
			
		||||
  isb
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Jump to program start */
 | 
			
		||||
  b _start
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								examples/device_composite/ses/samd51/SAMD51_Target.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								examples/device_composite/ses/samd51/SAMD51_Target.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 *                   SEGGER Microcontroller GmbH & Co. KG                    *
 | 
			
		||||
 *            Solutions for real time microcontroller applications           *
 | 
			
		||||
 *****************************************************************************
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *               (c) 2017 SEGGER Microcontroller GmbH & Co. KG               *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *           Internet: www.segger.com   Support: support@segger.com          *
 | 
			
		||||
 *                                                                           *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
function Reset() {
 | 
			
		||||
  TargetInterface.resetAndStop();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function EnableTrace(traceInterfaceType) {
 | 
			
		||||
  // TODO: Enable trace
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								examples/device_composite/ses/samd51/flash_placement.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								examples/device_composite/ses/samd51/flash_placement.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
<!DOCTYPE Linker_Placement_File>
 | 
			
		||||
<Root name="Flash Section Placement">
 | 
			
		||||
  <MemorySegment name="$(FLASH_NAME:FLASH)">
 | 
			
		||||
    <ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START:)" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".init" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".init_rodata" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".text" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".dtors" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".ctors" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".rodata" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".ARM.exidx" address_symbol="__exidx_start" end_symbol="__exidx_end" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" runin=".fast_run" name=".fast" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" runin=".data_run" name=".data" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" runin=".tdata_run" name=".tdata" />
 | 
			
		||||
  </MemorySegment>
 | 
			
		||||
  <MemorySegment name="$(RAM_NAME:RAM);SRAM">
 | 
			
		||||
    <ProgramSection alignment="0x100" load="No" name=".vectors_ram" start="$(RAM_START:$(SRAM_START:))" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".fast_run" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".data_run" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".bss" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".tbss" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".tdata_run" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".non_init" />
 | 
			
		||||
    <ProgramSection alignment="4" size="__HEAPSIZE__" load="No" name=".heap" />
 | 
			
		||||
    <ProgramSection alignment="8" size="__STACKSIZE__" load="No" place_from_segment_end="Yes" name=".stack" />
 | 
			
		||||
    <ProgramSection alignment="8" size="__STACKSIZE_PROCESS__" load="No" name=".stack_process" />
 | 
			
		||||
  </MemorySegment>
 | 
			
		||||
  <MemorySegment name="$(FLASH2_NAME:FLASH2)">
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".text2" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" name=".rodata2" />
 | 
			
		||||
    <ProgramSection alignment="4" load="Yes" runin=".data2_run" name=".data2" />
 | 
			
		||||
  </MemorySegment>
 | 
			
		||||
  <MemorySegment name="$(RAM2_NAME:RAM2)">
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".data2_run" />
 | 
			
		||||
    <ProgramSection alignment="4" load="No" name=".bss2" />
 | 
			
		||||
  </MemorySegment>
 | 
			
		||||
</Root>
 | 
			
		||||
							
								
								
									
										107
									
								
								examples/device_composite/ses/samd51/samd51.emProject
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								examples/device_composite/ses/samd51/samd51.emProject
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
<!DOCTYPE CrossStudio_Project_File>
 | 
			
		||||
<solution Name="samd51" target="8" version="2">
 | 
			
		||||
  <project Name="samd51">
 | 
			
		||||
    <configuration
 | 
			
		||||
      Name="Common"
 | 
			
		||||
      Placement="Flash"
 | 
			
		||||
      Target="nRF52840_xxAA"
 | 
			
		||||
      arm_architecture="v7EM"
 | 
			
		||||
      arm_core_type="Cortex-M4"
 | 
			
		||||
      arm_endian="Little"
 | 
			
		||||
      arm_fp_abi="Hard"
 | 
			
		||||
      arm_fpu_type="FPv4-SP-D16"
 | 
			
		||||
      arm_interwork="No"
 | 
			
		||||
      arm_linker_heap_size="1024"
 | 
			
		||||
      arm_linker_process_stack_size="0"
 | 
			
		||||
      arm_linker_stack_size="1024"
 | 
			
		||||
      arm_simulator_memory_simulation_parameter="RX 00000000,00080000,FFFFFFFF;RWX 20000000,00030000,CDCDCDCD"
 | 
			
		||||
      arm_target_debug_interface_type="ADIv5"
 | 
			
		||||
      arm_target_device_name="ATSAMD51J19"
 | 
			
		||||
      arm_target_interface_type="SWD"
 | 
			
		||||
      build_treat_warnings_as_errors="Yes"
 | 
			
		||||
      c_preprocessor_definitions="__SAMD51_FAMILY;__SAMD51J19A__;ARM_MATH_CM4;FLASH_PLACEMENT=1;USE_SIMPLE_ASSERT;BOARD_METRO_M4_EXPRESS;CFG_TUSB_MCU=OPT_MCU_SAMD51"
 | 
			
		||||
      c_user_include_directories="../../src;$(rootDir)/hw/cmsis/Include;$(rootDir)/hw;$(rootDir)/src;$(asf4Dir);$(asf4Dir)/include;$(asf4Dir)/config;$(asf4Dir)/hri;$(asf4Dir)/hal/include;$(asf4Dir)/hal/utils/include;$(asf4Dir)/hpl/port;$(asf4Dir)/hpl/gclk"
 | 
			
		||||
      debug_register_definition_file="ATSAMD51J19A_Registers.xml"
 | 
			
		||||
      debug_target_connection="J-Link"
 | 
			
		||||
      gcc_entry_point="Reset_Handler"
 | 
			
		||||
      link_use_linker_script_file="No"
 | 
			
		||||
      linker_memory_map_file="ATSAMD51J19A_MemoryMap.xml"
 | 
			
		||||
      linker_section_placement_file="flash_placement.xml"
 | 
			
		||||
      linker_section_placements_segments="FLASH RX 0x00000000 0x00080000;RAM RWX 0x20000000 0x00030000"
 | 
			
		||||
      macros="DeviceFamily=SAMD51;Target=ATSAMD51J19A;Placement=Flash;rootDir=../../../..;asf4Dir=../../../../hw/mcu/microchip/samd/asf4/samd51"
 | 
			
		||||
      project_directory=""
 | 
			
		||||
      project_type="Executable"
 | 
			
		||||
      target_reset_script="Reset();"
 | 
			
		||||
      target_script_file="$(ProjectDir)/SAMD51_Target.js"
 | 
			
		||||
      target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" />
 | 
			
		||||
    <folder
 | 
			
		||||
      Name="tinyusb"
 | 
			
		||||
      exclude=""
 | 
			
		||||
      filter="*.c;*.h"
 | 
			
		||||
      path="../../../../src"
 | 
			
		||||
      recurse="Yes" />
 | 
			
		||||
    <folder Name="hw">
 | 
			
		||||
      <folder Name="bsp">
 | 
			
		||||
        <file file_name="../../../../hw/bsp/ansi_escape.h" />
 | 
			
		||||
        <file file_name="../../../../hw/bsp/board.h" />
 | 
			
		||||
        <folder Name="metro_m4_express">
 | 
			
		||||
          <file file_name="../../../../hw/bsp/metro_m4_express/board_metro_m4_express.c" />
 | 
			
		||||
          <file file_name="../../../../hw/bsp/metro_m4_express/board_metro_m4_express.h" />
 | 
			
		||||
        </folder>
 | 
			
		||||
      </folder>
 | 
			
		||||
      <folder Name="mcu">
 | 
			
		||||
        <folder Name="microchip">
 | 
			
		||||
          <folder Name="samd">
 | 
			
		||||
            <folder Name="asf4">
 | 
			
		||||
              <folder Name="samd51">
 | 
			
		||||
                <folder Name="gcc">
 | 
			
		||||
                  <file file_name="../../../../hw/mcu/microchip/samd/asf4/samd51/gcc/system_samd51.c" />
 | 
			
		||||
                </folder>
 | 
			
		||||
                <folder Name="hpl">
 | 
			
		||||
                  <folder Name="core">
 | 
			
		||||
                    <file file_name="../../../../hw/mcu/microchip/samd/asf4/samd51/hpl/core/hpl_init.c" />
 | 
			
		||||
                  </folder>
 | 
			
		||||
                  <folder Name="osc32kctrl">
 | 
			
		||||
                    <file file_name="../../../../hw/mcu/microchip/samd/asf4/samd51/hpl/osc32kctrl/hpl_osc32kctrl.c" />
 | 
			
		||||
                  </folder>
 | 
			
		||||
                  <folder Name="oscctrl">
 | 
			
		||||
                    <file file_name="../../../../hw/mcu/microchip/samd/asf4/samd51/hpl/oscctrl/hpl_oscctrl.c" />
 | 
			
		||||
                  </folder>
 | 
			
		||||
                  <folder Name="mclk">
 | 
			
		||||
                    <file file_name="../../../../hw/mcu/microchip/samd/asf4/samd51/hpl/mclk/hpl_mclk.c" />
 | 
			
		||||
                  </folder>
 | 
			
		||||
                  <folder Name="gclk">
 | 
			
		||||
                    <file file_name="../../../../hw/mcu/microchip/samd/asf4/samd51/hpl/gclk/hpl_gclk.c" />
 | 
			
		||||
                  </folder>
 | 
			
		||||
                </folder>
 | 
			
		||||
              </folder>
 | 
			
		||||
            </folder>
 | 
			
		||||
          </folder>
 | 
			
		||||
        </folder>
 | 
			
		||||
      </folder>
 | 
			
		||||
    </folder>
 | 
			
		||||
    <configuration Name="Debug" build_treat_warnings_as_errors="Yes" />
 | 
			
		||||
    <folder
 | 
			
		||||
      Name="src"
 | 
			
		||||
      exclude=""
 | 
			
		||||
      filter="*.c;*.h"
 | 
			
		||||
      path="../../src"
 | 
			
		||||
      recurse="Yes" />
 | 
			
		||||
    <folder Name="System Files">
 | 
			
		||||
      <file file_name="ATSAMD51J19A_MemoryMap.xml" />
 | 
			
		||||
      <file file_name="ATSAMD51J19A_Registers.xml" />
 | 
			
		||||
      <file file_name="ATSAMD51J19A_Vectors.s" />
 | 
			
		||||
      <file file_name="flash_placement.xml" />
 | 
			
		||||
      <file file_name="SAMD51_Startup.s" />
 | 
			
		||||
      <file file_name="SAMD51_Target.js" />
 | 
			
		||||
      <file file_name="thumb_crt0.s" />
 | 
			
		||||
    </folder>
 | 
			
		||||
    <folder
 | 
			
		||||
      Name="segger_rtt"
 | 
			
		||||
      exclude=""
 | 
			
		||||
      filter="*.c;*.h"
 | 
			
		||||
      path="../../../../lib/segger_rtt"
 | 
			
		||||
      recurse="No" />
 | 
			
		||||
  </project>
 | 
			
		||||
  <configuration Name="Metro M4 Express" />
 | 
			
		||||
</solution>
 | 
			
		||||
							
								
								
									
										415
									
								
								examples/device_composite/ses/samd51/thumb_crt0.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										415
									
								
								examples/device_composite/ses/samd51/thumb_crt0.s
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,415 @@
 | 
			
		||||
// **********************************************************************
 | 
			
		||||
// *                    SEGGER Microcontroller GmbH                     *
 | 
			
		||||
// *                        The Embedded Experts                        *
 | 
			
		||||
// **********************************************************************
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// *            (c) 2014 - 2018 SEGGER Microcontroller GmbH             *
 | 
			
		||||
// *            (c) 2001 - 2018 Rowley Associates Limited               *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// *           www.segger.com     Support: support@segger.com           *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// **********************************************************************
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// * All rights reserved.                                               *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// * Redistribution and use in source and binary forms, with or         *
 | 
			
		||||
// * without modification, are permitted provided that the following    *
 | 
			
		||||
// * conditions are met:                                                *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// * - Redistributions of source code must retain the above copyright   *
 | 
			
		||||
// *   notice, this list of conditions and the following disclaimer.    *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// * - Neither the name of SEGGER Microcontroller GmbH                  *
 | 
			
		||||
// *   nor the names of its contributors may be used to endorse or      *
 | 
			
		||||
// *   promote products derived from this software without specific     *
 | 
			
		||||
// *   prior written permission.                                        *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *
 | 
			
		||||
// * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *
 | 
			
		||||
// * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *
 | 
			
		||||
// * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *
 | 
			
		||||
// * DISCLAIMED.                                                        *
 | 
			
		||||
// * IN NO EVENT SHALL SEGGER Microcontroller GmbH BE LIABLE FOR        *
 | 
			
		||||
// * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *
 | 
			
		||||
// * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *
 | 
			
		||||
// * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *
 | 
			
		||||
// * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *
 | 
			
		||||
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *
 | 
			
		||||
// * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *
 | 
			
		||||
// * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *
 | 
			
		||||
// * DAMAGE.                                                            *
 | 
			
		||||
// *                                                                    *
 | 
			
		||||
// **********************************************************************
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//                           Preprocessor Definitions
 | 
			
		||||
//                           ------------------------
 | 
			
		||||
// APP_ENTRY_POINT
 | 
			
		||||
//
 | 
			
		||||
//   Defines the application entry point function, if undefined this setting
 | 
			
		||||
//   defaults to "main".
 | 
			
		||||
//
 | 
			
		||||
// INITIALIZE_STACK
 | 
			
		||||
//
 | 
			
		||||
//   If defined, the contents of the stack will be initialized to a the
 | 
			
		||||
//   value 0xCC.
 | 
			
		||||
//
 | 
			
		||||
// INITIALIZE_SECONDARY_SECTIONS
 | 
			
		||||
//
 | 
			
		||||
//   If defined, the .data2, .text2, .rodata2 and .bss2 sections will be initialized.
 | 
			
		||||
//
 | 
			
		||||
// INITIALIZE_TCM_SECTIONS
 | 
			
		||||
//
 | 
			
		||||
//   If defined, the .data_tcm, .text_tcm, .rodata_tcm and .bss_tcm sections 
 | 
			
		||||
//   will be initialized.
 | 
			
		||||
//
 | 
			
		||||
// INITIALIZE_USER_SECTIONS
 | 
			
		||||
//
 | 
			
		||||
//   If defined, the function InitializeUserMemorySections will be called prior
 | 
			
		||||
//   to entering main in order to allow the user to initialize any user defined
 | 
			
		||||
//   memory sections.
 | 
			
		||||
//
 | 
			
		||||
// FULL_LIBRARY
 | 
			
		||||
//
 | 
			
		||||
//  If defined then 
 | 
			
		||||
//    - argc, argv are setup by the debug_getargs.
 | 
			
		||||
//    - the exit symbol is defined and executes on return from main.
 | 
			
		||||
//    - the exit symbol calls destructors, atexit functions and then debug_exit.
 | 
			
		||||
//  
 | 
			
		||||
//  If not defined then
 | 
			
		||||
//    - argc and argv are zero.
 | 
			
		||||
//    - the exit symbol is defined, executes on return from main and loops
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef APP_ENTRY_POINT
 | 
			
		||||
#define APP_ENTRY_POINT main
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef ARGSSPACE
 | 
			
		||||
#define ARGSSPACE 128
 | 
			
		||||
#endif
 | 
			
		||||
  .syntax unified
 | 
			
		||||
 | 
			
		||||
  .global _start
 | 
			
		||||
  .extern APP_ENTRY_POINT
 | 
			
		||||
  .global exit
 | 
			
		||||
  .weak exit
 | 
			
		||||
 | 
			
		||||
#ifdef INITIALIZE_USER_SECTIONS
 | 
			
		||||
  .extern InitializeUserMemorySections
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  .section .init, "ax"
 | 
			
		||||
  .code 16
 | 
			
		||||
  .balign 2
 | 
			
		||||
  .thumb_func
 | 
			
		||||
 | 
			
		||||
_start:
 | 
			
		||||
  /* Set up main stack if size > 0 */
 | 
			
		||||
  ldr r1, =__stack_end__
 | 
			
		||||
  ldr r0, =__stack_start__
 | 
			
		||||
  subs r2, r1, r0
 | 
			
		||||
  beq 1f
 | 
			
		||||
#ifdef __ARM_EABI__
 | 
			
		||||
  movs r2, #0x7
 | 
			
		||||
  bics r1, r2
 | 
			
		||||
#endif
 | 
			
		||||
  mov sp, r1
 | 
			
		||||
#ifdef INITIALIZE_STACK
 | 
			
		||||
  movs r2, #0xCC
 | 
			
		||||
  ldr r0, =__stack_start__
 | 
			
		||||
  bl memory_set
 | 
			
		||||
#endif
 | 
			
		||||
1:
 | 
			
		||||
 | 
			
		||||
  /* Set up process stack if size > 0 */
 | 
			
		||||
  ldr r1, =__stack_process_end__
 | 
			
		||||
  ldr r0, =__stack_process_start__
 | 
			
		||||
  subs r2, r1, r0
 | 
			
		||||
  beq 1f
 | 
			
		||||
#ifdef __ARM_EABI__
 | 
			
		||||
  movs r2, #0x7
 | 
			
		||||
  bics r1, r2
 | 
			
		||||
#endif
 | 
			
		||||
  msr psp, r1
 | 
			
		||||
  movs r2, #2
 | 
			
		||||
  msr control, r2
 | 
			
		||||
#ifdef INITIALIZE_STACK
 | 
			
		||||
  movs r2, #0xCC
 | 
			
		||||
  bl memory_set
 | 
			
		||||
#endif
 | 
			
		||||
1:
 | 
			
		||||
 | 
			
		||||
  /* Copy initialized memory sections into RAM (if necessary). */
 | 
			
		||||
  ldr r0, =__data_load_start__
 | 
			
		||||
  ldr r1, =__data_start__
 | 
			
		||||
  ldr r2, =__data_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__text_load_start__
 | 
			
		||||
  ldr r1, =__text_start__
 | 
			
		||||
  ldr r2, =__text_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__fast_load_start__
 | 
			
		||||
  ldr r1, =__fast_start__
 | 
			
		||||
  ldr r2, =__fast_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__ctors_load_start__
 | 
			
		||||
  ldr r1, =__ctors_start__
 | 
			
		||||
  ldr r2, =__ctors_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__dtors_load_start__
 | 
			
		||||
  ldr r1, =__dtors_start__
 | 
			
		||||
  ldr r2, =__dtors_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__rodata_load_start__
 | 
			
		||||
  ldr r1, =__rodata_start__
 | 
			
		||||
  ldr r2, =__rodata_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__tdata_load_start__
 | 
			
		||||
  ldr r1, =__tdata_start__
 | 
			
		||||
  ldr r2, =__tdata_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
#ifdef INITIALIZE_SECONDARY_SECTIONS
 | 
			
		||||
  ldr r0, =__data2_load_start__
 | 
			
		||||
  ldr r1, =__data2_start__
 | 
			
		||||
  ldr r2, =__data2_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__text2_load_start__
 | 
			
		||||
  ldr r1, =__text2_start__
 | 
			
		||||
  ldr r2, =__text2_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__rodata2_load_start__
 | 
			
		||||
  ldr r1, =__rodata2_start__
 | 
			
		||||
  ldr r2, =__rodata2_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
#endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
 | 
			
		||||
#ifdef INITIALIZE_TCM_SECTIONS
 | 
			
		||||
  ldr r0, =__data_tcm_load_start__
 | 
			
		||||
  ldr r1, =__data_tcm_start__
 | 
			
		||||
  ldr r2, =__data_tcm_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__text_tcm_load_start__
 | 
			
		||||
  ldr r1, =__text_tcm_start__
 | 
			
		||||
  ldr r2, =__text_tcm_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
  ldr r0, =__rodata_tcm_load_start__
 | 
			
		||||
  ldr r1, =__rodata_tcm_start__
 | 
			
		||||
  ldr r2, =__rodata_tcm_end__
 | 
			
		||||
  bl memory_copy
 | 
			
		||||
#endif /* #ifdef INITIALIZE_TCM_SECTIONS */
 | 
			
		||||
 | 
			
		||||
  /* Zero the bss. */
 | 
			
		||||
  ldr r0, =__bss_start__
 | 
			
		||||
  ldr r1, =__bss_end__
 | 
			
		||||
  movs r2, #0
 | 
			
		||||
  bl memory_set
 | 
			
		||||
  ldr r0, =__tbss_start__
 | 
			
		||||
  ldr r1, =__tbss_end__
 | 
			
		||||
  movs r2, #0
 | 
			
		||||
  bl memory_set
 | 
			
		||||
#ifdef INITIALIZE_SECONDARY_SECTIONS
 | 
			
		||||
  ldr r0, =__bss2_start__
 | 
			
		||||
  ldr r1, =__bss2_end__
 | 
			
		||||
  mov r2, #0
 | 
			
		||||
  bl memory_set
 | 
			
		||||
#endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
 | 
			
		||||
#ifdef INITIALIZE_TCM_SECTIONS
 | 
			
		||||
  ldr r0, =__bss_tcm_start__
 | 
			
		||||
  ldr r1, =__bss_tcm_end__
 | 
			
		||||
  mov r2, #0
 | 
			
		||||
  bl memory_set
 | 
			
		||||
#endif /* #ifdef INITIALIZE_TCM_SECTIONS */
 | 
			
		||||
 | 
			
		||||
  /* Initialize the heap */
 | 
			
		||||
  ldr r0, = __heap_start__
 | 
			
		||||
  ldr r1, = __heap_end__
 | 
			
		||||
  subs r1, r1, r0
 | 
			
		||||
  cmp r1, #8
 | 
			
		||||
  blt 1f
 | 
			
		||||
  movs r2, #0
 | 
			
		||||
  str r2, [r0]
 | 
			
		||||
  adds r0, r0, #4
 | 
			
		||||
  str r1, [r0]
 | 
			
		||||
1:
 | 
			
		||||
 | 
			
		||||
#ifdef INITIALIZE_USER_SECTIONS
 | 
			
		||||
  ldr r2, =InitializeUserMemorySections
 | 
			
		||||
  blx r2
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Call constructors */
 | 
			
		||||
  ldr r0, =__ctors_start__
 | 
			
		||||
  ldr r1, =__ctors_end__
 | 
			
		||||
ctor_loop:
 | 
			
		||||
  cmp r0, r1
 | 
			
		||||
  beq ctor_end
 | 
			
		||||
  ldr r2, [r0]
 | 
			
		||||
  adds r0, #4
 | 
			
		||||
  push {r0-r1}  
 | 
			
		||||
  blx r2
 | 
			
		||||
  pop {r0-r1}
 | 
			
		||||
  b ctor_loop
 | 
			
		||||
ctor_end:
 | 
			
		||||
 | 
			
		||||
  /* Setup initial call frame */
 | 
			
		||||
  movs r0, #0
 | 
			
		||||
  mov lr, r0
 | 
			
		||||
  mov r12, sp
 | 
			
		||||
 | 
			
		||||
  .type start, function
 | 
			
		||||
start:
 | 
			
		||||
  /* Jump to application entry point */
 | 
			
		||||
#ifdef FULL_LIBRARY
 | 
			
		||||
  movs r0, #ARGSSPACE
 | 
			
		||||
  ldr r1, =args
 | 
			
		||||
  ldr r2, =debug_getargs  
 | 
			
		||||
  blx r2
 | 
			
		||||
  ldr r1, =args
 | 
			
		||||
#else
 | 
			
		||||
  movs r0, #0
 | 
			
		||||
  movs r1, #0
 | 
			
		||||
#endif
 | 
			
		||||
  ldr r2, =APP_ENTRY_POINT
 | 
			
		||||
  blx r2
 | 
			
		||||
 | 
			
		||||
  .thumb_func
 | 
			
		||||
exit:
 | 
			
		||||
#ifdef FULL_LIBRARY  
 | 
			
		||||
  mov r5, r0 // save the exit parameter/return result
 | 
			
		||||
 | 
			
		||||
  /* Call destructors */
 | 
			
		||||
  ldr r0, =__dtors_start__
 | 
			
		||||
  ldr r1, =__dtors_end__
 | 
			
		||||
dtor_loop:
 | 
			
		||||
  cmp r0, r1
 | 
			
		||||
  beq dtor_end
 | 
			
		||||
  ldr r2, [r0]
 | 
			
		||||
  add r0, #4
 | 
			
		||||
  push {r0-r1}
 | 
			
		||||
  blx r2
 | 
			
		||||
  pop {r0-r1}
 | 
			
		||||
  b dtor_loop
 | 
			
		||||
dtor_end:
 | 
			
		||||
 | 
			
		||||
  /* Call atexit functions */
 | 
			
		||||
  ldr r2, =_execute_at_exit_fns  
 | 
			
		||||
  blx r2
 | 
			
		||||
 | 
			
		||||
  /* Call debug_exit with return result/exit parameter */
 | 
			
		||||
  mov r0, r5
 | 
			
		||||
  ldr r2, =debug_exit  
 | 
			
		||||
  blx r2
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Returned from application entry point, loop forever. */
 | 
			
		||||
exit_loop:
 | 
			
		||||
  b exit_loop
 | 
			
		||||
 | 
			
		||||
  .thumb_func
 | 
			
		||||
memory_copy:
 | 
			
		||||
  cmp r0, r1
 | 
			
		||||
  beq 2f
 | 
			
		||||
  subs r2, r2, r1
 | 
			
		||||
  beq 2f
 | 
			
		||||
1:
 | 
			
		||||
  ldrb r3, [r0]
 | 
			
		||||
  adds r0, r0, #1
 | 
			
		||||
  strb r3, [r1]
 | 
			
		||||
  adds r1, r1, #1
 | 
			
		||||
  subs r2, r2, #1
 | 
			
		||||
  bne 1b
 | 
			
		||||
2:
 | 
			
		||||
  bx lr
 | 
			
		||||
 | 
			
		||||
  .thumb_func
 | 
			
		||||
memory_set:
 | 
			
		||||
  cmp r0, r1
 | 
			
		||||
  beq 1f
 | 
			
		||||
  strb r2, [r0]
 | 
			
		||||
  adds r0, r0, #1
 | 
			
		||||
  b memory_set
 | 
			
		||||
1:
 | 
			
		||||
  bx lr
 | 
			
		||||
 | 
			
		||||
  // default C/C++ library helpers
 | 
			
		||||
 | 
			
		||||
.macro HELPER helper_name
 | 
			
		||||
  .section .text.\helper_name, "ax", %progbits
 | 
			
		||||
  .balign 2
 | 
			
		||||
  .global \helper_name
 | 
			
		||||
  .weak \helper_name  
 | 
			
		||||
\helper_name:
 | 
			
		||||
  .thumb_func
 | 
			
		||||
.endm
 | 
			
		||||
 | 
			
		||||
.macro JUMPTO name
 | 
			
		||||
#if defined(__thumb__) && !defined(__thumb2__)
 | 
			
		||||
  mov r12, r0
 | 
			
		||||
  ldr r0, =\name
 | 
			
		||||
  push {r0}
 | 
			
		||||
  mov r0, r12
 | 
			
		||||
  pop {pc}
 | 
			
		||||
#else
 | 
			
		||||
  b \name
 | 
			
		||||
#endif
 | 
			
		||||
.endm
 | 
			
		||||
 | 
			
		||||
HELPER __aeabi_read_tp
 | 
			
		||||
  ldr r0, =__tbss_start__-8
 | 
			
		||||
  bx lr
 | 
			
		||||
HELPER abort
 | 
			
		||||
  b .
 | 
			
		||||
HELPER __assert
 | 
			
		||||
  b .
 | 
			
		||||
HELPER __aeabi_assert
 | 
			
		||||
  b .
 | 
			
		||||
HELPER __sync_synchronize
 | 
			
		||||
  bx lr
 | 
			
		||||
HELPER __getchar
 | 
			
		||||
  JUMPTO debug_getchar
 | 
			
		||||
HELPER __putchar
 | 
			
		||||
  JUMPTO debug_putchar
 | 
			
		||||
HELPER __open
 | 
			
		||||
  JUMPTO debug_fopen
 | 
			
		||||
HELPER __close
 | 
			
		||||
  JUMPTO debug_fclose
 | 
			
		||||
HELPER __write   
 | 
			
		||||
  mov r3, r0
 | 
			
		||||
  mov r0, r1
 | 
			
		||||
  movs r1, #1  
 | 
			
		||||
  JUMPTO debug_fwrite
 | 
			
		||||
HELPER __read  
 | 
			
		||||
  mov r3, r0
 | 
			
		||||
  mov r0, r1
 | 
			
		||||
  movs r1, #1 
 | 
			
		||||
  JUMPTO debug_fread
 | 
			
		||||
HELPER __seek
 | 
			
		||||
  push {r4, lr}
 | 
			
		||||
  mov r4, r0
 | 
			
		||||
  bl debug_fseek
 | 
			
		||||
  cmp r0, #0
 | 
			
		||||
  bne 1f
 | 
			
		||||
  mov r0, r4
 | 
			
		||||
  bl debug_ftell
 | 
			
		||||
  pop {r4, pc}
 | 
			
		||||
1:
 | 
			
		||||
  ldr r0, =-1
 | 
			
		||||
  pop {r4, pc}
 | 
			
		||||
  // char __user_locale_name_buffer[];
 | 
			
		||||
  .section .bss.__user_locale_name_buffer, "aw", %nobits
 | 
			
		||||
  .global __user_locale_name_buffer
 | 
			
		||||
  .weak __user_locale_name_buffer
 | 
			
		||||
  __user_locale_name_buffer:
 | 
			
		||||
  .word 0x0
 | 
			
		||||
 | 
			
		||||
#ifdef FULL_LIBRARY
 | 
			
		||||
  .bss
 | 
			
		||||
args:
 | 
			
		||||
  .space ARGSSPACE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */
 | 
			
		||||
  .section .stack, "wa", %nobits
 | 
			
		||||
  .section .stack_process, "wa", %nobits
 | 
			
		||||
  .section .heap, "wa", %nobits
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user