From 788d7036e975a833528bca7d3d9375e3b84a4f1d Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 14 Nov 2017 00:47:07 +0000 Subject: [PATCH] z80pack: rtc support --- Kernel/dev/z80pack/devrtc.c | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/Kernel/dev/z80pack/devrtc.c b/Kernel/dev/z80pack/devrtc.c index fac3755b..e85a6f1c 100644 --- a/Kernel/dev/z80pack/devrtc.c +++ b/Kernel/dev/z80pack/devrtc.c @@ -3,6 +3,7 @@ #include #include #include +#include __sfr __at 25 clkc; __sfr __at 26 clkd; @@ -19,3 +20,45 @@ uint8_t rtc_secs(void) { return clkd; } + +int platform_rtc_read(void) +{ + struct cmos_rtc cmos; + uint8_t *p = cmos.data.bytes; + uint16_t year; + irqflags_t irqflags; + uint16_t len = sizeof(struct cmos_rtc); + + if (udata.u_count < len) + len = udata.u_count; + + /* Don't interfere with the rtc_secs fast path */ + irqflags = di(); + + clkc = 7; + year = clkd; + year += 1900; + *p++ = year & 0xFF; + *p++ = year >> 8; + clkc = 6; + *p++ = clkd; /* month 0-11 */ + clkc = 5; + *p++ = clkd; /* day of month 1-31 */ + clkc = 2; + *p++ = clkd; /* Hour 0-23 */ + clkc = 1; + *p++ = clkd; /* Minutes 0-59 */ + clkc = 0; + *p = clkc; /* Seconds 0-59, leave clkc as needed for rtc_secs */ + irqrestore(irqflags); + cmos.type = CMOS_RTC_DEC; + if (uput(&cmos, udata.u_base, len) == -1) + return -1; + return len; +} + +int platform_rtc_write(void) +{ + udata.u_error = EOPNOTSUPP; + return -1; +} -- 2.34.1