mbed library sources. Supersedes mbed-src.

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
Child:
189:f392fc9709a3
mbed-dev library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 188:bcfe06ba3d64 1
AnnaBridge 188:bcfe06ba3d64 2 /** \addtogroup hal */
AnnaBridge 188:bcfe06ba3d64 3 /** @{*/
AnnaBridge 188:bcfe06ba3d64 4 /* mbed Microcontroller Library
AnnaBridge 188:bcfe06ba3d64 5 * Copyright (c) 2018 ARM Limited
AnnaBridge 188:bcfe06ba3d64 6 *
AnnaBridge 188:bcfe06ba3d64 7 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 188:bcfe06ba3d64 8 * you may not use this file except in compliance with the License.
AnnaBridge 188:bcfe06ba3d64 9 * You may obtain a copy of the License at
AnnaBridge 188:bcfe06ba3d64 10 *
AnnaBridge 188:bcfe06ba3d64 11 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 188:bcfe06ba3d64 12 *
AnnaBridge 188:bcfe06ba3d64 13 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 188:bcfe06ba3d64 14 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 188:bcfe06ba3d64 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 188:bcfe06ba3d64 16 * See the License for the specific language governing permissions and
AnnaBridge 188:bcfe06ba3d64 17 * limitations under the License.
AnnaBridge 188:bcfe06ba3d64 18 */
AnnaBridge 188:bcfe06ba3d64 19 #ifndef MBED_LOW_POWER_TICKER_WRAPPER_H
AnnaBridge 188:bcfe06ba3d64 20 #define MBED_LOW_POWER_TICKER_WRAPPER_H
AnnaBridge 188:bcfe06ba3d64 21
AnnaBridge 188:bcfe06ba3d64 22 #include "device.h"
AnnaBridge 188:bcfe06ba3d64 23
AnnaBridge 188:bcfe06ba3d64 24 #include "hal/ticker_api.h"
AnnaBridge 188:bcfe06ba3d64 25 #include "hal/us_ticker_api.h"
AnnaBridge 188:bcfe06ba3d64 26 #include "drivers/Timeout.h"
AnnaBridge 188:bcfe06ba3d64 27
AnnaBridge 188:bcfe06ba3d64 28
AnnaBridge 188:bcfe06ba3d64 29 class LowPowerTickerWrapper {
AnnaBridge 188:bcfe06ba3d64 30 public:
AnnaBridge 188:bcfe06ba3d64 31
AnnaBridge 188:bcfe06ba3d64 32
AnnaBridge 188:bcfe06ba3d64 33 /**
AnnaBridge 188:bcfe06ba3d64 34 * Create a new wrapped low power ticker object
AnnaBridge 188:bcfe06ba3d64 35 *
AnnaBridge 188:bcfe06ba3d64 36 * @param data Low power ticker data to wrap
AnnaBridge 188:bcfe06ba3d64 37 * @param interface new ticker interface functions
AnnaBridge 188:bcfe06ba3d64 38 * @param min_cycles_between_writes The number of whole low power clock periods
AnnaBridge 188:bcfe06ba3d64 39 * which must complete before subsequent calls to set_interrupt
AnnaBridge 188:bcfe06ba3d64 40 * @param min_cycles_until_match The minimum number of whole low power clock periods
AnnaBridge 188:bcfe06ba3d64 41 * from the current time for which the match timestamp passed to set_interrupt is
AnnaBridge 188:bcfe06ba3d64 42 * guaranteed to fire.
AnnaBridge 188:bcfe06ba3d64 43 *
AnnaBridge 188:bcfe06ba3d64 44 * N = min_cycles_between_writes
AnnaBridge 188:bcfe06ba3d64 45 *
AnnaBridge 188:bcfe06ba3d64 46 * 0 1 N - 1 N N + 1 N + 2 N + 3
AnnaBridge 188:bcfe06ba3d64 47 * |-------|------...------|-------|-------|-------|-------|
AnnaBridge 188:bcfe06ba3d64 48 * ^ ^
AnnaBridge 188:bcfe06ba3d64 49 * | |
AnnaBridge 188:bcfe06ba3d64 50 * set_interrupt Next set_interrupt allowed
AnnaBridge 188:bcfe06ba3d64 51 *
AnnaBridge 188:bcfe06ba3d64 52 * N = min_cycles_until_match
AnnaBridge 188:bcfe06ba3d64 53 *
AnnaBridge 188:bcfe06ba3d64 54 * 0 1 N - 1 N N + 1 N + 2 N + 3
AnnaBridge 188:bcfe06ba3d64 55 * |-------|------...------|-------|-------|-------|-------|
AnnaBridge 188:bcfe06ba3d64 56 * ^ ^
AnnaBridge 188:bcfe06ba3d64 57 * | |
AnnaBridge 188:bcfe06ba3d64 58 * set_interrupt Earliest match timestamp allowed
AnnaBridge 188:bcfe06ba3d64 59 *
AnnaBridge 188:bcfe06ba3d64 60 *
AnnaBridge 188:bcfe06ba3d64 61 */
AnnaBridge 188:bcfe06ba3d64 62
AnnaBridge 188:bcfe06ba3d64 63 LowPowerTickerWrapper(const ticker_data_t *data, const ticker_interface_t *interface, uint32_t min_cycles_between_writes, uint32_t min_cycles_until_match);
AnnaBridge 188:bcfe06ba3d64 64
AnnaBridge 188:bcfe06ba3d64 65 /**
AnnaBridge 188:bcfe06ba3d64 66 * Interrupt handler called by the underlying driver/hardware
AnnaBridge 188:bcfe06ba3d64 67 *
AnnaBridge 188:bcfe06ba3d64 68 * @param handler The callback which would normally be called by the underlying driver/hardware
AnnaBridge 188:bcfe06ba3d64 69 */
AnnaBridge 188:bcfe06ba3d64 70 void irq_handler(ticker_irq_handler_type handler);
AnnaBridge 188:bcfe06ba3d64 71
AnnaBridge 188:bcfe06ba3d64 72 /**
AnnaBridge 188:bcfe06ba3d64 73 * Suspend wrapper operation and pass through interrupts.
AnnaBridge 188:bcfe06ba3d64 74 *
AnnaBridge 188:bcfe06ba3d64 75 * This stops to wrapper layer from using the microsecond ticker.
AnnaBridge 188:bcfe06ba3d64 76 * This should be called before using the low power ticker APIs directly.
AnnaBridge 188:bcfe06ba3d64 77 *
AnnaBridge 188:bcfe06ba3d64 78 * @warning: Make sure to suspend the LP ticker first (call ticker_suspend()),
AnnaBridge 188:bcfe06ba3d64 79 * otherwise the behavior is undefined.
AnnaBridge 188:bcfe06ba3d64 80 */
AnnaBridge 188:bcfe06ba3d64 81 void suspend();
AnnaBridge 188:bcfe06ba3d64 82
AnnaBridge 188:bcfe06ba3d64 83 /**
AnnaBridge 188:bcfe06ba3d64 84 * Resume wrapper operation and filter interrupts normally
AnnaBridge 188:bcfe06ba3d64 85 */
AnnaBridge 188:bcfe06ba3d64 86 void resume();
AnnaBridge 188:bcfe06ba3d64 87
AnnaBridge 188:bcfe06ba3d64 88 /**
AnnaBridge 188:bcfe06ba3d64 89 * Check if a Timeout object is being used
AnnaBridge 188:bcfe06ba3d64 90 *
AnnaBridge 188:bcfe06ba3d64 91 * @return true if Timeout is used for scheduling false otherwise
AnnaBridge 188:bcfe06ba3d64 92 */
AnnaBridge 188:bcfe06ba3d64 93 bool timeout_pending();
AnnaBridge 188:bcfe06ba3d64 94
AnnaBridge 188:bcfe06ba3d64 95 /*
AnnaBridge 188:bcfe06ba3d64 96 * Implementation of ticker_init
AnnaBridge 188:bcfe06ba3d64 97 */
AnnaBridge 188:bcfe06ba3d64 98 void init();
AnnaBridge 188:bcfe06ba3d64 99
AnnaBridge 188:bcfe06ba3d64 100 /*
AnnaBridge 188:bcfe06ba3d64 101 * Implementation of free
AnnaBridge 188:bcfe06ba3d64 102 */
AnnaBridge 188:bcfe06ba3d64 103 void free();
AnnaBridge 188:bcfe06ba3d64 104
AnnaBridge 188:bcfe06ba3d64 105 /*
AnnaBridge 188:bcfe06ba3d64 106 * Implementation of read
AnnaBridge 188:bcfe06ba3d64 107 */
AnnaBridge 188:bcfe06ba3d64 108 uint32_t read();
AnnaBridge 188:bcfe06ba3d64 109
AnnaBridge 188:bcfe06ba3d64 110 /*
AnnaBridge 188:bcfe06ba3d64 111 * Implementation of set_interrupt
AnnaBridge 188:bcfe06ba3d64 112 */
AnnaBridge 188:bcfe06ba3d64 113 void set_interrupt(timestamp_t timestamp);
AnnaBridge 188:bcfe06ba3d64 114
AnnaBridge 188:bcfe06ba3d64 115 /*
AnnaBridge 188:bcfe06ba3d64 116 * Implementation of disable_interrupt
AnnaBridge 188:bcfe06ba3d64 117 */
AnnaBridge 188:bcfe06ba3d64 118 void disable_interrupt();
AnnaBridge 188:bcfe06ba3d64 119
AnnaBridge 188:bcfe06ba3d64 120 /*
AnnaBridge 188:bcfe06ba3d64 121 * Implementation of clear_interrupt
AnnaBridge 188:bcfe06ba3d64 122 */
AnnaBridge 188:bcfe06ba3d64 123 void clear_interrupt();
AnnaBridge 188:bcfe06ba3d64 124
AnnaBridge 188:bcfe06ba3d64 125 /*
AnnaBridge 188:bcfe06ba3d64 126 * Implementation of fire_interrupt
AnnaBridge 188:bcfe06ba3d64 127 */
AnnaBridge 188:bcfe06ba3d64 128 void fire_interrupt();
AnnaBridge 188:bcfe06ba3d64 129
AnnaBridge 188:bcfe06ba3d64 130 /*
AnnaBridge 188:bcfe06ba3d64 131 * Implementation of get_info
AnnaBridge 188:bcfe06ba3d64 132 */
AnnaBridge 188:bcfe06ba3d64 133 const ticker_info_t *get_info();
AnnaBridge 188:bcfe06ba3d64 134
AnnaBridge 188:bcfe06ba3d64 135 ticker_data_t data;
AnnaBridge 188:bcfe06ba3d64 136
AnnaBridge 188:bcfe06ba3d64 137 private:
AnnaBridge 188:bcfe06ba3d64 138 mbed::Timeout _timeout;
AnnaBridge 188:bcfe06ba3d64 139 const ticker_interface_t *const _intf;
AnnaBridge 188:bcfe06ba3d64 140
AnnaBridge 188:bcfe06ba3d64 141 /*
AnnaBridge 188:bcfe06ba3d64 142 * The number of low power clock cycles which must pass between subsequent
AnnaBridge 188:bcfe06ba3d64 143 * calls to intf->set_interrupt
AnnaBridge 188:bcfe06ba3d64 144 */
AnnaBridge 188:bcfe06ba3d64 145 const uint32_t _min_count_between_writes;
AnnaBridge 188:bcfe06ba3d64 146
AnnaBridge 188:bcfe06ba3d64 147 /*
AnnaBridge 188:bcfe06ba3d64 148 * The minimum number of low power clock cycles in the future that
AnnaBridge 188:bcfe06ba3d64 149 * a match value can be set to and still fire
AnnaBridge 188:bcfe06ba3d64 150 */
AnnaBridge 188:bcfe06ba3d64 151 const uint32_t _min_count_until_match;
AnnaBridge 188:bcfe06ba3d64 152
AnnaBridge 188:bcfe06ba3d64 153 /*
AnnaBridge 188:bcfe06ba3d64 154 * Flag to indicate if the timer is suspended
AnnaBridge 188:bcfe06ba3d64 155 */
AnnaBridge 188:bcfe06ba3d64 156 bool _suspended;
AnnaBridge 188:bcfe06ba3d64 157
AnnaBridge 188:bcfe06ba3d64 158 /*
AnnaBridge 188:bcfe06ba3d64 159 * _cur_match_time is valid and Timeout is scheduled to fire
AnnaBridge 188:bcfe06ba3d64 160 */
AnnaBridge 188:bcfe06ba3d64 161 bool _pending_timeout;
AnnaBridge 188:bcfe06ba3d64 162
AnnaBridge 188:bcfe06ba3d64 163 /*
AnnaBridge 188:bcfe06ba3d64 164 * set_interrupt has been called and _cur_match_time is valid
AnnaBridge 188:bcfe06ba3d64 165 */
AnnaBridge 188:bcfe06ba3d64 166 bool _pending_match;
AnnaBridge 188:bcfe06ba3d64 167
AnnaBridge 188:bcfe06ba3d64 168 /*
AnnaBridge 188:bcfe06ba3d64 169 * The function LowPowerTickerWrapper::fire_interrupt has been called
AnnaBridge 188:bcfe06ba3d64 170 * and an interrupt is expected.
AnnaBridge 188:bcfe06ba3d64 171 */
AnnaBridge 188:bcfe06ba3d64 172 bool _pending_fire_now;
AnnaBridge 188:bcfe06ba3d64 173
AnnaBridge 188:bcfe06ba3d64 174 /*
AnnaBridge 188:bcfe06ba3d64 175 * It is safe to call intf->set_interrupt
AnnaBridge 188:bcfe06ba3d64 176 */
AnnaBridge 188:bcfe06ba3d64 177 bool _set_interrupt_allowed;
AnnaBridge 188:bcfe06ba3d64 178
AnnaBridge 188:bcfe06ba3d64 179 /*
AnnaBridge 188:bcfe06ba3d64 180 * Last value written by LowPowerTickerWrapper::set_interrupt
AnnaBridge 188:bcfe06ba3d64 181 */
AnnaBridge 188:bcfe06ba3d64 182 timestamp_t _cur_match_time;
AnnaBridge 188:bcfe06ba3d64 183
AnnaBridge 188:bcfe06ba3d64 184 /*
AnnaBridge 188:bcfe06ba3d64 185 * Time of last call to LowPowerTickerWrapper::set_interrupt
AnnaBridge 188:bcfe06ba3d64 186 */
AnnaBridge 188:bcfe06ba3d64 187 uint32_t _last_set_interrupt;
AnnaBridge 188:bcfe06ba3d64 188
AnnaBridge 188:bcfe06ba3d64 189 /*
AnnaBridge 188:bcfe06ba3d64 190 * Time of last call to intf->set_interrupt
AnnaBridge 188:bcfe06ba3d64 191 */
AnnaBridge 188:bcfe06ba3d64 192 uint32_t _last_actual_set_interrupt;
AnnaBridge 188:bcfe06ba3d64 193
AnnaBridge 188:bcfe06ba3d64 194 /*
AnnaBridge 188:bcfe06ba3d64 195 * Mask of valid bits from intf->read()
AnnaBridge 188:bcfe06ba3d64 196 */
AnnaBridge 188:bcfe06ba3d64 197 uint32_t _mask;
AnnaBridge 188:bcfe06ba3d64 198
AnnaBridge 188:bcfe06ba3d64 199 /*
AnnaBridge 188:bcfe06ba3d64 200 * Microsecond per low power tick (rounded up)
AnnaBridge 188:bcfe06ba3d64 201 */
AnnaBridge 188:bcfe06ba3d64 202 uint32_t _us_per_tick;
AnnaBridge 188:bcfe06ba3d64 203
AnnaBridge 188:bcfe06ba3d64 204
AnnaBridge 188:bcfe06ba3d64 205 void _reset();
AnnaBridge 188:bcfe06ba3d64 206
AnnaBridge 188:bcfe06ba3d64 207 /**
AnnaBridge 188:bcfe06ba3d64 208 * Set the low power ticker match time when hardware is ready
AnnaBridge 188:bcfe06ba3d64 209 *
AnnaBridge 188:bcfe06ba3d64 210 * This event is scheduled to set the lp timer after the previous write
AnnaBridge 188:bcfe06ba3d64 211 * has taken effect and it is safe to write a new value without blocking.
AnnaBridge 188:bcfe06ba3d64 212 * If the time has already passed then this function fires and interrupt
AnnaBridge 188:bcfe06ba3d64 213 * immediately.
AnnaBridge 188:bcfe06ba3d64 214 */
AnnaBridge 188:bcfe06ba3d64 215 void _timeout_handler();
AnnaBridge 188:bcfe06ba3d64 216
AnnaBridge 188:bcfe06ba3d64 217 /*
AnnaBridge 188:bcfe06ba3d64 218 * Check match time has passed
AnnaBridge 188:bcfe06ba3d64 219 */
AnnaBridge 188:bcfe06ba3d64 220 bool _match_check(timestamp_t current);
AnnaBridge 188:bcfe06ba3d64 221
AnnaBridge 188:bcfe06ba3d64 222 /*
AnnaBridge 188:bcfe06ba3d64 223 * Convert low power ticks to approximate microseconds
AnnaBridge 188:bcfe06ba3d64 224 *
AnnaBridge 188:bcfe06ba3d64 225 * This value is always larger or equal to exact value.
AnnaBridge 188:bcfe06ba3d64 226 */
AnnaBridge 188:bcfe06ba3d64 227 uint32_t _lp_ticks_to_us(uint32_t);
AnnaBridge 188:bcfe06ba3d64 228
AnnaBridge 188:bcfe06ba3d64 229 /*
AnnaBridge 188:bcfe06ba3d64 230 * Schedule a match interrupt to fire at the correct time
AnnaBridge 188:bcfe06ba3d64 231 *
AnnaBridge 188:bcfe06ba3d64 232 * @param current The current low power ticker time
AnnaBridge 188:bcfe06ba3d64 233 */
AnnaBridge 188:bcfe06ba3d64 234 void _schedule_match(timestamp_t current);
AnnaBridge 188:bcfe06ba3d64 235
AnnaBridge 188:bcfe06ba3d64 236 };
AnnaBridge 188:bcfe06ba3d64 237
AnnaBridge 188:bcfe06ba3d64 238 #endif
AnnaBridge 188:bcfe06ba3d64 239
AnnaBridge 188:bcfe06ba3d64 240 /** @}*/
AnnaBridge 188:bcfe06ba3d64 241
AnnaBridge 188:bcfe06ba3d64 242