Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
      3  *
      4  * SPDX-License-Identifier: BSD-3-Clause
      5  */
      6 
      7 #include "rk3399_mcu.h"
      8 
      9 /* Stack configuration */
     10 #define STACK_SIZE	0x00000100
     11 __attribute__ ((section(".co_stack")))
     12 unsigned long pstack[STACK_SIZE];
     13 
     14 /* Macro definition */
     15 #define WEAK __attribute__ ((weak))
     16 
     17 /* System exception vector handler */
     18 __attribute__ ((used))
     19 void WEAK reset_handler(void);
     20 void WEAK nmi_handler(void);
     21 void WEAK hardware_fault_handler(void);
     22 void WEAK svc_handler(void);
     23 void WEAK pend_sv_handler(void);
     24 void WEAK systick_handler(void);
     25 
     26 extern int main(void);
     27 
     28 /* Function prototypes */
     29 static void default_reset_handler(void);
     30 static void default_handler(void);
     31 
     32 /*
     33  * The minimal vector table for a Cortex M3.  Note that the proper constructs
     34  * must be placed on this to ensure that it ends up at physical address
     35  * 0x00000000.
     36  */
     37 __attribute__ ((used, section(".isr_vector")))
     38 void (* const g_pfnVectors[])(void) = {
     39 	/* core Exceptions */
     40 	(void *)&pstack[STACK_SIZE], /* the initial stack pointer */
     41 	reset_handler,
     42 	nmi_handler,
     43 	hardware_fault_handler,
     44 	0, 0, 0, 0, 0, 0, 0,
     45 	svc_handler,
     46 	0, 0,
     47 	pend_sv_handler,
     48 	systick_handler,
     49 
     50 	/* external exceptions */
     51 	0, 0, 0, 0, 0, 0, 0,
     52 	0, 0, 0, 0, 0, 0, 0,
     53 	0, 0, 0, 0, 0, 0, 0,
     54 	0, 0, 0, 0, 0, 0, 0,
     55 	0, 0, 0, 0
     56 };
     57 
     58 /**
     59  * This is the code that gets called when the processor first
     60  * starts execution following a reset event. Only the absolutely
     61  * necessary set is performed, after which the application
     62  * supplied main() routine is called.
     63  */
     64 static void default_reset_handler(void)
     65 {
     66 	/* call the application's entry point */
     67 	main();
     68 }
     69 
     70 /**
     71  * Provide weak aliases for each Exception handler to the Default_Handler.
     72  * As they are weak aliases, any function with the same name will override
     73  * this definition.
     74  */
     75 #pragma weak reset_handler = default_reset_handler
     76 #pragma weak nmi_handler = default_handler
     77 #pragma weak hardware_fault_handler = default_handler
     78 #pragma weak svc_handler = default_handler
     79 #pragma weak pend_sv_handler = default_handler
     80 #pragma weak systick_handler = default_handler
     81 
     82 /**
     83  * This is the code that gets called when the processor receives
     84  * an unexpected interrupt.  This simply enters an infinite loop,
     85  * preserving the system state for examination by a debugger.
     86  */
     87 static void default_handler(void)
     88 {
     89     /* go into an infinite loop. */
     90 	while (1)
     91 		;
     92 }
     93