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

📄 intr.c

📁 SMDK2416_BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
        } else if (irq <= IRQ_EINT23) {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            SETREG32(&g_pPortRegs->EINTMASK, mask);
        }
        else if( irq <= IRQ_AUDIO)
        {
       	} 
        else if (irq <= IRQ_DMA5)	// irq >= IRQ_DMA0 && irq <= IRQ_DMA5
        {
        	//RETAILMSG(1,(TEXT("DMA!! Interrupt Enable!! -- %d\n"),irq));        	
        	//SETREG32(&g_pIntrRegs->INTMSK, 1 << IRQ_DMA);
         	mask = 1 << (IRQ_SUB_DMA5 - (IRQ_DMA5 - irq));	
         	SETREG32(&g_pIntrRegs->INTSUBMSK, mask);
     	}  
     	else if(irq == IRQ_LCD_VSYNC)
     	{
     		SETREG32(&g_pIntrRegs->INTMSK, 1 << IRQ_LCD);
     		SETREG32(&g_pIntrRegs->INTSUBMSK, 1 << IRQ_SUB_LCD3);
     	}     	       
    }

#elif (BSP_TYPE == BSP_SMDK2450)
   for (i = 0; i < count; i++)
    {
#ifndef OAL_BSP_CALLBACKS
        irq = pIrqs[i];
#else
        // Give BSP chance to disable irq on subordinate interrupt controller
        irq = BSPIntrDisableIrq(pIrqs[i]);
        if (irq == OAL_INTR_IRQ_UNDEFINED) continue;
#endif
        // Depending on IRQ number use internal or external mask register
        if (irq <= IRQ_ADC)
        {
            // Use interrupt mask register
            mask = 1 << irq;
            SETREG32(&g_pIntrRegs->INTMSK1, mask);
        }
        else  if (irq <= IRQ_I2S1)
        {
            // Use interrupt mask register
            mask = 1 << (irq - IRQ_2D);
            SETREG32(&g_pIntrRegs->INTMSK2, mask);
        }
        else if (irq <= IRQ_DMA5)	// irq >= IRQ_DMA0 && irq <= IRQ_DMA5
        {
            //RETAILMSG(1,(TEXT("DMA!! Interrupt Enable!! -- %d\n"),irq));
            SETREG32(&g_pIntrRegs->INTMSK1, 1 << IRQ_DMA);
            mask = 1 << (IRQ_SUB_DMA5 - (IRQ_DMA5 - irq));	
            SETREG32(&g_pIntrRegs->INTSUBMSK, mask);
        }      
        else if (irq <= IRQ_DMA7)	// irq >= IRQ_DMA6 && irq <= IRQ_DMA7
        {
            //RETAILMSG(1,(TEXT("DMA!! Interrupt Enable!! -- %d\n"),irq));
            SETREG32(&g_pIntrRegs->INTMSK1, 1 << IRQ_DMA);
            mask = 1 << (IRQ_SUB_DMA7 - (IRQ_DMA7 - irq));	
            SETREG32(&g_pIntrRegs->INTSUBMSK, mask);
        }
        else if (irq <= IRQ_CAM_P)
        {
            SETREG32(&g_pIntrRegs->INTMSK1, 1 << IRQ_CAM);
            mask = 1 << (IRQ_SUB_CAM_P - (IRQ_CAM_P - irq));
            SETREG32(&g_pIntrRegs->INTSUBMSK, mask);
        }
        else if(irq <= IRQ_LCD_VSYNC)
        {
            SETREG32(&g_pIntrRegs->INTMSK1, 1 << IRQ_LCD);
            SETREG32(&g_pIntrRegs->INTSUBMSK, 1 << IRQ_SUB_LCD3);
        }
        else if (irq <= IRQ_LAST)
        {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            SETREG32(&g_pPortRegs->EINTMASK, mask);
        }
    }
#endif
    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALIntrDisableIrqs\r\n"));
}

//------------------------------------------------------------------------------
//
//  Function:  OALIntrDoneIrqs
//
VOID OALIntrDoneIrqs(UINT32 count, const UINT32 *pIrqs)
{
    UINT32 i, mask, irq;

    OALMSG(OAL_INTR&&OAL_VERBOSE, (
        L"+OALIntrDoneIrqs(%d, 0x%08x)\r\n", count, pIrqs
    ));

#if (BSP_TYPE == BSP_SMDK2443)
    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    
        // Depending on IRQ number use internal or external mask register
        
        if (irq == IRQ_CFCON) {
            // Use interrupt mask register
            g_pATAPIRegs->ATA_IRQ = 0xff;
       	    g_pATAPIRegs->ATA_IRQ_MASK = 0xffffffe0;           
            mask = 1 << irq;
            OUTREG32(&g_pIntrRegs->SRCPND, mask);
            CLRREG32(&g_pIntrRegs->INTMSK, mask);
        } else if (irq <= IRQ_ADC) {
            // Use interrupt mask register
            mask = 1 << irq;
            OUTREG32(&g_pIntrRegs->SRCPND, mask);
            CLRREG32(&g_pIntrRegs->INTMSK, mask);
        } else if (irq <= IRQ_EINT23) {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            OUTREG32(&g_pPortRegs->EINTPEND, mask);
            CLRREG32(&g_pPortRegs->EINTMASK, mask);
        }
        else if( irq <= IRQ_AUDIO)
        {
       	} 
        else if (irq <= IRQ_DMA5)	// irq >= IRQ_DMA0 && irq <= IRQ_DMA5
        {
        	//RETAILMSG(1,(TEXT("DMA!! Interrupt Done!! -- %d\n"),irq));
         	mask = 1 << (IRQ_SUB_DMA5 - (IRQ_DMA5 - irq));	
         	OUTREG32(&g_pIntrRegs->SUBSRCPND, mask);
         	CLRREG32(&g_pIntrRegs->INTSUBMSK, mask);
     	}   
     	else if(irq == IRQ_LCD_VSYNC)
     	{
  			OUTREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_LCD3) );			// Clear LCD3 sub source pending register bit
  			CLRREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_LCD3) );		// masking LCD3 sub interrupt			
     	}  
    }

#elif (BSP_TYPE == BSP_SMDK2450)
    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    
        // Depending on IRQ number use internal or external mask register
        if (irq == IRQ_CFCON) 
        {
            // Use interrupt mask register
            g_pATAPIRegs->ATA_IRQ = 0xff;
       	    g_pATAPIRegs->ATA_IRQ_MASK = 0xffffffe0;
            mask = 1 << irq;
            OUTREG32(&g_pIntrRegs->SRCPND1, mask);
            CLRREG32(&g_pIntrRegs->INTMSK1, mask);
        }
        else if (irq <= IRQ_ADC)
        {
            // Use interrupt mask register
            mask = 1 << irq;
            OUTREG32(&g_pIntrRegs->SRCPND1, mask);
            CLRREG32(&g_pIntrRegs->INTMSK1, mask);
        } 
	    else if (irq <= IRQ_I2S1)
        {
            // Use interrupt mask register
            mask = 1 << (irq - IRQ_2D);
            OUTREG32(&g_pIntrRegs->SRCPND2, mask);
            CLRREG32(&g_pIntrRegs->INTMSK2, mask);
        }
        else if (irq <= IRQ_DMA5)	// irq >= IRQ_DMA0 && irq <= IRQ_DMA5
        {
            //RETAILMSG(1,(TEXT("DMA!! OALIntrDoneIrqs!! -- %d\n"),irq));
            mask = 1 << (IRQ_SUB_DMA5 - (IRQ_DMA5 - irq));
            OUTREG32(&g_pIntrRegs->SUBSRCPND, mask);
            CLRREG32(&g_pIntrRegs->INTSUBMSK, mask);
        }
        else if (irq <= IRQ_DMA7)	// irq >= IRQ_DMA6 && irq <= IRQ_DMA7
        {
            //RETAILMSG(1,(TEXT("DMA!! OALIntrDoneIrqs!! -- %d\n"),irq));
            mask = 1 << (IRQ_SUB_DMA7 - (IRQ_DMA7 - irq));
            OUTREG32(&g_pIntrRegs->SUBSRCPND, mask);
         	CLRREG32(&g_pIntrRegs->INTSUBMSK, mask);
        }
        else if (irq <= IRQ_CAM_P)
        {
            mask = 1 << (IRQ_SUB_CAM_P - (IRQ_CAM_P - irq));
            CLRREG32(&g_pIntrRegs->INTSUBMSK, mask);
        }
        else if(irq <= IRQ_LCD_VSYNC)
        {
            OUTREG32(&g_pIntrRegs->SUBSRCPND, (1<<IRQ_SUB_LCD3) );      // Clear LCD3 sub source pending register bit
  	        CLRREG32(&g_pIntrRegs->INTSUBMSK, (1<<IRQ_SUB_LCD3) );      // masking LCD3 sub interrupt
        }
        else if (irq <= IRQ_LAST)
        {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            OUTREG32(&g_pPortRegs->EINTPEND, mask);
            CLRREG32(&g_pPortRegs->EINTMASK, mask);
        }
    }
#endif
    OALMSG(OAL_INTR&&OAL_VERBOSE, (L"-OALIntrDoneIrqs\r\n"));
}

//------------------------------------------------------------------------------
//
//  Function:  OEMInterruptHandler
//
ULONG OEMInterruptHandler(ULONG ra)
{
#if (BSP_TYPE == BSP_SMDK2443)
    UINT32 sysIntr = SYSINTR_NOP;
    UINT32 irq, irq2, mask;
    static DWORD HeartBeatCnt, HeartBeatStat;  //LED4 is used for heart beat
    static DWORD DMA2CNT=0;
    
    // Get pending interrupt(s)
    irq = INREG32(&g_pIntrRegs->INTOFFSET);

    // System timer interrupt?
    if (irq == IRQ_TIMER4) {

	if (++HeartBeatCnt > 100)
	{
		HeartBeatCnt   = 0;
		HeartBeatStat ^= 1;
		g_pPortRegs->GPFCON = (g_pPortRegs->GPFCON & ~(3<<8)) | (1<<8); // GPF4 Output
		if (HeartBeatStat) 
		{
			g_pPortRegs->GPFDAT &= ~(1<<4); // LED 4 Off
		}
		else
		{
			g_pPortRegs->GPFDAT |=  (1<<4); // LED 4 On
		}
	}

        // 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);
        INREG32(&g_pIntrRegs->INTPND);

        // The rest is up to the profiling interrupt handler (if profiling
        // is enabled).
        //
        if (g_pProfilerISR)
        {
            sysIntr = g_pProfilerISR(ra);
        }
    }
    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);
            INREG32(&g_pIntrRegs->INTPND);

            // 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));
	        	  INREG32(&g_pIntrRegs->INTPND);
	        	  //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));
	        	  INREG32(&g_pIntrRegs->INTPND);
	        	  //RETAILMSG(1,(TEXT("PreView\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));
        		INREG32(&g_pIntrRegs->INTPND);
        	       // RETAILMSG(1,(TEXT("nop\r\n")));        		
        		return SYSINTR_NOP; 
        	}
        }
		else if(irq == IRQ_LCD)
		{    
			sysIntr = SYSINTR_NOP;

⌨️ 快捷键说明

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