diff -r 000000000000 -r a41df078684a kerneltest/e32test/personality/example/isr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/personality/example/isr.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,118 @@ +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\personality\example\isr.cpp +// Test code for example RTOS personality. +// +// + +#include "plat_priv.h" +#include + +#if defined(__MAWD__) +#include +#elif defined(__MISA__) +#define __ISR_SUPPORTED__ +#include +#elif defined(__MCOT__) +#define __ISR_SUPPORTED__ +#include +#elif defined(__MI920__) || defined(__NI1136__) +#include +#elif defined(__EPOC32__) && defined(__CPU_X86) +#include +#endif + +#ifdef __ISR_SUPPORTED__ +#include "../../misc/prbs.h" +#endif + +extern "C" void stop_random_isr(void); + +typedef void (*isr_entry)(unsigned); + +volatile TUint RandomSeed[2] = {0xb504f333u, 0xf9de6484u}; +volatile isr_entry IsrVector = 0; +volatile TUint IsrCount = 0; + +void timer_isr(void*) + { +#if defined(__MISA__) + TUint interval = Random((TUint*)RandomSeed); + interval &= 0x3ff; + interval += 256; // 256-1279 ticks = approx 69 to 347 microseconds + TUint oscr=TSa1100::OstData(); + TSa1100::SetOstMatch(KHwOstMatchGeneral, oscr + interval); + TSa1100::SetOstMatchEOI(KHwOstMatchGeneral); +#elif defined(__MCOT__) + TUint interval = Random((TUint*)RandomSeed); + interval &= 0x3ff; + interval += 256; // 256-1279 ticks = approx 69 to 347 microseconds + TUint oscr=TCotulla::OstData(); + TCotulla::SetOstMatch(KHwOstMatchGeneral, oscr + interval); + TCotulla::SetOstMatchEOI(KHwOstMatchGeneral); +#endif + (*IsrVector)(IsrCount++); + } + +#ifdef __ISR_SUPPORTED__ +void start_timer(void) + { +#if defined(__MISA__) + // for SA11x0 use OST match 0 + TInt r=Interrupt::Bind(KIntIdOstMatchGeneral, &timer_isr, 0); + assert(r==KErrNone); + TSa1100::ModifyIntLevels(0,KHtIntsOstMatchGeneral); // route new timer interrupt to FIQ + TSa1100::SetOstMatchEOI(KHwOstMatchGeneral); + TUint oscr=TSa1100::OstData(); + TSa1100::SetOstMatch(KHwOstMatchGeneral, oscr + 5000); + TSa1100::EnableOstInterrupt(KHwOstMatchGeneral); + Interrupt::Enable(KIntIdOstMatchGeneral); +#elif defined(__MCOT__) + // for SA11x0 use OST match 0 + TInt r=Interrupt::Bind(KIntIdOstMatchGeneral, &timer_isr, 0); + assert(r==KErrNone); + TCotulla::ModifyIntLevels(0,KHtIntsOstMatchGeneral); // route new timer interrupt to FIQ + TCotulla::SetOstMatchEOI(KHwOstMatchGeneral); + TUint oscr=TCotulla::OstData(); + TCotulla::SetOstMatch(KHwOstMatchGeneral, oscr + 5000); + TCotulla::EnableOstInterrupt(KHwOstMatchGeneral); + Interrupt::Enable(KIntIdOstMatchGeneral); +#endif + } +#endif + +extern "C" int start_random_isr(isr_entry vector) + { + stop_random_isr(); + IsrVector = vector; +#ifdef __ISR_SUPPORTED__ + start_timer(); + return OK; +#else + return KErrNotSupported; +#endif + } + +extern "C" void stop_random_isr(void) + { +#if defined(__MISA__) + Interrupt::Disable(KIntIdOstMatchGeneral); + Interrupt::Unbind(KIntIdOstMatchGeneral); +#elif defined(__MCOT__) + Interrupt::Disable(KIntIdOstMatchGeneral); + Interrupt::Unbind(KIntIdOstMatchGeneral); +#endif + IsrVector = 0; + } +