📄 intr.c
字号:
sysIntr= OALIntrTranslateIrq(IRQ_IIC);
RETAILMSG(DBG_ON, (TEXT("IntrHandler:IRQ_IIC\r\n")));
}
else if(IntPendVal == IRQ_CAMIF)
{
// Mask and clear interrupt
g_pIntrRegs->INTMSK |= (BIT_CAMIF);
g_pIntrRegs->SRCPND = (BIT_CAMIF);
if (g_pIntrRegs->INTPND & (BIT_CAMIF))
g_pIntrRegs->INTPND = (BIT_CAMIF);
sysIntr= OALIntrTranslateIrq(IRQ_CAMIF);
RETAILMSG(DBG_ON, (TEXT("IntrHandler:IRQ_CAMIF\r\n")));
}
else if(IntPendVal == IRQ_EINT0)
{
// Mask and clear interrupt
g_pIntrRegs->INTMSK |= (BIT_EINT0);
g_pPortRegs->EINTMASK |= (BIT_EINT0);
if(g_pPortRegs->EINTPEND & (BIT_EINT0))
g_pPortRegs->EINTPEND |= (BIT_EINT0);
if(g_pIntrRegs->SRCPND & (BIT_EINT0))
g_pIntrRegs->SRCPND |= (BIT_EINT0);
if (g_pIntrRegs->INTPND & (BIT_EINT0))
g_pIntrRegs->INTPND |= (BIT_EINT0);
sysIntr= OALIntrTranslateIrq(IRQ_EINT0);
RETAILMSG(1, (TEXT("IntrHandler:IRQ_EINT0\r\n")));
}
else if(IntPendVal == IRQ_TICK)
{
// Mask and clear interrupt
g_pIntrRegs->INTMSK |= (BIT_TICK);
if (g_pIntrRegs->SRCPND & (BIT_TICK))
g_pIntrRegs->SRCPND |= (BIT_TICK);
if (g_pIntrRegs->INTPND & (BIT_TICK))
g_pIntrRegs->INTPND |= (BIT_TICK);
sysIntr= OALIntrTranslateIrq(IRQ_TICK);
//RETAILMSG(1, (TEXT("IntrHandler:IRQ_TICK\r\n")));
}
else if(IntPendVal == IRQ_SPI1) // Keyboard interrupt.
{
// Mask and clear interrupt
g_pIntrRegs->INTMSK |= (BIT_SPI1);
g_pIntrRegs->SRCPND = (BIT_SPI1);
if (g_pIntrRegs->INTPND & (BIT_SPI1))
g_pIntrRegs->INTPND = (BIT_SPI1);
sysIntr= OALIntrTranslateIrq(IRQ_SPI1);
RETAILMSG(DBG_ON, (TEXT("IntrHandler:IRQ_SPI1\r\n")));
}
else if(IntPendVal == IRQ_EINT1) // Keyboard interrupt
{
g_pPortRegs->EINTMASK |= (BIT_EINT1);;
g_pPortRegs->EINTPEND |= (BIT_EINT1);
g_pIntrRegs->INTMSK |= (BIT_EINT1);
OUTREG32(&g_pIntrRegs->SRCPND, BIT_EINT1);
OUTREG32(&g_pIntrRegs->INTPND, BIT_EINT1);
sysIntr= OALIntrTranslateIrq(IRQ_EINT1);
RETAILMSG(0, (TEXT("EINT1>>> INTMSK : %x, INTPND : %x, INTOFFSET : %x, INTSRCPND : %x, EINTPND : %x, EINTMASK : %x, INTPENDVal : %d\n"),
g_pIntrRegs->INTMSK, g_pIntrRegs->INTPND, g_pIntrRegs->INTOFFSET, g_pIntrRegs->SRCPND, g_pPortRegs->EINTPEND, g_pPortRegs->EINTMASK, IntPendVal));
}
#ifdef DVS_EN
#if (DVS_METHOD == 1)
else if(IntPendVal == 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 OFF (4:4:4->1:2:4)
DVS_OFF();
g_oalIoCtlClockSpeed = S3C2413_FCLK;
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
}
clkval_calc = (WORD)((float)(S3C2413_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
// DVS ON (1:2:4 -> 4:4:4)
switch ( HCLKDIV )
{
case 2:
CLKDIV144();
break;
}
DVS_ON();
g_oalIoCtlClockSpeed = S3C2413_PCLK;
// 2.4 Drop Voltage
ChangeVoltage(LOWVOLTAGE);
clkval_calc = (WORD)((float)(S3C2413_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( IntPendVal == 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();
g_oalIoCtlClockSpeed = S3C2413_FCLK;
// RETAILMSG(1,(TEXT("HCLKDIV P1:%xh\n"), HCLKDIV));
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
}
clkval_calc = (WORD)((float)(S3C2413_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();
g_oalIoCtlClockSpeed = S3C2413_FCLK;
// RETAILMSG(1,(TEXT("HCLKDIV P2:%xh\n"), HCLKDIV));
switch ( HCLKDIV )
{
case 4:
CLKDIV124();
break;
}
clkval_calc = (WORD)((float)(S3C2413_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
// RETAILMSG(1,(TEXT("HCLKDIV P3:%xh\n"), HCLKDIV));
switch ( HCLKDIV )
{
case 2:
CLKDIV144();
break;
}
DVS_ON();
g_oalIoCtlClockSpeed = S3C2413_PCLK;
ChangeVoltage(LOWVOLTAGE);
clkval_calc = (WORD)((float)(S3C2413_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 (IntPendVal == IRQ_EINT4_7 || IntPendVal == 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;
IntPendVal2 = IRQ_EINT4;
while (mask != 0) {
mask >>= 1;
IntPendVal2++;
}
// Mask and clear interrupt
mask = 1<<(IntPendVal2 - IRQ_EINT4 + 4);
SETREG32(&g_pPortRegs->EINTMASK, mask);
OUTREG32(&g_pPortRegs->EINTPEND, mask);
// Clear primary interrupt
mask = 1<<IntPendVal;
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
// From now we care about this irq
IntPendVal = IntPendVal2;
}
else
{
// Mask and clear interrupt
mask = 1<<IntPendVal;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
//RETAILMSG(1, (TEXT("Undefined Interrupt occurred [Int#:%d, sysIntr:%xh]\r\n"), IntPendVal, OALIntrTranslateIrq(IntPendVal)));
}
// First find if IRQ is claimed by chain
sysIntr = NKCallIntChain((UCHAR)IntPendVal);
if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
// IRQ wasn't claimed, use static mapping
sysIntr = OALIntrTranslateIrq(IntPendVal);
RETAILMSG(DBG_ON, (TEXT("IntrHandler:EITNR:Intpendval:%d->sysintr:%xh.\r\n"), IntPendVal, sysIntr));
}
}
// For test...SJLEE
/*
if (IntPendVal!=IRQ_TIMER4 && IntPendVal!=IRQ_ADC && IntPendVal!=IRQ_TIMER1 && IntPendVal!=IRQ_USBH) {
//RETAILMSG(DBG_ON, (TEXT("return [Int#:%d, sysIntr:%xh]\r\n"), IntPendVal, sysIntr));
RETAILMSG(1, (TEXT("return [Int#:%d, sysIntr:%xh]\r\n"), IntPendVal, sysIntr));
}*/
//g_oalLastSysIntr = sysIntr;
return sysIntr;
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -