268 lines
7.4 KiB
C
268 lines
7.4 KiB
C
/**
|
|
* @file module_driver_csc.h
|
|
* @author Flagchip
|
|
* @brief csc driver type definition and API
|
|
* @version 2.0.0
|
|
* @date 2024-08-20
|
|
*
|
|
* SDK Version: 2.6.0
|
|
*
|
|
|
|
* @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd.
|
|
*
|
|
*/
|
|
|
|
/* ********************************************************************************
|
|
* Revision History:
|
|
*
|
|
* Version Date Initials CR# Descriptions
|
|
* --------- ---------- ------------ ---------- ---------------
|
|
* 2.0.0 2024-08-30 Flagchip055 N/A Update file structures
|
|
******************************************************************************** */
|
|
|
|
#include "module_driver_csc.h"
|
|
|
|
#if CSC0_INSTANCE_COUNT > 0U
|
|
|
|
#include "module_driver_scg.h"
|
|
|
|
|
|
/********* Local Variables ************/
|
|
|
|
/********* Local function ************/
|
|
|
|
/********* Global function ************/
|
|
#if CSC0_CLOCKCONFIG_SUPPORT
|
|
/**
|
|
* @brief set clock out. with clock out pin configure, the clock would be monitored.
|
|
* This Function may combined with SCG_ClkOut setting
|
|
* need to call SCG_SetClkOut,if clock out source set to SCG_CLKOUT. *
|
|
* @param pCsc0ClkOut to Csc0ClkOut instance for clock out configuration
|
|
* @param bLockStatus to lock current register
|
|
*
|
|
* @return Set clock out operation success/failed
|
|
* @note configuration sequence:
|
|
* 1. Disable CLKOUTEN
|
|
* 2. Set CLKOUTSEL
|
|
* 3. Enable CLKOUTEN
|
|
*/
|
|
CSC_RetStatusType CSC0_SetClockOut(const CSC0_ClkoutType *const pCsc0ClkOut, bool bLockStatus)
|
|
{
|
|
CSC_RetStatusType eRetVal = CSC_E_NOT_OK;
|
|
#if CSC0_DEV_ERROR_REPORT == STD_ON
|
|
if (pCsc0ClkOut == NULL)
|
|
{
|
|
CSC0_ReportDevError(CSC0_SET_CLOCK_OUT_ID, CSC0_E_PARAM_POINTER);
|
|
}
|
|
else
|
|
{
|
|
#endif
|
|
|
|
/* Check CSC0_CLKOUT_CTRL register lock status */
|
|
if (0U == CSC0_HWA_CLKOUT_CTRL_GetLockStatus())
|
|
{
|
|
/* Disable CLKOUTEN */
|
|
CSC0_HWA_DisableClockOut();
|
|
/* Set CLKOUTDIV */
|
|
CSC0_HWA_SetClkOutDiv(pCsc0ClkOut->eDivider);
|
|
/* Set CLKOUTSEL */
|
|
CSC0_HWA_SetClkOutSel(pCsc0ClkOut->eClkOutSrc);
|
|
/* Enable CLKOUTEN */
|
|
CSC0_HWA_EnableClockOut();
|
|
|
|
if (true == bLockStatus)
|
|
{
|
|
/* Lock CSC0_CLKOUT_CTRL register */
|
|
CSC0_HWA_LockCLKOUT_CTRL();
|
|
}
|
|
else
|
|
{
|
|
/* No deal with */
|
|
}
|
|
|
|
eRetVal = CSC_E_OK;
|
|
}
|
|
else
|
|
{
|
|
/* No deal with */
|
|
}
|
|
|
|
#if CSC0_DEV_ERROR_REPORT == STD_ON
|
|
}
|
|
#endif
|
|
|
|
return eRetVal;
|
|
}
|
|
|
|
/**
|
|
* @brief set always on clock source configuration include AON32K, RTC, AONCLK clock.
|
|
*
|
|
* @param pAonclkSrcType pointer to AONCLKSR instance for AON clock source configuration
|
|
* @param bLockStatus to lock current register
|
|
*
|
|
* @return Set clock out operation success/failed
|
|
*/
|
|
CSC_RetStatusType CSC0_SetAonClkSrc(const CSC0_AONCLKSRType *const pAonclkSrcType, bool bLockStatus)
|
|
{
|
|
CSC_RetStatusType eRetVal = CSC_E_NOT_OK;
|
|
|
|
#if CSC0_DEV_ERROR_REPORT == STD_ON
|
|
if (pAonclkSrcType == NULL)
|
|
{
|
|
CSC0_ReportDevError(CSC0_SET_AONCLKSRC_ID, CSC0_E_PARAM_POINTER);
|
|
}
|
|
else
|
|
{
|
|
#endif
|
|
|
|
/* Check CSC0_AONCLKSR register lock status */
|
|
if (0U == CSC0_HWA_AONCLKSR_GetLockStaus())
|
|
{
|
|
/* Gating SIRC_32K clock*/
|
|
if ((CSC0_AON32K_SIRCDIV_32K_CLK == pAonclkSrcType->eAon32KSel) ||
|
|
(CSC0_AON_SIRCDIV_32K_CLK == pAonclkSrcType->eAonSel) ||
|
|
(CSC0_RTC_SIRCDIV_32K_CLK == pAonclkSrcType->eRtcSel))
|
|
{
|
|
CSC0_HWA_EnableSIRCDIV_32KClkOut();
|
|
}
|
|
else
|
|
{
|
|
/* No deal with */
|
|
}
|
|
|
|
/* Gating SIRC32_1K clock*/
|
|
if (CSC0_AON_SIRC32_1K_CLK == pAonclkSrcType->eAonSel)
|
|
{
|
|
CSC0_HWA_EnableSIRC32_1KClkOut();
|
|
}
|
|
else
|
|
{
|
|
/* No deal with */
|
|
}
|
|
|
|
/* Set AONCLOCK configuration */
|
|
CSC0_HWA_SetAON32kClkSrc(pAonclkSrcType->eAon32KSel);
|
|
CSC0_HWA_SetRTCClkSrc(pAonclkSrcType->eRtcSel);
|
|
CSC0_HWA_SetAONClkSrc(pAonclkSrcType->eAonSel);
|
|
|
|
if (true == bLockStatus)
|
|
{
|
|
/* Lock CSC0_AONCLKSR register */
|
|
CSC0_HWA_LockAONCLKSR();
|
|
}
|
|
else
|
|
{
|
|
/* No deal with */
|
|
}
|
|
|
|
eRetVal = CSC_E_OK;
|
|
}
|
|
else
|
|
{
|
|
/* No deal with */
|
|
}
|
|
|
|
#if CSC0_DEV_ERROR_REPORT == STD_ON
|
|
}
|
|
#endif
|
|
|
|
return eRetVal;
|
|
}
|
|
|
|
/**
|
|
* @brief Report the clock source status and frequency configured in MCU run time.
|
|
* The clock frequency and status would change by clock set function.
|
|
*
|
|
* @param eClkkName: the CSC0 clock source to query
|
|
* @param pFreq: frequency variable point to get the frequency value
|
|
* @return true or false. This indicate the clock source status invalid or request clock source out of
|
|
* range.
|
|
*/
|
|
CSC_RetStatusType CSC0_GetCSC0ClockFreq(const CSC0_ClkSrcType eClkkName, uint32_t *const pFreq)
|
|
{
|
|
CSC_RetStatusType eRetVal = CSC_E_NOT_OK;
|
|
uint32_t u32TempVal;
|
|
|
|
#if CSC0_DEV_ERROR_REPORT == STD_ON
|
|
if (pFreq == NULL)
|
|
{
|
|
CSC0_ReportDevError(CSC0_GET_CLOCK_FREQ_ID, CSC0_E_PARAM_POINTER);
|
|
}
|
|
else if (eClkkName > CSC0_END_OF_CLOCKS)
|
|
{
|
|
CSC0_ReportDevError(CSC0_GET_CLOCK_FREQ_ID, CSC0_E_PARAM_OUT_RANGE);
|
|
}
|
|
else
|
|
{
|
|
#endif
|
|
|
|
u32TempVal = CSC0_HWA_Get_AONCLKSR();
|
|
|
|
if (CSC0_AON_CLK == eClkkName)
|
|
{
|
|
CSC0_AONClkSrcType eClockkRet = (CSC0_AONClkSrcType)(uint8_t)((u32TempVal & CSC0_AONCLKSR_AONCLKSEL_MASK) >> CSC0_AONCLKSR_AONCLKSEL_SHIFT);
|
|
|
|
if (CSC0_AON_SIRCDIV_128K_CLK == eClockkRet)
|
|
{
|
|
*pFreq = CSC0_AONCLK_128K;
|
|
}
|
|
else if (CSC0_AON_SIRC32_1K_CLK == eClockkRet)
|
|
{
|
|
*pFreq = CSC0_AONCLK_1K;
|
|
}
|
|
else
|
|
{
|
|
*pFreq = CSC0_AONCLK_32K;
|
|
}
|
|
|
|
eRetVal = CSC_E_OK;
|
|
}
|
|
else if (CSC0_AON32K_CLK == eClkkName)
|
|
{
|
|
CSC0_AON32KClkSrcType eClockkRet = (CSC0_AON32KClkSrcType)(uint8_t)((u32TempVal & CSC0_AONCLKSR_AON32KCLKSEL_MASK) >> CSC0_AONCLKSR_AON32KCLKSEL_SHIFT);
|
|
|
|
if (CSC0_AON32K_SOSC32K_CLK == eClockkRet)
|
|
{
|
|
*pFreq = CSC0_AONCLK_SOSC_32K;
|
|
}
|
|
else
|
|
{
|
|
*pFreq = CSC0_AONCLK_32K;
|
|
}
|
|
|
|
eRetVal = CSC_E_OK;
|
|
}
|
|
else if (CSC0_RTC_CLK == eClkkName)
|
|
{
|
|
CSC0_RTCClkSrcType eClockkRet = (CSC0_RTCClkSrcType)(uint8_t)((u32TempVal & CSC0_AONCLKSR_RTCCLKSEL_MASK) >> CSC0_AONCLKSR_RTCCLKSEL_SHIFT);
|
|
if (CSC0_RTC_FOSCDIVL_CLK == eClockkRet)
|
|
{
|
|
*pFreq = SCG_GetScgClockFreq(SCG_FOSCDIVL_CLK);
|
|
}
|
|
else if (CSC0_RTC_SOSC_CLK == eClockkRet)
|
|
{
|
|
*pFreq = CSC0_AONCLK_SOSC_32K;
|
|
}
|
|
else
|
|
{
|
|
*pFreq = CSC0_AONCLK_32K;
|
|
}
|
|
|
|
eRetVal = CSC_E_OK;
|
|
}
|
|
else
|
|
{
|
|
/* Clock out or error parameter do not get frequency */
|
|
*pFreq = 0U;
|
|
}
|
|
|
|
#if CSC0_DEV_ERROR_REPORT == STD_ON
|
|
}
|
|
#endif
|
|
|
|
return eRetVal;
|
|
}
|
|
#endif /* CSC0_CLOCKCONFIG_SUPPORT */
|
|
|
|
#endif /* #if CSC0_INSTANCE_COUNT > 0U */
|