You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by we...@apache.org on 2016/06/23 23:39:19 UTC

[2/2] incubator-mynewt-core git commit: MYNEWT-79: move common hal code from mcu to hal

MYNEWT-79: move common hal code from mcu to hal


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/183873d8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/183873d8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/183873d8

Branch: refs/heads/develop
Commit: 183873d8890de9fb6579dc3a738937c1b1d8006d
Parents: 7bd50b3
Author: William San Filippo <wi...@runtime.io>
Authored: Fri Jun 17 10:46:20 2016 -0700
Committer: William San Filippo <wi...@runtime.io>
Committed: Thu Jun 23 16:39:04 2016 -0700

----------------------------------------------------------------------
 hw/hal/include/hal/hal_cputime.h         |  30 +-
 hw/mcu/native/src/hal_cputime.c          | 385 +++-----------------------
 hw/mcu/nordic/nrf51xxx/src/hal_cputime.c | 308 +--------------------
 hw/mcu/nordic/nrf52xxx/src/hal_cputime.c | 318 +--------------------
 hw/mcu/stm/stm32f4xx/src/hal_cputime.c   | 355 +++---------------------
 5 files changed, 111 insertions(+), 1285 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/183873d8/hw/hal/include/hal/hal_cputime.h
----------------------------------------------------------------------
diff --git a/hw/hal/include/hal/hal_cputime.h b/hw/hal/include/hal/hal_cputime.h
index 63b723b..001bac5 100644
--- a/hw/hal/include/hal/hal_cputime.h
+++ b/hw/hal/include/hal/hal_cputime.h
@@ -38,6 +38,23 @@ struct cpu_timer {
     TAILQ_ENTRY(cpu_timer) link;
 };
 
+/* CPUTIME data. */
+struct cputime_data
+{
+    uint32_t ticks_per_usec;    /* number of ticks per usec */
+    uint32_t cputime_high;      /* high word of 64-bit cpu time */
+    uint32_t timer_isrs;        /* Number of timer interrupts */
+    uint32_t ocmp_ints;         /* Number of ocmp interrupts */
+    uint32_t uif_ints;          /* Number of overflow interrupts */
+};
+extern struct cputime_data g_cputime;
+
+/* Helpful macros to compare cputimes */
+#define CPUTIME_LT(__t1, __t2) ((int32_t)   ((__t1) - (__t2)) < 0)
+#define CPUTIME_GT(__t1, __t2) ((int32_t)   ((__t1) - (__t2)) > 0)
+#define CPUTIME_GEQ(__t1, __t2) ((int32_t)  ((__t1) - (__t2)) >= 0)
+#define CPUTIME_LEQ(__t1, __t2) ((int32_t)  ((__t1) - (__t2)) <= 0)
+
 /**
  * cputime init
  *
@@ -183,11 +200,16 @@ void cputime_timer_relative(struct cpu_timer *timer, uint32_t usecs);
  */
 void cputime_timer_stop(struct cpu_timer *timer);
 
-#define CPUTIME_LT(__t1, __t2) ((int32_t)   ((__t1) - (__t2)) < 0)
-#define CPUTIME_GT(__t1, __t2) ((int32_t)   ((__t1) - (__t2)) > 0)
-#define CPUTIME_GEQ(__t1, __t2) ((int32_t)  ((__t1) - (__t2)) >= 0)
-#define CPUTIME_LEQ(__t1, __t2) ((int32_t)  ((__t1) - (__t2)) <= 0)
+/*
+ * Used between MCU specific files and generic HAL. Not intended as an API
+ * to be called by the user.
+ */
+void cputime_chk_expiration(void);
 
+/*--- HW specific API. These are not intended to be called by user  ---*/
+void cputime_disable_ocmp(void);
+void cputime_set_ocmp(struct cpu_timer *timer);
+int cputime_hw_init(uint32_t clock_freq);
 
 #ifdef __cplusplus
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/183873d8/hw/mcu/native/src/hal_cputime.c
----------------------------------------------------------------------
diff --git a/hw/mcu/native/src/hal_cputime.c b/hw/mcu/native/src/hal_cputime.c
index b493a7d..850bfc5 100644
--- a/hw/mcu/native/src/hal_cputime.c
+++ b/hw/mcu/native/src/hal_cputime.c
@@ -6,7 +6,7 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
@@ -21,21 +21,6 @@
 #include "os/os.h"
 #include "hal/hal_cputime.h"
 
-/* CPUTIME data */
-struct cputime_data
-{
-    uint32_t ticks_per_usec;    /* number of ticks per usec */
-    uint32_t timer_isrs;        /* Number of timer interrupts */
-    uint32_t ocmp_ints;         /* Number of ocmp interrupts */
-    uint32_t uif_ints;          /* Number of overflow interrupts */
-    uint32_t last_ostime;
-    uint64_t cputime;           /* 64-bit cputime */
-};
-struct cputime_data g_cputime;
-
-/* Queue for timers */
-TAILQ_HEAD(cputime_qhead, cpu_timer) g_cputimer_q;
-
 /* For native cpu implementation */
 #define NATIVE_CPUTIME_STACK_SIZE   (1024)
 os_stack_t g_native_cputime_stack[NATIVE_CPUTIME_STACK_SIZE];
@@ -44,15 +29,16 @@ struct os_task g_native_cputime_task;
 struct os_callout_func g_native_cputimer;
 struct os_eventq g_native_cputime_evq;
 static uint32_t g_native_cputime_cputicks_per_ostick;
-
+static uint64_t g_native_cputime;
+static uint32_t g_native_cputime_last_ostime;
 
 /**
  * Convert cpu time ticks to os ticks.
- * 
- * 
- * @param cputicks 
- * 
- * @return uint32_t 
+ *
+ *
+ * @param cputicks
+ *
+ * @return uint32_t
  */
 static uint32_t
 native_cputime_ticks_to_osticks(uint32_t cputicks)
@@ -64,13 +50,13 @@ native_cputime_ticks_to_osticks(uint32_t cputicks)
 }
 
 /**
- * cputime set ocmp 
- *  
- * Set the OCMP used by the cputime module to the desired cputime. 
- * 
+ * cputime set ocmp
+ *
+ * Set the OCMP used by the cputime module to the desired cputime.
+ *
  * @param timer Pointer to timer.
  */
-static void
+void
 cputime_set_ocmp(struct cpu_timer *timer)
 {
     uint32_t curtime;
@@ -88,43 +74,9 @@ cputime_set_ocmp(struct cpu_timer *timer)
 }
 
 /**
- * cputime chk expiration 
- *  
- * Iterates through the cputimer queue to determine if any timers have expired. 
- * If the timer has expired the timer is removed from the queue and the timer 
- * callback function is executed. 
- * 
- */
-static void
-cputime_chk_expiration(void)
-{
-    os_sr_t sr;
-    struct cpu_timer *timer;
-
-    OS_ENTER_CRITICAL(sr);
-    while ((timer = TAILQ_FIRST(&g_cputimer_q)) != NULL) {
-        if ((int32_t)(cputime_get32() - timer->cputime) >= 0) {
-            TAILQ_REMOVE(&g_cputimer_q, timer, link);
-            timer->cb(timer->arg);
-        } else {
-            break;
-        }
-    }
-
-    /* Any timers left on queue? If so, we need to set OCMP */
-    timer = TAILQ_FIRST(&g_cputimer_q);
-    if (timer) {
-        cputime_set_ocmp(timer);
-    } else {
-        os_callout_stop(&g_native_cputimer.cf_c);
-    }
-    OS_EXIT_CRITICAL(sr);
-}
-
-/**
- * This is the function called when the cputimer fires off. 
- * 
- * @param arg 
+ * This is the function called when the cputimer fires off.
+ *
+ * @param arg
  */
 void
 native_cputimer_cb(void *arg)
@@ -158,38 +110,35 @@ native_cputime_task_handler(void *arg)
 }
 
 /**
- * cputime init 
- *  
- * Initialize the cputime module. This must be called after os_init is called 
- * and before any other timer API are used. This should be called only once 
- * and should be called before the hardware timer is used. 
- * 
+ * cputime init
+ *
+ * Initialize the cputime module. This must be called after os_init is called
+ * and before any other timer API are used. This should be called only once
+ * and should be called before the hardware timer is used.
+ *
  * @param clock_freq The desired cputime frequency, in hertz (Hz).
- * 
+ *
  * @return int 0 on success; -1 on error.
  */
 int
-cputime_init(uint32_t clock_freq)
+cputime_hw_init(uint32_t clock_freq)
 {
     /* Clock frequency must be at least 1 MHz */
     if (clock_freq < 1000000U) {
         return -1;
     }
 
-    /* Initialize the timer queue */
-    TAILQ_INIT(&g_cputimer_q);
-
     /* Set the clock frequency */
     g_cputime.ticks_per_usec = clock_freq / 1000000U;
     g_native_cputime_cputicks_per_ostick = clock_freq / OS_TICKS_PER_SEC;
 
-    os_task_init(&g_native_cputime_task, 
-                 "native_cputimer", 
-                 native_cputime_task_handler, 
-                 NULL, 
-                 OS_TASK_PRI_HIGHEST, 
-                 OS_WAIT_FOREVER, 
-                 g_native_cputime_stack, 
+    os_task_init(&g_native_cputime_task,
+                 "native_cputimer",
+                 native_cputime_task_handler,
+                 NULL,
+                 OS_TASK_PRI_HIGHEST,
+                 OS_WAIT_FOREVER,
+                 g_native_cputime_stack,
                  NATIVE_CPUTIME_STACK_SIZE);
 
     /* Initialize the eventq and task */
@@ -206,23 +155,23 @@ cputime_init(uint32_t clock_freq)
 
 /**
  * cputime get64
- *  
- * Returns cputime as a 64-bit number. 
- * 
+ *
+ * Returns cputime as a 64-bit number.
+ *
  * @return uint64_t The 64-bit representation of cputime.
  */
-uint64_t 
+uint64_t
 cputime_get64(void)
 {
     cputime_get32();
-    return g_cputime.cputime;
+    return g_native_cputime;
 }
 
 /**
- * cputime get32 
- *  
- * Returns the low 32 bits of cputime. 
- * 
+ * cputime get32
+ *
+ * Returns the low 32 bits of cputime.
+ *
  * @return uint32_t The lower 32 bits of cputime
  */
 uint32_t
@@ -234,260 +183,14 @@ cputime_get32(void)
 
     OS_ENTER_CRITICAL(sr);
     ostime = os_time_get();
-    delta_osticks = (uint32_t)(ostime - g_cputime.last_ostime);
+    delta_osticks = (uint32_t)(ostime - g_native_cputime_last_ostime);
     if (delta_osticks) {
-        g_cputime.last_ostime = ostime;
-        g_cputime.cputime +=
+        g_native_cputime_last_ostime = ostime;
+        g_native_cputime +=
             (uint64_t)g_native_cputime_cputicks_per_ostick * delta_osticks;
 
     }
     OS_EXIT_CRITICAL(sr);
 
-    return (uint32_t)g_cputime.cputime;
-}
-
-/**
- * cputime nsecs to ticks 
- *  
- * Converts the given number of nanoseconds into cputime ticks. 
- * 
- * @param usecs The number of nanoseconds to convert to ticks
- * 
- * @return uint32_t The number of ticks corresponding to 'nsecs'
- */
-uint32_t 
-cputime_nsecs_to_ticks(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = ((nsecs * g_cputime.ticks_per_usec) + 999) / 1000;
-    return ticks;
-}
-
-/**
- * cputime ticks to nsecs
- *  
- * Convert the given number of ticks into nanoseconds. 
- * 
- * @param ticks The number of ticks to convert to nanoseconds.
- * 
- * @return uint32_t The number of nanoseconds corresponding to 'ticks'
- */
-uint32_t 
-cputime_ticks_to_nsecs(uint32_t ticks)
-{
-    uint32_t nsecs;
-
-    nsecs = ((ticks * 1000) + (g_cputime.ticks_per_usec - 1)) / 
-            g_cputime.ticks_per_usec;
-
-    return nsecs;
-}
-
-/**
- * cputime usecs to ticks 
- *  
- * Converts the given number of microseconds into cputime ticks. 
- * 
- * @param usecs The number of microseconds to convert to ticks
- * 
- * @return uint32_t The number of ticks corresponding to 'usecs'
- */
-uint32_t 
-cputime_usecs_to_ticks(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = (usecs * g_cputime.ticks_per_usec);
-    return ticks;
-}
-
-/**
- * cputime ticks to usecs
- *  
- * Convert the given number of ticks into microseconds. 
- * 
- * @param ticks The number of ticks to convert to microseconds.
- * 
- * @return uint32_t The number of microseconds corresponding to 'ticks'
- */
-uint32_t 
-cputime_ticks_to_usecs(uint32_t ticks)
-{
-    uint32_t us;
-
-    us =  (ticks + (g_cputime.ticks_per_usec - 1)) / g_cputime.ticks_per_usec;
-    return us;
-}
-
-/**
- * cputime delay ticks
- *  
- * Wait until the number of ticks has elapsed. This is a blocking delay. 
- * 
- * @param ticks The number of ticks to wait.
- */
-void 
-cputime_delay_ticks(uint32_t ticks)
-{
-    uint32_t until;
-
-    until = cputime_get32() + ticks;
-    while ((int32_t)(cputime_get32() - until) < 0) {
-        /* Loop here till finished */
-    }
-}
-
-/**
- * cputime delay nsecs 
- *  
- * Wait until 'nsecs' nanoseconds has elapsed. This is a blocking delay. 
- *  
- * @param nsecs The number of nanoseconds to wait.
- */
-void 
-cputime_delay_nsecs(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_nsecs_to_ticks(nsecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime delay usecs 
- *  
- * Wait until 'usecs' microseconds has elapsed. This is a blocking delay. 
- *  
- * @param usecs The number of usecs to wait.
- */
-void 
-cputime_delay_usecs(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_usecs_to_ticks(usecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime timer init
- * 
- * 
- * @param timer The timer to initialize. Cannot be NULL.
- * @param fp    The timer callback function. Cannot be NULL.
- * @param arg   Pointer to data object to pass to timer. 
- */
-void 
-cputime_timer_init(struct cpu_timer *timer, cputimer_func fp, void *arg)
-{
-    assert(timer != NULL);
-    assert(fp != NULL);
-
-    timer->cb = fp;
-    timer->arg = arg;
-    timer->link.tqe_prev = (void *) NULL;
-}
-
-/**
- * cputime timer start 
- *  
- * Start a cputimer that will expire at 'cputime'. If cputime has already 
- * passed, the timer callback will still be called (at interrupt context). 
- * 
- * @param timer     Pointer to timer to start. Cannot be NULL.
- * @param cputime   The cputime at which the timer should expire.
- */
-void 
-cputime_timer_start(struct cpu_timer *timer, uint32_t cputime)
-{
-    struct cpu_timer *entry;
-    os_sr_t sr;
-
-    assert(timer != NULL);
-
-    /* XXX: should this use a mutex? not sure... */
-    OS_ENTER_CRITICAL(sr);
-
-    timer->cputime = cputime;
-    if (TAILQ_EMPTY(&g_cputimer_q)) {
-        TAILQ_INSERT_HEAD(&g_cputimer_q, timer, link);
-    } else {
-        TAILQ_FOREACH(entry, &g_cputimer_q, link) {
-            if ((int32_t)(timer->cputime - entry->cputime) < 0) {
-                TAILQ_INSERT_BEFORE(entry, timer, link);   
-                break;
-            }
-        }
-        if (!entry) {
-            TAILQ_INSERT_TAIL(&g_cputimer_q, timer, link);
-        }
-    }
-
-    /* If this is the head, we need to set new OCMP */
-    if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-        cputime_set_ocmp(timer);
-    }
-
-    OS_EXIT_CRITICAL(sr);
-}
-
-/**
- * cputimer timer relative 
- *  
- * Sets a cpu timer that will expire 'usecs' microseconds from the current 
- * cputime. 
- * 
- * @param timer Pointer to timer. Cannot be NULL.
- * @param usecs The number of usecs from now at which the timer will expire.
- */
-void 
-cputime_timer_relative(struct cpu_timer *timer, uint32_t usecs)
-{
-    uint32_t cputime;
-
-    assert(timer != NULL);
-
-    cputime = cputime_get32() + cputime_usecs_to_ticks(usecs);
-    cputime_timer_start(timer, cputime);
-}
-
-/**
- * cputime timer stop 
- *  
- * Stops a cputimer from running. The timer is removed from the timer queue 
- * and interrupts are disabled if no timers are left on the queue. Can be 
- * called even if timer is running. 
- * 
- * @param timer Pointer to cputimer to stop. Cannot be NULL.
- */
-void 
-cputime_timer_stop(struct cpu_timer *timer)
-{
-    os_sr_t sr;
-    int reset_ocmp;
-    struct cpu_timer *entry;
-
-    assert(timer != NULL);
-
-    OS_ENTER_CRITICAL(sr);
-
-    /* If first on queue, we will need to reset OCMP */
-    if (timer->link.tqe_prev != NULL) {
-        reset_ocmp = 0;
-        if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-            entry = TAILQ_NEXT(timer, link);
-            reset_ocmp = 1;
-        }
-        TAILQ_REMOVE(&g_cputimer_q, timer, link);
-        if (reset_ocmp) {
-            if (entry) {
-                cputime_set_ocmp(entry);
-            } else {
-                os_callout_stop(&g_native_cputimer.cf_c);
-            }
-        }
-    }
-
-    OS_EXIT_CRITICAL(sr);
+    return (uint32_t)g_native_cputime;
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/183873d8/hw/mcu/nordic/nrf51xxx/src/hal_cputime.c
----------------------------------------------------------------------
diff --git a/hw/mcu/nordic/nrf51xxx/src/hal_cputime.c b/hw/mcu/nordic/nrf51xxx/src/hal_cputime.c
index eb12237..8f2815d 100644
--- a/hw/mcu/nordic/nrf51xxx/src/hal_cputime.c
+++ b/hw/mcu/nordic/nrf51xxx/src/hal_cputime.c
@@ -50,21 +50,7 @@
  *  - Sync to OSTIME.
  */
 
-/* CPUTIME data */
-struct cputime_data
-{
-    uint32_t ticks_per_usec;    /* number of ticks per usec */
-    uint32_t cputime_high;      /* high word of 64-bit cpu time */
-    uint32_t timer_isrs;        /* Number of timer interrupts */
-    uint32_t ocmp_ints;         /* Number of ocmp interrupts */
-    uint32_t uif_ints;          /* Number of overflow interrupts */
-};
-struct cputime_data g_cputime;
-
-/* Queue for timers */
-TAILQ_HEAD(cputime_qhead, cpu_timer) g_cputimer_q;
-
-__STATIC_INLINE void
+void
 cputime_disable_ocmp(void)
 {
     CPUTIMER->INTENCLR = CPUTIMER_INT_MASK(CPUTIMER_CC_INT);
@@ -79,7 +65,7 @@ cputime_disable_ocmp(void)
  *
  * @param timer Pointer to timer.
  */
-static void
+void
 cputime_set_ocmp(struct cpu_timer *timer)
 {
     /* Disable ocmp interrupt and set new value */
@@ -101,41 +87,6 @@ cputime_set_ocmp(struct cpu_timer *timer)
 }
 
 /**
- * cputime chk expiration
- *
- * Iterates through the cputimer queue to determine if any timers have expired.
- * If the timer has expired the timer is removed from the queue and the timer
- * callback function is executed.
- *
- */
-static void
-cputime_chk_expiration(void)
-{
-    uint32_t ctx;
-    struct cpu_timer *timer;
-
-    __HAL_DISABLE_INTERRUPTS(ctx);
-    while ((timer = TAILQ_FIRST(&g_cputimer_q)) != NULL) {
-        if ((int32_t)(cputime_get32() - timer->cputime) >= 0) {
-            TAILQ_REMOVE(&g_cputimer_q, timer, link);
-            timer->link.tqe_prev = NULL;
-            timer->cb(timer->arg);
-        } else {
-            break;
-        }
-    }
-
-    /* Any timers left on queue? If so, we need to set OCMP */
-    timer = TAILQ_FIRST(&g_cputimer_q);
-    if (timer) {
-        cputime_set_ocmp(timer);
-    } else {
-        cputime_disable_ocmp();
-    }
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-
-/**
  * cputime isr
  *
  * This is the global timer interrupt routine.
@@ -197,7 +148,7 @@ cputime_isr(void)
  * @return int 0 on success; -1 on error.
  */
 int
-cputime_init(uint32_t clock_freq)
+cputime_hw_init(uint32_t clock_freq)
 {
     uint32_t ctx;
     uint32_t max_freq;
@@ -250,9 +201,6 @@ cputime_init(uint32_t clock_freq)
         return -1;
     }
 
-    /* Initialize the timer queue */
-    TAILQ_INIT(&g_cputimer_q);
-
     /* disable interrupts */
     __HAL_DISABLE_INTERRUPTS(ctx);
 
@@ -339,253 +287,3 @@ cputime_get32(void)
 
     return cpu_time;
 }
-
-/**
- * cputime nsecs to ticks
- *
- * Converts the given number of nanoseconds into cputime ticks.
- *
- * @param usecs The number of nanoseconds to convert to ticks
- *
- * @return uint32_t The number of ticks corresponding to 'nsecs'
- */
-uint32_t
-cputime_nsecs_to_ticks(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = ((nsecs * g_cputime.ticks_per_usec) + 999) / 1000;
-    return ticks;
-}
-
-/**
- * cputime ticks to nsecs
- *
- * Convert the given number of ticks into nanoseconds.
- *
- * @param ticks The number of ticks to convert to nanoseconds.
- *
- * @return uint32_t The number of nanoseconds corresponding to 'ticks'
- */
-uint32_t
-cputime_ticks_to_nsecs(uint32_t ticks)
-{
-    uint32_t nsecs;
-
-    nsecs = ((ticks * 1000) + (g_cputime.ticks_per_usec - 1)) /
-            g_cputime.ticks_per_usec;
-
-    return nsecs;
-}
-
-/**
- * cputime usecs to ticks
- *
- * Converts the given number of microseconds into cputime ticks.
- *
- * @param usecs The number of microseconds to convert to ticks
- *
- * @return uint32_t The number of ticks corresponding to 'usecs'
- */
-uint32_t
-cputime_usecs_to_ticks(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = (usecs * g_cputime.ticks_per_usec);
-    return ticks;
-}
-
-/**
- * cputime ticks to usecs
- *
- * Convert the given number of ticks into microseconds.
- *
- * @param ticks The number of ticks to convert to microseconds.
- *
- * @return uint32_t The number of microseconds corresponding to 'ticks'
- */
-uint32_t
-cputime_ticks_to_usecs(uint32_t ticks)
-{
-    uint32_t us;
-
-    us =  (ticks + (g_cputime.ticks_per_usec - 1)) / g_cputime.ticks_per_usec;
-    return us;
-}
-
-/**
- * cputime delay ticks
- *
- * Wait until the number of ticks has elapsed. This is a blocking delay.
- *
- * @param ticks The number of ticks to wait.
- */
-void
-cputime_delay_ticks(uint32_t ticks)
-{
-    uint32_t until;
-
-    until = cputime_get32() + ticks;
-    while ((int32_t)(cputime_get32() - until) < 0) {
-        /* Loop here till finished */
-    }
-}
-
-/**
- * cputime delay nsecs
- *
- * Wait until 'nsecs' nanoseconds has elapsed. This is a blocking delay.
- *
- * @param nsecs The number of nanoseconds to wait.
- */
-void
-cputime_delay_nsecs(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_nsecs_to_ticks(nsecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime delay usecs
- *
- * Wait until 'usecs' microseconds has elapsed. This is a blocking delay.
- *
- * @param usecs The number of usecs to wait.
- */
-void
-cputime_delay_usecs(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_usecs_to_ticks(usecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime timer init
- *
- *
- * @param timer The timer to initialize. Cannot be NULL.
- * @param fp    The timer callback function. Cannot be NULL.
- * @param arg   Pointer to data object to pass to timer.
- */
-void
-cputime_timer_init(struct cpu_timer *timer, cputimer_func fp, void *arg)
-{
-    assert(timer != NULL);
-    assert(fp != NULL);
-
-    timer->cb = fp;
-    timer->arg = arg;
-    timer->link.tqe_prev = (void *) NULL;
-}
-
-/**
- * cputime timer start
- *
- * Start a cputimer that will expire at 'cputime'. If cputime has already
- * passed, the timer callback will still be called (at interrupt context).
- * Cannot be called when the timer has already started.
- *
- * @param timer     Pointer to timer to start. Cannot be NULL.
- * @param cputime   The cputime at which the timer should expire.
- */
-void
-cputime_timer_start(struct cpu_timer *timer, uint32_t cputime)
-{
-    struct cpu_timer *entry;
-    uint32_t ctx;
-
-    assert(timer != NULL);
-    assert(timer->link.tqe_prev == NULL);
-
-    /* XXX: should this use a mutex? not sure... */
-    __HAL_DISABLE_INTERRUPTS(ctx);
-
-    timer->cputime = cputime;
-    if (TAILQ_EMPTY(&g_cputimer_q)) {
-        TAILQ_INSERT_HEAD(&g_cputimer_q, timer, link);
-    } else {
-        TAILQ_FOREACH(entry, &g_cputimer_q, link) {
-            if ((int32_t)(timer->cputime - entry->cputime) < 0) {
-                TAILQ_INSERT_BEFORE(entry, timer, link);
-                break;
-            }
-        }
-        if (!entry) {
-            TAILQ_INSERT_TAIL(&g_cputimer_q, timer, link);
-        }
-    }
-
-    /* If this is the head, we need to set new OCMP */
-    if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-        cputime_set_ocmp(timer);
-    }
-
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-
-/**
- * cputimer timer relative
- *
- * Sets a cpu timer that will expire 'usecs' microseconds from the current
- * cputime.
- *
- * @param timer Pointer to timer. Cannot be NULL.
- * @param usecs The number of usecs from now at which the timer will expire.
- */
-void
-cputime_timer_relative(struct cpu_timer *timer, uint32_t usecs)
-{
-    uint32_t cputime;
-
-    assert(timer != NULL);
-
-    cputime = cputime_get32() + cputime_usecs_to_ticks(usecs);
-    cputime_timer_start(timer, cputime);
-}
-
-/**
- * cputime timer stop
- *
- * Stops a cputimer from running. The timer is removed from the timer queue
- * and interrupts are disabled if no timers are left on the queue. Can be
- * called even if timer is not running.
- *
- * @param timer Pointer to cputimer to stop. Cannot be NULL.
- */
-void
-cputime_timer_stop(struct cpu_timer *timer)
-{
-    int reset_ocmp;
-    uint32_t ctx;
-    struct cpu_timer *entry;
-
-    assert(timer != NULL);
-
-    __HAL_DISABLE_INTERRUPTS(ctx);
-
-    if (timer->link.tqe_prev != NULL) {
-        reset_ocmp = 0;
-        if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-            /* If first on queue, we will need to reset OCMP */
-            entry = TAILQ_NEXT(timer, link);
-            reset_ocmp = 1;
-        }
-        TAILQ_REMOVE(&g_cputimer_q, timer, link);
-        timer->link.tqe_prev = NULL;
-        if (reset_ocmp) {
-            if (entry) {
-                cputime_set_ocmp(entry);
-            } else {
-                cputime_disable_ocmp();
-            }
-        }
-    }
-
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/183873d8/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
----------------------------------------------------------------------
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c b/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
index fbcc96d..d58fee3 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
@@ -49,22 +49,7 @@
  *  - Should I use macro for compare channel?
  *  - Sync to OSTIME.
  */
-
-/* CPUTIME data */
-struct cputime_data
-{
-    uint32_t ticks_per_usec;    /* number of ticks per usec */
-    uint32_t cputime_high;      /* high word of 64-bit cpu time */
-    uint32_t timer_isrs;        /* Number of timer interrupts */
-    uint32_t ocmp_ints;         /* Number of ocmp interrupts */
-    uint32_t uif_ints;          /* Number of overflow interrupts */
-};
-struct cputime_data g_cputime;
-
-/* Queue for timers */
-TAILQ_HEAD(cputime_qhead, cpu_timer) g_cputimer_q;
-
-__STATIC_INLINE void
+void
 cputime_disable_ocmp(void)
 {
     CPUTIMER->INTENCLR = CPUTIMER_INT_MASK(CPUTIMER_CC_INT);
@@ -79,11 +64,11 @@ cputime_disable_ocmp(void)
  *
  * @param timer Pointer to timer.
  */
-static void
+void
 cputime_set_ocmp(struct cpu_timer *timer)
 {
     /* Disable ocmp interrupt and set new value */
-    cputime_disable_ocmp();
+    CPUTIMER->INTENCLR = CPUTIMER_INT_MASK(CPUTIMER_CC_INT);
 
     /* Set output compare register to timer expiration */
     CPUTIMER->CC[CPUTIMER_CC_INT] = timer->cputime;
@@ -101,41 +86,6 @@ cputime_set_ocmp(struct cpu_timer *timer)
 }
 
 /**
- * cputime chk expiration
- *
- * Iterates through the cputimer queue to determine if any timers have expired.
- * If the timer has expired the timer is removed from the queue and the timer
- * callback function is executed.
- *
- */
-static void
-cputime_chk_expiration(void)
-{
-    uint32_t ctx;
-    struct cpu_timer *timer;
-
-    __HAL_DISABLE_INTERRUPTS(ctx);
-    while ((timer = TAILQ_FIRST(&g_cputimer_q)) != NULL) {
-        if ((int32_t)(cputime_get32() - timer->cputime) >= 0) {
-            TAILQ_REMOVE(&g_cputimer_q, timer, link);
-            timer->link.tqe_prev = NULL;
-            timer->cb(timer->arg);
-        } else {
-            break;
-        }
-    }
-
-    /* Any timers left on queue? If so, we need to set OCMP */
-    timer = TAILQ_FIRST(&g_cputimer_q);
-    if (timer) {
-        cputime_set_ocmp(timer);
-    } else {
-        cputime_disable_ocmp();
-    }
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-
-/**
  * cputime isr
  *
  * This is the global timer interrupt routine.
@@ -186,18 +136,17 @@ cputime_isr(void)
 }
 
 /**
- * cputime init
+ * cputime hw init
  *
- * Initialize the cputime module. This must be called after os_init is called
- * and before any other timer API are used. This should be called only once
- * and should be called before the hardware timer is used.
+ * Initialize the cputime hw. This should be called only once and should be
+ * called before the hardware timer is used.
  *
  * @param clock_freq The desired cputime frequency, in hertz (Hz).
  *
  * @return int 0 on success; -1 on error.
  */
 int
-cputime_init(uint32_t clock_freq)
+cputime_hw_init(uint32_t clock_freq)
 {
     uint32_t ctx;
     uint32_t max_freq;
@@ -250,9 +199,6 @@ cputime_init(uint32_t clock_freq)
         return -1;
     }
 
-    /* Initialize the timer queue */
-    TAILQ_INIT(&g_cputimer_q);
-
     /* disable interrupts */
     __HAL_DISABLE_INTERRUPTS(ctx);
 
@@ -339,253 +285,3 @@ cputime_get32(void)
 
     return cpu_time;
 }
-
-/**
- * cputime nsecs to ticks
- *
- * Converts the given number of nanoseconds into cputime ticks.
- *
- * @param usecs The number of nanoseconds to convert to ticks
- *
- * @return uint32_t The number of ticks corresponding to 'nsecs'
- */
-uint32_t
-cputime_nsecs_to_ticks(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = ((nsecs * g_cputime.ticks_per_usec) + 999) / 1000;
-    return ticks;
-}
-
-/**
- * cputime ticks to nsecs
- *
- * Convert the given number of ticks into nanoseconds.
- *
- * @param ticks The number of ticks to convert to nanoseconds.
- *
- * @return uint32_t The number of nanoseconds corresponding to 'ticks'
- */
-uint32_t
-cputime_ticks_to_nsecs(uint32_t ticks)
-{
-    uint32_t nsecs;
-
-    nsecs = ((ticks * 1000) + (g_cputime.ticks_per_usec - 1)) /
-            g_cputime.ticks_per_usec;
-
-    return nsecs;
-}
-
-/**
- * cputime usecs to ticks
- *
- * Converts the given number of microseconds into cputime ticks.
- *
- * @param usecs The number of microseconds to convert to ticks
- *
- * @return uint32_t The number of ticks corresponding to 'usecs'
- */
-uint32_t
-cputime_usecs_to_ticks(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = (usecs * g_cputime.ticks_per_usec);
-    return ticks;
-}
-
-/**
- * cputime ticks to usecs
- *
- * Convert the given number of ticks into microseconds.
- *
- * @param ticks The number of ticks to convert to microseconds.
- *
- * @return uint32_t The number of microseconds corresponding to 'ticks'
- */
-uint32_t
-cputime_ticks_to_usecs(uint32_t ticks)
-{
-    uint32_t us;
-
-    us =  (ticks + (g_cputime.ticks_per_usec - 1)) / g_cputime.ticks_per_usec;
-    return us;
-}
-
-/**
- * cputime delay ticks
- *
- * Wait until the number of ticks has elapsed. This is a blocking delay.
- *
- * @param ticks The number of ticks to wait.
- */
-void
-cputime_delay_ticks(uint32_t ticks)
-{
-    uint32_t until;
-
-    until = cputime_get32() + ticks;
-    while ((int32_t)(cputime_get32() - until) < 0) {
-        /* Loop here till finished */
-    }
-}
-
-/**
- * cputime delay nsecs
- *
- * Wait until 'nsecs' nanoseconds has elapsed. This is a blocking delay.
- *
- * @param nsecs The number of nanoseconds to wait.
- */
-void
-cputime_delay_nsecs(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_nsecs_to_ticks(nsecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime delay usecs
- *
- * Wait until 'usecs' microseconds has elapsed. This is a blocking delay.
- *
- * @param usecs The number of usecs to wait.
- */
-void
-cputime_delay_usecs(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_usecs_to_ticks(usecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime timer init
- *
- *
- * @param timer The timer to initialize. Cannot be NULL.
- * @param fp    The timer callback function. Cannot be NULL.
- * @param arg   Pointer to data object to pass to timer.
- */
-void
-cputime_timer_init(struct cpu_timer *timer, cputimer_func fp, void *arg)
-{
-    assert(timer != NULL);
-    assert(fp != NULL);
-
-    timer->cb = fp;
-    timer->arg = arg;
-    timer->link.tqe_prev = (void *) NULL;
-}
-
-/**
- * cputime timer start
- *
- * Start a cputimer that will expire at 'cputime'. If cputime has already
- * passed, the timer callback will still be called (at interrupt context).
- * Cannot be called when the timer has already started.
- *
- * @param timer     Pointer to timer to start. Cannot be NULL.
- * @param cputime   The cputime at which the timer should expire.
- */
-void
-cputime_timer_start(struct cpu_timer *timer, uint32_t cputime)
-{
-    struct cpu_timer *entry;
-    uint32_t ctx;
-
-    assert(timer != NULL);
-    assert(timer->link.tqe_prev == NULL);
-
-    /* XXX: should this use a mutex? not sure... */
-    __HAL_DISABLE_INTERRUPTS(ctx);
-
-    timer->cputime = cputime;
-    if (TAILQ_EMPTY(&g_cputimer_q)) {
-        TAILQ_INSERT_HEAD(&g_cputimer_q, timer, link);
-    } else {
-        TAILQ_FOREACH(entry, &g_cputimer_q, link) {
-            if ((int32_t)(timer->cputime - entry->cputime) < 0) {
-                TAILQ_INSERT_BEFORE(entry, timer, link);
-                break;
-            }
-        }
-        if (!entry) {
-            TAILQ_INSERT_TAIL(&g_cputimer_q, timer, link);
-        }
-    }
-
-    /* If this is the head, we need to set new OCMP */
-    if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-        cputime_set_ocmp(timer);
-    }
-
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-
-/**
- * cputimer timer relative
- *
- * Sets a cpu timer that will expire 'usecs' microseconds from the current
- * cputime.
- *
- * @param timer Pointer to timer. Cannot be NULL.
- * @param usecs The number of usecs from now at which the timer will expire.
- */
-void
-cputime_timer_relative(struct cpu_timer *timer, uint32_t usecs)
-{
-    uint32_t cputime;
-
-    assert(timer != NULL);
-
-    cputime = cputime_get32() + cputime_usecs_to_ticks(usecs);
-    cputime_timer_start(timer, cputime);
-}
-
-/**
- * cputime timer stop
- *
- * Stops a cputimer from running. The timer is removed from the timer queue
- * and interrupts are disabled if no timers are left on the queue. Can be
- * called even if timer is not running.
- *
- * @param timer Pointer to cputimer to stop. Cannot be NULL.
- */
-void
-cputime_timer_stop(struct cpu_timer *timer)
-{
-    int reset_ocmp;
-    uint32_t ctx;
-    struct cpu_timer *entry;
-
-    assert(timer != NULL);
-
-    __HAL_DISABLE_INTERRUPTS(ctx);
-
-    if (timer->link.tqe_prev != NULL) {
-        reset_ocmp = 0;
-        if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-            /* If first on queue, we will need to reset OCMP */
-            entry = TAILQ_NEXT(timer, link);
-            reset_ocmp = 1;
-        }
-        TAILQ_REMOVE(&g_cputimer_q, timer, link);
-        timer->link.tqe_prev = NULL;
-        if (reset_ocmp) {
-            if (entry) {
-                cputime_set_ocmp(entry);
-            } else {
-                cputime_disable_ocmp();
-            }
-        }
-    }
-
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/183873d8/hw/mcu/stm/stm32f4xx/src/hal_cputime.c
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/src/hal_cputime.c b/hw/mcu/stm/stm32f4xx/src/hal_cputime.c
index f3ada59..0025670 100644
--- a/hw/mcu/stm/stm32f4xx/src/hal_cputime.c
+++ b/hw/mcu/stm/stm32f4xx/src/hal_cputime.c
@@ -6,7 +6,7 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
@@ -31,28 +31,20 @@
  *  - Sync to OSTIME.
  */
 
-/* CPUTIME data */
-struct cputime_data
+void
+cputime_disable_ocmp(void)
 {
-    uint32_t ticks_per_usec;    /* number of ticks per usec */
-    uint32_t cputime_high;      /* high word of 64-bit cpu time */
-    uint32_t timer_isrs;        /* Number of timer interrupts */
-    uint32_t ocmp_ints;         /* Number of ocmp interrupts */
-    uint32_t uif_ints;          /* Number of overflow interrupts */
-};
-struct cputime_data g_cputime;
-
-/* Queue for timers */
-TAILQ_HEAD(cputime_qhead, cpu_timer) g_cputimer_q;
+    TIM5->DIER &= ~TIM_DIER_CC4IE;
+}
 
 /**
- * cputime set ocmp 
- *  
- * Set the OCMP used by the cputime module to the desired cputime. 
- * 
+ * cputime set ocmp
+ *
+ * Set the OCMP used by the cputime module to the desired cputime.
+ *
  * @param timer Pointer to timer.
  */
-static void
+void
 cputime_set_ocmp(struct cpu_timer *timer)
 {
     TIM5->DIER &= ~TIM_DIER_CC4IE;
@@ -66,44 +58,10 @@ cputime_set_ocmp(struct cpu_timer *timer)
 }
 
 /**
- * cputime chk expiration 
- *  
- * Iterates through the cputimer queue to determine if any timers have expired. 
- * If the timer has expired the timer is removed from the queue and the timer 
- * callback function is executed. 
- * 
- */
-static void
-cputime_chk_expiration(void)
-{
-    uint32_t ctx;
-    struct cpu_timer *timer;
-
-    __HAL_DISABLE_INTERRUPTS(ctx);
-    while ((timer = TAILQ_FIRST(&g_cputimer_q)) != NULL) {
-        if ((int32_t)(cputime_get32() - timer->cputime) >= 0) {
-            TAILQ_REMOVE(&g_cputimer_q, timer, link);
-            timer->cb(timer->arg);
-        } else {
-            break;
-        }
-    }
-
-    /* Any timers left on queue? If so, we need to set OCMP */
-    timer = TAILQ_FIRST(&g_cputimer_q);
-    if (timer) {
-        cputime_set_ocmp(timer);
-    } else {
-        TIM5->DIER &= ~TIM_DIER_CC4IE;
-    }
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-
-/**
- * tim5 isr 
- *  
- * This is the global timer interrupt routine. 
- * 
+ * tim5 isr
+ *
+ * This is the global timer interrupt routine.
+ *
  */
 static void
 cputime_isr(void)
@@ -133,18 +91,17 @@ cputime_isr(void)
 }
 
 /**
- * cputime init 
- *  
- * Initialize the cputime module. This must be called after os_init is called 
- * and before any other timer API are used. This should be called only once 
- * and should be called before the hardware timer is used. 
- * 
+ * cputime hw init
+ *
+ * Initialize the cputime hw. This should be called only once and should be
+ * called before the hardware timer is used.
+ *
  * @param clock_freq The desired cputime frequency, in hertz (Hz).
- * 
+ *
  * @return int 0 on success; -1 on error.
  */
 int
-cputime_init(uint32_t clock_freq)
+cputime_hw_init(uint32_t clock_freq)
 {
     uint32_t ctx;
     uint32_t max_freq;
@@ -167,9 +124,6 @@ cputime_init(uint32_t clock_freq)
         return -1;
     }
 
-    /* Initialize the timer queue */
-    TAILQ_INIT(&g_cputimer_q);
-
     /* disable interrupts */
     __HAL_DISABLE_INTERRUPTS(ctx);
 
@@ -184,10 +138,10 @@ cputime_init(uint32_t clock_freq)
     /* In debug mode, we want this timer to be halted */
     DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_TIM5_STOP;
 
-    /* 
+    /*
      * Counter is an up counter with event generation disabled. We disable the
      * timer with this first write, just in case.
-     */ 
+     */
     TIM5->DIER = 0;
     TIM5->CR1 = 0;
     TIM5->CR2 = 0;
@@ -228,12 +182,12 @@ cputime_init(uint32_t clock_freq)
 
 /**
  * cputime get64
- *  
- * Returns cputime as a 64-bit number. 
- * 
+ *
+ * Returns cputime as a 64-bit number.
+ *
  * @return uint64_t The 64-bit representation of cputime.
  */
-uint64_t 
+uint64_t
 cputime_get64(void)
 {
     uint32_t ctx;
@@ -256,10 +210,10 @@ cputime_get64(void)
 }
 
 /**
- * cputime get32 
- *  
- * Returns the low 32 bits of cputime. 
- * 
+ * cputime get32
+ *
+ * Returns the low 32 bits of cputime.
+ *
  * @return uint32_t The lower 32 bits of cputime
  */
 uint32_t
@@ -267,250 +221,3 @@ cputime_get32(void)
 {
     return TIM5->CNT;
 }
-
-/**
- * cputime nsecs to ticks 
- *  
- * Converts the given number of nanoseconds into cputime ticks. 
- * 
- * @param usecs The number of nanoseconds to convert to ticks
- * 
- * @return uint32_t The number of ticks corresponding to 'nsecs'
- */
-uint32_t 
-cputime_nsecs_to_ticks(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = ((nsecs * g_cputime.ticks_per_usec) + 999) / 1000;
-    return ticks;
-}
-
-/**
- * cputime ticks to nsecs
- *  
- * Convert the given number of ticks into nanoseconds. 
- * 
- * @param ticks The number of ticks to convert to nanoseconds.
- * 
- * @return uint32_t The number of nanoseconds corresponding to 'ticks'
- */
-uint32_t 
-cputime_ticks_to_nsecs(uint32_t ticks)
-{
-    uint32_t nsecs;
-
-    nsecs = ((ticks * 1000) + (g_cputime.ticks_per_usec - 1)) / 
-            g_cputime.ticks_per_usec;
-
-    return nsecs;
-}
-
-/**
- * cputime usecs to ticks 
- *  
- * Converts the given number of microseconds into cputime ticks. 
- * 
- * @param usecs The number of microseconds to convert to ticks
- * 
- * @return uint32_t The number of ticks corresponding to 'usecs'
- */
-uint32_t 
-cputime_usecs_to_ticks(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = (usecs * g_cputime.ticks_per_usec);
-    return ticks;
-}
-
-/**
- * cputime ticks to usecs
- *  
- * Convert the given number of ticks into microseconds. 
- * 
- * @param ticks The number of ticks to convert to microseconds.
- * 
- * @return uint32_t The number of microseconds corresponding to 'ticks'
- */
-uint32_t 
-cputime_ticks_to_usecs(uint32_t ticks)
-{
-    uint32_t us;
-
-    us =  (ticks + (g_cputime.ticks_per_usec - 1)) / g_cputime.ticks_per_usec;
-    return us;
-}
-
-/**
- * cputime delay ticks
- *  
- * Wait until the number of ticks has elapsed. This is a blocking delay. 
- * 
- * @param ticks The number of ticks to wait.
- */
-void 
-cputime_delay_ticks(uint32_t ticks)
-{
-    uint32_t until;
-
-    until = cputime_get32() + ticks;
-    while ((int32_t)(cputime_get32() - until) < 0) {
-        /* Loop here till finished */
-    }
-}
-
-/**
- * cputime delay nsecs 
- *  
- * Wait until 'nsecs' nanoseconds has elapsed. This is a blocking delay. 
- *  
- * @param nsecs The number of nanoseconds to wait.
- */
-void 
-cputime_delay_nsecs(uint32_t nsecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_nsecs_to_ticks(nsecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime delay usecs 
- *  
- * Wait until 'usecs' microseconds has elapsed. This is a blocking delay. 
- *  
- * @param usecs The number of usecs to wait.
- */
-void 
-cputime_delay_usecs(uint32_t usecs)
-{
-    uint32_t ticks;
-
-    ticks = cputime_usecs_to_ticks(usecs);
-    cputime_delay_ticks(ticks);
-}
-
-/**
- * cputime timer init
- * 
- * 
- * @param timer The timer to initialize. Cannot be NULL.
- * @param fp    The timer callback function. Cannot be NULL.
- * @param arg   Pointer to data object to pass to timer. 
- */
-void 
-cputime_timer_init(struct cpu_timer *timer, cputimer_func fp, void *arg)
-{
-    assert(timer != NULL);
-    assert(fp != NULL);
-
-    timer->cb = fp;
-    timer->arg = arg;
-    timer->link.tqe_prev = (void *) NULL;
-}
-
-/**
- * cputime timer start 
- *  
- * Start a cputimer that will expire at 'cputime'. If cputime has already 
- * passed, the timer callback will still be called (at interrupt context). 
- * 
- * @param timer     Pointer to timer to start. Cannot be NULL.
- * @param cputime   The cputime at which the timer should expire.
- */
-void 
-cputime_timer_start(struct cpu_timer *timer, uint32_t cputime)
-{
-    struct cpu_timer *entry;
-    uint32_t ctx;
-
-    assert(timer != NULL);
-
-    /* XXX: should this use a mutex? not sure... */
-    __HAL_DISABLE_INTERRUPTS(ctx);
-
-    timer->cputime = cputime;
-    if (TAILQ_EMPTY(&g_cputimer_q)) {
-        TAILQ_INSERT_HEAD(&g_cputimer_q, timer, link);
-    } else {
-        TAILQ_FOREACH(entry, &g_cputimer_q, link) {
-            if ((int32_t)(timer->cputime - entry->cputime) < 0) {
-                TAILQ_INSERT_BEFORE(entry, timer, link);   
-                break;
-            }
-        }
-        if (!entry) {
-            TAILQ_INSERT_TAIL(&g_cputimer_q, timer, link);
-        }
-    }
-
-    /* If this is the head, we need to set new OCMP */
-    if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-        cputime_set_ocmp(timer);
-    }
-
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-
-/**
- * cputimer timer relative 
- *  
- * Sets a cpu timer that will expire 'usecs' microseconds from the current 
- * cputime. 
- * 
- * @param timer Pointer to timer. Cannot be NULL.
- * @param usecs The number of usecs from now at which the timer will expire.
- */
-void 
-cputime_timer_relative(struct cpu_timer *timer, uint32_t usecs)
-{
-    uint32_t cputime;
-
-    assert(timer != NULL);
-
-    cputime = cputime_get32() + cputime_usecs_to_ticks(usecs);
-    cputime_timer_start(timer, cputime);
-}
-
-/**
- * cputime timer stop 
- *  
- * Stops a cputimer from running. The timer is removed from the timer queue 
- * and interrupts are disabled if no timers are left on the queue. Can be 
- * called even if timer is running. 
- * 
- * @param timer Pointer to cputimer to stop. Cannot be NULL.
- */
-void 
-cputime_timer_stop(struct cpu_timer *timer)
-{
-    int reset_ocmp;
-    uint32_t ctx;
-    struct cpu_timer *entry;
-
-    assert(timer != NULL);
-
-    __HAL_DISABLE_INTERRUPTS(ctx);
-
-    /* If first on queue, we will need to reset OCMP */
-    if (timer->link.tqe_prev != NULL) {
-        reset_ocmp = 0;
-        if (timer == TAILQ_FIRST(&g_cputimer_q)) {
-            entry = TAILQ_NEXT(timer, link);
-            reset_ocmp = 1;
-        }
-        TAILQ_REMOVE(&g_cputimer_q, timer, link);
-        if (reset_ocmp) {
-            if (entry) {
-                cputime_set_ocmp(entry);
-            } else {
-                TIM5->DIER &= ~TIM_DIER_CC4IE;
-            }
-        }
-    }
-
-    __HAL_ENABLE_INTERRUPTS(ctx);
-}
-