1*8382e17cSCaesar Wang /* 2*8382e17cSCaesar Wang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3*8382e17cSCaesar Wang * 4*8382e17cSCaesar Wang * Redistribution and use in source and binary forms, with or without 5*8382e17cSCaesar Wang * modification, are permitted provided that the following conditions are met: 6*8382e17cSCaesar Wang * 7*8382e17cSCaesar Wang * Redistributions of source code must retain the above copyright notice, this 8*8382e17cSCaesar Wang * list of conditions and the following disclaimer. 9*8382e17cSCaesar Wang * 10*8382e17cSCaesar Wang * Redistributions in binary form must reproduce the above copyright notice, 11*8382e17cSCaesar Wang * this list of conditions and the following disclaimer in the documentation 12*8382e17cSCaesar Wang * and/or other materials provided with the distribution. 13*8382e17cSCaesar Wang * 14*8382e17cSCaesar Wang * Neither the name of ARM nor the names of its contributors may be used 15*8382e17cSCaesar Wang * to endorse or promote products derived from this software without specific 16*8382e17cSCaesar Wang * prior written permission. 17*8382e17cSCaesar Wang * 18*8382e17cSCaesar Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*8382e17cSCaesar Wang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*8382e17cSCaesar Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*8382e17cSCaesar Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*8382e17cSCaesar Wang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*8382e17cSCaesar Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*8382e17cSCaesar Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*8382e17cSCaesar Wang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*8382e17cSCaesar Wang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*8382e17cSCaesar Wang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*8382e17cSCaesar Wang * POSSIBILITY OF SUCH DAMAGE. 29*8382e17cSCaesar Wang */ 30*8382e17cSCaesar Wang 31*8382e17cSCaesar Wang #include "rk3399_mcu.h" 32*8382e17cSCaesar Wang 33*8382e17cSCaesar Wang /* Stack configuration */ 34*8382e17cSCaesar Wang #define STACK_SIZE 0x00000100 35*8382e17cSCaesar Wang __attribute__ ((section(".co_stack"))) 36*8382e17cSCaesar Wang unsigned long pstack[STACK_SIZE]; 37*8382e17cSCaesar Wang 38*8382e17cSCaesar Wang /* Macro definition */ 39*8382e17cSCaesar Wang #define WEAK __attribute__ ((weak)) 40*8382e17cSCaesar Wang 41*8382e17cSCaesar Wang /* System exception vector handler */ 42*8382e17cSCaesar Wang __attribute__ ((used)) 43*8382e17cSCaesar Wang void WEAK reset_handler(void); 44*8382e17cSCaesar Wang void WEAK nmi_handler(void); 45*8382e17cSCaesar Wang void WEAK hardware_fault_handler(void); 46*8382e17cSCaesar Wang void WEAK svc_handler(void); 47*8382e17cSCaesar Wang void WEAK pend_sv_handler(void); 48*8382e17cSCaesar Wang void WEAK systick_handler(void); 49*8382e17cSCaesar Wang 50*8382e17cSCaesar Wang extern int main(void); 51*8382e17cSCaesar Wang 52*8382e17cSCaesar Wang /* Function prototypes */ 53*8382e17cSCaesar Wang static void default_reset_handler(void); 54*8382e17cSCaesar Wang static void default_handler(void); 55*8382e17cSCaesar Wang 56*8382e17cSCaesar Wang /* 57*8382e17cSCaesar Wang * The minimal vector table for a Cortex M3. Note that the proper constructs 58*8382e17cSCaesar Wang * must be placed on this to ensure that it ends up at physical address 59*8382e17cSCaesar Wang * 0x00000000. 60*8382e17cSCaesar Wang */ 61*8382e17cSCaesar Wang __attribute__ ((used, section(".isr_vector"))) 62*8382e17cSCaesar Wang void (* const g_pfnVectors[])(void) = { 63*8382e17cSCaesar Wang /* core Exceptions */ 64*8382e17cSCaesar Wang (void *)&pstack[STACK_SIZE], /* the initial stack pointer */ 65*8382e17cSCaesar Wang reset_handler, 66*8382e17cSCaesar Wang nmi_handler, 67*8382e17cSCaesar Wang hardware_fault_handler, 68*8382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 69*8382e17cSCaesar Wang svc_handler, 70*8382e17cSCaesar Wang 0, 0, 71*8382e17cSCaesar Wang pend_sv_handler, 72*8382e17cSCaesar Wang systick_handler, 73*8382e17cSCaesar Wang 74*8382e17cSCaesar Wang /* external exceptions */ 75*8382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 76*8382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 77*8382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 78*8382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 79*8382e17cSCaesar Wang 0, 0, 0, 0 80*8382e17cSCaesar Wang }; 81*8382e17cSCaesar Wang 82*8382e17cSCaesar Wang /** 83*8382e17cSCaesar Wang * This is the code that gets called when the processor first 84*8382e17cSCaesar Wang * starts execution following a reset event. Only the absolutely 85*8382e17cSCaesar Wang * necessary set is performed, after which the application 86*8382e17cSCaesar Wang * supplied main() routine is called. 87*8382e17cSCaesar Wang */ 88*8382e17cSCaesar Wang static void default_reset_handler(void) 89*8382e17cSCaesar Wang { 90*8382e17cSCaesar Wang /* call the application's entry point */ 91*8382e17cSCaesar Wang main(); 92*8382e17cSCaesar Wang } 93*8382e17cSCaesar Wang 94*8382e17cSCaesar Wang /** 95*8382e17cSCaesar Wang * Provide weak aliases for each Exception handler to the Default_Handler. 96*8382e17cSCaesar Wang * As they are weak aliases, any function with the same name will override 97*8382e17cSCaesar Wang * this definition. 98*8382e17cSCaesar Wang */ 99*8382e17cSCaesar Wang #pragma weak reset_handler = default_reset_handler 100*8382e17cSCaesar Wang #pragma weak nmi_handler = default_handler 101*8382e17cSCaesar Wang #pragma weak hardware_fault_handler = default_handler 102*8382e17cSCaesar Wang #pragma weak svc_handler = default_handler 103*8382e17cSCaesar Wang #pragma weak pend_sv_handler = default_handler 104*8382e17cSCaesar Wang #pragma weak systick_handler = default_handler 105*8382e17cSCaesar Wang 106*8382e17cSCaesar Wang /** 107*8382e17cSCaesar Wang * This is the code that gets called when the processor receives 108*8382e17cSCaesar Wang * an unexpected interrupt. This simply enters an infinite loop, 109*8382e17cSCaesar Wang * preserving the system state for examination by a debugger. 110*8382e17cSCaesar Wang */ 111*8382e17cSCaesar Wang static void default_handler(void) 112*8382e17cSCaesar Wang { 113*8382e17cSCaesar Wang /* go into an infinite loop. */ 114*8382e17cSCaesar Wang while (1) 115*8382e17cSCaesar Wang ; 116*8382e17cSCaesar Wang } 117