RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
1:7bcfbc328423
2019-03-13

Who changed what in which revision?

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