[coreboot-gerrit] Change in coreboot[master]: libpayload/drivers/nvram: Add function to write RTC
Patrick Rudolph (Code Review)
gerrit at coreboot.org
Sat Feb 3 15:03:43 CET 2018
Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/23585
Change subject: libpayload/drivers/nvram: Add function to write RTC
......................................................................
libpayload/drivers/nvram: Add function to write RTC
Add a function to set the RTC to provided struct tm.
Change-Id: I17b4c1ee0dcc649738ac6a7400b087d07213eaf0
Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
M payloads/libpayload/drivers/nvram.c
M payloads/libpayload/include/libpayload.h
2 files changed, 52 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/85/23585/1
diff --git a/payloads/libpayload/drivers/nvram.c b/payloads/libpayload/drivers/nvram.c
index 9d3a9cd..6e2ebdc 100644
--- a/payloads/libpayload/drivers/nvram.c
+++ b/payloads/libpayload/drivers/nvram.c
@@ -160,3 +160,54 @@
if (time->tm_year < 80)
time->tm_year += 100;
}
+
+/**
+ * Write the current time and date to the RTC
+ *
+ * @param time A pointer to a broken-down time structure
+ */
+void rtc_write_clock(struct tm *time)
+{
+ u16 timeout = 10000;
+ u8 statusB;
+ u8 reg8;
+
+ while (nvram_updating())
+ if (!timeout--)
+ return;
+
+ statusB = nvram_read(NVRAM_RTC_STATUSB);
+
+ if (time->tm_year > 100)
+ time->tm_year -= 100;
+
+ if (!(statusB & 0x04)) {
+ nvram_write(dec2bcd(time->tm_mon + 1), NVRAM_RTC_MONTH);
+ nvram_write(dec2bcd(time->tm_sec), NVRAM_RTC_SECONDS);
+ nvram_write(dec2bcd(time->tm_min), NVRAM_RTC_MINUTES);
+ nvram_write(dec2bcd(time->tm_mday), NVRAM_RTC_DAY);
+ if (!(statusB & 0x02)) {
+ if (time->tm_hour > 12)
+ reg8 = dec2bcd(time->tm_hour - 12) | 0x80;
+ else
+ reg8 = dec2bcd(time->tm_hour);
+ } else
+ reg8 = dec2bcd(time->tm_hour);
+ nvram_write(reg8, NVRAM_RTC_HOURS);
+ nvram_write(dec2bcd(time->tm_year), NVRAM_RTC_YEAR);
+ } else {
+ nvram_write(time->tm_mon + 1, NVRAM_RTC_MONTH);
+ nvram_write(time->tm_sec, NVRAM_RTC_SECONDS);
+ nvram_write(time->tm_min, NVRAM_RTC_MINUTES);
+ nvram_write(time->tm_mday, NVRAM_RTC_DAY);
+ if (!(statusB & 0x02)) {
+ if (time->tm_hour > 12)
+ reg8 = (time->tm_hour - 12) | 0x80;
+ else
+ reg8 = time->tm_hour;
+ } else
+ reg8 = time->tm_hour;
+ nvram_write(reg8, NVRAM_RTC_HOURS);
+ nvram_write(time->tm_year, NVRAM_RTC_YEAR);
+ }
+}
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index 23226f3..5671efd 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -125,6 +125,7 @@
void nvram_write(u8 val, u8 addr);
int nvram_updating(void);
void rtc_read_clock(struct tm *tm);
+void rtc_write_clock(struct tm *tm);
/** @} */
/**
--
To view, visit https://review.coreboot.org/23585
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I17b4c1ee0dcc649738ac6a7400b087d07213eaf0
Gerrit-Change-Number: 23585
Gerrit-PatchSet: 1
Gerrit-Owner: Patrick Rudolph <siro at das-labor.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180203/855df2aa/attachment.html>
More information about the coreboot-gerrit
mailing list