mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 06:46:06 +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
|
* 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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue