41#define CRITICAL_CH_CONFIG ((uint8_t)ERRCTRL_FLOAT_bm | (uint8_t)ERRCTRL_ERRLVL_CRITICAL_gc)
48#define CFD_RESET_CONFIG 0U
79static const uint32_t cfd0ChMask = 1UL << ERRCTRL_ESF_9_bp;
80static const uint32_t cfd1ChMask = 1UL << ERRCTRL_ESF_10_bp;
81static const uint32_t cfm0ChMask = 1UL << ERRCTRL_ESF_11_bp;
82static const uint32_t cfm1ChMask = 1UL << ERRCTRL_ESF_12_bp;
88static volatile cfdState_t cfd0State = {
89 .isDiagOngoing =
false,
90 .wasIntEnabled =
false,
95static volatile cfdState_t cfd1State = {
96 .isDiagOngoing =
false,
97 .wasIntEnabled =
false,
103static void SetupCfd(
bool isCfd0Diag);
104static void BackupDisableCfdInterrupts(
bool isCfd0Diag);
105static void BackupDisableErrorChConfig(
bool isCfd0Diag);
106static void BackupConfigureCfd(
bool isCfd0Diag);
107static void DisableCfdChannel(
bool isCfd0Diag);
109static bool IsCfdDiagPassed(uint8_t cfmMask, uint32_t cfmChMask);
111static void RestoreCfd(
bool isCfd0Diag);
112static void RestoreCfdChannel(
bool isCfd0Diag);
113static void RestoreCfdInterrupts(
bool isCfd0Diag);
115static cfmConfig_t SetupCfm(
bool isCfm0Diag);
116static cfmConfig_t BackupCfmConfig(
bool isCfm0Diag);
117static cfmConfig_t BackupCfm0Config(
void);
118static cfmConfig_t BackupCfm1Config(
void);
119static void DisableCfmChannel(
bool isCfm0Diag);
120static void ConfigureCfmRefOsc(
bool isCfm0Diag);
122static bool IsCfmDiagPassed(
bool isCfm0Diag);
123static bool IsCfm0TestPassed(uint16_t windowLow, uint16_t windowHigh,
bool expectErr);
124static bool IsCfm1TestPassed(uint16_t windowLow, uint16_t windowHigh,
bool expectErr);
125static bool CheckCfmTest(uint8_t cfmMask, uint8_t cfmDoneMask, uint32_t cfmChMask,
bool expectErr);
126static bool IsCfmFlagSet(uint8_t cfmMask, uint8_t cfmDoneMask);
128static void RestoreCfmConfig(
bool isCfm0Diag, cfmConfig_t config);
129static void RestoreCfm0Config(cfmConfig_t config);
130static void RestoreCfm1Config(cfmConfig_t config);
131static void RestoreCfmChannel(
bool isCfm0Diag, uint8_t chConfig);
137 if (cfd0State.isDiagOngoing || !isConfigurable)
145 bool isCfd0Diag =
true;
147 SetupCfd(isCfd0Diag);
150 const uint8_t cfd0Mask = (uint8_t)CLKCTRL_CFD0_bm;
153 cfd0State.isDiagOngoing =
true;
162 if (cfd0State.isDiagOngoing ==
false)
171 const uint8_t cfd0Mask = (uint8_t)CLKCTRL_CFD0_bm;
172 const bool isDiagPassed = IsCfdDiagPassed(cfd0Mask, cfd0ChMask);
174 cfd0State.isDiagOngoing =
false;
180 bool isCfd0Diag =
true;
182 RestoreCfd(isCfd0Diag);
196 return cfd0State.isDiagOngoing;
203 if (cfd1State.isDiagOngoing || !isConfigurable)
211 bool isCfd0Diag =
false;
213 SetupCfd(isCfd0Diag);
216 const uint8_t cfd1Mask = (uint8_t)CLKCTRL_CFD1_bm;
218 cfd1State.isDiagOngoing =
true;
227 if (cfd1State.isDiagOngoing ==
false)
236 const uint8_t cfd1Mask = (uint8_t)CLKCTRL_CFD1_bm;
237 const bool isDiagPassed = IsCfdDiagPassed(cfd1Mask, cfd1ChMask);
239 cfd1State.isDiagOngoing =
false;
246 bool isCfd0Diag =
false;
247 RestoreCfd(isCfd0Diag);
261 return cfd1State.isDiagOngoing;
276 bool isCfm0Diag =
true;
278 cfmConfig_t cfm0Backup = SetupCfm(isCfm0Diag);
281 const bool isDiagPassed = IsCfmDiagPassed(isCfm0Diag);
283 uint8_t monitorEnableMask = (uint8_t)CLKCTRL_MEN_bm;
286 RestoreCfmConfig(isCfm0Diag, cfm0Backup);
310 bool isCfm0Diag =
false;
312 cfmConfig_t cfm1Backup = SetupCfm(isCfm0Diag);
315 const bool isDiagPassed = IsCfmDiagPassed(isCfm0Diag);
317 uint8_t monitorEnableMask = (uint8_t)CLKCTRL_MEN_bm;
321 RestoreCfmConfig(isCfm0Diag, cfm1Backup);
334static void SetupCfd(
bool isCfd0Diag)
337 BackupDisableCfdInterrupts(isCfd0Diag);
340 BackupDisableErrorChConfig(isCfd0Diag);
343 BackupConfigureCfd(isCfd0Diag);
347static void BackupDisableCfdInterrupts(
bool isCfd0Diag)
353 intMask = (uint8_t)CLKCTRL_CFD0_bm;
354 cfd0State.wasIntEnabled = ((intControl & intMask) == intMask);
358 intMask = (uint8_t)CLKCTRL_CFD1_bm;
359 cfd1State.wasIntEnabled = ((intControl & intMask) == intMask);
365static void BackupDisableErrorChConfig(
bool isCfd0Diag)
370 DisableCfdChannel(isCfd0Diag);
375 DisableCfdChannel(isCfd0Diag);
380static void BackupConfigureCfd(
bool isCfd0Diag)
382 const uint8_t cfdEnableMask = (uint8_t)CLKCTRL_CFDEN_bm;
383 const uint8_t srcOscHfConfig = (uint8_t)CLKCTRL_CFDSRC_OSCHF_gc;
384 const uint8_t refOsc32kConfig = (uint8_t)CLKCTRL_CFDREF_OSC32K_gc;
399static void DisableCfdChannel(
bool isCfd0Diag)
401 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
402 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
403 const uint8_t severityConfig = (uint8_t)(ERRCTRL_ERRLVL_NOTIFICATION_gc);
404 const uint8_t disabledChConfig = (floatConfig | severityConfig);
420static bool IsCfdDiagPassed(uint8_t cfmMask, uint32_t cfmChMask)
423 const bool isCfdFlagSet = ((intFlags & cfmMask) == cfmMask);
426 const bool isErrorChSet = ((chStatus & cfmChMask) == cfmChMask);
428 return (isCfdFlagSet && isErrorChSet);
432static void RestoreCfd(
bool isCfd0Diag)
445 RestoreCfdChannel(isCfd0Diag);
448 RestoreCfdInterrupts(isCfd0Diag);
452static void RestoreCfdChannel(
bool isCfd0Diag)
454 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
468static void RestoreCfdInterrupts(
bool isCfd0Diag)
472 if (cfd0State.wasIntEnabled)
474 uint8_t intMask = (uint8_t)CLKCTRL_CFD0_bm;
480 if (cfd1State.wasIntEnabled)
482 uint8_t intMask = (uint8_t)CLKCTRL_CFD1_bm;
489static cfmConfig_t SetupCfm(
bool isCfm0Diag)
492 cfmConfig_t cfmBackup = BackupCfmConfig(isCfm0Diag);
494 DisableCfmChannel(isCfm0Diag);
497 ConfigureCfmRefOsc(isCfm0Diag);
503static cfmConfig_t BackupCfmConfig(
bool isCfm0Diag)
505 cfmConfig_t cfmConfig;
508 cfmConfig = BackupCfm0Config();
512 cfmConfig = BackupCfm1Config();
518static cfmConfig_t BackupCfm0Config(
void)
520 cfmConfig_t cfmConfig;
531static cfmConfig_t BackupCfm1Config(
void)
533 cfmConfig_t cfmConfig;
544static void DisableCfmChannel(
bool isCfm0Diag)
546 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
547 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
548 const uint8_t severityConfig = (uint8_t)(ERRCTRL_ERRLVL_NOTIFICATION_gc);
549 const uint8_t disabledChConfig = (floatConfig | severityConfig);
565static void ConfigureCfmRefOsc(
bool isCfm0Diag)
567 uint8_t monitorEnableMask = (uint8_t)CLKCTRL_MEN_bm;
569 uint8_t cfmCtrlBConfig = (uint8_t)CLKCTRL_CFMREF_OSCHF_gc | (uint8_t)CLKCTRL_CFMREF_gm;
593static bool IsCfmDiagPassed(
bool isCfm0Diag)
595 bool (*cfmTest)(uint16_t windowLow, uint16_t windowHigh,
bool expectErr);
598 cfmTest = &IsCfm0TestPassed;
602 cfmTest = &IsCfm1TestPassed;
606 uint16_t windowLow = 5U;
607 uint16_t windowHigh = 11U;
608 bool expectErr =
false;
609 const bool isDiagInsidePassed = cfmTest(windowLow, windowHigh, expectErr);
615 const bool isDiagOverPassed = cfmTest(windowLow, windowHigh, expectErr);
621 const bool isDiagUnderPassed = cfmTest(windowLow, windowHigh, expectErr);
623 return (isDiagInsidePassed && isDiagOverPassed && isDiagUnderPassed);
627static bool IsCfm0TestPassed(uint16_t windowLow, uint16_t windowHigh,
bool expectErr)
630 const uint8_t monitorEnableMask = (uint8_t)CLKCTRL_MEN_bm;
631 const uint8_t srcOscHfMask = (uint8_t)CLKCTRL_CFMSRC_OSCHF_gc;
632 const uint8_t oneShotMask = (uint8_t)CLKCTRL_TYPE_ONESHOT_gc;
633 const uint8_t cfmMask = (uint8_t)CLKCTRL_CFM0_bm;
634 const uint8_t cfmDoneMask = (uint8_t)CLKCTRL_CFMD0_bm;
642 const bool isDiagPassed = CheckCfmTest(cfmMask, cfmDoneMask, cfm0ChMask, expectErr);
652static bool IsCfm1TestPassed(uint16_t windowLow, uint16_t windowHigh,
bool expectErr)
655 const uint8_t monitorEnableMask = (uint8_t)CLKCTRL_MEN_bm;
656 const uint8_t srcOscHfMask = (uint8_t)CLKCTRL_CFMSRC_OSCHF_gc;
657 const uint8_t oneShotMask = (uint8_t)CLKCTRL_TYPE_ONESHOT_gc;
658 const uint8_t cfmMask = (uint8_t)CLKCTRL_CFM1_bm;
659 const uint8_t cfmDoneMask = (uint8_t)CLKCTRL_CFMD1_bm;
668 const bool isDiagPassed = CheckCfmTest(cfmMask, cfmDoneMask, cfm1ChMask, expectErr);
678static bool CheckCfmTest(uint8_t cfmMask, uint8_t cfmDoneMask, uint32_t cfmChMask,
bool expectErr)
680 bool isIntFlagSet = IsCfmFlagSet(cfmMask, cfmDoneMask);
683 bool isErrorChSet = ((chStatus & cfmChMask) == cfmChMask);
685 bool isDiagPassed =
false;
689 isDiagPassed = (isIntFlagSet && isErrorChSet);
694 isDiagPassed = !(isIntFlagSet || isErrorChSet);
701static bool IsCfmFlagSet(uint8_t cfmMask, uint8_t cfmDoneMask)
704 bool isCfmDone =
false;
708 isCfmDone = ((intFlags & cfmDoneMask) == cfmDoneMask);
711 return ((intFlags & cfmMask) == cfmMask);
715static void RestoreCfmConfig(
bool isCfm0Diag, cfmConfig_t config)
719 RestoreCfm0Config(config);
723 RestoreCfm1Config(config);
725 RestoreCfmChannel(isCfm0Diag, config.errChBackup);
729static void RestoreCfm0Config(cfmConfig_t config)
739static void RestoreCfm1Config(cfmConfig_t config)
749static void RestoreCfmChannel(
bool isCfm0Diag, uint8_t chConfig)
751 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
errFlag_t
Defines the error flag used by Middleware services to indicate error detection.
void CLKCTRL_WriteCfm1ControlA(uint8_t value)
Overwrites the MCLKCFM1CTRLA register value.
void CLKCTRL_ClearCfm0ControlA(uint8_t bitmask)
Clears specific bits in the MCLKCFM0CTRLA register.
void CLKCTRL_WriteCfd0ControlA(uint8_t value)
Overwrites the MCLKCFD0CTRLA register value.
uint16_t CLKCTRL_ReadCfm0WindowLow(void)
Reads the MCLKCFM0WINLT register value.
uint8_t CLKCTRL_ReadCfm1ControlA(void)
Reads the MCLKCFM1CTRLA register value.
void CLKCTRL_WriteCfm1WindowHigh(uint16_t value)
Overwrites the MCLKCFM1WINHT register value.
void CLKCTRL_WriteCfm0ControlB(uint8_t value)
Overwrites the MCLKCFM0CTRLB register value.
uint16_t CLKCTRL_ReadCfm1WindowLow(void)
Reads the MCLKCFM1WINLT register value.
void CLKCTRL_ClearCfm1ControlA(uint8_t bitmask)
Clears specific bits in the MCLKCFM1CTRLA register.
uint8_t CLKCTRL_ReadCfd1ControlA(void)
Reads the MCLKCFD1CTRLA register value.
void CLKCTRL_WriteCfm1WindowLow(uint16_t value)
Overwrites the MCLKCFM1WINLT register value.
void CLKCTRL_WriteCfm1RefNum(uint16_t value)
Overwrites the MCLKCFM1REFNUM register value.
uint16_t CLKCTRL_ReadCfm1WindowHigh(void)
Reads the MCLKCFM1WINHT register value.
void CLKCTRL_WriteCfd1ControlA(uint8_t value)
Overwrites the MCLKCFD1CTRLA register value.
uint16_t CLKCTRL_ReadCfm0WindowHigh(void)
Reads the MCLKCFM0WINHT register value.
void CLKCTRL_WriteCfm0RefNum(uint16_t value)
Overwrites the MCLKCFM0REFNUM register value.
uint8_t CLKCTRL_ReadCfd0ControlA(void)
Reads the MCLKCFD0CTRLA register value.
uint16_t CLKCTRL_ReadCfm0RefNum(void)
Reads the MCLKCFM0REFNUM register value.
void CLKCTRL_WriteCfm0WindowHigh(uint16_t value)
Overwrites the MCLKCFM0WINHT register value.
uint8_t CLKCTRL_ReadCfm0ControlB(void)
Reads the MCLKCFM0CTRLB register value.
void CLKCTRL_WriteCfm1ControlB(uint8_t value)
Overwrites the MCLKCFM1CTRLB register value.
uint8_t CLKCTRL_ReadIntFlags(void)
Reads the MCLKINTFLAGS register value.
void CLKCTRL_ClearIntControl(uint8_t bitmask)
Clears specific bits in the MCLKINTCTRL register.
uint8_t CLKCTRL_ReadIntControl(void)
Reads the MCLKINTCTRL register value.
uint8_t CLKCTRL_ReadCfm1ControlB(void)
Reads the MCLKCFM1CTRLB register value.
void CLKCTRL_SetMainControlC(uint8_t bitmask)
Sets specific bits in the MCLKCTRLC register.
void CLKCTRL_WriteCfm0WindowLow(uint16_t value)
Overwrites the MCLKCFM0WINLT register value.
void CLKCTRL_SetIntControl(uint8_t bitmask)
Sets specific bits in the MCLKINTCTRL register.
uint16_t CLKCTRL_ReadCfm1RefNum(void)
Reads the MCLKCFM1REFNUM register value.
void CLKCTRL_WriteCfm0ControlA(uint8_t value)
Overwrites the MCLKCFM0CTRLA register value.
uint8_t CLKCTRL_ReadCfm0ControlA(void)
Reads the MCLKCFM0CTRLA register value.
void CLKCTRL_WriteIntFlags(uint8_t value)
Overwrites the MCLKINTFLAGS register value.
errFlag_t MW_DiagClockCfd0Begin(void)
Starts error injection diagnostic to detect faults in the Clock Failure Detection 0 (CFD0) monitor.
errFlag_t MW_DiagClockCfd1End(void)
Completes error injection diagnostic to detect faults in the CFD1 monitor.
bool MW_IsDiagCfd1Ongoing(void)
Checks if the CFD1 error injection is ongoing.
errFlag_t MW_DiagClockCfd0End(void)
Completes error injection diagnostic to detect faults in the CFD0 monitor.
errFlag_t MW_DiagClockCfm1(void)
Performs error injection diagnostic to detect faults in the Clock Frequency Measure 1 (CFM1) monitor.
errFlag_t MW_DiagClockCfm0(void)
Performs error injection diagnostic to detect faults in the Clock Frequency Measure 0 (CFM0) monitor.
errFlag_t MW_DiagClockCfd1Begin(void)
Starts error injection diagnostic to detect faults in the Clock Failure Detection 1 (CFD1) monitor.
bool MW_IsDiagCfd0Ongoing(void)
Checks if the CFD0 error injection is ongoing.
uint8_t ERRCTRL_ReadConfigCfd1(void)
Reads the ESCCFD1 register value.
void ERRCTRL_WriteConfigCfd0(uint8_t value)
Overwrites the ESCCFD0 register value.
void ERRCTRL_WriteConfigCfd1(uint8_t value)
Overwrites the ESCCFD1 register value.
uint32_t ERRCTRL_ReadChannelStatus(void)
Reads the ESF register value.
uint8_t ERRCTRL_ReadConfigCfd0(void)
Reads the ESCCFD0 register value.
void ERRCTRL_WriteConfigCfm1(uint8_t value)
Overwrites the ESCCFM1 register value.
uint8_t ERRCTRL_ReadConfigCfm0(void)
Reads the ESCCFM0 register value.
uint8_t ERRCTRL_ReadConfigCfm1(void)
Reads the ESCCFM1 register value.
void ERRCTRL_WriteConfigCfm0(uint8_t value)
Overwrites the ESCCFM0 register value.
void ERRCTRL_WriteChannelStatus(uint32_t value)
Overwrites the ESF register value.
void ERRCTRL_ModifyControlA(uint8_t groupMask, uint8_t groupConfig)
Modifies specific bit field(s) in the CTRLA register.
void AtomicSectionStart(void)
Backup and disable global interrupts.
void AtomicSectionEnd(void)
Restore global interrupts if previously enabled.
bool IsErrChConfigurable(uint32_t channelMask)
Check Error Controller state and error channels indicated by the channel mask input.
#define CFD_RESET_CONFIG
Default reset value of CFD CTRLA register in case of erroneously restoring with default backup values...
#define CRITICAL_CH_CONFIG
Default to maximum criticality and float I/O in case of erroneously restoring with default backup val...
Contains API prototypes for the Clock Manager Diagnostics.