00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00062 #include <cfg/os.h>
00063 #include <dev/twif.h>
00064 #include <sys/event.h>
00065 #include <sys/timer.h>
00066
00067 #include <stdlib.h>
00068 #include <string.h>
00069
00070 #include <dev/ds1307rtc.h>
00071
00072 #ifndef I2C_SLA_RTC
00073 #define I2C_SLA_RTC 0x68 // 7 bit address!
00074 #endif
00075
00076
00086 int DS1307RtcReadRegs(u_char reg, u_char *buff, size_t cnt)
00087 {
00088 int rc = -1;
00089 u_char wbuf[1];
00090
00091 wbuf[0] = reg;
00092 if (TwMasterTransact(I2C_SLA_RTC, wbuf, 1, buff, cnt, NUT_WAIT_INFINITE) == cnt) {
00093 rc = 0;
00094 }
00095 return rc;
00096 }
00097
00107 int DS1307RtcWrite(CONST u_char *buff, size_t cnt)
00108 {
00109 int rc;
00110
00111 rc = TwMasterTransact(I2C_SLA_RTC, buff, cnt, 0, 0, NUT_WAIT_INFINITE);
00112 return rc;
00113 }
00114
00123 int DS1307RtcGetClock(struct _tm *tm)
00124 {
00125 int rc;
00126 u_char data[7];
00127
00128 if ((rc = DS1307RtcReadRegs(0x00, data, 7)) == 0) {
00129 tm->tm_sec = BCD2BIN(data[0]);
00130 tm->tm_min = BCD2BIN(data[1]);
00131 tm->tm_hour = BCD2BIN(data[2] & 0x3F);
00132 tm->tm_mday = BCD2BIN(data[4]);
00133 tm->tm_mon = BCD2BIN(data[5]) - 1;
00134 tm->tm_year = BCD2BIN(data[6]) + 100;
00135 tm->tm_wday = data[3] - 1;
00136 }
00137 return rc;
00138 }
00139
00148 int DS1307RtcSetClock(CONST struct _tm *tm)
00149 {
00150 u_char data[8];
00151
00152 memset(data, 0, sizeof(data));
00153 if (tm) {
00154 data[0] = 0x00;
00155 data[1] = BIN2BCD(tm->tm_sec);
00156 data[2] = BIN2BCD(tm->tm_min);
00157 data[3] = BIN2BCD(tm->tm_hour) & 0x3f;
00158 data[5] = BIN2BCD(tm->tm_mday);
00159 data[6] = BIN2BCD(tm->tm_mon + 1);
00160 data[7] = BIN2BCD(tm->tm_year - 100);
00161 data[4] = tm->tm_wday + 1;
00162 }
00163 return DS1307RtcWrite(data, 8);
00164 }
00165
00175 int DS1307RamRead(u_char addr, u_char *buff, size_t cnt)
00176 {
00177 int rc = -1;
00178
00179
00180 if ((addr>=0x08) && (addr<=0x3F)) {
00181 rc = DS1307RtcReadRegs(addr, buff, cnt);
00182 }
00183
00184 return rc;
00185 }
00186
00196 int DS1307RamWrite(u_char addr, CONST void *buff, size_t len)
00197 {
00198 int rc = 0;
00199 u_char *wbuf;
00200 CONST u_char *wp = buff;
00201
00202
00203 if ((wbuf = malloc(len + 1)) == 0) {
00204 rc = -1;
00205 } else {
00206 wbuf[0] = addr;
00207 memcpy(wbuf + 1, wp, len);
00208
00209
00210 rc = TwMasterTransact(I2C_SLA_RTC, wbuf, len + 1, 0, 0, NUT_WAIT_INFINITE);
00211
00212
00213 free(wbuf);
00214 }
00215
00216 return rc;
00217 }
00218
00225 int DS1307Init(void)
00226 {
00227 int rc;
00228 u_char data;
00229 u_char buff[2];
00230
00231 if ((rc = TwInit(0)) == 0 ) {
00232
00233 if ((rc = DS1307RtcReadRegs(0x00, &data, 1)) == 0) {
00234 buff[0] = 0x00;
00235 buff[1] = data & 0x7F;
00236 rc = DS1307RtcWrite(buff, 2);
00237 }
00238
00239
00240 if ((rc = DS1307RtcReadRegs(0x02, &data, 1)) == 0) {
00241 buff[0] = 0x02;
00242 buff[1] = data & 0xBF;
00243 rc = DS1307RtcWrite(buff, 2);
00244 }
00245 }
00246 return rc;
00247 }
00248
00249 NUTRTC rtcDs1307 = {
00250 DS1307Init,
00251 DS1307RtcGetClock,
00252 DS1307RtcSetClock,
00253 NULL,
00254 NULL,
00255 NULL,
00256 NULL
00257 };