Index: RTC.c =================================================================== diff -u -r3ef35af7d1ce059845d1dc682638dec735eea831 -r6b11ea4a37a54cd47af543900dfa68dac27c8c7e --- RTC.c (.../RTC.c) (revision 3ef35af7d1ce059845d1dc682638dec735eea831) +++ RTC.c (.../RTC.c) (revision 6b11ea4a37a54cd47af543900dfa68dac27c8c7e) @@ -7,8 +7,8 @@ * * @file RTC.c * -* @author (last) Sean Nash -* @date (last) 12-Nov-2021 +* @author (last) Dara Navaei +* @date (last) 13-Jul-2022 * * @author (original) Dara Navaei * @date (original) 11-Jan-2020 @@ -711,8 +711,16 @@ *************************************************************************/ static BOOL isRTCFunctional( void ) { + ALARM_ID_T alarm; BOOL hasTestPassed = TRUE; -#ifndef DISABLE_RTC_CONFIG + +#ifdef _DG_ + alarm = ALARM_ID_DG_RTC_CONFIG_ERROR; +#endif +#ifdef _HD_ + alarm = ALARM_ID_HD_RTC_CONFIG_ERROR; +#endif + U16 controlReg1 = rxBuffer[ RTC_REG_1_INDEX ]; U16 controlReg2 = rxBuffer[ RTC_REG_2_INDEX ]; U16 controlReg3 = rxBuffer[ RTC_REG_3_INDEX ]; @@ -730,35 +738,40 @@ if ( controlReg1 & RTC_REG_1_12_HOUR_MODE_MASK ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_CONFIG_ERROR, controlReg1, RTC_REG_1_12_HOUR_MODE_MASK ); + SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_12_HOUR_MODE_MASK ); hasTestPassed = FALSE; } if ( controlReg1 & RTC_REG_1_PORO ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_CONFIG_ERROR, controlReg1, RTC_REG_1_PORO ); + SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_PORO ); hasTestPassed = FALSE; } if ( controlReg1 & RTC_REG_1_CLK_STOPPED_MASK ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_CONFIG_ERROR, controlReg1, RTC_REG_1_CLK_STOPPED_MASK ); + SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_CLK_STOPPED_MASK ); hasTestPassed = FALSE; } if ( controlReg1 & RTC_REG_1_UNUSED_MASK ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_CONFIG_ERROR, controlReg1, RTC_REG_1_UNUSED_MASK ); + SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_UNUSED_MASK ); hasTestPassed = FALSE; } if ( controlReg1 & RTC_REG_1_EXT_CLK_MODE_MASK ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_CONFIG_ERROR, controlReg1, RTC_REG_1_EXT_CLK_MODE_MASK ); + SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_EXT_CLK_MODE_MASK ); hasTestPassed = FALSE; } if ( controlReg3 & RTC_REG_3_BLF_MASK ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_BATTERY_LOW, controlReg3, RTC_REG_3_BLF_MASK ); +#ifdef _DG_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_RTC_BATTERY_LOW, controlReg3, RTC_REG_3_BLF_MASK ); +#endif +#ifdef _HD_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_RTC_BATTERY_LOW, controlReg3, RTC_REG_3_BLF_MASK ); +#endif hasTestPassed = FALSE; } -#endif + return hasTestPassed; } @@ -875,7 +888,9 @@ U32 twoYears = twoYrEpoch / SECONDS_IN_2_YEARS; U32 oneYrEpoch = twoYrEpoch - ( twoYears * SECONDS_IN_2_YEARS ); U32 oneYears = ( twoYears > 0 ? oneYrEpoch / SECONDS_IN_LEAP_YEAR : oneYrEpoch / SECONDS_IN_NORMAL_YEAR ); - U32 days = ( twoYears > 0 ? ( oneYrEpoch - SECONDS_IN_LEAP_YEAR ) / SECONDS_IN_A_DAY : ( oneYrEpoch - SECONDS_IN_NORMAL_YEAR ) / SECONDS_IN_A_DAY ); + U32 days34 = ( oneYears > 0 ? ( oneYrEpoch - SECONDS_IN_LEAP_YEAR ) / SECONDS_IN_A_DAY : oneYrEpoch / SECONDS_IN_A_DAY ); + U32 days12 = ( oneYears > 0 ? ( oneYrEpoch - SECONDS_IN_NORMAL_YEAR ) / SECONDS_IN_A_DAY : oneYrEpoch / SECONDS_IN_A_DAY ); + U32 days = ( twoYears > 0 ? days34 : days12 ); U32 wholeYears = ( fourYears * 4 ) + ( twoYears * 2 ) + oneYears; BOOL leapYear = ( twoYears > 0 && 0 == oneYears ? TRUE : FALSE ); U32 oneDayEpoch= oneYrEpoch % SECONDS_IN_A_DAY; @@ -1236,7 +1251,7 @@ if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { - if ( isRTCFunctional() ) + if ( TRUE == isRTCFunctional() ) { RTC_DATA_T data; @@ -1276,8 +1291,10 @@ static RTC_SELF_TEST_STATE_T handleSelfTestStart( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_START; - RTCSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + RTCSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); + result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; return result; @@ -1335,7 +1352,7 @@ static RTC_SELF_TEST_STATE_T handleSelfTestWaitForFirstSecond( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND; - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); if ( ( RTC_SERVICE_COMPLETE == RTCServiceState ) && ( TRUE == isStatusOk ) ) { @@ -1345,22 +1362,22 @@ if ( RTCCurrentSecond != RTCPreviousSecond ) { - RTCPreviousSecond = RTCCurrentSecond; + RTCPreviousSecond = RTCCurrentSecond; previousFPGATimerCount = getFPGATimerCount(); - RTCSelfTestTimer = getMSTimerCount(); - result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; + RTCSelfTestTimer = getMSTimerCount(); + result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; } } else { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - result = RTC_SELF_TEST_STATE_COMPLETE; + result = RTC_SELF_TEST_STATE_COMPLETE; } } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - result = RTC_SELF_TEST_STATE_COMPLETE; + result = RTC_SELF_TEST_STATE_COMPLETE; } return result; @@ -1380,33 +1397,59 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; + +#ifndef BOARD_WITH_NO_HARDWARE BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); if ( ( TRUE == isStatusOk ) && ( rxBuffer[ RTC_SECONDS_INDEX ] != RTCPreviousSecond ) ) { - S32 const elapsedTime = (S32)calcTimeSince( RTCSelfTestTimer ); - S32 const deltaTime = elapsedTime - (S32)MS_PER_SECOND; - S32 const elapsedFPGATime = (S32)u16DiffWithWrap( previousFPGATimerCount, getFPGATimerCount() ); - result = RTC_SELF_TEST_STATE_COMPLETE; - RTCSelfTestResult = SELF_TEST_STATUS_PASSED; + ALARM_ID_T alarm; + S32 elapsedTime = (S32)calcTimeSince( RTCSelfTestTimer ); + S32 deltaTime = elapsedTime - (S32)MS_PER_SECOND; + S32 elapsedFPGATime = (S32)u16DiffWithWrap( previousFPGATimerCount, getFPGATimerCount() ); + result = RTC_SELF_TEST_STATE_COMPLETE; + RTCSelfTestResult = SELF_TEST_STATUS_PASSED; +#ifdef _DG_ + alarm = ALARM_ID_DG_RTC_OR_TIMER_ACCURACY_FAILURE; +#endif +#ifdef _HD_ + alarm = ALARM_ID_HD_RTC_OR_TIMER_ACCURACY_FAILURE; +#endif + if ( abs( deltaTime ) > RTC_ACCURACY_TOLERANCE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE, (U32)deltaTime, RTC_ACCURACY_TOLERANCE ); + SET_ALARM_WITH_2_U32_DATA( alarm, (U32)deltaTime, RTC_ACCURACY_TOLERANCE ); } if ( abs( elapsedFPGATime - elapsedTime ) > FPGA_ACCURACY_TOLERANCE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE, (U32)elapsedFPGATime, (U32)elapsedTime ); + SET_ALARM_WITH_2_U32_DATA( alarm, (U32)elapsedFPGATime, (U32)elapsedTime ); } } +#else + result = RTC_SELF_TEST_STATE_COMPLETE; + RTCSelfTestResult = SELF_TEST_STATUS_PASSED; +#endif return result; } +/*********************************************************************//** + * @brief + * The resetRTCPostState function resets the RTC self test state + * @details Inputs: none + * @details Outputs : RTCSelfTestState + * @return none + *************************************************************************/ +void resetRTCPostState( void ) +{ + RTCSelfTestState = RTC_SELF_TEST_STATE_START; +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/