42#define CRITICAL_CH_CONFIG ((uint8_t)ERRCTRL_FLOAT_bm | (uint8_t)ERRCTRL_ERRLVL_CRITICAL_gc)
48static volatile bool isDiagOngoing =
false;
53static const uint32_t vregfailChMask = 1UL << ERRCTRL_ESF_0_bp;
54static const uint32_t vregwarnChMask = 1UL << ERRCTRL_ESF_8_bp;
57static errFlag_t DiagVmonBegin(
bool isOver);
58static bool IsDiagVmonDone(
bool isOver);
60static errFlag_t VerifyDiagStartFlags(
void);
61static errFlag_t VerifyDiagEndFlags(
bool isOver);
62static void BackupVregChConfigs(
void);
63static void DisableVregChannels(
void);
64static void RestoreVregChConfigs(
void);
68 const bool isOver =
true;
69 const errFlag_t flag = DiagVmonBegin(isOver);
75 const bool isOver =
true;
76 const bool isDone = IsDiagVmonDone(isOver);
82 const bool isOver =
true;
83 const errFlag_t flag = DiagVmonEnd(isOver);
89 const bool isOver =
false;
90 const errFlag_t flag = DiagVmonBegin(isOver);
96 const bool isOver =
false;
97 const bool isDone = IsDiagVmonDone(isOver);
103 const bool isOver =
false;
104 const errFlag_t flag = DiagVmonEnd(isOver);
108static errFlag_t DiagVmonBegin(
bool isOver)
110 const uint32_t errorChMask = vregwarnChMask | vregfailChMask;
112 if (isDiagOngoing || !isConfigurable)
122 BackupVregChConfigs();
123 DisableVregChannels();
125 uint8_t dmodeVal = (uint8_t)SLPCTRL_DMODE_UNDER_gc;
128 dmodeVal = (uint8_t)SLPCTRL_DMODE_OVER_gc;
132 const errFlag_t flag = VerifyDiagStartFlags();
134 isDiagOngoing =
true;
142static bool IsDiagVmonDone(
bool isOver)
144 bool isErrInjectionDone =
false;
149 const uint8_t vdexitFlagMask = (uint8_t)SLPCTRL_VDEXIT_bm;
151 uint8_t flagMask = (uint8_t)SLPCTRL_VUV_bm;
154 flagMask = (uint8_t)SLPCTRL_VOV_bm;
157 bool isFlagSet = (intFlagVal & flagMask) == flagMask;
158 bool isVdexitFlagSet = (intFlagVal & vdexitFlagMask) == vdexitFlagMask;
159 if (isFlagSet || isVdexitFlagSet)
161 isErrInjectionDone =
true;
165 return isErrInjectionDone;
170 if (isDiagOngoing ==
false)
182 const errFlag_t diagResult = VerifyDiagEndFlags(isOver);
184 RestoreVregChConfigs();
186 isDiagOngoing =
false;
195static errFlag_t VerifyDiagStartFlags(
void)
205 const uint8_t vdenterFlagMask = (uint8_t)SLPCTRL_VDENTER_bm;
206 bool isVdenterSet = (intFlagVal & vdenterFlagMask) == vdenterFlagMask;
218static errFlag_t VerifyDiagEndFlags(
bool isOver)
221 uint8_t flagMask = (uint8_t)SLPCTRL_VUV_bm;
224 flagMask = (uint8_t)SLPCTRL_VOV_bm;
228 const bool isFlagSet = (intFlagVal & flagMask) == flagMask;
231 const bool isVregwarnChSet = ((chStatus & vregwarnChMask) == vregwarnChMask);
232 const bool isVregfailChSet = ((chStatus & vregfailChMask) == vregfailChMask);
234 if ((isFlagSet && isVregfailChSet && isVregwarnChSet))
247 const uint8_t vdexitFlagMask = (uint8_t)SLPCTRL_VDEXIT_bm;
251 return diagResultFlag;
255static void BackupVregChConfigs(
void)
262static void DisableVregChannels(
void)
264 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
265 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
266 const uint8_t severityConfig = (uint8_t)(ERRCTRL_ERRLVL_NOTIFICATION_gc);
267 const uint8_t disabledChConfig = (floatConfig | severityConfig);
276static void RestoreVregChConfigs(
void)
278 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
errFlag_t
Defines the error flag used by Middleware services to indicate error detection.
uint8_t ERRCTRL_ReadConfigVregfail(void)
Reads the ESCVREGFAIL register value.
uint32_t ERRCTRL_ReadChannelStatus(void)
Reads the ESF register value.
void ERRCTRL_WriteConfigVregfail(uint8_t value)
Overwrites the ESCVREGFAIL register value.
void ERRCTRL_WriteConfigVregwarn(uint8_t value)
Overwrites the ESCVREGWARN 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.
uint8_t ERRCTRL_ReadConfigVregwarn(void)
Reads the ESCVREGWARN register value.
errFlag_t MW_DiagVmonUnderBegin(void)
Starts error injection diagnostic to detect faults in the VMON undervoltage detector.
errFlag_t MW_DiagVmonOverEnd(void)
Completes error injection diagnostic to detect faults in the VMON overvoltage detector.
errFlag_t MW_DiagVmonUnderEnd(void)
Completes error injection diagnostic to detect faults in the VMON undervoltage detector.
bool MW_IsDiagVmonOverDone(void)
Checks if the VMON overvoltage error injection has been completed.
errFlag_t MW_DiagVmonOverBegin(void)
Starts error injection diagnostic to detect faults in the VMON overvoltage detector.
bool MW_IsDiagVmonUnderDone(void)
Checks if the VMON undervoltage error injection has been completed.
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.
void SLPCTRL_WriteIntFlags(uint8_t value)
Overwrites the INTFLAGS register value.
void SLPCTRL_WriteControlB(uint8_t value)
Overwrites the CTRLB register value.
uint8_t SLPCTRL_ReadIntFlags(void)
Reads the INTFLAGS register value.
#define CRITICAL_CH_CONFIG
Default to maximum criticality and float I/O in case of erroneously restoring with default backup val...
Implements APIs for the Power Manager Diagnostics.