intr.c
来自「S3C24A0的完整BSP包,对开发此芯片的开发者很有用.」· C语言 代码 · 共 1,118 行 · 第 1/3 页
C
1,118 行
g_pIntrRegs->INTMSK |= BIT_IRDA_MSTICK;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_MSTICK;
//RETAILMSG(DBG_ON,(TEXT("OALIntrDisableIrqs:Memstick\r\n\r\n")));
break;
case IRQ_MEMSTICK_DMA:
// g_pIntrRegs->INTMSK |= BIT_DMA_SBUS; // MEMSTICK DMA interrupt
g_pIntrRegs->INTSUBMSK &= ~(BIT_SUB_DMA0);
//RETAILMSG(DBG_ON,(TEXT("::: dwSysIntr_Memstick_DMA OALIntrDisableIrqs\r\n")));
break;
case IRQ_USBD:
g_pIntrRegs->INTMSK |= BIT_USBD;
//RETAILMSG(DBG_ON,(_T("OALIntrDisableIrqs:USBD\r\n")));
break;
case IRQ_CAMERA:
g_pIntrRegs->INTMSK |= (BIT_CAMIF_C |BIT_CAMIF_P); // camera interrupt
//RETAILMSG(DBG_ON,(TEXT("OALIntrDisableIrqs:IRQ_CAMERA\r\n")));
break;
case IRQ_IIC:
g_pIntrRegs->INTMSK |= BIT_IIC;
//RETAILMSG(DBG_ON,(TEXT("OALIntrDisableIrqs:IRQ_IIC\r\n")));
break;
case IRQ_SDMMC_SDIO_INTERRUPT:
g_pIntrRegs->INTMSK |= BIT_MMC;
g_pSDIORegs->SDIIMSK &= ~(0x1<<12); // interrupt from SDIO card
//RETAILMSG(DBG_ON,(TEXT("OEMInterruptDisable: IRQ_SDMMC_SDIO_INTERRUPT\r\n")));
break;
case IRQ_SDDMA:
g_pIntrRegs->INTMSK |= BIT_DMA_SBUS; // SDIO DMA interrupt
g_pIntrRegs->INTSUBMSK &= ~(BIT_SUB_DMA3); //~(BIT_SUB_DMA2)
//RETAILMSG(DBG_ON,(TEXT("OEMInterruptDisable: IRQ_SDDMA\r\n")));
break;
case IRQ_ETHER:
g_pIntrRegs->INTMSK |= BIT_EINT11_14;
g_pPortRegs->EINTMASK |= (1<<13);
// RETAILMSG(1,(_T("OEMInterruptDisable:Ethernet\r\n")));
break;
case IRQ_FIR:
// RETAILMSG(1,(_T("OEMInterruptDisable:IRDA\r\n")));
if(pIrdaGloabls->bFIREnabled) {
// RETAILMSG(1,(_T(" bFIREnabled\r\n")));
g_pIntrRegs->INTSUBMSK |= INTSUB_IRDA;
g_pIntrRegs->INTSUBMSK |= BIT_SUB_DMA1;
}else {
// RETAILMSG(1,(_T(" bFIR NOT Enabled\r\n")));
g_pIntrRegs->INTMSK |= BIT_UART1;
g_pIntrRegs->INTSUBMSK |= INTSUB_RXD1;
g_pIntrRegs->INTSUBMSK |= INTSUB_TXD1;
g_pIntrRegs->INTSUBMSK |= INTSUB_ERR1;
}
break;
default:
RETAILMSG(DBG_ON,(TEXT("OEMInterruptDisable:Unsupported \r\n")));
break;
}
}
INTERRUPTS_ON();
//OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALIntrDisableIrqs\r\n"));
}
//------------------------------------------------------------------------------
//
// Function: OALIntrDoneIrqs
//
void
OALIntrDoneIrqs(
UINT32 count,
const UINT32 *pIrqs
)
{
UINT32 i, irq;
//OALMSG(OAL_INTR&&OAL_VERBOSE, (L"+OALIntrDoneIrqs(%d, 0x%08x)\r\n", count, pIrqs));
INTERRUPTS_OFF();
for (i = 0; i < count; i++)
{
#ifndef OAL_BSP_CALLBACKS
irq = pIrqs[i];
#else
// Give BSP chance to finish irq on subordinate interrupt controller
irq = BSPIntrDoneIrq(pIrqs[i]);
#endif
switch (irq)
{
case IRQ_TIMER1:
g_pIntrRegs->INTMSK &= ~BIT_TIMER1;
//RETAILMSG(DBG_ON,(TEXT("OEMInterruptDone:TOUCH CHANGED\n\r\n")));
break;
case IRQ_ADC:
g_pIntrRegs->INTMSK &= ~BIT_ADC;
g_pIntrRegs->INTSUBMSK &= ~(BIT_SUB_PENUP|BIT_SUB_PENDN);
//RETAILMSG(DBG_ON,(TEXT("OEMInterruptDone:TOUCH \n\r\n")));
break;
case IRQ_USBH:
g_pIntrRegs->INTMSK &= ~BIT_USBH;
//RETAILMSG(DBG_ON,(TEXT("OALIntrDoneIrqs:USBH\r\n")));
break;
case IRQ_AUDIO:
g_pIntrRegs->SUBSRCPND = (BIT_SUB_DMA0 | BIT_SUB_DMA2);
g_pIntrRegs->INTSUBMSK &= ~(BIT_SUB_DMA0 | BIT_SUB_DMA2);
g_pIntrRegs->SRCPND = (BIT_DMA_SBUS);
if (g_pIntrRegs->INTPND & BIT_DMA_SBUS)
g_pIntrRegs->INTPND = BIT_DMA_SBUS;
g_pIntrRegs->INTMSK &= ~BIT_DMA_SBUS;
//RETAILMSG(DBG_ON,(TEXT("OALIntrDoneIrqs:AUDIO\n\r\n")));
break;
// case SYSINTR_SERIAL:
case IRQ_SERIAL:
g_pIntrRegs->SRCPND = BIT_UART0;
g_pIntrRegs->INTMSK &= ~BIT_UART0;
// RETAILMSG(DBG_ON,(TEXT("OALIntrDoneIrqs:UART0 \r\n")));
break;
case IRQ_SIR:
g_pIntrRegs->SRCPND = BIT_UART1;
g_pIntrRegs->INTMSK &= ~BIT_UART1;
// RETAILMSG(DBG_ON,(TEXT("OALIntrDoneIrqs:UART1 \r\n")));
break;
case IRQ_SDMMC_SDIO_INTERRUPT:
g_pIntrRegs->INTMSK &= ~BIT_MMC;
// SDMMCMSG(1,(TEXT("::: SYSINTR_SDMMC_SDIO_INTERRUPT OEMInterruptDone\r\n")));
break;
case IRQ_SDDMA:
g_pIntrRegs->INTSUBMSK &= ~BIT_SUB_DMA3; //~(BIT_SUB_DMA2) // SDIO DMA interrupt
g_pIntrRegs->INTMSK &= ~BIT_DMA_SBUS; // SDIO DMA interrupt
// SDMMCMSG(1,(TEXT("OEMInterruptDone: IRQ_SDDMA \r\n")));
break;
case IRQ_CAMERA:
g_pIntrRegs->SRCPND |= (BIT_CAMIF_C | BIT_CAMIF_P);
g_pIntrRegs->INTMSK &= ~(BIT_CAMIF_P | BIT_CAMIF_C);
//RETAILMSG(DBG_ON,(TEXT("OALIntrDoneIrqs:IRQ_CAMERA\r\n")));
break;
case IRQ_IIC:
g_pIntrRegs->SRCPND |= BIT_IIC;
// if (g_pIntrRegs->INTPND & BIT_IIC)
// g_pIntrRegs->INTPND = BIT_IIC;
g_pIntrRegs->INTMSK &= ~BIT_IIC;
// RETAILMSG(1,(TEXT("OALIntrDoneIrqs:IRQ_IIC\r\n")));
break;
case IRQ_ETHER:
// RETAILMSG(1,(TEXT("OEMInterruptDone:Ether\r\n")));
g_pIntrRegs->INTMSK &= ~BIT_EINT11_14;
g_pPortRegs->EINTMASK &= ~(1<<13);
break;
case IRQ_FIR:
// RETAILMSG(1,(TEXT("OEMInterruptDone:IRDA\r\n")));
if(pIrdaGloabls->bFIREnabled) {
g_pIntrRegs->SUBSRCPND = BIT_SUB_IRDA;
g_pIntrRegs->INTSUBMSK &= ~BIT_SUB_IRDA;
g_pIntrRegs->SRCPND = BIT_IRDA_MSTICK;
g_pIntrRegs->INTMSK &= ~BIT_IRDA_MSTICK;
g_pIntrRegs->SUBSRCPND = BIT_SUB_DMA1;
g_pIntrRegs->INTSUBMSK &= ~(BIT_SUB_DMA1);
g_pIntrRegs->SUBSRCPND = BIT_SUB_DMA1;
if (g_pIntrRegs->INTPND & BIT_DMA_SBUS)
g_pIntrRegs->INTPND = BIT_DMA_SBUS;
g_pIntrRegs->INTMSK &= ~BIT_DMA_SBUS;
// RETAILMSG(1,(TEXT("OEMInterruptDone:FIR\n\r\n")));
}else {
g_pIntrRegs->INTMSK &= ~BIT_UART1;
g_pIntrRegs->INTSUBMSK &= ~(INTSUB_RXD1|INTSUB_ERR1);
g_pIntrRegs->INTSUBMSK &= ~(INTSUB_ERR1);
// RETAILMSG(1,(TEXT("OEMInterruptDone:SIR\n\r\n")));
}
break;
case IRQ_KEYPAD:
//RETAILMSG(1,(TEXT("OEMInterruptDone:KEYPAD\r\n")));
g_pIntrRegs->INTMSK &= ~BIT_KEYPAD;
break;
case IRQ_MEMSTICK :
case IRQ_MEMSTICK_INSINT :
// case SYSINTR_MEMSTICK_PROTOCOMPLETE:
// case SYSINTR_MEMSTICK_SIFINTREVENT:
g_pIntrRegs->SUBSRCPND = BIT_SUB_MSTICK;
g_pIntrRegs->INTSUBMSK &= ~BIT_SUB_MSTICK;
g_pIntrRegs->SRCPND = BIT_IRDA_MSTICK;
if (g_pIntrRegs->INTPND & BIT_IRDA_MSTICK)
g_pIntrRegs->INTPND = BIT_IRDA_MSTICK;
g_pIntrRegs->INTMSK &= ~BIT_IRDA_MSTICK;
// RETAILMSG(1,(TEXT("OEMInterruptDone:Memstick\n\r\n")));
break;
case IRQ_MEMSTICK_DMA:
g_pIntrRegs->INTSUBMSK &= ~BIT_SUB_DMA0; // MEMSTICK DMA interrupt
g_pIntrRegs->INTMSK &= ~BIT_DMA_SBUS; // MEMSTICK DMA interrupt
//RETAILMSG(DBG_ON,(TEXT("::: dwSysIntr_Memstick_DMA OALIntrDoneIrqs\r\n")));
break;
case IRQ_USBD:
g_pIntrRegs->INTMSK &= ~BIT_USBD;
//g_pIntrRegs->SRCPND |=BIT_USBD;
//g_pIntrRegs->INTPND |=BIT_USBD;
//RETAILMSG(DBG_ON,(TEXT("OALIntrDoneIrqs:USBD\r\n")));
break;
default:
RETAILMSG(DBG_ON,(TEXT("OEMInterruptDone:unsupported %d\r\n"), irq));
break;
}
}
INTERRUPTS_ON();
// OALMSG(0, (L"-OALIntrDoneIrqs\r\n"));
}
//------------------------------------------------------------------------------
//
// Function: OEMInterruptHandler
//
ULONG OEMInterruptHandler(ULONG ra)
{
static BYTE nLED = 0x1;
// unsigned int TmpTCON;
UINT32 sysIntr = SYSINTR_NOP;
unsigned int IntPendVal;
unsigned int SubIntPendVal; // for serial
static DWORD HeartBeatCnt, HeartBeatStat;
TOUCH_GLOBALS *odo_tsb; //Sample buffer stuff
// for this, You MUST modify bsp/inc/drv_glob.h.. check drv_glob.h_jylee TBD
odo_tsb = &((DRIVER_GLOBALS *)DRIVER_GLOBALS_PHYSICAL_MEMORY_START)->tch;
// RETAILMSG(DBG_ON,(TEXT("++++++++++++++++++++++++++Interrupthandler\n\r\n")));
IntPendVal = g_pIntrRegs->INTOFFSET; // Get pending IRQ mode interrupt in INTPND.
//
// Check the timer interrupt.
//
if (IntPendVal == INTSRC_TIMER34)
{
SubIntPendVal = g_pIntrRegs->SUBSRCPND;
if (SubIntPendVal & BIT_SUB_TIMER4)
{
if (++HeartBeatCnt > 1000)
{
HeartBeatCnt = 0;
HeartBeatStat ^= 1;
//RETAILMSG(DBG_ON,(TEXT("Interrupthandler :--->BIT_SUB_TIMER4 \n\r\n")));
if (HeartBeatStat)
g_pPortRegs->GPDAT &= ~(1 << 7); // LED 7 On
else
g_pPortRegs->GPDAT |= (1 << 7); // LED 7 Off
}
/* TmpTCON = g_pPWMRegs->TCON & (~(0xf << 20)); // get TCON value to temp TCON register
g_pPWMRegs->TCON = (TmpTCON | (2 << 20));
g_pPWMRegs->TCON = (TmpTCON | (1 << 20));
g_pPWMRegs->TCON |= (2 << 20); // update TCNTB4, stop
g_pPWMRegs->TCON |= (1 << 20); // one-shot mode, start
*/
//
// Clear the interrupt
//
g_pIntrRegs->SUBSRCPND = BIT_SUB_TIMER4;
g_pIntrRegs->SRCPND = BIT_TIMER34;
if (g_pIntrRegs->INTPND & BIT_TIMER34)
g_pIntrRegs->INTPND = BIT_TIMER34;
// Rest is on timer interrupt handler
sysIntr = OALTimerIntrHandler();
return sysIntr;
}
else
{
//RETAILMSG(DBG_ON, (TEXT("Not needed-----Timer3 Inerrupt !!!!!!!!!!!!!!!!!!!!\r\n")));
return SYSINTR_NOP;
}
}
else if (IntPendVal == INTSRC_UART0)
{
//RETAILMSG(1,(_T("Oeminterrupt handler UART0\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_ERR0)
{
//g_pIntrRegs->INTSUBMSK |= INTSUB_ERR0; //Guru
RETAILMSG(DBG_ON,(_T("ERR0\r\n")));
}
else if(SubIntPendVal & INTSUB_RXD0)
{
//g_pIntrRegs->INTSUBMSK |= INTSUB_RXD0;//Guru
//RETAILMSG(1,(_T("RXD0\r\n")));
}
else if(SubIntPendVal & INTSUB_TXD0)
{
//g_pIntrRegs->INTSUBMSK |= INTSUB_TXD0;//Guru
//RETAILMSG(1,(_T("TXD0\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_UART0;
g_pIntrRegs->SRCPND = BIT_UART0;
//if (g_pIntrRegs->INTPND & BIT_UART0) //if we are here means the condition must be true.
g_pIntrRegs->INTPND = BIT_UART0;
//return(SYSINTR_SERIAL);
return OALIntrTranslateIrq(IRQ_SERIAL);
}
#if FAST_IR
else if(IntPendVal == INTSRC_UART1) // SERIAL (UART0) (physical COM1: P1 connector).
{
SubIntPendVal = g_pIntrRegs->SUBSRCPND;
// 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;
// RETAILMSG(1,(_T("ERR0\r\n")));
}
else if(SubIntPendVal & INTSUB_RXD1)
{
g_pIntrRegs->INTSUBMSK |= INTSUB_RXD1;
// RETAILMSG(1,(_T("RXD0\r\n")));
}
else if(SubIntPendVal & INTSUB_TXD1)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?