Supawat Yangdiew / rtc_api_11U6x
Committer:
supawat
Date:
Thu Apr 02 03:42:59 2020 +0000
Revision:
0:c468d5b8e437
TRC 630401

Who changed what in which revision?

UserRevisionLine numberNew contents of line
supawat 0:c468d5b8e437 1 /* mbed Microcontroller Library
supawat 0:c468d5b8e437 2 * Copyright (c) 2006-2013 ARM Limited
supawat 0:c468d5b8e437 3 * SPDX-License-Identifier: Apache-2.0
supawat 0:c468d5b8e437 4 *
supawat 0:c468d5b8e437 5 * Licensed under the Apache License, Version 2.0 (the "License");
supawat 0:c468d5b8e437 6 * you may not use this file except in compliance with the License.
supawat 0:c468d5b8e437 7 * You may obtain a copy of the License at
supawat 0:c468d5b8e437 8 *
supawat 0:c468d5b8e437 9 * http://www.apache.org/licenses/LICENSE-2.0
supawat 0:c468d5b8e437 10 *
supawat 0:c468d5b8e437 11 * Unless required by applicable law or agreed to in writing, software
supawat 0:c468d5b8e437 12 * distributed under the License is distributed on an "AS IS" BASIS,
supawat 0:c468d5b8e437 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
supawat 0:c468d5b8e437 14 * See the License for the specific language governing permissions and
supawat 0:c468d5b8e437 15 * limitations under the License.
supawat 0:c468d5b8e437 16 */
supawat 0:c468d5b8e437 17 #include "rtc_api_11U6x.h"
supawat 0:c468d5b8e437 18 #include "rtc_time_11U6x.h"
supawat 0:c468d5b8e437 19
supawat 0:c468d5b8e437 20 #include "platform/mbed_critical.h"
supawat 0:c468d5b8e437 21 #include "platform/SingletonPtr.h"
supawat 0:c468d5b8e437 22 #include "platform/PlatformMutex.h"
supawat 0:c468d5b8e437 23
supawat 0:c468d5b8e437 24 static SingletonPtr<PlatformMutex> _mutex;
supawat 0:c468d5b8e437 25
supawat 0:c468d5b8e437 26 static void (*_rtc_init)(void) = rtc_init;
supawat 0:c468d5b8e437 27 static int (*_rtc_isenabled)(void) = rtc_isenabled;
supawat 0:c468d5b8e437 28 static time_t (*_rtc_read)(void) = rtc_read;
supawat 0:c468d5b8e437 29 static void (*_rtc_write)(time_t t) = rtc_write;
supawat 0:c468d5b8e437 30
supawat 0:c468d5b8e437 31 #ifdef __cplusplus
supawat 0:c468d5b8e437 32 extern "C" {
supawat 0:c468d5b8e437 33 #endif
supawat 0:c468d5b8e437 34
supawat 0:c468d5b8e437 35 time_t time(time_t *timer)
supawat 0:c468d5b8e437 36 {
supawat 0:c468d5b8e437 37 _mutex->lock();
supawat 0:c468d5b8e437 38 if (_rtc_isenabled != NULL) {
supawat 0:c468d5b8e437 39 if (!(_rtc_isenabled())) {
supawat 0:c468d5b8e437 40 set_time(0);
supawat 0:c468d5b8e437 41 }
supawat 0:c468d5b8e437 42 }
supawat 0:c468d5b8e437 43
supawat 0:c468d5b8e437 44 time_t t = (time_t) -1;
supawat 0:c468d5b8e437 45 if (_rtc_read != NULL) {
supawat 0:c468d5b8e437 46 t = _rtc_read();
supawat 0:c468d5b8e437 47 }
supawat 0:c468d5b8e437 48
supawat 0:c468d5b8e437 49 if (timer != NULL) {
supawat 0:c468d5b8e437 50 *timer = t;
supawat 0:c468d5b8e437 51 }
supawat 0:c468d5b8e437 52 _mutex->unlock();
supawat 0:c468d5b8e437 53 return t;
supawat 0:c468d5b8e437 54 }
supawat 0:c468d5b8e437 55
supawat 0:c468d5b8e437 56 void set_time(time_t t)
supawat 0:c468d5b8e437 57 {
supawat 0:c468d5b8e437 58 _mutex->lock();
supawat 0:c468d5b8e437 59 if (_rtc_init != NULL) {
supawat 0:c468d5b8e437 60 _rtc_init();
supawat 0:c468d5b8e437 61 }
supawat 0:c468d5b8e437 62 if (_rtc_write != NULL) {
supawat 0:c468d5b8e437 63 _rtc_write(t);
supawat 0:c468d5b8e437 64 }
supawat 0:c468d5b8e437 65 _mutex->unlock();
supawat 0:c468d5b8e437 66 }
supawat 0:c468d5b8e437 67
supawat 0:c468d5b8e437 68 void attach_rtc(time_t (*read_rtc)(void), void (*write_rtc)(time_t), void (*init_rtc)(void), int (*isenabled_rtc)(void))
supawat 0:c468d5b8e437 69 {
supawat 0:c468d5b8e437 70 _mutex->lock();
supawat 0:c468d5b8e437 71 _rtc_read = read_rtc;
supawat 0:c468d5b8e437 72 _rtc_write = write_rtc;
supawat 0:c468d5b8e437 73 _rtc_init = init_rtc;
supawat 0:c468d5b8e437 74 _rtc_isenabled = isenabled_rtc;
supawat 0:c468d5b8e437 75 _mutex->unlock();
supawat 0:c468d5b8e437 76 }
supawat 0:c468d5b8e437 77
supawat 0:c468d5b8e437 78 #ifdef __cplusplus
supawat 0:c468d5b8e437 79 }
supawat 0:c468d5b8e437 80 #endif