mbed library sources. Supersedes mbed-src.

Fork of mbed by teralytic

Committer:
mbed_official
Date:
Fri Apr 29 01:15:11 2016 +0100
Revision:
119:3921aeca8633
Synchronized with git revision fe9720f24b1adc71ab6962506ec51290f6afd270

Full URL: https://github.com/mbedmicro/mbed/commit/fe9720f24b1adc71ab6962506ec51290f6afd270/

[Renesas RZ/A1H] Enable asynchronous communications

Who changed what in which revision?

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