--- /dev/null
+/*++\r
+\r
+Copyright (c) 2009, Hewlett-Packard Company \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ Timer.h\r
+\r
+Abstract:\r
+\r
+ Driver implementing the EFI 2.0 timer protocol using the ARM SP804 timer.\r
+\r
+--*/\r
+\r
+#ifndef _TIMER_SP804_H__\r
+#define _TIMER_SP804_H__\r
+\r
+\r
+\r
+// EB board constants\r
+#define EB_SP810_CTRL_BASE 0x10001000\r
+#define EB_SP804_TIMER0_BASE 0x10011000\r
+#define EB_SP804_TIMER1_BASE 0x10011020\r
+#define EB_SP804_TIMER2_BASE 0x10012000\r
+#define EB_SP804_TIMER3_BASE 0x10012020\r
+\r
+#define EB_TIMER01_INTERRUPT_NUM 36\r
+#define EB_TIMER23_INTERRUPT_NUM 37\r
+\r
+// SP804 Timer constants\r
+#define SP804_TIMER_LOAD_REG 0x00\r
+#define SP804_TIMER_CURRENT_REG 0x04\r
+#define SP804_TIMER_CONTROL_REG 0x08\r
+#define SP804_TIMER_INT_CLR_REG 0x0C\r
+#define SP804_TIMER_RAW_INT_STS_REG 0x10\r
+#define SP804_TIMER_MSK_INT_STS_REG 0x14\r
+#define SP804_TIMER_BG_LOAD_REG 0x18\r
+\r
+// Timer control register bit definitions\r
+#define SP804_TIMER_CTRL_ONESHOT BIT0\r
+#define SP804_TIMER_CTRL_32BIT BIT1\r
+#define SP804_TIMER_CTRL_PRESCALE_MASK (BIT3|BIT2)\r
+#define SP804_PRESCALE_DIV_1 0\r
+#define SP804_PRESCALE_DIV_16 BIT2\r
+#define SP804_PRESCALE_DIV_256 BIT3\r
+#define SP804_TIMER_CTRL_INT_ENABLE BIT5\r
+#define SP804_TIMER_CTRL_PERIODIC BIT6\r
+#define SP804_TIMER_CTRL_ENABLE BIT7\r
+\r
+// SP810 System Controller constants\r
+#define SP810_SYS_CTRL_REG 0x00\r
+#define SP810_SYS_CTRL_TIMER0_TIMCLK BIT15 // 0=REFCLK, 1=TIMCLK\r
+#define SP810_SYS_CTRL_TIMER0_EN BIT16\r
+#define SP810_SYS_CTRL_TIMER1_TIMCLK BIT17 // 0=REFCLK, 1=TIMCLK\r
+#define SP810_SYS_CTRL_TIMER1_EN BIT18\r
+#define SP810_SYS_CTRL_TIMER2_TIMCLK BIT19 // 0=REFCLK, 1=TIMCLK\r
+#define SP810_SYS_CTRL_TIMER2_EN BIT20\r
+#define SP810_SYS_CTRL_TIMER3_TIMCLK BIT21 // 0=REFCLK, 1=TIMCLK\r
+#define SP810_SYS_CTRL_TIMER3_EN BIT22\r
+\r
+// default timer tick period - 1ms, or 10000 units of 100ns\r
+//#define TIMER_DEFAULT_PERIOD 10000\r
+\r
+// default timer tick period - 50ms, or 500000 units of 100ns\r
+#define TIMER_DEFAULT_PERIOD 500000\r
+\r
+// default timer tick period - 500ms, or 5000000 units of 100ns\r
+//#define TIMER_DEFAULT_PERIOD 5000000\r
+\r
+#endif\r
+\r
#include <Library/UefiLib.h>
#include <Library/PcdLib.h>
#include <Library/IoLib.h>
-#include <Library/OmapLib.h>
#include <Protocol/Timer.h>
#include <Protocol/HardwareInterrupt.h>
// Cached interrupt vector
UINTN gVector;
+UINT32 mLastTickCount;
+
/**
Status = gInterrupt->DisableInterruptSource (gInterrupt, gVector);
} else {
// Convert TimerPeriod into 1MHz clock counts (us units = 100ns units / 10)\r
- TimerTicks = DivU64x32 (TimerPeriod, 10, NULL);\r
+ TimerTicks = DivU64x32 (TimerPeriod, 10);\r
\r
// if it's larger than 32-bits, pin to highest value\r
if (TimerTicks > 0xffffffff) {\r
// Disable the timer
Status = TimerDriverSetTimerPeriod (&gTimer, 0);
ASSERT_EFI_ERROR (Status);
-\r
- // Install interrupt handler for SP804 timer 0/1 interrupts\r
- Status = mGic->RegisterInterruptHandler(mGic, EB_TIMER01_INTERRUPT_NUM, TimerInterruptHandler);\r
- ASSERT_EFI_ERROR (Status);\r
// Install interrupt handler
gVector = EB_TIMER01_INTERRUPT_NUM;