BOOL MC9328MXL_AITC_Driver::ActivateInterrupt( UINT32 Irq_Index, BOOL Fast, HAL_CALLBACK_FPN ISR, void* ISR_Param, UINT8 Priority )
{
    // figure out the interrupt
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index ); if(!IsrVector) return FALSE;

    {
        GLOBAL_LOCK(irq);

        MC9328MXL_AITC& AITC = MC9328MXL::AITC();

        // disable this interrupt while we change it
        AITC.INTDISNUM = IsrVector->Index;

        // set the correct type
        AITC.SetType( IsrVector->Index, Fast );

        // set the correct priority
        AITC.SetPriority( IsrVector->Index, Priority );

        // set the vector
        IsrVector->Handler.Initialize( ISR, ISR_Param );

        // enable the interrupt if we have a vector
        AITC.INTENNUM = IsrVector->Index;
    }

    return TRUE;
}
BOOL LPC24XX_VIC_Driver::ActivateInterrupt( UINT32 Irq_Index, BOOL Fast, HAL_CALLBACK_FPN ISR, void* ISR_Param )
{
    // figure out the interrupt
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index ); if(!IsrVector) return FALSE;

    {
        GLOBAL_LOCK(irq);

        LPC24XX_VIC& VIC = LPC24XX::VIC();

        // disable this interrupt while we change it
        VIC.INTENCLR = 1 << IsrVector->Index;

        // set the vector
        IsrVector->Handler.Initialize( ISR, ISR_Param );
        
        // Use Vector Address register to identify the source of interrupt
        VIC.VECTADDR[Irq_Index] = Irq_Index;

        // enable the interrupt if we have a vector
        VIC.INTENABLE = 1 << IsrVector->Index;
    }

    return TRUE;
}
BOOL AT91_AIC_Driver::ActivateInterrupt(UINT32 Irq_Index, BOOL Fast, HAL_CALLBACK_FPN ISR, void* ISR_Param)
{
    // figure out the interrupt
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index );
    if(!IsrVector) 
        return FALSE;

    AT91_AIC &aic = AT91::AIC();

    GLOBAL_LOCK(irq);

    // disable this interrupt while we change it
    aic.AIC_IDCR= (0x01 << Irq_Index);

    // Clear the interrupt on the interrupt controller
    aic.AIC_ICCR = (0x01 << Irq_Index);
        
    // set the vector
    IsrVector->Handler.Initialize( ISR, ISR_Param );

    // enable the interrupt if we have a vector
    aic.AIC_IECR= 0x01<<Irq_Index;

    return TRUE;
}
BOOL MC9328MXL_AITC_Driver::InterruptDisable( UINT32 Irq_Index )
{
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index );

    if(!IsrVector) return 0;

    MC9328MXL_AITC& AITC = MC9328MXL::AITC();

    GLOBAL_LOCK(irq);

    BOOL WasEnabled = AITC.IsInterruptEnabled( Irq_Index );

    AITC.INTDISNUM = IsrVector->Index;

    return WasEnabled;
}
BOOL LPC24XX_VIC_Driver::InterruptDisable( UINT32 Irq_Index )
{
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index );

    if(!IsrVector) return 0;

    LPC24XX_VIC& VIC = LPC24XX::VIC();

    GLOBAL_LOCK(irq);

    BOOL WasEnabled = VIC.IsInterruptEnabled( Irq_Index );

    VIC.INTENCLR = 1 << IsrVector->Index;

    return WasEnabled;
}
BOOL MC9328MXL_AITC_Driver::DeactivateInterrupt( UINT32 Irq_Index )
{
    // figure out the interrupt
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index ); if(!IsrVector) return FALSE;

    {
        GLOBAL_LOCK(irq);

        MC9328MXL_AITC& AITC = MC9328MXL::AITC();

        // disable this interrupt while we change it
        AITC.INTDISNUM = IsrVector->Index;

        IsrVector->Handler.Initialize( STUB_ISRVector, (void*)(size_t)IsrVector->Index );
    }

    return TRUE;
}
BOOL LPC24XX_VIC_Driver::DeactivateInterrupt( UINT32 Irq_Index )
{
    // figure out the interrupt
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index ); if(!IsrVector) return FALSE;

    {
        GLOBAL_LOCK(irq);

        LPC24XX_VIC& VIC = LPC24XX::VIC();

        // disable this interrupt while we change it
        VIC.INTENCLR = 1 << IsrVector->Index;

        IsrVector->Handler.Initialize( STUB_ISRVector, (void*)(size_t)IsrVector->Index );
    }

    return TRUE;
}
BOOL CPU_INTC_DeactivateInterrupt(UINT32 Irq_Index)
{
	// figure out the interrupt
	IRQ_VECTORING* IsrVector = IRQToIRQVector(Irq_Index);

	if (!IsrVector)
		return FALSE;

	GLOBAL_LOCK(irq);

	IRQ_ClearIT(Irq_Index);

	IRQ_DisableIT(Irq_Index);

	// as it is stub, just put the Priority to the ISR parameter
	IsrVector->Handler.Initialize(STUB_ISRVector, (void*)(size_t)IsrVector->Priority);

	return TRUE;
}
BOOL CPU_INTC_ActivateInterrupt(UINT32 Irq_Index, HAL_CALLBACK_FPN ISR, void* ISR_Param)
{
	// figure out the interrupt
	IRQ_VECTORING* IsrVector = IRQToIRQVector(Irq_Index);

	if (!IsrVector)
		return FALSE;

	GLOBAL_LOCK(irq);

	IRQ_DisableIT(Irq_Index);

	IRQ_ClearIT(Irq_Index);

	// set the vector
	IsrVector->Handler.Initialize(ISR, ISR_Param);

	IRQ_EnableIT(Irq_Index);

	return TRUE;
}
BOOL AT91_AIC_Driver::DeactivateInterrupt( UINT32 Irq_Index )
{
    // figure out the interrupt
    IRQ_VECTORING* IsrVector = IRQToIRQVector( Irq_Index );

    if(!IsrVector)
        return FALSE;

    GLOBAL_LOCK(irq);

    AT91_AIC &aic = AT91::AIC();

    // Clear the interrupt on the Interrupt Controller ( if one is pending )
    aic.AIC_ICCR = (1 << Irq_Index);

    // Disable the interrupt on the interrupt controller
    aic.AIC_IDCR = (1 << Irq_Index);

    // as it is stub, just put the Priority to the ISR parameter
    IsrVector->Handler.Initialize( STUB_ISRVector, (void*)(size_t)IsrVector->Priority );

    return TRUE;
}