65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
from stdint import *
|
|
import t, c
|
|
import asm
|
|
|
|
|
|
rtc_cmos_addr: t.CUInt16T = 0x70
|
|
rtc_cmos_data: t.CUInt16T = 0x71
|
|
|
|
def cmos_read(reg: t.CUInt8T) -> t.CUInt8T:
|
|
asm.outb(rtc_cmos_addr, reg)
|
|
return asm.inb(rtc_cmos_data)
|
|
|
|
def bcd_to_bin(bcd: t.CUInt8T) -> t.CUInt8T:
|
|
return (bcd >> 4) * 10 + (bcd & 0x0F)
|
|
|
|
def get_rtc_time() -> t.CUInt32T:
|
|
while cmos_read(0x0A) & 0x80: pass
|
|
sec: t.CUInt8T = cmos_read(0x00)
|
|
min_: t.CUInt8T = cmos_read(0x02)
|
|
hour: t.CUInt8T = cmos_read(0x04)
|
|
day: t.CUInt8T = cmos_read(0x07)
|
|
mon: t.CUInt8T = cmos_read(0x08)
|
|
year: t.CUInt8T = cmos_read(0x09)
|
|
reg_b: t.CUInt8T = cmos_read(0x0B)
|
|
if not (reg_b & 0x04):
|
|
sec = bcd_to_bin(sec)
|
|
min_ = bcd_to_bin(min_)
|
|
hour = bcd_to_bin(hour)
|
|
day = bcd_to_bin(day)
|
|
mon = bcd_to_bin(mon)
|
|
year = bcd_to_bin(year)
|
|
fat_year: t.CUInt16T = t.CUInt16T(year) + 2000 - 1980
|
|
if fat_year > 127: fat_year = 127
|
|
fat_date: t.CUInt16T = (fat_year << 9) | (t.CUInt16T(mon) << 5) | t.CUInt16T(day)
|
|
fat_time: t.CUInt16T = (t.CUInt16T(hour) << 11) | (t.CUInt16T(min_) << 5) | (t.CUInt16T(sec) / 2)
|
|
return (t.CUInt32T(fat_date) << 16) | t.CUInt32T(fat_time)
|
|
|
|
def get_fattime() -> t.CUInt32T:
|
|
return get_rtc_time()
|
|
|
|
def to_year(ft: t.CUInt32T) -> t.CUInt16T:
|
|
return t.CUInt16T((ft >> 25) & 0x7F) + 1980
|
|
|
|
def to_month(ft: t.CUInt32T) -> t.CUInt8T:
|
|
return t.CUInt8T((ft >> 21) & 0x0F)
|
|
|
|
def to_day(ft: t.CUInt32T) -> t.CUInt8T:
|
|
return t.CUInt8T((ft >> 16) & 0x1F)
|
|
|
|
def to_hour(ft: t.CUInt32T) -> t.CUInt8T:
|
|
return t.CUInt8T((ft >> 11) & 0x1F)
|
|
|
|
def to_minute(ft: t.CUInt32T) -> t.CUInt8T:
|
|
return t.CUInt8T((ft >> 5) & 0x3F)
|
|
|
|
def to_second(ft: t.CUInt32T) -> t.CUInt8T:
|
|
return t.CUInt8T((ft & 0x1F) * 2)
|
|
|
|
def make(year: t.CUInt16T, month: t.CUInt8T, day: t.CUInt8T, hour: t.CUInt8T, minute: t.CUInt8T, second: t.CUInt8T) -> t.CUInt32T:
|
|
fat_year: t.CUInt16T = year - 1980
|
|
if fat_year > 127: fat_year = 127
|
|
fat_date: t.CUInt16T = (fat_year << 9) | (t.CUInt16T(month) << 5) | t.CUInt16T(day)
|
|
fat_time: t.CUInt16T = (t.CUInt16T(hour) << 11) | (t.CUInt16T(minute) << 5) | (t.CUInt16T(second) / 2)
|
|
return (t.CUInt32T(fat_date) << 16) | t.CUInt32T(fat_time)
|