mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
[HAL] Fix calculation of timer increment
This commit is contained in:
parent
64d7db506c
commit
3bbcc16d8e
1 changed files with 33 additions and 5 deletions
|
@ -4,7 +4,9 @@
|
|||
* FILE: hal/halx86/apic/rtctimer.c
|
||||
* PURPOSE: HAL APIC Management and Control Code
|
||||
* 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 *******************************************************************/
|
||||
|
@ -24,16 +26,42 @@ BOOLEAN HalpClockSetMSRate;
|
|||
UCHAR HalpNextMSRate;
|
||||
UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7.8 ms */
|
||||
ULONG HalpCurrentTimeIncrement;
|
||||
static UCHAR RtcMinimumClockRate = 6; /* Minimum rate 6: 16 Hz / 62.5 ms */
|
||||
static UCHAR RtcMaximumClockRate = 10; /* Maximum rate 10: 256 Hz / 3.9 ms */
|
||||
static UCHAR RtcMinimumClockRate = 8; /* Minimum rate 8: 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
|
||||
ULONG
|
||||
RtcClockRateToIncrement(UCHAR Rate)
|
||||
{
|
||||
ULONG Freqency = ((32768 << 1) >> Rate);
|
||||
return (1000000 + (Freqency/2)) / Freqency;
|
||||
/* Calculate frequency */
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue