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 + -
显示快捷键?