Index: RTC.c =================================================================== diff -u -r140f13d518b2afef3a9b03a740282570132edf10 -rf28d9c0c407e6c3ab678c1d17a41bb132cf02887 --- RTC.c (.../RTC.c) (revision 140f13d518b2afef3a9b03a740282570132edf10) +++ RTC.c (.../RTC.c) (revision f28d9c0c407e6c3ab678c1d17a41bb132cf02887) @@ -111,7 +111,7 @@ #define FPGA_ACCURACY_TOLERANCE 12U ///< FPGA accuracy tolerance in ms #define RTC_PUBLISH_INTERVAL 18U ///< RTC publish interval in counts (18) -#define TIMER_COUNTER_TO_REQUEST_READ 28U //18U // TODO changed for alarm 118 testing only ///< Timer counter for reading time from RTC (18) +#define TIMER_COUNTER_TO_REQUEST_READ 18U ///< Timer counter for reading time from RTC (18) #define MAX_ALLOWED_FAILED_RTC_TRANSFERS 3U ///< Max allowed failed RTC transfers (3) #define MAX_ALLOWED_RTC_RAM_BYTES 100U ///< Max allowed RTC RAM bytes to be accepted from a caller (100) #define MAX_ALLOWED_RTC_RAM_ADDRESS 512U ///< Max allowed RTC RAM legal address (512) @@ -181,13 +181,13 @@ // ********** private data ********** static RTC_SELF_TEST_STATE_T RTCSelfTestState; ///< Self test variable. -static RTC_GET_DATA_STATE_T RTCServiceState; ///< RTC get data variable. -static RTC_EXEC_STATE_T RTCExecState; ///< RTC exec state variable. -static SELF_TEST_STATUS_T RTCSelfTestResult; ///< RTC self-test status variable. -static RTC_RAM_STATUS_T RTCRAMStatus; ///< RTC RAM status variable. -static RTC_RAM_STATE_T RTCRAMState; ///< RTC RAM state. -static RTC_TIMESTAMP_T RTCTimestampStruct; ///< Timestamp record - last read from RTC. -static RTC_TIMESTAMP_T RTCNewTimestampStruct; ///< New timestamp record that will hold the new time to be written to RTC. +static RTC_GET_DATA_STATE_T RTCServiceState; ///< RTC get data variable. +static RTC_EXEC_STATE_T RTCExecState; ///< RTC exec state variable. +static SELF_TEST_STATUS_T RTCSelfTestResult; ///< RTC self-test status variable. +static RTC_RAM_STATUS_T RTCRAMStatus; ///< RTC RAM status variable. +static RTC_RAM_STATE_T RTCRAMState; ///< RTC RAM state. +static RTC_TIMESTAMP_T RTCTimestampStruct; ///< Timestamp record - last read from RTC. +static RTC_TIMESTAMP_T RTCNewTimestampStruct; ///< New timestamp record that will hold the new time to be written to RTC. static U32 RTCSelfTestTimer; ///< Self test timer. static U32 RTCPreviousSecond; ///< Previous second for self-test comparison. static U32 RAMBufferLength; ///< RAM buffer length for RAM operations. @@ -225,7 +225,6 @@ static RTC_SELF_TEST_STATE_T handleSelfTestWaitForFirstSecond( void ); static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy( void ); -static RTC_EXEC_STATE_T handleExecWaitForPostState( void ); static RTC_EXEC_STATE_T handleExecIdleState( void ); static RTC_EXEC_STATE_T handleExecReadState( void ); static RTC_EXEC_STATE_T handleExecPrepRAMState( void ); @@ -244,7 +243,7 @@ { RTCSelfTestState = RTC_SELF_TEST_STATE_START; RTCServiceState = RTC_SEND_COMMAND; - RTCExecState = RTC_EXEC_STATE_WAIT_FOR_POST; + RTCExecState = RTC_EXEC_STATE_IDLE; RTCSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; RTCRAMStatus = RTC_RAM_STATUS_IDLE; RTCRAMState = RTC_RAM_STATE_READY; @@ -396,10 +395,6 @@ { switch ( RTCExecState ) { - case RTC_EXEC_STATE_WAIT_FOR_POST: - RTCExecState = handleExecWaitForPostState(); - break; - case RTC_EXEC_STATE_IDLE: RTCExecState = handleExecIdleState(); break; @@ -1043,28 +1038,6 @@ /*********************************************************************//** * @brief - * The handleExecWaitForPostState checks whether POST has completed and what - * was the result of the POST test. It will either go to Idle of Fault. - * @details Inputs: RTCSelfTestState - * @details Outputs: none - * @return next state - *************************************************************************/ -static RTC_EXEC_STATE_T handleExecWaitForPostState( void ) -{ - RTC_EXEC_STATE_T result = RTC_EXEC_STATE_WAIT_FOR_POST; - - if ( RTCSelfTestState == RTC_SELF_TEST_STATE_COMPLETE ) - { - // After POST is finished, first read the current time so there is one time stamp - // available in the memory - result = RTC_EXEC_STATE_READ; - } - - return result; -} - -/*********************************************************************//** - * @brief * The handleExecIdleState checks whether read or write to RTC or RAM has * been requested. If none of them have been requested, it will increment the * timer. @@ -1089,10 +1062,13 @@ { result = RTC_EXEC_STATE_PREP_RAM; } - else if ( TIMER_COUNTER_TO_REQUEST_READ == timeCounter ) + else if ( ( TIMER_COUNTER_TO_REQUEST_READ <= timeCounter ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) { - prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); - result = RTC_EXEC_STATE_READ; + if ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) + { + prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); + result = RTC_EXEC_STATE_READ; + } } else { @@ -1130,17 +1106,21 @@ } RTC_EXEC_STATE_T result = RTC_EXEC_STATE_WRITE; - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { + releaseSemaphore( SEMAPHORE_RTC ); + // Reset the counter to start with the new read timeCounter = 1; hasWriteToRTCRequested = FALSE; result = RTC_EXEC_STATE_IDLE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result ); result = RTC_EXEC_STATE_IDLE; hasWriteToRTCRequested = FALSE; @@ -1160,7 +1140,7 @@ static RTC_EXEC_STATE_T handleExecPrepRAMState( void ) { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_PREP_RAM; - BOOL isStatusOk = serviceRTC( prepRAMBuffer, RAMBuffer, RTC_RAM_PREP_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( prepRAMBuffer, RAMBuffer, RTC_RAM_PREP_BUFFER_LENGTH ); if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { @@ -1175,6 +1155,8 @@ } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result ); result = RTC_EXEC_STATE_IDLE; } @@ -1198,12 +1180,16 @@ if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { + releaseSemaphore( SEMAPHORE_RTC ); + result = RTC_EXEC_STATE_IDLE; RTCRAMStatus = RTC_RAM_STATUS_COMPLETE; hasWriteToRAMRequested = FALSE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCRAMStatus = RTC_RAM_STATUS_FAILED; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result, RTCRAMStatus ); result = RTC_EXEC_STATE_IDLE; @@ -1225,16 +1211,20 @@ static RTC_EXEC_STATE_T handleExecReadFromRAMState( void ) { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_READ_FROM_RAM; - BOOL isStatusOk = serviceRTC( txBuffer, RAMBuffer, RAMBufferLength + 1 ); + BOOL isStatusOk = serviceRTC( txBuffer, RAMBuffer, RAMBufferLength + 1 ); if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { + releaseSemaphore( SEMAPHORE_RTC ); + result = RTC_EXEC_STATE_IDLE; RTCRAMStatus = RTC_RAM_STATUS_COMPLETE; hasReadFromRAMRequested = FALSE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCRAMStatus = RTC_RAM_STATUS_FAILED; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result, RTCRAMStatus ); result = RTC_EXEC_STATE_IDLE; @@ -1279,10 +1269,14 @@ #endif } + releaseSemaphore( SEMAPHORE_RTC ); + result = RTC_EXEC_STATE_IDLE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result ); result = RTC_EXEC_STATE_IDLE; } @@ -1303,9 +1297,12 @@ RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_START; RTCSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; - prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); + if ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) + { + prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); - result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + } return result; } @@ -1324,7 +1321,7 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; - 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 ) ) { @@ -1336,14 +1333,18 @@ } else { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - result = RTC_SELF_TEST_STATE_COMPLETE; + result = RTC_SELF_TEST_STATE_COMPLETE; } } - else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + else if ( RTC_SERVICE_COMPLETE == RTCServiceState ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - result = RTC_SELF_TEST_STATE_COMPLETE; + result = RTC_SELF_TEST_STATE_COMPLETE; } return result; @@ -1380,12 +1381,16 @@ } else { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; result = RTC_SELF_TEST_STATE_COMPLETE; } } - else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + else if ( RTC_SERVICE_COMPLETE == RTCServiceState ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; result = RTC_SELF_TEST_STATE_COMPLETE; } @@ -1438,6 +1443,8 @@ RTCSelfTestResult = SELF_TEST_STATUS_FAILED; SET_ALARM_WITH_2_U32_DATA( alarm, (U32)elapsedFPGATime, (U32)elapsedTime ); } + + releaseSemaphore( SEMAPHORE_RTC ); } #else result = RTC_SELF_TEST_STATE_COMPLETE; @@ -1447,19 +1454,7 @@ 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 *************************************************************************/