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
<> 149:156823d33999 1 /* mbed Microcontroller Library
<> 149:156823d33999 2 * Copyright (c) 2006-2013 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
<> 149:156823d33999 4 *
<> 149:156823d33999 5 * Licensed under the Apache License, Version 2.0 (the "License");
<> 149:156823d33999 6 * you may not use this file except in compliance with the License.
<> 149:156823d33999 7 * You may obtain a copy of the License at
<> 149:156823d33999 8 *
<> 149:156823d33999 9 * http://www.apache.org/licenses/LICENSE-2.0
<> 149:156823d33999 10 *
<> 149:156823d33999 11 * Unless required by applicable law or agreed to in writing, software
<> 149:156823d33999 12 * distributed under the License is distributed on an "AS IS" BASIS,
<> 149:156823d33999 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 149:156823d33999 14 * See the License for the specific language governing permissions and
<> 149:156823d33999 15 * limitations under the License.
<> 149:156823d33999 16 */
<> 149:156823d33999 17 #include "hal/rtc_api.h"
<> 149:156823d33999 18
<> 160:d5399cc887bb 19 #include "platform/mbed_critical.h"
<> 160:d5399cc887bb 20 #include "platform/mbed_rtc_time.h"
<> 149:156823d33999 21 #include "platform/SingletonPtr.h"
<> 149:156823d33999 22 #include "platform/PlatformMutex.h"
<> 149:156823d33999 23
<> 149:156823d33999 24 static SingletonPtr<PlatformMutex> _mutex;
<> 149:156823d33999 25
<> 149:156823d33999 26 #if DEVICE_RTC
Anna Bridge 186:707f6e361f3e 27
<> 149:156823d33999 28 static void (*_rtc_init)(void) = rtc_init;
<> 149:156823d33999 29 static int (*_rtc_isenabled)(void) = rtc_isenabled;
<> 149:156823d33999 30 static time_t (*_rtc_read)(void) = rtc_read;
<> 149:156823d33999 31 static void (*_rtc_write)(time_t t) = rtc_write;
Anna Bridge 186:707f6e361f3e 32
Anna Bridge 186:707f6e361f3e 33 #elif DEVICE_LPTICKER
Anna Bridge 186:707f6e361f3e 34
Anna Bridge 186:707f6e361f3e 35 #include "drivers/LowPowerTimer.h"
Anna Bridge 186:707f6e361f3e 36
AnnaBridge 188:bcfe06ba3d64 37 #define US_PER_SEC 1000000
AnnaBridge 188:bcfe06ba3d64 38
Anna Bridge 186:707f6e361f3e 39 static SingletonPtr<mbed::LowPowerTimer> _rtc_lp_timer;
Anna Bridge 186:707f6e361f3e 40 static uint64_t _rtc_lp_base;
Anna Bridge 186:707f6e361f3e 41 static bool _rtc_enabled;
Anna Bridge 186:707f6e361f3e 42
Anna Bridge 186:707f6e361f3e 43 static void _rtc_lpticker_init(void)
Anna Bridge 186:707f6e361f3e 44 {
Anna Bridge 186:707f6e361f3e 45 _rtc_lp_timer->start();
Anna Bridge 186:707f6e361f3e 46 _rtc_enabled = true;
Anna Bridge 186:707f6e361f3e 47 }
Anna Bridge 186:707f6e361f3e 48
Anna Bridge 186:707f6e361f3e 49 static int _rtc_lpticker_isenabled(void)
Anna Bridge 186:707f6e361f3e 50 {
Anna Bridge 186:707f6e361f3e 51 return (_rtc_enabled == true);
Anna Bridge 186:707f6e361f3e 52 }
Anna Bridge 186:707f6e361f3e 53
Anna Bridge 186:707f6e361f3e 54 static time_t _rtc_lpticker_read(void)
Anna Bridge 186:707f6e361f3e 55 {
AnnaBridge 188:bcfe06ba3d64 56 return _rtc_lp_timer->read_high_resolution_us() / US_PER_SEC + _rtc_lp_base;
Anna Bridge 186:707f6e361f3e 57 }
Anna Bridge 186:707f6e361f3e 58
Anna Bridge 186:707f6e361f3e 59 static void _rtc_lpticker_write(time_t t)
Anna Bridge 186:707f6e361f3e 60 {
AnnaBridge 189:f392fc9709a3 61 _rtc_lp_timer->reset();
Anna Bridge 186:707f6e361f3e 62 _rtc_lp_base = t;
Anna Bridge 186:707f6e361f3e 63 }
Anna Bridge 186:707f6e361f3e 64
Anna Bridge 186:707f6e361f3e 65 static void (*_rtc_init)(void) = _rtc_lpticker_init;
Anna Bridge 186:707f6e361f3e 66 static int (*_rtc_isenabled)(void) = _rtc_lpticker_isenabled;
Anna Bridge 186:707f6e361f3e 67 static time_t (*_rtc_read)(void) = _rtc_lpticker_read;
Anna Bridge 186:707f6e361f3e 68 static void (*_rtc_write)(time_t t) = _rtc_lpticker_write;
Anna Bridge 186:707f6e361f3e 69
Anna Bridge 186:707f6e361f3e 70 #else /* DEVICE_LPTICKER */
Anna Bridge 186:707f6e361f3e 71
<> 149:156823d33999 72 static void (*_rtc_init)(void) = NULL;
<> 149:156823d33999 73 static int (*_rtc_isenabled)(void) = NULL;
<> 149:156823d33999 74 static time_t (*_rtc_read)(void) = NULL;
<> 149:156823d33999 75 static void (*_rtc_write)(time_t t) = NULL;
Anna Bridge 186:707f6e361f3e 76 #endif /* DEVICE_LPTICKER */
<> 149:156823d33999 77
<> 149:156823d33999 78 #ifdef __cplusplus
<> 149:156823d33999 79 extern "C" {
<> 149:156823d33999 80 #endif
<> 149:156823d33999 81 #if defined (__ICCARM__)
<> 149:156823d33999 82 time_t __time32(time_t *timer)
<> 149:156823d33999 83 #else
<> 149:156823d33999 84 time_t time(time_t *timer)
<> 149:156823d33999 85 #endif
<> 149:156823d33999 86
<> 149:156823d33999 87 {
<> 149:156823d33999 88 _mutex->lock();
<> 149:156823d33999 89 if (_rtc_isenabled != NULL) {
<> 149:156823d33999 90 if (!(_rtc_isenabled())) {
<> 149:156823d33999 91 set_time(0);
<> 149:156823d33999 92 }
<> 149:156823d33999 93 }
AnnaBridge 187:0387e8f68319 94
AnnaBridge 187:0387e8f68319 95 time_t t = (time_t) -1;
<> 149:156823d33999 96 if (_rtc_read != NULL) {
<> 149:156823d33999 97 t = _rtc_read();
<> 149:156823d33999 98 }
<> 149:156823d33999 99
<> 149:156823d33999 100 if (timer != NULL) {
<> 149:156823d33999 101 *timer = t;
<> 149:156823d33999 102 }
<> 149:156823d33999 103 _mutex->unlock();
<> 149:156823d33999 104 return t;
<> 149:156823d33999 105 }
<> 149:156823d33999 106
AnnaBridge 187:0387e8f68319 107 void set_time(time_t t)
AnnaBridge 187:0387e8f68319 108 {
<> 149:156823d33999 109 _mutex->lock();
<> 149:156823d33999 110 if (_rtc_init != NULL) {
<> 149:156823d33999 111 _rtc_init();
<> 149:156823d33999 112 }
<> 149:156823d33999 113 if (_rtc_write != NULL) {
<> 149:156823d33999 114 _rtc_write(t);
<> 149:156823d33999 115 }
<> 149:156823d33999 116 _mutex->unlock();
<> 149:156823d33999 117 }
<> 149:156823d33999 118
AnnaBridge 187:0387e8f68319 119 void attach_rtc(time_t (*read_rtc)(void), void (*write_rtc)(time_t), void (*init_rtc)(void), int (*isenabled_rtc)(void))
AnnaBridge 187:0387e8f68319 120 {
<> 149:156823d33999 121 _mutex->lock();
<> 149:156823d33999 122 _rtc_read = read_rtc;
<> 149:156823d33999 123 _rtc_write = write_rtc;
<> 149:156823d33999 124 _rtc_init = init_rtc;
<> 149:156823d33999 125 _rtc_isenabled = isenabled_rtc;
<> 149:156823d33999 126 _mutex->unlock();
<> 149:156823d33999 127 }
<> 149:156823d33999 128
<> 149:156823d33999 129
<> 149:156823d33999 130
<> 149:156823d33999 131 #ifdef __cplusplus
<> 149:156823d33999 132 }
<> 149:156823d33999 133 #endif