MAX31343 RTC Mbed Driver

MAX31343 RTC Driver

Committer:
Erman Komurcu
Date:
Tue Dec 01 13:32:54 2020 +0300
Revision:
0:aa73b3c9d246
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Erman Komurcu 0:aa73b3c9d246 1 /*******************************************************************************
Erman Komurcu 0:aa73b3c9d246 2 * Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved.
Erman Komurcu 0:aa73b3c9d246 3 *
Erman Komurcu 0:aa73b3c9d246 4 * Permission is hereby granted, free of charge, to any person obtaining a
Erman Komurcu 0:aa73b3c9d246 5 * copy of this software and associated documentation files (the "Software"),
Erman Komurcu 0:aa73b3c9d246 6 * to deal in the Software without restriction, including without limitation
Erman Komurcu 0:aa73b3c9d246 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Erman Komurcu 0:aa73b3c9d246 8 * and/or sell copies of the Software, and to permit persons to whom the
Erman Komurcu 0:aa73b3c9d246 9 * Software is furnished to do so, subject to the following conditions:
Erman Komurcu 0:aa73b3c9d246 10 *
Erman Komurcu 0:aa73b3c9d246 11 * The above copyright notice and this permission notice shall be included
Erman Komurcu 0:aa73b3c9d246 12 * in all copies or substantial portions of the Software.
Erman Komurcu 0:aa73b3c9d246 13 *
Erman Komurcu 0:aa73b3c9d246 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Erman Komurcu 0:aa73b3c9d246 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Erman Komurcu 0:aa73b3c9d246 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Erman Komurcu 0:aa73b3c9d246 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Erman Komurcu 0:aa73b3c9d246 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Erman Komurcu 0:aa73b3c9d246 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Erman Komurcu 0:aa73b3c9d246 20 * OTHER DEALINGS IN THE SOFTWARE.
Erman Komurcu 0:aa73b3c9d246 21 *
Erman Komurcu 0:aa73b3c9d246 22 * Except as contained in this notice, the name of Maxim Integrated
Erman Komurcu 0:aa73b3c9d246 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Erman Komurcu 0:aa73b3c9d246 24 * Products, Inc. Branding Policy.
Erman Komurcu 0:aa73b3c9d246 25 *
Erman Komurcu 0:aa73b3c9d246 26 * The mere transfer of this software does not imply any licenses
Erman Komurcu 0:aa73b3c9d246 27 * of trade secrets, proprietary technology, copyrights, patents,
Erman Komurcu 0:aa73b3c9d246 28 * trademarks, maskwork rights, or any other form of intellectual
Erman Komurcu 0:aa73b3c9d246 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
Erman Komurcu 0:aa73b3c9d246 30 * ownership rights.
Erman Komurcu 0:aa73b3c9d246 31 *******************************************************************************
Erman Komurcu 0:aa73b3c9d246 32 */
Erman Komurcu 0:aa73b3c9d246 33
Erman Komurcu 0:aa73b3c9d246 34 #include "Max31343.h"
Erman Komurcu 0:aa73b3c9d246 35
Erman Komurcu 0:aa73b3c9d246 36 #define pr_err(fmt, ...) if(1) printf(fmt " (%s:%d)\r\n", ## __VA_ARGS__, __func__, __LINE__)
Erman Komurcu 0:aa73b3c9d246 37 #define pr_debug(fmt, ...) if(0) printf(fmt " (%s:%d)\r\n", ## __VA_ARGS__, __func__, __LINE__)
Erman Komurcu 0:aa73b3c9d246 38
Erman Komurcu 0:aa73b3c9d246 39 #define BCD2BIN(val) (((val) & 15) + ((val) >> 4) * 10)
Erman Komurcu 0:aa73b3c9d246 40 #define BIN2BCD(val) ((((val) / 10) << 4) + (val) % 10)
Erman Komurcu 0:aa73b3c9d246 41
Erman Komurcu 0:aa73b3c9d246 42 #define POST_INTR_WORK_SIGNAL_ID 0x1
Erman Komurcu 0:aa73b3c9d246 43
Erman Komurcu 0:aa73b3c9d246 44 #define TRICKLE_ENABLE_CODE 0x5
Erman Komurcu 0:aa73b3c9d246 45
Erman Komurcu 0:aa73b3c9d246 46 Max31343::Max31343(I2C *i2c, PinName pin_int)
Erman Komurcu 0:aa73b3c9d246 47 {
Erman Komurcu 0:aa73b3c9d246 48 if (i2c == NULL) {
Erman Komurcu 0:aa73b3c9d246 49 pr_err("i2c object is invalid!");
Erman Komurcu 0:aa73b3c9d246 50 while (1);
Erman Komurcu 0:aa73b3c9d246 51 }
Erman Komurcu 0:aa73b3c9d246 52 i2c_handler = i2c;
Erman Komurcu 0:aa73b3c9d246 53
Erman Komurcu 0:aa73b3c9d246 54 sw_reset_release();
Erman Komurcu 0:aa73b3c9d246 55
Erman Komurcu 0:aa73b3c9d246 56 rtc_start();
Erman Komurcu 0:aa73b3c9d246 57
Erman Komurcu 0:aa73b3c9d246 58 irq_disable_all();
Erman Komurcu 0:aa73b3c9d246 59
Erman Komurcu 0:aa73b3c9d246 60 post_intr_work_thread = new Thread();
Erman Komurcu 0:aa73b3c9d246 61
Erman Komurcu 0:aa73b3c9d246 62 post_intr_work_thread->start(Callback<void()>(this, &Max31343::post_interrupt_work));
Erman Komurcu 0:aa73b3c9d246 63
Erman Komurcu 0:aa73b3c9d246 64 if (pin_int != NC) {
Erman Komurcu 0:aa73b3c9d246 65 this->pin_int = new InterruptIn(pin_int);
Erman Komurcu 0:aa73b3c9d246 66
Erman Komurcu 0:aa73b3c9d246 67 this->pin_int->fall(Callback<void()>(this, &Max31343::interrupt_handler));
Erman Komurcu 0:aa73b3c9d246 68
Erman Komurcu 0:aa73b3c9d246 69 this->pin_int->enable_irq();
Erman Komurcu 0:aa73b3c9d246 70 } else {
Erman Komurcu 0:aa73b3c9d246 71 this->pin_int = NULL;
Erman Komurcu 0:aa73b3c9d246 72 }
Erman Komurcu 0:aa73b3c9d246 73 }
Erman Komurcu 0:aa73b3c9d246 74
Erman Komurcu 0:aa73b3c9d246 75 Max31343::~Max31343()
Erman Komurcu 0:aa73b3c9d246 76 {
Erman Komurcu 0:aa73b3c9d246 77 if (post_intr_work_thread) {
Erman Komurcu 0:aa73b3c9d246 78 delete post_intr_work_thread;
Erman Komurcu 0:aa73b3c9d246 79 }
Erman Komurcu 0:aa73b3c9d246 80
Erman Komurcu 0:aa73b3c9d246 81 if (pin_int) {
Erman Komurcu 0:aa73b3c9d246 82 delete pin_int;
Erman Komurcu 0:aa73b3c9d246 83 }
Erman Komurcu 0:aa73b3c9d246 84 }
Erman Komurcu 0:aa73b3c9d246 85
Erman Komurcu 0:aa73b3c9d246 86 int Max31343::read_register(uint8_t reg, uint8_t *value, uint8_t len)
Erman Komurcu 0:aa73b3c9d246 87 {
Erman Komurcu 0:aa73b3c9d246 88 int ret;
Erman Komurcu 0:aa73b3c9d246 89
Erman Komurcu 0:aa73b3c9d246 90 if (value == NULL) {
Erman Komurcu 0:aa73b3c9d246 91 pr_err("value is invalid!");
Erman Komurcu 0:aa73b3c9d246 92 return -1;
Erman Komurcu 0:aa73b3c9d246 93 }
Erman Komurcu 0:aa73b3c9d246 94
Erman Komurcu 0:aa73b3c9d246 95 ret = i2c_handler->write(MAX3134X_I2C_W, (const char *) &reg, 1, true);
Erman Komurcu 0:aa73b3c9d246 96 if (ret != 0) {
Erman Komurcu 0:aa73b3c9d246 97 pr_err("i2c write failed with %d!", ret);
Erman Komurcu 0:aa73b3c9d246 98 return -1;
Erman Komurcu 0:aa73b3c9d246 99 }
Erman Komurcu 0:aa73b3c9d246 100
Erman Komurcu 0:aa73b3c9d246 101 ret = i2c_handler->read(MAX3134X_I2C_R, (char *) value, len, false);
Erman Komurcu 0:aa73b3c9d246 102 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 103 pr_err("i2c read failed with %d!", ret);
Erman Komurcu 0:aa73b3c9d246 104 return -1;
Erman Komurcu 0:aa73b3c9d246 105 }
Erman Komurcu 0:aa73b3c9d246 106
Erman Komurcu 0:aa73b3c9d246 107 return 0;
Erman Komurcu 0:aa73b3c9d246 108 }
Erman Komurcu 0:aa73b3c9d246 109
Erman Komurcu 0:aa73b3c9d246 110 int Max31343::write_register(uint8_t reg, const uint8_t *value, uint8_t len)
Erman Komurcu 0:aa73b3c9d246 111 {
Erman Komurcu 0:aa73b3c9d246 112 int ret;
Erman Komurcu 0:aa73b3c9d246 113 uint8_t *buffer;
Erman Komurcu 0:aa73b3c9d246 114
Erman Komurcu 0:aa73b3c9d246 115 if (value == NULL) {
Erman Komurcu 0:aa73b3c9d246 116 pr_err("value is invalid!");
Erman Komurcu 0:aa73b3c9d246 117 return -1;
Erman Komurcu 0:aa73b3c9d246 118 }
Erman Komurcu 0:aa73b3c9d246 119
Erman Komurcu 0:aa73b3c9d246 120 buffer = new uint8_t[1 + len];
Erman Komurcu 0:aa73b3c9d246 121 buffer[0] = reg;
Erman Komurcu 0:aa73b3c9d246 122
Erman Komurcu 0:aa73b3c9d246 123 memcpy(&buffer[1], value, len);
Erman Komurcu 0:aa73b3c9d246 124
Erman Komurcu 0:aa73b3c9d246 125 ret = i2c_handler->write(MAX3134X_I2C_W, (const char *)buffer, 1 + len);
Erman Komurcu 0:aa73b3c9d246 126 if (ret != 0) {
Erman Komurcu 0:aa73b3c9d246 127 pr_err("i2c write failed with %d!", ret);
Erman Komurcu 0:aa73b3c9d246 128 }
Erman Komurcu 0:aa73b3c9d246 129
Erman Komurcu 0:aa73b3c9d246 130 delete[] buffer;
Erman Komurcu 0:aa73b3c9d246 131
Erman Komurcu 0:aa73b3c9d246 132 return ret;
Erman Komurcu 0:aa73b3c9d246 133 }
Erman Komurcu 0:aa73b3c9d246 134
Erman Komurcu 0:aa73b3c9d246 135 int Max31343::rtc_regs_to_time(struct tm *time, const rtc_time_regs_t *regs)
Erman Komurcu 0:aa73b3c9d246 136 {
Erman Komurcu 0:aa73b3c9d246 137 /* tm_sec seconds [0,61] */
Erman Komurcu 0:aa73b3c9d246 138 time->tm_sec = BCD2BIN(regs->seconds.bcd.value);
Erman Komurcu 0:aa73b3c9d246 139
Erman Komurcu 0:aa73b3c9d246 140 /* tm_min minutes [0,59] */
Erman Komurcu 0:aa73b3c9d246 141 time->tm_min = BCD2BIN(regs->minutes.bcd.value);
Erman Komurcu 0:aa73b3c9d246 142
Erman Komurcu 0:aa73b3c9d246 143 /* tm_hour hour [0,23] */
Erman Komurcu 0:aa73b3c9d246 144 time->tm_hour = BCD2BIN(regs->hours.bcd.value);
Erman Komurcu 0:aa73b3c9d246 145
Erman Komurcu 0:aa73b3c9d246 146 /* tm_wday day of week [0,6] (Sunday = 0) */
Erman Komurcu 0:aa73b3c9d246 147 time->tm_wday = BCD2BIN(regs->day.bcd.value) - 1;
Erman Komurcu 0:aa73b3c9d246 148
Erman Komurcu 0:aa73b3c9d246 149 /* tm_mday day of month [1,31] */
Erman Komurcu 0:aa73b3c9d246 150 time->tm_mday = BCD2BIN(regs->date.bcd.value);
Erman Komurcu 0:aa73b3c9d246 151
Erman Komurcu 0:aa73b3c9d246 152 /* tm_mon month of year [0,11] */
Erman Komurcu 0:aa73b3c9d246 153 time->tm_mon = BCD2BIN(regs->month.bcd.value) - 1;
Erman Komurcu 0:aa73b3c9d246 154
Erman Komurcu 0:aa73b3c9d246 155 /* tm_year years since 2000 */
Erman Komurcu 0:aa73b3c9d246 156 if (regs->month.bits.century) {
Erman Komurcu 0:aa73b3c9d246 157 time->tm_year = BCD2BIN(regs->year.bcd.value) + 200;
Erman Komurcu 0:aa73b3c9d246 158 } else {
Erman Komurcu 0:aa73b3c9d246 159 time->tm_year = BCD2BIN(regs->year.bcd.value) + 100;
Erman Komurcu 0:aa73b3c9d246 160 }
Erman Komurcu 0:aa73b3c9d246 161
Erman Komurcu 0:aa73b3c9d246 162 /* tm_yday day of year [0,365] */
Erman Komurcu 0:aa73b3c9d246 163 time->tm_yday = 0; /* TODO */
Erman Komurcu 0:aa73b3c9d246 164
Erman Komurcu 0:aa73b3c9d246 165 /* tm_isdst daylight savings flag */
Erman Komurcu 0:aa73b3c9d246 166 time->tm_isdst = 0; /* TODO */
Erman Komurcu 0:aa73b3c9d246 167
Erman Komurcu 0:aa73b3c9d246 168 return 0;
Erman Komurcu 0:aa73b3c9d246 169 }
Erman Komurcu 0:aa73b3c9d246 170
Erman Komurcu 0:aa73b3c9d246 171 int Max31343::time_to_rtc_regs(rtc_time_regs_t *regs, const struct tm *time)
Erman Komurcu 0:aa73b3c9d246 172 {
Erman Komurcu 0:aa73b3c9d246 173 /*********************************************************
Erman Komurcu 0:aa73b3c9d246 174 * +----------+------+---------------------------+-------+
Erman Komurcu 0:aa73b3c9d246 175 * | Member | Type | Meaning | Range |
Erman Komurcu 0:aa73b3c9d246 176 * +----------+------+---------------------------+-------+
Erman Komurcu 0:aa73b3c9d246 177 * | tm_sec | int | seconds after the minute | 0-61* |
Erman Komurcu 0:aa73b3c9d246 178 * | tm_min | int | minutes after the hour | 0-59 |
Erman Komurcu 0:aa73b3c9d246 179 * | tm_hour | int | hours since midnight | 0-23 |
Erman Komurcu 0:aa73b3c9d246 180 * | tm_mday | int | day of the month | 1-31 |
Erman Komurcu 0:aa73b3c9d246 181 * | tm_mon | int | months since January | 0-11 |
Erman Komurcu 0:aa73b3c9d246 182 * | tm_year | int | years since 1900 | |
Erman Komurcu 0:aa73b3c9d246 183 * | tm_wday | int | days since Sunday | 0-6 |
Erman Komurcu 0:aa73b3c9d246 184 * | tm_yday | int | days since January 1 | 0-365 |
Erman Komurcu 0:aa73b3c9d246 185 * | tm_isdst | int | Daylight Saving Time flag | |
Erman Komurcu 0:aa73b3c9d246 186 * +----------+------+---------------------------+-------+
Erman Komurcu 0:aa73b3c9d246 187 * * tm_sec is generally 0-59. The extra range is to accommodate for leap
Erman Komurcu 0:aa73b3c9d246 188 * seconds in certain systems.
Erman Komurcu 0:aa73b3c9d246 189 *********************************************************/
Erman Komurcu 0:aa73b3c9d246 190 regs->seconds.bcd.value = BIN2BCD(time->tm_sec);
Erman Komurcu 0:aa73b3c9d246 191
Erman Komurcu 0:aa73b3c9d246 192 regs->minutes.bcd.value = BIN2BCD(time->tm_min);
Erman Komurcu 0:aa73b3c9d246 193
Erman Komurcu 0:aa73b3c9d246 194 regs->hours.bcd.value= BIN2BCD(time->tm_hour);
Erman Komurcu 0:aa73b3c9d246 195
Erman Komurcu 0:aa73b3c9d246 196 regs->day.bcd.value = BIN2BCD(time->tm_wday + 1);
Erman Komurcu 0:aa73b3c9d246 197
Erman Komurcu 0:aa73b3c9d246 198 regs->date.bcd.value = BIN2BCD(time->tm_mday);
Erman Komurcu 0:aa73b3c9d246 199
Erman Komurcu 0:aa73b3c9d246 200 regs->month.bcd.value = BIN2BCD(time->tm_mon + 1);
Erman Komurcu 0:aa73b3c9d246 201
Erman Komurcu 0:aa73b3c9d246 202 if (time->tm_year >= 200) {
Erman Komurcu 0:aa73b3c9d246 203 regs->month.bits.century = 1;
Erman Komurcu 0:aa73b3c9d246 204 regs->year.bcd.value = BIN2BCD(time->tm_year - 200);
Erman Komurcu 0:aa73b3c9d246 205 } else if (time->tm_year >= 100) {
Erman Komurcu 0:aa73b3c9d246 206 regs->month.bits.century = 0;
Erman Komurcu 0:aa73b3c9d246 207 regs->year.bcd.value = BIN2BCD(time->tm_year - 100);
Erman Komurcu 0:aa73b3c9d246 208 } else {
Erman Komurcu 0:aa73b3c9d246 209 pr_err("Invalid set date!");
Erman Komurcu 0:aa73b3c9d246 210 return -1;
Erman Komurcu 0:aa73b3c9d246 211 }
Erman Komurcu 0:aa73b3c9d246 212
Erman Komurcu 0:aa73b3c9d246 213 return 0;
Erman Komurcu 0:aa73b3c9d246 214 }
Erman Komurcu 0:aa73b3c9d246 215
Erman Komurcu 0:aa73b3c9d246 216 int Max31343::get_time(struct tm *time)
Erman Komurcu 0:aa73b3c9d246 217 {
Erman Komurcu 0:aa73b3c9d246 218 rtc_time_regs_t time_regs;
Erman Komurcu 0:aa73b3c9d246 219
Erman Komurcu 0:aa73b3c9d246 220 if (time == NULL) {
Erman Komurcu 0:aa73b3c9d246 221 pr_err("rtc_ctime is invalid!");
Erman Komurcu 0:aa73b3c9d246 222 return -1;
Erman Komurcu 0:aa73b3c9d246 223 }
Erman Komurcu 0:aa73b3c9d246 224
Erman Komurcu 0:aa73b3c9d246 225 if (read_register(MAX31343_REG_SECONDS_ADDR, (uint8_t *) &time_regs, sizeof(time_regs)) < 0) {
Erman Komurcu 0:aa73b3c9d246 226 pr_err("read time registers failed!");
Erman Komurcu 0:aa73b3c9d246 227 return -1;
Erman Komurcu 0:aa73b3c9d246 228 }
Erman Komurcu 0:aa73b3c9d246 229
Erman Komurcu 0:aa73b3c9d246 230 return rtc_regs_to_time(time, &time_regs);
Erman Komurcu 0:aa73b3c9d246 231 }
Erman Komurcu 0:aa73b3c9d246 232
Erman Komurcu 0:aa73b3c9d246 233 int Max31343::set_time(const struct tm *time)
Erman Komurcu 0:aa73b3c9d246 234 {
Erman Komurcu 0:aa73b3c9d246 235 rtc_time_regs_t time_regs;
Erman Komurcu 0:aa73b3c9d246 236
Erman Komurcu 0:aa73b3c9d246 237 if (time == NULL) {
Erman Komurcu 0:aa73b3c9d246 238 pr_err("rtc_ctime is invalid!");
Erman Komurcu 0:aa73b3c9d246 239 return -1;
Erman Komurcu 0:aa73b3c9d246 240 }
Erman Komurcu 0:aa73b3c9d246 241
Erman Komurcu 0:aa73b3c9d246 242 time_to_rtc_regs(&time_regs, time);
Erman Komurcu 0:aa73b3c9d246 243
Erman Komurcu 0:aa73b3c9d246 244 if (write_register(MAX31343_REG_SECONDS_ADDR, (const uint8_t *) &time_regs, sizeof(time_regs)) < 0) {
Erman Komurcu 0:aa73b3c9d246 245 pr_err("read time registers failed!");
Erman Komurcu 0:aa73b3c9d246 246 return -1;
Erman Komurcu 0:aa73b3c9d246 247 }
Erman Komurcu 0:aa73b3c9d246 248
Erman Komurcu 0:aa73b3c9d246 249 return 0;
Erman Komurcu 0:aa73b3c9d246 250 }
Erman Komurcu 0:aa73b3c9d246 251
Erman Komurcu 0:aa73b3c9d246 252 int Max31343::time_to_alarm_regs(alarm_regs_t &regs, const struct tm *alarm_time)
Erman Komurcu 0:aa73b3c9d246 253 {
Erman Komurcu 0:aa73b3c9d246 254 regs.sec.bcd.value = BIN2BCD(alarm_time->tm_sec);
Erman Komurcu 0:aa73b3c9d246 255 regs.min.bcd.value = BIN2BCD(alarm_time->tm_min);
Erman Komurcu 0:aa73b3c9d246 256
Erman Komurcu 0:aa73b3c9d246 257 regs.hrs.bcd.value = BIN2BCD(alarm_time->tm_hour);
Erman Komurcu 0:aa73b3c9d246 258
Erman Komurcu 0:aa73b3c9d246 259 if (regs.day_date.bits.dy_dt == 0) {
Erman Komurcu 0:aa73b3c9d246 260 /* Date match */
Erman Komurcu 0:aa73b3c9d246 261 regs.day_date.bcd_date.value = BIN2BCD(alarm_time->tm_mday);
Erman Komurcu 0:aa73b3c9d246 262 } else {
Erman Komurcu 0:aa73b3c9d246 263 /* Day match */
Erman Komurcu 0:aa73b3c9d246 264 regs.day_date.bcd_day.value = BIN2BCD(alarm_time->tm_wday);
Erman Komurcu 0:aa73b3c9d246 265 }
Erman Komurcu 0:aa73b3c9d246 266 regs.mon.bcd.value = BIN2BCD(alarm_time->tm_mon+1);
Erman Komurcu 0:aa73b3c9d246 267
Erman Komurcu 0:aa73b3c9d246 268 if (alarm_time->tm_year >= 200) {
Erman Komurcu 0:aa73b3c9d246 269 regs.year.bcd.value = BIN2BCD(alarm_time->tm_year - 200);
Erman Komurcu 0:aa73b3c9d246 270 } else if (alarm_time->tm_year >= 100) {
Erman Komurcu 0:aa73b3c9d246 271 regs.year.bcd.value = BIN2BCD(alarm_time->tm_year - 100);
Erman Komurcu 0:aa73b3c9d246 272 } else {
Erman Komurcu 0:aa73b3c9d246 273 pr_err("Invalid set year!");
Erman Komurcu 0:aa73b3c9d246 274 return -1;
Erman Komurcu 0:aa73b3c9d246 275 }
Erman Komurcu 0:aa73b3c9d246 276
Erman Komurcu 0:aa73b3c9d246 277 return 0;
Erman Komurcu 0:aa73b3c9d246 278 }
Erman Komurcu 0:aa73b3c9d246 279
Erman Komurcu 0:aa73b3c9d246 280 int Max31343::alarm_regs_to_time(struct tm *alarm_time, const alarm_regs_t *regs)
Erman Komurcu 0:aa73b3c9d246 281 {
Erman Komurcu 0:aa73b3c9d246 282 alarm_time->tm_sec = BCD2BIN(regs->sec.bcd.value);
Erman Komurcu 0:aa73b3c9d246 283 alarm_time->tm_min = BCD2BIN(regs->min.bcd.value);
Erman Komurcu 0:aa73b3c9d246 284 alarm_time->tm_hour = BCD2BIN(regs->hrs.bcd.value);
Erman Komurcu 0:aa73b3c9d246 285
Erman Komurcu 0:aa73b3c9d246 286 if (regs->day_date.bits.dy_dt == 0) { /* date */
Erman Komurcu 0:aa73b3c9d246 287 alarm_time->tm_mday = BCD2BIN(regs->day_date.bcd_date.value);
Erman Komurcu 0:aa73b3c9d246 288 } else { /* day */
Erman Komurcu 0:aa73b3c9d246 289 alarm_time->tm_wday = BCD2BIN(regs->day_date.bcd_day.value);
Erman Komurcu 0:aa73b3c9d246 290 }
Erman Komurcu 0:aa73b3c9d246 291
Erman Komurcu 0:aa73b3c9d246 292 alarm_time->tm_mon = BCD2BIN(regs->mon.bcd.value) - 1;
Erman Komurcu 0:aa73b3c9d246 293
Erman Komurcu 0:aa73b3c9d246 294 /* XXX no century bit */
Erman Komurcu 0:aa73b3c9d246 295 alarm_time->tm_year = BCD2BIN(regs->year.bcd.value) + 100;
Erman Komurcu 0:aa73b3c9d246 296
Erman Komurcu 0:aa73b3c9d246 297
Erman Komurcu 0:aa73b3c9d246 298 return 0;
Erman Komurcu 0:aa73b3c9d246 299 }
Erman Komurcu 0:aa73b3c9d246 300
Erman Komurcu 0:aa73b3c9d246 301 int Max31343::set_alarm_period(alarm_no_t alarm_no, alarm_regs_t &regs, alarm_period_t period)
Erman Komurcu 0:aa73b3c9d246 302 {
Erman Komurcu 0:aa73b3c9d246 303 switch (period) {
Erman Komurcu 0:aa73b3c9d246 304 case ALARM_PERIOD_ONETIME:
Erman Komurcu 0:aa73b3c9d246 305 if (alarm_no == ALARM2) { /* not supported! */
Erman Komurcu 0:aa73b3c9d246 306 return -1;
Erman Komurcu 0:aa73b3c9d246 307 }
Erman Komurcu 0:aa73b3c9d246 308 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 309 regs.min.bits.a1m2 = 0;
Erman Komurcu 0:aa73b3c9d246 310 regs.hrs.bits.a1m3 = 0;
Erman Komurcu 0:aa73b3c9d246 311 regs.day_date.bits.a1m4 = 0;
Erman Komurcu 0:aa73b3c9d246 312 regs.mon.bits.a1m5 = 0;
Erman Komurcu 0:aa73b3c9d246 313 regs.mon.bits.a1m6 = 0;
Erman Komurcu 0:aa73b3c9d246 314 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 315 break;
Erman Komurcu 0:aa73b3c9d246 316 case ALARM_PERIOD_YEARLY:
Erman Komurcu 0:aa73b3c9d246 317 if (alarm_no == ALARM2) { /* not supported! */
Erman Komurcu 0:aa73b3c9d246 318 return -1;
Erman Komurcu 0:aa73b3c9d246 319 }
Erman Komurcu 0:aa73b3c9d246 320 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 321 regs.min.bits.a1m2 = 0;
Erman Komurcu 0:aa73b3c9d246 322 regs.hrs.bits.a1m3 = 0;
Erman Komurcu 0:aa73b3c9d246 323 regs.day_date.bits.a1m4 = 0;
Erman Komurcu 0:aa73b3c9d246 324 regs.mon.bits.a1m5 = 0;
Erman Komurcu 0:aa73b3c9d246 325 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 326 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 327 break;
Erman Komurcu 0:aa73b3c9d246 328 case ALARM_PERIOD_MONTHLY:
Erman Komurcu 0:aa73b3c9d246 329 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 330 regs.min.bits.a1m2 = 0;
Erman Komurcu 0:aa73b3c9d246 331 regs.hrs.bits.a1m3 = 0;
Erman Komurcu 0:aa73b3c9d246 332 regs.day_date.bits.a1m4 = 0;
Erman Komurcu 0:aa73b3c9d246 333 regs.mon.bits.a1m5 = 1;
Erman Komurcu 0:aa73b3c9d246 334 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 335 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 336 break;
Erman Komurcu 0:aa73b3c9d246 337 case ALARM_PERIOD_WEEKLY:
Erman Komurcu 0:aa73b3c9d246 338 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 339 regs.min.bits.a1m2 = 0;
Erman Komurcu 0:aa73b3c9d246 340 regs.hrs.bits.a1m3 = 0;
Erman Komurcu 0:aa73b3c9d246 341 regs.day_date.bits.a1m4 = 0;
Erman Komurcu 0:aa73b3c9d246 342 regs.mon.bits.a1m5 = 1;
Erman Komurcu 0:aa73b3c9d246 343 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 344 regs.day_date.bits.dy_dt = 1;
Erman Komurcu 0:aa73b3c9d246 345 break;
Erman Komurcu 0:aa73b3c9d246 346 case ALARM_PERIOD_DAILY:
Erman Komurcu 0:aa73b3c9d246 347 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 348 regs.min.bits.a1m2 = 0;
Erman Komurcu 0:aa73b3c9d246 349 regs.hrs.bits.a1m3 = 0;
Erman Komurcu 0:aa73b3c9d246 350 regs.day_date.bits.a1m4 = 1;
Erman Komurcu 0:aa73b3c9d246 351 regs.mon.bits.a1m5 = 1;
Erman Komurcu 0:aa73b3c9d246 352 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 353 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 354 break;
Erman Komurcu 0:aa73b3c9d246 355 case ALARM_PERIOD_HOURLY:
Erman Komurcu 0:aa73b3c9d246 356 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 357 regs.min.bits.a1m2 = 0;
Erman Komurcu 0:aa73b3c9d246 358 regs.hrs.bits.a1m3 = 1;
Erman Komurcu 0:aa73b3c9d246 359 regs.day_date.bits.a1m4 = 1;
Erman Komurcu 0:aa73b3c9d246 360 regs.mon.bits.a1m5 = 1;
Erman Komurcu 0:aa73b3c9d246 361 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 362 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 363 break;
Erman Komurcu 0:aa73b3c9d246 364 case ALARM_PERIOD_EVERYMINUTE:
Erman Komurcu 0:aa73b3c9d246 365 regs.sec.bits.a1m1 = 0;
Erman Komurcu 0:aa73b3c9d246 366 regs.min.bits.a1m2 = 1;
Erman Komurcu 0:aa73b3c9d246 367 regs.hrs.bits.a1m3 = 1;
Erman Komurcu 0:aa73b3c9d246 368 regs.day_date.bits.a1m4 = 1;
Erman Komurcu 0:aa73b3c9d246 369 regs.mon.bits.a1m5 = 1;
Erman Komurcu 0:aa73b3c9d246 370 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 371 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 372 break;
Erman Komurcu 0:aa73b3c9d246 373 case ALARM_PERIOD_EVERYSECOND:
Erman Komurcu 0:aa73b3c9d246 374 if ((alarm_no == ALARM2) && (period == ALARM_PERIOD_EVERYSECOND)) {
Erman Komurcu 0:aa73b3c9d246 375 return -1; /* Alarm2 does not support "once per second" alarm*/
Erman Komurcu 0:aa73b3c9d246 376 }
Erman Komurcu 0:aa73b3c9d246 377 regs.sec.bits.a1m1 = 1;
Erman Komurcu 0:aa73b3c9d246 378 regs.min.bits.a1m2 = 1;
Erman Komurcu 0:aa73b3c9d246 379 regs.hrs.bits.a1m3 = 1;
Erman Komurcu 0:aa73b3c9d246 380 regs.day_date.bits.a1m4 = 1;
Erman Komurcu 0:aa73b3c9d246 381 regs.mon.bits.a1m5 = 1;
Erman Komurcu 0:aa73b3c9d246 382 regs.mon.bits.a1m6 = 1;
Erman Komurcu 0:aa73b3c9d246 383 regs.day_date.bits.dy_dt = 0;
Erman Komurcu 0:aa73b3c9d246 384 break;
Erman Komurcu 0:aa73b3c9d246 385 default:
Erman Komurcu 0:aa73b3c9d246 386 return -1;
Erman Komurcu 0:aa73b3c9d246 387 }
Erman Komurcu 0:aa73b3c9d246 388
Erman Komurcu 0:aa73b3c9d246 389 return 0;
Erman Komurcu 0:aa73b3c9d246 390 }
Erman Komurcu 0:aa73b3c9d246 391
Erman Komurcu 0:aa73b3c9d246 392 int Max31343::set_alarm_regs(alarm_no_t alarm_no, const alarm_regs_t *regs)
Erman Komurcu 0:aa73b3c9d246 393 {
Erman Komurcu 0:aa73b3c9d246 394 uint8_t *ptr_regs = (uint8_t *)regs;
Erman Komurcu 0:aa73b3c9d246 395 uint8_t off = 0;
Erman Komurcu 0:aa73b3c9d246 396 uint8_t dev_ba;
Erman Komurcu 0:aa73b3c9d246 397 uint8_t len = sizeof(alarm_regs_t);
Erman Komurcu 0:aa73b3c9d246 398
Erman Komurcu 0:aa73b3c9d246 399 if (alarm_no == ALARM1) {
Erman Komurcu 0:aa73b3c9d246 400 dev_ba = MAX31343_REG_ALM1_SEC_ADDR;
Erman Komurcu 0:aa73b3c9d246 401 } else {
Erman Komurcu 0:aa73b3c9d246 402 dev_ba = MAX31343_REG_ALM2_MIN_ADDR;
Erman Komurcu 0:aa73b3c9d246 403 off = 1; /* starts from min register */
Erman Komurcu 0:aa73b3c9d246 404 len -= 3; /* XXX discard min, mon & sec registers */
Erman Komurcu 0:aa73b3c9d246 405 }
Erman Komurcu 0:aa73b3c9d246 406
Erman Komurcu 0:aa73b3c9d246 407 return write_register(dev_ba, &ptr_regs[off], len);
Erman Komurcu 0:aa73b3c9d246 408 }
Erman Komurcu 0:aa73b3c9d246 409
Erman Komurcu 0:aa73b3c9d246 410 int Max31343::get_alarm_regs(alarm_no_t alarm_no, alarm_regs_t *regs)
Erman Komurcu 0:aa73b3c9d246 411 {
Erman Komurcu 0:aa73b3c9d246 412 uint8_t *ptr_regs = (uint8_t *)regs;
Erman Komurcu 0:aa73b3c9d246 413 uint8_t off = 0;
Erman Komurcu 0:aa73b3c9d246 414 uint8_t dev_ba;
Erman Komurcu 0:aa73b3c9d246 415 uint8_t len = sizeof(alarm_regs_t);
Erman Komurcu 0:aa73b3c9d246 416
Erman Komurcu 0:aa73b3c9d246 417 if (alarm_no == ALARM1) {
Erman Komurcu 0:aa73b3c9d246 418 dev_ba = MAX31343_REG_ALM1_SEC_ADDR;
Erman Komurcu 0:aa73b3c9d246 419 } else {
Erman Komurcu 0:aa73b3c9d246 420 regs->sec.raw = 0; /* zeroise second register for alarm2 */
Erman Komurcu 0:aa73b3c9d246 421 dev_ba = MAX31343_REG_ALM2_MIN_ADDR;
Erman Komurcu 0:aa73b3c9d246 422 off = 1; /* starts from min register (no sec register) */
Erman Komurcu 0:aa73b3c9d246 423 len -= 2; /* XXX discard mon & sec registers */
Erman Komurcu 0:aa73b3c9d246 424 }
Erman Komurcu 0:aa73b3c9d246 425
Erman Komurcu 0:aa73b3c9d246 426 return read_register(dev_ba, &ptr_regs[off], len);
Erman Komurcu 0:aa73b3c9d246 427 }
Erman Komurcu 0:aa73b3c9d246 428
Erman Komurcu 0:aa73b3c9d246 429 int Max31343::set_alarm(alarm_no_t alarm_no, const struct tm *alarm_time, alarm_period_t period)
Erman Komurcu 0:aa73b3c9d246 430 {
Erman Komurcu 0:aa73b3c9d246 431 int ret;
Erman Komurcu 0:aa73b3c9d246 432 alarm_regs_t regs;
Erman Komurcu 0:aa73b3c9d246 433
Erman Komurcu 0:aa73b3c9d246 434 ret = set_alarm_period(alarm_no, regs, period);
Erman Komurcu 0:aa73b3c9d246 435 if (ret) {
Erman Komurcu 0:aa73b3c9d246 436 return ret;
Erman Komurcu 0:aa73b3c9d246 437 }
Erman Komurcu 0:aa73b3c9d246 438
Erman Komurcu 0:aa73b3c9d246 439 /* Convert time structure to alarm registers */
Erman Komurcu 0:aa73b3c9d246 440 ret = time_to_alarm_regs(regs, alarm_time);
Erman Komurcu 0:aa73b3c9d246 441 if (ret) {
Erman Komurcu 0:aa73b3c9d246 442 return ret;
Erman Komurcu 0:aa73b3c9d246 443 }
Erman Komurcu 0:aa73b3c9d246 444
Erman Komurcu 0:aa73b3c9d246 445 ret = set_alarm_regs(alarm_no, &regs);
Erman Komurcu 0:aa73b3c9d246 446 if (ret) {
Erman Komurcu 0:aa73b3c9d246 447 return ret;
Erman Komurcu 0:aa73b3c9d246 448 }
Erman Komurcu 0:aa73b3c9d246 449
Erman Komurcu 0:aa73b3c9d246 450 return 0;
Erman Komurcu 0:aa73b3c9d246 451 }
Erman Komurcu 0:aa73b3c9d246 452
Erman Komurcu 0:aa73b3c9d246 453 int Max31343::get_alarm(alarm_no_t alarm_no, struct tm *alarm_time,
Erman Komurcu 0:aa73b3c9d246 454 alarm_period_t *period, bool *is_enabled)
Erman Komurcu 0:aa73b3c9d246 455 {
Erman Komurcu 0:aa73b3c9d246 456 int ret;
Erman Komurcu 0:aa73b3c9d246 457 alarm_regs_t regs;
Erman Komurcu 0:aa73b3c9d246 458 uint8_t reg;
Erman Komurcu 0:aa73b3c9d246 459
Erman Komurcu 0:aa73b3c9d246 460 ret = get_alarm_regs(alarm_no, &regs);
Erman Komurcu 0:aa73b3c9d246 461 if (ret) {
Erman Komurcu 0:aa73b3c9d246 462 return ret;
Erman Komurcu 0:aa73b3c9d246 463 }
Erman Komurcu 0:aa73b3c9d246 464
Erman Komurcu 0:aa73b3c9d246 465 /* Convert alarm registers to time structure */
Erman Komurcu 0:aa73b3c9d246 466 ret = alarm_regs_to_time(alarm_time, &regs);
Erman Komurcu 0:aa73b3c9d246 467 if (ret) {
Erman Komurcu 0:aa73b3c9d246 468 return ret;
Erman Komurcu 0:aa73b3c9d246 469 }
Erman Komurcu 0:aa73b3c9d246 470
Erman Komurcu 0:aa73b3c9d246 471 if(alarm_no == ALARM1) {
Erman Komurcu 0:aa73b3c9d246 472 int alarm = regs.sec.bits.a1m1 | (regs.min.bits.a1m2<<1)
Erman Komurcu 0:aa73b3c9d246 473 | (regs.hrs.bits.a1m3<<2) | (regs.day_date.bits.a1m4<<3)
Erman Komurcu 0:aa73b3c9d246 474 | (regs.mon.bits.a1m5<<4) | (regs.mon.bits.a1m6<<5)
Erman Komurcu 0:aa73b3c9d246 475 | (regs.day_date.bits.dy_dt<<6);
Erman Komurcu 0:aa73b3c9d246 476
Erman Komurcu 0:aa73b3c9d246 477 switch(alarm) {
Erman Komurcu 0:aa73b3c9d246 478 case 0b1111111:
Erman Komurcu 0:aa73b3c9d246 479 case 0b0111111:
Erman Komurcu 0:aa73b3c9d246 480 *period = ALARM_PERIOD_EVERYSECOND;
Erman Komurcu 0:aa73b3c9d246 481 break;
Erman Komurcu 0:aa73b3c9d246 482 case 0b1111110:
Erman Komurcu 0:aa73b3c9d246 483 case 0b0111110:
Erman Komurcu 0:aa73b3c9d246 484 *period = ALARM_PERIOD_EVERYMINUTE;
Erman Komurcu 0:aa73b3c9d246 485 break;
Erman Komurcu 0:aa73b3c9d246 486 case 0b1111100:
Erman Komurcu 0:aa73b3c9d246 487 case 0b0111100:
Erman Komurcu 0:aa73b3c9d246 488 *period = ALARM_PERIOD_HOURLY;
Erman Komurcu 0:aa73b3c9d246 489 break;
Erman Komurcu 0:aa73b3c9d246 490 case 0b0111000:
Erman Komurcu 0:aa73b3c9d246 491 case 0b1111000:
Erman Komurcu 0:aa73b3c9d246 492 *period = ALARM_PERIOD_DAILY;
Erman Komurcu 0:aa73b3c9d246 493 break;
Erman Komurcu 0:aa73b3c9d246 494 case 0b0110000:
Erman Komurcu 0:aa73b3c9d246 495 *period = ALARM_PERIOD_MONTHLY;
Erman Komurcu 0:aa73b3c9d246 496 break;
Erman Komurcu 0:aa73b3c9d246 497 case 0b0100000:
Erman Komurcu 0:aa73b3c9d246 498 *period = ALARM_PERIOD_YEARLY;
Erman Komurcu 0:aa73b3c9d246 499 break;
Erman Komurcu 0:aa73b3c9d246 500 case 0b0000000:
Erman Komurcu 0:aa73b3c9d246 501 *period = ALARM_PERIOD_ONETIME;
Erman Komurcu 0:aa73b3c9d246 502 break;
Erman Komurcu 0:aa73b3c9d246 503 case 0b1110000:
Erman Komurcu 0:aa73b3c9d246 504 *period = ALARM_PERIOD_WEEKLY;
Erman Komurcu 0:aa73b3c9d246 505 }
Erman Komurcu 0:aa73b3c9d246 506 } else {
Erman Komurcu 0:aa73b3c9d246 507 int alarm = (regs.min.bits.a1m2) | (regs.hrs.bits.a1m3<<1)
Erman Komurcu 0:aa73b3c9d246 508 | (regs.day_date.bits.a1m4<<2)
Erman Komurcu 0:aa73b3c9d246 509 | (regs.day_date.bits.dy_dt<<3);
Erman Komurcu 0:aa73b3c9d246 510
Erman Komurcu 0:aa73b3c9d246 511 switch(alarm) {
Erman Komurcu 0:aa73b3c9d246 512 case 0b1111:
Erman Komurcu 0:aa73b3c9d246 513 case 0b0111:
Erman Komurcu 0:aa73b3c9d246 514 *period = ALARM_PERIOD_EVERYMINUTE;
Erman Komurcu 0:aa73b3c9d246 515 break;
Erman Komurcu 0:aa73b3c9d246 516 case 0b1110:
Erman Komurcu 0:aa73b3c9d246 517 case 0b0110:
Erman Komurcu 0:aa73b3c9d246 518 *period = ALARM_PERIOD_HOURLY;
Erman Komurcu 0:aa73b3c9d246 519 break;
Erman Komurcu 0:aa73b3c9d246 520 case 0b1100:
Erman Komurcu 0:aa73b3c9d246 521 case 0b0100:
Erman Komurcu 0:aa73b3c9d246 522 *period = ALARM_PERIOD_DAILY;
Erman Komurcu 0:aa73b3c9d246 523 break;
Erman Komurcu 0:aa73b3c9d246 524 case 0b0000:
Erman Komurcu 0:aa73b3c9d246 525 *period = ALARM_PERIOD_MONTHLY;
Erman Komurcu 0:aa73b3c9d246 526 break;
Erman Komurcu 0:aa73b3c9d246 527 case 0b1000:
Erman Komurcu 0:aa73b3c9d246 528 *period = ALARM_PERIOD_WEEKLY;
Erman Komurcu 0:aa73b3c9d246 529 }
Erman Komurcu 0:aa73b3c9d246 530 }
Erman Komurcu 0:aa73b3c9d246 531
Erman Komurcu 0:aa73b3c9d246 532 ret = read_register(MAX31343_REG_INT_EN_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 533 if (ret) {
Erman Komurcu 0:aa73b3c9d246 534 return ret;
Erman Komurcu 0:aa73b3c9d246 535 }
Erman Komurcu 0:aa73b3c9d246 536
Erman Komurcu 0:aa73b3c9d246 537 if (alarm_no == ALARM1) {
Erman Komurcu 0:aa73b3c9d246 538 *is_enabled = (reg & (1 << INTR_ID_ALARM1)) != 0;
Erman Komurcu 0:aa73b3c9d246 539 } else {
Erman Komurcu 0:aa73b3c9d246 540 *is_enabled = (reg & (1 << INTR_ID_ALARM2)) != 0;
Erman Komurcu 0:aa73b3c9d246 541 }
Erman Komurcu 0:aa73b3c9d246 542
Erman Komurcu 0:aa73b3c9d246 543 return 0;
Erman Komurcu 0:aa73b3c9d246 544 }
Erman Komurcu 0:aa73b3c9d246 545
Erman Komurcu 0:aa73b3c9d246 546 int Max31343::powerfail_threshold_level(comp_thresh_t th)
Erman Komurcu 0:aa73b3c9d246 547 {
Erman Komurcu 0:aa73b3c9d246 548 int ret;
Erman Komurcu 0:aa73b3c9d246 549 pwr_mgmt_reg_t reg;
Erman Komurcu 0:aa73b3c9d246 550
Erman Komurcu 0:aa73b3c9d246 551 ret = read_register(MAX31343_REG_PWR_MGMT_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 552 if (ret) {
Erman Komurcu 0:aa73b3c9d246 553 return ret;
Erman Komurcu 0:aa73b3c9d246 554 }
Erman Komurcu 0:aa73b3c9d246 555
Erman Komurcu 0:aa73b3c9d246 556 reg.bits.pfvt = th;
Erman Komurcu 0:aa73b3c9d246 557
Erman Komurcu 0:aa73b3c9d246 558 ret = write_register(MAX31343_REG_PWR_MGMT_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 559 if (ret) {
Erman Komurcu 0:aa73b3c9d246 560 return ret;
Erman Komurcu 0:aa73b3c9d246 561 }
Erman Komurcu 0:aa73b3c9d246 562
Erman Komurcu 0:aa73b3c9d246 563 return 0;
Erman Komurcu 0:aa73b3c9d246 564 }
Erman Komurcu 0:aa73b3c9d246 565
Erman Komurcu 0:aa73b3c9d246 566 int Max31343::supply_select(power_mgmt_supply_t supply)
Erman Komurcu 0:aa73b3c9d246 567 {
Erman Komurcu 0:aa73b3c9d246 568 int ret;
Erman Komurcu 0:aa73b3c9d246 569 pwr_mgmt_reg_t reg;
Erman Komurcu 0:aa73b3c9d246 570
Erman Komurcu 0:aa73b3c9d246 571 ret = read_register(MAX31343_REG_PWR_MGMT_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 572 if (ret) {
Erman Komurcu 0:aa73b3c9d246 573 return ret;
Erman Komurcu 0:aa73b3c9d246 574 }
Erman Komurcu 0:aa73b3c9d246 575
Erman Komurcu 0:aa73b3c9d246 576 switch (supply) {
Erman Komurcu 0:aa73b3c9d246 577 case POW_MGMT_SUPPLY_SEL_VCC:
Erman Komurcu 0:aa73b3c9d246 578 reg.bits.d_man_sel = 1;
Erman Komurcu 0:aa73b3c9d246 579 reg.bits.d_vback_sel = 0;
Erman Komurcu 0:aa73b3c9d246 580 break;
Erman Komurcu 0:aa73b3c9d246 581 case POW_MGMT_SUPPLY_SEL_VBACK:
Erman Komurcu 0:aa73b3c9d246 582 reg.bits.d_man_sel = 1;
Erman Komurcu 0:aa73b3c9d246 583 reg.bits.d_vback_sel = 1;
Erman Komurcu 0:aa73b3c9d246 584 break;
Erman Komurcu 0:aa73b3c9d246 585 case POW_MGMT_SUPPLY_SEL_AUTO:
Erman Komurcu 0:aa73b3c9d246 586 default:
Erman Komurcu 0:aa73b3c9d246 587 reg.bits.d_man_sel = 0;
Erman Komurcu 0:aa73b3c9d246 588 break;
Erman Komurcu 0:aa73b3c9d246 589 }
Erman Komurcu 0:aa73b3c9d246 590
Erman Komurcu 0:aa73b3c9d246 591 ret = write_register(MAX31343_REG_PWR_MGMT_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 592 if (ret) {
Erman Komurcu 0:aa73b3c9d246 593 return ret;
Erman Komurcu 0:aa73b3c9d246 594 }
Erman Komurcu 0:aa73b3c9d246 595
Erman Komurcu 0:aa73b3c9d246 596 return 0;
Erman Komurcu 0:aa73b3c9d246 597 }
Erman Komurcu 0:aa73b3c9d246 598
Erman Komurcu 0:aa73b3c9d246 599 int Max31343::trickle_charger_enable(trickle_charger_path_t path)
Erman Komurcu 0:aa73b3c9d246 600 {
Erman Komurcu 0:aa73b3c9d246 601 int ret;
Erman Komurcu 0:aa73b3c9d246 602 struct {
Erman Komurcu 0:aa73b3c9d246 603 unsigned char path : 4;
Erman Komurcu 0:aa73b3c9d246 604 unsigned char tche : 4;
Erman Komurcu 0:aa73b3c9d246 605 } reg;
Erman Komurcu 0:aa73b3c9d246 606
Erman Komurcu 0:aa73b3c9d246 607 ret = read_register(MAX31343_REG_TRICKLE_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 608 if (ret) {
Erman Komurcu 0:aa73b3c9d246 609 return ret;
Erman Komurcu 0:aa73b3c9d246 610 }
Erman Komurcu 0:aa73b3c9d246 611
Erman Komurcu 0:aa73b3c9d246 612 reg.tche = TRICKLE_ENABLE_CODE;
Erman Komurcu 0:aa73b3c9d246 613 reg.path = path;
Erman Komurcu 0:aa73b3c9d246 614
Erman Komurcu 0:aa73b3c9d246 615 ret = write_register(MAX31343_REG_TRICKLE_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 616 if (ret) {
Erman Komurcu 0:aa73b3c9d246 617 return ret;
Erman Komurcu 0:aa73b3c9d246 618 }
Erman Komurcu 0:aa73b3c9d246 619
Erman Komurcu 0:aa73b3c9d246 620 return 0;
Erman Komurcu 0:aa73b3c9d246 621 }
Erman Komurcu 0:aa73b3c9d246 622
Erman Komurcu 0:aa73b3c9d246 623 int Max31343::trickle_charger_disable()
Erman Komurcu 0:aa73b3c9d246 624 {
Erman Komurcu 0:aa73b3c9d246 625 int ret;
Erman Komurcu 0:aa73b3c9d246 626 struct {
Erman Komurcu 0:aa73b3c9d246 627 unsigned char path : 4;
Erman Komurcu 0:aa73b3c9d246 628 unsigned char tche : 4;
Erman Komurcu 0:aa73b3c9d246 629 } reg;
Erman Komurcu 0:aa73b3c9d246 630
Erman Komurcu 0:aa73b3c9d246 631
Erman Komurcu 0:aa73b3c9d246 632 ret = read_register(MAX31343_REG_TRICKLE_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 633 if (ret) {
Erman Komurcu 0:aa73b3c9d246 634 return ret;
Erman Komurcu 0:aa73b3c9d246 635 }
Erman Komurcu 0:aa73b3c9d246 636
Erman Komurcu 0:aa73b3c9d246 637 reg.tche = 0;
Erman Komurcu 0:aa73b3c9d246 638
Erman Komurcu 0:aa73b3c9d246 639 ret = write_register(MAX31343_REG_TRICKLE_REG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 640 if (ret) {
Erman Komurcu 0:aa73b3c9d246 641 return ret;
Erman Komurcu 0:aa73b3c9d246 642 }
Erman Komurcu 0:aa73b3c9d246 643
Erman Komurcu 0:aa73b3c9d246 644 return 0;
Erman Komurcu 0:aa73b3c9d246 645 }
Erman Komurcu 0:aa73b3c9d246 646
Erman Komurcu 0:aa73b3c9d246 647 int Max31343::set_output_square_wave_frequency(square_wave_out_freq_t freq)
Erman Komurcu 0:aa73b3c9d246 648 {
Erman Komurcu 0:aa73b3c9d246 649 int ret;
Erman Komurcu 0:aa73b3c9d246 650 config_reg2_t reg;
Erman Komurcu 0:aa73b3c9d246 651
Erman Komurcu 0:aa73b3c9d246 652 ret = read_register(MAX31343_REG_CONFIG_REG2_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 653 if (ret) {
Erman Komurcu 0:aa73b3c9d246 654 return ret;
Erman Komurcu 0:aa73b3c9d246 655 }
Erman Komurcu 0:aa73b3c9d246 656
Erman Komurcu 0:aa73b3c9d246 657 reg.bits.sqw_hz = freq;
Erman Komurcu 0:aa73b3c9d246 658
Erman Komurcu 0:aa73b3c9d246 659 ret = write_register(MAX31343_REG_CONFIG_REG2_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 660 if (ret) {
Erman Komurcu 0:aa73b3c9d246 661 return ret;
Erman Komurcu 0:aa73b3c9d246 662 }
Erman Komurcu 0:aa73b3c9d246 663
Erman Komurcu 0:aa73b3c9d246 664 return 0;
Erman Komurcu 0:aa73b3c9d246 665 }
Erman Komurcu 0:aa73b3c9d246 666
Erman Komurcu 0:aa73b3c9d246 667 int Max31343::clko_enable(clko_freq_t freq)
Erman Komurcu 0:aa73b3c9d246 668 {
Erman Komurcu 0:aa73b3c9d246 669 int ret;
Erman Komurcu 0:aa73b3c9d246 670 config_reg2_t cfg2;
Erman Komurcu 0:aa73b3c9d246 671
Erman Komurcu 0:aa73b3c9d246 672 ret = read_register(MAX31343_REG_CONFIG_REG2_ADDR, (uint8_t *)&cfg2, 1);
Erman Komurcu 0:aa73b3c9d246 673 if (ret) {
Erman Komurcu 0:aa73b3c9d246 674 return ret;
Erman Komurcu 0:aa73b3c9d246 675 }
Erman Komurcu 0:aa73b3c9d246 676
Erman Komurcu 0:aa73b3c9d246 677 cfg2.bits.enclko = 1;
Erman Komurcu 0:aa73b3c9d246 678 cfg2.bits.clko_hz = freq;
Erman Komurcu 0:aa73b3c9d246 679
Erman Komurcu 0:aa73b3c9d246 680 ret = write_register(MAX31343_REG_CONFIG_REG2_ADDR, (uint8_t *)&cfg2, 1);
Erman Komurcu 0:aa73b3c9d246 681 if (ret) {
Erman Komurcu 0:aa73b3c9d246 682 return ret;
Erman Komurcu 0:aa73b3c9d246 683 }
Erman Komurcu 0:aa73b3c9d246 684
Erman Komurcu 0:aa73b3c9d246 685 return 0;
Erman Komurcu 0:aa73b3c9d246 686 }
Erman Komurcu 0:aa73b3c9d246 687
Erman Komurcu 0:aa73b3c9d246 688 int Max31343::clko_disable()
Erman Komurcu 0:aa73b3c9d246 689 {
Erman Komurcu 0:aa73b3c9d246 690 int ret;
Erman Komurcu 0:aa73b3c9d246 691 config_reg2_t cfg2;
Erman Komurcu 0:aa73b3c9d246 692
Erman Komurcu 0:aa73b3c9d246 693 ret = read_register(MAX31343_REG_CONFIG_REG2_ADDR, (uint8_t *)&cfg2, 1);
Erman Komurcu 0:aa73b3c9d246 694 if (ret) {
Erman Komurcu 0:aa73b3c9d246 695 return ret;
Erman Komurcu 0:aa73b3c9d246 696 }
Erman Komurcu 0:aa73b3c9d246 697
Erman Komurcu 0:aa73b3c9d246 698 cfg2.bits.enclko = 0;
Erman Komurcu 0:aa73b3c9d246 699
Erman Komurcu 0:aa73b3c9d246 700 ret = write_register(MAX31343_REG_CONFIG_REG2_ADDR, (uint8_t *)&cfg2, 1);
Erman Komurcu 0:aa73b3c9d246 701 if (ret) {
Erman Komurcu 0:aa73b3c9d246 702 return ret;
Erman Komurcu 0:aa73b3c9d246 703 }
Erman Komurcu 0:aa73b3c9d246 704
Erman Komurcu 0:aa73b3c9d246 705 return 0;
Erman Komurcu 0:aa73b3c9d246 706 }
Erman Komurcu 0:aa73b3c9d246 707
Erman Komurcu 0:aa73b3c9d246 708 int Max31343::timer_init(uint8_t value, bool repeat, timer_freq_t freq)
Erman Komurcu 0:aa73b3c9d246 709 {
Erman Komurcu 0:aa73b3c9d246 710 int ret;
Erman Komurcu 0:aa73b3c9d246 711 timer_config_t reg_cfg;
Erman Komurcu 0:aa73b3c9d246 712
Erman Komurcu 0:aa73b3c9d246 713 ret = read_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg_cfg, 1);
Erman Komurcu 0:aa73b3c9d246 714 if (ret) {
Erman Komurcu 0:aa73b3c9d246 715 return ret;
Erman Komurcu 0:aa73b3c9d246 716 }
Erman Komurcu 0:aa73b3c9d246 717
Erman Komurcu 0:aa73b3c9d246 718 reg_cfg.bits.te = 0; /* timer is reset */
Erman Komurcu 0:aa73b3c9d246 719 reg_cfg.bits.tpause = 1; /* timer is paused */
Erman Komurcu 0:aa73b3c9d246 720 reg_cfg.bits.trpt = repeat ? 1 : 0; /* Timer repeat mode */
Erman Komurcu 0:aa73b3c9d246 721 reg_cfg.bits.tfs = freq; /* Timer frequency */
Erman Komurcu 0:aa73b3c9d246 722
Erman Komurcu 0:aa73b3c9d246 723 ret = write_register(MAX31343_REG_TIMER_CONFIG_ADDR,
Erman Komurcu 0:aa73b3c9d246 724 (uint8_t *)&reg_cfg, 1);
Erman Komurcu 0:aa73b3c9d246 725 if (ret) {
Erman Komurcu 0:aa73b3c9d246 726 return ret;
Erman Komurcu 0:aa73b3c9d246 727 }
Erman Komurcu 0:aa73b3c9d246 728
Erman Komurcu 0:aa73b3c9d246 729 ret = write_register(MAX31343_REG_TIMER_INIT_ADDR, (uint8_t *)&value, 1);
Erman Komurcu 0:aa73b3c9d246 730 if (ret) {
Erman Komurcu 0:aa73b3c9d246 731 return ret;
Erman Komurcu 0:aa73b3c9d246 732 }
Erman Komurcu 0:aa73b3c9d246 733
Erman Komurcu 0:aa73b3c9d246 734 return 0;
Erman Komurcu 0:aa73b3c9d246 735 }
Erman Komurcu 0:aa73b3c9d246 736
Erman Komurcu 0:aa73b3c9d246 737 uint8_t Max31343::timer_get()
Erman Komurcu 0:aa73b3c9d246 738 {
Erman Komurcu 0:aa73b3c9d246 739 int ret;
Erman Komurcu 0:aa73b3c9d246 740 uint8_t reg;
Erman Komurcu 0:aa73b3c9d246 741
Erman Komurcu 0:aa73b3c9d246 742 ret = read_register(MAX31343_REG_TIMER_COUNT_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 743 if (ret) {
Erman Komurcu 0:aa73b3c9d246 744 return (uint8_t) - 1;
Erman Komurcu 0:aa73b3c9d246 745 }
Erman Komurcu 0:aa73b3c9d246 746
Erman Komurcu 0:aa73b3c9d246 747 return reg;
Erman Komurcu 0:aa73b3c9d246 748 }
Erman Komurcu 0:aa73b3c9d246 749
Erman Komurcu 0:aa73b3c9d246 750 int Max31343::timer_start()
Erman Komurcu 0:aa73b3c9d246 751 {
Erman Komurcu 0:aa73b3c9d246 752 int ret;
Erman Komurcu 0:aa73b3c9d246 753 timer_config_t reg;
Erman Komurcu 0:aa73b3c9d246 754
Erman Komurcu 0:aa73b3c9d246 755 ret = read_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 756 if (ret) {
Erman Komurcu 0:aa73b3c9d246 757 return ret;
Erman Komurcu 0:aa73b3c9d246 758 }
Erman Komurcu 0:aa73b3c9d246 759
Erman Komurcu 0:aa73b3c9d246 760 reg.bits.te = 1;
Erman Komurcu 0:aa73b3c9d246 761 reg.bits.tpause = 0;
Erman Komurcu 0:aa73b3c9d246 762
Erman Komurcu 0:aa73b3c9d246 763 ret = write_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 764 if (ret) {
Erman Komurcu 0:aa73b3c9d246 765 return ret;
Erman Komurcu 0:aa73b3c9d246 766 }
Erman Komurcu 0:aa73b3c9d246 767
Erman Komurcu 0:aa73b3c9d246 768 return 0;
Erman Komurcu 0:aa73b3c9d246 769 }
Erman Komurcu 0:aa73b3c9d246 770
Erman Komurcu 0:aa73b3c9d246 771 int Max31343::timer_pause()
Erman Komurcu 0:aa73b3c9d246 772 {
Erman Komurcu 0:aa73b3c9d246 773 int ret;
Erman Komurcu 0:aa73b3c9d246 774 timer_config_t reg;
Erman Komurcu 0:aa73b3c9d246 775
Erman Komurcu 0:aa73b3c9d246 776 ret = read_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 777 if (ret) {
Erman Komurcu 0:aa73b3c9d246 778 return ret;
Erman Komurcu 0:aa73b3c9d246 779 }
Erman Komurcu 0:aa73b3c9d246 780
Erman Komurcu 0:aa73b3c9d246 781 reg.bits.te = 1;
Erman Komurcu 0:aa73b3c9d246 782 reg.bits.tpause = 1;
Erman Komurcu 0:aa73b3c9d246 783
Erman Komurcu 0:aa73b3c9d246 784 ret = write_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 785 if (ret) {
Erman Komurcu 0:aa73b3c9d246 786 return ret;
Erman Komurcu 0:aa73b3c9d246 787 }
Erman Komurcu 0:aa73b3c9d246 788
Erman Komurcu 0:aa73b3c9d246 789 return 0;
Erman Komurcu 0:aa73b3c9d246 790 }
Erman Komurcu 0:aa73b3c9d246 791
Erman Komurcu 0:aa73b3c9d246 792 int Max31343::timer_continue()
Erman Komurcu 0:aa73b3c9d246 793 {
Erman Komurcu 0:aa73b3c9d246 794 int ret;
Erman Komurcu 0:aa73b3c9d246 795 timer_config_t reg;
Erman Komurcu 0:aa73b3c9d246 796
Erman Komurcu 0:aa73b3c9d246 797 ret = read_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 798 if (ret) {
Erman Komurcu 0:aa73b3c9d246 799 return ret;
Erman Komurcu 0:aa73b3c9d246 800 }
Erman Komurcu 0:aa73b3c9d246 801
Erman Komurcu 0:aa73b3c9d246 802 reg.bits.te = 1;
Erman Komurcu 0:aa73b3c9d246 803 reg.bits.tpause = 0;
Erman Komurcu 0:aa73b3c9d246 804
Erman Komurcu 0:aa73b3c9d246 805 ret = write_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 806 if (ret) {
Erman Komurcu 0:aa73b3c9d246 807 return ret;
Erman Komurcu 0:aa73b3c9d246 808 }
Erman Komurcu 0:aa73b3c9d246 809
Erman Komurcu 0:aa73b3c9d246 810 return 0;
Erman Komurcu 0:aa73b3c9d246 811 }
Erman Komurcu 0:aa73b3c9d246 812
Erman Komurcu 0:aa73b3c9d246 813 int Max31343::timer_stop()
Erman Komurcu 0:aa73b3c9d246 814 {
Erman Komurcu 0:aa73b3c9d246 815 int ret;
Erman Komurcu 0:aa73b3c9d246 816 timer_config_t reg;
Erman Komurcu 0:aa73b3c9d246 817
Erman Komurcu 0:aa73b3c9d246 818 ret = read_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 819 if (ret) {
Erman Komurcu 0:aa73b3c9d246 820 return ret;
Erman Komurcu 0:aa73b3c9d246 821 }
Erman Komurcu 0:aa73b3c9d246 822
Erman Komurcu 0:aa73b3c9d246 823 reg.bits.te = 0;
Erman Komurcu 0:aa73b3c9d246 824 reg.bits.tpause = 1;
Erman Komurcu 0:aa73b3c9d246 825
Erman Komurcu 0:aa73b3c9d246 826 ret = write_register(MAX31343_REG_TIMER_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 827 if (ret) {
Erman Komurcu 0:aa73b3c9d246 828 return ret;
Erman Komurcu 0:aa73b3c9d246 829 }
Erman Komurcu 0:aa73b3c9d246 830
Erman Komurcu 0:aa73b3c9d246 831 return 0;
Erman Komurcu 0:aa73b3c9d246 832 }
Erman Komurcu 0:aa73b3c9d246 833
Erman Komurcu 0:aa73b3c9d246 834 int Max31343::data_retention_mode_config(int state)
Erman Komurcu 0:aa73b3c9d246 835 {
Erman Komurcu 0:aa73b3c9d246 836 int ret;
Erman Komurcu 0:aa73b3c9d246 837 config_reg1_t cfg1;
Erman Komurcu 0:aa73b3c9d246 838
Erman Komurcu 0:aa73b3c9d246 839 ret = read_register(MAX31343_REG_CONFIG_REG1_ADDR, (uint8_t *)&cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 840 if (ret) {
Erman Komurcu 0:aa73b3c9d246 841 return ret;
Erman Komurcu 0:aa73b3c9d246 842 }
Erman Komurcu 0:aa73b3c9d246 843
Erman Komurcu 0:aa73b3c9d246 844 if (state) {
Erman Komurcu 0:aa73b3c9d246 845 cfg1.bits.enosc = 0;
Erman Komurcu 0:aa73b3c9d246 846 cfg1.bits.data_reten = 1;
Erman Komurcu 0:aa73b3c9d246 847 } else {
Erman Komurcu 0:aa73b3c9d246 848 cfg1.bits.enosc = 1;
Erman Komurcu 0:aa73b3c9d246 849 cfg1.bits.data_reten = 0;
Erman Komurcu 0:aa73b3c9d246 850 }
Erman Komurcu 0:aa73b3c9d246 851
Erman Komurcu 0:aa73b3c9d246 852 ret = write_register(MAX31343_REG_CONFIG_REG1_ADDR, (uint8_t *)&cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 853 if (ret) {
Erman Komurcu 0:aa73b3c9d246 854 return ret;
Erman Komurcu 0:aa73b3c9d246 855 }
Erman Komurcu 0:aa73b3c9d246 856
Erman Komurcu 0:aa73b3c9d246 857 return 0;
Erman Komurcu 0:aa73b3c9d246 858 }
Erman Komurcu 0:aa73b3c9d246 859
Erman Komurcu 0:aa73b3c9d246 860 int Max31343::data_retention_mode_enter()
Erman Komurcu 0:aa73b3c9d246 861 {
Erman Komurcu 0:aa73b3c9d246 862 return data_retention_mode_config(1);
Erman Komurcu 0:aa73b3c9d246 863 }
Erman Komurcu 0:aa73b3c9d246 864
Erman Komurcu 0:aa73b3c9d246 865 int Max31343::data_retention_mode_exit()
Erman Komurcu 0:aa73b3c9d246 866 {
Erman Komurcu 0:aa73b3c9d246 867 return data_retention_mode_config(0);
Erman Komurcu 0:aa73b3c9d246 868 }
Erman Komurcu 0:aa73b3c9d246 869
Erman Komurcu 0:aa73b3c9d246 870 int Max31343::i2c_timeout_config(int enable)
Erman Komurcu 0:aa73b3c9d246 871 {
Erman Komurcu 0:aa73b3c9d246 872 int ret;
Erman Komurcu 0:aa73b3c9d246 873 config_reg1_t cfg1;
Erman Komurcu 0:aa73b3c9d246 874
Erman Komurcu 0:aa73b3c9d246 875 ret = read_register(MAX31343_REG_CONFIG_REG1_ADDR, (uint8_t *)&cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 876 if (ret) {
Erman Komurcu 0:aa73b3c9d246 877 return ret;
Erman Komurcu 0:aa73b3c9d246 878 }
Erman Komurcu 0:aa73b3c9d246 879
Erman Komurcu 0:aa73b3c9d246 880 cfg1.bits.i2c_timeout = (enable) ? 1 : 0;
Erman Komurcu 0:aa73b3c9d246 881
Erman Komurcu 0:aa73b3c9d246 882 ret = write_register(MAX31343_REG_CONFIG_REG1_ADDR, (uint8_t *)&cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 883 if (ret) {
Erman Komurcu 0:aa73b3c9d246 884 return ret;
Erman Komurcu 0:aa73b3c9d246 885 }
Erman Komurcu 0:aa73b3c9d246 886
Erman Komurcu 0:aa73b3c9d246 887 return 0;
Erman Komurcu 0:aa73b3c9d246 888 }
Erman Komurcu 0:aa73b3c9d246 889
Erman Komurcu 0:aa73b3c9d246 890 int Max31343::i2c_timeout_enable()
Erman Komurcu 0:aa73b3c9d246 891 {
Erman Komurcu 0:aa73b3c9d246 892 return i2c_timeout_config(1);
Erman Komurcu 0:aa73b3c9d246 893 }
Erman Komurcu 0:aa73b3c9d246 894
Erman Komurcu 0:aa73b3c9d246 895 int Max31343::i2c_timeout_disable()
Erman Komurcu 0:aa73b3c9d246 896 {
Erman Komurcu 0:aa73b3c9d246 897 return i2c_timeout_config(0);
Erman Komurcu 0:aa73b3c9d246 898 }
Erman Komurcu 0:aa73b3c9d246 899
Erman Komurcu 0:aa73b3c9d246 900 int Max31343::read_temp(float *temp)
Erman Komurcu 0:aa73b3c9d246 901 {
Erman Komurcu 0:aa73b3c9d246 902 int ret;
Erman Komurcu 0:aa73b3c9d246 903 uint8_t regs[2];
Erman Komurcu 0:aa73b3c9d246 904 ts_config_t cfg_reg;
Erman Komurcu 0:aa73b3c9d246 905 int itemp;
Erman Komurcu 0:aa73b3c9d246 906
Erman Komurcu 0:aa73b3c9d246 907 ret = read_register(MAX31343_REG_TS_CONFIG_ADDR, (uint8_t *)&cfg_reg, 1);
Erman Komurcu 0:aa73b3c9d246 908 if (ret) {
Erman Komurcu 0:aa73b3c9d246 909 return ret;
Erman Komurcu 0:aa73b3c9d246 910 }
Erman Komurcu 0:aa73b3c9d246 911
Erman Komurcu 0:aa73b3c9d246 912 if (cfg_reg.bits.automode) { /* manual mode */
Erman Komurcu 0:aa73b3c9d246 913 /* trigger temperature reading */
Erman Komurcu 0:aa73b3c9d246 914 cfg_reg.bits.oneshotmode = 1;
Erman Komurcu 0:aa73b3c9d246 915
Erman Komurcu 0:aa73b3c9d246 916 ret = write_register(MAX31343_REG_TS_CONFIG_ADDR, (uint8_t *)&cfg_reg, 1);
Erman Komurcu 0:aa73b3c9d246 917 if (ret) {
Erman Komurcu 0:aa73b3c9d246 918 return ret;
Erman Komurcu 0:aa73b3c9d246 919 }
Erman Komurcu 0:aa73b3c9d246 920
Erman Komurcu 0:aa73b3c9d246 921 while (cfg_reg.bits.oneshotmode) {
Erman Komurcu 0:aa73b3c9d246 922 ret = read_register(MAX31343_REG_TS_CONFIG_ADDR, (uint8_t *)&cfg_reg, 1);
Erman Komurcu 0:aa73b3c9d246 923 if (ret) {
Erman Komurcu 0:aa73b3c9d246 924 return ret;
Erman Komurcu 0:aa73b3c9d246 925 }
Erman Komurcu 0:aa73b3c9d246 926 }
Erman Komurcu 0:aa73b3c9d246 927 }
Erman Komurcu 0:aa73b3c9d246 928
Erman Komurcu 0:aa73b3c9d246 929 ret = read_register(MAX31343_REG_TEMP_MSB_ADDR, regs, 2);
Erman Komurcu 0:aa73b3c9d246 930 if (ret) {
Erman Komurcu 0:aa73b3c9d246 931 return ret;
Erman Komurcu 0:aa73b3c9d246 932 }
Erman Komurcu 0:aa73b3c9d246 933
Erman Komurcu 0:aa73b3c9d246 934 itemp = ((regs[0] << 2) | (regs[1] >> 6));
Erman Komurcu 0:aa73b3c9d246 935 if (regs[0] & 0x80) { /* if negative */
Erman Komurcu 0:aa73b3c9d246 936 itemp |= -(1 << 10); /* sign extend */
Erman Komurcu 0:aa73b3c9d246 937 }
Erman Komurcu 0:aa73b3c9d246 938
Erman Komurcu 0:aa73b3c9d246 939 *temp = (float)itemp / 4; /* LSB resolution: 0.25 C */
Erman Komurcu 0:aa73b3c9d246 940
Erman Komurcu 0:aa73b3c9d246 941 return 0;
Erman Komurcu 0:aa73b3c9d246 942 }
Erman Komurcu 0:aa73b3c9d246 943
Erman Komurcu 0:aa73b3c9d246 944 int Max31343::temp_sensor_config(bool automode, ttsint_t interval)
Erman Komurcu 0:aa73b3c9d246 945 {
Erman Komurcu 0:aa73b3c9d246 946 int ret;
Erman Komurcu 0:aa73b3c9d246 947 ts_config_t reg;
Erman Komurcu 0:aa73b3c9d246 948
Erman Komurcu 0:aa73b3c9d246 949 ret = read_register(MAX31343_REG_TS_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 950 if (ret) {
Erman Komurcu 0:aa73b3c9d246 951 return ret;
Erman Komurcu 0:aa73b3c9d246 952 }
Erman Komurcu 0:aa73b3c9d246 953
Erman Komurcu 0:aa73b3c9d246 954 if (automode) {
Erman Komurcu 0:aa73b3c9d246 955 reg.bits.automode = 1;
Erman Komurcu 0:aa73b3c9d246 956 reg.bits.ttint = interval;
Erman Komurcu 0:aa73b3c9d246 957 } else {
Erman Komurcu 0:aa73b3c9d246 958 reg.bits.automode = 0;
Erman Komurcu 0:aa73b3c9d246 959 }
Erman Komurcu 0:aa73b3c9d246 960
Erman Komurcu 0:aa73b3c9d246 961 ret = write_register(MAX31343_REG_TS_CONFIG_ADDR, (uint8_t *)&reg, 1);
Erman Komurcu 0:aa73b3c9d246 962 if (ret) {
Erman Komurcu 0:aa73b3c9d246 963 return ret;
Erman Komurcu 0:aa73b3c9d246 964 }
Erman Komurcu 0:aa73b3c9d246 965
Erman Komurcu 0:aa73b3c9d246 966 return 0;
Erman Komurcu 0:aa73b3c9d246 967 }
Erman Komurcu 0:aa73b3c9d246 968
Erman Komurcu 0:aa73b3c9d246 969 int Max31343::irq_enable(intr_id_t id)
Erman Komurcu 0:aa73b3c9d246 970 {
Erman Komurcu 0:aa73b3c9d246 971 int ret;
Erman Komurcu 0:aa73b3c9d246 972 uint8_t reg;
Erman Komurcu 0:aa73b3c9d246 973
Erman Komurcu 0:aa73b3c9d246 974 ret = read_register(MAX31343_REG_INT_EN_REG_ADDR, &reg, 1);
Erman Komurcu 0:aa73b3c9d246 975 if (ret) {
Erman Komurcu 0:aa73b3c9d246 976 return ret;
Erman Komurcu 0:aa73b3c9d246 977 }
Erman Komurcu 0:aa73b3c9d246 978
Erman Komurcu 0:aa73b3c9d246 979 reg |= (1 << id);
Erman Komurcu 0:aa73b3c9d246 980
Erman Komurcu 0:aa73b3c9d246 981 ret = write_register(MAX31343_REG_INT_EN_REG_ADDR, &reg, 1);
Erman Komurcu 0:aa73b3c9d246 982 if (ret) {
Erman Komurcu 0:aa73b3c9d246 983 return ret;
Erman Komurcu 0:aa73b3c9d246 984 }
Erman Komurcu 0:aa73b3c9d246 985
Erman Komurcu 0:aa73b3c9d246 986 return 0;
Erman Komurcu 0:aa73b3c9d246 987 }
Erman Komurcu 0:aa73b3c9d246 988
Erman Komurcu 0:aa73b3c9d246 989 int Max31343::irq_disable(intr_id_t id)
Erman Komurcu 0:aa73b3c9d246 990 {
Erman Komurcu 0:aa73b3c9d246 991 int ret;
Erman Komurcu 0:aa73b3c9d246 992 uint8_t reg;
Erman Komurcu 0:aa73b3c9d246 993
Erman Komurcu 0:aa73b3c9d246 994 ret = read_register(MAX31343_REG_INT_EN_REG_ADDR, &reg, 1);
Erman Komurcu 0:aa73b3c9d246 995 if (ret) {
Erman Komurcu 0:aa73b3c9d246 996 return ret;
Erman Komurcu 0:aa73b3c9d246 997 }
Erman Komurcu 0:aa73b3c9d246 998
Erman Komurcu 0:aa73b3c9d246 999 reg &= ~(1 << id);
Erman Komurcu 0:aa73b3c9d246 1000
Erman Komurcu 0:aa73b3c9d246 1001 ret = write_register(MAX31343_REG_INT_EN_REG_ADDR, &reg, 1);
Erman Komurcu 0:aa73b3c9d246 1002 if (ret) {
Erman Komurcu 0:aa73b3c9d246 1003 return ret;
Erman Komurcu 0:aa73b3c9d246 1004 }
Erman Komurcu 0:aa73b3c9d246 1005
Erman Komurcu 0:aa73b3c9d246 1006 return 0;
Erman Komurcu 0:aa73b3c9d246 1007 }
Erman Komurcu 0:aa73b3c9d246 1008
Erman Komurcu 0:aa73b3c9d246 1009 int Max31343::irq_disable_all()
Erman Komurcu 0:aa73b3c9d246 1010 {
Erman Komurcu 0:aa73b3c9d246 1011 int ret;
Erman Komurcu 0:aa73b3c9d246 1012 uint8_t reg = 0;
Erman Komurcu 0:aa73b3c9d246 1013
Erman Komurcu 0:aa73b3c9d246 1014 ret = write_register(MAX31343_REG_INT_EN_REG_ADDR, &reg, 1);
Erman Komurcu 0:aa73b3c9d246 1015 if (ret) {
Erman Komurcu 0:aa73b3c9d246 1016 return ret;
Erman Komurcu 0:aa73b3c9d246 1017 }
Erman Komurcu 0:aa73b3c9d246 1018
Erman Komurcu 0:aa73b3c9d246 1019 return 0;
Erman Komurcu 0:aa73b3c9d246 1020 }
Erman Komurcu 0:aa73b3c9d246 1021
Erman Komurcu 0:aa73b3c9d246 1022 void Max31343::set_intr_handler(intr_id_t id, interrupt_handler_function func, void *cb)
Erman Komurcu 0:aa73b3c9d246 1023 {
Erman Komurcu 0:aa73b3c9d246 1024 interrupt_handler_list[id].func = func;
Erman Komurcu 0:aa73b3c9d246 1025 interrupt_handler_list[id].cb = cb;
Erman Komurcu 0:aa73b3c9d246 1026 }
Erman Komurcu 0:aa73b3c9d246 1027
Erman Komurcu 0:aa73b3c9d246 1028 void Max31343::post_interrupt_work()
Erman Komurcu 0:aa73b3c9d246 1029 {
Erman Komurcu 0:aa73b3c9d246 1030 int ret;
Erman Komurcu 0:aa73b3c9d246 1031 uint8_t reg, inten, mask;
Erman Komurcu 0:aa73b3c9d246 1032
Erman Komurcu 0:aa73b3c9d246 1033
Erman Komurcu 0:aa73b3c9d246 1034 while (true) {
Erman Komurcu 0:aa73b3c9d246 1035 Thread::signal_wait(POST_INTR_WORK_SIGNAL_ID);
Erman Komurcu 0:aa73b3c9d246 1036
Erman Komurcu 0:aa73b3c9d246 1037 ret = read_register(MAX31343_REG_INT_STATUS_REG_ADDR, &reg, 1);
Erman Komurcu 0:aa73b3c9d246 1038 if (ret) {
Erman Komurcu 0:aa73b3c9d246 1039 pr_err("Read interrupt status register failed!");
Erman Komurcu 0:aa73b3c9d246 1040 }
Erman Komurcu 0:aa73b3c9d246 1041
Erman Komurcu 0:aa73b3c9d246 1042 ret = read_register(MAX31343_REG_INT_EN_REG_ADDR, &inten, 1);
Erman Komurcu 0:aa73b3c9d246 1043 if (ret) {
Erman Komurcu 0:aa73b3c9d246 1044 pr_err("Read interrupt enable register failed!");
Erman Komurcu 0:aa73b3c9d246 1045 }
Erman Komurcu 0:aa73b3c9d246 1046
Erman Komurcu 0:aa73b3c9d246 1047 for (int i = 0; i < INTR_ID_END; i++) {
Erman Komurcu 0:aa73b3c9d246 1048 mask = (1 << i);
Erman Komurcu 0:aa73b3c9d246 1049 if ((reg & mask) && (inten & mask)) {
Erman Komurcu 0:aa73b3c9d246 1050 if (interrupt_handler_list[i].func != NULL) {
Erman Komurcu 0:aa73b3c9d246 1051 interrupt_handler_list[i]
Erman Komurcu 0:aa73b3c9d246 1052 .func(interrupt_handler_list[i].cb);
Erman Komurcu 0:aa73b3c9d246 1053 }
Erman Komurcu 0:aa73b3c9d246 1054 }
Erman Komurcu 0:aa73b3c9d246 1055 }
Erman Komurcu 0:aa73b3c9d246 1056 }
Erman Komurcu 0:aa73b3c9d246 1057 }
Erman Komurcu 0:aa73b3c9d246 1058
Erman Komurcu 0:aa73b3c9d246 1059 void Max31343::interrupt_handler()
Erman Komurcu 0:aa73b3c9d246 1060 {
Erman Komurcu 0:aa73b3c9d246 1061 post_intr_work_thread->signal_set(POST_INTR_WORK_SIGNAL_ID);
Erman Komurcu 0:aa73b3c9d246 1062 }
Erman Komurcu 0:aa73b3c9d246 1063
Erman Komurcu 0:aa73b3c9d246 1064 int Max31343::sw_reset_assert()
Erman Komurcu 0:aa73b3c9d246 1065 {
Erman Komurcu 0:aa73b3c9d246 1066 int ret;
Erman Komurcu 0:aa73b3c9d246 1067 rtc_reset_reg_t rst_reg;
Erman Komurcu 0:aa73b3c9d246 1068
Erman Komurcu 0:aa73b3c9d246 1069 ret = read_register(MAX31343_REG_RTC_RESET_ADDR, (uint8_t *) &rst_reg, 1);
Erman Komurcu 0:aa73b3c9d246 1070 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1071 pr_err("read_register failed!");
Erman Komurcu 0:aa73b3c9d246 1072 return ret;
Erman Komurcu 0:aa73b3c9d246 1073 }
Erman Komurcu 0:aa73b3c9d246 1074
Erman Komurcu 0:aa73b3c9d246 1075 rst_reg.bits.swrst = 1; /* Put device in reset state */
Erman Komurcu 0:aa73b3c9d246 1076
Erman Komurcu 0:aa73b3c9d246 1077 ret = write_register(MAX31343_REG_RTC_RESET_ADDR, (const uint8_t *) &rst_reg, 1);
Erman Komurcu 0:aa73b3c9d246 1078 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1079 pr_err("read_register failed!");
Erman Komurcu 0:aa73b3c9d246 1080 return ret;
Erman Komurcu 0:aa73b3c9d246 1081 }
Erman Komurcu 0:aa73b3c9d246 1082
Erman Komurcu 0:aa73b3c9d246 1083 return 0;
Erman Komurcu 0:aa73b3c9d246 1084 }
Erman Komurcu 0:aa73b3c9d246 1085
Erman Komurcu 0:aa73b3c9d246 1086 int Max31343::sw_reset_release()
Erman Komurcu 0:aa73b3c9d246 1087 {
Erman Komurcu 0:aa73b3c9d246 1088 int ret;
Erman Komurcu 0:aa73b3c9d246 1089 rtc_reset_reg_t rst_reg;
Erman Komurcu 0:aa73b3c9d246 1090
Erman Komurcu 0:aa73b3c9d246 1091 ret = read_register(MAX31343_REG_RTC_RESET_ADDR, (uint8_t *) &rst_reg, 1);
Erman Komurcu 0:aa73b3c9d246 1092 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1093 pr_err("read_register failed!");
Erman Komurcu 0:aa73b3c9d246 1094 return ret;
Erman Komurcu 0:aa73b3c9d246 1095 }
Erman Komurcu 0:aa73b3c9d246 1096
Erman Komurcu 0:aa73b3c9d246 1097 rst_reg.bits.swrst = 0; /* Remove device from reset state */
Erman Komurcu 0:aa73b3c9d246 1098
Erman Komurcu 0:aa73b3c9d246 1099 ret = write_register(MAX31343_REG_RTC_RESET_ADDR,
Erman Komurcu 0:aa73b3c9d246 1100 (const uint8_t *) &rst_reg, 1);
Erman Komurcu 0:aa73b3c9d246 1101 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1102 pr_err("read_register failed!");
Erman Komurcu 0:aa73b3c9d246 1103 return ret;
Erman Komurcu 0:aa73b3c9d246 1104 }
Erman Komurcu 0:aa73b3c9d246 1105
Erman Komurcu 0:aa73b3c9d246 1106 return 0;
Erman Komurcu 0:aa73b3c9d246 1107 }
Erman Komurcu 0:aa73b3c9d246 1108
Erman Komurcu 0:aa73b3c9d246 1109 int Max31343::rtc_start()
Erman Komurcu 0:aa73b3c9d246 1110 {
Erman Komurcu 0:aa73b3c9d246 1111 int ret;
Erman Komurcu 0:aa73b3c9d246 1112 config_reg1_t cfg1;
Erman Komurcu 0:aa73b3c9d246 1113
Erman Komurcu 0:aa73b3c9d246 1114 ret = read_register(MAX31343_REG_CONFIG_REG1_ADDR, (uint8_t *) &cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 1115 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1116 return ret;
Erman Komurcu 0:aa73b3c9d246 1117 }
Erman Komurcu 0:aa73b3c9d246 1118
Erman Komurcu 0:aa73b3c9d246 1119 cfg1.bits.enosc = 1; /* Enable the oscillator */
Erman Komurcu 0:aa73b3c9d246 1120
Erman Komurcu 0:aa73b3c9d246 1121 ret = write_register(MAX31343_REG_CONFIG_REG1_ADDR, (const uint8_t *) &cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 1122 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1123 return ret;
Erman Komurcu 0:aa73b3c9d246 1124 }
Erman Komurcu 0:aa73b3c9d246 1125
Erman Komurcu 0:aa73b3c9d246 1126 return 0;
Erman Komurcu 0:aa73b3c9d246 1127 }
Erman Komurcu 0:aa73b3c9d246 1128
Erman Komurcu 0:aa73b3c9d246 1129 int Max31343::rtc_stop()
Erman Komurcu 0:aa73b3c9d246 1130 {
Erman Komurcu 0:aa73b3c9d246 1131 int ret;
Erman Komurcu 0:aa73b3c9d246 1132 config_reg1_t cfg1;
Erman Komurcu 0:aa73b3c9d246 1133
Erman Komurcu 0:aa73b3c9d246 1134 ret = read_register(MAX31343_REG_CONFIG_REG1_ADDR, (uint8_t *) &cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 1135 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1136 return ret;
Erman Komurcu 0:aa73b3c9d246 1137 }
Erman Komurcu 0:aa73b3c9d246 1138
Erman Komurcu 0:aa73b3c9d246 1139 cfg1.bits.enosc = 0; /* Disable the oscillator */
Erman Komurcu 0:aa73b3c9d246 1140
Erman Komurcu 0:aa73b3c9d246 1141 ret = write_register(MAX31343_REG_CONFIG_REG1_ADDR,
Erman Komurcu 0:aa73b3c9d246 1142 (const uint8_t *) &cfg1, 1);
Erman Komurcu 0:aa73b3c9d246 1143 if (ret < 0) {
Erman Komurcu 0:aa73b3c9d246 1144 return ret;
Erman Komurcu 0:aa73b3c9d246 1145 }
Erman Komurcu 0:aa73b3c9d246 1146
Erman Komurcu 0:aa73b3c9d246 1147 return 0;
Erman Komurcu 0:aa73b3c9d246 1148 }