/*****************************************************************************/
/* Startup_XMC4400.s: Startup file for XMC4400 device series for EWARM                */
/*****************************************************************************/
/**
* @file     Startup_XMC4400.s
*           XMC4000 Device Series
* @version  V1.1
* @date     August 2013
*
* Copyright (C) 2012 IAR Systems. All rights reserved.
* Copyright (C) 2012 Infineon Technologies AG. All rights reserved.
*
*
* @par
* Infineon Technologies AG (Infineon) is supplying this software for use with 
* Infineon's microcontrollers.  This file can be freely distributed
* within development tools that are supporting such microcontrollers.
*
* @par
* THIS SOFTWARE IS PROVIDED AS IS.  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
******************************************************************************/
/* ********************* Version History *********************************** */
/* ***************************************************************************
V1.0 January, 30 2013:  In ths version a workoraound for the erratum PMU_CM.001
is implmented (patch for the Exception and interrupt handlers)
V1.1 Augsut, 17 2013:  Fix the bug of preprocessor due to workoraound for 
the erratum PMU_CM.001, and the bug of stack pointer alignment to a 8 byte boundary 

**************************************************************************** */

        MODULE  ?vector_table

        AAPCS INTERWORK, VFP_COMPATIBLE, RWPI_COMPATIBLE
        PRESERVE8


        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start
        EXTERN  SystemInit  
        PUBLIC  __vector_table

        DATA

__iar_init$$done:               ; The vector table is not needed
                                ; until after copy initialization is done

;/* ===========START : MACRO DEFINITION MACRO DEFINITION ================== */
;/*
; * STEP_AB and below have the prefetch functional deviation (Errata id: PMU_CM.001).
; * A veneer defined below will first be executed which in turn branches to the final 
; * exception handler.
; *
; * In addition to defining the veneers, the vector table must for these buggy
; * devices contain the veneers.
; */

;set WORKAROUND_PMU_CM001 under Options for target
;define WORKAROUND_PMU_CM001 as TRUE
#define WORKAROUND_PMU_CM001 1

;/* A macro to setup a vector table entry based on STEP ID */
#ifdef WORKAROUND_PMU_CM001
ExcpVector  macro
            DCD \1_Veneer
            endm
#else
ExcpVector  macro
            DCD \1
            endm           
#endif

;/* A macro to ease definition of the various handlers based on STEP ID */
#ifdef WORKAROUND_PMU_CM001
;/* First define the final exception handler */
ProxyHandler  macro
              PUBWEAK \1
              SECTION .text:CODE:REORDER:NOROOT(1)
\1
              B \1
;/* And then define a veneer that will branch to the final excp handler */              
              PUBWEAK \1_Veneer
              SECTION .text:CODE:REORDER:NOROOT(2)
\1_Veneer
              LDR   R0, =\1
              PUSH	{LR}  /* Breaks AAPCS */
              SUB SP,#4    /* Restores AAPCS */
              BLX   R0
              ADD SP,#4
              POP   {PC}
              endm

 ;/* No prefetch bug, hence define only the final exception handler */              
#else
ProxyHandler  macro
              PUBWEAK \1
              SECTION .text:CODE:REORDER:NOROOT(1)
\1
              B \1
              endm
#endif

;/* ============= END OF MACRO DEFINITION MACRO DEFINITION ================== */

__vector_table
    DCD   sfe(CSTACK)
    DCD   Reset_Handler          	    ; Reset Handler   
             
    ExcpVector   NMI_Handler                 ; NMI Handler                  
    ExcpVector   HardFault_Handler           ; Hard Fault Handler           
    ExcpVector   MemManage_Handler           ; MPU Fault Handler            
    ExcpVector   BusFault_Handler            ; Bus Fault Handler            
    ExcpVector   UsageFault_Handler          ; Usage Fault Handler          
    DCD   0                           ; Reserved                     
    DCD   0                           ; Reserved                     
    DCD   0                           ; Reserved                     
    DCD   0                           ; Reserved                     
    ExcpVector   SVC_Handler                 ; SVCall Handler               
    ExcpVector   DebugMon_Handler            ; Debug Monitor Handler        
    DCD   0                           ; Reserved                     
    ExcpVector   PendSV_Handler              ; PendSV Handler               
    ExcpVector   SysTick_Handler             ; SysTick Handler              

    ; Interrupt Handlers for Service Requests (SR) from XMC4500 Peripherals
	  ExcpVector   SCU_0_IRQHandler            ; Handler name for SR SCU_0      
    ExcpVector   ERU0_0_IRQHandler           ; Handler name for SR ERU0_0     
    ExcpVector   ERU0_1_IRQHandler           ; Handler name for SR ERU0_1     
    ExcpVector   ERU0_2_IRQHandler           ; Handler name for SR ERU0_2     
    ExcpVector   ERU0_3_IRQHandler           ; Handler name for SR ERU0_3      
    ExcpVector   ERU1_0_IRQHandler           ; Handler name for SR ERU1_0     
    ExcpVector   ERU1_1_IRQHandler           ; Handler name for SR ERU1_1     
    ExcpVector   ERU1_2_IRQHandler           ; Handler name for SR ERU1_2     
    ExcpVector   ERU1_3_IRQHandler           ; Handler name for SR ERU1_3     
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    ExcpVector   PMU0_0_IRQHandler           ; Handler name for SR PMU0_0     
    DCD   0                           ; Not Available                  
    ExcpVector   VADC0_C0_0_IRQHandler       ; Handler name for SR VADC0_C0_0   
    ExcpVector   VADC0_C0_1_IRQHandler       ; Handler name for SR VADC0_C0_1   
    ExcpVector   VADC0_C0_2_IRQHandler       ; Handler name for SR VADC0_C0_1   
    ExcpVector   VADC0_C0_3_IRQHandler       ; Handler name for SR VADC0_C0_3   
    ExcpVector   VADC0_G0_0_IRQHandler       ; Handler name for SR VADC0_G0_0   
    ExcpVector   VADC0_G0_1_IRQHandler       ; Handler name for SR VADC0_G0_1   
    ExcpVector   VADC0_G0_2_IRQHandler       ; Handler name for SR VADC0_G0_2   
    ExcpVector   VADC0_G0_3_IRQHandler       ; Handler name for SR VADC0_G0_3   
    ExcpVector   VADC0_G1_0_IRQHandler       ; Handler name for SR VADC0_G1_0   
    ExcpVector   VADC0_G1_1_IRQHandler       ; Handler name for SR VADC0_G1_1   
    ExcpVector   VADC0_G1_2_IRQHandler       ; Handler name for SR VADC0_G1_2   
    ExcpVector   VADC0_G1_3_IRQHandler       ; Handler name for SR VADC0_G1_3   
    ExcpVector   VADC0_G2_0_IRQHandler       ; Handler name for SR VADC0_G2_0   
    ExcpVector   VADC0_G2_1_IRQHandler       ; Handler name for SR VADC0_G2_1   
    ExcpVector   VADC0_G2_2_IRQHandler       ; Handler name for SR VADC0_G2_2   
    ExcpVector   VADC0_G2_3_IRQHandler       ; Handler name for SR VADC0_G2_3   
    ExcpVector   VADC0_G3_0_IRQHandler       ; Handler name for SR VADC0_G3_0   
    ExcpVector   VADC0_G3_1_IRQHandler       ; Handler name for SR VADC0_G3_1   
    ExcpVector   VADC0_G3_2_IRQHandler       ; Handler name for SR VADC0_G3_2   
    ExcpVector   VADC0_G3_3_IRQHandler       ; Handler name for SR VADC0_G3_3   
    ExcpVector   DSD0_0_IRQHandler           ; Handler name for SR DSD_SRM_0  
    ExcpVector   DSD0_1_IRQHandler           ; Handler name for SR DSD_SRM_1  
    ExcpVector   DSD0_2_IRQHandler           ; Handler name for SR DSD_SRM_2  
    ExcpVector   DSD0_3_IRQHandler           ; Handler name for SR DSD_SRM_3  
    ExcpVector   DSD0_4_IRQHandler           ; Handler name for SR DSD_SRA_0  
    ExcpVector   DSD0_5_IRQHandler           ; Handler name for SR DSD_SRA_1  
    ExcpVector   DSD0_6_IRQHandler           ; Handler name for SR DSD_SRA_2  
    ExcpVector   DSD0_7_IRQHandler           ; Handler name for SR DSD_SRA_3  
    ExcpVector   DAC0_0_IRQHandler           ; Handler name for SR DAC0_0     
    ExcpVector   DAC0_1_IRQHandler           ; Handler name for SR DAC0_1     
    ExcpVector   CCU40_0_IRQHandler          ; Handler name for SR CCU40_0    
    ExcpVector   CCU40_1_IRQHandler          ; Handler name for SR CCU40_1    
    ExcpVector   CCU40_2_IRQHandler          ; Handler name for SR CCU40_2    
    ExcpVector   CCU40_3_IRQHandler          ; Handler name for SR CCU40_3    
    ExcpVector   CCU41_0_IRQHandler          ; Handler name for SR CCU41_0    
    ExcpVector   CCU41_1_IRQHandler          ; Handler name for SR CCU41_1    
    ExcpVector   CCU41_2_IRQHandler          ; Handler name for SR CCU41_2    
    ExcpVector   CCU41_3_IRQHandler          ; Handler name for SR CCU41_3    
    ExcpVector   CCU42_0_IRQHandler          ; Handler name for SR CCU42_0    
    ExcpVector   CCU42_1_IRQHandler          ; Handler name for SR CCU42_1    
    ExcpVector   CCU42_2_IRQHandler          ; Handler name for SR CCU42_2    
    ExcpVector   CCU42_3_IRQHandler          ; Handler name for SR CCU42_3    
    ExcpVector   CCU43_0_IRQHandler          ; Handler name for SR CCU43_0    
    ExcpVector   CCU43_1_IRQHandler          ; Handler name for SR CCU43_1    
    ExcpVector   CCU43_2_IRQHandler          ; Handler name for SR CCU43_2    
    ExcpVector   CCU43_3_IRQHandler          ; Handler name for SR CCU43_3    
    ExcpVector   CCU80_0_IRQHandler          ; Handler name for SR CCU80_0    
    ExcpVector   CCU80_1_IRQHandler          ; Handler name for SR CCU80_1    
    ExcpVector   CCU80_2_IRQHandler          ; Handler name for SR CCU80_2    
    ExcpVector   CCU80_3_IRQHandler          ; Handler name for SR CCU80_3    
    ExcpVector   CCU81_0_IRQHandler          ; Handler name for SR CCU81_0    
    ExcpVector   CCU81_1_IRQHandler          ; Handler name for SR CCU81_1    
    ExcpVector   CCU81_2_IRQHandler          ; Handler name for SR CCU81_2    
    ExcpVector   CCU81_3_IRQHandler          ; Handler name for SR CCU81_3    
    ExcpVector   POSIF0_0_IRQHandler         ; Handler name for SR POSIF0_0   
    ExcpVector   POSIF0_1_IRQHandler         ; Handler name for SR POSIF0_1   
    ExcpVector   POSIF1_0_IRQHandler         ; Handler name for SR POSIF1_0   
    ExcpVector   POSIF1_1_IRQHandler         ; Handler name for SR POSIF1_1   
    ExcpVector   HRPWM_0_IRQHandler          ; Handler name for SR HRPWM_0    
    ExcpVector   HRPWM_1_IRQHandler          ; Handler name for SR HRPWM_1    
    ExcpVector   HRPWM_2_IRQHandler          ; Handler name for SR HRPWM_2    
    ExcpVector   HRPWM_3_IRQHandler          ; Handler name for SR HRPWM_3    
    ExcpVector   CAN0_0_IRQHandler           ; Handler name for SR CAN0_0     
    ExcpVector   CAN0_1_IRQHandler           ; Handler name for SR CAN0_1     
    ExcpVector   CAN0_2_IRQHandler           ; Handler name for SR CAN0_2     
    ExcpVector   CAN0_3_IRQHandler           ; Handler name for SR CAN0_3     
    ExcpVector   CAN0_4_IRQHandler           ; Handler name for SR CAN0_4     
    ExcpVector   CAN0_5_IRQHandler           ; Handler name for SR CAN0_5     
    ExcpVector   CAN0_6_IRQHandler           ; Handler name for SR CAN0_6     
    ExcpVector   CAN0_7_IRQHandler           ; Handler name for SR CAN0_7     
    ExcpVector   USIC0_0_IRQHandler          ; Handler name for SR USIC0_0    
    ExcpVector   USIC0_1_IRQHandler          ; Handler name for SR USIC0_1    
    ExcpVector   USIC0_2_IRQHandler          ; Handler name for SR USIC0_2    
    ExcpVector   USIC0_3_IRQHandler          ; Handler name for SR USIC0_3    
    ExcpVector   USIC0_4_IRQHandler          ; Handler name for SR USIC0_4    
    ExcpVector   USIC0_5_IRQHandler          ; Handler name for SR USIC0_5    
    ExcpVector   USIC1_0_IRQHandler          ; Handler name for SR USIC1_0    
    ExcpVector   USIC1_1_IRQHandler          ; Handler name for SR USIC1_1    
    ExcpVector   USIC1_2_IRQHandler          ; Handler name for SR USIC1_2    
    ExcpVector   USIC1_3_IRQHandler          ; Handler name for SR USIC1_3    
    ExcpVector   USIC1_4_IRQHandler          ; Handler name for SR USIC1_4    
    ExcpVector   USIC1_5_IRQHandler          ; Handler name for SR USIC1_5    
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    ExcpVector   LEDTS0_0_IRQHandler         ; Handler name for SR LEDTS0_0   
    DCD   0                           ; Not Available                  
    ExcpVector   FCE0_0_IRQHandler           ; Handler name for SR FCE0_0     
    ExcpVector   GPDMA0_0_IRQHandler         ; Handler name for SR GPDMA0_0   
    DCD   0                           ; Not Available                  
    ExcpVector   USB0_0_IRQHandler           ; Handler name for SR USB0_0     
    ExcpVector   ETH0_0_IRQHandler           ; Handler name for SR ETH0_0     
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  
    DCD   0                           ; Not Available                  




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
        THUMB
        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER(2)
Reset_Handler

        LDR     R0, =SystemInit
        BLX     R0 
        LDR     R0, =SystemInit_DAVE3
        BLX     R0  
        LDR     R0, =__iar_program_start
        BX      R0 
        

       ProxyHandler NMI_Handler
       ProxyHandler HardFault_Handler
       ProxyHandler MemManage_Handler
       ProxyHandler BusFault_Handler
       ProxyHandler UsageFault_Handler
       ProxyHandler SVC_Handler
       ProxyHandler DebugMon_Handler
       ProxyHandler PendSV_Handler
       ProxyHandler SysTick_Handler

       ProxyHandler SCU_0_IRQHandler         
       ProxyHandler ERU0_0_IRQHandler        
       ProxyHandler ERU0_1_IRQHandler        
       ProxyHandler ERU0_2_IRQHandler        
       ProxyHandler ERU0_3_IRQHandler        
       ProxyHandler ERU1_0_IRQHandler        
       ProxyHandler ERU1_1_IRQHandler        
       ProxyHandler ERU1_2_IRQHandler        
       ProxyHandler ERU1_3_IRQHandler        
       ProxyHandler PMU0_0_IRQHandler        
       ProxyHandler VADC0_C0_0_IRQHandler    
       ProxyHandler VADC0_C0_1_IRQHandler    
       ProxyHandler VADC0_C0_2_IRQHandler    
       ProxyHandler VADC0_C0_3_IRQHandler    
       ProxyHandler VADC0_G0_0_IRQHandler    
       ProxyHandler VADC0_G0_1_IRQHandler    
       ProxyHandler VADC0_G0_2_IRQHandler    
       ProxyHandler VADC0_G0_3_IRQHandler    
       ProxyHandler VADC0_G1_0_IRQHandler    
       ProxyHandler VADC0_G1_1_IRQHandler    
       ProxyHandler VADC0_G1_2_IRQHandler    
       ProxyHandler VADC0_G1_3_IRQHandler    
       ProxyHandler VADC0_G2_0_IRQHandler    
       ProxyHandler VADC0_G2_1_IRQHandler    
       ProxyHandler VADC0_G2_2_IRQHandler    
       ProxyHandler VADC0_G2_3_IRQHandler    
       ProxyHandler VADC0_G3_0_IRQHandler    
       ProxyHandler VADC0_G3_1_IRQHandler    
       ProxyHandler VADC0_G3_2_IRQHandler    
       ProxyHandler VADC0_G3_3_IRQHandler    
       ProxyHandler DSD0_0_IRQHandler        
       ProxyHandler DSD0_1_IRQHandler        
       ProxyHandler DSD0_2_IRQHandler        
       ProxyHandler DSD0_3_IRQHandler        
       ProxyHandler DSD0_4_IRQHandler        
       ProxyHandler DSD0_5_IRQHandler        
       ProxyHandler DSD0_6_IRQHandler        
       ProxyHandler DSD0_7_IRQHandler        
       ProxyHandler DAC0_0_IRQHandler        
       ProxyHandler DAC0_1_IRQHandler        
       ProxyHandler CCU40_0_IRQHandler       
       ProxyHandler CCU40_1_IRQHandler       
       ProxyHandler CCU40_2_IRQHandler       
       ProxyHandler CCU40_3_IRQHandler       
       ProxyHandler CCU41_0_IRQHandler       
       ProxyHandler CCU41_1_IRQHandler       
       ProxyHandler CCU41_2_IRQHandler       
       ProxyHandler CCU41_3_IRQHandler       
       ProxyHandler CCU42_0_IRQHandler       
       ProxyHandler CCU42_1_IRQHandler       
       ProxyHandler CCU42_2_IRQHandler       
       ProxyHandler CCU42_3_IRQHandler       
       ProxyHandler CCU43_0_IRQHandler       
       ProxyHandler CCU43_1_IRQHandler       
       ProxyHandler CCU43_2_IRQHandler       
       ProxyHandler CCU43_3_IRQHandler       
       ProxyHandler CCU80_0_IRQHandler       
       ProxyHandler CCU80_1_IRQHandler       
       ProxyHandler CCU80_2_IRQHandler       
       ProxyHandler CCU80_3_IRQHandler       
       ProxyHandler CCU81_0_IRQHandler       
       ProxyHandler CCU81_1_IRQHandler       
       ProxyHandler CCU81_2_IRQHandler       
       ProxyHandler CCU81_3_IRQHandler       
       ProxyHandler POSIF0_0_IRQHandler      
       ProxyHandler POSIF0_1_IRQHandler      
       ProxyHandler POSIF1_0_IRQHandler      
       ProxyHandler POSIF1_1_IRQHandler      
       ProxyHandler HRPWM_0_IRQHandler       
       ProxyHandler HRPWM_1_IRQHandler       
       ProxyHandler HRPWM_2_IRQHandler       
       ProxyHandler HRPWM_3_IRQHandler       
       ProxyHandler CAN0_0_IRQHandler        
       ProxyHandler CAN0_1_IRQHandler        
       ProxyHandler CAN0_2_IRQHandler        
       ProxyHandler CAN0_3_IRQHandler        
       ProxyHandler CAN0_4_IRQHandler        
       ProxyHandler CAN0_5_IRQHandler        
       ProxyHandler CAN0_6_IRQHandler        
       ProxyHandler CAN0_7_IRQHandler        
       ProxyHandler USIC0_0_IRQHandler       
       ProxyHandler USIC0_1_IRQHandler       
       ProxyHandler USIC0_2_IRQHandler       
       ProxyHandler USIC0_3_IRQHandler       
       ProxyHandler USIC0_4_IRQHandler       
       ProxyHandler USIC0_5_IRQHandler       
       ProxyHandler USIC1_0_IRQHandler       
       ProxyHandler USIC1_1_IRQHandler       
       ProxyHandler USIC1_2_IRQHandler       
       ProxyHandler USIC1_3_IRQHandler       
       ProxyHandler USIC1_4_IRQHandler       
       ProxyHandler USIC1_5_IRQHandler       
       ProxyHandler LEDTS0_0_IRQHandler      
       ProxyHandler FCE0_0_IRQHandler        
       ProxyHandler GPDMA0_0_IRQHandler      
       ProxyHandler USB0_0_IRQHandler        
       ProxyHandler ETH0_0_IRQHandler        

; Definition of the default weak SystemInit_DAVE3 function for DAVE3 system init.
        PUBWEAK SystemInit_DAVE3
        SECTION .text:CODE:REORDER:NOROOT(2)
SystemInit_DAVE3
        NOP 
        BX LR
 
; Definition of the default weak DAVE3 function for clock App usage.
; AllowPLLInitByStartup Handler
        PUBWEAK AllowPLLInitByStartup
        SECTION .text:CODE:REORDER:NOROOT(2)
AllowPLLInitByStartup       
        MOV R0,#1
        BX LR  

PREF_PCON       EQU 0x58004000
SCU_GCU_PEEN    EQU 0x5000413C
SCU_GCU_PEFLAG  EQU 0x50004150

        
        END
