intr.c
来自「S3C24A0的完整BSP包,对开发此芯片的开发者很有用.」· C语言 代码 · 共 1,118 行 · 第 1/3 页
C
1,118 行
g_pIntrRegs->INTSUBMSK |= INTSUB_TXD1;
// RETAILMSG(1,(_T("TXD0\r\n")));
}
else
{
return(SYSINTR_NOP);
}
// NOTE: Don't clear INTSRC:UART0 here - serial driver does that.
//
g_pIntrRegs->INTMSK |= BIT_UART1;
if (g_pIntrRegs->INTPND & BIT_UART1)
g_pIntrRegs->INTPND = BIT_UART1;
//return(SYSINTR_FIR);
//RETAILMSG(1,(TEXT("IRQ_FIR)\r\n")));
return OALIntrTranslateIrq(IRQ_FIR);
}
#else //If it is slow irda..
else if (IntPendVal == INTSRC_UART1) //For seria IrDA on UART1
{
//RETAILMSG(1,(_T("Oeminterrupt handler UART1\r\n")));
SubIntPendVal = g_pIntrRegs->SUBSRCPND; //Guru
// Note that we only mask the sub source interrupt - the serial driver will clear the
// sub source pending register.
//
if(SubIntPendVal & INTSUB_ERR1)
{
//g_pIntrRegs->INTSUBMSK |= INTSUB_ERR1; //Guru
//RETAILMSG(DBG_ON,(_T("ERR1\r\n")));
}
else if(SubIntPendVal & INTSUB_RXD1)
{
//g_pIntrRegs->INTSUBMSK |= INTSUB_RXD1;//Guru
//RETAILMSG(DBG_ON,(_T("RXD1 ")));
}
else if(SubIntPendVal & INTSUB_TXD1)
{
//g_pIntrRegs->INTSUBMSK |= INTSUB_TXD1;//Guru
//RETAILMSG(DBG_ON,(_T("TXD1\r\n")));
}
else
{
RETAILMSG(DBG_ON,(_T("Oeminterrupt handler surprise intr in UART0!\r\n")));
return(SYSINTR_NOP);
}
// NOTE: Don't clear INTSRC:UART0 here - serial driver does that.
//
g_pIntrRegs->INTMSK |= BIT_UART1;
g_pIntrRegs->SRCPND = BIT_UART1;
//if (g_pIntrRegs->INTPND & BIT_UART0) //if we are here means the condition must be true.
g_pIntrRegs->INTPND = BIT_UART1;
//return(SYSINTR_SERIAL);
return OALIntrTranslateIrq(IRQ_SIR);
}
#endif
else if (IntPendVal == INTSRC_RTC)
{
g_pIntrRegs->SRCPND = BIT_RTC; /* Interrupt Clear */
g_pIntrRegs->INTPND = BIT_RTC;
g_pIntrRegs->INTMSK |= BIT_RTC; /* Alarm Interrupt Disable */
return OALIntrTranslateIrq(INTSRC_RTC);;
}
else if(IntPendVal == INTSRC_MMC) // SD, MMC
{
g_pIntrRegs->INTMSK |= BIT_MMC;
g_pIntrRegs->SRCPND = BIT_MMC;
if (g_pIntrRegs->INTPND & BIT_MMC)
g_pIntrRegs->INTPND = BIT_MMC;
RETAILMSG(DBG_ON,(_T("Oeminterrupt handler :INTSRC_MMC\r\n")));
if( g_pSDIORegs->SDIDSTA & (0x1 << 9) )
{
RETAILMSG(DBG_ON,(_T("Oeminterrupt handler :IRQ_SDMMC_SDIO_INTERRUPT\r\n")));
return OALIntrTranslateIrq(IRQ_SDMMC_SDIO_INTERRUPT);;
}
else
{
RETAILMSG(DBG_ON,(_T("intr.c:SDMMC\r\n")));
//return OALIntrTranslateIrq(IRQ_SDMMC);
}
}
else if (IntPendVal == INTSRC_EINT11_14) // EINT0_2 Interrupt
{
SubIntPendVal = g_pPortRegs->EINTPEND & (~g_pPortRegs->EINTMASK);
//SubIntPendVal = s24A0IOP->rEINTPEND;
if (SubIntPendVal & INT_SRC_EINT11) // EINT2 : SDMMC_CARD_DETECT
{
g_pPortRegs->EINTMASK |= BIT_EINT11;
g_pPortRegs->EINTPEND = BIT_EINT11;
//g_pIntrRegs->INTMSK |= BIT_EINT0_2;
g_pIntrRegs->SRCPND = BIT_EINT11_14;
if (g_pIntrRegs->INTPND & BIT_EINT11_14)
g_pIntrRegs->INTPND = BIT_EINT11_14;
return (SYSINTR_NOP);
}
else if (SubIntPendVal & INT_SRC_EINT13)
{
// clear external interrupt registers
g_pPortRegs->EINTMASK |= BIT_EINT13;
g_pPortRegs->EINTPEND = BIT_EINT13;
// clear main interrupt registers
g_pIntrRegs->INTMSK |= BIT_EINT11_14;
g_pIntrRegs->SRCPND = BIT_EINT11_14;
if (g_pIntrRegs->INTPND & BIT_EINT11_14)
g_pIntrRegs->INTPND = BIT_EINT11_14;
return OALIntrTranslateIrq(IRQ_ETHER);
}
}
else if(IntPendVal == INTSRC_USBH) // USB.
{
g_pIntrRegs->INTMSK |= BIT_USBH;
g_pIntrRegs->SRCPND = BIT_USBH;
if (g_pIntrRegs->INTPND & BIT_USBH)
g_pIntrRegs->INTPND = BIT_USBH;
//RETAILMSG(DBG_ON, (TEXT("intr.c:USBH\r\n")));
return OALIntrTranslateIrq(IRQ_USBH);
}
else if (IntPendVal == INTSRC_ADC) // INTSRC_ADC
{
// Touch Panel Int
SubIntPendVal = g_pIntrRegs->SUBSRCPND;
if (SubIntPendVal & INTSUB_PENUP)
{
g_pIntrRegs->INTSUBMSK |= INTSUB_PENUP;
g_pIntrRegs->SUBSRCPND = INTSUB_PENUP;
g_pIntrRegs->INTMSK |= BIT_ADC;
g_pIntrRegs->SRCPND = BIT_ADC;
if (g_pIntrRegs->INTPND & BIT_ADC) g_pIntrRegs->INTPND = BIT_ADC;
odo_tsb->status = TOUCH_PEN_UP;
//RETAILMSG(1,(TEXT("INTSUB_PENUP\r\n")));
return OALIntrTranslateIrq(IRQ_ADC);
}
else if (SubIntPendVal & INTSUB_PENDN)
{
g_pIntrRegs->INTSUBMSK |= INTSUB_PENDN;
g_pIntrRegs->SUBSRCPND = INTSUB_PENDN;
g_pIntrRegs->INTMSK |= BIT_ADC;
g_pIntrRegs->SRCPND = BIT_ADC;
if (g_pIntrRegs->INTPND & BIT_ADC) g_pIntrRegs->INTPND = BIT_ADC;
odo_tsb->status = TOUCH_PEN_DOWN;
//RETAILMSG(1,(TEXT("INTSUB_PENDN\r\n")));
return OALIntrTranslateIrq(IRQ_ADC);
}
else if (SubIntPendVal & INTSUB_ADC)
{
g_pIntrRegs->INTSUBMSK |= INTSUB_ADC;
g_pIntrRegs->SUBSRCPND = INTSUB_ADC;
g_pIntrRegs->INTMSK |= BIT_ADC;
g_pIntrRegs->SRCPND = BIT_ADC;
if (g_pIntrRegs->INTPND & BIT_ADC) g_pIntrRegs->INTPND = BIT_ADC;
g_pIntrRegs->INTMSK &= ~BIT_ADC;
//RETAILMSG(1,(_T("INTSUB_ADC\r\n")));
return SYSINTR_NOP;
}
else
return SYSINTR_NOP;
}
else if (IntPendVal == INTSRC_IRDA_MSTICK)
{
SubIntPendVal = g_pIntrRegs->SUBSRCPND;
if (SubIntPendVal & INTSUB_IRDA) // IRDA interrupt
{
g_pIntrRegs->INTMSK |= BIT_IRDA_MSTICK;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_IRDA;
g_pIntrRegs->SUBSRCPND = BIT_SUB_IRDA;
g_pIntrRegs->SRCPND = BIT_IRDA_MSTICK;
if (g_pIntrRegs->INTPND & BIT_IRDA_MSTICK)
g_pIntrRegs->INTPND = BIT_IRDA_MSTICK;
//RETAILMSG(1,(TEXT("IRQ_FIR)\r\n")));
//return (SYSINTR_FIR);
return OALIntrTranslateIrq(IRQ_FIR);
}
else if (SubIntPendVal & INTSUB_MSTICK)
{
g_pIntrRegs->INTMSK |= BIT_IRDA_MSTICK;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_MSTICK;
g_pIntrRegs->SUBSRCPND = BIT_SUB_MSTICK;
g_pIntrRegs->SRCPND = BIT_IRDA_MSTICK;
if (g_pIntrRegs->INTPND & BIT_IRDA_MSTICK)
g_pIntrRegs->INTPND = BIT_IRDA_MSTICK;
if(g_pMSRegs->INTCTRL_STA & 0x10) { // 1 << 4
RETAILMSG(DBG_ON,(TEXT("intr.c::INTSUB_MSTICK, Insert\r\n")));
g_pIntrRegs->INTMSK &= ~BIT_IRDA_MSTICK;
g_pIntrRegs->INTSUBMSK &= ~BIT_SUB_MSTICK;
return OALIntrTranslateIrq(IRQ_MEMSTICK_INSINT);
}
else {
// RETAILMSG(1,(TEXT("intr.c::INTSUB_MSTICK Other\r\n")));
return OALIntrTranslateIrq(IRQ_MEMSTICK);
}
}
}
else if (IntPendVal == INTSRC_TIMER1) // INTSRC_TIMER1
{
// Timer 1 interrupt to get touch point
g_pIntrRegs->INTMSK |= BIT_TIMER1;
g_pIntrRegs->SRCPND = BIT_TIMER1;
//RETAILMSG(1,(_T("INTSRC_TIMER1\r\n")));
if (g_pIntrRegs->INTPND & BIT_TIMER1)
g_pIntrRegs->INTPND = BIT_TIMER1;
if( (g_pADCRegs->ADCDAX & 0x8000) || (g_pADCRegs->ADCDAY & 0x8000) ){
//RETAILMSG(DBG_ON,(TEXT("INT Touch SYSINTR_TOUCH_CHANGED 1\r\n")));
odo_tsb->status = TOUCH_PEN_UP;
return OALIntrTranslateIrq(IRQ_ADC);
}
if(odo_tsb->status == TOUCH_PEN_UP)
{
//RETAILMSG(1,(TEXT("INT Touch SYSINTR_TOUCH_CHANGED 2 \r\n")));
odo_tsb->status = TOUCH_PEN_UP;
return OALIntrTranslateIrq(IRQ_ADC);
}
else
{
unsigned int TmpTCON;
odo_tsb->status = TOUCH_PEN_SAMPLE;
TmpTCON = g_pPWMRegs->TCON; // get TCON value to temp TCON register
g_pPWMRegs->TCON = (TmpTCON & ~(0xf00)) | (0x200); // stop, one-shot, inverter off, TCNTB1 update
g_pPWMRegs->TCON = (TmpTCON & ~(0xf00)) | (0x100); // start
//RETAILMSG(1,(TEXT("INT Touch SYSINTR_TOUCH timer1 restart\r\n")));
return OALIntrTranslateIrq(IRQ_TIMER1);
}
}
else if (IntPendVal == INTSRC_DMA_SBUS) // AUDIO DMA
{
SubIntPendVal = g_pIntrRegs->SUBSRCPND;
if (SubIntPendVal & BIT_SUB_DMA0) // AUDIO DMA input
{
g_pIntrRegs->INTMSK |= BIT_DMA_SBUS;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_DMA0;
g_pIntrRegs->SUBSRCPND = BIT_SUB_DMA0;
g_pIntrRegs->SRCPND = BIT_DMA_SBUS;
if (g_pIntrRegs->INTPND & BIT_DMA_SBUS)
g_pIntrRegs->INTPND = BIT_DMA_SBUS;
RETAILMSG(DBG_ON,(TEXT("Intr.c:: returning IRQ_AUDIO :DMA0\r\n")));
return OALIntrTranslateIrq(IRQ_AUDIO);
}
else if (SubIntPendVal & BIT_SUB_DMA1) // AUDIO DMA output
{
g_pIntrRegs->INTMSK |= BIT_DMA_SBUS;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_DMA1;
g_pIntrRegs->SUBSRCPND = BIT_SUB_DMA1;
g_pIntrRegs->SRCPND = BIT_DMA_SBUS;
if (g_pIntrRegs->INTPND & BIT_DMA_SBUS)
g_pIntrRegs->INTPND = BIT_DMA_SBUS;
//RETAILMSG(1,(TEXT("intr.c::INTSUB_DMA1\r\n")));
//RETAILMSG(1,(TEXT("intr.c::DMA1 HWSRCSEL %X\r\n"),(s24A0DMA1->rDCON & 0x07000000)));
//RETAILMSG(DBG_ON,(TEXT("IRQ_FIR)\r\n")));
return OALIntrTranslateIrq(IRQ_FIR);
}
if (SubIntPendVal & BIT_SUB_DMA2)
{
g_pIntrRegs->INTMSK |= BIT_DMA_SBUS;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_DMA2;
g_pIntrRegs->SUBSRCPND = BIT_SUB_DMA2;
g_pIntrRegs->SRCPND = BIT_DMA_SBUS;
if (g_pIntrRegs->INTPND & BIT_DMA_SBUS)
g_pIntrRegs->INTPND = BIT_DMA_SBUS;
// RETAILMSG(1,(_T("intr.c::INTSUB_DMA2\r\n")));
RETAILMSG(DBG_ON,(_T("Intr.c:: returning IRQ_AUDIO :DMA2\r\n")));
return OALIntrTranslateIrq(IRQ_AUDIO);
}
if (SubIntPendVal & BIT_SUB_DMA3)
{
g_pIntrRegs->INTMSK |= BIT_DMA_SBUS;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_DMA3;
g_pIntrRegs->SUBSRCPND = BIT_SUB_DMA3;
g_pIntrRegs->SRCPND = BIT_DMA_SBUS;
if (g_pIntrRegs->INTPND & BIT_DMA_SBUS)
g_pIntrRegs->INTPND = BIT_DMA_SBUS;
//RETAILMSG(DBG_ON,(_T("intr.c::INTSUB_DMA3\r\n")));
return OALIntrTranslateIrq(IRQ_SDDMA);
}
}
// For Camera Added - Yash
else if(IntPendVal == INTSRC_CAMIF_C)
{
g_pIntrRegs->INTMSK |= BIT_CAMIF_C;
if (g_pIntrRegs->INTPND & BIT_CAMIF_C)
g_pIntrRegs->INTPND = BIT_CAMIF_C;
RETAILMSG(DBG_ON,(_T("CAMERA_C INTR\r\n")));
return OALIntrTranslateIrq(IRQ_CAMERA);
}
else if (IntPendVal == INTSRC_KEYPAD) // KEYPAD
{
g_pIntrRegs->INTMSK |= BIT_KEYPAD;
g_pIntrRegs->SRCPND = BIT_KEYPAD;
if (g_pIntrRegs->INTPND & BIT_KEYPAD) g_pIntrRegs->INTPND = BIT_KEYPAD;
//RETAILMSG(1, (TEXT("intr.c:KEYPAD\r\n")));
//return OALIntrTranslateIrq(IRQ_KEYPAD);
return OALIntrTranslateIrq(IRQ_KEYPAD);
}
else if(IntPendVal == INTSRC_CAMIF_P)
{
g_pIntrRegs->INTMSK |= BIT_CAMIF_P;
if (g_pIntrRegs->INTPND & BIT_CAMIF_P)
g_pIntrRegs->INTPND = BIT_CAMIF_P;
// RETAILMSG(1,(_T("CAMERA_P INTR\r\n")));
return OALIntrTranslateIrq(IRQ_CAMERA);
}
else if (IntPendVal == INTSRC_USBD)
{
g_pIntrRegs->INTMSK |= BIT_USBD;
//UsbdClearEir(); //:-)naushad
g_pIntrRegs->SRCPND = BIT_USBD;
if (g_pIntrRegs->INTPND & BIT_USBD) g_pIntrRegs->INTPND = BIT_USBD;
RETAILMSG(DBG_ON,(TEXT("INT_USBD\r\n")));
//return (SYSINTR_USBD);
return OALIntrTranslateIrq(IRQ_USBD);
}
else if(IntPendVal == INTSRC_IIC)
{
g_pIntrRegs->INTMSK |= BIT_IIC;
// g_pIntrRegs->SRCPND = BIT_IIC;
if (g_pIntrRegs->INTPND & BIT_IIC)
g_pIntrRegs->INTPND = BIT_IIC;
// RETAILMSG(1,(TEXT("IIC INTR\r\n")));
return OALIntrTranslateIrq(IRQ_IIC);
}
RETAILMSG(DBG_ON,(TEXT("Some Other Interrupt %d\r\n"), IntPendVal));
return (SYSINTR_NOP);
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?