From 9203284167b16a0f3ed08c679d200b8bf293d7a2 Mon Sep 17 00:00:00 2001 From: andrewfish Date: Tue, 18 May 2010 01:19:01 +0000 Subject: [PATCH] Get TimerDxe driver compiling. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10497 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmEbPkg/ArmEbPkg.dsc | 1 + ArmEbPkg/ArmEbPkg.fdf | 3 ++ ArmEbPkg/Include/ArmEb/ArmEb.h | 1 + ArmEbPkg/Include/ArmEb/ArmEbTimer.h | 78 +++++++++++++++++++++++++++++ ArmEbPkg/TimerDxe/Timer.c | 9 ++-- ArmEbPkg/TimerDxe/TimerDxe.inf | 2 +- 6 files changed, 87 insertions(+), 7 deletions(-) create mode 100755 ArmEbPkg/Include/ArmEb/ArmEbTimer.h diff --git a/ArmEbPkg/ArmEbPkg.dsc b/ArmEbPkg/ArmEbPkg.dsc index c17e72979a..41ff7426dd 100644 --- a/ArmEbPkg/ArmEbPkg.dsc +++ b/ArmEbPkg/ArmEbPkg.dsc @@ -351,6 +351,7 @@ EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf ArmEbPkg/InterruptDxe/InterruptDxe.inf + ArmEbPkg/TimerDxe/TimerDxe.inf # # Semi-hosting filesystem diff --git a/ArmEbPkg/ArmEbPkg.fdf b/ArmEbPkg/ArmEbPkg.fdf index d461871e29..e5051e03b8 100755 --- a/ArmEbPkg/ArmEbPkg.fdf +++ b/ArmEbPkg/ArmEbPkg.fdf @@ -108,6 +108,9 @@ READ_LOCK_STATUS = TRUE INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + INF ArmEbPkg/InterruptDxe/InterruptDxe.inf + INF ArmEbPkg/TimerDxe/TimerDxe.inf + # # Semi-hosting filesystem # diff --git a/ArmEbPkg/Include/ArmEb/ArmEb.h b/ArmEbPkg/Include/ArmEb/ArmEb.h index 3084091681..0018e84eba 100755 --- a/ArmEbPkg/Include/ArmEb/ArmEb.h +++ b/ArmEbPkg/Include/ArmEb/ArmEb.h @@ -15,5 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define __ARM_EB_H__ #include +#include #endif diff --git a/ArmEbPkg/Include/ArmEb/ArmEbTimer.h b/ArmEbPkg/Include/ArmEb/ArmEbTimer.h new file mode 100755 index 0000000000..413bc85773 --- /dev/null +++ b/ArmEbPkg/Include/ArmEb/ArmEbTimer.h @@ -0,0 +1,78 @@ +/*++ + +Copyright (c) 2009, Hewlett-Packard Company +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Timer.h + +Abstract: + + Driver implementing the EFI 2.0 timer protocol using the ARM SP804 timer. + +--*/ + +#ifndef _TIMER_SP804_H__ +#define _TIMER_SP804_H__ + + + +// EB board constants +#define EB_SP810_CTRL_BASE 0x10001000 +#define EB_SP804_TIMER0_BASE 0x10011000 +#define EB_SP804_TIMER1_BASE 0x10011020 +#define EB_SP804_TIMER2_BASE 0x10012000 +#define EB_SP804_TIMER3_BASE 0x10012020 + +#define EB_TIMER01_INTERRUPT_NUM 36 +#define EB_TIMER23_INTERRUPT_NUM 37 + +// SP804 Timer constants +#define SP804_TIMER_LOAD_REG 0x00 +#define SP804_TIMER_CURRENT_REG 0x04 +#define SP804_TIMER_CONTROL_REG 0x08 +#define SP804_TIMER_INT_CLR_REG 0x0C +#define SP804_TIMER_RAW_INT_STS_REG 0x10 +#define SP804_TIMER_MSK_INT_STS_REG 0x14 +#define SP804_TIMER_BG_LOAD_REG 0x18 + +// Timer control register bit definitions +#define SP804_TIMER_CTRL_ONESHOT BIT0 +#define SP804_TIMER_CTRL_32BIT BIT1 +#define SP804_TIMER_CTRL_PRESCALE_MASK (BIT3|BIT2) +#define SP804_PRESCALE_DIV_1 0 +#define SP804_PRESCALE_DIV_16 BIT2 +#define SP804_PRESCALE_DIV_256 BIT3 +#define SP804_TIMER_CTRL_INT_ENABLE BIT5 +#define SP804_TIMER_CTRL_PERIODIC BIT6 +#define SP804_TIMER_CTRL_ENABLE BIT7 + +// SP810 System Controller constants +#define SP810_SYS_CTRL_REG 0x00 +#define SP810_SYS_CTRL_TIMER0_TIMCLK BIT15 // 0=REFCLK, 1=TIMCLK +#define SP810_SYS_CTRL_TIMER0_EN BIT16 +#define SP810_SYS_CTRL_TIMER1_TIMCLK BIT17 // 0=REFCLK, 1=TIMCLK +#define SP810_SYS_CTRL_TIMER1_EN BIT18 +#define SP810_SYS_CTRL_TIMER2_TIMCLK BIT19 // 0=REFCLK, 1=TIMCLK +#define SP810_SYS_CTRL_TIMER2_EN BIT20 +#define SP810_SYS_CTRL_TIMER3_TIMCLK BIT21 // 0=REFCLK, 1=TIMCLK +#define SP810_SYS_CTRL_TIMER3_EN BIT22 + +// default timer tick period - 1ms, or 10000 units of 100ns +//#define TIMER_DEFAULT_PERIOD 10000 + +// default timer tick period - 50ms, or 500000 units of 100ns +#define TIMER_DEFAULT_PERIOD 500000 + +// default timer tick period - 500ms, or 5000000 units of 100ns +//#define TIMER_DEFAULT_PERIOD 5000000 + +#endif + diff --git a/ArmEbPkg/TimerDxe/Timer.c b/ArmEbPkg/TimerDxe/Timer.c index 397f05362b..a034eef0f2 100755 --- a/ArmEbPkg/TimerDxe/Timer.c +++ b/ArmEbPkg/TimerDxe/Timer.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -44,6 +43,8 @@ EFI_HARDWARE_INTERRUPT_PROTOCOL *gInterrupt = NULL; // Cached interrupt vector UINTN gVector; +UINT32 mLastTickCount; + /** @@ -184,7 +185,7 @@ TimerDriverSetTimerPeriod ( Status = gInterrupt->DisableInterruptSource (gInterrupt, gVector); } else { // Convert TimerPeriod into 1MHz clock counts (us units = 100ns units / 10) - TimerTicks = DivU64x32 (TimerPeriod, 10, NULL); + TimerTicks = DivU64x32 (TimerPeriod, 10); // if it's larger than 32-bits, pin to highest value if (TimerTicks > 0xffffffff) { @@ -352,10 +353,6 @@ TimerInitialize ( // Disable the timer Status = TimerDriverSetTimerPeriod (&gTimer, 0); ASSERT_EFI_ERROR (Status); - - // Install interrupt handler for SP804 timer 0/1 interrupts - Status = mGic->RegisterInterruptHandler(mGic, EB_TIMER01_INTERRUPT_NUM, TimerInterruptHandler); - ASSERT_EFI_ERROR (Status); // Install interrupt handler gVector = EB_TIMER01_INTERRUPT_NUM; diff --git a/ArmEbPkg/TimerDxe/TimerDxe.inf b/ArmEbPkg/TimerDxe/TimerDxe.inf index 033ef5716a..49ee0377be 100755 --- a/ArmEbPkg/TimerDxe/TimerDxe.inf +++ b/ArmEbPkg/TimerDxe/TimerDxe.inf @@ -28,7 +28,7 @@ [Packages] MdePkg/MdePkg.dec EmbeddedPkg/EmbeddedPkg.dec - ArmPkg/ArmPkg.dec + ArmEbPkg/ArmEbPkg.dec [LibraryClasses] BaseLib