From 0921bce5dd7ffdb5bf678e9bb44782d97f448e69 Mon Sep 17 00:00:00 2001
From: Kaspar Schleiser <kaspar@schleiser.de>
Date: Mon, 4 May 2015 16:43:29 +0200
Subject: [PATCH] sys: add hwtimer layer for periph timers

---
 sys/Makefile                      |  3 ++
 sys/compat/Makefile               |  1 +
 sys/compat/hwtimer/Makefile       |  3 ++
 sys/compat/hwtimer/hwtimer_arch.c | 75 +++++++++++++++++++++++++++++++
 4 files changed, 82 insertions(+)
 create mode 100644 sys/compat/Makefile
 create mode 100644 sys/compat/hwtimer/Makefile
 create mode 100644 sys/compat/hwtimer/hwtimer_arch.c

diff --git a/sys/Makefile b/sys/Makefile
index 4d2bc7642c..515cc13148 100644
--- a/sys/Makefile
+++ b/sys/Makefile
@@ -137,6 +137,9 @@ endif
 ifneq (,$(filter ng_udp,$(USEMODULE)))
     DIRS += net/transport_layer/ng_udp
 endif
+ifneq (,$(filter hwtimer_compat,$(USEMODULE)))
+    DIRS += compat/hwtimer
+endif
 
 DIRS += $(dir $(wildcard $(addsuffix /Makefile, ${USEMODULE})))
 
diff --git a/sys/compat/Makefile b/sys/compat/Makefile
new file mode 100644
index 0000000000..48422e909a
--- /dev/null
+++ b/sys/compat/Makefile
@@ -0,0 +1 @@
+include $(RIOTBASE)/Makefile.base
diff --git a/sys/compat/hwtimer/Makefile b/sys/compat/hwtimer/Makefile
new file mode 100644
index 0000000000..316bf04d47
--- /dev/null
+++ b/sys/compat/hwtimer/Makefile
@@ -0,0 +1,3 @@
+MODULE = hwtimer_compat
+
+include $(RIOTBASE)/Makefile.base
diff --git a/sys/compat/hwtimer/hwtimer_arch.c b/sys/compat/hwtimer/hwtimer_arch.c
new file mode 100644
index 0000000000..0325e33026
--- /dev/null
+++ b/sys/compat/hwtimer/hwtimer_arch.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de>
+ *               2014 Freie Universität Berlin
+ *
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @ingroup     sys_compat
+ * @{
+ *
+ * @file        hwtimer_arch.c
+ * @brief       Implementation of the kernels hwtimer interface over periph timers
+ *
+ * This hwtimer implementation wraps one periph timer
+ *
+ * @author      Thomas Eichinger <thomas.eichinger@fu-berlin.de>
+ * @author      Kaspar Schleiser <kaspar@schleiser.de>
+ *
+ * @}
+ */
+
+#include "arch/hwtimer_arch.h"
+#include "board.h"
+#include "periph/timer.h"
+#include "thread.h"
+
+
+void irq_handler(int channel);
+void (*timeout_handler)(int);
+
+
+void hwtimer_arch_init(void (*handler)(int), uint32_t fcpu)
+{
+    timeout_handler = handler;
+    timer_init(HW_TIMER, 1, &irq_handler);
+}
+
+void hwtimer_arch_enable_interrupt(void)
+{
+    timer_irq_enable(HW_TIMER);
+}
+
+void hwtimer_arch_disable_interrupt(void)
+{
+    timer_irq_disable(HW_TIMER);
+}
+
+void hwtimer_arch_set(unsigned long offset, short timer)
+{
+    timer_set(HW_TIMER, timer, offset);
+}
+
+void hwtimer_arch_set_absolute(unsigned long value, short timer)
+{
+    timer_set_absolute(HW_TIMER, timer, value);
+}
+
+void hwtimer_arch_unset(short timer)
+{
+    timer_clear(HW_TIMER, timer);
+}
+
+unsigned long hwtimer_arch_now(void)
+{
+    return timer_read(HW_TIMER);
+}
+
+void irq_handler(int channel)
+{
+    timeout_handler((short)(channel));
+}
-- 
GitLab