ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /*
group-onsemi 0:098463de4c5d 2 * Copyright (c) 2016 ARM Limited, All Rights Reserved
group-onsemi 0:098463de4c5d 3 */
group-onsemi 0:098463de4c5d 4
group-onsemi 0:098463de4c5d 5 // Include before mbed.h to properly get UINT*_C()
group-onsemi 0:098463de4c5d 6 #include "ns_types.h"
group-onsemi 0:098463de4c5d 7
group-onsemi 0:098463de4c5d 8 #include "cmsis_os.h"
group-onsemi 0:098463de4c5d 9 #include "mbed.h"
group-onsemi 0:098463de4c5d 10
group-onsemi 0:098463de4c5d 11 #include "platform/arm_hal_timer.h"
group-onsemi 0:098463de4c5d 12 #include "platform/arm_hal_interrupt.h"
group-onsemi 0:098463de4c5d 13
group-onsemi 0:098463de4c5d 14 static osThreadId timer_thread_id;
group-onsemi 0:098463de4c5d 15
group-onsemi 0:098463de4c5d 16 static Timer timer;
group-onsemi 0:098463de4c5d 17 static Timeout timeout;
group-onsemi 0:098463de4c5d 18 static uint32_t due;
group-onsemi 0:098463de4c5d 19 static void (*arm_hal_callback)(void);
group-onsemi 0:098463de4c5d 20
group-onsemi 0:098463de4c5d 21 static void timer_thread(const void *)
group-onsemi 0:098463de4c5d 22 {
group-onsemi 0:098463de4c5d 23 for (;;) {
group-onsemi 0:098463de4c5d 24 osSignalWait(1, osWaitForever);
group-onsemi 0:098463de4c5d 25 // !!! We don't do our own enter/exit critical - we rely on callback
group-onsemi 0:098463de4c5d 26 // doing it (ns_timer_interrupt_handler does)
group-onsemi 0:098463de4c5d 27 //platform_enter_critical();
group-onsemi 0:098463de4c5d 28 arm_hal_callback();
group-onsemi 0:098463de4c5d 29 //platform_exit_critical();
group-onsemi 0:098463de4c5d 30 }
group-onsemi 0:098463de4c5d 31 }
group-onsemi 0:098463de4c5d 32
group-onsemi 0:098463de4c5d 33 // Called once at boot
group-onsemi 0:098463de4c5d 34 void platform_timer_enable(void)
group-onsemi 0:098463de4c5d 35 {
group-onsemi 0:098463de4c5d 36 static osThreadDef(timer_thread, osPriorityRealtime, /*1,*/ 2*1024);
group-onsemi 0:098463de4c5d 37 timer_thread_id = osThreadCreate(osThread(timer_thread), NULL);
group-onsemi 0:098463de4c5d 38 timer.start();
group-onsemi 0:098463de4c5d 39 }
group-onsemi 0:098463de4c5d 40
group-onsemi 0:098463de4c5d 41 // Actually cancels a timer, not the opposite of enable
group-onsemi 0:098463de4c5d 42 void platform_timer_disable(void)
group-onsemi 0:098463de4c5d 43 {
group-onsemi 0:098463de4c5d 44 timeout.detach();
group-onsemi 0:098463de4c5d 45 }
group-onsemi 0:098463de4c5d 46
group-onsemi 0:098463de4c5d 47 // Not called while running, fortunately
group-onsemi 0:098463de4c5d 48 void platform_timer_set_cb(void (*new_fp)(void))
group-onsemi 0:098463de4c5d 49 {
group-onsemi 0:098463de4c5d 50 arm_hal_callback = new_fp;
group-onsemi 0:098463de4c5d 51 }
group-onsemi 0:098463de4c5d 52
group-onsemi 0:098463de4c5d 53 static void timer_callback(void)
group-onsemi 0:098463de4c5d 54 {
group-onsemi 0:098463de4c5d 55 due = 0;
group-onsemi 0:098463de4c5d 56 osSignalSet(timer_thread_id, 1);
group-onsemi 0:098463de4c5d 57 //callback();
group-onsemi 0:098463de4c5d 58 }
group-onsemi 0:098463de4c5d 59
group-onsemi 0:098463de4c5d 60 // This is called from inside platform_enter_critical - IRQs can't happen
group-onsemi 0:098463de4c5d 61 void platform_timer_start(uint16_t slots)
group-onsemi 0:098463de4c5d 62 {
group-onsemi 0:098463de4c5d 63 timer.reset();
group-onsemi 0:098463de4c5d 64 due = slots * UINT32_C(50);
group-onsemi 0:098463de4c5d 65 timeout.attach_us(timer_callback, due);
group-onsemi 0:098463de4c5d 66 }
group-onsemi 0:098463de4c5d 67
group-onsemi 0:098463de4c5d 68 // This is called from inside platform_enter_critical - IRQs can't happen
group-onsemi 0:098463de4c5d 69 uint16_t platform_timer_get_remaining_slots(void)
group-onsemi 0:098463de4c5d 70 {
group-onsemi 0:098463de4c5d 71 uint32_t elapsed = timer.read_us();
group-onsemi 0:098463de4c5d 72 if (elapsed < due) {
group-onsemi 0:098463de4c5d 73 return (uint16_t) ((due - elapsed) / 50);
group-onsemi 0:098463de4c5d 74 } else {
group-onsemi 0:098463de4c5d 75 return 0;
group-onsemi 0:098463de4c5d 76 }
group-onsemi 0:098463de4c5d 77 }
group-onsemi 0:098463de4c5d 78