mbed official / mbed-dev

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Nov 08 11:46:34 2018 +0000
Revision:
188:bcfe06ba3d64
Parent:
187:0387e8f68319
Child:
189:f392fc9709a3
mbed-dev library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 /* mbed Microcontroller Library
Anna Bridge 186:707f6e361f3e 2 * Copyright (c) 2018 ARM Limited
Anna Bridge 186:707f6e361f3e 3 *
Anna Bridge 186:707f6e361f3e 4 * Licensed under the Apache License, Version 2.0 (the "License");
Anna Bridge 186:707f6e361f3e 5 * you may not use this file except in compliance with the License.
Anna Bridge 186:707f6e361f3e 6 * You may obtain a copy of the License at
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * http://www.apache.org/licenses/LICENSE-2.0
Anna Bridge 186:707f6e361f3e 9 *
Anna Bridge 186:707f6e361f3e 10 * Unless required by applicable law or agreed to in writing, software
Anna Bridge 186:707f6e361f3e 11 * distributed under the License is distributed on an "AS IS" BASIS,
Anna Bridge 186:707f6e361f3e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Anna Bridge 186:707f6e361f3e 13 * See the License for the specific language governing permissions and
Anna Bridge 186:707f6e361f3e 14 * limitations under the License.
Anna Bridge 186:707f6e361f3e 15 */
AnnaBridge 188:bcfe06ba3d64 16 #include "hal/mbed_lp_ticker_wrapper.h"
Anna Bridge 186:707f6e361f3e 17
Anna Bridge 186:707f6e361f3e 18 #if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
Anna Bridge 186:707f6e361f3e 19
AnnaBridge 188:bcfe06ba3d64 20 #include "hal/LowPowerTickerWrapper.h"
AnnaBridge 188:bcfe06ba3d64 21 #include "platform/mbed_critical.h"
Anna Bridge 186:707f6e361f3e 22
Anna Bridge 186:707f6e361f3e 23 // Do not use SingletonPtr since this must be initialized in a critical section
AnnaBridge 188:bcfe06ba3d64 24 static LowPowerTickerWrapper *ticker_wrapper;
AnnaBridge 188:bcfe06ba3d64 25 static uint64_t ticker_wrapper_data[(sizeof(LowPowerTickerWrapper) + 7) / 8];
AnnaBridge 188:bcfe06ba3d64 26 static bool init = false;
Anna Bridge 186:707f6e361f3e 27
AnnaBridge 188:bcfe06ba3d64 28 static void lp_ticker_wrapper_init()
Anna Bridge 186:707f6e361f3e 29 {
AnnaBridge 188:bcfe06ba3d64 30 ticker_wrapper->init();
AnnaBridge 188:bcfe06ba3d64 31 }
Anna Bridge 186:707f6e361f3e 32
AnnaBridge 188:bcfe06ba3d64 33 static uint32_t lp_ticker_wrapper_read()
AnnaBridge 188:bcfe06ba3d64 34 {
AnnaBridge 188:bcfe06ba3d64 35 return ticker_wrapper->read();
AnnaBridge 188:bcfe06ba3d64 36 }
Anna Bridge 186:707f6e361f3e 37
AnnaBridge 188:bcfe06ba3d64 38 static void lp_ticker_wrapper_set_interrupt(timestamp_t timestamp)
AnnaBridge 188:bcfe06ba3d64 39 {
AnnaBridge 188:bcfe06ba3d64 40 ticker_wrapper->set_interrupt(timestamp);
AnnaBridge 188:bcfe06ba3d64 41 }
Anna Bridge 186:707f6e361f3e 42
AnnaBridge 188:bcfe06ba3d64 43 static void lp_ticker_wrapper_disable_interrupt()
AnnaBridge 188:bcfe06ba3d64 44 {
AnnaBridge 188:bcfe06ba3d64 45 ticker_wrapper->disable_interrupt();
Anna Bridge 186:707f6e361f3e 46 }
Anna Bridge 186:707f6e361f3e 47
AnnaBridge 188:bcfe06ba3d64 48 static void lp_ticker_wrapper_clear_interrupt()
AnnaBridge 188:bcfe06ba3d64 49 {
AnnaBridge 188:bcfe06ba3d64 50 ticker_wrapper->clear_interrupt();
AnnaBridge 188:bcfe06ba3d64 51 }
AnnaBridge 188:bcfe06ba3d64 52
AnnaBridge 188:bcfe06ba3d64 53 static void lp_ticker_wrapper_fire_interrupt()
Anna Bridge 186:707f6e361f3e 54 {
AnnaBridge 188:bcfe06ba3d64 55 ticker_wrapper->fire_interrupt();
AnnaBridge 188:bcfe06ba3d64 56 }
AnnaBridge 188:bcfe06ba3d64 57
AnnaBridge 188:bcfe06ba3d64 58 static const ticker_info_t *lp_ticker_wrapper_get_info()
AnnaBridge 188:bcfe06ba3d64 59 {
AnnaBridge 188:bcfe06ba3d64 60 return ticker_wrapper->get_info();
Anna Bridge 186:707f6e361f3e 61 }
Anna Bridge 186:707f6e361f3e 62
AnnaBridge 188:bcfe06ba3d64 63 static void lp_ticker_wrapper_free()
AnnaBridge 188:bcfe06ba3d64 64 {
AnnaBridge 188:bcfe06ba3d64 65 ticker_wrapper->free();
AnnaBridge 188:bcfe06ba3d64 66 }
AnnaBridge 188:bcfe06ba3d64 67
AnnaBridge 188:bcfe06ba3d64 68 static const ticker_interface_t lp_interface = {
AnnaBridge 188:bcfe06ba3d64 69 lp_ticker_wrapper_init,
AnnaBridge 188:bcfe06ba3d64 70 lp_ticker_wrapper_read,
AnnaBridge 188:bcfe06ba3d64 71 lp_ticker_wrapper_disable_interrupt,
AnnaBridge 188:bcfe06ba3d64 72 lp_ticker_wrapper_clear_interrupt,
AnnaBridge 188:bcfe06ba3d64 73 lp_ticker_wrapper_set_interrupt,
AnnaBridge 188:bcfe06ba3d64 74 lp_ticker_wrapper_fire_interrupt,
AnnaBridge 188:bcfe06ba3d64 75 lp_ticker_wrapper_free,
AnnaBridge 188:bcfe06ba3d64 76 lp_ticker_wrapper_get_info
AnnaBridge 188:bcfe06ba3d64 77 };
AnnaBridge 188:bcfe06ba3d64 78
AnnaBridge 188:bcfe06ba3d64 79 void lp_ticker_wrapper_irq_handler(ticker_irq_handler_type handler)
Anna Bridge 186:707f6e361f3e 80 {
Anna Bridge 186:707f6e361f3e 81 core_util_critical_section_enter();
Anna Bridge 186:707f6e361f3e 82
AnnaBridge 188:bcfe06ba3d64 83 if (!init) {
AnnaBridge 188:bcfe06ba3d64 84 // Force ticker to initialize
AnnaBridge 188:bcfe06ba3d64 85 get_lp_ticker_data();
Anna Bridge 186:707f6e361f3e 86 }
AnnaBridge 188:bcfe06ba3d64 87
AnnaBridge 188:bcfe06ba3d64 88 ticker_wrapper->irq_handler(handler);
Anna Bridge 186:707f6e361f3e 89
Anna Bridge 186:707f6e361f3e 90 core_util_critical_section_exit();
Anna Bridge 186:707f6e361f3e 91 }
Anna Bridge 186:707f6e361f3e 92
AnnaBridge 188:bcfe06ba3d64 93 const ticker_data_t *get_lp_ticker_wrapper_data(const ticker_data_t *data)
Anna Bridge 186:707f6e361f3e 94 {
Anna Bridge 186:707f6e361f3e 95 core_util_critical_section_enter();
Anna Bridge 186:707f6e361f3e 96
Anna Bridge 186:707f6e361f3e 97 if (!init) {
AnnaBridge 188:bcfe06ba3d64 98 ticker_wrapper = new (ticker_wrapper_data) LowPowerTickerWrapper(data, &lp_interface, LPTICKER_DELAY_TICKS, LPTICKER_DELAY_TICKS);
Anna Bridge 186:707f6e361f3e 99 init = true;
Anna Bridge 186:707f6e361f3e 100 }
Anna Bridge 186:707f6e361f3e 101
AnnaBridge 188:bcfe06ba3d64 102 core_util_critical_section_exit();
AnnaBridge 188:bcfe06ba3d64 103
AnnaBridge 188:bcfe06ba3d64 104 return &ticker_wrapper->data;
AnnaBridge 188:bcfe06ba3d64 105 }
AnnaBridge 188:bcfe06ba3d64 106
AnnaBridge 188:bcfe06ba3d64 107 void lp_ticker_wrapper_suspend()
AnnaBridge 188:bcfe06ba3d64 108 {
AnnaBridge 188:bcfe06ba3d64 109 if (!init) {
AnnaBridge 188:bcfe06ba3d64 110 // Force ticker to initialize
AnnaBridge 188:bcfe06ba3d64 111 get_lp_ticker_data();
Anna Bridge 186:707f6e361f3e 112 }
Anna Bridge 186:707f6e361f3e 113
AnnaBridge 188:bcfe06ba3d64 114 ticker_wrapper->suspend();
AnnaBridge 188:bcfe06ba3d64 115 }
AnnaBridge 188:bcfe06ba3d64 116
AnnaBridge 188:bcfe06ba3d64 117 void lp_ticker_wrapper_resume()
AnnaBridge 188:bcfe06ba3d64 118 {
AnnaBridge 188:bcfe06ba3d64 119 if (!init) {
AnnaBridge 188:bcfe06ba3d64 120 // Force ticker to initialize
AnnaBridge 188:bcfe06ba3d64 121 get_lp_ticker_data();
Anna Bridge 186:707f6e361f3e 122 }
Anna Bridge 186:707f6e361f3e 123
AnnaBridge 188:bcfe06ba3d64 124 ticker_wrapper->resume();
Anna Bridge 186:707f6e361f3e 125 }
Anna Bridge 186:707f6e361f3e 126
Anna Bridge 186:707f6e361f3e 127 #endif