forked from xuos/xiuos
				
			
		
			
				
	
	
		
			148 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| /* ------------------------------------------------------------------------- */
 | |
| /*  @file:    startup_MIMXRT1052.s                                           */
 | |
| /*  @purpose: CMSIS Cortex-M7 Core Device Startup File                       */
 | |
| /*            MIMXRT1052                                                     */
 | |
| /*  @version: 1.0                                                            */
 | |
| /*  @date:    2018-9-21                                                      */
 | |
| /*  @build:   b180921                                                        */
 | |
| /* ------------------------------------------------------------------------- */
 | |
| /*                                                                           */
 | |
| /* Copyright 1997-2016 Freescale Semiconductor, Inc.                         */
 | |
| /* Copyright 2016-2018 NXP                                                   */
 | |
| /* All rights reserved.                                                      */
 | |
| /*                                                                           */
 | |
| /* SPDX-License-Identifier: BSD-3-Clause                                     */
 | |
| /*****************************************************************************/
 | |
| /* Version: GCC for ARM Embedded Processors                                  */
 | |
| /*****************************************************************************/
 | |
| 
 | |
| 
 | |
| /**
 | |
| * @file boot.S
 | |
| * @brief Contex-M7 start function
 | |
| * @version 1.0 
 | |
| * @author AIIT XUOS Lab
 | |
| * @date 2021-05-28
 | |
| */
 | |
| 
 | |
| /*************************************************
 | |
| File name: boot.S
 | |
| Description: Contex-M7 start function function
 | |
| Others: take startup_MIMXRT1052.s for references
 | |
| History: 
 | |
| 1. Date: 2021-05-28
 | |
| Author: AIIT XUOS Lab
 | |
| Modification: 
 | |
| 1. add OS entry function
 | |
| *************************************************/
 | |
| 
 | |
|     .syntax unified
 | |
|     .arch armv7-m
 | |
|     .text
 | |
|     .thumb
 | |
| 
 | |
| /* Reset Handler */
 | |
| 
 | |
|     .thumb_func
 | |
|     .align 2
 | |
|     .globl   Reset_Handler
 | |
|     .weak    Reset_Handler
 | |
|     .type    Reset_Handler, %function
 | |
| Reset_Handler:
 | |
|     cpsid   i               /* Mask interrupts */
 | |
|     .equ    VTOR, 0xE000ED08
 | |
|     ldr     r0, =VTOR
 | |
|     ldr     r1, =__isr_vector
 | |
|     str     r1, [r0]
 | |
|     ldr     r2, [r1]
 | |
|     msr     msp, r2
 | |
| #ifndef __NO_SYSTEM_INIT
 | |
|     ldr   r0,=SystemInit
 | |
|     blx   r0
 | |
| #endif
 | |
| /*     Loop to copy data from read only memory to RAM. The ranges
 | |
|  *      of copy from/to are specified by following symbols evaluated in
 | |
|  *      linker script.
 | |
|  *      __etext: End of code section, i.e., begin of data sections to copy from.
 | |
|  *      __data_start__/__data_end__: RAM address range that data should be
 | |
|  *      __noncachedata_start__/__noncachedata_end__ : none cachable region
 | |
|  *      copied to. Both must be aligned to 4 bytes boundary.  */
 | |
| 
 | |
|     ldr    r1, =__etext
 | |
|     ldr    r2, =__data_start__
 | |
|     ldr    r3, =__data_end__
 | |
| 
 | |
| #if 1
 | |
| /* Here are two copies of loop implemenations. First one favors code size
 | |
|  * and the second one favors performance. Default uses the first one.
 | |
|  * Change to "#if 0" to use the second one */
 | |
| .LC0:
 | |
|     cmp     r2, r3
 | |
|     ittt    lt
 | |
|     ldrlt   r0, [r1], #4
 | |
|     strlt   r0, [r2], #4
 | |
|     blt    .LC0
 | |
| #else
 | |
|     subs    r3, r2
 | |
|     ble    .LC1
 | |
| .LC0:
 | |
|     subs    r3, #4
 | |
|     ldr    r0, [r1, r3]
 | |
|     str    r0, [r2, r3]
 | |
|     bgt    .LC0
 | |
| .LC1:
 | |
| #endif
 | |
| #ifdef __STARTUP_INITIALIZE_NONCACHEDATA
 | |
|     ldr    r2, =__noncachedata_start__
 | |
|     ldr    r3, =__noncachedata_init_end__
 | |
| #if 1
 | |
| .LC2:
 | |
|     cmp     r2, r3
 | |
|     ittt    lt
 | |
|     ldrlt   r0, [r1], #4
 | |
|     strlt   r0, [r2], #4
 | |
|     blt    .LC2
 | |
| #else
 | |
|     subs    r3, r2
 | |
|     ble    .LC3
 | |
| .LC2:
 | |
|     subs    r3, #4
 | |
|     ldr    r0, [r1, r3]
 | |
|     str    r0, [r2, r3]
 | |
|     bgt    .LC2
 | |
| .LC3:
 | |
| #endif
 | |
| /* zero inited ncache section initialization */
 | |
|     ldr r3, =__noncachedata_end__
 | |
|     movs    r0,0
 | |
| .LC4:
 | |
|     cmp    r2,r3
 | |
|     itt    lt
 | |
|     strlt   r0,[r2],#4
 | |
|     blt    .LC4
 | |
| #endif /* __STARTUP_INITIALIZE_NONCACHEDATA */
 | |
| 
 | |
| #ifdef __STARTUP_CLEAR_BSS
 | |
| /*     This part of work usually is done in C library startup code. Otherwise,
 | |
|  *     define this macro to enable it in this startup.
 | |
|  *
 | |
|  *     Loop to zero out BSS section, which uses following symbols
 | |
|  *     in linker script:
 | |
|  *      __bss_start__: start of BSS section. Must align to 4
 | |
|  *      __bss_end__: end of BSS section. Must align to 4
 | |
|  */
 | |
|     ldr r1, =__bss_start__
 | |
|     ldr r2, =__bss_end__
 | |
| 
 | |
|     movs    r0, 0
 | |
| .LC5:
 | |
|     cmp     r1, r2
 | |
|     itt    lt
 | |
|     strlt   r0, [r1], #4
 | |
|     blt    .LC5
 | |
| #endif /* __STARTUP_CLEAR_BSS */
 | |
| 
 | |
|     ldr   r0,=entry
 | |
|     blx   r0
 | |
| 
 | |
| .size Reset_Handler, . - Reset_Handler |