[HAL] Fix calculation of timer increment

This commit is contained in:
Timo Kreuzer 2019-12-31 09:39:55 +01:00
parent 64d7db506c
commit 3bbcc16d8e

View file

@ -4,7 +4,9 @@
* FILE: hal/halx86/apic/rtctimer.c * FILE: hal/halx86/apic/rtctimer.c
* PURPOSE: HAL APIC Management and Control Code * PURPOSE: HAL APIC Management and Control Code
* PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
* REFERENCES: * REFERENCES: https://wiki.osdev.org/RTC
* https://forum.osdev.org/viewtopic.php?f=13&t=20825&start=0
* http://www.bioscentral.com/misc/cmosmap.htm
*/ */
/* INCLUDES *******************************************************************/ /* INCLUDES *******************************************************************/
@ -24,16 +26,42 @@ BOOLEAN HalpClockSetMSRate;
UCHAR HalpNextMSRate; UCHAR HalpNextMSRate;
UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7.8 ms */ UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7.8 ms */
ULONG HalpCurrentTimeIncrement; ULONG HalpCurrentTimeIncrement;
static UCHAR RtcMinimumClockRate = 6; /* Minimum rate 6: 16 Hz / 62.5 ms */ static UCHAR RtcMinimumClockRate = 8; /* Minimum rate 8: 256 Hz / 3.9 ms */
static UCHAR RtcMaximumClockRate = 10; /* Maximum rate 10: 256 Hz / 3.9 ms */ static UCHAR RtcMaximumClockRate = 12; /* Maximum rate 12: 16 Hz / 62.5 ms */
/*!
\brief Converts the CMOS RTC rate into the time increment in 100ns intervals.
Rate Freqency Interval (ms) Result
-------------------------------------
0 disabled
1 32768 0.03052 305
2 16384 0.06103 610
3 8192 0.12207 1221
4 4096 0.24414 2441
5 2048 0.48828 4883
6 1024 0.97656 9766
7 512 1.95313 19531
8 256 3.90625 39063
9 128 7.8125 78125
10 64 15.6250 156250
11 32 31.25 312500
12 16 62.5 625000
13 8 125 1250000
14 4 250 2500000
15 2 500 5000000
*/
FORCEINLINE FORCEINLINE
ULONG ULONG
RtcClockRateToIncrement(UCHAR Rate) RtcClockRateToIncrement(UCHAR Rate)
{ {
ULONG Freqency = ((32768 << 1) >> Rate); /* Calculate frequency */
return (1000000 + (Freqency/2)) / Freqency; ULONG Freqency = 32768 >> (Rate - 1);
/* Calculate interval in 100ns interval: Interval = (1 / Frequency) * 10000000
This formula will round properly, instead of truncating. */
return (10000000 + (Freqency/2)) / Freqency;
} }
VOID VOID