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

📄 intr.c

📁 三星2440原版bsp
💻 C
📖 第 1 页 / 共 2 页
字号:
				else
					g_pPortRegs->GPFDAT |=  (1 << 4); // LED 4 Off
			}

        // Clear the interrupt
        OUTREG32(&g_pIntrRegs->SRCPND, 1 << IRQ_TIMER4);
        OUTREG32(&g_pIntrRegs->INTPND, 1 << IRQ_TIMER4);

        // Rest is on timer interrupt handler
        sysIntr = OALTimerIntrHandler();
	}    
    // Profiling timer interrupt?
    else if (irq == IRQ_TIMER2)
    {
        // Mask and Clear the interrupt.
        mask = 1 << irq;
        SETREG32(&g_pIntrRegs->INTMSK, mask);
        OUTREG32(&g_pIntrRegs->SRCPND, mask);
        OUTREG32(&g_pIntrRegs->INTPND, mask);

        // The rest is up to the profiling interrupt handler (if profiling
        // is enabled).
        //
        if (g_pProfilerISR)
        {
            sysIntr = g_pProfilerISR(ra);
        }
    }
    
    else if ( irq == IRQ_EINT2 )
    {
    	OUTREG32(&g_pIntrRegs->SRCPND, 1 << IRQ_EINT2);
        OUTREG32(&g_pIntrRegs->INTPND, 1 << IRQ_EINT2);
#ifdef DVS_EN
#if (DVS_METHOD == 1 || DVS_METHOD == 3)
		ChangeVoltage(HIGHVOLTAGE);
		for(i=0;i<VOLTAGEDELAY;i++)
		{
			INREG32(&g_pPortRegs->GPFDAT); // for loop operation, just read.
		}
		DVS_OFF();
		switch ( HCLKDIV )
		{
		case 4:
			CLKDIV124();
			break;
		case 6:
			CLKDIV136();
			break;
		case 8:
			CLKDIV148();
			break;
		}
#endif //(DVS_METHOD == 1 || DVS_METHOD == 3)
#endif //DVS_EN        
        OALIoCtlHalReboot(0, NULL, 0, NULL, 0, NULL);
        sysIntr = SYSINTR_NOP;
    }

#ifdef DVS_EN    
#if (DVS_METHOD == 1)
	else if(irq == 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_ON = 0 (6:6:6->1:6:6)
				DVS_OFF();
				switch ( HCLKDIV )
				{
				case 4:
					CLKDIV124();
					break;
				case 6:
					CLKDIV136();
					break;
				case 8:
					CLKDIV148();
					break;
				}
				clkval_calc = (WORD)((float)(S3C2440X_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
				switch ( HCLKDIV )
				{
				case 2:
					CLKDIV144();
					break;
				case 3:
					CLKDIV166();
					break;
				case 4:
					CLKDIV188();
					break;
				}
				DVS_ON();
				
				// 2.4 Drop Voltage
				ChangeVoltage(LOWVOLTAGE);

				clkval_calc = (WORD)((float)(S3C2440X_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( irq == 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();
				switch ( HCLKDIV )
				{
				case 4:
					CLKDIV124();
					break;
				case 6:
					CLKDIV136();
					break;
				case 8:
					CLKDIV148();
					break;
				}
				clkval_calc = (WORD)((float)(S3C2440X_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();
					switch ( HCLKDIV )
					{
					case 4:
						CLKDIV124();
						break;
					case 6:
						CLKDIV136();
						break;
					case 8:
						CLKDIV148();
						break;
					}
					clkval_calc = (WORD)((float)(S3C2440X_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
					switch ( HCLKDIV )
					{
					case 2:
						CLKDIV144();
						break;
					case 3:
						CLKDIV166();
						break;
					case 4:
						CLKDIV188();
						break;
					}
					DVS_ON();
					ChangeVoltage(LOWVOLTAGE);
					clkval_calc = (WORD)((float)(S3C2440X_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 (irq == IRQ_EINT4_7 || irq == 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;
            irq2 = IRQ_EINT4;
            while (mask != 0) {
                mask >>= 1;
                irq2++;
            }

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

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

            // From now we care about this irq
            irq = irq2;

        }
        
      else if(irq == IRQ_CAM)
        {
        	if(INREG32(&g_pIntrRegs->SUBSRCPND) & (1<<IRQ_SUB_CAM_C))
        	{
        	  SETREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_CAM_C));
        	  SETREG32(&g_pIntrRegs->INTMSK, (1<<IRQ_CAM));
        	  OUTREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_CAM_C));
        	  OUTREG32(&g_pIntrRegs->SRCPND, (1<<IRQ_CAM));
        	  OUTREG32(&g_pIntrRegs->INTPND,(1<<IRQ_CAM));
        	  //RETAILMSG(1,(TEXT("IRQ_CAM Codec\r\n")));
        	}
        	
        	else if(INREG32(&g_pIntrRegs->SUBSRCPND) & (1<<IRQ_SUB_CAM_P))
         	{
        	  SETREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_CAM_P));
        	  SETREG32(&g_pIntrRegs->INTMSK, (1<<IRQ_CAM));
        	  OUTREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_CAM_P));
        	  OUTREG32(&g_pIntrRegs->SRCPND, (1<<IRQ_CAM));
        	  OUTREG32(&g_pIntrRegs->INTPND,(1<<IRQ_CAM));
        	  //RETAILMSG(1,(TEXT("PreViw\r\n")));
        	}
        	
        	else
        	{
        		SETREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_CAM_C)|(1<<IRQ_SUB_CAM_P)); 
        		SETREG32(&g_pIntrRegs->INTMSK, (1<<IRQ_CAM));
        		SETREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_CAM_C)|(1<<IRQ_SUB_CAM_P));       	  
        		OUTREG32(&g_pIntrRegs->SRCPND, (1<<IRQ_CAM));
        		OUTREG32(&g_pIntrRegs->INTPND,(1<<IRQ_CAM));
        		
        		return SYSINTR_NOP; 
        	}
        }
        
        
         else {

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

        }

        // First find if IRQ is claimed by chain
        sysIntr = NKCallIntChain((UCHAR)irq);
        if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
            // IRQ wasn't claimed, use static mapping
            sysIntr = OALIntrTranslateIrq(irq);
        }
    }
#if 0    
    if(irq == IRQ_EINT1)
    RETAILMSG(1,(TEXT("EINT1 interrupt is occured!!\r\n")));
    if(irq == IRQ_EINT0)
    RETAILMSG(1,(TEXT("EINT0 interrupt is occured!!\r\n")));
    if(irq == IRQ_EINT2)
    RETAILMSG(1,(TEXT("EINT2 interrupt is occured!!\r\n")));
#endif
    return sysIntr;
}

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

⌨️ 快捷键说明

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