860 lines
23 KiB
C
860 lines
23 KiB
C
/**
|
||
* @file HwA_sec.h
|
||
* @author Flagchip
|
||
* @brief FC7xxx sec hardware access layer
|
||
* @version 0.2.0
|
||
* @date 2023-2-7
|
||
*
|
||
* @copyright Copyright (c) 2023 Flagchip Semiconductors Co., Ltd.
|
||
*
|
||
* @details
|
||
*/
|
||
/* ********************************************************************************
|
||
* Revision History:
|
||
*
|
||
* Version Date Initials CR# Descriptions
|
||
* --------- ---------- ------------ ---------- ---------------
|
||
* 0.2.0 2023-2-7 Flagchip076 N/A First version for FC7300
|
||
******************************************************************************** */
|
||
|
||
#ifndef HWA_INCLUDE_HWA_SEC_H_
|
||
#define HWA_INCLUDE_HWA_SEC_H_
|
||
#include "device_header.h"
|
||
|
||
/**
|
||
* @addtogroup HwA_SEC
|
||
* @{
|
||
*
|
||
*/
|
||
|
||
/* DEN Bit Fields */
|
||
/**
|
||
*@brief Enable the debug module
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_EnDebug(void)
|
||
{
|
||
SEC->DEN = SEC_DEN_DEN(0X5) ;
|
||
}
|
||
|
||
/* FSEC0 Bit Fields */
|
||
/**
|
||
* @brief Get the system security KEY0
|
||
* */
|
||
LOCAL_INLINE uint16_t SEC_HWA_GetSScontrol0(void)
|
||
{
|
||
return (uint16_t)((SEC->FSEC0) & (SEC_FSEC0_SSC0_MASK));
|
||
}
|
||
|
||
/* FSEC1 Bit Fields */
|
||
/**
|
||
* @brief Get the system security KEY1
|
||
* */
|
||
LOCAL_INLINE uint16_t SEC_HWA_GetSScontrol1(void)
|
||
{
|
||
return (uint16_t)((SEC->FSEC1) & (SEC_FSEC1_SSC1_MASK));
|
||
}
|
||
|
||
/* DCWOR Bit Fields */
|
||
/**
|
||
* @brief Re-enable the Debug mode.
|
||
* @note This register can only be write once. startup_fc4150.s has lock the register.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_ReEnDebug(void)
|
||
{
|
||
SEC->DCWOR = ((SEC->DCWOR & (~SEC_DCWOR_DEA_MASK)) | SEC_DCWOR_DEA(0X5));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Re-enable Debug permission.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetReEnDebug(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t dea = (uint8_t)((SEC->DCWOR & (SEC_DCWOR_DEA_MASK)) >> SEC_DCWOR_DEA_SHIFT);
|
||
if (dea == 0x5U)
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* @brief Enable the write operation for SEC register.
|
||
* @note This register can only be write once. startup_fc4150.s has lock the register.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_WriteUnlock(void)
|
||
{
|
||
SEC->DCWOR = ((SEC->DCWOR & (~SEC_DCWOR_RWL_MASK)) | SEC_DCWOR_RWL(0X5));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the sec write permission
|
||
* @return true means allow write. false means forbid write.
|
||
*/
|
||
LOCAL_INLINE bool SEC_HWA_GetWritePer(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t rwl = (uint8_t)((SEC->DCWOR & (SEC_DCWOR_RWL_MASK)) >> SEC_DCWOR_RWL_SHIFT);
|
||
if ((rwl == 0x5U) || (rwl == 0xFU))
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/* DEK Bit Fields */
|
||
/**
|
||
* @brief Enable the write operation for SEC register.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_ChangeDBK(uint8_t count, uint32_t key)
|
||
{
|
||
|
||
SEC->DEK[count] = SEC_DEK_DEK(key) ;
|
||
|
||
}
|
||
|
||
/* TME Bit Fields */
|
||
/**
|
||
*@brief Enable the Test module
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_EnTest(void)
|
||
{
|
||
SEC->TME = SEC_TME_TME(0X5) ;
|
||
}
|
||
|
||
/* TMEA Bit Fields */
|
||
/**
|
||
* @brief Re-Enable Test mode
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_ReEnTest(void)
|
||
{
|
||
SEC->TMEA = SEC_TMEA_TMEA(0X5) ;
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Re-enable Test permission.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetReEnTest(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t tmea = (uint8_t)((SEC->TMEA & (SEC_TMEA_TMEA_MASK)) >> SEC_TMEA_TMEA_SHIFT);
|
||
if ((tmea == 0x5U) || (tmea == 0xFU))
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/* TMEK Bit Fields */
|
||
/**
|
||
*@brief write Test re-enable mode key
|
||
*
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_ReEnTestKey(uint32_t testkey)
|
||
{
|
||
SEC->TMEK = SEC_TMEK_TMEK(testkey) ;
|
||
}
|
||
|
||
/* FCR0 Bit Fields */
|
||
/**
|
||
* @brief Enable the Mass Erase
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_EnME(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->FCR0 & (~SEC_FCR0_MED_MASK)) | SEC_FCR0_MED(0x5));
|
||
}
|
||
|
||
/**
|
||
* @brief Enable the Block 0 NVR write .
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_EnWriteB0NVR(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->FCR0 & (~SEC_FCR0_NWP_MASK)) | SEC_FCR0_NWP(0x5)) ;
|
||
}
|
||
|
||
/**
|
||
* @brief Disable the Block 0 NVR write .
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_DisWriteB0NVR(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->FCR0 & (~SEC_FCR0_NWP_MASK)) | SEC_FCR0_NWP(0xA)) ;
|
||
}
|
||
|
||
/**
|
||
* @brief Enable the Block 0 NVR erase .
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_EnEraseB0NVR(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->FCR0 & (~SEC_FCR0_NEP_MASK)) | SEC_FCR0_NEP(0x5)) ;
|
||
}
|
||
|
||
/**
|
||
* @brief Disable the Block 0 NVR erase .
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_DisEraseB0NVR(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->FCR0 & (~SEC_FCR0_NEP_MASK)) | SEC_FCR0_NEP(0xA)) ;
|
||
}
|
||
|
||
/* NKRP Bit Fields */
|
||
/**
|
||
* @brief NVR Key Read Protection.
|
||
* @brief Enable the Block 0 NVR read.
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_EnReadB0NVR(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->NKRP & (~SEC_NKRP_NKRP_MASK)) | SEC_NKRP_NKRP(0x5)) ;
|
||
}
|
||
|
||
/**
|
||
* @brief Disable the Block 0 NVR read .
|
||
*/
|
||
LOCAL_INLINE void SEC_HWA_DisReadB0NVR(void)
|
||
{
|
||
SEC->FCR0 = ((SEC->FCR0 & (~SEC_NKRP_NKRP_MASK)) | SEC_NKRP_NKRP(0xA)) ;
|
||
}
|
||
|
||
|
||
/* BCS Bit Fields */
|
||
/**
|
||
* @brief Get the Fast Boot Select.
|
||
* @return 0b - Select PLL0 as the core clock source; the core clock is 300MHz
|
||
* 1b - Select FIRC as the core clock source; the core clock is 96MHz.
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetFastBootClock(void)
|
||
{
|
||
return (uint8_t)((SEC->BCS & SEC_BCS_FBS_MASK) >> SEC_BCS_FBS_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief NMI Function Enable/Disable
|
||
* @return false - NMI pin function is disabled after reset.
|
||
* true - NMI pin function is enabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetNmiPin(void)
|
||
{
|
||
return (bool)((SEC->BCS & SEC_BCS_NMIDIS_MASK) >> SEC_BCS_NMIDIS_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief ISP Function Enable/Disable ISP Mode Status
|
||
* @return false - ISP mode is inactive.
|
||
* true - ISP mode is active.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetIspStatus(void)
|
||
{
|
||
return (bool)((SEC->BCS & SEC_BCS_ISPMODE_MASK) >> SEC_BCS_ISPMODE_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Boot Rom Configuration
|
||
* @return false - Boot from GPR defined address (except ROM).
|
||
* true - Boot from ROM.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetBootRom(void)
|
||
{
|
||
return (bool)((SEC->BCS & SEC_BCS_BOOTROM_MASK) >> SEC_BCS_BOOTROM_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Chip Part Mode
|
||
* @return false - Chip is in FlexCore part mode.
|
||
* true - Chip is in HSM part mode.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetPartMode(void)
|
||
{
|
||
return (bool)((SEC->BCS & SEC_BCS_PART_MODE_MASK) >> SEC_BCS_PART_MODE_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get PF_128BIT_MODE
|
||
* @return false - Chip is in FlexCore part mode.
|
||
* true - Chip is in HSM part mode.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetPF128BitMode(void)
|
||
{
|
||
return (bool)((SEC->BCS & SEC_BCS_PF_128BIT_MODE_MASK) >> SEC_BCS_PF_128BIT_MODE_SHIFT);
|
||
}
|
||
|
||
/* UKAC Bit Fields */
|
||
|
||
/**
|
||
* @brief User Key Access Enable. Only valid under non-secure boot
|
||
* @return true means User key can be read/programmed/erased by host CPU ,false means User key is not available for host cpu
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetUKAS(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t uake =(uint8_t)((SEC->UKAC & SEC_UKAC_UKAE_MASK) >> SEC_UKAC_UKAE_SHIFT);
|
||
if ((uake == 0x5U) || (uake == 0xFU))
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/* BRC0 Bit Fields */
|
||
/**
|
||
* @brief Secure Boot Disable (Value loaded from NVR sector)
|
||
* @return true means Secure boot mode , false means Non secure boot mode.
|
||
*/
|
||
LOCAL_INLINE bool SEC_HWA_GetSB(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t sbdis = (uint8_t)((SEC->BRC0 & SEC_BRC0_SECURE_BOOT_DIS_MASK) >> SEC_BRC0_SECURE_BOOT_DIS_SHIFT);
|
||
if (sbdis == 0x0u)
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* @brief Host Debug Auth Enable. Only valid in secure boot. (Value loaded from NVR sector)
|
||
* @return true means Host debug authentication enable. false means Host debug authentication disable.
|
||
*/
|
||
LOCAL_INLINE bool SEC_HWA_GetDEAUEn(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t dean = (uint8_t)((SEC->BRC0 & SEC_BRC0_DEBUG_AUTH_EN_MASK) >> SEC_BRC0_DEBUG_AUTH_EN_SHIFT);
|
||
if ((dean == 0x5u) || (dean == 0xFu))
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* @brief ISP Auth Enable. Only valid in secure boot. (Value loaded from NVR sector)
|
||
* @return true means ISP authentication enable, false means ISP authentication disable.
|
||
*/
|
||
LOCAL_INLINE bool SEC_HWA_GetISPAU(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t isp = (uint8_t)((SEC->BRC0 & SEC_BRC0_ISP_AUTH_EN_MASK) >> SEC_BRC0_ISP_AUTH_EN_SHIFT);
|
||
if ((isp == 0x5u) || (isp == 0xFu))
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/* BRC1 Bit Fields */
|
||
/**
|
||
* @brief Get the FCUART Baud Rate for ISP
|
||
* @return FCUART Baud Rate for ISP
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetUartBR(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC1 & SEC_BRC1_UARTBR_MASK) >> SEC_BRC1_UARTBR_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get CAN Baud Rate for ISP
|
||
* @return CAN Baud Rate for ISP
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetCanBR(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC1 & SEC_BRC1_CANBR_MASK) >> SEC_BRC1_CANBR_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get OSC Frequency
|
||
* @return OSC Frequency
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetOSCFre(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC1 & SEC_BRC1_OSCFREQ_MASK) >> SEC_BRC1_OSCFREQ_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get whether OSC Available.
|
||
* @return true means OSC is available. false means -OSC is not available
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetOSCAvail(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t osc = (uint8_t)((SEC->BRC1 & SEC_BRC1_OSCA_MASK) >> SEC_BRC1_OSCA_SHIFT);
|
||
if (osc == 0x0U)
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* @brief Get Debug Backdoor Key Input Enable.
|
||
* @return
|
||
* 0011b - User can input DBK through debug mailbox, ISP is not valid
|
||
* 1100b - User can input DBK through ISP, debug mailbox is not valid.
|
||
* 1111b - User can input DBK through both debug mailbox and ISP.
|
||
* Other Values - User cannot input DBK through both debug mailbox andISP
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetMBBKEN(void)
|
||
{
|
||
return (uint32_t)((SEC->BRC1 & SEC_BRC1_DBK_IN_EN_MASK) >> SEC_BRC1_DBK_IN_EN_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Debug Backdoor Key Encryption Algorithm
|
||
* @return false-User code verification enable in non-secure boot mode
|
||
true- User code verification disable in non-secure boot mode.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetNonSecVerifEN(void)
|
||
{
|
||
bool ret = false;
|
||
uint8_t dean = (uint8_t)((SEC->BRC0 & SEC_BRC1_NON_SEC_VERIF_EN_MASK) >> SEC_BRC1_NON_SEC_VERIF_EN_SHIFT);
|
||
if (dean == 1u)
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* @brief Get User Code Verification Enable under Non-secure Boot Mode
|
||
* @return Bootloader Verification Algorithm
|
||
* 000b - AES256-CBC
|
||
* 111b - SM4-CBC.
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetDBDkeyEncrypAlg(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC1 & SEC_BRC1_DBKEA_MASK) >> SEC_BRC1_DBKEA_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief ISP Function Enable/Disable,Only valid in non-secure mode
|
||
* @return false - ISP pin function is disabled after reset.
|
||
* true - ISP pin function is enabled.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetIspEn(void)
|
||
{
|
||
return (bool)((SEC->BRC1 & SEC_BRC1_ISP_PIN_EN_MASK) >> SEC_BRC1_ISP_PIN_EN_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief GET ISP Mode whether Allowed in Recovery Mode
|
||
* @return false - ISP mode is not allowed in recovery mode
|
||
* true - ISP mode is allowed in recovery mode.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetIspIsAllowedInRec(void)
|
||
{
|
||
return (bool)((SEC->BRC1 & SEC_BRC1_ISPAIRM_MASK) >> SEC_BRC1_ISPAIRM_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief GET Enable the Output of Plaintext Decrypted ROOT Key
|
||
* @return false - The output of plaintext decrypted ROOT key is enabled
|
||
* true - The output of plaintext decrypted ROOT key is disabled.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetKeyPlaRoot(void)
|
||
{
|
||
return (bool)((SEC->BRC1 & SEC_BRC1_KEY_PROT_MASK) >> SEC_BRC1_KEY_PROT_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get ROM Loop Control Flag
|
||
* @return false - ROM executes normal run under VIRGIN and FT state.
|
||
* true - ROM enters debug loop under VIRGIN and FT state.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetLoopCtrFlag(void)
|
||
{
|
||
return (bool)((SEC->BRC1 & SEC_BRC1_ROM_LOOP_CTRL_MASK) >> SEC_BRC1_ROM_LOOP_CTRL_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Enable Software Configuration to Enter ISP
|
||
* @return false - Software configuration to enter ISP is enabled.
|
||
* true - Software configuration to enter ISP is disabled.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetIspSoftConfig(void)
|
||
{
|
||
return (bool)((SEC->BRC1 & SEC_BRC1_SW_CFG_ISP_EN_MASK) >> SEC_BRC1_SW_CFG_ISP_EN_SHIFT);
|
||
}
|
||
|
||
|
||
/* SW_CFG_ISP_FLG Bit Fields */
|
||
/**
|
||
* @brief Software Configuration to Enter ISP Flag
|
||
* @return ISP Flag.
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetSwCfgIspFlg(void)
|
||
{
|
||
return (uint8_t)((SEC->SW_CFG_ISP_FLG & SEC_SW_CFG_ISP_FLG_SW_CFG_ISP_FLG_MASK) >> SEC_SW_CFG_ISP_FLG_SW_CFG_ISP_FLG_SHIFT);
|
||
}
|
||
|
||
|
||
/* BRC2 Bit Fields */
|
||
/**
|
||
* @brief Get USERCODE_VERIFY_MASK_MASK
|
||
* @return USERCODE_VERIFY_MASK_MASK.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetBLMask(void)
|
||
{
|
||
return (uint32_t)((SEC->BRC2 & SEC_BRC2_USERCODE_VERIFY_MASK_MASK) >> SEC_BRC2_USERCODE_VERIFY_MASK_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get the ISP Instance Select.
|
||
* @return ISP Instance Select
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetIspIns(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC2 & SEC_BRC2_ISP_INST_SEL_MASK) >> SEC_BRC2_ISP_INST_SEL_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Bootloader Verification Algorithm
|
||
* @return Bootloader Verification Algorithm
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetBLVer(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC2 & SEC_BRC2_USERCODE_VERIFICATION_ALG_MASK) >> SEC_BRC2_USERCODE_VERIFICATION_ALG_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Debug/ISP/PREFA Authentication and USRK decryption algorithm
|
||
* @return 1b - SM2, 0b - ECC256
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetDecrypt(void)
|
||
{
|
||
return (uint8_t)((SEC->BRC2 & SEC_BRC2_DECRP_ALG_MASK) >> SEC_BRC2_DECRP_ALG_SHIFT);
|
||
}
|
||
|
||
/* IMAGEA Bit Fields */
|
||
/**
|
||
* @brief Get the bootloader address.
|
||
* @return Bootloader Address.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetBLAddr(void)
|
||
{
|
||
return (uint32_t)((SEC->IMGEA & SEC_IMGEA_IMAGE_ADDR_MASK) >> SEC_IMGEA_IMAGE_ADDR_SHIFT);
|
||
}
|
||
|
||
|
||
/* NVR VER Bit Fields */
|
||
/**
|
||
* @brief Get C version.
|
||
* @return C version.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetCVer(void)
|
||
{
|
||
return (uint32_t)((SEC->NVR_VER & SEC_NVR_VER_C_VER_MASK) >> SEC_NVR_VER_C_VER_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Set C version.
|
||
* @return C version.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_SetCVer(uint32_t C_Ver)
|
||
{
|
||
SEC->NVR_VER=((SEC->NVR_VER & (~SEC_NVR_VER_C_VER_MASK)) | SEC_NVR_VER_C_VER(C_Ver));
|
||
}
|
||
|
||
/**
|
||
* @brief Get R version.
|
||
* @return R version.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetRVer(void)
|
||
{
|
||
return (uint32_t)((SEC->NVR_VER & SEC_NVR_VER_R_VER_MASK) >> SEC_NVR_VER_R_VER_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Set R version.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_SetRVer(uint32_t R_Ver)
|
||
{
|
||
SEC->NVR_VER=((SEC->NVR_VER & (~SEC_NVR_VER_R_VER_MASK)) | SEC_NVR_VER_R_VER(R_Ver));
|
||
}
|
||
|
||
/**
|
||
* @brief Get V version.
|
||
* @return V version.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetVVer(void)
|
||
{
|
||
return (uint32_t)((SEC->NVR_VER & SEC_NVR_VER_V_VER_MASK) >> SEC_NVR_VER_V_VER_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Set V version.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_SetVVer(uint32_t V_Ver)
|
||
{
|
||
SEC->NVR_VER=((SEC->NVR_VER & (~SEC_NVR_VER_V_VER_MASK)) | SEC_NVR_VER_V_VER(V_Ver));
|
||
}
|
||
|
||
/**
|
||
* @brief Get CHIP version.
|
||
* @return CHIP version.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetChipVer(void)
|
||
{
|
||
return (uint32_t)((SEC->NVR_VER & SEC_NVR_VER_CHIP_VER_MASK) >> SEC_NVR_VER_CHIP_VER_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Set CHIP version.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_SetChipVer(uint32_t CHIP_Ver)
|
||
{
|
||
SEC->NVR_VER=((SEC->NVR_VER & (~SEC_NVR_VER_CHIP_VER_MASK)) | SEC_NVR_VER_V_VER(CHIP_Ver));
|
||
}
|
||
|
||
/* LCSTAT Bit Fields */
|
||
/**
|
||
* @brief Get the life cycle status of the chip.
|
||
* @return The lifecycle status
|
||
* */
|
||
LOCAL_INLINE uint8_t SEC_HWA_GetLCStaus(void)
|
||
{
|
||
return (uint8_t)(SEC->LCSTAT & 0XFFU);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Lifecycle OEM Development
|
||
* @return 0b - Chip is not in this lifecycle
|
||
* 1b - Chip is in this lifecycle
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetLCOemDev(void)
|
||
{
|
||
return (bool)((SEC->LCSTAT & SEC_LCSTAT_LIFECYCLE_OEM_DEV_MASK) >> SEC_LCSTAT_LIFECYCLE_OEM_DEV_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Lifecycle OEM Production
|
||
* @return false - Chip is not in this lifecycle
|
||
* true - Chip is in this lifecycle
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetLCOemPdt(void)
|
||
{
|
||
return (bool)((SEC->LCSTAT & SEC_LCSTAT_LIFECYCLE_OEM_PDT_MASK) >> SEC_LCSTAT_LIFECYCLE_OEM_PDT_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Lifecycle In Field
|
||
* @return false - Chip is not in this lifecycle
|
||
* true - Chip is in this lifecycle
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetLCInField(void)
|
||
{
|
||
return (bool)((SEC->LCSTAT & SEC_LCSTAT_LIFECYCLE_IN_FIELD_MASK) >> SEC_LCSTAT_LIFECYCLE_IN_FIELD_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Lifecycle Software Fault Analysis
|
||
* @return false - Chip is not in this lifecycle
|
||
* true - Chip is in this lifecycle
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetLCSwFa(void)
|
||
{
|
||
return (bool)((SEC->LCSTAT & SEC_LCSTAT_LIFECYCLE_SWFA_MASK) >> SEC_LCSTAT_LIFECYCLE_SWFA_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Get Lifecycle Hardware Fault Analysis
|
||
* @return false - Chip is not in this lifecycle
|
||
* true - Chip is in this lifecycle
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetLCHwFa(void)
|
||
{
|
||
return (bool)((SEC->LCSTAT & SEC_LCSTAT_LIFECYCLE_HWFA_MASK) >> SEC_LCSTAT_LIFECYCLE_HWFA_SHIFT);
|
||
}
|
||
|
||
/* FAC Bit Fields */
|
||
/**
|
||
* @brief Get the Host User Key Read Protection
|
||
* @return true - Host read access to User Key region is enabled
|
||
* false - Host read access to User Key region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHUKRead(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HOST_UKEY_RPROT_MASK) >> SEC_FAC_HOST_UKEY_RPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Host User Key write Protection
|
||
* @return true - Host write access to User Key region is enabled
|
||
* false - Host write access to User Key region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHUKWrite(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HOST_UKEY_WPROT_MASK) >> SEC_FAC_HOST_UKEY_WPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Host User Key erase Protection
|
||
* @return true - Host erase access to User Key region is enabled
|
||
* false - Host erase access to User Key region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHUKErase(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HOST_UKEY_EPROT_MASK) >> SEC_FAC_HOST_UKEY_EPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Host NVR Read Protection
|
||
* @return true - Host read access to NVR region is enabled
|
||
* false - Host read access to NVR region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHostNvrRead(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HOST_NVR_RPROT_MASK) >> SEC_FAC_HOST_NVR_RPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Host NVR write Protection
|
||
* @return true - Host write access to NVR region is enabled
|
||
* false - Host write access to NVR region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHostNvrWrite(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HOST_NVR_WPROT_MASK) >> SEC_FAC_HOST_NVR_WPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the Host NVR erase Protection
|
||
* @return true - Host erase access to NVR region is enabled
|
||
* false - Host erase access to NVR region is disabled-
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHostNvrErase(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HOST_NVR_EPROT_MASK) >> SEC_FAC_HOST_NVR_EPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get HSM User Key Read Protection
|
||
* @return true - HSM Read access to User Key region is disabled
|
||
* false - HSM Read access to User Key region is enabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHsmUKRead(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HSM_UKEY_RPROT_MASK) >> SEC_FAC_HSM_UKEY_RPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get HSM User Key Program Protection
|
||
* @return true - HSM Program access to User Key region is disabled
|
||
* false - HSM Program access to User Key region is enabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHsmUKProg(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HSM_UKEY_WPROT_MASK) >> SEC_FAC_HSM_UKEY_WPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the HSM User Key Erase Protection
|
||
* @return true - HSM erase access to User Key region is enabled
|
||
* false -HSM erase access to User Key region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHsmUKErase(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HSM_UKEY_EPROT_MASK) >> SEC_FAC_HSM_UKEY_EPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get HSM NVR Key Read Protection
|
||
* @return true - HSM Read access to NVR key region is disabled
|
||
* false - HSM Read access to NVR key region is enabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHsmNvrKRead(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HSM_NVR_RPROT_MASK) >> SEC_FAC_HSM_NVR_RPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get HSM NVR Program Protection
|
||
* @return true - HSM Program access to NVR region is disabled
|
||
* false - HSM Program access to NVR region is enabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHsmNvrProg(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HSM_NVR_WPROT_MASK) >> SEC_FAC_HSM_NVR_WPROT_SHIFT));
|
||
}
|
||
|
||
/**
|
||
* @brief Get the HSM NVR Erase Protection
|
||
* @return true - HSM erase access to NVR region is enabled
|
||
* false -HSM erase access to NVR region is disabled
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetHsmNvrErase(void)
|
||
{
|
||
return (bool)(~(((SEC->FAC) & SEC_FAC_HSM_NVR_EPROT_MASK) >> SEC_FAC_HSM_NVR_EPROT_SHIFT));
|
||
}
|
||
|
||
/* FLEXCORE_EN Bit Fields */
|
||
/**
|
||
* @brief Get the FlexCore Enable.
|
||
* @return true means enable ,false means disable.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetFlexCoreEn(void)//?
|
||
{
|
||
bool ret = false;
|
||
uint8_t srk = (uint8_t)((SEC->FLEXCORE_EN & SEC_FLEXCORE_EN_FLEXCORE_EN_MASK) >> SEC_FLEXCORE_EN_FLEXCORE_EN_SHIFT);
|
||
if (srk == 0xFU||srk == 0x5U)
|
||
{
|
||
ret = true;
|
||
}
|
||
return ret;
|
||
}
|
||
/**
|
||
* @brief Set the FlexCore Enable.
|
||
* @return true means set sucess ,false means set fail,0x5 and 0xf is enable,others is disable.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_SetFlexCoreEn(uint8_t CoreEn)
|
||
{
|
||
if(CoreEn>0xF)
|
||
return false;
|
||
SEC->FLEXCORE_EN = ((SEC->FLEXCORE_EN & (~SEC_FLEXCORE_EN_FLEXCORE_EN_MASK)) | SEC_FLEXCORE_EN_FLEXCORE_EN(CoreEn));
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* @brief Get SEC_FLEXCORE_EN FLEXCORE_DBG.
|
||
* @return true means enable ,false means disable.
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetFlexCoreDbgEn(void)
|
||
{
|
||
return (bool)((SEC->FLEXCORE_EN & SEC_FLEXCORE_EN_FLEXCORE_DBG_EN_MASK) >> SEC_FLEXCORE_EN_FLEXCORE_DBG_EN_SHIFT);
|
||
}
|
||
|
||
/**
|
||
* @brief Set SEC_FLEXCORE_EN FLEXCORE_DBG.
|
||
* */
|
||
LOCAL_INLINE void SEC_HWA_SetFlexCoreDbgEn(uint8_t DbgEn)
|
||
{
|
||
SEC->FLEXCORE_EN=((SEC->FLEXCORE_EN & (~SEC_FLEXCORE_EN_FLEXCORE_DBG_EN_MASK)) | SEC_FLEXCORE_EN_FLEXCORE_DBG_EN(DbgEn));
|
||
}
|
||
|
||
/* FLEX_CODE_ADDR Bit Fields */
|
||
/**
|
||
* @brief Get Code Header Address for FlexCore Always 4-byte aligned
|
||
* @return FLEX Code Header Address.
|
||
* */
|
||
LOCAL_INLINE uint32_t SEC_HWA_GetFlexCodeHeadAddr(void)
|
||
{
|
||
return (uint32_t)((SEC->FLEX_CODE_ADDR & SEC_FLEX_CODE_ADDR_FLEX_CODE_ADDR_MASK) >> SEC_FLEX_CODE_ADDR_FLEX_CODE_ADDR_SHIFT);
|
||
}
|
||
|
||
/* PFLASH_PRLLL_EN Bit Fields */
|
||
/**
|
||
* @brief Get PFLASH Parallel Enable
|
||
* @return
|
||
* 0101b - Disable
|
||
* Others - Enable
|
||
* */
|
||
LOCAL_INLINE bool SEC_HWA_GetPflashPrlllEn(void)
|
||
{
|
||
bool ret = false;
|
||
uint32_t srk=(uint32_t)((SEC->PFLASH_PRLLL_EN & SEC_PFLASH_PRLLL_EN_PFLASH_PRLLL_EN_MASK) >> SEC_PFLASH_PRLLL_EN_PFLASH_PRLLL_EN_SHIFT);
|
||
if (srk !=0x5U)
|
||
{
|
||
ret =true ;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/** @}*/ /* HwA_SEC */
|
||
#endif /* HWA_INCLUDE_HWA_SEC_H_ */
|