Fix RTC clock reading in 24-hour mode
This commit is contained in:
parent
7c8744d1e0
commit
a423cdf1b1
@ -43,17 +43,19 @@ struct rtc
|
||||
|
||||
public static void initialize()
|
||||
{
|
||||
time t = read_rtc_time();
|
||||
klog.writefln("System time is 20%02u-%02u-%02u %02u:%02u:%02u",
|
||||
t.year, t.month, t.day, t.hour, t.minute, t.second);
|
||||
|
||||
/* Enable IRQ 8 to receive RTC interrupts. */
|
||||
ubyte sr_b = read_register(REG_SR_B, true);
|
||||
write_register(REG_SR_B, sr_b | SR_B_ENABLE_IRQ, true);
|
||||
|
||||
/* Record RTC mode flags from status register B. */
|
||||
rtc_24hour_mode = (sr_b & SR_B_24HOUR) != 0u;
|
||||
rtc_binary_mode = (sr_b & SR_B_BINARY) != 0u;
|
||||
|
||||
/* Read the current system time. */
|
||||
time t = read_rtc_time();
|
||||
klog.writefln("System time is 20%02u-%02u-%02u %02u:%02u:%02u",
|
||||
t.year, t.month, t.day, t.hour, t.minute, t.second);
|
||||
|
||||
/* Send EOI to enable more RTC interrupts and re-enable NMIs. */
|
||||
eoi();
|
||||
}
|
||||
@ -110,20 +112,24 @@ struct rtc
|
||||
t.year = read_rtc_time_register(REG_RTC_YEAR);
|
||||
t.month = read_rtc_time_register(REG_RTC_MONTH);
|
||||
t.day = read_rtc_time_register(REG_RTC_DAY);
|
||||
t.hour = read_register(REG_RTC_HOURS);
|
||||
t.minute = read_rtc_time_register(REG_RTC_MINUTES);
|
||||
t.second = read_rtc_time_register(REG_RTC_SECONDS);
|
||||
/* Hour field is treated differently because it might have 'PM' flag
|
||||
* in highest bit if we're in 24-hour mode. */
|
||||
ubyte hour = read_register(REG_RTC_HOURS);
|
||||
ubyte pm = hour >> 7u;
|
||||
hour &= 0x7Fu;
|
||||
if (!rtc_binary_mode)
|
||||
{
|
||||
/* Hour is in BCD format; convert to binary. */
|
||||
hour = bcd_to_binary(hour);
|
||||
}
|
||||
if (!rtc_24hour_mode)
|
||||
{
|
||||
ubyte pm = (t.hour & 0x80u) >> 7u;
|
||||
t.hour &= 0x7Fu;
|
||||
if (!rtc_binary_mode)
|
||||
{
|
||||
t.hour = bcd_to_binary(t.hour);
|
||||
}
|
||||
/* Hour is in 12-hour format; convert to 24-hour format. */
|
||||
t.hour = cast(ubyte)((t.hour % 12u) + pm * 12u);
|
||||
hour = cast(ubyte)((hour % 12u) + pm * 12u);
|
||||
}
|
||||
t.hour = hour;
|
||||
return t;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user