rt-thread-official/bsp/nuvoton/libraries/m2354/StdDriver/inc/nu_scu.h

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__ */