From e94f7bf90f029c100ed384404844d359d40e7fed Mon Sep 17 00:00:00 2001
From: Ferdinand Bachmann <theferdi265@gmail.com>
Date: Sat, 31 Aug 2019 00:34:06 +0200
Subject: [PATCH] epicardium/rtc: add monotonic time

---
 epicardium/epicardium.h  | 20 ++++++++++++++++++++
 epicardium/modules/rtc.c | 20 ++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 92bb5ade7..1ecdb831c 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -81,6 +81,8 @@ typedef _Bool bool;
 #define API_RTC_SCHEDULE_ALARM     0x51
 #define API_RTC_SET_MILLISECONDS   0x52
 #define API_RTC_GET_MILLISECONDS   0x53
+#define API_RTC_GET_MONOTONIC_SECONDS      0x54
+#define API_RTC_GET_MONOTONIC_MILLISECONDS 0x55
 
 #define API_LEDS_SET               0x60
 #define API_LEDS_SET_HSV           0x61
@@ -1693,6 +1695,24 @@ API(API_FILE_MKDIR, int epic_file_mkdir(const char *dirname));
  * ===
  */
 
+/**
+ * Get the monotonic time in seconds.
+ *
+ * :return: monotonic time in seconds
+ */
+API(API_RTC_GET_MONOTONIC_SECONDS,
+	uint32_t epic_rtc_get_monotonic_seconds(void)
+);
+
+/**
+ * Get the monotonic time in ms.
+ *
+ * :return: monotonic time in milliseconds
+ */
+API(API_RTC_GET_MONOTONIC_MILLISECONDS,
+	uint64_t epic_rtc_get_monotonic_milliseconds(void)
+);
+
 /**
  * Read the current RTC value.
  *
diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c
index de1ef70d2..b07fb6fcc 100644
--- a/epicardium/modules/rtc.c
+++ b/epicardium/modules/rtc.c
@@ -9,6 +9,18 @@
 
 #include <stdint.h>
 
+uint64_t monotonic_offset = 0;
+
+uint32_t epic_rtc_get_monotonic_seconds(void)
+{
+	return epic_rtc_get_seconds() + monotonic_offset / 1000ULL;
+}
+
+uint64_t epic_rtc_get_monotonic_milliseconds(void)
+{
+	return epic_rtc_get_milliseconds() + monotonic_offset;
+}
+
 uint32_t epic_rtc_get_seconds(void)
 {
 	uint32_t sec, subsec;
@@ -38,6 +50,9 @@ uint64_t epic_rtc_get_milliseconds(void)
 void epic_rtc_set_milliseconds(uint64_t milliseconds)
 {
 	uint32_t sec, subsec;
+	uint64_t old_milliseconds, new_milliseconds, diff;
+
+	old_milliseconds = epic_rtc_get_milliseconds();
 
 	sec    = milliseconds / 1000;
 	subsec = (milliseconds % 1000);
@@ -48,6 +63,11 @@ void epic_rtc_set_milliseconds(uint64_t milliseconds)
 		;
 	while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
 		;
+
+	new_milliseconds = epic_rtc_get_milliseconds();
+
+	diff = old_milliseconds - new_milliseconds;
+	monotonic_offset += diff;
 }
 
 void RTC_IRQHandler(void)
-- 
GitLab