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