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

📄 interrupt.c

📁 Ep93XX TionProV2 BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
        case SYSINTR_UART1:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_UART1;
            break;

        case SYSINTR_UART2:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_UART2;
            break;

        case SYSINTR_UART3:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_UART3;
            break;            

        case SYSINTR_KEYBOARD:
            *pulInterruptMask1  = INT1_KEYPAD;
            *pulInterruptMask2  = 0;
            break;

        case SYSINTR_SPI:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_SPI;
            break;

        case SYSINTR_RTC_ALARM:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_RTC;
            break;

        case SYSINTR_DMA0:
        case SYSINTR_DMA1:
        //case SYSINTR_DMA2:
        //case SYSINTR_DMA3:
        //case SYSINTR_DMA4:
        //case SYSINTR_DMA5:
        //case SYSINTR_DMA6:
        //case SYSINTR_DMA7:
        //case SYSINTR_DMA8:
        //case SYSINTR_DMA9:
            *pulInterruptMask1  = INT1_DMAM2P0<< (dwSysIntr - SYSINTR_DMA0);
            *pulInterruptMask2  = 0;
            break;

        case SYSINTR_TOUCH:
            *pulInterruptMask1  = INT1_TOUCH;
            *pulInterruptMask2  = 0;
            break;

        case SYSINTR_TIMER2:
            *pulInterruptMask1  = INT1_TIMER2;
            *pulInterruptMask2  = 0;
            break;

#ifdef EDB9315A_CIR
		case SYSINTR_PIO_CIR:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_GPIO;
            break;
#else
        case SYSINTR_IR:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_IRDA;
            break;
#endif
        case SYSINTR_IDE:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_EXT3;
            break;

#ifdef EP93XX_SIMULAT_PS2_KBD

        case SYSINTR_PS2_PORT:

			//RETAILMSG(1, (TEXT("SYSINTR_PS2_PORT\r\n")));
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = 0; // the PS2 KeyBoard driver only  see a pseudo interrupt. so don't care the interrupt.
            break;

#endif


#ifdef   EP93XX_SD_MMC

	 case SYSINTR_CARD_RESPONSE:
		 //RETAILMSG(1,(L"SD_MMC response done\n"));
           *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_EXT1;
            break;

	 case SYSINTR_CARD_DETECT:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_EXT1;
            break;	

#elif  EP93XX_MS_CARD

	 case SYSINTR_CARD_RESPONSE:

		    *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_EXT2;
            break;

	 case SYSINTR_CARD_DETECT:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_EXT2;
            break;
#endif

#ifdef EP93XX_USB_SLAVE

        case SYSINTR_USBSLAVE:

			//RETAILMSG(1, (TEXT("SYSINTR_PS2_PORT\r\n")));
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_EXT0; // the PS2 KeyBoard driver only  see a pseudo interrupt. so don't care the interrupt.
            break;

#endif

        case SYSINTR_PCMCIA_LEVEL:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = INT2_PCMCIA_IRQ;
            break;
        case SYSINTR_PCMCIA_STATE:
            *pulInterruptMask1  = INT1_PCMCIA_CD1 | INT1_PCMCIA_CD2 | INT1_PCMCIA_BVD1;
            *pulInterruptMask2  = INT2_PCMCIA_BVD2;
            break;
    
        case SYSINTR_DMA_M2M0:
            *pulInterruptMask1  = INT1_DMAM2M0;
            *pulInterruptMask2  = 0;
            break;
        case SYSINTR_DMA_M2M1:
            *pulInterruptMask1  = INT1_DMAM2M1;
            *pulInterruptMask2  = 0;
            break;

        case SYSINTR_PIO_PLAYBACK:
            *pulInterruptMask1  = INT1_UNUSED1;
            *pulInterruptMask2  = 0;
            break;

        case SYSINTR_PIO_RECORD:
            *pulInterruptMask1  = INT1_UNUSED2;
            *pulInterruptMask2  = 0;
            break;
        default:
            *pulInterruptMask1  = 0;
            *pulInterruptMask2  = 0;
            bRet = FALSE;
            break;
    }
    return bRet;
}


/*
 * @func   BOOL | OEMInterruptEnable | Enable a hardware interrupt
 *
 * @parms
 *         idInt   Interrupt ID to be enabled.
 *                 See Interrupt ID's.Interrupt ID's>  for a list of
 *                 possble values.
 *
 *         pvData  ptr to data passed in in the InterruptInitialize() call
 *
 *         cbData  Size of data pointed to by pvData
 *
 * @rdesc  Returns TRUE if valid interrupt ID or FALSE if invalid ID.
 *
 * @comm   This function is called by the Kernel when a device driver
 *         calls InterruptInitialize(). The system is not preemptible
 *         when this function is called.
 *
 * @xref
 *         Overview.Windows CE Kernel OEM Interface
 *         InterruptInitialize
 */
BOOL OEMInterruptEnable(DWORD idInt, LPVOID pvData, DWORD cbData)
{
    BOOL    bRet = TRUE;
    ULONG   ulIntMask1, ulIntMask2;


    bRet = SysIntrNumToInterruptMask(idInt, &ulIntMask1, &ulIntMask2);
  
    INTERRUPTS_OFF();


    if(ulIntMask1)
    {
        *VIC1_INTENABLE     = ulIntMask1;
        gdwInterruptMask1   |= ulIntMask1;
    }

    if(ulIntMask2)
    {
        *VIC2_INTENABLE     = ulIntMask2;
        gdwInterruptMask2   |= ulIntMask2;
    }

    if(idInt ==SYSINTR_SPI)
    {
        fPS2Int             = 0;
    }

    if((idInt == SYSINTR_PIO_PLAYBACK) && (cbData == sizeof(PIOBufferParameters)) )
    {
        PIOBufferParameters *pPIO = (PIOBufferParameters *)pvData;

        sPlayBack.pulPosition   = sPlayBack.pulBuffer = pPIO->pulBuffer = gulTransmitBuffer;
        sPlayBack.ulBufferSize  = pPIO->ulBufferSize;
        sPlayBack.pulBufferEnd  = sPlayBack.pulBuffer + (sPlayBack.ulBufferSize>>2);
        sPlayBack.pulBufferHalf = sPlayBack.pulBuffer + (sPlayBack.ulBufferSize>>3);
        sPlayBack.bEnabled      = FALSE;
        sPlayBack.bIntEnabled   = TRUE;
        gbAC97                  = pPIO->bAC97;

        if(!sRecord.bIntEnabled )
        {
            if(pPIO->bAC97)
            {
                gdwInterruptMask1       |= INT1_AAC;
                *VIC1_INTSELECT         |= INT1_AAC;
                *VIC1_INTENABLE         = INT1_AAC;
            }
            else
            {
                gdwInterruptMask2       |= INT2_SAI;
                *VIC2_INTSELECT         |= INT2_SAI;
                *VIC2_INTENABLE         = INT2_SAI;
            }
        }
    }

    if((idInt == SYSINTR_PIO_RECORD) && (cbData == sizeof(PIOBufferParameters)) )
    {
        PIOBufferParameters *pPIO = (PIOBufferParameters *)pvData;

        sRecord.pulPosition     = sRecord.pulBuffer = pPIO->pulBuffer = gulRecieveBuffer;
        sRecord.ulBufferSize    = pPIO->ulBufferSize;
        sRecord.pulBufferEnd    = sRecord.pulBuffer + (sRecord.ulBufferSize>>2);
        sRecord.pulBufferHalf   = sRecord.pulBuffer + (sRecord.ulBufferSize>>3);
        sRecord.bEnabled        = FALSE;
        sRecord.bIntEnabled     = TRUE;
        gbAC97                  = pPIO->bAC97;

        if(!sPlayBack.bIntEnabled)
        {
            if(pPIO->bAC97)
            {
                gdwInterruptMask1   |= INT1_AAC;
                *VIC1_INTSELECT     |= INT1_AAC;
                *VIC1_INTENABLE     = INT1_AAC;
            }
            else
            {
                gdwInterruptMask2   |= INT2_SAI;
                *VIC2_INTSELECT     |= INT2_SAI;
                *VIC2_INTENABLE     = INT2_SAI;
            }
        }
    }
#ifdef EP93XX_SIMULAT_PS2_KBD
	if( idInt == SYSINTR_PS2_PORT ) //Initialize KeyBoard when driver calls InterruptInitialize( )
	{
		int init_edb931xPS2(void);

        *VIC2_INTENABLE     = INT2_EXT0;
        gdwInterruptMask2   |= INT2_EXT0;
		
		init_edb931xPS2( );
	}
#endif

#ifdef EDB9315A_CIR
	if( idInt == SYSINTR_PIO_CIR ) 
	{
		// Enable EGPIO13 for CIR interrupt.
		UINT value;

	    //OEMWriteDebugByte('E');
	    //OEMWriteDebugByte('\r');
	    //OEMWriteDebugByte('\n');
	    
		gnWi = 0;
		gnKeyCode = 0;

		value = *GPIO_PBDDR;
		value &= ~0x20;
		*GPIO_PBDDR = value; // Set port B as input

		value = *GPIO_BINTEN;
		value &= ~0x20;
		*GPIO_BINTEN = value; // Disable all interrupt.

		*GPIO_BEOI = 0x20; // Clean all previous interrupt

		value = *GPIO_BINTTYPE1;
		value |= 0x20; // edge trigure.
		*GPIO_BINTTYPE1 = value;

		value = *GPIO_BINTTYPE2;
		value &= ~0x20; // Falling edge 
		*GPIO_BINTTYPE2 = value;

		value = *GPIO_BINTEN;
		value |= 0x20; // Enable interrupt
		*GPIO_BINTEN = value;	
	}
#endif

    INTERRUPTS_ON();

    return(bRet);
}

/*
 * @func   BOOL | OEMInterruptDisable | Disable a hardware interrupt
 *
 * @rdesc  none
 *
 * @parms
 *         idInt   Interrupt ID to be disabled.
 *                 See Interrupt ID's.Interrupt ID's>  for a list of
 *                 possble values.
 *
 * @comm   OEMInterruptDisable is called by the Kernel when a device driver
 *         calls <f InterruptDisable>. The system is not preemtible when this
 *         function is called.
 *
 * @xref
 *         Overview.Windows CE Kernel OEM Interface
 *         InterruptDisable
 */
void OEMInterruptDisable(DWORD idInt)
{
    // NKDbgPrintfW(L"OEMInterruptDisable: Interrupt #%02d\r\n", idInt);

    BOOL    bRet = TRUE;
    ULONG   ulIntMask1, ulIntMask2;


    bRet = SysIntrNumToInterruptMask(idInt, &ulIntMask1, &ulIntMask2);
    INTERRUPTS_OFF();

    if(ulIntMask1)
    {
        *VIC1_INTCLEAR      = ulIntMask1;
        gdwInterruptMask1   &= ~ulIntMask1;
    }

    if(ulIntMask2)
    {
        *VIC2_INTCLEAR     = ulIntMask2;
        gdwInterruptMask2  &= ~ulIntMask2;
    }

    if(idInt == SYSINTR_PIO_PLAYBACK )
    {
        if(!sRecord.bIntEnabled)
        {
            if(gbAC97)
            {
                *VIC1_INTCLEAR          = INT1_AAC;
                gdwInterruptMask1       &= ~INT1_AAC;
            }
            else
            {
                *VIC2_INTCLEAR          = INT2_SAI;
                gdwInterruptMask2       &= ~INT2_SAI;
            }
        }
        sPlayBack.bEnabled      = FALSE;
        sPlayBack.bIntEnabled   = FALSE;
    }

    if(idInt == SYSINTR_PIO_RECORD )
    {
        if(!sPlayBack.bIntEnabled)
        {
            if(gbAC97)
            {
                *VIC1_INTCLEAR          = INT1_AAC;
                gdwInterruptMask1       &= ~INT1_AAC;
            }
            else
            {
                *VIC2_INTCLEAR          = INT2_SAI;
                gdwInterruptMask2       &= ~INT2_SAI;
            }
        }
        sRecord.bEnabled        = FALSE;
        sRecord.bIntEnabled     = FALSE;
    }

#ifdef EDB9315A_CIR
	if(idInt == SYSINTR_PIO_CIR )
	{
		// Initialize EGPIO13 for CIR interrupt.
		UINT value;

	    //OEMWriteDebugByte('D');
	    //OEMWriteDebugByte('\r');
	    //OEMWriteDebugByte('\n');
	    
		value = *GPIO_BINTEN;
		value &= ~0x20;	// Disable interrupt.
		*GPIO_BINTEN = value;

		gnWi = 0;
		gnKeyCode = 0;

	}
#endif

    INTERRUPTS_ON();

    return;
}

/*
 * @func   BOOL | OEMInterruptDone | Signal completion of interrupt processing
 *
 * @rdesc  none
 *
 * @parms
 *         idInt   Interrupt ID to be enabled.
 *                 See Interrupt ID's.Interrupt ID's>  for a list of
 *                 possble values.
 *
 * @comm   OEMInterruptDone is called by the Kernel when a device driver
 *         calls InterruptDone(). The system is not preemtible when this
 *         function is called.
 *
 * @xref
 *         Overview.Kernel Interrupt Support
 *         InterruptDone
 */
void OEMInterruptDone(DWORD idInt)
{
    BOOL    bRet = TRUE;
    ULONG   ulIntMask1, ulIntMask2;


    bRet = SysIntrNumToInterruptMask(idInt, &ulIntMask1, &ulIntMask2);

    INTERRUPTS_OFF();

    // NOTE: we expect the interrupt to be turned off at the device.  The
    // state isn't latched in any board-level registers.

    // Enable interrupt.
    //OEMInterruptEnable(idInt, NULL, 0);
    if(idInt == SYSINTR_PIO_PLAYBACK )
    {
        *VIC1_SOFTINTCLEAR  = INT1_UNUSED1;
    }
    if(idInt == SYSINTR_PIO_RECORD )
    {
        *VIC1_SOFTINTCLEAR  = INT1_UNUSED2;
    }
    
#ifdef EDB9315A_CIR
	if(idInt == SYSINTR_PIO_CIR )
	{
		UINT value;
		
	    //OEMWriteDebugByte('N');
	    //OEMWriteDebugByte('\r');
	    //OEMWriteDebugByte('\n');

		//gnWi = 0;
		//gnKeyCode = 0;

		*GPIO_BEOI = 0x20; // Clean previous interrupt

		value = *GPIO_BINTEN;
		value |= 0x20; // Enable interrupt
		*GPIO_BINTEN = value;	
	}
#endif

    if(ulIntMask1)
    {
        *VIC1_INTENABLE     = ulIntMask1;
        // ASSERT(gdwInterruptMask1 & ulIntMask1);
    }

    if(ulIntMask2)
    {
        *VIC2_INTENABLE     = ulIntMask2;
        // ASSERT(gdwInterruptMask2 & ulIntMask2);
    }


    INTERRUPTS_ON();

}

//****************************************************************************
// OEMInitInterrupts
//****************************************************************************
// Initialize the interrupt controller.
// 
//
void OEMInitInterrupts(void )
{
	//
    // Currently, interrupts on generate irq.  No FIQ's are generated.
    //
    *VIC1_INTSELECT     = 0;
    *VIC2_INTSELECT     = 0;

    //
    // Only the timer interrupt will be enabled initially.
    //
    *VIC1_INTCLEAR      = 0xFFFFFFFF;
    *VIC2_INTCLEAR      = 0xFFFFFFFF;

    //
    // Clear all software interrupts.
    //
    *VIC1_SOFTINTCLEAR  = 0xFFFFFFFF;
    *VIC2_SOFTINTCLEAR  = 0xFFFFFFFF;

    //
    // Allow the Vic to be programmed in all modes.
    //
    *VIC1_PROTECTION    = 0;
    *VIC2_PROTECTION    = 0;

    //
    // Even though we are not using the vectored part of the vectored interrupt
    // controller, we must write VECTCURADDR in order to make sure that lower
    // priority interrupts occur.
    //
    // If you don't do these write no interrupts may occur.
    //
    *VIC1_VECTCURADDR = 0;
    *VIC2_VECTCURADDR = 0;

    //
    // Enable the timer interrupt.
    //
    *VIC1_INTENABLE     = INT1_TIMER1;


    //
    // Initialize the PIO Audio Variables to zero.
    //
    sPlayBack.pulBuffer     = (PULONG)gulTransmitBuffer;
    sPlayBack.ulBufferSize  = 0;
    sPlayBack.pulBufferEnd  = 0;
    sPlayBack.pulBufferHalf = 0;
    sPlayBack.pulPosition   = 0;
    sPlayBack.bEnabled      = FALSE;
    sPlayBack.bIntEnabled   = FALSE;


    sRecord.pulBuffer       = (PULONG)gulRecieveBuffer;
    sRecord.ulBufferSize    = 0;
    sRecord.pulBufferEnd    = 0;
    sRecord.pulBufferHalf   = 0;
    sRecord.pulPosition     = 0;
    sRecord.bEnabled        = FALSE;
    sRecord.bIntEnabled     = FALSE;

    gbAC97                  = FALSE; 
}

⌨️ 快捷键说明

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