41static volatile uint8_t tempDiagData = 0U;
44static const uint32_t buserrChMask = 1UL << ERRCTRL_ESF_1_bp;
45static const uint32_t ram2ChMask = 1UL << ERRCTRL_ESF_2_bp;
46static const uint32_t flash2ChMask = 1UL << ERRCTRL_ESF_3_bp;
47static const uint32_t opcChMask = 1UL << ERRCTRL_ESF_4_bp;
48static const uint32_t ram1ChMask = 1UL << ERRCTRL_ESF_6_bp;
49static const uint32_t flash1ChMask = 1UL << ERRCTRL_ESF_7_bp;
50static const uint32_t eepromChMask = 1UL << ERRCTRL_ESF_14_bp;
53static void DisableRamParityChannels(
void);
54static void RestoreRamParityChannels(uint8_t buserrCfg);
55static void DisableNvmParityChannels(
void);
56static void RestoreNvmParityChannels(uint8_t buserrCfg, uint8_t opcCfg);
58static bool InjectCpuDataParityErrorOnRam(
void);
59static bool InjectCpuAddressParityErrorOnRam(
void);
60static bool InjectCpuControlParityErrorOnRam(
void);
61static bool InjectNvmDataParityErrorOnCpu(
void);
62static bool InjectNvmInstrParityErrorOnCpu(
void);
63static bool InjectCpuDataParityErrorOnNvm(
void);
64static bool InjectCpuAddressParityErrorOnNvm(
void);
65static bool InjectCpuControlParityErrorOnNvm(
void);
67static void DisableRamEccChannels(
void);
68static void RestoreRamEccChannels(uint8_t buserrCfg, uint8_t ram1Cfg, uint8_t ram2Cfg);
69static void DisableFlashEccChannels(
void);
70static void RestoreFlashEccChannels(uint8_t buserrCfg, uint8_t flash1Cfg, uint8_t flash2Cfg);
71static void DisableEepromEccChannels(
void);
72static void RestoreEepromEccChannels(uint8_t buserrCfg, uint8_t eepromCfg);
74static bool InjectEccCompErrorOnRam(
void);
75static bool InjectEcc1ErrorOnRam(
void);
76static bool InjectEcc2ErrorOnRam(
void);
77static bool InjectEccCompErrorOnFlash(
void);
78static bool InjectEcc1ErrorOnFlash(
void);
79static bool InjectEcc2ErrorOnFlash(
void);
80static bool InjectEcc1ErrorOnEeprom(
void);
81static bool InjectEcc2ErrorOnEeprom(
void);
86 const uint32_t errorChMask = buserrChMask;
102 DisableRamParityChannels();
105 const bool isCpuDataDiagPassed = InjectCpuDataParityErrorOnRam();
106 const bool isCpuAddrDiagPassed = InjectCpuAddressParityErrorOnRam();
107 const bool isCpuCtrlDiagPassed = InjectCpuControlParityErrorOnRam();
108 const bool isDiagPassed = (isCpuDataDiagPassed && isCpuAddrDiagPassed && isCpuCtrlDiagPassed);
110 RestoreRamParityChannels(buserrChBackup);
129 const uint32_t errorChMask = buserrChMask | opcChMask;
146 DisableNvmParityChannels();
149 const bool isNvmDataDiagPassed = InjectNvmDataParityErrorOnCpu();
150 const bool isNvmInstrDiagPassed = InjectNvmInstrParityErrorOnCpu();
151 const bool isNvmDiagPassed = isNvmDataDiagPassed && isNvmInstrDiagPassed;
153 const bool isCpuDataDiagPassed = InjectCpuDataParityErrorOnNvm();
154 const bool isCpuAddrDiagPassed = InjectCpuAddressParityErrorOnNvm();
155 const bool isCpuCtrlDiagPassed = InjectCpuControlParityErrorOnNvm();
156 const bool isCpuDiagPassed
157 = (isCpuDataDiagPassed && isCpuAddrDiagPassed && isCpuCtrlDiagPassed);
159 const bool isDiagPassed = (isNvmDiagPassed && isCpuDiagPassed);
161 RestoreNvmParityChannels(buserrChBackup, opcChBackup);
180 const uint32_t errorChMask = buserrChMask | ram1ChMask | ram2ChMask;
198 DisableRamEccChannels();
201 const bool isCompDiagPassed = InjectEccCompErrorOnRam();
202 const bool isEcc1DiagPassed = InjectEcc1ErrorOnRam();
203 const bool isEcc2DiagPassed = InjectEcc2ErrorOnRam();
204 const bool isDiagPassed = (isCompDiagPassed && isEcc1DiagPassed && isEcc2DiagPassed);
206 RestoreRamEccChannels(buserrChBackup, ram1ChBackup, ram2ChBackup);
225 const uint32_t errorChMask = buserrChMask | flash1ChMask | flash2ChMask;
243 DisableFlashEccChannels();
246 const bool isCompDiagPassed = InjectEccCompErrorOnFlash();
247 const bool isEcc1DiagPassed = InjectEcc1ErrorOnFlash();
248 const bool isEcc2DiagPassed = InjectEcc2ErrorOnFlash();
249 const bool isDiagPassed = (isCompDiagPassed && isEcc1DiagPassed && isEcc2DiagPassed);
251 RestoreFlashEccChannels(buserrChBackup, flash1ChBackup, flash2ChBackup);
270 const uint32_t errorChMask = buserrChMask | eepromChMask;
287 DisableEepromEccChannels();
290 const bool isEcc1DiagPassed = InjectEcc1ErrorOnEeprom();
291 const bool isEcc2DiagPassed = InjectEcc2ErrorOnEeprom();
292 const bool isDiagPassed = (isEcc1DiagPassed && isEcc2DiagPassed);
294 RestoreEepromEccChannels(buserrChBackup, eepromChBackup);
311static void DisableRamParityChannels(
void)
313 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
314 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
315 const uint8_t severityConfig = (uint8_t)ERRCTRL_ERRLVL_NOTIFICATION_gc;
316 const uint8_t disableChConfig = (floatConfig | severityConfig);
324static void RestoreRamParityChannels(uint8_t buserrCfg)
326 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
333static void DisableNvmParityChannels(
void)
335 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
336 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
337 const uint8_t severityConfig = (uint8_t)ERRCTRL_ERRLVL_NOTIFICATION_gc;
338 const uint8_t disableChConfig = (floatConfig | severityConfig);
347static void RestoreNvmParityChannels(uint8_t buserrCfg, uint8_t opcCfg)
349 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
357static void DisableRamEccChannels(
void)
359 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
360 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
361 const uint8_t severityConfig = (uint8_t)ERRCTRL_ERRLVL_NOTIFICATION_gc;
362 const uint8_t disableChConfig = (floatConfig | severityConfig);
372static void RestoreRamEccChannels(uint8_t buserrCfg, uint8_t ram1Cfg, uint8_t ram2Cfg)
374 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
383static void DisableFlashEccChannels(
void)
385 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
386 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
387 const uint8_t severityConfig = (uint8_t)ERRCTRL_ERRLVL_NOTIFICATION_gc;
388 const uint8_t disableChConfig = (floatConfig | severityConfig);
398static void RestoreFlashEccChannels(uint8_t buserrCfg, uint8_t flash1Cfg, uint8_t flash2Cfg)
400 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
409static void DisableEepromEccChannels(
void)
411 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
412 const uint8_t floatConfig = 0U << ERRCTRL_FLOAT_bp;
413 const uint8_t severityConfig = (uint8_t)ERRCTRL_ERRLVL_NOTIFICATION_gc;
414 const uint8_t disableChConfig = (floatConfig | severityConfig);
423static void RestoreEepromEccChannels(uint8_t buserrCfg, uint8_t eepromCfg)
425 const uint8_t stateMask = (uint8_t)ERRCTRL_STATE_gm;
432static bool InjectCpuDataParityErrorOnRam(
void)
439 const uint8_t ramParityMask = (uint8_t)RAMCTRL_PARITYD_bm;
440 const bool isRamFlagSet = ((ramIntFlags & ramParityMask) == ramParityMask);
443 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
444 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
447 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
449 const bool isDiagPassed = (isRamFlagSet && isCpuFlagSet && isErrorChSet);
459static bool InjectCpuAddressParityErrorOnRam(
void)
466 const uint8_t ramParityMask = (uint8_t)RAMCTRL_PARITYA_bm;
467 const bool isRamFlagSet = ((ramIntFlags & ramParityMask) == ramParityMask);
470 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
471 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
474 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
476 const bool isDiagPassed = (isRamFlagSet && isCpuFlagSet && isErrorChSet);
486static bool InjectCpuControlParityErrorOnRam(
void)
493 const uint8_t ramParityMask = (uint8_t)RAMCTRL_PARITYC_bm;
494 const bool isRamFlagSet = ((ramIntFlags & ramParityMask) == ramParityMask);
497 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
498 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
501 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
503 const bool isDiagPassed = (isRamFlagSet && isCpuFlagSet && isErrorChSet);
513static bool InjectNvmDataParityErrorOnCpu(
void)
521 const uint8_t cpuParityMask = (uint8_t)CPU_PARITYD_bm;
522 const bool isCpuDataParitySet = ((cpuIntFlags & cpuParityMask) == cpuParityMask);
525 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
527 const bool isDiagPassed = (isCpuDataParitySet && isErrorChSet);
536static bool InjectNvmInstrParityErrorOnCpu(
void)
543 const uint8_t cpuParityMask = (uint8_t)CPU_PARITYI_bm;
544 const bool isCpuInstructionParitySet = ((cpuIntFlags & cpuParityMask) == cpuParityMask);
547 const bool isErrorChSet = ((chStatus & opcChMask) == opcChMask);
549 const bool isDiagPassed = (isCpuInstructionParitySet && isErrorChSet);
558static bool InjectCpuDataParityErrorOnNvm(
void)
566 const uint8_t nvmIntMask = (uint8_t)NVMCTRL_PARITYD_bm;
567 const bool isNvmFlagSet = ((nvmIntFlags & nvmIntMask) == nvmIntMask);
570 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
571 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
574 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
576 const bool isDiagPassed = (isNvmFlagSet && isCpuFlagSet && isErrorChSet);
586static bool InjectCpuAddressParityErrorOnNvm(
void)
594 const uint8_t nvmIntMask = (uint8_t)NVMCTRL_PARITYA_bm;
595 const bool isNvmFlagSet = ((nvmIntFlags & nvmIntMask) == nvmIntMask);
598 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
599 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
602 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
604 const bool isDiagPassed = (isNvmFlagSet && isCpuFlagSet && isErrorChSet);
614static bool InjectCpuControlParityErrorOnNvm(
void)
622 const uint8_t nvmIntMask = (uint8_t)NVMCTRL_PARITYC_bm;
623 const bool isNvmFlagSet = ((nvmIntFlags & nvmIntMask) == nvmIntMask);
626 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
627 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
630 const bool isErrorChSet = ((chStatus & buserrChMask) == buserrChMask);
632 const bool isDiagPassed = (isNvmFlagSet && isCpuFlagSet && isErrorChSet);
642static bool InjectEccCompErrorOnRam(
void)
649 const uint8_t ramParityMask = (uint8_t)RAMCTRL_COMP_bm;
650 const bool isRamFlagSet = ((ramIntFlags & ramParityMask) == ramParityMask);
653 const bool isErrorChSet = ((chStatus & ram2ChMask) == ram2ChMask);
655 const bool isDiagPassed = (isRamFlagSet && isErrorChSet);
664static bool InjectEcc1ErrorOnRam(
void)
667 tempDiagData = 0x55U;
672 const uint8_t ramParityMask = (uint8_t)RAMCTRL_ECC1_bm;
673 const bool isRamFlagSet = ((ramIntFlags & ramParityMask) == ramParityMask);
676 const bool isErrorChSet = ((chStatus & ram1ChMask) == ram1ChMask);
678 const bool isDiagPassed = (isRamFlagSet && isErrorChSet);
687static bool InjectEcc2ErrorOnRam(
void)
690 tempDiagData = 0x55U;
695 const uint8_t ramParityMask = (uint8_t)RAMCTRL_ECC2_bm;
696 const bool isRamFlagSet = ((ramIntFlags & ramParityMask) == ramParityMask);
699 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
700 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
703 const uint32_t errChMask = buserrChMask | ram2ChMask;
704 const bool isErrorChSet = ((chStatus & errChMask) == errChMask);
706 const bool isDiagPassed = (isRamFlagSet && isCpuFlagSet && isErrorChSet);
716static bool InjectEccCompErrorOnFlash(
void)
725 const uint8_t nvmCompMask = (uint8_t)NVMCTRL_COMP_bm;
726 const bool isRamFlagSet = ((nvmIntFlags & nvmCompMask) == nvmCompMask);
729 const bool isErrorChSet = ((chStatus & flash2ChMask) == flash2ChMask);
731 const bool isDiagPassed = (isRamFlagSet && isErrorChSet);
740static bool InjectEcc1ErrorOnFlash(
void)
749 const uint8_t nvmEccMask = (uint8_t)NVMCTRL_FECC1_bm;
750 const bool isNvmFlagSet = ((nvmIntFlags & nvmEccMask) == nvmEccMask);
753 const bool isErrorChSet = ((chStatus & flash1ChMask) == flash1ChMask);
755 const bool isDiagPassed = (isNvmFlagSet && isErrorChSet);
764static bool InjectEcc2ErrorOnFlash(
void)
773 const uint8_t nvmEccMask = (uint8_t)NVMCTRL_FECC2_bm;
774 const bool isNvmFlagSet = ((nvmIntFlags & nvmEccMask) == nvmEccMask);
777 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
778 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
781 const uint32_t errChMask = buserrChMask | flash2ChMask;
782 const bool isErrorChSet = ((chStatus & errChMask) == errChMask);
784 const bool isDiagPassed = (isNvmFlagSet && isCpuFlagSet && isErrorChSet);
794static bool InjectEcc1ErrorOnEeprom(
void)
803 const uint8_t nvmEccMask = (uint8_t)NVMCTRL_EECC1_bm;
804 const bool isNvmFlagSet = ((nvmIntFlags & nvmEccMask) == nvmEccMask);
807 const bool isErrorChSet = ((chStatus & eepromChMask) == eepromChMask);
809 const bool isDiagPassed = (isNvmFlagSet && isErrorChSet);
818static bool InjectEcc2ErrorOnEeprom(
void)
827 const uint8_t nvmIntMask = (uint8_t)NVMCTRL_EECC2_bm;
828 const bool isNvmFlagSet = ((nvmIntFlags & nvmIntMask) == nvmIntMask);
831 const uint8_t cpuBuserrMask = (uint8_t)CPU_BUSERR_bm;
832 const bool isCpuFlagSet = ((cpuIntFlags & cpuBuserrMask) == cpuBuserrMask);
835 const uint32_t errChMask = buserrChMask | eepromChMask;
836 const bool isErrorChSet = ((chStatus & errChMask) == errChMask);
838 const bool isDiagPassed = (isNvmFlagSet && isCpuFlagSet && isErrorChSet);
errFlag_t
Defines the error flag used by Middleware services to indicate error detection.
void CPUCTRL_ClearControlA(uint8_t bitmask)
Clears specific bits in the CTRLA register.
void CPUCTRL_SetControlA(uint8_t bitmask)
Sets specific bits in the CTRLA register.
uint8_t CPUCTRL_ReadIntFlags(void)
Reads the INTFLAGS register value.
void CPUCTRL_WriteIntFlags(uint8_t value)
Overwrites the INTFLAGS register value.
uint8_t ERRCTRL_ReadConfigFlash1(void)
Reads the ESCFLASH1 register value.
void ERRCTRL_WriteConfigRam1(uint8_t value)
Overwrites the ESCRAM1 register value.
void ERRCTRL_WriteConfigEeprom(uint8_t value)
Overwrites the ESCEEPROM register value.
uint8_t ERRCTRL_ReadConfigBuserr(void)
Reads the ESCBUSERR register value.
void ERRCTRL_WriteConfigBuserr(uint8_t value)
Overwrites the ESCBUSERR register value.
uint32_t ERRCTRL_ReadChannelStatus(void)
Reads the ESF register value.
uint8_t ERRCTRL_ReadConfigFlash2(void)
Reads the ESCFLASH2 register value.
void ERRCTRL_WriteConfigRam2(uint8_t value)
Overwrites the ESCRAM2 register value.
void ERRCTRL_WriteConfigFlash2(uint8_t value)
Overwrites the ESCFLASH2 register value.
uint8_t ERRCTRL_ReadConfigOpc(void)
Reads the ESCOPC register value.
void ERRCTRL_WriteConfigFlash1(uint8_t value)
Overwrites the ESCFLASH1 register value.
uint8_t ERRCTRL_ReadConfigRam1(void)
Reads the ESCRAM1 register value.
uint8_t ERRCTRL_ReadConfigEeprom(void)
Reads the ESCEEPROM register value.
uint8_t ERRCTRL_ReadConfigRam2(void)
Reads the ESCRAM2 register value.
void ERRCTRL_WriteConfigOpc(uint8_t value)
Overwrites the ESCOPC 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 ASM_InjectCpuAddressParityNvm(uint8_t *flashDiagAddr)
This function makes the CPU inject a parity error in the address of the following NVM (Flash) read,...
errFlag_t MW_DiagNvmEepromEcc(void)
This function performs error injection diagnostic to detect faults in the NVMCTRL ECC checkers with E...
#define DIAG_FLASH_ADDRESS
Defines an address in Flash used in diagnostics to trigger Flash read.
errFlag_t MW_DiagRamEcc(void)
This function performs error injection diagnostic to detect faults in the redundant RAMCTRL ECC check...
errFlag_t MW_DiagRamParity(void)
This function performs error injection diagnostic to detect faults in the RAM parity checker triggere...
void ASM_InjectNvmInstructionParity(void)
This function makes the NVMCTRL inject a parity error in the instruction of the following NVM fetch,...
void ASM_InjectRamEcc2(volatile uint8_t *ramDiagAddr)
This function makes the RAM controller inject a 2-bit ECC error in the following RAM read,...
void ASM_InjectRamEccComp(void)
This function makes the RAM controller inject a comparator error in the following RAM read,...
void ASM_InjectCpuAddressParityRam(void)
This function makes the CPU inject a parity error in the address of the following RAM read,...
void ASM_InjectRamEcc1(volatile uint8_t *ramDiagAddr)
This function makes the RAM controller inject a 1-bit ECC error in the following RAM read,...
void ASM_InjectCpuControlParityRam(void)
This function makes the CPU inject a parity error in the control of the following RAM read,...
errFlag_t MW_DiagNvmParity(void)
This function performs error injection diagnostic to detect faults in the CPU and NVM bus parity chec...
#define DIAG_EEPROM_ADDRESS
Reserves an address in EEPROM used in diagnostics to trigger EEPROM read and write.
void ASM_InjectCpuDataParityRam(void)
This function makes the CPU inject a parity error in the data of the following RAM write,...
void ASM_InjectNvmDataParity(uint8_t *flashDiagAddr)
This function makes the NVMCTRL inject a parity error in the data of the following NVM (Flash) read,...
void ASM_InjectCpuDataParityNvm(uint8_t *eepromDiagAddr)
This function makes the CPU inject a parity error in the data of the following NVM (EEPROM) write,...
void ASM_InjectCpuControlParityNvm(uint8_t *flashDiagAddr)
This function makes the CPU inject a parity error in the control of the following NVM (Flash) read,...
errFlag_t MW_DiagNvmFlashEcc(void)
This function performs error injection diagnostic to detect faults in the NVMCTRL ECC checkers with F...
void NVMCTRL_SetControlD(uint8_t bitmask)
Sets specific bits in the CTRLD register.
uint8_t NVMCTRL_ReadIntFlagsB(void)
Reads the INTFLAGSB register value.
void NVMCTRL_WriteIntFlagsB(uint8_t value)
Overwrites the INTFLAGSB register value.
uint8_t RAMCTRL_ReadIntFlags(void)
Reads the INTFLAGS register value.
void RAMCTRL_WriteIntFlags(uint8_t value)
Overwrites the INTFLAGS register value.
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.
Contains API prototypes for the Memory Manager Diagnostics.
Contains assembly APIs for the Memory Manager Diagnostics.