1 /* 2 * Copyright 2023-2024 NXP 3 * All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 8 #include "fsl_clock.h" 9 #include "fsl_power.h" 10 #include "fsl_ezhv.h" 11 12 /******************************************************************************* 13 * Definitions 14 ******************************************************************************/ 15 /* Component ID definition, used by tools. */ 16 #ifndef FSL_COMPONENT_ID 17 #define FSL_COMPONENT_ID "platform.drivers.ezhv" 18 #endif 19 20 #define EZHV_M_EXT_INT (11UL) 21 /* shared ram space between arm and ezhv, size=256Bytes */ 22 #define EZHV_ARM2EZHV_PARA_ADDR (0x2410FF00U) 23 24 /******************************************************************************* 25 * Variables 26 ******************************************************************************/ 27 static ezhv_callback_t s_ezhvCallback; 28 static void *s_ezhvCallbackParam; 29 30 /******************************************************************************* 31 * Prototypes 32 ******************************************************************************/ 33 34 /******************************************************************************* 35 * Code 36 ******************************************************************************/ EZHV_Init(ezhv_copy_image_t * ezhvCopyImage)37void EZHV_Init(ezhv_copy_image_t *ezhvCopyImage) 38 { 39 EZHV_InitWithoutFirmware(); 40 EZHV_InstallFirmware(ezhvCopyImage); 41 } 42 EZHV_InitWithoutFirmware(void)43void EZHV_InitWithoutFirmware(void) 44 { 45 CLOCK_EnableClock(kCLOCK_Ezhv); 46 CLOCK_EnableClock(kCLOCK_AxbsEzh); 47 48 POWER_DisablePD(kPDRUNCFG_APD_EZHV_TCM); 49 POWER_DisablePD(kPDRUNCFG_PPD_EZHV_TCM); 50 POWER_ApplyPD(); 51 } 52 EZHV_InstallFirmware(ezhv_copy_image_t * ezhvCopyImage)53void EZHV_InstallFirmware(ezhv_copy_image_t *ezhvCopyImage) 54 { 55 uint32_t dstAddr; 56 uint32_t srcAddr; 57 uint32_t size; 58 59 assert(ezhvCopyImage != NULL); 60 assert(ezhvCopyImage->srcAddr != 0U); 61 assert(ezhvCopyImage->destAddr != 0U); 62 assert(ezhvCopyImage->size != 0U); 63 64 dstAddr = ezhvCopyImage->destAddr; 65 srcAddr = ezhvCopyImage->srcAddr; 66 size = ezhvCopyImage->size; 67 68 memcpy((void*)(uint32_t*)dstAddr, (const void*)(uint32_t*)srcAddr, size); 69 } 70 EZHV_Boot(uint32_t bootAddr)71void EZHV_Boot(uint32_t bootAddr) 72 { 73 SYSCON4->EZHV_RSTBASE = bootAddr >> 2; 74 SYSCON4->EZHV_RSTMTVEC = bootAddr; 75 SYSCON4->EZHV_VOFFSET_T = EZHV_M_EXT_INT; 76 /* reset to start ezhv */ 77 RESET_PeripheralReset(kEZHV_RST_SHIFT_RSTn); 78 } 79 EZHV_SetPara(ezhv_param_t * para)80void EZHV_SetPara(ezhv_param_t *para) 81 { 82 assert(para != NULL); 83 memcpy((void*)EZHV_ARM2EZHV_PARA_ADDR, para, sizeof(ezhv_param_t)); 84 } 85 EZHV_GetParaAddr(void)86uint32_t *EZHV_GetParaAddr(void) 87 { 88 return (uint32_t *)EZHV_ARM2EZHV_PARA_ADDR; 89 } 90 EZHV_WakeupEzhv(arm2ezhv_intctl_t arm2ezhvInt)91void EZHV_WakeupEzhv(arm2ezhv_intctl_t arm2ezhvInt) 92 { 93 SYSCON4->ARM2EZHV_INT_CTRL = arm2ezhvInt; 94 } 95 EZHV_Deinit(void)96void EZHV_Deinit(void) 97 { 98 CLOCK_DisableClock(kCLOCK_Ezhv); 99 CLOCK_DisableClock(kCLOCK_AxbsEzh); 100 101 POWER_EnablePD(kPDRUNCFG_APD_EZHV_TCM); 102 POWER_EnablePD(kPDRUNCFG_PPD_EZHV_TCM); 103 POWER_ApplyPD(); 104 } 105 EZHV_InstallCallback(ezhv_callback_t callback,void * param)106void EZHV_InstallCallback(ezhv_callback_t callback, void *param) 107 { 108 s_ezhvCallback = callback; 109 s_ezhvCallbackParam = param; 110 } 111 EZHV_HandleIRQ(void)112void EZHV_HandleIRQ(void) 113 { 114 if (NULL != s_ezhvCallback) 115 { 116 s_ezhvCallback(s_ezhvCallbackParam); 117 } 118 } 119 EZHV_DriverIRQHandler(void)120void EZHV_DriverIRQHandler(void) 121 { 122 EZHV_HandleIRQ(); 123 } 124