From da4d936eeed708198494c3cc29c21d637023f472 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Thu, 15 Aug 2019 22:31:31 +0200
Subject: [PATCH] RTC: Add function to set time

This allows to set the current time in milliseconds.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
 epicardium/epicardium.h  |  6 ++++++
 epicardium/modules/rtc.c | 15 +++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 25c239ac..36ea64b8 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -66,6 +66,7 @@ typedef _Bool bool;
 
 #define API_RTC_GET_SECONDS        0x50
 #define API_RTC_SCHEDULE_ALARM     0x51
+#define API_RTC_SET_MILLISECONDS   0x52
 
 #define API_LEDS_SET               0x60
 #define API_LEDS_SET_HSV           0x61
@@ -964,6 +965,11 @@ API(API_FILE_UNLINK, int epic_file_unlink(const char* path));
  */
 API(API_RTC_GET_SECONDS, uint32_t epic_rtc_get_seconds(void));
 
+/**
+ * Sets the current RTC time in milliseconds
+ */
+API(API_RTC_SET_MILLISECONDS, void epic_rtc_set_milliseconds(uint64_t milliseconds));
+
 /**
  * Schedule the RTC alarm for the given timestamp.
  *
diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c
index edfb0441..030de310 100644
--- a/epicardium/modules/rtc.c
+++ b/epicardium/modules/rtc.c
@@ -25,6 +25,21 @@ uint32_t epic_rtc_get_seconds(void)
 	return sec;
 }
 
+void epic_rtc_set_milliseconds(uint64_t milliseconds)
+{
+	uint32_t sec, subsec;
+
+	sec    = milliseconds / 1000;
+	subsec = (milliseconds % 1000);
+	subsec *= 256;
+	subsec /= 1000;
+
+	while (RTC_Init(MXC_RTC, sec, subsec, NULL) == E_BUSY)
+		;
+	while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
+		;
+}
+
 void RTC_IRQHandler(void)
 {
 	int flags = RTC_GetFlags();
-- 
GitLab