📄 oemintr.c
字号:
case SYSINTR_ETHER:
s2410INT->rINTMSK |= BIT_EINT8_23;
s2410IOP->rEINTMASK |= 0x200;
break;
case SYSINTR_USB:
s2410INT->rINTMSK |= BIT_USBH;
break;
case SYSINTR_USBD:
s2410INT->rINTMSK |= BIT_USBD;
//RETAILMSG(1,(TEXT("::: SYSINTR_USBD OEMInterruptDisable\r\n")));
break;
case SYSINTR_POWER:
s2410INT->rINTMSK |= BIT_EINT0;
s2410INT->rINTMSK |= BIT_EINT2;
break;
default:
break;
}
INTR_ON();
}
// ********************************************************************
//声明:void OEM_InterruptDone( DWORD idInt )
//参数:
// IN idInt-逻辑中断号
//返回值:无
//功能描述:当设备驱动程序做完中断处理后,用该函数去让设备继续工作
//引用: 当一个设备驱动程序调用INTR_Done时,由 INTR_Done 调用该函数
// ********************************************************************
void OEM_InterruptDone( DWORD idInt )
{
INTR_OFF();
switch (idInt)
{
case SYSINTR_DMA0:
s2410INT->rINTMSK &= ~BIT_DMA0; // SDIO DMA interrupt
//RETAILMSG(1,(TEXT("::: SYSINTR_DMA0 OEMInterruptDone\r\n")));
break;
case SYSINTR_SDMMC:
s2410INT->rINTMSK &= ~BIT_MMC;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC OEMInterruptDone\r\n")));
break;
case SYSINTR_SDMMC_SDIO_INTERRUPT:
s2410INT->rINTMSK &= ~BIT_MMC;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_SDIO_INTERRUPT OEMInterruptDone\r\n")));
break;
case SYSINTR_SDMMC_CARD_DETECT:
s2410IOP->rEINTMASK &= ~(1 << 18);
s2410INT->rINTMSK &= ~BIT_EINT8_23;
//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_CARD_DETECT OEMInterruptDone\r\n")));
break;
case SYSINTR_TOUCH:
/*
* Nothing has to be done here as interrupts are masked and unmasked by the touch
* handler in the HAL.
*/
s2410INT->rINTMSK &= ~BIT_TIMER1;
break;
case SYSINTR_TOUCH_CHANGED:
s2410INT->rINTMSK &= ~BIT_TIMER1;
/*
* Nothing has to be done here as interrupts are masked and unmasked by the touch
* handler in the HAL.
*/
// s2410INT->rINTMSK &= ~BIT_ADC;
// s2410INT->rINTSUBMSK &= ~INTSUB_TC;
//bTouchSample = TRUE;
RETAILMSG(1,(TEXT("OEMInterruptDone:TOUCH CHANGED\n\r\n")));
break;
case SYSINTR_KEYBOARD:
s2410INT->rINTMSK &= ~BIT_EINT1;
break;
/*
case SYSINTR_SERIAL:
s2410INT->rINTMSK &= ~BIT_UART0;
s2410INT->rINTSUBMSK &= ~INTSUB_RXD0;
break;
case SYSINTR_IR:
s2410INT->rINTMSK &= ~BIT_UART2;
s2410INT->rINTSUBMSK &= ~INTSUB_RXD2;
break;
*/
case SYSINTR_SERIAL:
s2410INT->rINTMSK &= ~BIT_UART0;
#ifdef xyg_ser_sub_mask
s2410INT->rINTSUBMSK &= ~INTSUB_RXD0;
#endif
//RETAILMSG(1,(TEXT(":::SYSINTR_SERIAL OEMInterruptDone\n\r\n")));
break;
case SYSINTR_IR:
s2410INT->rINTMSK &= ~BIT_UART1;
#ifdef xyg_ser_sub_mask
s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;
#endif
//RETAILMSG(1,(TEXT(":::SYSINTR_IR OEMInterruptDone\n\r\n")));
break;
case SYSINTR_AUDIO:
// DMA1 is for audio input.
// DMA2 is for audio output.
s2410INT->rSRCPND = (BIT_DMA1 | BIT_DMA2);
if (s2410INT->rINTPND & BIT_DMA1)
s2410INT->rINTPND = BIT_DMA1;
if (s2410INT->rINTPND & BIT_DMA2)
s2410INT->rINTPND = BIT_DMA2;
s2410INT->rINTMSK &= ~BIT_DMA1;
s2410INT->rINTMSK &= ~BIT_DMA2;
break;
case SYSINTR_ADC:
break;
case SYSINTR_PCMCIA_LEVEL:
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23)
s2410INT->rINTPND = BIT_EINT8_23;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
s2410IOP->rEINTMASK &= ~(1<<8);
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_LEVEL OEMInterruptDone\r\n")));
break;
case SYSINTR_PCMCIA_EDGE:
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_EDGE OEMInterruptDone\r\n")));
break;
case SYSINTR_PCMCIA_STATE:
s2410INT->rINTMSK &= ~BIT_EINT3;
//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_STATE OEMInterruptDone\r\n")));
break;
case SYSINTR_ETHER:
s2410INT->rINTMSK &= ~BIT_EINT8_23;
s2410IOP->rEINTMASK &= ~0x200;
break;
case SYSINTR_USB:
s2410INT->rINTMSK &= ~BIT_USBH;
break;
case SYSINTR_USBD:
s2410INT->rINTMSK &= ~BIT_USBD;
//RETAILMSG(1,(TEXT("::: SYSINTR_USBD OEMInterruptDone\r\n")));
break;
case SYSINTR_POWER:
s2410INT->rSRCPND = BIT_EINT0;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT0)
s2410INT->rINTPND = BIT_EINT0;
s2410INT->rINTMSK &= ~BIT_EINT0;
s2410INT->rSRCPND = BIT_EINT2;
// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
if (s2410INT->rINTPND & BIT_EINT2)
s2410INT->rINTPND = BIT_EINT2;
s2410INT->rINTMSK &= ~BIT_EINT2;
break;
}
INTR_ON();
}
// ********************************************************************
//声明:int OEM_InterruptHandler( unsigned int ra )
//参数:
// IN ra-保留
//返回值:中断 id
//功能描述:中断处理接口,当系统产生一个中断后,内核会调用该函数
// 去做最重要的处理(如关掉自己)。
//引用:
// ********************************************************************
static DWORD dwLoadPageEntryCount = 0;
LPDWORD lpdwLoadPageEntryCount = &dwLoadPageEntryCount;
int OEM_InterruptHandler(unsigned int ra)
{
unsigned int IntPendVal;
unsigned int SubIntPendVal; // for serial
DWORD submask;
volatile BYTE usbd_eir = 0, usbd_uir = 0;
static DWORD tickCount = 0;
static UINT intSave, nIntrCount=0;
static BOOL bPrint = FALSE;
// TOUCH_GLOBALS *odo_tsb; //Sample buffer stuff
// for this, You MUST modify bsp/inc/drv_glob.h.. check drv_glob.h_jylee
//odo_tsb = &((DRIVER_GLOBALS *)DRIVER_GLOBALS_PHYSICAL_MEMORY_START)->tch;
IntPendVal = s2410INT->rINTOFFSET; // Get pending IRQ mode interrupt in INTPND.
// Fake CPUEnterIdle needs to know about interrupt firing.
// fInterruptFlag = TRUE;
/*
if (fIntrTime) {
//
// We're doing interrupt timing. Get Time to ISR. We subtract TIMER_COUNTDOWN
// here because the compare register has not been updated.
//
dwIsrTime1 = PerfCountSinceTick() - dwReschedIncrement;
dwSPC = ra;
wNumInterrupts++;
}
*/
//
// Check the timer interrupt.
//
if (IntPendVal == INTSRC_TIMER4)
{
DWORD ttmp;
ulTickCount++;
// if( tickCount >= 2000 )
// {
// RETAILMSG(1, (TEXT("intr timer.\r\n") ));
// tickCount = 0;
//}
s2410PWM->rTCNTB4 = RESCHED_INCREMENT;//dwReschedIncrement;
ttmp = s2410PWM->rTCON & (~(0xf << 20));
// ???
s2410PWM->rTCON = ttmp | (2 << 20); /* update TCVNTB4, stop */
s2410PWM->rTCON = ttmp | (1 << 20); /* one-shot mode, start */
//
// Clear the interrupt
//
s2410INT->rSRCPND = BIT_TIMER4;
if (s2410INT->rINTPND & BIT_TIMER4)
s2410INT->rINTPND = BIT_TIMER4;
{
extern DWORD dwIdleTick;
extern int nCountRunning;
void WINAPI KL_ProfileKernel( UINT uiOption, VOID * lpv );
if( ulTickCount - dwIdleTick > 10000 )
{ //死锁
dwIdleTick = ulTickCount;
RETAILMSG(1, (TEXT("_dead,run=%d,ret pc=0x%x,intSave=%d,nIntrCount=%d,SubPend=0x%x,SubMask=0x%x.\r\n"),nCountRunning, ra, intSave, nIntrCount, s2410INT->rSUBSRCPND, s2410INT->rINTSUBMSK ));
KL_ProfileKernel( 1, NULL );
bPrint = TRUE;
}
}
return SYSINTR_RESCHED;
}
intSave = IntPendVal;
// RETAILMSG(1, (TEXT("intr no(%d).\r\n"),IntPendVal ));
if(IntPendVal == INTSRC_MMC) // SD, MMC
{
s2410INT->rINTMSK |= BIT_MMC;
s2410INT->rSRCPND = BIT_MMC;
if (s2410INT->rINTPND & BIT_MMC)
s2410INT->rINTPND = BIT_MMC;
//RETAILMSG(1, (TEXT("ARMINT.C-INT:INTSRC_MMC INT\r\n")));
if( s2410SDIO->rSDIDATSTA & (0x1<<9) ){
//RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC_SDIO_INTERRUPT INT\r\n")));
return SYSINTR_SDMMC_SDIO_INTERRUPT;
}
else {
//RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC INT\r\n")));
return SYSINTR_SDMMC;
}
}
else if(IntPendVal == INTSRC_DMA0) // SD DMA interrupt
{
s2410INT->rINTMSK |= BIT_DMA0;
s2410INT->rSRCPND = BIT_DMA0;
if (s2410INT->rINTPND & BIT_DMA0)
s2410INT->rINTPND = BIT_DMA0;
return SYSINTR_DMA0;
}
else if (IntPendVal == INTSRC_EINT1) // Keyboard interrupt is connected to EINT1.
{
s2410INT->rINTMSK |= BIT_EINT1;
s2410INT->rSRCPND = BIT_EINT1;
if (s2410INT->rINTPND & BIT_EINT1)
s2410INT->rINTPND = BIT_EINT1;
return(SYSINTR_KEYBOARD);
}
else if (IntPendVal == INTSRC_EINT2) // EINT2
{
s2410INT->rINTMSK |= BIT_EINT2;
s2410INT->rSRCPND = BIT_EINT2; /* Interrupt Clear */
if (s2410INT->rINTPND & BIT_EINT2)
s2410INT->rINTPND = BIT_EINT2;
// RETAILMSG(1, (TEXT(">>> CPUPowerReset \r\n")));
RETAILMSG(1,(TEXT(">>> >>> Reset Button Pressed <<< <<< \r\n")));
// ???? by lilin
// CPUPowerReset();
return(SYSINTR_POWER);
}
else if (IntPendVal == INTSRC_EINT3) // PCMCIA interrupt is connected to EINT3. (nINT_P_DEV)
{
s2410INT->rINTMSK |= BIT_EINT3;
s2410INT->rSRCPND = BIT_EINT3;
if (s2410INT->rINTPND & BIT_EINT3)
s2410INT->rINTPND = BIT_EINT3;
//RETAILMSG(1, (TEXT("ARMINT.C - SYSINTR_PCMCIA_STATE\r\n")));
return(SYSINTR_PCMCIA_STATE);
}
else if (IntPendVal == INTSRC_EINT8_23) // EINT8 ~ 23
{
s2410INT->rINTMSK |= BIT_EINT8_23;
submask = s2410IOP->rEINTPEND;
if ( submask & (1 << 18)) // EINT28 : SDMMC_CARD_DETECT
{
s2410IOP->rEINTMASK |= (1 << 18);
s2410IOP->rEINTPEND = (1 << 18);
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23)
s2410INT->rINTPND = BIT_EINT8_23;
//RETAILMSG(1, (TEXT("ARMINT.C - SYSINTR_SDMMC_CARD_DETECT\r\n")));
return SYSINTR_SDMMC_CARD_DETECT;
}
else if ( submask & (1 << 9)) // 0x200 EINT9 : CS8900
{
s2410IOP->rEINTMASK |= 0x200;
s2410IOP->rEINTPEND = 0x200;
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23)
s2410INT->rINTPND = BIT_EINT8_23;
//RETAILMSG(1, (TEXT("INT:SYSINTR_ETHER INT\r\n")));
return SYSINTR_ETHER;
}
else if (submask & (1 << 8)) // 0x100 EINT8 : PCMCIA_LEVEL
{
s2410IOP->rEINTMASK |= 0x100;
s2410IOP->rEINTPEND = 0x100;
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23)
s2410INT->rINTPND = BIT_EINT8_23;
//RETAILMSG(1, (TEXT("INT:SYSINTR_PCMCIA_LEVEL INT\r\n")));
return SYSINTR_PCMCIA_LEVEL;
}
else
{
s2410INT->rSRCPND = BIT_EINT8_23;
if (s2410INT->rINTPND & BIT_EINT8_23)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -