PeripheralDriver_Flagchip_F.../Src/module_driver_csc.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 */