⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 ct952 source code use for Digital Frame Photo
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "winav.h"#include <cyg/hal/hal_intr.h>#include "ctkav.h"#include "int_gbl.h"#include "parser.h"#include "comdec.h"#include "subpict.h"#include "utl.h"#include "hal.h"// wyc2.71-portusb#if (USB_SYSTEM == USB2_0_JUNGO)#include "usbwrap.h"#endif //// #define MEASURE_INT_TIME#if 0    else if ( bKey == KEY_TEST1 )    {        DWORD dwSaveInt;        DWORD dwCnt, dwTotal1, dwTotal2;        extern DWORD   __dwINT_MaxTime_ISR[2];extern DWORD   __dwINT_MaxTime_DSR[2];extern DWORD   __dwINT_MaxTotalTime[2];extern DWORD   __dwINT_MaxTotalTime_PENDING[2];extern DWORD   __dwINT_MaxTime_PENDING[2];extern PWORD   __wINT_TotalTime1;extern DWORD   __dwTotalCnt[2];extern PWORD   __wINT_TotalTime2;        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "ISR)INT13:%lx(%lx) ; INT10:%lx(%lx)",             __dwINT_MaxTime_ISR[1], __dwINT_MaxTime_PENDING[1], __dwINT_MaxTime_ISR[0], __dwINT_MaxTime_PENDING[0]);        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "DSR)INT13:%lx ; INT10:%lx", __dwINT_MaxTime_DSR[1], __dwINT_MaxTime_DSR[0]);        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Total)INT13:%lx(%lx) ; INT10:%lx(%lx)",            __dwINT_MaxTotalTime[1], __dwINT_MaxTotalTime_PENDING[1], __dwINT_MaxTotalTime[0], __dwINT_MaxTotalTime_PENDING[0]);        HAL_DISABLE_INTERRUPTS( dwSaveInt );        dwTotal1 = 0;        for (dwCnt = 0; dwCnt < __dwTotalCnt[1]; dwCnt++)        {            dwTotal1 += __wINT_TotalTime1[dwCnt];        }        dwTotal1 = dwTotal1 / __dwTotalCnt[1];                dwTotal2 = 0;        for (dwCnt = 0; dwCnt < __dwTotalCnt[0]; dwCnt++)        {            dwTotal2 += __wINT_TotalTime2[dwCnt];        }        dwTotal2 = dwTotal2 / __dwTotalCnt[0];                DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "AVG)INT13:%lx(%lx) ; INT10:%lx(%lx)",             dwTotal1, __dwTotalCnt[1], dwTotal2, __dwTotalCnt[0]);            __dwINT_MaxTime_ISR[0] = 0;        __dwINT_MaxTime_ISR[1] = 0;        __dwINT_MaxTime_DSR[0] = 0;        __dwINT_MaxTime_DSR[1] = 0;        __dwINT_MaxTotalTime[0] = 0;        __dwINT_MaxTotalTime[1] = 0;        __dwINT_MaxTime_PENDING[0] = 0;        __dwINT_MaxTime_PENDING[1] = 0;        __dwINT_MaxTotalTime_PENDING[0] = 0;        __dwINT_MaxTotalTime_PENDING[1] = 0;        __dwTotalCnt[0] = 0;        __dwTotalCnt[1] = 0;        HAL_RESTORE_INTERRUPTS( dwSaveInt );        return KEY_NO_KEY;    }#endif// declare global variablesINT_PROC1_1ST_STATUS    __INTISRintProc11stStatus;INT_PROC1_2ND_STATUS    __INTISRintProc12ndStatus;INT_PROC1_SW_STATUS     __INTISRintProc1SWStatus;// counters for ISR and DSRDWORD   __dwINTISRCounter[MAX_INT_COUNT], __dwINTDSRCounter[MAX_INT_COUNT];// function pointer for DSR and ISRPISRDSR_ROUTINE     __pINTISRRoutine[MAX_INT_COUNT][MAX_2ND_INT_COUNT];PISRDSR_ROUTINE     __pINTDSRRoutine[MAX_INT_COUNT][MAX_2ND_INT_COUNT];// interrupt handle and interrupt object for INT10 & INT13cyg_interrupt   _INTPROC11st, _INTPROC1SW, _INTPROC12nd;HANDLE_T	_INTPROC11stHandle, _INTPROC1SWHandle, _INTPROC12ndHandle;#ifdef EMU_RTC//Aron2.77, added for DMP SW-RTCcyg_interrupt    __INTTIMER2;HANDLE_T	__INTTIMER2Handle;#endif// Chuan2.21, Calculate INTs// #define INT_STAT#ifdef INT_STATDWORD   __dwINT1_Stat[8];DWORD   __dwINT2_Stat[24];#endif#ifdef MEASURE_INT_TIMEDWORD   __dwINT_MaxTime_ISR[2] = { 0, 0 };DWORD   __dwINT_MaxTime_DSR[2] = { 0, 0 };DWORD   __dwINT_MaxTotalTime[2] = { 0, 0 };DWORD   __dwINT_MaxTotalTime_PENDING[2] = { 0, 0 };DWORD   __dwINT_MaxTime_PENDING[2] = { 0, 0 };DWORD   __dwINT_Time_ISR[2] = { 0, 0 };DWORD   __dwINT_PENDING[2] = { 0, 0 };PWORD    __wINT_TotalTime1 = (PWORD)0x40400000;DWORD   __dwTotalCnt[2] = { 0, 0 };PWORD    __wINT_TotalTime2 = (PWORD)0x40500000;#endif// wyc2.71-portusb#if (USB_SYSTEM == USB2_0_JUNGO)extern void ISR_USBSaveClearStatus(void);#endif ////// Interrupt service routine for interrupt 13.//cyg_uint32  INT_Proc1_1st_isr(        cyg_vector_t vector,        cyg_addrword_t data){    DWORD   dwLoop;#ifdef MEASURE_INT_TIME    DWORD   dwStartTime;    DWORD   dwEndTime;    dwStartTime = REG_PLAT_TIMER2_COUNTER;#endif    // clear ISR counter and DSR counter    __dwINTISRCounter[INT_NO13] = 0;    __dwINTDSRCounter[INT_NO13] = 0;    // save secondary level status and clear them for next interrupts    __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING =            (REG_PLAT_PROC1_1ST_INT_PENDING & REG_PLAT_PROC1_1ST_INT_MASK_ENABLE);    //===========================================    // save status & clear any pendding interrupt    //===========================================    // int_vsync (13:0)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_VSYNC )    {        ISR_DISPSaveClearStatus();    }    // int_nhsync (13:1) for 909S    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_HSYNC )    {    }    // int_screen_end (13:1) / (13:2)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_SCREEN_END )    {    }    // int_main_end (13:2) / (13:3)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_MAIN_END )    {    }    // int_osd_end (13:4)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_OSD_END )    {    }    // rldone2s (13:5)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_RL_DONE )    {    }    // mcdone (13:6)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_MC_DONE )    {    }    // int_16l (13:7)    if( __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & INT_PROC1_1ST_INT_16L )    {#ifndef NO_DECODER        ISR_16LSaveClearStatus();#endif  //#ifndef NO_DECODER            }    // clear secondary mask pendding interrupts    REG_PLAT_PROC1_1ST_INT_CLEAR = __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING;#ifdef INT_STAT    dwLoop = 0;    while (__INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING != 0)    {        __dwINT1_Stat[dwLoop] += __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING & 0x1;        dwLoop++;        __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING >>= 1;    }#endif    // clear fisrt mask pendding interrupt 13    REG_PLAT_INT_CLEAR = (1 << INT_NO_PROC1_1ST);    // Tell the processor that we have received    // the interrupt.    // cyg_interrupt_acknowledge( vector );    if( __dwINTISRCounter[INT_NO13] )    {        // process ISR routines one by one        for( dwLoop = 0; dwLoop < __dwINTISRCounter[INT_NO13]; dwLoop ++ )        {            (*(__pINTISRRoutine[INT_NO13][dwLoop]))( );        }    }#ifdef MEASURE_INT_TIME    dwEndTime = REG_PLAT_TIMER2_COUNTER;    __dwINT_Time_ISR[INT_NO13] = dwStartTime - dwEndTime;    __dwINT_PENDING[INT_NO13] = __INTISRintProc11stStatus.dwPLAT_PROC1_1ST_INT_PENDING;        if (dwEndTime > dwStartTime)    {        __dwINT_Time_ISR[INT_NO13] += 0xFFFFFF;    }    if (__dwINT_MaxTime_ISR[INT_NO13] < __dwINT_Time_ISR[INT_NO13])    {        __dwINT_MaxTime_ISR[INT_NO13] = __dwINT_Time_ISR[INT_NO13];        __dwINT_MaxTime_PENDING[INT_NO13] = __dwINT_PENDING[INT_NO13];    }#endif    // Tell the kernel that chained interrupt processing    // is done and the DSR needs to be executed next.    if( __dwINTDSRCounter[INT_NO13] )    {        // Block this interrupt from occurring until        // the DSR completes.        // Chuan2.17, Don't to mask 1st INT to avoid other DSR block 1st DSR        // cyg_interrupt_mask( vector );        return( CYG_ISR_HANDLED | CYG_ISR_CALL_DSR );    }    else    {        return( CYG_ISR_HANDLED );      // if no DSR needed to be executed    }}//// Deferred service routine for interrupt 13.//void    INT_Proc1_1st_dsr(        cyg_vector_t vector,        cyg_ucount32 count,        cyg_addrword_t data){    /*        DWORD   dwLoop;    // process DSR routines one by one    for( dwLoop = 0; dwLoop < __dwINTDSRCounter[INT_NO13]; dwLoop ++ )    {        (*(__pINTDSRRoutine[INT_NO13][dwLoop]))( );    }    */    DWORD   dwSaveInt;#ifdef MEASURE_INT_TIME    DWORD   dwStartTime;    DWORD   dwEndTime;    DWORD   dwTotalTime;#endif    HAL_DISABLE_INTERRUPTS( dwSaveInt );#ifdef MEASURE_INT_TIME    dwStartTime = REG_PLAT_TIMER2_COUNTER;#endif    (*(__pINTDSRRoutine[INT_NO13][0]))( );#ifdef MEASURE_INT_TIME    dwEndTime = REG_PLAT_TIMER2_COUNTER;    dwTotalTime = dwStartTime - dwEndTime;    if (dwEndTime > dwStartTime)    {        dwTotalTime += 0xFFFFFF;    }    if (__dwINT_MaxTime_DSR[INT_NO13] < dwTotalTime)    {        __dwINT_MaxTime_DSR[INT_NO13] = dwTotalTime;    }    if (__dwINT_MaxTotalTime[INT_NO13] < (dwTotalTime + __dwINT_Time_ISR[INT_NO13]))    {        __dwINT_MaxTotalTime[INT_NO13] = (dwTotalTime + __dwINT_Time_ISR[INT_NO13]);        __dwINT_MaxTotalTime_PENDING[INT_NO13] = __dwINT_PENDING[INT_NO13];    }        if (__dwTotalCnt[INT_NO13] < 10000)    {        __wINT_TotalTime1[__dwTotalCnt[INT_NO13]++] = (dwTotalTime + __dwINT_Time_ISR[INT_NO13]);    }#endif    HAL_RESTORE_INTERRUPTS( dwSaveInt );    // Allow this interrupt to occur again.    // cyg_interrupt_unmask( vector );}//// Interrupt service routine for interrupt 10.////#define DUMP_IN_FORCE_STOPcyg_uint32  INT_Proc1_2nd_isr(        cyg_vector_t vector,        cyg_addrword_t data){    DWORD   dwLoop;#ifdef DUMP_IN_FORCE_STOPextern DWORD dwReqDetPerBlock;extern void  ISR_SRVSaveClearStatus1( void );#endif#ifdef MEASURE_INT_TIME    DWORD   dwStartTime;    DWORD   dwEndTime;    dwStartTime = REG_PLAT_TIMER2_COUNTER;#endif    // clear ISR counter and DSR counter    __dwINTISRCounter[INT_NO10] = 0;    __dwINTDSRCounter[INT_NO10] = 0;    // save secondary level status and clear them for next interrupts    __INTISRintProc12ndStatus.dwPLAT_PROC1_2ND_INT_PENDING =            (REG_PLAT_PROC1_2ND_INT_PENDING & REG_PLAT_PROC1_2ND_INT_MASK_ENABLE);    //===========================================    // save status & clear any pendding interrupt    //===========================================    // ohci_irq_o_n (10:0) / stb_overflow (10:0)#if defined(CT909R_IC_SYSTEM) || defined(CT909P_IC_SYSTEM)    if( __INTISRintProc12ndStatus.dwPLAT_PROC1_2ND_INT_PENDING & INT_PROC1_2ND_USB_OHCI )    {// wyc2.71-portusb#if (USB_SYSTEM == USB2_0_JUNGO)        ISR_USBSaveClearStatus();#endif //    }#endif    // servo_int (10:1)    if( __INTISRintProc12ndStatus.dwPLAT_PROC1_2ND_INT_PENDING & INT_PROC1_2ND_SERVO )    {// Brian0.67#ifdef SUPPORT_SERVO_SOURCE#ifndef NO_SERVO        ISR_SRVSaveClearStatus();   // Andy: for servo#endif  //#ifndef NO_SERVO#endif    }#ifdef DUMP_IN_FORCE_STOP    else if(dwReqDetPerBlock)    {        ISR_SRVSaveClearStatus1();    }#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -