18382e17cSCaesar Wang /* 28382e17cSCaesar Wang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 38382e17cSCaesar Wang * 4*82cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 58382e17cSCaesar Wang */ 68382e17cSCaesar Wang 78382e17cSCaesar Wang #include "rk3399_mcu.h" 88382e17cSCaesar Wang 98382e17cSCaesar Wang /* Stack configuration */ 108382e17cSCaesar Wang #define STACK_SIZE 0x00000100 118382e17cSCaesar Wang __attribute__ ((section(".co_stack"))) 128382e17cSCaesar Wang unsigned long pstack[STACK_SIZE]; 138382e17cSCaesar Wang 148382e17cSCaesar Wang /* Macro definition */ 158382e17cSCaesar Wang #define WEAK __attribute__ ((weak)) 168382e17cSCaesar Wang 178382e17cSCaesar Wang /* System exception vector handler */ 188382e17cSCaesar Wang __attribute__ ((used)) 198382e17cSCaesar Wang void WEAK reset_handler(void); 208382e17cSCaesar Wang void WEAK nmi_handler(void); 218382e17cSCaesar Wang void WEAK hardware_fault_handler(void); 228382e17cSCaesar Wang void WEAK svc_handler(void); 238382e17cSCaesar Wang void WEAK pend_sv_handler(void); 248382e17cSCaesar Wang void WEAK systick_handler(void); 258382e17cSCaesar Wang 268382e17cSCaesar Wang extern int main(void); 278382e17cSCaesar Wang 288382e17cSCaesar Wang /* Function prototypes */ 298382e17cSCaesar Wang static void default_reset_handler(void); 308382e17cSCaesar Wang static void default_handler(void); 318382e17cSCaesar Wang 328382e17cSCaesar Wang /* 338382e17cSCaesar Wang * The minimal vector table for a Cortex M3. Note that the proper constructs 348382e17cSCaesar Wang * must be placed on this to ensure that it ends up at physical address 358382e17cSCaesar Wang * 0x00000000. 368382e17cSCaesar Wang */ 378382e17cSCaesar Wang __attribute__ ((used, section(".isr_vector"))) 388382e17cSCaesar Wang void (* const g_pfnVectors[])(void) = { 398382e17cSCaesar Wang /* core Exceptions */ 408382e17cSCaesar Wang (void *)&pstack[STACK_SIZE], /* the initial stack pointer */ 418382e17cSCaesar Wang reset_handler, 428382e17cSCaesar Wang nmi_handler, 438382e17cSCaesar Wang hardware_fault_handler, 448382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 458382e17cSCaesar Wang svc_handler, 468382e17cSCaesar Wang 0, 0, 478382e17cSCaesar Wang pend_sv_handler, 488382e17cSCaesar Wang systick_handler, 498382e17cSCaesar Wang 508382e17cSCaesar Wang /* external exceptions */ 518382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 528382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 538382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 548382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0, 558382e17cSCaesar Wang 0, 0, 0, 0 568382e17cSCaesar Wang }; 578382e17cSCaesar Wang 588382e17cSCaesar Wang /** 598382e17cSCaesar Wang * This is the code that gets called when the processor first 608382e17cSCaesar Wang * starts execution following a reset event. Only the absolutely 618382e17cSCaesar Wang * necessary set is performed, after which the application 628382e17cSCaesar Wang * supplied main() routine is called. 638382e17cSCaesar Wang */ 648382e17cSCaesar Wang static void default_reset_handler(void) 658382e17cSCaesar Wang { 668382e17cSCaesar Wang /* call the application's entry point */ 678382e17cSCaesar Wang main(); 688382e17cSCaesar Wang } 698382e17cSCaesar Wang 708382e17cSCaesar Wang /** 718382e17cSCaesar Wang * Provide weak aliases for each Exception handler to the Default_Handler. 728382e17cSCaesar Wang * As they are weak aliases, any function with the same name will override 738382e17cSCaesar Wang * this definition. 748382e17cSCaesar Wang */ 758382e17cSCaesar Wang #pragma weak reset_handler = default_reset_handler 768382e17cSCaesar Wang #pragma weak nmi_handler = default_handler 778382e17cSCaesar Wang #pragma weak hardware_fault_handler = default_handler 788382e17cSCaesar Wang #pragma weak svc_handler = default_handler 798382e17cSCaesar Wang #pragma weak pend_sv_handler = default_handler 808382e17cSCaesar Wang #pragma weak systick_handler = default_handler 818382e17cSCaesar Wang 828382e17cSCaesar Wang /** 838382e17cSCaesar Wang * This is the code that gets called when the processor receives 848382e17cSCaesar Wang * an unexpected interrupt. This simply enters an infinite loop, 858382e17cSCaesar Wang * preserving the system state for examination by a debugger. 868382e17cSCaesar Wang */ 878382e17cSCaesar Wang static void default_handler(void) 888382e17cSCaesar Wang { 898382e17cSCaesar Wang /* go into an infinite loop. */ 908382e17cSCaesar Wang while (1) 918382e17cSCaesar Wang ; 928382e17cSCaesar Wang } 93