1 /* 2 * PROJECT: ReactOS HAL 3 * LICENSE: BSD - See COPYING.ARM in the top level directory 4 * FILE: hal/halarm/generic/timer.c 5 * PURPOSE: Timer Routines 6 * PROGRAMMERS: ReactOS Portable Systems Group 7 */ 8 9 /* INCLUDES *******************************************************************/ 10 11 #include <hal.h> 12 #define NDEBUG 13 #include <debug.h> 14 15 VOID 16 FASTCALL 17 KeUpdateSystemTime( 18 IN PKTRAP_FRAME TrapFrame, 19 IN ULONG Increment, 20 IN KIRQL OldIrql 21 ); 22 23 /* GLOBALS ********************************************************************/ 24 25 ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; 26 27 /* PRIVATE FUNCTIONS **********************************************************/ 28 29 VOID 30 HalpClockInterrupt(VOID) 31 { 32 /* Clear the interrupt */ 33 ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL); 34 WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); 35 36 /* FIXME: Update HAL Perf counters */ 37 38 /* FIXME: Check if someone changed the clockrate */ 39 40 /* Call the kernel */ 41 KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame, 42 HalpCurrentTimeIncrement, 43 CLOCK2_LEVEL); 44 } 45 46 VOID 47 HalpStallInterrupt(VOID) 48 { 49 /* Clear the interrupt */ 50 WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); 51 } 52 53 VOID 54 HalpInitializeClock(VOID) 55 { 56 PKIPCR Pcr = (PKIPCR)KeGetPcr(); 57 ULONG ClockInterval; 58 SP804_CONTROL_REGISTER ControlRegister; 59 60 /* Setup the clock and profile interrupt */ 61 Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt; 62 63 /* 64 * Configure the interval to 10ms 65 * (INTERVAL (10ms) * TIMCLKfreq (1MHz)) 66 * --------------------------------------- == 10^4 67 * (TIMCLKENXdiv (1) * PRESCALEdiv (1)) 68 */ 69 ClockInterval = 0x2710; 70 71 /* Configure the timer */ 72 ControlRegister.AsUlong = 0; 73 ControlRegister.Wide = TRUE; 74 ControlRegister.Periodic = TRUE; 75 ControlRegister.Interrupt = TRUE; 76 ControlRegister.Enabled = TRUE; 77 78 /* Enable the timer */ 79 WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval); 80 WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong); 81 } 82 83 /* PUBLIC FUNCTIONS ***********************************************************/ 84 85 /* 86 * @implemented 87 */ 88 VOID 89 NTAPI 90 HalCalibratePerformanceCounter(IN volatile PLONG Count, 91 IN ULONGLONG NewCount) 92 { 93 UNIMPLEMENTED; 94 while (TRUE); 95 } 96 97 /* 98 * @implemented 99 */ 100 ULONG 101 NTAPI 102 HalSetTimeIncrement(IN ULONG Increment) 103 { 104 UNIMPLEMENTED; 105 while (TRUE); 106 return Increment; 107 } 108 109 /* 110 * @implemented 111 */ 112 VOID 113 NTAPI 114 KeStallExecutionProcessor(IN ULONG Microseconds) 115 { 116 SP804_CONTROL_REGISTER ControlRegister; 117 118 /* Enable the timer */ 119 WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds); 120 121 /* Configure the timer */ 122 ControlRegister.AsUlong = 0; 123 ControlRegister.OneShot = TRUE; 124 ControlRegister.Wide = TRUE; 125 ControlRegister.Periodic = TRUE; 126 ControlRegister.Enabled = TRUE; 127 WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong); 128 129 /* Now we will loop until the timer reached 0 */ 130 while (READ_REGISTER_ULONG(TIMER1_VALUE)); 131 } 132 133 /* 134 * @implemented 135 */ 136 LARGE_INTEGER 137 NTAPI 138 KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq) 139 { 140 LARGE_INTEGER Value; 141 142 UNIMPLEMENTED; 143 while (TRUE); 144 145 Value.QuadPart = 0; 146 return Value; 147 } 148 149 /* EOF */ 150