409 lines
11 KiB
C
409 lines
11 KiB
C
/* Copyright Statement:
|
|
*
|
|
* This software/firmware and related documentation ("AutoChips Software") are
|
|
* protected under relevant copyright laws. The information contained herein is
|
|
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
|
|
* the prior written permission of AutoChips inc. and/or its licensors, any
|
|
* reproduction, modification, use or disclosure of AutoChips Software, and
|
|
* information contained herein, in whole or in part, shall be strictly
|
|
* prohibited.
|
|
*
|
|
* AutoChips Inc. (C) 2021. All rights reserved.
|
|
*
|
|
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
|
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
|
|
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
|
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
|
|
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
|
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
|
|
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
|
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
|
|
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
|
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
|
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
|
|
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
|
|
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
|
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
|
|
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
|
|
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
|
|
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
|
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
|
|
*/
|
|
|
|
/*!
|
|
* @file spm_hw.h
|
|
*
|
|
* @brief This file provides spm hardware integration functions interface.
|
|
*
|
|
*/
|
|
|
|
/* PRQA S 4304 EOF */ /* Type conversion. */
|
|
|
|
#ifndef SPM_HW_H
|
|
#define SPM_HW_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/* =========================================== Includes =========================================== */
|
|
#include "spm_drv.h"
|
|
|
|
/* ============================================ Define ============================================ */
|
|
|
|
/* =========================================== Typedef ============================================ */
|
|
|
|
/* ========================================== Variables =========================================== */
|
|
|
|
/* ==================================== Functions declaration ===================================== */
|
|
|
|
/* ===================================== Functions definition ===================================== */
|
|
/*!
|
|
* @brief Set the power mode.
|
|
*
|
|
* @param[in] power mode, value can be
|
|
* - POWER_MODE_RUN
|
|
* - POWER_MODE_VLPR
|
|
* - POWER_MODE_STOP1
|
|
* - POWER_MODE_STOP2
|
|
* - POWER_MODE_VLPS
|
|
* - POWER_MODE_STANDBY
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SetPowerMode(spm_power_mode_t mode)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_POWER_MODE_Msk, SPM_PWR_MGR_CFG0_POWER_MODE_Pos, (uint32_t)mode);
|
|
/* enable AWIC */
|
|
SET_BIT32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_AWIC_EN_Msk);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the current power mode.
|
|
*
|
|
* @param[in] none
|
|
* @return the current power mode,value can be
|
|
* - POWER_MODE_RUN
|
|
* - POWER_MODE_VLPR
|
|
* - POWER_MODE_STOP1
|
|
* - POWER_MODE_STOP2
|
|
* - POWER_MODE_VLPS
|
|
* - POWER_MODE_STANDBY
|
|
*/
|
|
static inline spm_power_mode_t SPM_GetPowerMode(void)
|
|
{
|
|
return (spm_power_mode_t)(SPM->STATUS & SPM_STATUS_CURR_POWER_MODE_Msk);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the power control mode.
|
|
*
|
|
* @param[in] none
|
|
* @return the power control mode,value can be
|
|
* - POWER_MODE_RUN
|
|
* - POWER_MODE_VLPR
|
|
* - POWER_MODE_STOP1
|
|
* - POWER_MODE_STOP2
|
|
* - POWER_MODE_VLPS
|
|
* - POWER_MODE_STANDBY
|
|
*/
|
|
static inline spm_power_mode_t SPM_GetPowerControlMode(void)
|
|
{
|
|
return (spm_power_mode_t)((SPM->PWR_MGR_CFG0 & SPM_PWR_MGR_CFG0_POWER_MODE_Msk) >> SPM_PWR_MGR_CFG0_POWER_MODE_Pos);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set reset mask in all scenarios.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable reset mask
|
|
* - false: disable reset mask
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SetResetMask(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_RESET_MASK_Msk, SPM_PWR_MGR_CFG0_RESET_MASK_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable XOSC bypass mode.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable XOSC bypass
|
|
* - false: disable XOSC bypass
|
|
* @return none
|
|
*/
|
|
static inline void SPM_EnableXOSCBypassMode(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_XOSC_HSEBYP_Msk, SPM_PWR_MGR_CFG1_XOSC_HSEBYP_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable HSI.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable HSI
|
|
* - false: disable HSI
|
|
* @return none
|
|
*/
|
|
static inline void SPM_EnableHSI(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_HSI_EN_NORMAL_Msk, SPM_PWR_MGR_CFG1_HSI_EN_NORMAL_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable HSI in VLPS.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable HSI in VLPS
|
|
* - false: disable HSI in VLPS
|
|
* @return none
|
|
*/
|
|
static inline void SPM_EnableHSIInVLPS(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_HSI_EN_VLPS_Msk, SPM_PWR_MGR_CFG1_HSI_EN_VLPS_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Gets HSI status.
|
|
*
|
|
* @param[in] none
|
|
* @return The HSI status
|
|
* - true : HSI valid
|
|
* - false: HSI invalid
|
|
*/
|
|
static inline bool SPM_GetHSIStatus(void)
|
|
{
|
|
return (((SPM->PWR_MGR_CFG1 & SPM_PWR_MGR_CFG1_HSI_RDY_Msk) >> SPM_PWR_MGR_CFG1_HSI_RDY_Pos) != 0U);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable VHSI.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable VHSI
|
|
* - false: disable VHSI
|
|
* @return none
|
|
*/
|
|
static inline void SPM_EnableVHSI(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_VHSI_EN_Msk, SPM_PWR_MGR_CFG1_VHSI_EN_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Gets VHSI status.
|
|
*
|
|
* @param[in] none
|
|
* @return The VHSI status
|
|
* - true : VHSI valid
|
|
* - false: VHSI invalid
|
|
*/
|
|
static inline bool SPM_GetVHSIStatus(void)
|
|
{
|
|
return (((SPM->PWR_MGR_CFG1 & SPM_PWR_MGR_CFG1_VHSI_RDY_Msk) >> SPM_PWR_MGR_CFG1_VHSI_RDY_Pos) != 0U);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable XOSC.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable XOSC
|
|
* - false: disable XOSC
|
|
* @return none
|
|
*/
|
|
static inline void SPM_EnableXOSC(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_XOSC_HSEEN_Msk, SPM_PWR_MGR_CFG1_XOSC_HSEEN_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Gets XOSC status.
|
|
*
|
|
* @param[in] none
|
|
* @return The XOSC status
|
|
* - true : XOSC valid
|
|
* - false: XOSC invalid
|
|
*/
|
|
static inline bool SPM_GetXOSCStatus(void)
|
|
{
|
|
return (((SPM->PWR_MGR_CFG1 & SPM_PWR_MGR_CFG1_XOSC_RDY_Msk) >> SPM_PWR_MGR_CFG1_XOSC_RDY_Pos) != 0U);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable SPLL.
|
|
*
|
|
* @param[in] enable State
|
|
* - true: enable SPLL
|
|
* - false: disable SPLL
|
|
* @return none
|
|
*/
|
|
static inline void SPM_EnableSPLL(bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_SPLL_EN_Msk, SPM_PWR_MGR_CFG1_SPLL_EN_Pos, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Gets SPLL status.
|
|
*
|
|
* @param[in] none
|
|
* @return The SPLL status
|
|
* - true : SPLL valid
|
|
* - false: SPLL invalid
|
|
*/
|
|
static inline bool SPM_GetSPLLStatus(void)
|
|
{
|
|
return (((SPM->PWR_MGR_CFG1 & SPM_PWR_MGR_CFG1_SPLL_RDY_Msk) >> SPM_PWR_MGR_CFG1_SPLL_RDY_Pos) != 0U);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get module sleep ack status.
|
|
*
|
|
* @param[in] none
|
|
* @return sleep ack status value
|
|
* - BIT0: SLEEP_ACK_I2C0
|
|
* - BIT2: SLEEP_ACK_SPI0
|
|
* - BIT3: SLEEP_ACK_SPI1
|
|
* - BIT4: SLEEP_ACK_SPI2
|
|
* - BIT5: SLEEP_ACK_CAN0
|
|
* - BIT6: SLEEP_ACK_CAN1
|
|
* - BIT7: SLEEP_ACK_CAN2
|
|
* - BIT8: SLEEP_ACK_CAN3
|
|
* - BIT11: SLEEP_ACK_UART0
|
|
* - BIT12: SLEEP_ACK_UART1
|
|
* - BIT13: SLEEP_ACK_UART2
|
|
* - BIT14: SLEEP_ACK_UART3
|
|
* - BIT17: SLEEP_ACK_DMA0
|
|
* - BIT18: SLEEP_ACK_EIO
|
|
* - BIT19: SLEEP_ACK_FLASH
|
|
*/
|
|
static inline uint32_t SPM_GetModuleSleepACKStatus(void)
|
|
{
|
|
return (SPM->PERIPH_SLEEP_ACK_STATUS);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set module sleep ack enable.
|
|
*
|
|
* @param[in] index: module index
|
|
* @param[in] enable: sleep ack enable
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SetModuleSleepACKEnable(spm_peri_sleep_ack_t index, bool enable)
|
|
{
|
|
MODIFY_REG32(SPM->PERIPH_SLEEP_ACK_EN, (1UL << (uint32_t)index), (uint32_t)index, (uint32_t)enable);
|
|
}
|
|
|
|
/*!
|
|
* @brief Select reset or interrupt after ack time out.
|
|
*
|
|
* @param[in] action after ack time out
|
|
* - ACK_TIMEOUT_ACTION_INTERRUPT
|
|
* - ACK_TIMEOUT_ACTION_RESET
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SelectACKTimeOutAction(spm_ack_timeout_action_t action)
|
|
{
|
|
if (ACK_TIMEOUT_ACTION_INTERRUPT == action)
|
|
{
|
|
NVIC_EnableIRQ(SPM_IRQn);
|
|
CLEAR_BIT32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_ACK_TIMEOUT_ACTION_Msk);
|
|
}
|
|
else
|
|
{
|
|
SET_BIT32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_ACK_TIMEOUT_ACTION_Msk);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* @brief Clear ack timeout flag.
|
|
*
|
|
* @param[in] none
|
|
* @return none
|
|
*/
|
|
static inline void SPM_ClearACKTimeOutFlag(void)
|
|
{
|
|
SET_BIT32(SPM->STATUS, SPM_STATUS_ACK_TIMEOUT_FLAG_Msk);
|
|
}
|
|
|
|
/*!
|
|
* @brief Select lvd threshold.
|
|
*
|
|
* @param[in] threshold value
|
|
* - LVD_LOW_THRESHOLD
|
|
* - LVD_HIGH_THRESHOLD
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SelectLVDThreshold(spm_lvd_threshold_t threshold)
|
|
{
|
|
if (LVD_LOW_THRESHOLD == threshold)
|
|
{
|
|
CLEAR_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_LVD_THRESHOLD_Msk);
|
|
}
|
|
else
|
|
{
|
|
SET_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_LVD_THRESHOLD_Msk);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* @brief Select lvr threshold.
|
|
*
|
|
* @param[in] threshold value
|
|
* - LVR_LOW_THRESHOLD
|
|
* - LVR_HIGH_THRESHOLD
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SelectLVRThreshold(spm_lvr_threshold_t threshold)
|
|
{
|
|
if (LVR_HIGH_THRESHOLD == threshold)
|
|
{
|
|
CLEAR_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_LVR_THRESHOLD_Msk);
|
|
}
|
|
else
|
|
{
|
|
SET_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_LVR_THRESHOLD_Msk);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* @brief Set standby wakeup enable.
|
|
*
|
|
* @param[in] source: standby wakeup source
|
|
* @param[in] type: standby wakeup type
|
|
* @return none
|
|
*/
|
|
static inline void SPM_SetStandbyWakeup(spm_standby_wakeup_source_t source, spm_standby_wakeup_t type)
|
|
{
|
|
MODIFY_REG32(SPM->STB_WP_EN, SPM_STB_WP_EN_PA12_Msk << ((uint32_t)source * 2U), ((uint32_t)source * 2U), (uint32_t)type);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get standby wakeup status.
|
|
*
|
|
* @param[in] none
|
|
* @return standby wakeup status
|
|
*/
|
|
static inline uint32_t SPM_GetStandbyWakeupStatus(void)
|
|
{
|
|
return (SPM->STB_WP_STATUS);
|
|
}
|
|
|
|
/*!
|
|
* @brief Clear standby wakeup status.
|
|
*
|
|
* @param[in] none
|
|
* @return none
|
|
*/
|
|
static inline void SPM_ClearStandbyWakeupStatus(void)
|
|
{
|
|
SPM->STB_WP_STATUS = 0U;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* SPM_HW_H */
|
|
|
|
/* ============================================= EOF ============================================== */
|