mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

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