sl@0: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // template\template_assp\interrupts.cpp sl@0: // Template ASSP interrupt control and dispatch sl@0: // sl@0: // sl@0: sl@0: #include sl@0: sl@0: SInterruptHandler TemplateInterrupt::Handlers[KNumTemplateInts]; sl@0: sl@0: void TemplateInterrupt::DisableAndClearAll() sl@0: { sl@0: // sl@0: // TO DO: (mandatory) sl@0: // sl@0: // Disable and clear all Hardware Interrupt sources sl@0: // sl@0: } sl@0: sl@0: void TemplateInterrupt::Init1() sl@0: { sl@0: // sl@0: // need to hook the ARM IRQ and FIQ handlers as early as possible and disable and clear all interrupt sources sl@0: // sl@0: __KTRACE_OPT(KBOOT,Kern::Printf("TemplateInterrupt::Init1()")); sl@0: TInt i; sl@0: for (i=0; i>16)&0x7fff)<(TUint)KNumTemplateInts) sl@0: r=TemplateAssp::Variant->InterruptBind(anId,anIsr,aPtr); sl@0: else if ((TUint)anId >= (TUint)KNumTemplateInts) sl@0: r=KErrArgument; sl@0: else sl@0: { sl@0: SInterruptHandler& h=TemplateInterrupt::Handlers[anId]; sl@0: TInt irq=NKern::DisableAllInterrupts(); sl@0: if (h.iIsr != TemplateInterrupt::Spurious) sl@0: r=KErrInUse; sl@0: else sl@0: { sl@0: h.iPtr=aPtr; sl@0: h.iIsr=anIsr; sl@0: } sl@0: NKern::RestoreInterrupts(irq); sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: EXPORT_C TInt Interrupt::Unbind(TInt anId) sl@0: { sl@0: __KTRACE_OPT(KEXTENSION,Kern::Printf("Interrupt::Unbind id=%d",anId)); sl@0: TInt r=KErrNone; sl@0: // if ID indicates a chained interrupt, call variant... sl@0: if (anId<0 && ((((TUint)anId)>>16)&0x7fff)<(TUint)KNumTemplateInts) sl@0: r=TemplateAssp::Variant->InterruptUnbind(anId); sl@0: else if ((TUint)anId >= (TUint)KNumTemplateInts) sl@0: r=KErrArgument; sl@0: else sl@0: { sl@0: SInterruptHandler& h=TemplateInterrupt::Handlers[anId]; sl@0: TInt irq=NKern::DisableAllInterrupts(); sl@0: if (h.iIsr == TemplateInterrupt::Spurious) sl@0: r=KErrGeneral; sl@0: else sl@0: { sl@0: h.iPtr=(TAny*)anId; sl@0: h.iIsr=TemplateInterrupt::Spurious; sl@0: // sl@0: // TO DO: (mandatory) sl@0: // sl@0: // Disable the corresponding Hardware Interrupt source sl@0: // sl@0: } sl@0: NKern::RestoreInterrupts(irq); sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: EXPORT_C TInt Interrupt::Enable(TInt anId) sl@0: { sl@0: __KTRACE_OPT(KEXTENSION,Kern::Printf("Interrupt::Enable id=%d",anId)); sl@0: TInt r=KErrNone; sl@0: // if ID indicates a chained interrupt, call variant... sl@0: if (anId<0 && ((((TUint)anId)>>16)&0x7fff)<(TUint)KNumTemplateInts) sl@0: r=TemplateAssp::Variant->InterruptEnable(anId); sl@0: else if ((TUint)anId>=(TUint)KNumTemplateInts) sl@0: r=KErrArgument; sl@0: else if (TemplateInterrupt::Handlers[anId].iIsr==TemplateInterrupt::Spurious) sl@0: r=KErrNotReady; sl@0: else sl@0: { sl@0: // sl@0: // TO DO: (mandatory) sl@0: // sl@0: // Enable the corresponding Hardware Interrupt source sl@0: // sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: EXPORT_C TInt Interrupt::Disable(TInt anId) sl@0: { sl@0: __KTRACE_OPT(KEXTENSION,Kern::Printf("Interrupt::Disable id=%d",anId)); sl@0: TInt r=KErrNone; sl@0: // if ID indicates a chained interrupt, call variant... sl@0: if (anId<0 && ((((TUint)anId)>>16)&0x7fff)<(TUint)KNumTemplateInts) sl@0: r=TemplateAssp::Variant->InterruptDisable(anId); sl@0: else if ((TUint)anId>=(TUint)KNumTemplateInts) sl@0: r=KErrArgument; sl@0: else sl@0: { sl@0: // sl@0: // TO DO: (mandatory) sl@0: // sl@0: // Disable the corresponding Hardware Interrupt source sl@0: // sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: EXPORT_C TInt Interrupt::Clear(TInt anId) sl@0: { sl@0: __KTRACE_OPT(KEXTENSION,Kern::Printf("Interrupt::Clear id=%d",anId)); sl@0: TInt r=KErrNone; sl@0: // if ID indicates a chained interrupt, call variant... sl@0: if (anId<0 && ((((TUint)anId)>>16)&0x7fff)<(TUint)KNumTemplateInts) sl@0: r=TemplateAssp::Variant->InterruptClear(anId); sl@0: else if ((TUint)anId>=(TUint)KNumTemplateInts) sl@0: r=KErrArgument; sl@0: else sl@0: { sl@0: // sl@0: // TO DO: (mandatory) sl@0: // sl@0: // Clear the corresponding Hardware Interrupt source sl@0: // sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: EXPORT_C TInt Interrupt::SetPriority(TInt /*anId*/, TInt /*aPriority*/) sl@0: { sl@0: // sl@0: // If Interrupt priorities are supported the dispatchers need to take this in consideration sl@0: // (IrqDispatch/FiqDispatch) sl@0: // sl@0: return KErrNotSupported; sl@0: }