359 lines
12 KiB
C
359 lines
12 KiB
C
/**************************************************************************//**
|
|
* @file nu_scu.h
|
|
* @version V3.00
|
|
* @brief Secure Configuration Unit Driver Header
|
|
*
|
|
* @copyright SPDX-License-Identifier: Apache-2.0
|
|
* @copyright Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
|
|
*****************************************************************************/
|
|
#ifndef __NU_SCU_H__
|
|
#define __NU_SCU_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
|
|
/** @addtogroup Standard_Driver Standard Driver
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup SCU_Driver SCU Driver
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup SCU_EXPORTED_CONSTANTS SCU Exported Constants
|
|
@{
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
* @details Non-secure Attribution Definition.
|
|
*/
|
|
typedef enum NSATTR
|
|
{
|
|
/****** PNNSET0 **********************************************************************************/
|
|
USBH_Attr = 9,
|
|
SDH0_Attr = 13,
|
|
EBI_Attr = 16,
|
|
PDMA1_Attr = 24,
|
|
|
|
/****** PNNSET1 **********************************************************************************/
|
|
CRC_Attr = 32 + 17,
|
|
CRPT_Attr = 32 + 18,
|
|
|
|
/****** PNNSET2 **********************************************************************************/
|
|
EWDT_Attr = 64 + 2,
|
|
EADC_Attr = 64 + 3,
|
|
ACMP01_Attr = 64 + 5,
|
|
DAC_Attr = 64 + 7,
|
|
I2S0_Attr = 64 + 8,
|
|
OTG_Attr = 64 + 13,
|
|
TMR23_Attr = 64 + 17,
|
|
TMR45_Attr = 64 + 18,
|
|
EPWM0_Attr = 64 + 24,
|
|
EPWM1_Attr = 64 + 25,
|
|
BPWM0_Attr = 64 + 26,
|
|
BPWM1_Attr = 64 + 27,
|
|
/****** PNNSET3 **********************************************************************************/
|
|
QSPI0_Attr = 96 + 0,
|
|
SPI0_Attr = 96 + 1,
|
|
SPI1_Attr = 96 + 2,
|
|
SPI2_Attr = 96 + 3,
|
|
SPI3_Attr = 96 + 4,
|
|
UART0_Attr = 96 + 16,
|
|
UART1_Attr = 96 + 17,
|
|
UART2_Attr = 96 + 18,
|
|
UART3_Attr = 96 + 19,
|
|
UART4_Attr = 96 + 20,
|
|
UART5_Attr = 96 + 21,
|
|
/****** PNNSET4 **********************************************************************************/
|
|
I2C0_Attr = 128 + 0,
|
|
I2C1_Attr = 128 + 1,
|
|
I2C2_Attr = 128 + 2,
|
|
SC0_Attr = 128 + 16,
|
|
SC1_Attr = 128 + 17,
|
|
SC2_Attr = 128 + 18,
|
|
|
|
|
|
/****** PNNSET5 **********************************************************************************/
|
|
CAN0_Attr = 160 + 0,
|
|
QEI0_Attr = 160 + 16,
|
|
QEI1_Attr = 160 + 17,
|
|
ECAP0_Attr = 160 + 20,
|
|
ECAP1_Attr = 160 + 21,
|
|
TRNG_Attr = 160 + 25,
|
|
LCD_Attr = 160 + 27,
|
|
|
|
/****** PNNSET6 **********************************************************************************/
|
|
USBD_Attr = 192 + 0,
|
|
USCI0_Attr = 192 + 16,
|
|
USCI1_Attr = 192 + 17
|
|
|
|
|
|
} NSATTR_T;
|
|
|
|
|
|
/**@}*/ /* end of group SCU_EXPORTED_CONSTANTS */
|
|
|
|
|
|
/** @addtogroup SCU_EXPORTED_FUNCTIONS SCU Exported Functions
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
* @brief Set peripheral non-secure attribution
|
|
*
|
|
* @param[in] nsattr The secure/non-secure attribution of specified module.
|
|
The possible value could be refer to \ref NSATTR.
|
|
*
|
|
* @return None
|
|
*
|
|
* @details This macro is used to set a peripheral to be non-secure peripheral.
|
|
*
|
|
*/
|
|
#define SCU_SET_PNSSET(nsattr) { SCU->PNSSET[(nsattr)/32] |= (1 << ((nsattr) & 0x1ful)); }
|
|
|
|
/**
|
|
* @brief Get peripheral secure/non-secure attribution
|
|
*
|
|
* @param[in] nsattr The secure/non-secure attribution of specified module.
|
|
The possible value could be refer to \ref NSATTR.
|
|
*
|
|
* @return The secure/non-secure attribution of specified peripheral.
|
|
* @retval 0 The peripheral is secure
|
|
* @retval 1 The peripheral is non-secure
|
|
*
|
|
* @details This macro gets the peripheral secure/non-secure attribution.
|
|
*/
|
|
#define SCU_GET_PNSSET(nsattr) ((SCU->PNSSET[(nsattr)/32] >> ((nsattr) & 0x1ful)) & 1ul)
|
|
|
|
|
|
/**
|
|
* @brief Set secure/non-secure attribution of specified GPIO pin
|
|
*
|
|
* @param[in] port GPIO Port. It could be PA, PB, PC, PD, PE, PF, PG and PH.
|
|
* @param[in] bitmask Bit mask of each bit. 0 is secure. 1 is non-secure.
|
|
*
|
|
* @return None
|
|
*
|
|
* @details This macro sets GPIO pin secure/non-secure attribution.
|
|
*/
|
|
#define SCU_SET_IONSSET(port, mask) (SCU->IONSSET[((uint32_t)(port)-(GPIOA_BASE))/0x40] = (mask))
|
|
|
|
|
|
/**
|
|
* @brief Get secure/non-secure attribution of specified GPIO port
|
|
*
|
|
* @param[in] port GPIO Port. It could be PA, PB, PC, PD, PE, PF, PG and PH.
|
|
*
|
|
* @return The secure/non-secure attribution of the port.
|
|
* @retval 0 The relative bit of specified IO port is secure
|
|
* @retval 1 The relative bit of specified IO port is non-secure
|
|
*
|
|
* @details This macro gets IO secure/non-secure attribution of specified IO port.
|
|
*/
|
|
#define SCU_GET_IONSSET(port) (SCU->IONSSET[((uint32_t)(port) - (GPIOA_BASE))/0x40])
|
|
|
|
|
|
/**
|
|
* @brief Enable sercure violation interrupts
|
|
*
|
|
* @param[in] mask The mask of each secure violation interrupt source
|
|
* - \ref SCU_SVIOIEN_APB0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_APB1IEN_Msk
|
|
* - \ref SCU_SVIOIEN_GPIOIEN_Msk
|
|
* - \ref SCU_SVIOIEN_EBIIEN_Msk
|
|
* - \ref SCU_SVIOIEN_USBHIEN_Msk
|
|
* - \ref SCU_SVIOIEN_CRCIEN_Msk
|
|
* - \ref SCU_SVIOIEN_SDH0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_PDMA0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_PDMA1IEN_Msk
|
|
* - \ref SCU_SVIOIEN_SRAM0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_SRAM1IEN_Msk
|
|
* - \ref SCU_SVIOIEN_FMCIEN_Msk
|
|
* - \ref SCU_SVIOIEN_FLASHIEN_Msk
|
|
* - \ref SCU_SVIOIEN_SCUIEN_Msk
|
|
* - \ref SCU_SVIOIEN_SYSIEN_Msk
|
|
* - \ref SCU_SVIOIEN_CRPTIEN_Msk
|
|
*
|
|
* @return None
|
|
*
|
|
* @details This macro is used to enable secure violation interrupt of SCU.
|
|
* The secure violation interrupt could be used to detect attack of secure elements.
|
|
*/
|
|
#define SCU_ENABLE_INT(mask) (SCU->SVIOIEN |= (mask))
|
|
|
|
|
|
/**
|
|
* @brief Disable sercure violation interrupts
|
|
*
|
|
* @param[in] mask The mask of each secure violation interrupt source
|
|
* - \ref SCU_SVIOIEN_APB0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_APB1IEN_Msk
|
|
* - \ref SCU_SVIOIEN_GPIOIEN_Msk
|
|
* - \ref SCU_SVIOIEN_EBIIEN_Msk
|
|
* - \ref SCU_SVIOIEN_USBHIEN_Msk
|
|
* - \ref SCU_SVIOIEN_CRCIEN_Msk
|
|
* - \ref SCU_SVIOIEN_SDH0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_PDMA0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_PDMA1IEN_Msk
|
|
* - \ref SCU_SVIOIEN_SRAM0IEN_Msk
|
|
* - \ref SCU_SVIOIEN_SRAM1IEN_Msk
|
|
* - \ref SCU_SVIOIEN_FMCIEN_Msk
|
|
* - \ref SCU_SVIOIEN_FLASHIEN_Msk
|
|
* - \ref SCU_SVIOIEN_SCUIEN_Msk
|
|
* - \ref SCU_SVIOIEN_SYSIEN_Msk
|
|
* - \ref SCU_SVIOIEN_CRPTIEN_Msk
|
|
*
|
|
* @return None
|
|
*
|
|
* @details This macro is used to disable secure violation interrupt of SCU.
|
|
*
|
|
*/
|
|
#define SCU_DISABLE_INT(mask) (SCU->SVIOIEN &= (~(mask)))
|
|
|
|
|
|
/**
|
|
* @brief Get secure violation interrupt status
|
|
*
|
|
* @param mask The interrupt flag mask bit
|
|
*
|
|
* @return The value of SCU_SVINTSTS register
|
|
*
|
|
* @details Return interrupt flag of SCU_SVINTSTS register.
|
|
*
|
|
*/
|
|
#define SCU_GET_INT_FLAG(mask) (SCU->SVINTSTS&(mask))
|
|
|
|
/**
|
|
* @brief Clear secure violation interrupt flag
|
|
*
|
|
* @param[in] flag The combination of the specified interrupt flags.
|
|
* Each bit corresponds to a interrupt source.
|
|
* This parameter decides which interrupt flags will be cleared.
|
|
* - \ref SCU_SVINTSTS_APB0IF_Msk
|
|
* - \ref SCU_SVINTSTS_APB1IF_Msk
|
|
* - \ref SCU_SVINTSTS_GPIOIF_Msk
|
|
* - \ref SCU_SVINTSTS_EBIIF_Msk
|
|
* - \ref SCU_SVINTSTS_USBHIF_Msk
|
|
* - \ref SCU_SVINTSTS_CRCIF_Msk
|
|
* - \ref SCU_SVINTSTS_SDH0IF_Msk
|
|
* - \ref SCU_SVINTSTS_PDMA0IF_Msk
|
|
* - \ref SCU_SVINTSTS_PDMA1IF_Msk
|
|
* - \ref SCU_SVINTSTS_SRAM0IF_Msk
|
|
* - \ref SCU_SVINTSTS_SRAM1IF_Msk
|
|
* - \ref SCU_SVINTSTS_FMCIF_Msk
|
|
* - \ref SCU_SVINTSTS_FLASHIF_Msk
|
|
* - \ref SCU_SVINTSTS_SCUIF_Msk
|
|
* - \ref SCU_SVINTSTS_SYSIF_Msk
|
|
* - \ref SCU_SVINTSTS_CRPTIF_Msk
|
|
*
|
|
* @return None
|
|
*
|
|
* @details Clear SCU related interrupt flags specified by flag parameter.
|
|
*
|
|
*/
|
|
#define SCU_CLR_INT_FLAG(flag) (SCU->SVINTSTS = (flag))
|
|
|
|
|
|
|
|
/**
|
|
* @brief Control the behavior of non-secure monitor when CPU is in idle state.
|
|
*
|
|
* @param[in] opt Option for behavior control of non-secure monitor when CPU in idle.
|
|
* - true The counter keeps counting when CPU is in idle.
|
|
- false The counter will stop when CPU is in idle.
|
|
*
|
|
* @return None
|
|
*
|
|
* @details To control non-secure monitor counter when CPU is in idle.
|
|
*
|
|
*/
|
|
#define SCU_NSM_IDLE_ON(opt) ((opt)?(SCU->NSMCTL |= SCU_NSMCTL_IDLEON_Msk):(SCU->NSMCTL &= ~SCU_NSMCTL_IDLEON_Msk))
|
|
|
|
/**
|
|
* @brief Control the behavior of non-secure monitor when CPU is in debug state.
|
|
*
|
|
* @param[in] opt Option for behavior control of non-secure monitor when CPU in debug.
|
|
* - true The counter keeps counting when CPU is in debug.
|
|
- false The counter will stop when CPU is in debug.
|
|
*
|
|
* @return None
|
|
*
|
|
* @details To control non-secure monitor counter when CPU is in debug.
|
|
*
|
|
*/
|
|
#define SCU_NSM_DBG_ON(opt) ((opt)?(SCU->NSMCTL |= SCU_NSMCTL_DBGON_Msk):(SCU->NSMCTL &= ~SCU_NSMCTL_DBGON_Msk))
|
|
|
|
|
|
/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */
|
|
__STATIC_INLINE void SCU_NSMConfig(uint32_t u32Ticks, uint32_t u32Prescale);
|
|
__STATIC_INLINE void SCU_TimerConfig(uint32_t u32Ticks, uint32_t u32Prescale);
|
|
|
|
|
|
/**
|
|
* @brief Config non-secure monitor to detect timeout in non-secure state.
|
|
*
|
|
* @param[in] u32Ticks A specified period for timeout in non-secure state
|
|
* @param[in] u32Prescale A pre-scale divider to non-secure monitor clock
|
|
|
|
*
|
|
* @return None
|
|
*
|
|
* @details This function is used to configure non-secure monitor. If the CPU state stay in non-secure state for
|
|
* a specified period. The non-secure monitor will timeout and assert an interrupt. Otherwise, the
|
|
* non-secure monitor will auto clear whenever returning to secure state. This could be used to avoid
|
|
* CPU state in non-secure state too long time for security purpose. User must enable SCU_IRQn if interrupt
|
|
* is necessary.
|
|
*
|
|
*/
|
|
__STATIC_INLINE void SCU_NSMConfig(uint32_t u32Ticks, uint32_t u32Prescale)
|
|
{
|
|
|
|
SCU->NSMLOAD = u32Ticks;
|
|
SCU->NSMVAL = 0ul;
|
|
SCU->NSMCTL = SCU_NSMCTL_AUTORLD_Msk | SCU_NSMCTL_NSMIEN_Msk | (u32Prescale & 0xfful);
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Config non-secure monitor to be a timer.
|
|
*
|
|
* @param[in] u32Ticks A specified period for timer interrupt.
|
|
* @param[in] u32Prescale A pre-scale divider to timer clock source.
|
|
|
|
*
|
|
* @return None
|
|
*
|
|
* @details This function is used to configure non-secure monitor as a timer. In other words, the timer counter
|
|
* keeps counting even CPU is in secure state.
|
|
*
|
|
*/
|
|
__STATIC_INLINE void SCU_TimerConfig(uint32_t u32Ticks, uint32_t u32Prescale)
|
|
{
|
|
|
|
SCU->NSMLOAD = u32Ticks;
|
|
SCU->NSMVAL = 0ul;
|
|
SCU->NSMCTL = SCU_NSMCTL_AUTORLD_Msk | SCU_NSMCTL_NSMIEN_Msk | SCU_NSMCTL_TMRMOD_Msk | (u32Prescale & 0xfful);
|
|
}
|
|
|
|
|
|
|
|
|
|
/**@}*/ /* end of group SCU_EXPORTED_FUNCTIONS */
|
|
|
|
/**@}*/ /* end of group SCU_Driver */
|
|
|
|
/**@}*/ /* end of group Standard_Driver */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __NU_SCU_H__ */
|
|
|