Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -ra303cd4258157a8fbcbd8af4dd2bbaadec1a736c -r0dec8744af40d0c87a6d7cd1923920c1c2bd1d2f --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision a303cd4258157a8fbcbd8af4dd2bbaadec1a736c) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 0dec8744af40d0c87a6d7cd1923920c1c2bd1d2f) @@ -1,20 +1,20 @@ -/************************************************************************** - * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. - * - * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN - * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. - * - * @file WatchdogMgmt.c - * - * @date 20-Sep-2019 - * @author S. Nash - * - * @brief Monitor for the off and stop buttons. - * - **************************************************************************/ +/************************************************************************** +* +* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file WatchdogMgmt.c +* +* @author (last) Quang Nguyen +* @date (last) 21-Jul-2020 +* +* @author (original) Dara Navaei +* @date (original) 05-Nov-2019 +* +***************************************************************************/ -#include "Common.h" #include "CPLD.h" #include "SystemCommMessages.h" #include "Timers.h" @@ -23,24 +23,26 @@ // ********** private definitions ********** #define MIN_WATCHDOG_PET_INTERVAL_MS 45 +#define WATCHDOG_POST_TIMEOUT_MS 100 +#define WATCHDOG_RECOVERY_TIME_MS 250 typedef enum Button_Self_Test_States { WATCHDOG_SELF_TEST_STATE_START = 0, WATCHDOG_SELF_TEST_STATE_IN_PROGRESS, + WATCHDOG_SELF_TEST_STATE_RECOVER, WATCHDOG_SELF_TEST_STATE_COMPLETE, NUM_OF_WATCHDOG_SELF_TEST_STATES } WATCHDOG_SELF_TEST_STATE_T; -#define WATCHDOG_POST_TIMEOUT_MS 100 // ms - // ********** private data ********** static U32 lastWatchdogPetTime = 0; DATA_ARRAY_DECL( BOOL, TaskCheckIns, NUM_OF_TASKS, watchdogTaskCheckedIn ); static WATCHDOG_SELF_TEST_STATE_T watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_START; +static SELF_TEST_STATUS_T watchdogSelfTestStatus; static U32 watchdogSelfTestTimerCount = 0; // ********** private function prototypes ********** @@ -65,14 +67,15 @@ lastWatchdogPetTime = 0; watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_START; + watchdogSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; watchdogSelfTestTimerCount = 0; // initialize task check-ins to false for ( i = 0; i < NUM_OF_TASKS; i++ ) { - watchdogTaskCheckedIn[i].data = FALSE; - watchdogTaskCheckedIn[i].ovData = FALSE; - watchdogTaskCheckedIn[i].ovInitData = FALSE; - watchdogTaskCheckedIn[i].override = OVERRIDE_RESET; + watchdogTaskCheckedIn[ i ].data = FALSE; + watchdogTaskCheckedIn[ i ].ovData = FALSE; + watchdogTaskCheckedIn[ i ].ovInitData = FALSE; + watchdogTaskCheckedIn[ i ].override = OVERRIDE_RESET; } } @@ -105,7 +108,13 @@ // check to see if watchdog has expired if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) { - // TODO - watchdog expired fault + // ignore expired watchdog until after watchdog POST + if ( WATCHDOG_SELF_TEST_STATE_COMPLETE == watchdogSelfTestState ) + { +#ifndef DEBUG_ENABLED + activateAlarmNoData( ALARM_ID_WATCHDOG_EXPIRED ); +#endif + } } } @@ -123,7 +132,7 @@ { if ( task < NUM_OF_TASKS ) { - watchdogTaskCheckedIn[task].data = TRUE; + watchdogTaskCheckedIn[ task ].data = TRUE; } } @@ -156,24 +165,34 @@ } if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) { - result = SELF_TEST_STATUS_PASSED; + watchdogSelfTestStatus = SELF_TEST_STATUS_PASSED; } else { - result = SELF_TEST_STATUS_FAILED; - // TODO - trigger watchdog POST failure + activateAlarmNoData( ALARM_ID_WATCHDOG_POST_TEST_FAILED ); + watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; } - watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; + watchdogSelfTestTimerCount = getMSTimerCount(); + watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_RECOVER; break; + case WATCHDOG_SELF_TEST_STATE_RECOVER: + if ( TRUE == didTimeout( watchdogSelfTestTimerCount, WATCHDOG_RECOVERY_TIME_MS ) ) + { + result = watchdogSelfTestStatus; + watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; + } + break; + case WATCHDOG_SELF_TEST_STATE_COMPLETE: // if we get called in this state, assume we're doing self test again + watchdogSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_START; break; default: result = SELF_TEST_STATUS_FAILED; - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, watchdogSelfTestState ) break; } @@ -196,7 +215,7 @@ // initialize task check-ins to false for ( i = 0; i < NUM_OF_TASKS; i++ ) { - watchdogTaskCheckedIn[i].data = FALSE; + watchdogTaskCheckedIn[ i ].data = FALSE; } } @@ -252,10 +271,8 @@ *************************************************************************/ static void petWatchdog( void ) { -#ifndef RM46_EVAL_BOARD_TARGET // pulse the watchdog signal toggleCPLDWatchdog(); -#endif // remember when we last pet the watchdog lastWatchdogPetTime = getMSTimerCount(); @@ -281,25 +298,3 @@ * @return TRUE if override successful, FALSE if not *************************************************************************/ DATA_ARRAY_OVERRIDE_FUNC( BOOL, testSetWatchdogTaskCheckInOverride, testResetWatchdogTaskCheckInOverride, watchdogTaskCheckedIn, task, NUM_OF_TASKS-1 ) - - - - - - - - - - - - - - - - - - - - - -