summaryrefslogtreecommitdiffstats
path: root/app/sysclk.c
diff options
context:
space:
mode:
authorroot <root@lab.ourano.james.local>2021-02-26 12:12:38 +0000
committerroot <root@lab.ourano.james.local>2021-02-26 12:12:38 +0000
commit3d48137c00511b3f2d35511482d1a76f8d06382d (patch)
treed75c88220cc847007869b0795a240c5077948262 /app/sysclk.c
parent6d3a824e1cdae6e28146b7de380724b49488f3c2 (diff)
downloadclock-3d48137c00511b3f2d35511482d1a76f8d06382d.tar.gz
clock-3d48137c00511b3f2d35511482d1a76f8d06382d.tar.bz2
clock-3d48137c00511b3f2d35511482d1a76f8d06382d.zip
works
Diffstat (limited to 'app/sysclk.c')
-rw-r--r--app/sysclk.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/app/sysclk.c b/app/sysclk.c
new file mode 100644
index 0000000..1847c28
--- /dev/null
+++ b/app/sysclk.c
@@ -0,0 +1,81 @@
+#include "project.h"
+
+
+
+static Event_ring sysclk_ring;
+
+void sysclk_event (void)
+{
+ uint32_t refclk_now = HW_CLOCK_REG;
+ uint32_t sysclk_now = SCS_DWT_CYCCNT;
+
+
+ sysclk_ring.events[sysclk_ring.tx_ptr].when = refclk_now;
+ sysclk_ring.events[sysclk_ring.tx_ptr].value = sysclk_now;
+ sysclk_ring.tx_ptr = (sysclk_ring.tx_ptr + 1) & ERING_MASK;
+
+}
+
+static uint32_t high_tick;
+
+#define QUARTER (1UL << 29)
+#define HALF (1UL << 30)
+#define THREE_QUARTERS (HALF+QUARTER)
+#define ONE (~(uint32_t)0)
+
+uint64_t sysclk_extend (uint32_t now)
+{
+ static int m;
+ uint64_t ret;
+
+
+ if (!m) {
+ ret = high_tick;
+ ret <<= 32;
+ ret |= now;
+
+
+ if ((now > THREE_QUARTERS) && (now <= ONE)) {
+ high_tick++;
+ m = 1;
+ }
+
+ } else {
+ if (now < HALF) {
+ ret = high_tick;
+ ret <<= 32;
+ ret |= now;
+ } else {
+ ret = high_tick - 1;
+ ret <<= 32;
+ ret |= now;
+ }
+
+ if ((now > QUARTER) && (now < HALF))
+ m = 0;
+ }
+
+ return ret;
+}
+void sysclk_dispatch (void)
+{
+ //char buf[80];
+ uint64_t refclk_abs;
+ uint32_t refclk_now, sysclk_now;
+ EPOCH e;
+ //UTC u;
+
+ if (sysclk_ring.rx_ptr == sysclk_ring.tx_ptr) return;
+
+ sysclk_now = sysclk_ring.events[sysclk_ring.rx_ptr].value;
+ refclk_now = sysclk_ring.events[sysclk_ring.rx_ptr].when;
+ sysclk_ring.rx_ptr = (sysclk_ring.rx_ptr + 1) & ERING_MASK;
+
+ refclk_abs = abs_extend (refclk_now);
+ e.s = sysclk_extend (sysclk_now);
+ e.ns = 0;
+
+ report_time ("SYS", e, refclk_abs, "");
+}
+
+