bsptemplate/asspandvariant/template_assp/assp.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bsptemplate/asspandvariant/template_assp/assp.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,157 @@
+// Copyright (c) 1994-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:
+// template\template_assp\assp.cpp
+// 
+//
+
+#include <template_assp_priv.h>
+
+TemplateAssp* TemplateAssp::Variant=NULL;
+TPhysAddr TemplateAssp::VideoRamPhys;
+
+DECLARE_STANDARD_ASSP()
+
+EXPORT_C TemplateAssp::TemplateAssp()
+	{
+	TemplateAssp::Variant=this;
+	}
+
+extern void MsTimerTick(TAny* aPtr);
+
+EXPORT_C TMachineStartupType TemplateAssp::StartupReason()
+	{
+	__KTRACE_OPT(KBOOT,Kern::Printf("TemplateAssp::StartupReason"));
+#ifdef _DEBUG															// REMOVE THIS
+	TUint s = Kern::SuperPage().iHwStartupReason;
+	__KTRACE_OPT(KBOOT,Kern::Printf("CPU page value %08x", s));
+#endif																	// REMOVE THIS
+	//
+	// TO DO: (mandatory)
+	//
+	// Map the startup reason read from the Super Page to one of TMachineStartupType enumerated values
+	// and return this
+	//
+	return EStartupCold;   // EXAMPLE ONLY
+	}
+
+EXPORT_C void TemplateAssp::Init1()
+	{
+	__KTRACE_OPT(KBOOT,Kern::Printf("TemplateAssp::Init1()"));
+	//
+	// TO DO: (optional)
+	//
+	TemplateInterrupt::Init1();			// initialise the ASSP interrupt controller
+
+	//
+	// TO DO: (optional)
+	//
+	// Initialises any hardware blocks which require early initialisation, e.g. enable and power the LCD, set up
+	// RTC clocks, disable DMA controllers. etc.
+	//
+	}
+
+EXPORT_C void TemplateAssp::Init3()
+	{
+	__KTRACE_OPT(KBOOT,Kern::Printf("TemplateAssp::Init3()"));
+
+	TTemplate::Init3();
+
+	NTimerQ& m=*(NTimerQ*)NTimerQ::TimerAddress();
+	iTimerQ=&m;
+	//
+	// TO DO: (mandatory)
+	//
+	// If Hardware Timer used for System Ticks cannot give exactly the period required store the initial rounding value
+	// here which is updated every time a match occurrs. Note this leads to "wobbly" timers whose exact period change
+	// but averages exactly the required value
+	// e.g.
+	// m.iRounding=-5;
+	//
+	
+	TInt r=Interrupt::Bind(KIntIdOstMatchMsTimer,MsTimerTick,&m);	// bind the System Tick interrupt
+	if (r!=KErrNone)
+		Kern::Fault("BindMsTick",r);
+
+	// 
+	// TO DO: (mandatory)
+	//
+	// Clear any pending OST interrupts and enable any OST match registers.
+	// If possible may reset the OST here (to start counting from a full period). Set the harwdare to produce an 
+	// interrupt on full count
+	//
+
+	r=Interrupt::Enable(KIntIdOstMatchMsTimer);	// enable the System Tick interrupt
+	if (r!=KErrNone)
+		Kern::Fault("EnbMsTick",r);
+
+	// 
+	// TO DO: (optional)
+	//
+	// Allocate physical RAM for video buffer, as per example below. However with some hardware, the Video Buffer
+	// may not reside in main System memory, it may be dedicated memory.
+	//
+	// EXAMPLE ONLY
+	TInt vSize=VideoRamSize();
+	r=Epoc::AllocPhysicalRam(2*vSize,TemplateAssp::VideoRamPhys);
+	if (r!=KErrNone)
+		Kern::Fault("AllocVRam",r);
+	}
+
+EXPORT_C TInt TemplateAssp::MsTickPeriod()
+	{
+	// 
+	// TO DO: (mandatory)
+	//
+	// Return the OST tick period (System Tick) in microseconds ( 10E-06 s ).
+	//
+	return 1000;   // EXAMPLE ONLY
+	}
+
+EXPORT_C TInt TemplateAssp::SystemTimeInSecondsFrom2000(TInt& aTime)
+	{
+	aTime=(TInt)TTemplate::RtcData();
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("RTC READ: %d",aTime));
+	return KErrNone;
+	}
+
+EXPORT_C TInt TemplateAssp::SetSystemTimeInSecondsFrom2000(TInt aTime)
+	{
+	//
+	// TO DO: (optional)
+	//
+	// Check if the RTC is running and is stable
+	//
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Set RTC: %d",aTime));
+	TTemplate::SetRtcData(aTime);
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("RTC: %d",TTemplate::RtcData()));
+	return KErrNone;
+	}
+
+EXPORT_C TUint32 TemplateAssp::NanoWaitCalibration()
+	{
+	// 
+	// TO DO: (mandatory)
+	//
+	// Return the minimum time in nano-seconds that it takes to execute the following code:
+	//	 nanowait_loop:
+	//	 		  subs r0, r0, r1
+	//	 		  bhi nanowait_loop
+	//
+	// If accurate timings are required by the Base Port, then it should provide it's own implementation 
+	// of NanoWait which uses a hardware counter. (See Kern::SetNanoWaitHandler)
+	//
+	
+	return 0;   // EXAMPLE ONLY
+	}
+