Index: RTC.c =================================================================== diff -u -refdbe5815e423124fdfa1a1efba8b61dacf170e8 -r72066d13a07268869cb030b11eccda77f5184f91 --- RTC.c (.../RTC.c) (revision efdbe5815e423124fdfa1a1efba8b61dacf170e8) +++ RTC.c (.../RTC.c) (revision 72066d13a07268869cb030b11eccda77f5184f91) @@ -118,6 +118,8 @@ #define TEN 10U ///< Ten #define YEAR_2000 2000U ///< Year 2000 #define EPOCH_BASE_YEAR 1970U ///< Reference year to calculate epoch (1970) +#define YEAR_2021 2021U ///< Year 2021 +#define RTC_CHECK_YEAR_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< RTC check year timeout in milliseconds. #define SECS_IN_HOUR 3600 ///< Number of seconds in an hour. #define MONTHS_IN_YEAR 12 ///< Number of months in a year. @@ -136,6 +138,7 @@ RTC_SELF_TEST_STATE_CHECK_CTRL_REGS, ///< Self test check control registers RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND, ///< Self test wait for first second RTC_SELF_TEST_STATE_CHECK_ACCURACY, ///< Self test check time accuracy (compare 1st to 2nd second vs. timer counter) + RTC_SELF_TEST_STATE_CHECK_RTC_YEAR, ///< Self test check RTC year RTC_SELF_TEST_STATE_COMPLETE, ///< Self test complete NUM_OF_RTC_SELF_TEST_STATES ///< Total number of self-test states } RTC_SELF_TEST_STATE_T; @@ -204,7 +207,7 @@ static U16 RAMBuffer[ MIBSPI_MAX_BUFFER_LENGTH ]; ///< Buffer to read RTC RAM data. static U16 previousFPGATimerCount; ///< Previous FPGA timer count; #ifdef _DG_ -static BOOL syncDG2HDDateTimeFlag = FALSE; ///< Flag indicating whether DG RTC should be sync'd to HD RTC. +static BOOL syncDG2HDDateTimeFlag; ///< Flag indicating whether DG RTC should be sync'd to HD RTC. #endif /// Array of days in each month. Assumes non-leap year. Must adjust days in February if leap year. @@ -226,6 +229,7 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs( void ); static RTC_SELF_TEST_STATE_T handleSelfTestWaitForFirstSecond( void ); static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy( void ); +static RTC_SELF_TEST_STATE_T handleSelfTestCheckRTCYear( void ); static RTC_EXEC_STATE_T handleExecIdleState( void ); static RTC_EXEC_STATE_T handleExecReadState( void ); @@ -262,6 +266,7 @@ isRTCServiceOnEntry = FALSE; isTimestampBufferReady = FALSE; previousFPGATimerCount = 0; + syncDG2HDDateTimeFlag = FALSE; } /*********************************************************************//** @@ -372,6 +377,10 @@ RTCSelfTestState = handleSelfTestCheckAccuracy(); break; + case RTC_SELF_TEST_STATE_CHECK_RTC_YEAR: + RTCSelfTestState = handleSelfTestCheckRTCYear(); + break; + case RTC_SELF_TEST_STATE_COMPLETE: // Done with POST regardless of the results break; @@ -671,7 +680,7 @@ *************************************************************************/ static BOOL serviceRTC( U16* bufferTransmit, U16* bufferReceive, U16 bufferLength ) { - BOOL result = FALSE; + BOOL result = FALSE; BOOL isBufferOk = FALSE; if ( isRTCServiceOnEntry ) @@ -832,7 +841,7 @@ bcdHigh = ( bcd & MASK_OFF_NIBBLE_LSB ) >> SHIFT_BITS_BY_4; bcdLow = ( bcd & MASK_OFF_NIBBLE_MSB ); - if ( bcdHigh > MAX_SINGLE_DIGIT_DECIMAL || bcdLow > MAX_SINGLE_DIGIT_DECIMAL ) + if ( ( bcdHigh > MAX_SINGLE_DIGIT_DECIMAL ) || ( bcdLow > MAX_SINGLE_DIGIT_DECIMAL ) ) { decimal = 0; } @@ -1097,7 +1106,7 @@ { result = RTC_EXEC_STATE_PREP_RAM; } - else if ( ( TIMER_COUNTER_TO_REQUEST_READ <= timeCounter ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) + else if ( TIMER_COUNTER_TO_REQUEST_READ <= timeCounter ) { if ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) { @@ -1282,13 +1291,13 @@ static RTC_EXEC_STATE_T handleExecReadState( void ) { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_READ; - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); - if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) + if ( ( RTC_SERVICE_COMPLETE == RTCServiceState ) && ( TRUE == isStatusOk ) ) { if ( TRUE == isRTCFunctional() ) { - RTC_DATA_T data; + RTC_DATA_T data; updateReadTimestampStruct(); lastEpochTime = convertDateTime2Epoch( RTCTimestampStruct ); @@ -1308,7 +1317,7 @@ result = RTC_EXEC_STATE_IDLE; } - else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + else if ( RTC_SERVICE_COMPLETE == RTCServiceState ) { releaseSemaphore( SEMAPHORE_RTC ); @@ -1447,18 +1456,16 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); -#ifndef BOARD_WITH_NO_HARDWARE - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); - if ( ( TRUE == isStatusOk ) && ( rxBuffer[ RTC_SECONDS_INDEX ] != RTCPreviousSecond ) ) { 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; + RTCSelfTestTimer = getMSTimerCount(); + result = RTC_SELF_TEST_STATE_CHECK_RTC_YEAR; #ifdef _DG_ alarm = ALARM_ID_DG_RTC_OR_TIMER_ACCURACY_FAILURE; @@ -1470,26 +1477,71 @@ if ( abs( deltaTime ) > RTC_ACCURACY_TOLERANCE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; SET_ALARM_WITH_2_U32_DATA( alarm, (U32)deltaTime, RTC_ACCURACY_TOLERANCE ); } if ( abs( elapsedFPGATime - elapsedTime ) > FPGA_ACCURACY_TOLERANCE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; SET_ALARM_WITH_2_U32_DATA( alarm, (U32)elapsedFPGATime, (U32)elapsedTime ); } releaseSemaphore( SEMAPHORE_RTC ); } -#else - result = RTC_SELF_TEST_STATE_COMPLETE; - RTCSelfTestResult = SELF_TEST_STATUS_PASSED; -#endif return result; } +/*********************************************************************//** + * @brief + * The handleSelfTestCheckRTCYear checks whether the year that has been set + * in RTC is greater than 2021 or not. + * @details Inputs: RTCSelfTestTimer + * Outputs : RTCSelfTestResult + * @return next state + *************************************************************************/ +static RTC_SELF_TEST_STATE_T handleSelfTestCheckRTCYear( void ) +{ + RTC_SELF_TEST_STATE_T state = RTC_SELF_TEST_STATE_CHECK_RTC_YEAR; + ALARM_ID_T alarm; +#ifdef _DG_ + alarm = ALARM_ID_DG_SET_RTC_YEAR_INVALID; +#endif +#ifdef _HD_ + alarm = ALARM_ID_HD_SET_RTC_YEAR_INVALID; +#endif + + if ( RTCTimestampStruct.years != 0 ) + { + // Check if the year is not 0, meaning that the year has been read + // If the year is greater than 2021, set as pass, otherwise fail POST + if ( RTCTimestampStruct.years > ( YEAR_2021 - YEAR_2000 ) ) + { + RTCSelfTestResult = SELF_TEST_STATUS_PASSED; + } + else + { + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_1_U32_DATA( alarm, (U16)RTCTimestampStruct.years ); + } + + state = RTC_SELF_TEST_STATE_COMPLETE; + } + else if ( TRUE == didTimeout( RTCSelfTestTimer, RTC_CHECK_YEAR_TIMEOUT_MS ) ) + { + // If the year is still 0 after a certain period of time, alarm + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + state = RTC_SELF_TEST_STATE_COMPLETE; + SET_ALARM_WITH_1_U32_DATA( alarm, (U16)RTCTimestampStruct.years ); + } + + return state; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/