📄 monitor.c
字号:
// The file "winav.h" must be included in first line#include "winav.h"#include "ctkav.h"#include "utl.h"#include "hal.h"#include "SrcFilter.h"#include "input.h"#include "chips.h"#include "infofilter.h"#include "digest.h"#include "navigate.h"#include "cc.h"#include "monitor.h"#include "osd.h"#include "linear.h"#include "cell.h"#include "comutl.h" #include "vcd20.h"#include "thumb.h"#include "setup.h"#include "gdi.h"#include "panel.h"#include "Disp.h"#include "Comdec.h"#include "parser.h"#include "debug.h"// wyc1.11-909#include "Subpict.h"// wyc2.16-909S#include "initial.h"#include "debug.h"#include "dvdinfo.h"#ifdef SUPPORT_STB#include "media.h"#include "db_defs.h"extern EN_SERVICE_TYPE ap_ch_get_current_srv_type(void);void _MONITOR_DVBRecover(void);#endif#undef PRINTF#undef printf// Micky2.17c#define PRINTF(x, y...) DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR, x, ## y)#define printf(x, y...) DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_PRINTF, x, ## y)void PRINTF_MONITOR(char *fmt, ...);void printf_MONITOR(char *fmt, ...);//#define PRINTF PRINTF_MONITOR//#define printf printf_MONITOR/// ======================================================================// Define#define RECOVER_NORMAL 0#define RECOVER_ENTER_STOP 1#define RECOVER_GO_MENU_TITLE 2#define GO_LONGEST_TITLE 3#define GO_TT_CC_1_1 4#define ERROR_RECOVER_MODE GO_TT_CC_1_1// #define _DEBUG_INFO#define MONITOR_NEXT_TIMES 3#define MONITOR_FAIL_CHECT_TIMES 24#define MONITOR_DVB_FAIL_CHECT_TIMES 20#define MONITOR_OK_CHECT_TIMES 4#define MONITOR_RETRY_COUNT 3#define MONITOR_RESET_PROC2_CNT 5// elmer 2.32#ifdef SUPPORT_NO_AUDIO_IO_MUTE#define MUTE_THRESHOLD 10#ifndef ENABLE_READ_AUDIO_REM#define ENABLE_READ_AUDIO_REM#endif //#endif#ifdef STACK_OVERFLOW_DETECTION#define MONITOR_STACK_ERROR_NONE (0x0000)#define MONITOR_STACK_ERROR_CTKDVD (0x0001)#define MONITOR_STACK_ERROR_DECODER (0x0002)#define MONITOR_STACK_ERROR_PARSER (0x0004)#define MONITOR_STACK_ERROR_INFO (0x0008)#define MONITOR_STACK_ERROR_ATAPI (0x0010)#define MONITOR_STACK_ERROR_USBSRC (0x0020)#define MONITOR_STACK_ERROR_SERVO (0x0040)#define MONITOR_STACK_ERROR_SRV_BM (0x0080)#endif#ifdef ERROR_CONCEAL#ifndef ENABLE_READ_AUDIO_REM#define ENABLE_READ_AUDIO_REM#endif //#ifdef SUPPORT_WATCH_DOG#define WATCHDOG_TIME_TO_ENABLE (COUNT_5_SEC * 6)#define WATCHDOG_SINGAL_ENABLE (1L<<28) // REG_PLAT_SYSTEM_CONFIGURATION1 [28]#define WATCHDOG_DOWN_COUNT_VALUE 0xA00000#endif#endif // /// ======================================================================//#define ERROR_CONCEAL// Variables declareBYTE __bResetRecover=0;DWORD __dwMONRecoverStage;DWORD _dwMONTemp1,_dwMONTemp2;DWORD _dwMONTempRem,_dwMONTempRem1;DWORD _dwMONPreARemain;DWORD _dwMONPreAFrmCnt;DWORD _dwMONPreVRemain;// elmer2.36, CVD issuesDWORD _dwMONSPCounter;//DWORD _dwMONPreVFrmCnt;DWORD _dwMONParReadSec;DWORD _dwMONFailCounter, _dwMONFailCounter2;DWORD _dwMONOKCounter;DWORD _dwMONParPlayCnt;DWORD _dwMONParTotCnt;DWORD _dwMONMDecChkHang;DWORD _dwMONMDecHangCnt;// This variable only used in recover stage RECOVER_STAGE_CHECK, it is because all reset flow will go stage RECOVER_STAGE_CHECK to// check it. Then continue go next stage.DWORD _dwMONNextStage;DWORD _dwMONRecoverCnt;DWORD __dwMONJumpTime,__dwMONPreJumpTime;DWORD _dwMONGoNextStage;DWORD _dwMONJumpChkTime;BYTE _bMaxNextTimes;// elmer 2.32#ifdef SUPPORT_NO_AUDIO_IO_MUTEBYTE _bMuteCount=0;BYTE _bIOMuteMode=FALSE;DWORD _dwMONChkTime;#endif// Micky_PORTING_OSWRAP/*// wyc0.95, move these variables from debug to monitor.cyg_handle_t __AlarmHandle;cyg_alarm __AlarmObj;*/#ifdef SUPPORT_STB#define MAXHANGCNT 3BYTE __bTVHang;BYTE __bRadioHang;BYTE __bNoService;BYTE __bHangCnt = 0;DWORD _dwDVBMONChkTime;DWORD _dwInterFailCnt;extern BYTE b8InstantReplayStatus;#endif#ifdef SUPPORT_WATCH_DOGDWORD _dwWatchdogPrevCounter;DWORD _dwWatchdogFailCount = 0;#ifdef SUPPORT_WATCHDOG_BURNINDWORD __dwWatchdogTime;BYTE _bWatchdogData;#endif // SUPPORT_WATCHDOG_BURNIN#endif/// ======================================================================// Extern Variablesextern BYTE _bHALABuf2Def;/// ======================================================================// Function Prototypevoid _MONITOR_AudioRecover(void);void _MONITOR_ImageRecover(void);void _MONITOR_MotionRecover(void);void _MONITOR_ReadAudioRem(DWORD* pdata);WORD _MONITOR_StackStatus(VOID);void MONITOR_InitialValue(void);// elmer 2.32#ifdef SUPPORT_NO_AUDIO_IO_MUTEvoid MONITOR_CheckMute(void);BYTE _MONITOR_CheckMuteStatus(void);#endifvoid PRINTF_MONITOR(char *fmt, ...){ DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_MM_INFOFTR, fmt);}void printf_MONITOR(char *fmt, ...){ DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, fmt);}// *************************************************************************// Function : MONITOR_CheckHang// Description : This function will be executed every 100 ms by ARARM.// Purpose is to check the system state and trigger the // recover stage to recover system in MONITOR_RecoverSystem.// Arguments : None// Return : None// Side Effect :// *************************************************************************// Micky2.17c#ifdef ERROR_CONCEALvoid MONITOR_CheckHang(void){ if ((__btPlaying) && (__dwMONRecoverStage == RECOVER_STAGE_IDLE)) { if (__bModePlay == MODE_PLAYVIDEO) { } else { HAL_ReadInfo(HAL_INFO_HLI_STATUS,&_dwMONTempRem); // wyc1.11-909, don't call function HAL_ReadInfo because this function don't use mutex to lock it. _dwMONTempRem = __blHLI_Status;#ifndef NO_DISC_MODE //CoCo2.37p if ((__bModePlay == MODE_PLAYMOTION) && (((__wDiscType & BOOK_DVD) && (__bStillTime || __bVOBUStill || __bDomain == VMGM_DOM || __bDomain == VTSM_DOM || _dwMONTempRem == TRUE)) || __bModeCmd == KEY_SCF || __bModeCmd == KEY_SCB || __bModeCmd == KEY_SF || __bModeCmd==KEY_STEP || __bCellAction == VOBU_TIME))#else if ((__bModePlay == MODE_PLAYMOTION) && (__bModeCmd == KEY_SCF || __bModeCmd == KEY_SCB || __bModeCmd == KEY_SF || __bModeCmd==KEY_STEP))#endif //#ifndef NO_DVD //CoCo2.37p return; _MONITOR_ReadAudioRem(&_dwMONTempRem); if (_dwMONPreARemain == _dwMONTempRem) { _dwMONOKCounter = 0; if (__bModePlay == MODE_PLAYAUDIO) { _dwMONFailCounter+=2; // wyc1.07, don't show debug message to much. if ((_dwMONFailCounter % 10) == 2) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nR_S A_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } else { _dwMONFailCounter++; // elmer2.36, CVD issues _dwMONTempRem1 = MCU_SP1_BS_BUF_REMAINDER / 4; if (_dwMONTempRem1 >= 0x100) _dwMONSPCounter++; else _dwMONSPCounter = 0; if ((_dwMONFailCounter % 5) == 1) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nR_S A_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } } else { _dwMONOKCounter++; _dwMONFailCounter = 0; _dwMONPreARemain = _dwMONTempRem; // elmer2.36, CVD issues _dwMONSPCounter = 0; } // wyc0.95, temp disable it because need to add mutex protect in function HAL_ReadAM /*<<< HAL_ReadAM(HAL_AM_FRAME_SAMPLE_SEC_CNT, &_dwMONTempRem); if (_dwMONPreAFrmCnt == _dwMONTempRem) { _dwMONOKCounter = 0; _dwMONFailCounter++; PRINTF("\nR_S Frm Cnt Don't Update, Check Cnt: %lx!",_dwMONFailCounter); } else { _dwMONOKCounter++; _dwMONFailCounter = 0; _dwMONPreAFrmCnt = _dwMONTempRem; } >>>*/ if (__bModePlay != MODE_PLAYAUDIO) { _dwMONTempRem = REG_VLD_MBINT_CTL; if ((_dwMONMDecChkHang == _dwMONTempRem) && (((_dwMONTempRem & 0x00004000)==0x00004000) || ((_dwMONTempRem & 0x00001800)==0x00001800) || ((_dwMONTempRem & 0x00007800)==0x00007800) )) _dwMONMDecHangCnt++; else _dwMONMDecHangCnt=0; _dwMONMDecChkHang = REG_VLD_MBINT_CTL; // wyc2.03-909S // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2; _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4; if (_dwMONPreVRemain == _dwMONTempRem) { _dwMONOKCounter = 0; _dwMONFailCounter++; // elmer2.36, CVD issues _dwMONTempRem1 = MCU_SP1_BS_BUF_REMAINDER / 4; if (_dwMONTempRem1 >= 0x100) _dwMONSPCounter++; else _dwMONSPCounter = 0; if ((_dwMONFailCounter % 5) == 1) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nR_S V_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } else { _dwMONOKCounter++; _dwMONFailCounter = 0; _dwMONPreVRemain = _dwMONTempRem; // elmer2.36, CVD issues _dwMONSPCounter = 0; } _dwMONTempRem = __SF_SourceGBL[__dwSFStreamID].dwReadSector; if (_dwMONParReadSec == _dwMONTempRem) { _dwMONParPlayCnt = 0; } else { _dwMONParReadSec = _dwMONTempRem; _dwMONParPlayCnt++; _dwMONParTotCnt++; } } // wyc1.08, comment it because ALARM can't read proc2 PC, otherwise proc2 PC will wrong and can't decode. /*<<< _dwMONTemp2 = REG_PLAT_PROC2_PC; // wyc1.07, force enter recover stage 1 to H/W reset audio, because audio PC is out of valid range. if ((_dwMONTemp2 > FW_DRAM_END) || (_dwMONTemp2 < FW_DRAM_ST)) { printf("\nProc2 PC out of range, PC:%lx",_dwMONTemp2); _dwMONProc2PCWrongCnt++; // wyc1.08, because sometimes Proc2 PC will be wrong, so check 5 times to ensure Proc2 is really abnormal then reset it.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -