📄 intr.c
字号:
else
g_pPortRegs->GPFDAT |= (1 << 4); // LED 4 Off
}
// Clear the interrupt
OUTREG32(&g_pIntrRegs->SRCPND, 1 << IRQ_TIMER4);
OUTREG32(&g_pIntrRegs->INTPND, 1 << IRQ_TIMER4);
// Rest is on timer interrupt handler
sysIntr = OALTimerIntrHandler();
}
// Profiling timer interrupt?
else if (irq == IRQ_TIMER2)
{
// Mask and Clear the interrupt.
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
// The rest is up to the profiling interrupt handler (if profiling
// is enabled).
//
if (g_pProfilerISR)
{
sysIntr = g_pProfilerISR(ra);
}
}
else if ( irq == IRQ_EINT2 )
{
OUTREG32(&g_pIntrRegs->SRCPND, 1 << IRQ_EINT2);
OUTREG32(&g_pIntrRegs->INTPND, 1 << IRQ_EINT2);
#ifdef DVS_EN
#if (DVS_METHOD == 1 || DVS_METHOD == 3)
ChangeVoltage(HIGHVOLTAGE);
for(i=0;i<VOLTAGEDELAY;i++)
{
INREG32(&g_pPortRegs->GPFDAT); // for loop operation, just read.
}
DVS_OFF();
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
case 6:
CLKDIV136();
break;
case 8:
CLKDIV148();
break;
}
#endif //(DVS_METHOD == 1 || DVS_METHOD == 3)
#endif //DVS_EN
OALIoCtlHalReboot(0, NULL, 0, NULL, 0, NULL);
sysIntr = SYSINTR_NOP;
}
#ifdef DVS_EN
#if (DVS_METHOD == 1)
else if(irq == IRQ_LCD)
{
VSYNCINTR = TRUE;
if ( IDLEflag == FALSE )
{
// 4.1 Mask LCD VSYNC Interrupt
OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK ) | (1 << IRQ_LCD ));
if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);
if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);
if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) ) // Check VSync Area.
{
//RETAILMSG(1,(TEXT("-")));
}
else
{
CurrStateIdle = FALSE;
OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
// 4.2 Return Voltage
ChangeVoltage(HIGHVOLTAGE);
// 4.3 Delay
for(i=0;i<VOLTAGEDELAY;i++)
{
INREG32(&g_pPortRegs->GPFDAT); // for loop operation, just read.
}
// 4.4 DVS_ON = 0 (6:6:6->1:6:6)
DVS_OFF();
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
case 6:
CLKDIV136();
break;
case 8:
CLKDIV148();
break;
}
clkval_calc = (WORD)((float)(S3C2440X_HCLK)/(2.0*5000000)+0.5)-1;
OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
}
//RETAILMSG(1,(TEXT("N")));
}
else
{
// 2.1 Mask LCD VSYNC Interrupt
OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // disable LCD interrupt
if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);
if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);
if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) ) // Check VSync Area.
{
//RETAILMSG(1,(TEXT("|")));
}
else
{
CurrStateIdle = TRUE;
OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
switch ( HCLKDIV )
{
case 2:
CLKDIV144();
break;
case 3:
CLKDIV166();
break;
case 4:
CLKDIV188();
break;
}
DVS_ON();
// 2.4 Drop Voltage
ChangeVoltage(LOWVOLTAGE);
clkval_calc = (WORD)((float)(S3C2440X_HCLK)/(2.0*5000000)+0.5)-1;
OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
}
//RETAILMSG(1,(TEXT("I")));
}
sysIntr = SYSINTR_NOP;
}
#elif (DVS_METHOD == 3)
else if( irq == IRQ_LCD )
{
VSYNCINTR = TRUE;
if ( CurrentState == Active )
{
OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // Disable LCD interrupt
if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);
if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);
if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) ) // Check VSync Area.
{RETAILMSG(1,(TEXT("-BD-")));}
else
{
OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output...
ChangeVoltage(HIGHVOLTAGE);
for(i=0;i<VOLTAGEDELAY;i++) { INREG32(&g_pPortRegs->GPFDAT); } // for loop operation, just read.
DVS_OFF();
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
case 6:
CLKDIV136();
break;
case 8:
CLKDIV148();
break;
}
clkval_calc = (WORD)((float)(S3C2440X_HCLK)/(2.0*5000000)+0.5)-1;
OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0)); // Enable LCD Output...
// RETAILMSG(1,(TEXT("-a-")));
}
}
else if ( CurrentState == SlowActive )
{
VSYNCINTR = TRUE;
if ( IDLEflag == FALSE )
{
OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // disable LCD interrupt
if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);
if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);
if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) ) // Check VSync Area.
{RETAILMSG(1,(TEXT("-BD-")));}
else
{
CurrStateIdle = FALSE;
OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
ChangeVoltage(HIGHVOLTAGE);
for(i=0;i<VOLTAGEDELAY;i++) { INREG32(&g_pPortRegs->GPFDAT); } // for loop operation, just read.
DVS_OFF();
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
case 6:
CLKDIV136();
break;
case 8:
CLKDIV148();
break;
}
clkval_calc = (WORD)((float)(S3C2440X_HCLK)/(2.0*5000000)+0.5)-1;
OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
}
// RETAILMSG(1,(TEXT("-F-")));
}
else //if ( IDLEflag == TRUE )
{
OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // disable LCD interrupt
if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);
if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);
if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) ) // Check VSync Area.
{RETAILMSG(1,(TEXT("-BD-")));}
else
{
CurrStateIdle = TRUE;
OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
switch ( HCLKDIV )
{
case 2:
CLKDIV144();
break;
case 3:
CLKDIV166();
break;
case 4:
CLKDIV188();
break;
}
DVS_ON();
ChangeVoltage(LOWVOLTAGE);
clkval_calc = (WORD)((float)(S3C2440X_HCLK)/(2.0*5000000)+0.5)-1;
OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
}
// RETAILMSG(1,(TEXT("-T-")));
}
// RETAILMSG(1,(TEXT("-%d-"), clkval_calc));
}
sysIntr = SYSINTR_NOP;
}
#endif //(DVS_METHOD == 3)
#endif //DVS_EN
else
{
#ifdef OAL_ILTIMING
if (g_oalILT.active) {
g_oalILT.isrTime1 = OALTimerCountsSinceSysTick();
g_oalILT.savedPC = 0;
g_oalILT.interrupts++;
}
#endif
if (irq == IRQ_EINT4_7 || irq == IRQ_EINT8_23) { // 4 or 5
// Find external interrupt number
mask = INREG32(&g_pPortRegs->EINTPEND);
mask &= ~INREG32(&g_pPortRegs->EINTMASK);
mask = (mask ^ (mask - 1)) >> 5;
irq2 = IRQ_EINT4;
while (mask != 0) {
mask >>= 1;
irq2++;
}
// Mask and clear interrupt
mask = 1 << (irq2 - IRQ_EINT4 + 4);
SETREG32(&g_pPortRegs->EINTMASK, mask);
OUTREG32(&g_pPortRegs->EINTPEND, mask);
// Clear primary interrupt
mask = 1 << irq;
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
// From now we care about this irq
irq = irq2;
}
else if(irq == IRQ_CAM)
{
if(INREG32(&g_pIntrRegs->SUBSRCPND) & (1<<IRQ_SUB_CAM_C))
{
SETREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_CAM_C));
SETREG32(&g_pIntrRegs->INTMSK, (1<<IRQ_CAM));
OUTREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_CAM_C));
OUTREG32(&g_pIntrRegs->SRCPND, (1<<IRQ_CAM));
OUTREG32(&g_pIntrRegs->INTPND,(1<<IRQ_CAM));
//RETAILMSG(1,(TEXT("IRQ_CAM Codec\r\n")));
}
else if(INREG32(&g_pIntrRegs->SUBSRCPND) & (1<<IRQ_SUB_CAM_P))
{
SETREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_CAM_P));
SETREG32(&g_pIntrRegs->INTMSK, (1<<IRQ_CAM));
OUTREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_CAM_P));
OUTREG32(&g_pIntrRegs->SRCPND, (1<<IRQ_CAM));
OUTREG32(&g_pIntrRegs->INTPND,(1<<IRQ_CAM));
//RETAILMSG(1,(TEXT("PreViw\r\n")));
}
else
{
SETREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_CAM_C)|(1<<IRQ_SUB_CAM_P));
SETREG32(&g_pIntrRegs->INTMSK, (1<<IRQ_CAM));
SETREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_CAM_C)|(1<<IRQ_SUB_CAM_P));
OUTREG32(&g_pIntrRegs->SRCPND, (1<<IRQ_CAM));
OUTREG32(&g_pIntrRegs->INTPND,(1<<IRQ_CAM));
return SYSINTR_NOP;
}
}
else {
// Mask and clear interrupt
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
}
// First find if IRQ is claimed by chain
sysIntr = NKCallIntChain((UCHAR)irq);
if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
// IRQ wasn't claimed, use static mapping
sysIntr = OALIntrTranslateIrq(irq);
}
}
#if 0
if(irq == IRQ_EINT1)
RETAILMSG(1,(TEXT("EINT1 interrupt is occured!!\r\n")));
if(irq == IRQ_EINT0)
RETAILMSG(1,(TEXT("EINT0 interrupt is occured!!\r\n")));
if(irq == IRQ_EINT2)
RETAILMSG(1,(TEXT("EINT2 interrupt is occured!!\r\n")));
#endif
return sysIntr;
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -