mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Fri Feb 16 16:09:33 2018 +0000
Revision:
181:57724642e740
Child:
184:08ed48f1de7f
mbed-dev library. Release version 159.

Who changed what in which revision?

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