diff -r 2fb8b9db1c86 -r d55eb581a87c baseport/syborg/specific/interrupts.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baseport/syborg/specific/interrupts.cia Tue Aug 04 10:28:23 2009 +0100 @@ -0,0 +1,102 @@ +/* +* 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 +#include +#include + +// 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}"); +}