103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								 * be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								 * the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								 * thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								 * is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								 * liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								 * any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								 * Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * ****************************************************************************/
							 | 
						||
| 
								 | 
							
								/* os shim includes */
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "iot_irq.h"
							 | 
						||
| 
								 | 
							
								#include "iot_wdg.h"
							 | 
						||
| 
								 | 
							
								#include "os_mem.h"
							 | 
						||
| 
								 | 
							
								#include "efuse.h"
							 | 
						||
| 
								 | 
							
								#include "iot_system.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "platform.h"
							 | 
						||
| 
								 | 
							
								#include "encoding.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern void def_trap_entry_2();
							 | 
						||
| 
								 | 
							
								extern void intc_handler(uint32_t cpu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cpu_state g_cpu1_state;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void exception_handler_2(uintptr_t mcause, uintptr_t epc, saved_registers *reg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* save cpu1's crash state */
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.crash = 1;
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.mcause = mcause;
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.mepc = epc;
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.trap_frame  = reg;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    while(1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uintptr_t handle_trap_2(uintptr_t mcause, uintptr_t epc, saved_registers *reg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT) {
							 | 
						||
| 
								 | 
							
								        intc_handler(HAL_INTR_CPU_1);
							 | 
						||
| 
								 | 
							
								    }else {
							 | 
						||
| 
								 | 
							
								        exception_handler_2(mcause, epc, reg);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return epc;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void _init_2()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    write_csr(mtvec, &def_trap_entry_2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    clear_csr(mie, MIP_MEIP);
							 | 
						||
| 
								 | 
							
								    clear_csr(mie, MIP_MTIP);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_interrupt_init(HAL_INTR_CPU_1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    set_csr(mie, MIP_MEIP);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Enable interrupts in general.
							 | 
						||
| 
								 | 
							
								    set_csr(mstatus, MSTATUS_MIE);
							 | 
						||
| 
								 | 
							
								    wdg_deinit(HAL_WDG_CPU_1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.flags = CPU_FLAG_RUNNING;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void _fini()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void assert_failed( unsigned char *pucFile, unsigned long ulLine )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    ( void ) pucFile;
							 | 
						||
| 
								 | 
							
								    ( void ) ulLine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.assert_failed = 1;
							 | 
						||
| 
								 | 
							
								    if (pucFile) {
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(g_cpu1_state.assert_info.file, pucFile, 32);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        os_mem_set(g_cpu1_state.assert_info.file, 0, 32);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.assert_info.line = ulLine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* do a breakpoint exception */
							 | 
						||
| 
								 | 
							
								    asm volatile("ebreak");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void assert_failed_simple()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.assert_failed = 1;
							 | 
						||
| 
								 | 
							
								    os_mem_set(g_cpu1_state.assert_info.file, 0, 32);
							 | 
						||
| 
								 | 
							
								    g_cpu1_state.assert_info.line = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* do a breakpoint exception */
							 | 
						||
| 
								 | 
							
								    asm volatile("ebreak");
							 | 
						||
| 
								 | 
							
								}
							 |