kerneltest/e32test/personality/example/isr.cpp
changeset 0 a41df078684a
--- /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 <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;
+	}
+