mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Sep 11 09:30:09 2015 +0100
Revision:
621:9c82b0f79f3d
Parent:
460:3bcf9be0332c
Synchronized with git revision 6c1d63e069ab9bd86de92e8296ca783681257538

Full URL: https://github.com/mbedmicro/mbed/commit/6c1d63e069ab9bd86de92e8296ca783681257538/

ignore target files not supported by the yotta module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 460:3bcf9be0332c 1 /* mbed Microcontroller Library
mbed_official 460:3bcf9be0332c 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 460:3bcf9be0332c 3 *
mbed_official 460:3bcf9be0332c 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 460:3bcf9be0332c 5 * you may not use this file except in compliance with the License.
mbed_official 460:3bcf9be0332c 6 * You may obtain a copy of the License at
mbed_official 460:3bcf9be0332c 7 *
mbed_official 460:3bcf9be0332c 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 460:3bcf9be0332c 9 *
mbed_official 460:3bcf9be0332c 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 460:3bcf9be0332c 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 460:3bcf9be0332c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 460:3bcf9be0332c 13 * See the License for the specific language governing permissions and
mbed_official 460:3bcf9be0332c 14 * limitations under the License.
mbed_official 460:3bcf9be0332c 15 */
mbed_official 460:3bcf9be0332c 16
mbed_official 460:3bcf9be0332c 17 #include "mbed_assert.h"
mbed_official 460:3bcf9be0332c 18 #include "device.h"
mbed_official 460:3bcf9be0332c 19
mbed_official 460:3bcf9be0332c 20 #if DEVICE_RTC
mbed_official 460:3bcf9be0332c 21
mbed_official 460:3bcf9be0332c 22 #include "rtc_api.h"
mbed_official 460:3bcf9be0332c 23 #include "rtc_iodefine.h"
mbed_official 460:3bcf9be0332c 24
mbed_official 460:3bcf9be0332c 25
mbed_official 460:3bcf9be0332c 26 #define RCR1_VAL_ON (0x08u) // AIE = 1
mbed_official 460:3bcf9be0332c 27 #define RCR1_VAL_OFF (0x00u)
mbed_official 460:3bcf9be0332c 28 #define RCR2_VAL_ALLSTOP (0x00u)
mbed_official 460:3bcf9be0332c 29 #define RCR2_VAL_START (0x01u) // START = 1
mbed_official 460:3bcf9be0332c 30 #define RCR2_VAL_RESET (0x02u) // RESET = 1
mbed_official 460:3bcf9be0332c 31 #define RCR3_VAL (0x00u)
mbed_official 460:3bcf9be0332c 32 #define RCR5_VAL_EXTAL (0x01u) // RCKSEL = connect EXTAL
mbed_official 460:3bcf9be0332c 33 #define RCR5_VAL_RTCX1 (0x00u) // RCKSEL = disconnect EXTAL
mbed_official 460:3bcf9be0332c 34 #define RFRH_VAL_13333 (0x8003u) // 13.3333MHz (= 64Hz * 0x32DCD)
mbed_official 460:3bcf9be0332c 35 #define RFRL_VAL_13333 (0x2DCDu) //
mbed_official 460:3bcf9be0332c 36 #define RFRH_VAL_MAX (0x0007u) // MAX value (= 128Hz * 0x7FFFF)
mbed_official 460:3bcf9be0332c 37 #define RFRL_VAL_MAX (0xFFFFu) //
mbed_official 460:3bcf9be0332c 38
mbed_official 460:3bcf9be0332c 39 #define MASK_00_03_POS (0x000Fu)
mbed_official 460:3bcf9be0332c 40 #define MASK_04_07_POS (0x00F0u)
mbed_official 460:3bcf9be0332c 41 #define MASK_08_11_POS (0x0F00u)
mbed_official 460:3bcf9be0332c 42 #define MASK_12_15_POS (0xF000u)
mbed_official 460:3bcf9be0332c 43 #define MASK_16_20_POS (0x000F0000u)
mbed_official 460:3bcf9be0332c 44 #define SHIFT_1_HBYTE (4u)
mbed_official 460:3bcf9be0332c 45 #define SHIFT_2_HBYTE (8u)
mbed_official 460:3bcf9be0332c 46 #define SHIFT_3_HBYTE (12u)
mbed_official 460:3bcf9be0332c 47 #define SHIFT_1BYTE (8u)
mbed_official 460:3bcf9be0332c 48 #define SHIFT_2BYTE (16u)
mbed_official 460:3bcf9be0332c 49
mbed_official 460:3bcf9be0332c 50 #define TIME_ERROR_VAL (0xFFFFFFFFu)
mbed_official 460:3bcf9be0332c 51
mbed_official 460:3bcf9be0332c 52 static int rtc_dec8_to_hex(uint8_t dec_val, uint8_t offset, int *hex_val);
mbed_official 460:3bcf9be0332c 53 static int rtc_dec16_to_hex(uint16_t dec_val, uint16_t offset, int *hex_val);
mbed_official 460:3bcf9be0332c 54 static uint8_t rtc_hex8_to_dec(uint8_t hex_val);
mbed_official 460:3bcf9be0332c 55 static uint16_t rtc_hex16_to_dec(uint16_t hex_val);
mbed_official 460:3bcf9be0332c 56
mbed_official 460:3bcf9be0332c 57
mbed_official 460:3bcf9be0332c 58 /*
mbed_official 460:3bcf9be0332c 59 * Setup the RTC based on a time structure.
mbed_official 460:3bcf9be0332c 60 * The rtc_init function should be executed first.
mbed_official 460:3bcf9be0332c 61 * [in]
mbed_official 460:3bcf9be0332c 62 * None.
mbed_official 460:3bcf9be0332c 63 * [out]
mbed_official 460:3bcf9be0332c 64 * None.
mbed_official 460:3bcf9be0332c 65 */
mbed_official 460:3bcf9be0332c 66 void rtc_init(void) {
mbed_official 460:3bcf9be0332c 67 volatile uint8_t dummy_read;
mbed_official 460:3bcf9be0332c 68
mbed_official 460:3bcf9be0332c 69 // Set control register
mbed_official 460:3bcf9be0332c 70 RTC.RCR2 = RCR2_VAL_ALLSTOP;
mbed_official 460:3bcf9be0332c 71 RTC.RCR1 = RCR1_VAL_ON;
mbed_official 460:3bcf9be0332c 72 RTC.RCR3 = RCR3_VAL;
mbed_official 460:3bcf9be0332c 73 RTC.RCR5 = RCR5_VAL_EXTAL;
mbed_official 460:3bcf9be0332c 74 RTC.RFRH = RFRH_VAL_13333;
mbed_official 460:3bcf9be0332c 75 RTC.RFRL = RFRL_VAL_13333;
mbed_official 460:3bcf9be0332c 76
mbed_official 460:3bcf9be0332c 77 // Dummy read
mbed_official 460:3bcf9be0332c 78 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 79 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 80
mbed_official 460:3bcf9be0332c 81 RTC.RCR2 = RCR2_VAL_RESET; // RESET = 1
mbed_official 460:3bcf9be0332c 82
mbed_official 460:3bcf9be0332c 83 // Dummy read
mbed_official 460:3bcf9be0332c 84 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 85 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 86
mbed_official 460:3bcf9be0332c 87 // Set timer and alarm. Default value :01-01-1970 00:00:00
mbed_official 460:3bcf9be0332c 88 RTC.RSECCNT = 0;
mbed_official 460:3bcf9be0332c 89 RTC.RMINCNT = 0;
mbed_official 460:3bcf9be0332c 90 RTC.RHRCNT = 0;
mbed_official 460:3bcf9be0332c 91 RTC.RWKCNT = 0;
mbed_official 460:3bcf9be0332c 92 RTC.RDAYCNT = 1;
mbed_official 460:3bcf9be0332c 93 RTC.RMONCNT = 1;
mbed_official 460:3bcf9be0332c 94 RTC.RYRCNT = 0x1970;
mbed_official 460:3bcf9be0332c 95 RTC.RSECAR = 0;
mbed_official 460:3bcf9be0332c 96 RTC.RMINAR = 0;
mbed_official 460:3bcf9be0332c 97 RTC.RHRAR = 0;
mbed_official 460:3bcf9be0332c 98 RTC.RWKAR = 0;
mbed_official 460:3bcf9be0332c 99 RTC.RDAYAR = 1;
mbed_official 460:3bcf9be0332c 100 RTC.RMONAR = 1;
mbed_official 460:3bcf9be0332c 101 RTC.RYRAR = 0x1970;
mbed_official 460:3bcf9be0332c 102
mbed_official 460:3bcf9be0332c 103 // Dummy read
mbed_official 460:3bcf9be0332c 104 dummy_read = RTC.RYRCNT;
mbed_official 460:3bcf9be0332c 105 dummy_read = RTC.RYRCNT;
mbed_official 460:3bcf9be0332c 106
mbed_official 460:3bcf9be0332c 107 }
mbed_official 460:3bcf9be0332c 108
mbed_official 460:3bcf9be0332c 109
mbed_official 460:3bcf9be0332c 110 /*
mbed_official 460:3bcf9be0332c 111 * Release the RTC based on a time structure.
mbed_official 460:3bcf9be0332c 112 * [in]
mbed_official 460:3bcf9be0332c 113 * None.
mbed_official 460:3bcf9be0332c 114 * [out]
mbed_official 460:3bcf9be0332c 115 * None.
mbed_official 460:3bcf9be0332c 116 */
mbed_official 460:3bcf9be0332c 117 void rtc_free(void) {
mbed_official 460:3bcf9be0332c 118 volatile uint8_t dummy_read;
mbed_official 460:3bcf9be0332c 119
mbed_official 460:3bcf9be0332c 120 // Set control register
mbed_official 460:3bcf9be0332c 121 RTC.RCR2 = RCR2_VAL_ALLSTOP;
mbed_official 460:3bcf9be0332c 122 RTC.RCR1 = RCR1_VAL_OFF;
mbed_official 460:3bcf9be0332c 123 RTC.RCR3 = RCR3_VAL;
mbed_official 460:3bcf9be0332c 124 RTC.RCR5 = RCR5_VAL_RTCX1;
mbed_official 460:3bcf9be0332c 125 RTC.RFRH = RFRH_VAL_MAX;
mbed_official 460:3bcf9be0332c 126 RTC.RFRL = RFRL_VAL_MAX;
mbed_official 460:3bcf9be0332c 127
mbed_official 460:3bcf9be0332c 128 // Dummy read
mbed_official 460:3bcf9be0332c 129 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 130 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 131 RTC.RCR2 = RCR2_VAL_RESET; // RESET = 1
mbed_official 460:3bcf9be0332c 132
mbed_official 460:3bcf9be0332c 133 // Dummy read
mbed_official 460:3bcf9be0332c 134 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 135 dummy_read = RTC.RCR2;
mbed_official 460:3bcf9be0332c 136
mbed_official 460:3bcf9be0332c 137 // Set timer and alarm. Default value :01-01-1970 00:00:00
mbed_official 460:3bcf9be0332c 138 RTC.RSECCNT = 0;
mbed_official 460:3bcf9be0332c 139 RTC.RMINCNT = 0;
mbed_official 460:3bcf9be0332c 140 RTC.RHRCNT = 0;
mbed_official 460:3bcf9be0332c 141 RTC.RWKCNT = 0;
mbed_official 460:3bcf9be0332c 142 RTC.RDAYCNT = 1;
mbed_official 460:3bcf9be0332c 143 RTC.RMONCNT = 1;
mbed_official 460:3bcf9be0332c 144 RTC.RYRCNT = 0x1970;
mbed_official 460:3bcf9be0332c 145 RTC.RSECAR = 0;
mbed_official 460:3bcf9be0332c 146 RTC.RMINAR = 0;
mbed_official 460:3bcf9be0332c 147 RTC.RHRAR = 0;
mbed_official 460:3bcf9be0332c 148 RTC.RWKAR = 0;
mbed_official 460:3bcf9be0332c 149 RTC.RDAYAR = 1;
mbed_official 460:3bcf9be0332c 150 RTC.RMONAR = 1;
mbed_official 460:3bcf9be0332c 151 RTC.RYRAR = 0x1970;
mbed_official 460:3bcf9be0332c 152
mbed_official 460:3bcf9be0332c 153 // Dummy read
mbed_official 460:3bcf9be0332c 154 dummy_read = RTC.RYRCNT;
mbed_official 460:3bcf9be0332c 155 dummy_read = RTC.RYRCNT;
mbed_official 460:3bcf9be0332c 156
mbed_official 460:3bcf9be0332c 157 }
mbed_official 460:3bcf9be0332c 158
mbed_official 460:3bcf9be0332c 159
mbed_official 460:3bcf9be0332c 160 /*
mbed_official 460:3bcf9be0332c 161 * Check the RTC has been enabled.
mbed_official 460:3bcf9be0332c 162 * Clock Control Register RTC.RCR1(bit3): 0 = Disabled, 1 = Enabled.
mbed_official 460:3bcf9be0332c 163 * [in]
mbed_official 460:3bcf9be0332c 164 * None.
mbed_official 460:3bcf9be0332c 165 * [out]
mbed_official 460:3bcf9be0332c 166 * 0:Disabled, 1:Enabled.
mbed_official 460:3bcf9be0332c 167 */
mbed_official 460:3bcf9be0332c 168 int rtc_isenabled(void) {
mbed_official 460:3bcf9be0332c 169 int ret_val = 0;
mbed_official 460:3bcf9be0332c 170
mbed_official 460:3bcf9be0332c 171 if ((RTC.RCR1 & RCR1_VAL_ON) != 0) { // RTC ON ?
mbed_official 460:3bcf9be0332c 172 ret_val = 1;
mbed_official 460:3bcf9be0332c 173 }
mbed_official 460:3bcf9be0332c 174
mbed_official 460:3bcf9be0332c 175 return ret_val;
mbed_official 460:3bcf9be0332c 176 }
mbed_official 460:3bcf9be0332c 177
mbed_official 460:3bcf9be0332c 178
mbed_official 460:3bcf9be0332c 179 /*
mbed_official 460:3bcf9be0332c 180 * RTC read function.
mbed_official 460:3bcf9be0332c 181 * [in]
mbed_official 460:3bcf9be0332c 182 * None.
mbed_official 460:3bcf9be0332c 183 * [out]
mbed_official 460:3bcf9be0332c 184 * UNIX timestamp value.
mbed_official 460:3bcf9be0332c 185 */
mbed_official 460:3bcf9be0332c 186 time_t rtc_read(void) {
mbed_official 460:3bcf9be0332c 187
mbed_official 460:3bcf9be0332c 188 struct tm timeinfo;
mbed_official 460:3bcf9be0332c 189 int err = 0;
mbed_official 460:3bcf9be0332c 190 uint8_t tmp_regdata;
mbed_official 460:3bcf9be0332c 191 time_t t;
mbed_official 460:3bcf9be0332c 192
mbed_official 460:3bcf9be0332c 193 if (rtc_isenabled() != 0) {
mbed_official 460:3bcf9be0332c 194 RTC.RCR1 &= ~0x10u; // CIE = 0
mbed_official 460:3bcf9be0332c 195 do {
mbed_official 460:3bcf9be0332c 196 // before reading process
mbed_official 460:3bcf9be0332c 197 tmp_regdata = RTC.RCR1;
mbed_official 460:3bcf9be0332c 198 tmp_regdata &= ~0x80u; // CF = 0
mbed_official 460:3bcf9be0332c 199 tmp_regdata |= 0x01u; // AF = 1
mbed_official 460:3bcf9be0332c 200 RTC.RCR1 = tmp_regdata;
mbed_official 460:3bcf9be0332c 201
mbed_official 460:3bcf9be0332c 202 // Read RTC register
mbed_official 460:3bcf9be0332c 203 err = rtc_dec8_to_hex(RTC.RSECCNT , 0 , &timeinfo.tm_sec);
mbed_official 460:3bcf9be0332c 204 err += rtc_dec8_to_hex(RTC.RMINCNT , 0 , &timeinfo.tm_min);
mbed_official 460:3bcf9be0332c 205 err += rtc_dec8_to_hex(RTC.RHRCNT , 0 , &timeinfo.tm_hour);
mbed_official 460:3bcf9be0332c 206 err += rtc_dec8_to_hex(RTC.RDAYCNT , 0 , &timeinfo.tm_mday);
mbed_official 460:3bcf9be0332c 207 err += rtc_dec8_to_hex(RTC.RMONCNT , 1 , &timeinfo.tm_mon);
mbed_official 460:3bcf9be0332c 208 err += rtc_dec16_to_hex(RTC.RYRCNT , 1900 , &timeinfo.tm_year);
mbed_official 460:3bcf9be0332c 209 } while ((RTC.RCR1 & 0x80u) != 0);
mbed_official 460:3bcf9be0332c 210 } else {
mbed_official 460:3bcf9be0332c 211 err = 1;
mbed_official 460:3bcf9be0332c 212 }
mbed_official 460:3bcf9be0332c 213
mbed_official 460:3bcf9be0332c 214 if (err == 0) {
mbed_official 460:3bcf9be0332c 215 // Convert to timestamp
mbed_official 460:3bcf9be0332c 216 t = mktime(&timeinfo);
mbed_official 460:3bcf9be0332c 217 } else {
mbed_official 460:3bcf9be0332c 218 // Error
mbed_official 460:3bcf9be0332c 219 t = TIME_ERROR_VAL;
mbed_official 460:3bcf9be0332c 220 }
mbed_official 460:3bcf9be0332c 221
mbed_official 460:3bcf9be0332c 222 return t;
mbed_official 460:3bcf9be0332c 223 }
mbed_official 460:3bcf9be0332c 224
mbed_official 460:3bcf9be0332c 225 /*
mbed_official 460:3bcf9be0332c 226 * Dec(8bit) to Hex function for RTC.
mbed_official 460:3bcf9be0332c 227 * [in]
mbed_official 460:3bcf9be0332c 228 * dec_val:Decimal value (from 0x00 to 0x99).
mbed_official 460:3bcf9be0332c 229 * offset:Subtract offset from dec_val.
mbed_official 460:3bcf9be0332c 230 * hex_val:Pointer of output hexadecimal value.
mbed_official 460:3bcf9be0332c 231 * [out]
mbed_official 460:3bcf9be0332c 232 * 0:Success
mbed_official 460:3bcf9be0332c 233 * 1:Error
mbed_official 460:3bcf9be0332c 234 */
mbed_official 460:3bcf9be0332c 235 static int rtc_dec8_to_hex(uint8_t dec_val, uint8_t offset, int *hex_val) {
mbed_official 460:3bcf9be0332c 236 int err = 0;
mbed_official 460:3bcf9be0332c 237 uint8_t ret_val;
mbed_official 460:3bcf9be0332c 238
mbed_official 460:3bcf9be0332c 239 if (hex_val != NULL) {
mbed_official 460:3bcf9be0332c 240 if (((dec_val & MASK_04_07_POS) >= (0x0A << SHIFT_1_HBYTE)) ||
mbed_official 460:3bcf9be0332c 241 ((dec_val & MASK_00_03_POS) >= 0x0A)) {
mbed_official 460:3bcf9be0332c 242 err = 1;
mbed_official 460:3bcf9be0332c 243 } else {
mbed_official 460:3bcf9be0332c 244 ret_val = ((dec_val & MASK_04_07_POS) >> SHIFT_1_HBYTE) * 10 +
mbed_official 460:3bcf9be0332c 245 (dec_val & MASK_00_03_POS);
mbed_official 460:3bcf9be0332c 246 if (ret_val < offset) {
mbed_official 460:3bcf9be0332c 247 err = 1;
mbed_official 460:3bcf9be0332c 248 } else {
mbed_official 460:3bcf9be0332c 249 *hex_val = ret_val - offset;
mbed_official 460:3bcf9be0332c 250 }
mbed_official 460:3bcf9be0332c 251 }
mbed_official 460:3bcf9be0332c 252 } else {
mbed_official 460:3bcf9be0332c 253 err = 1;
mbed_official 460:3bcf9be0332c 254 }
mbed_official 460:3bcf9be0332c 255
mbed_official 460:3bcf9be0332c 256 return err;
mbed_official 460:3bcf9be0332c 257 }
mbed_official 460:3bcf9be0332c 258
mbed_official 460:3bcf9be0332c 259 /*
mbed_official 460:3bcf9be0332c 260 * Dec(16bit) to Hex function for RTC
mbed_official 460:3bcf9be0332c 261 * [in]
mbed_official 460:3bcf9be0332c 262 * dec_val:Decimal value (from 0x0000 to 0x9999).
mbed_official 460:3bcf9be0332c 263 * offset:Subtract offset from dec_val.
mbed_official 460:3bcf9be0332c 264 * hex_val:Pointer of output hexadecimal value.
mbed_official 460:3bcf9be0332c 265 * [out]
mbed_official 460:3bcf9be0332c 266 * 0:Success
mbed_official 460:3bcf9be0332c 267 * 1:Error
mbed_official 460:3bcf9be0332c 268 */
mbed_official 460:3bcf9be0332c 269 static int rtc_dec16_to_hex(uint16_t dec_val, uint16_t offset, int *hex_val) {
mbed_official 460:3bcf9be0332c 270 int err = 0;
mbed_official 460:3bcf9be0332c 271 uint16_t ret_val;
mbed_official 460:3bcf9be0332c 272
mbed_official 460:3bcf9be0332c 273 if (hex_val != NULL) {
mbed_official 460:3bcf9be0332c 274 if (((dec_val & MASK_12_15_POS) >= (0x0A << SHIFT_3_HBYTE)) ||
mbed_official 460:3bcf9be0332c 275 ((dec_val & MASK_08_11_POS) >= (0x0A << SHIFT_2_HBYTE)) ||
mbed_official 460:3bcf9be0332c 276 ((dec_val & MASK_04_07_POS) >= (0x0A << SHIFT_1_HBYTE)) ||
mbed_official 460:3bcf9be0332c 277 ((dec_val & MASK_00_03_POS) >= 0x0A)) {
mbed_official 460:3bcf9be0332c 278 err = 1;
mbed_official 460:3bcf9be0332c 279 *hex_val = 0;
mbed_official 460:3bcf9be0332c 280 } else {
mbed_official 460:3bcf9be0332c 281 ret_val = (((dec_val & MASK_12_15_POS)) >> SHIFT_3_HBYTE) * 1000 +
mbed_official 460:3bcf9be0332c 282 (((dec_val & MASK_08_11_POS)) >> SHIFT_2_HBYTE) * 100 +
mbed_official 460:3bcf9be0332c 283 (((dec_val & MASK_04_07_POS)) >> SHIFT_1_HBYTE) * 10 +
mbed_official 460:3bcf9be0332c 284 (dec_val & MASK_00_03_POS);
mbed_official 460:3bcf9be0332c 285 if (ret_val < offset) {
mbed_official 460:3bcf9be0332c 286 err = 1;
mbed_official 460:3bcf9be0332c 287 } else {
mbed_official 460:3bcf9be0332c 288 *hex_val = ret_val - offset;
mbed_official 460:3bcf9be0332c 289 }
mbed_official 460:3bcf9be0332c 290 }
mbed_official 460:3bcf9be0332c 291 } else {
mbed_official 460:3bcf9be0332c 292 err = 1;
mbed_official 460:3bcf9be0332c 293 }
mbed_official 460:3bcf9be0332c 294 return err;
mbed_official 460:3bcf9be0332c 295 }
mbed_official 460:3bcf9be0332c 296
mbed_official 460:3bcf9be0332c 297 /*
mbed_official 460:3bcf9be0332c 298 * RTC write function
mbed_official 460:3bcf9be0332c 299 * [in]
mbed_official 460:3bcf9be0332c 300 * t:UNIX timestamp value
mbed_official 460:3bcf9be0332c 301 * [out]
mbed_official 460:3bcf9be0332c 302 * None.
mbed_official 460:3bcf9be0332c 303 */
mbed_official 460:3bcf9be0332c 304 void rtc_write(time_t t) {
mbed_official 460:3bcf9be0332c 305
mbed_official 460:3bcf9be0332c 306 struct tm *timeinfo = localtime(&t);
mbed_official 460:3bcf9be0332c 307 volatile uint16_t dummy_read;
mbed_official 460:3bcf9be0332c 308
mbed_official 460:3bcf9be0332c 309 if (rtc_isenabled() != 0) {
mbed_official 460:3bcf9be0332c 310 RTC.RCR2 = RCR2_VAL_ALLSTOP;
mbed_official 460:3bcf9be0332c 311 dummy_read = (uint16_t)RTC.RCR2;
mbed_official 460:3bcf9be0332c 312 dummy_read = (uint16_t)RTC.RCR2;
mbed_official 460:3bcf9be0332c 313 RTC.RCR2 = RCR2_VAL_RESET; // RESET = 1
mbed_official 460:3bcf9be0332c 314 dummy_read = (uint16_t)RTC.RCR2;
mbed_official 460:3bcf9be0332c 315 dummy_read = (uint16_t)RTC.RCR2;
mbed_official 460:3bcf9be0332c 316
mbed_official 460:3bcf9be0332c 317 RTC.RSECCNT = rtc_hex8_to_dec(timeinfo->tm_sec);
mbed_official 460:3bcf9be0332c 318 RTC.RMINCNT = rtc_hex8_to_dec(timeinfo->tm_min);
mbed_official 460:3bcf9be0332c 319 RTC.RHRCNT = rtc_hex8_to_dec(timeinfo->tm_hour);
mbed_official 460:3bcf9be0332c 320 RTC.RDAYCNT = rtc_hex8_to_dec(timeinfo->tm_mday);
mbed_official 460:3bcf9be0332c 321 RTC.RMONCNT = rtc_hex8_to_dec(timeinfo->tm_mon + 1);
mbed_official 460:3bcf9be0332c 322 RTC.RYRCNT = rtc_hex16_to_dec(timeinfo->tm_year + 1900);
mbed_official 460:3bcf9be0332c 323 dummy_read = (uint16_t)RTC.RYRCNT;
mbed_official 460:3bcf9be0332c 324 dummy_read = (uint16_t)RTC.RYRCNT;
mbed_official 460:3bcf9be0332c 325
mbed_official 460:3bcf9be0332c 326 RTC.RCR2 = RCR2_VAL_START; // START = 1
mbed_official 460:3bcf9be0332c 327
mbed_official 460:3bcf9be0332c 328 dummy_read = (uint16_t)RTC.RCR2;
mbed_official 460:3bcf9be0332c 329 dummy_read = (uint16_t)RTC.RCR2;
mbed_official 460:3bcf9be0332c 330 }
mbed_official 460:3bcf9be0332c 331 }
mbed_official 460:3bcf9be0332c 332
mbed_official 460:3bcf9be0332c 333 /*
mbed_official 460:3bcf9be0332c 334 * HEX to Dec(8bit) function for RTC.
mbed_official 460:3bcf9be0332c 335 * [in]
mbed_official 460:3bcf9be0332c 336 * hex_val:Hexadecimal value.
mbed_official 460:3bcf9be0332c 337 * [out]
mbed_official 460:3bcf9be0332c 338 * decimal value:From 0x00 to 0x99.
mbed_official 460:3bcf9be0332c 339 */
mbed_official 460:3bcf9be0332c 340 static uint8_t rtc_hex8_to_dec(uint8_t hex_val) {
mbed_official 460:3bcf9be0332c 341 uint32_t calc_data;
mbed_official 460:3bcf9be0332c 342
mbed_official 460:3bcf9be0332c 343 calc_data = hex_val / 10 * 0x10;
mbed_official 460:3bcf9be0332c 344 calc_data += hex_val % 10;
mbed_official 460:3bcf9be0332c 345
mbed_official 460:3bcf9be0332c 346 if (calc_data > 0x99) {
mbed_official 460:3bcf9be0332c 347 calc_data = 0;
mbed_official 460:3bcf9be0332c 348 }
mbed_official 460:3bcf9be0332c 349
mbed_official 460:3bcf9be0332c 350 return (uint8_t)calc_data;
mbed_official 460:3bcf9be0332c 351 }
mbed_official 460:3bcf9be0332c 352
mbed_official 460:3bcf9be0332c 353 /*
mbed_official 460:3bcf9be0332c 354 * HEX to Dec(16bit) function for RTC.
mbed_official 460:3bcf9be0332c 355 * [in]
mbed_official 460:3bcf9be0332c 356 * hex_val:Hexadecimal value.
mbed_official 460:3bcf9be0332c 357 * [out]
mbed_official 460:3bcf9be0332c 358 * decimal value:From 0x0000 to 0x9999.
mbed_official 460:3bcf9be0332c 359 */
mbed_official 460:3bcf9be0332c 360 static uint16_t rtc_hex16_to_dec(uint16_t hex_val) {
mbed_official 460:3bcf9be0332c 361 uint32_t calc_data;
mbed_official 460:3bcf9be0332c 362 calc_data = hex_val / 1000 * 0x1000;
mbed_official 460:3bcf9be0332c 363 calc_data += ((hex_val / 100) % 10) * 0x100;
mbed_official 460:3bcf9be0332c 364 calc_data += ((hex_val / 10) % 10) * 0x10;
mbed_official 460:3bcf9be0332c 365 calc_data += hex_val % 10;
mbed_official 460:3bcf9be0332c 366
mbed_official 460:3bcf9be0332c 367 if (calc_data > 0x9999) {
mbed_official 460:3bcf9be0332c 368 calc_data = 0;
mbed_official 460:3bcf9be0332c 369 }
mbed_official 460:3bcf9be0332c 370 return (uint16_t)calc_data;
mbed_official 460:3bcf9be0332c 371
mbed_official 460:3bcf9be0332c 372 }
mbed_official 460:3bcf9be0332c 373
mbed_official 460:3bcf9be0332c 374 #endif /* DEVICE_RTC */