/* Copyright Statement:
 *
 * (C) 2005-2016  MediaTek Inc. All rights reserved.
 *
 * This software/firmware and related documentation ("MediaTek Software") are
 * protected under relevant copyright laws. The information contained herein
 * is confidential and proprietary to MediaTek Inc. ("MediaTek") and/or its licensors.
 * Without the prior written permission of MediaTek and/or its licensors,
 * any reproduction, modification, use or disclosure of MediaTek Software,
 * and information contained herein, in whole or in part, shall be strictly prohibited.
 * You may only use, reproduce, modify, or distribute (as applicable) MediaTek Software
 * if you have agreed to and been bound by the applicable license agreement with
 * MediaTek ("License Agreement") and been granted explicit permission to do so within
 * the License Agreement ("Permitted User").  If you are not a Permitted User,
 * please cease any access or use of MediaTek Software immediately.
 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
 * THAT MEDIATEK SOFTWARE RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES
 * ARE PROVIDED TO RECEIVER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
 * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
 * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
 * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
 * SUPPLIED WITH MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
 * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
 * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
 * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
 * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
 * CUMULATIVE LIABILITY WITH RESPECT TO MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
 * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE MEDIATEK SOFTWARE AT ISSUE,
 * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
 * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
 */

    .syntax unified
    .arch armv7-m

/* Memory Model
   The HEAP starts at the end of the DATA section and grows upward.
   
   The STACK starts at the end of the RAM and grows downward.
   
   The HEAP and stack STACK are only checked at compile time:
   (DATA_SIZE + HEAP_SIZE + STACK_SIZE) < RAM_SIZE
   
   This is just a check for the bare minimum for the Heap+Stack area before
   aborting compilation, it is not the run time limit:
   Heap_Size + Stack_Size = 0x80 + 0x80 = 0x100
 */
    .section .stack
    .align 3
#ifdef __STACK_SIZE
    .equ    Stack_Size, __STACK_SIZE
#else
    .equ    Stack_Size, 0xc00
#endif
    .globl    __StackTop
    .globl    __StackLimit
__StackLimit:
    .space    Stack_Size
    .size __StackLimit, . - __StackLimit
__StackTop:
    .size __StackTop, . - __StackTop

    .section .heap
    .align 3
#ifdef __HEAP_SIZE
    .equ    Heap_Size, __HEAP_SIZE
#else
    .equ    Heap_Size, 0x800
#endif
    .globl    __HeapBase
    .globl    __HeapLimit
__HeapBase:
    .space    Heap_Size
    .size __HeapBase, . - __HeapBase
__HeapLimit:
    .size __HeapLimit, . - __HeapLimit
    
    .section .isr_vector
    .align 2
    .globl __isr_vector
__isr_vector:
    .long    __StackTop            /* Top of Stack */
    .long    Reset_Handler         /* Reset Handler */
    .long    NMI_Handler           /* NMI Handler */
    .long    HardFault_Handler     /* Hard Fault Handler */
    .long    MemManage_Handler     /* MPU Fault Handler */
    .long    BusFault_Handler      /* Bus Fault Handler */
    .long    UsageFault_Handler    /* Usage Fault Handler */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    SvcCall_Main          /* SVCall Handler */
    .long    DebugMon_Handler      /* Debug Monitor Handler */
    .long    0                     /* Reserved */
    .long    PendSV_Main           /* PendSV Handler */
    .long    SysTick_Main          /* SysTick Handler */

    /* External interrupts */
    .long   isrC_main         /* 16: UART1  */
    .long   isrC_main         /* 17: DMA */
    .long   isrC_main         /* 18: HIF */   
    .long   isrC_main         /* 19: I2C1 */
    .long   isrC_main         /* 20: I2C2 */
    .long   isrC_main         /* 21: UART2 */
    .long   isrC_main         /* 22: MTK_CRYPTO */
    .long   isrC_main         /* 23: SF */
    .long   isrC_main         /* 24: EINT */
    .long   isrC_main         /* 25: BTIF */
    .long   isrC_main         /* 26: WDT */
    .long   isrC_main         /* 27: reserved */
    .long   isrC_main         /* 28: SPI_SLAVE */
    .long   isrC_main         /* 29:  WDT_N9 */
    .long   isrC_main         /* 30:  ADC */
    .long   isrC_main         /* 31:  IRDA_TX */
    .long   isrC_main         /* 32:  IRDA_RX */
    .long   isrC_main         /* 33:  USB_VBUS_ON */
    .long   isrC_main         /* 34:  USB_VBUS_OFF */
    .long   isrC_main         /* 35: timer_hit */
    .long   isrC_main         /* 36: GPT3 */
    .long   isrC_main         /* 37: alarm_hit */
    .long   isrC_main         /* 38:  AUDIO */
    .long   isrC_main         /* 39: n9_cm4_sw_irq */
    .long   isrC_main         /* 40: GPT4 */
    .long   isrC_main         /* 41: adc_comp_irq */
    .long   isrC_main         /* 42: reserved */
    .long   isrC_main         /* 43: SPIM */
    .long   isrC_main         /* 44:  USB */
    .long   isrC_main         /* 45: UDMA */
    .long   isrC_main         /* 46: TRNG */
    .long   isrC_main         /* 47: reserved */
    .long   isrC_main         /* 48: configurable */
    .long   isrC_main         /* 49: configurable */
    .long   isrC_main         /* 50: configurable */
    .long   isrC_main         /* 51: configurable */
    .long   isrC_main         /* 52: configurable */
    .long   isrC_main         /* 53: configurable */
    .long   isrC_main         /* 54: configurable */
    .long   isrC_main         /* 55: configurable */
    .long   isrC_main         /* 56: configurable */
    .long   isrC_main         /* 57: configurable */
    .long   isrC_main         /* 58: configurable */
    .long   isrC_main         /* 59: configurable */
    .long   isrC_main         /* 60: configurable */
    .long   isrC_main         /* 61: configurable */
    .long   isrC_main         /* 62: configurable */
    .long   isrC_main         /* 63: configurable */
    .long   isrC_main         /* 64: configurable */
    .long   isrC_main         /* 65: configurable */
    .long   isrC_main         /* 66: configurable */
    .long   isrC_main         /* 67: configurable */
    .long   isrC_main         /* 68: configurable */
    .long   isrC_main         /* 69: configurable */
    .long   isrC_main         /* 70: configurable */
    .long   isrC_main         /* 71: configurable */
    .long   isrC_main         /* 72: configurable */
    .long   isrC_main         /* 73: configurable */
    .long   isrC_main         /* 74: configurable */
    .long   isrC_main         /* 75: configurable */
    .long   isrC_main         /* 76: configurable */
    .long   isrC_main         /* 77: configurable */
    .long   isrC_main         /* 78: configurable */
    .long   isrC_main         /* 79: configurable */
    .long   isrC_main         /* 80: configurable */
    .long   isrC_main         /* 81: configurable */
    .long   isrC_main         /* 82: configurable */
    .long   isrC_main         /* 83: configurable */
    .long   isrC_main         /* 84: configurable */
    .long   isrC_main         /* 85: configurable */
    .long   isrC_main         /* 86: configurable */
    .long   isrC_main         /* 87: configurable */
    .long   isrC_main         /* 88: configurable */
    .long   isrC_main         /* 89: configurable */
    .long   isrC_main         /* 90: configurable */
    .long   isrC_main         /* 91: configurable */
    .long   isrC_main         /* 92: configurable */
    .long   isrC_main         /* 93: configurable */
    .long   isrC_main         /* 94: configurable */
    .long   isrC_main         /* 95: configurable */
    .long   isrC_main         /* 96: configurable */
    .long   isrC_main         /* 97: configurable */
    .long   isrC_main         /* 98: configurable */
    .long   isrC_main         /* 99: configurable */
    .long   isrC_main         /* 100: configurable */
    .long   isrC_main         /* 101: configurable */
    .long   isrC_main         /* 102: configurable */
    .long   isrC_main         /* 103: configurable */
    .long   isrC_main         /* 104: configurable */
    .long   isrC_main         /* 105: configurable */
    .long   isrC_main         /* 106: configurable */
    .long   isrC_main         /* 107: configurable */
    .long   isrC_main         /* 108: configurable */
    .long   isrC_main         /* 109: configurable */
    .long   isrC_main         /* 110: configurable */
    .long   isrC_main         /* 111: configurable */   

    .size    __isr_vector, . - __isr_vector

    .text
    .thumb
    .thumb_func
    .section .init
    .align 2
    .globl    Reset_Handler
    .type    Reset_Handler, %function
Reset_Handler:
/*     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
 *      copied to. Both must be aligned to 4 bytes boundary.  */
    ldr    sp, =__StackTop    		 /* set stack pointer */

    cpsid i

    ldr    r1, =__etext
    ldr    r2, =__data_start__
    ldr    r3, =__data_end__

.Lflash_to_ram_loop:
    cmp     r2, r3
    ittt    lo
    ldrlo   r0, [r1], #4
    strlo   r0, [r2], #4
    blo    .Lflash_to_ram_loop

    ldr    r1, =__ramtext_load__
    ldr    r2, =__ramtext_start__
    ldr    r3, =__ramtext_end__

.Lflash_to_tcm_loop:
    cmp     r2, r3
    ittt    lo
    ldrlo   r0, [r1], #4
    strlo   r0, [r2], #4
    blo    .Lflash_to_tcm_loop


    ldr    r2, =__tcmbss_start__
    ldr    r3, =__tcmbss_end__

.Lbss_to_tcm_loop:
    cmp     r2, r3
    ittt    lo
    movlo   r0, #0
    strlo   r0, [r2], #4
    blo    .Lbss_to_tcm_loop

    ldr    r2, =__bss_start__
    ldr    r3, =__bss_end__

.Lbss_to_ram_loop:
    cmp     r2, r3
    ittt    lo
    movlo   r0, #0
    strlo   r0, [r2], #4
    blo    .Lbss_to_ram_loop

    ldr    r0, =SystemInit
    blx    r0

    ldr    r0, =main
    bx     r0
    .pool
    .size Reset_Handler, . - Reset_Handler
    
/**
 * @brief  This is the code for system exception handling(svcCall,systick,pendSV), must suspend 
           flash before fetch code from flash
 * @param  None
 * @retval None
*/
    .section  .ramTEXT,"ax",%progbits
    .type  SvcCall_Main, %function
    .global  SvcCall_Main
SvcCall_Main:
    cpsid    i
    push     {lr}
    blx Flash_ReturnReady
    pop      {lr}
    cpsie    i
    b    SVC_Handler
    .size  SvcCall_Main, .-SvcCall_Main
  
    .type  PendSV_Main, %function
    .global  PendSV_Main
PendSV_Main:
    cpsid     i
    push     {lr}
    blx Flash_ReturnReady
    pop      {lr}
    cpsie    i
    b PendSV_Handler
    .size  PendSV_Main, .-PendSV_Main  

    .type  SysTick_Main, %function
    .global  SysTick_Main
SysTick_Main:
    cpsid    i
    push     {lr}
    blx Flash_ReturnReady
    cpsie    i
    blx SysTick_Handler
    pop     {lr}
    bx      lr
  .size  SysTick_Main, .-SysTick_Main

    .text
/*    Macro to define default handlers. Default handler
 *    will be weak symbol and just dead loops. They can be
 *    overwritten by other handlers */
    .macro    def_default_handler    handler_name
    .align 1
    .thumb_func
    .weak    \handler_name
    .type    \handler_name, %function
\handler_name :
    b    .
    .size    \handler_name, . - \handler_name
    .endm

    def_default_handler    NMI_Handler
    def_default_handler    HardFault_Handler
    def_default_handler    MemManage_Handler
    def_default_handler    BusFault_Handler
    def_default_handler    UsageFault_Handler
    def_default_handler    SVC_Handler
    def_default_handler    DebugMon_Handler
    def_default_handler    PendSV_Handler
    def_default_handler    SysTick_Handler
    def_default_handler    Default_Handler

    .end


