baseport/syborg/specific/interrupts.cia
author johnathan.white@2718R8BGH51.accenture.com
Mon, 08 Mar 2010 18:45:03 +0000
changeset 46 b6935a90ca64
parent 2 d55eb581a87c
child 76 8e8bf3dcfd6b
child 79 80387fbc46c5
permissions -rw-r--r--
Modify framebuffer and NGA framebuffer to read screen size from board model dtb file. Optimise memory usuage of frame buffer Add example minigui application with hooks to profiler (which writes results to S:\). Modified NGA framebuffer to run its own dfc queue at high priority

/*
* Copyright (c) 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: Syborg interrupt control and dispatch
*
*/

#include <e32cia.h>
#include <syborg_priv.h>
#include <cpudefs.h>

// CIA symbols for ASSP code?
#if defined(__GCC32__)
// CIA symbol macros for Gcc98r2
#define CSM_ZN7NTimerQ4TickEv " Tick__7NTimerQ"
#elif defined(__ARMCC__)
// CIA symbol macros for RVCT
#define CSM_ZN7NTimerQ4TickEv " __cpp(NTimerQ::Tick)"
#else
// CIA symbol macros for EABI assemblers
#define CSM_ZN7NTimerQ4TickEv " _ZN7NTimerQ4TickEv"
#endif

/********************************************************************
 * Wait for interrupt idle routine which does not disable interrupts
 ********************************************************************/
 
__NAKED__ void SyborgWFIIdle()
{
	// Enter an idle state and wait for interrupts
	asm("mov r0, #0");
	asm("mcr p15, 0, r0, c7, c0, 4");
	asm("bx lr");
}

/********************************************************************
 * Service 1ms tick interrupt & timer 1 interrupt
 ********************************************************************/

__NAKED__ void SyborgInterrupt::MsTimerTick(TAny* /*aPtr*/)
{
	// Service 1ms tick interrupt
	asm("ldr r1, __KHwCounterTimer");
	asm("push {r0}");
	asm("mov r0, #1");
	asm("str r0, [r1, #24]");
	asm("pop {r0}");
	asm("b "CSM_ZN7NTimerQ4TickEv);
	asm("bx lr");

	asm("__KHwCounterTimer:");
	asm(".word %a0" : : "i" ((TInt)KHwBaseCounterTimer));
}

/********************************************************************
 * Interrupt handling/dispatch
 ********************************************************************/
// IRQ dispatcher
// Enter with r0-r3, r12 and return address on IRQ stack
// Must preserve r4-r11
// Uses r4,r5,r12
__NAKED__ void SyborgInterrupt::IrqDispatch()
{
	asm("push {r4,r5,lr} ");
	asm("ldr r4, __KHwBaseSic");
	asm("ldr r12, __SicHandlerStart");
	asm("ldr r5, [r4, #8]");  // r5 - pending interrupt
	asm("adr lr, Clear");
	asm("add r12, r5, lsl #3");
	asm("ldm r12, {r0, pc}");
	
	asm("Clear:");
	//	asm("str r5, [r4, #16]");        // TODO: error
	asm("pop {r4,r5,pc}");

	asm("__KHwBaseSic:");
	asm(".word %a0" : : "i" ((TInt)KHwBaseSic));
	asm("__SicHandlerStart:");
	asm(".word %a0" : : "i" ((TInt)&Handlers[0]));
}

__NAKED__ void SyborgInterrupt::FiqDispatch()
{
	// FIQ dispatcher
	// Enter with return address on FIQ stack
	// We may use r8-r12, but must preserve other registers
	// NOTE: STACK IS MISALIGNED ON ENTRY (1 WORD PUSHED)
	asm("push {r0-r3,lr}");
	// FIQ Handler to go in here.
	// Not needed because no FIQs are currently used
	asm("pop {r0-r3,pc}");
}