summaryrefslogtreecommitdiff
path: root/firmware/drivers/rtc/rtc_mr100.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/rtc/rtc_mr100.c')
-rw-r--r--firmware/drivers/rtc/rtc_mr100.c54
1 files changed, 36 insertions, 18 deletions
diff --git a/firmware/drivers/rtc/rtc_mr100.c b/firmware/drivers/rtc/rtc_mr100.c
index 7ec3996a87..209845cea8 100644
--- a/firmware/drivers/rtc/rtc_mr100.c
+++ b/firmware/drivers/rtc/rtc_mr100.c
@@ -124,31 +124,49 @@ void rtc_init(void)
}
-int rtc_read_datetime(unsigned char* buf)
+int rtc_read_datetime(struct tm *tm)
{
- int i;
- unsigned char v[7];
+ unsigned int i;
+ int rc;
+ unsigned char buf[7];
- i = sw_i2c(SW_I2C_READ, RTC_CMD_DATA, v, 7);
+ rc = sw_i2c(SW_I2C_READ, RTC_CMD_DATA, buf, sizeof(buf));
- v[4] &= 0x3f; /* mask out p.m. flag */
+ buf[4] &= 0x3f; /* mask out p.m. flag */
- for(i=0; i<7; i++)
- buf[i] = v[6-i];
-
- return i;
+ for (i = 0; i < sizeof(buf); i++)
+ buf[i] = BCD2DEC(buf[i]);
+
+ tm->tm_sec = buf[6];
+ tm->tm_min = buf[5];
+ tm->tm_hour = buf[4];
+ tm->tm_wday = buf[3];
+ tm->tm_mday = buf[2];
+ tm->tm_mon = buf[1] - 1;
+ tm->tm_year = buf[0] + 100;
+
+ return rc;
}
-int rtc_write_datetime(unsigned char* buf)
+int rtc_write_datetime(const struct tm *tm)
{
- int i;
- unsigned char v[7];
+ unsigned int i;
+ int rc;
+ unsigned char buf[7];
- for(i=0; i<7; i++)
- v[i]=buf[6-i];
-
- i = sw_i2c(SW_I2C_WRITE, RTC_CMD_DATA, v, 7);
-
- return i;
+ buf[6] = tm->tm_sec;
+ buf[5] = tm->tm_min;
+ buf[4] = tm->tm_hour;
+ buf[3] = tm->tm_wday;
+ buf[2] = tm->tm_mday;
+ buf[1] = tm->tm_mon + 1;
+ buf[0] = tm->tm_year - 100;
+
+ for (i = 0; i < sizeof(buf); i++)
+ buf[i] = DEC2BCD(buf[i]);
+
+ rc = sw_i2c(SW_I2C_WRITE, RTC_CMD_DATA, buf, sizeof(buf));
+
+ return rc;
}