Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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