--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/personality/example/isr.cpp Thu Dec 17 09:24:54 2009 +0200
@@ -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 <personality/example/personality.h>
+
+#if defined(__MAWD__)
+#include <windermere.h>
+#elif defined(__MISA__)
+#define __ISR_SUPPORTED__
+#include <sa1100.h>
+#elif defined(__MCOT__)
+#define __ISR_SUPPORTED__
+#include <cotulla.h>
+#elif defined(__MI920__) || defined(__NI1136__)
+#include <integratorap.h>
+#elif defined(__EPOC32__) && defined(__CPU_X86)
+#include <x86.h>
+#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;
+ }
+