⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intr.c

📁 支持三星原产的S3C2413开发板
💻 C
📖 第 1 页 / 共 3 页
字号:
		sysIntr= OALIntrTranslateIrq(IRQ_IIC);
		RETAILMSG(DBG_ON, (TEXT("IntrHandler:IRQ_IIC\r\n")));
	}


	else if(IntPendVal == IRQ_CAMIF)
	{
			// Mask and clear interrupt
		g_pIntrRegs->INTMSK |= (BIT_CAMIF);
		g_pIntrRegs->SRCPND  = (BIT_CAMIF);
		if (g_pIntrRegs->INTPND & (BIT_CAMIF))
			g_pIntrRegs->INTPND  = (BIT_CAMIF);
		sysIntr= OALIntrTranslateIrq(IRQ_CAMIF);

		RETAILMSG(DBG_ON, (TEXT("IntrHandler:IRQ_CAMIF\r\n")));
	}
	else if(IntPendVal == IRQ_EINT0)
	{
			// Mask and clear interrupt
		g_pIntrRegs->INTMSK |= (BIT_EINT0);
		g_pPortRegs->EINTMASK |= (BIT_EINT0);
		if(g_pPortRegs->EINTPEND & (BIT_EINT0))
			g_pPortRegs->EINTPEND |= (BIT_EINT0);
		if(g_pIntrRegs->SRCPND & (BIT_EINT0))		
			g_pIntrRegs->SRCPND  |= (BIT_EINT0);
		if (g_pIntrRegs->INTPND & (BIT_EINT0))
			g_pIntrRegs->INTPND  |= (BIT_EINT0);
     
 
		sysIntr= OALIntrTranslateIrq(IRQ_EINT0);

		RETAILMSG(1, (TEXT("IntrHandler:IRQ_EINT0\r\n")));
	}

	else if(IntPendVal == IRQ_TICK)
	{
			// Mask and clear interrupt
		g_pIntrRegs->INTMSK |= (BIT_TICK);
		if (g_pIntrRegs->SRCPND & (BIT_TICK))
			g_pIntrRegs->SRCPND  |= (BIT_TICK);
		if (g_pIntrRegs->INTPND & (BIT_TICK))
			g_pIntrRegs->INTPND  |= (BIT_TICK);
		sysIntr= OALIntrTranslateIrq(IRQ_TICK);

		//RETAILMSG(1, (TEXT("IntrHandler:IRQ_TICK\r\n")));
	}

	else if(IntPendVal == IRQ_SPI1)		// Keyboard interrupt.
	{
			// Mask and clear interrupt
		g_pIntrRegs->INTMSK |= (BIT_SPI1);
		g_pIntrRegs->SRCPND  = (BIT_SPI1);
		if (g_pIntrRegs->INTPND & (BIT_SPI1))
			g_pIntrRegs->INTPND  = (BIT_SPI1);

		sysIntr= OALIntrTranslateIrq(IRQ_SPI1);

		RETAILMSG(DBG_ON, (TEXT("IntrHandler:IRQ_SPI1\r\n")));
	}

	else if(IntPendVal == IRQ_EINT1)	// Keyboard interrupt
	{
		g_pPortRegs->EINTMASK |= (BIT_EINT1);;
		g_pPortRegs->EINTPEND |= (BIT_EINT1);
		g_pIntrRegs->INTMSK |= (BIT_EINT1);
		
			OUTREG32(&g_pIntrRegs->SRCPND, BIT_EINT1);
			OUTREG32(&g_pIntrRegs->INTPND, BIT_EINT1);
			
		sysIntr= OALIntrTranslateIrq(IRQ_EINT1);
		RETAILMSG(0, (TEXT("EINT1>>> INTMSK : %x, INTPND : %x, INTOFFSET : %x, INTSRCPND : %x, EINTPND : %x, EINTMASK : %x, INTPENDVal : %d\n"), 
			g_pIntrRegs->INTMSK, g_pIntrRegs->INTPND, g_pIntrRegs->INTOFFSET, g_pIntrRegs->SRCPND, g_pPortRegs->EINTPEND, g_pPortRegs->EINTMASK, IntPendVal));
	}
#ifdef DVS_EN    
#if (DVS_METHOD == 1)
	else if(IntPendVal == IRQ_LCD)
	{
		VSYNCINTR = TRUE;
		if ( IDLEflag == FALSE )
		{

			// 4.1 Mask LCD VSYNC Interrupt
			OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK ) | (1 << IRQ_LCD ));
			if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
			if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);			
			if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
			if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);

			if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) )	// Check VSync Area.
			{
				//RETAILMSG(1,(TEXT("-")));
			}
			else
			{
				CurrStateIdle = FALSE;
				OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output

				// 4.2 Return Voltage
				ChangeVoltage(HIGHVOLTAGE);

				// 4.3 Delay 
				for(i=0;i<VOLTAGEDELAY;i++)
				{
					INREG32(&g_pPortRegs->GPFDAT); // for loop operation, just read.
				}

				// 4.4 DVS OFF (4:4:4->1:2:4)
				DVS_OFF();
				g_oalIoCtlClockSpeed = S3C2413_FCLK;
				
				switch ( HCLKDIV )
				{
				case 4:
					CLKDIV124();
					break;
				}
				clkval_calc = (WORD)((float)(S3C2413_HCLK)/(2.0*5000000)+0.5)-1;
				
				OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
			}
			RETAILMSG(1,(TEXT("N")));
		}
		else
		{

			// 2.1 Mask LCD VSYNC Interrupt
			OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // disable LCD interrupt
			if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
			if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);			
			if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
			if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);

			if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) )	// Check VSync Area.
			{
				//RETAILMSG(1,(TEXT("|")));
			}
			else 
			{
				CurrStateIdle = TRUE;
				OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
				// DVS ON (1:2:4 -> 4:4:4)
				switch ( HCLKDIV )
				{
				case 2:
					CLKDIV144();
					break;
				}
				DVS_ON();
				g_oalIoCtlClockSpeed = S3C2413_PCLK;
				
				
				// 2.4 Drop Voltage
				ChangeVoltage(LOWVOLTAGE);

				clkval_calc = (WORD)((float)(S3C2413_HCLK)/(2.0*5000000)+0.5)-1;

				OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));

			}
			RETAILMSG(1,(TEXT("I")));
		}
		sysIntr = SYSINTR_NOP;
	}
#elif (DVS_METHOD == 3)
	else if( IntPendVal == IRQ_LCD )
	{
		VSYNCINTR = TRUE;
		if ( CurrentState == Active )
		{
			OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // Disable LCD interrupt
			if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
			if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);			
			if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
			if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);

			if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) )	// Check VSync Area.
			{RETAILMSG(1,(TEXT("-BD-")));}
			else
			{
				OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output...
				ChangeVoltage(HIGHVOLTAGE);
				for(i=0;i<VOLTAGEDELAY;i++) { INREG32(&g_pPortRegs->GPFDAT); } // for loop operation, just read.
				DVS_OFF();
				g_oalIoCtlClockSpeed = S3C2413_FCLK;
				
//				RETAILMSG(1,(TEXT("HCLKDIV P1:%xh\n"), HCLKDIV));
				switch ( HCLKDIV )
				{
				case 4:
					CLKDIV124();
					break;
				}
				clkval_calc = (WORD)((float)(S3C2413_HCLK)/(2.0*5000000)+0.5)-1;
				OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));	// Enable LCD Output...
//				RETAILMSG(1,(TEXT("-a-")));
			}
		}
		else if ( CurrentState == SlowActive )
		{
			VSYNCINTR = TRUE;
			if ( IDLEflag == FALSE )
			{
				OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // disable LCD interrupt
				if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
				if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);			
				if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
				if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);

				if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) )	// Check VSync Area.
				{RETAILMSG(1,(TEXT("-BD-")));}
				else
				{
					CurrStateIdle = FALSE;
					OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
					ChangeVoltage(HIGHVOLTAGE);
					for(i=0;i<VOLTAGEDELAY;i++) { INREG32(&g_pPortRegs->GPFDAT); } // for loop operation, just read.
					DVS_OFF();
					g_oalIoCtlClockSpeed = S3C2413_FCLK;
					
//					RETAILMSG(1,(TEXT("HCLKDIV P2:%xh\n"), HCLKDIV));
					switch ( HCLKDIV )
					{
					case 4:
						CLKDIV124();
						break;
					}
					clkval_calc = (WORD)((float)(S3C2413_HCLK)/(2.0*5000000)+0.5)-1;
					OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
				}
//				RETAILMSG(1,(TEXT("-F-")));
			}
			else //if ( IDLEflag == TRUE )
			{
				OUTREG32(&g_pIntrRegs->INTMSK, INREG32(&g_pIntrRegs->INTMSK) | (1 << IRQ_LCD)); // disable LCD interrupt
				if( INREG32(&g_pLCDRegs->LCDSRCPND) & 2) OUTREG32(&g_pLCDRegs->LCDSRCPND, 0x2);
				if( INREG32(&g_pLCDRegs->LCDINTPND) & 2) OUTREG32(&g_pLCDRegs->LCDINTPND, 0x2);			
				if( INREG32(&g_pIntrRegs->SRCPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->SRCPND, 0x1 << IRQ_LCD);
				if( INREG32(&g_pIntrRegs->INTPND) & ( 0x1 << IRQ_LCD)) OUTREG32(&g_pIntrRegs->INTPND, 0x1 << IRQ_LCD);

				if (INREG32(&g_pLCDRegs->LCDCON5) & (0x3 << 15) )	// Check VSync Area.
				{RETAILMSG(1,(TEXT("-BD-")));}
				else 
				{
					CurrStateIdle = TRUE;
					OUTREG32(&g_pLCDRegs->LCDCON1, INREG32(&g_pLCDRegs->LCDCON1) & ~(0x1)); //Disable LCD Output
//					RETAILMSG(1,(TEXT("HCLKDIV P3:%xh\n"), HCLKDIV));
					switch ( HCLKDIV )
					{
					case 2:
						CLKDIV144();
						break;
					}
					DVS_ON();
					g_oalIoCtlClockSpeed = S3C2413_PCLK;
					
					ChangeVoltage(LOWVOLTAGE);
					clkval_calc = (WORD)((float)(S3C2413_HCLK)/(2.0*5000000)+0.5)-1;
					OUTREG32(&g_pLCDRegs->LCDCON1, (clkval_calc << 8)|(MVAL_USED << 7)|(3 << 5)|(12 << 1)|(1 << 0));
				}
//				RETAILMSG(1,(TEXT("-T-")));
			}
//			RETAILMSG(1,(TEXT("-%d-"), clkval_calc));
		}
		sysIntr = SYSINTR_NOP;
	}
#endif //(DVS_METHOD == 3)

   
#endif  //DVS_EN    
	
	else 
	{
		#ifdef OAL_ILTIMING
		if (g_oalILT.active) {
			g_oalILT.isrTime1 = OALTimerCountsSinceSysTick();
			g_oalILT.savedPC = 0;
			g_oalILT.interrupts++;
		}		
		#endif

		if (IntPendVal == IRQ_EINT4_7 || IntPendVal == IRQ_EINT8_23) 
		{ // 4 or 5
			// Find external interrupt number
			mask = INREG32(&g_pPortRegs->EINTPEND);
			mask &= ~INREG32(&g_pPortRegs->EINTMASK);
			mask = (mask ^ (mask - 1)) >> 5;
			IntPendVal2 = IRQ_EINT4;
			while (mask != 0) {
				mask >>= 1;
				IntPendVal2++;
			}

			// Mask and clear interrupt
			mask = 1<<(IntPendVal2 - IRQ_EINT4 + 4);
			SETREG32(&g_pPortRegs->EINTMASK, mask);
			OUTREG32(&g_pPortRegs->EINTPEND, mask);

			// Clear primary interrupt
			mask = 1<<IntPendVal;
			OUTREG32(&g_pIntrRegs->SRCPND, mask);
			OUTREG32(&g_pIntrRegs->INTPND, mask);

			// From now we care about this irq
			IntPendVal = IntPendVal2;

		}  
		else 
		{
			// Mask and clear interrupt
			mask = 1<<IntPendVal;
			SETREG32(&g_pIntrRegs->INTMSK, mask);
			OUTREG32(&g_pIntrRegs->SRCPND, mask);
			OUTREG32(&g_pIntrRegs->INTPND, mask);

			//RETAILMSG(1, (TEXT("Undefined Interrupt occurred [Int#:%d, sysIntr:%xh]\r\n"), IntPendVal, OALIntrTranslateIrq(IntPendVal)));

		}

		// First find if IRQ is claimed by chain
		sysIntr = NKCallIntChain((UCHAR)IntPendVal);
		if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
			// IRQ wasn't claimed, use static mapping
			sysIntr = OALIntrTranslateIrq(IntPendVal);
			RETAILMSG(DBG_ON, (TEXT("IntrHandler:EITNR:Intpendval:%d->sysintr:%xh.\r\n"), IntPendVal, sysIntr));
		}
	}
	// For test...SJLEE

	/*
	if (IntPendVal!=IRQ_TIMER4 && IntPendVal!=IRQ_ADC && IntPendVal!=IRQ_TIMER1 && IntPendVal!=IRQ_USBH) {
		//RETAILMSG(DBG_ON, (TEXT("return [Int#:%d, sysIntr:%xh]\r\n"), IntPendVal, sysIntr));
		RETAILMSG(1, (TEXT("return [Int#:%d, sysIntr:%xh]\r\n"), IntPendVal, sysIntr));
	}*/

	//g_oalLastSysIntr = sysIntr;
	return sysIntr;
}


//------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -