10c698dcaSJean-Christophe PLAGNIOL-VILLARD /*
20c698dcaSJean-Christophe PLAGNIOL-VILLARD * ds1302.c - Support for the Dallas Semiconductor DS1302 Timekeeping Chip
30c698dcaSJean-Christophe PLAGNIOL-VILLARD *
40c698dcaSJean-Christophe PLAGNIOL-VILLARD * Rex G. Feany <rfeany@zumanetworks.com>
50c698dcaSJean-Christophe PLAGNIOL-VILLARD *
60c698dcaSJean-Christophe PLAGNIOL-VILLARD */
70c698dcaSJean-Christophe PLAGNIOL-VILLARD
80c698dcaSJean-Christophe PLAGNIOL-VILLARD #include <common.h>
90c698dcaSJean-Christophe PLAGNIOL-VILLARD #include <command.h>
100c698dcaSJean-Christophe PLAGNIOL-VILLARD #include <rtc.h>
110c698dcaSJean-Christophe PLAGNIOL-VILLARD
120c698dcaSJean-Christophe PLAGNIOL-VILLARD /* GPP Pins */
130c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA 0x200
140c698dcaSJean-Christophe PLAGNIOL-VILLARD #define SCLK 0x400
150c698dcaSJean-Christophe PLAGNIOL-VILLARD #define RST 0x800
160c698dcaSJean-Christophe PLAGNIOL-VILLARD
170c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Happy Fun Defines(tm) */
180c698dcaSJean-Christophe PLAGNIOL-VILLARD #define RESET rtc_go_low(RST), rtc_go_low(SCLK)
190c698dcaSJean-Christophe PLAGNIOL-VILLARD #define N_RESET rtc_go_high(RST), rtc_go_low(SCLK)
200c698dcaSJean-Christophe PLAGNIOL-VILLARD
210c698dcaSJean-Christophe PLAGNIOL-VILLARD #define CLOCK_HIGH rtc_go_high(SCLK)
220c698dcaSJean-Christophe PLAGNIOL-VILLARD #define CLOCK_LOW rtc_go_low(SCLK)
230c698dcaSJean-Christophe PLAGNIOL-VILLARD
240c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA_HIGH rtc_go_high(DATA)
250c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA_LOW rtc_go_low(DATA)
260c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA_READ (GTREGREAD(GPP_VALUE) & DATA)
270c698dcaSJean-Christophe PLAGNIOL-VILLARD
280c698dcaSJean-Christophe PLAGNIOL-VILLARD #undef RTC_DEBUG
290c698dcaSJean-Christophe PLAGNIOL-VILLARD
300c698dcaSJean-Christophe PLAGNIOL-VILLARD #ifdef RTC_DEBUG
310c698dcaSJean-Christophe PLAGNIOL-VILLARD # define DPRINTF(x,args...) printf("ds1302: " x , ##args)
DUMP(const char * ptr,int num)320c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void DUMP(const char *ptr, int num)
330c698dcaSJean-Christophe PLAGNIOL-VILLARD {
340c698dcaSJean-Christophe PLAGNIOL-VILLARD while (num--) printf("%x ", *ptr++);
350c698dcaSJean-Christophe PLAGNIOL-VILLARD printf("]\n");
360c698dcaSJean-Christophe PLAGNIOL-VILLARD }
370c698dcaSJean-Christophe PLAGNIOL-VILLARD #else
380c698dcaSJean-Christophe PLAGNIOL-VILLARD # define DPRINTF(x,args...)
390c698dcaSJean-Christophe PLAGNIOL-VILLARD # define DUMP(ptr, num)
400c698dcaSJean-Christophe PLAGNIOL-VILLARD #endif
410c698dcaSJean-Christophe PLAGNIOL-VILLARD
420c698dcaSJean-Christophe PLAGNIOL-VILLARD /* time data format for DS1302 */
430c698dcaSJean-Christophe PLAGNIOL-VILLARD struct ds1302_st
440c698dcaSJean-Christophe PLAGNIOL-VILLARD {
450c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char CH:1; /* clock halt 1=stop 0=start */
460c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char sec10:3;
470c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char sec:4;
480c698dcaSJean-Christophe PLAGNIOL-VILLARD
490c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char zero0:1;
500c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char min10:3;
510c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char min:4;
520c698dcaSJean-Christophe PLAGNIOL-VILLARD
530c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char fmt:1; /* 1=12 hour 0=24 hour */
540c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char zero1:1;
550c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char hr10:2; /* 10 (0-2) or am/pm (am/pm, 0-1) */
560c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char hr:4;
570c698dcaSJean-Christophe PLAGNIOL-VILLARD
580c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char zero2:2;
590c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char date10:2;
600c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char date:4;
610c698dcaSJean-Christophe PLAGNIOL-VILLARD
620c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char zero3:3;
630c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char month10:1;
640c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char month:4;
650c698dcaSJean-Christophe PLAGNIOL-VILLARD
660c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char zero4:5;
670c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char day:3; /* day of week */
680c698dcaSJean-Christophe PLAGNIOL-VILLARD
690c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char year10:4;
700c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char year:4;
710c698dcaSJean-Christophe PLAGNIOL-VILLARD
720c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char WP:1; /* write protect 1=protect 0=unprot */
730c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char zero5:7;
740c698dcaSJean-Christophe PLAGNIOL-VILLARD };
750c698dcaSJean-Christophe PLAGNIOL-VILLARD
760c698dcaSJean-Christophe PLAGNIOL-VILLARD static int ds1302_initted=0;
770c698dcaSJean-Christophe PLAGNIOL-VILLARD
780c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Pin control */
790c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_high(unsigned int mask)800c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_high(unsigned int mask)
810c698dcaSJean-Christophe PLAGNIOL-VILLARD {
820c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned int f = GTREGREAD(GPP_VALUE) | mask;
830c698dcaSJean-Christophe PLAGNIOL-VILLARD
840c698dcaSJean-Christophe PLAGNIOL-VILLARD GT_REG_WRITE(GPP_VALUE, f);
850c698dcaSJean-Christophe PLAGNIOL-VILLARD }
860c698dcaSJean-Christophe PLAGNIOL-VILLARD
870c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_low(unsigned int mask)880c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_low(unsigned int mask)
890c698dcaSJean-Christophe PLAGNIOL-VILLARD {
900c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned int f = GTREGREAD(GPP_VALUE) & ~mask;
910c698dcaSJean-Christophe PLAGNIOL-VILLARD
920c698dcaSJean-Christophe PLAGNIOL-VILLARD GT_REG_WRITE(GPP_VALUE, f);
930c698dcaSJean-Christophe PLAGNIOL-VILLARD }
940c698dcaSJean-Christophe PLAGNIOL-VILLARD
950c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_input(unsigned int mask)960c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_input(unsigned int mask)
970c698dcaSJean-Christophe PLAGNIOL-VILLARD {
980c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned int f = GTREGREAD(GPP_IO_CONTROL) & ~mask;
990c698dcaSJean-Christophe PLAGNIOL-VILLARD
1000c698dcaSJean-Christophe PLAGNIOL-VILLARD GT_REG_WRITE(GPP_IO_CONTROL, f);
1010c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1020c698dcaSJean-Christophe PLAGNIOL-VILLARD
1030c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_output(unsigned int mask)1040c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_output(unsigned int mask)
1050c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1060c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned int f = GTREGREAD(GPP_IO_CONTROL) | mask;
1070c698dcaSJean-Christophe PLAGNIOL-VILLARD
1080c698dcaSJean-Christophe PLAGNIOL-VILLARD GT_REG_WRITE(GPP_IO_CONTROL, f);
1090c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1100c698dcaSJean-Christophe PLAGNIOL-VILLARD
1110c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Access data in RTC */
1120c698dcaSJean-Christophe PLAGNIOL-VILLARD
1130c698dcaSJean-Christophe PLAGNIOL-VILLARD static void
write_byte(unsigned char b)1140c698dcaSJean-Christophe PLAGNIOL-VILLARD write_byte(unsigned char b)
1150c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1160c698dcaSJean-Christophe PLAGNIOL-VILLARD int i;
1170c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char mask=1;
1180c698dcaSJean-Christophe PLAGNIOL-VILLARD
1190c698dcaSJean-Christophe PLAGNIOL-VILLARD for(i=0;i<8;i++) {
1200c698dcaSJean-Christophe PLAGNIOL-VILLARD CLOCK_LOW; /* Lower clock */
1210c698dcaSJean-Christophe PLAGNIOL-VILLARD (b&mask)?DATA_HIGH:DATA_LOW; /* set data */
1220c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(1);
1230c698dcaSJean-Christophe PLAGNIOL-VILLARD CLOCK_HIGH; /* latch data with rising clock */
1240c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(1);
1250c698dcaSJean-Christophe PLAGNIOL-VILLARD mask=mask<<1;
1260c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1270c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1280c698dcaSJean-Christophe PLAGNIOL-VILLARD
1290c698dcaSJean-Christophe PLAGNIOL-VILLARD static unsigned char
read_byte(void)1300c698dcaSJean-Christophe PLAGNIOL-VILLARD read_byte(void)
1310c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1320c698dcaSJean-Christophe PLAGNIOL-VILLARD int i;
1330c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char mask=1;
1340c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char b=0;
1350c698dcaSJean-Christophe PLAGNIOL-VILLARD
1360c698dcaSJean-Christophe PLAGNIOL-VILLARD for(i=0;i<8;i++) {
1370c698dcaSJean-Christophe PLAGNIOL-VILLARD CLOCK_LOW;
1380c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(1);
1390c698dcaSJean-Christophe PLAGNIOL-VILLARD if (DATA_READ) b|=mask; /* if this bit is high, set in b */
1400c698dcaSJean-Christophe PLAGNIOL-VILLARD CLOCK_HIGH; /* clock out next bit */
1410c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(1);
1420c698dcaSJean-Christophe PLAGNIOL-VILLARD mask=mask<<1;
1430c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1440c698dcaSJean-Christophe PLAGNIOL-VILLARD return b;
1450c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1460c698dcaSJean-Christophe PLAGNIOL-VILLARD
1470c698dcaSJean-Christophe PLAGNIOL-VILLARD static void
read_ser_drv(unsigned char addr,unsigned char * buf,int count)1480c698dcaSJean-Christophe PLAGNIOL-VILLARD read_ser_drv(unsigned char addr, unsigned char *buf, int count)
1490c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1500c698dcaSJean-Christophe PLAGNIOL-VILLARD int i;
1510c698dcaSJean-Christophe PLAGNIOL-VILLARD #ifdef RTC_DEBUG
1520c698dcaSJean-Christophe PLAGNIOL-VILLARD char *foo = buf;
1530c698dcaSJean-Christophe PLAGNIOL-VILLARD #endif
1540c698dcaSJean-Christophe PLAGNIOL-VILLARD
1550c698dcaSJean-Christophe PLAGNIOL-VILLARD DPRINTF("READ 0x%x bytes @ 0x%x [ ", count, addr);
1560c698dcaSJean-Christophe PLAGNIOL-VILLARD
1570c698dcaSJean-Christophe PLAGNIOL-VILLARD addr|=1; /* READ */
1580c698dcaSJean-Christophe PLAGNIOL-VILLARD N_RESET;
1590c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(4);
1600c698dcaSJean-Christophe PLAGNIOL-VILLARD write_byte(addr);
1610c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_input(DATA); /* Put gpp pin into input mode */
1620c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(1);
1630c698dcaSJean-Christophe PLAGNIOL-VILLARD for(i=0;i<count;i++) *(buf++)=read_byte();
1640c698dcaSJean-Christophe PLAGNIOL-VILLARD RESET;
1650c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_output(DATA);/* Reset gpp for output */
1660c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(4);
1670c698dcaSJean-Christophe PLAGNIOL-VILLARD
1680c698dcaSJean-Christophe PLAGNIOL-VILLARD DUMP(foo, count);
1690c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1700c698dcaSJean-Christophe PLAGNIOL-VILLARD
1710c698dcaSJean-Christophe PLAGNIOL-VILLARD static void
write_ser_drv(unsigned char addr,unsigned char * buf,int count)1720c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(unsigned char addr, unsigned char *buf, int count)
1730c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1740c698dcaSJean-Christophe PLAGNIOL-VILLARD int i;
1750c698dcaSJean-Christophe PLAGNIOL-VILLARD
1760c698dcaSJean-Christophe PLAGNIOL-VILLARD DPRINTF("WRITE 0x%x bytes @ 0x%x [ ", count, addr);
1770c698dcaSJean-Christophe PLAGNIOL-VILLARD DUMP(buf, count);
1780c698dcaSJean-Christophe PLAGNIOL-VILLARD
1790c698dcaSJean-Christophe PLAGNIOL-VILLARD addr&=~1; /* WRITE */
1800c698dcaSJean-Christophe PLAGNIOL-VILLARD N_RESET;
1810c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(4);
1820c698dcaSJean-Christophe PLAGNIOL-VILLARD write_byte(addr);
1830c698dcaSJean-Christophe PLAGNIOL-VILLARD for(i=0;i<count;i++) write_byte(*(buf++));
1840c698dcaSJean-Christophe PLAGNIOL-VILLARD RESET;
1850c698dcaSJean-Christophe PLAGNIOL-VILLARD udelay(4);
1860c698dcaSJean-Christophe PLAGNIOL-VILLARD
1870c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1880c698dcaSJean-Christophe PLAGNIOL-VILLARD
1890c698dcaSJean-Christophe PLAGNIOL-VILLARD void
rtc_init(void)1900c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_init(void)
1910c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1920c698dcaSJean-Christophe PLAGNIOL-VILLARD struct ds1302_st bbclk;
1930c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char b;
1940c698dcaSJean-Christophe PLAGNIOL-VILLARD int mod;
1950c698dcaSJean-Christophe PLAGNIOL-VILLARD
1960c698dcaSJean-Christophe PLAGNIOL-VILLARD DPRINTF("init\n");
1970c698dcaSJean-Christophe PLAGNIOL-VILLARD
1980c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_output(DATA|SCLK|RST);
1990c698dcaSJean-Christophe PLAGNIOL-VILLARD
2000c698dcaSJean-Christophe PLAGNIOL-VILLARD /* disable write protect */
2010c698dcaSJean-Christophe PLAGNIOL-VILLARD b = 0;
2020c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(0x8e,&b,1);
2030c698dcaSJean-Christophe PLAGNIOL-VILLARD
2040c698dcaSJean-Christophe PLAGNIOL-VILLARD /* enable trickle */
2050c698dcaSJean-Christophe PLAGNIOL-VILLARD b = 0xa5; /* 1010.0101 */
2060c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(0x90,&b,1);
2070c698dcaSJean-Christophe PLAGNIOL-VILLARD
2080c698dcaSJean-Christophe PLAGNIOL-VILLARD /* read burst */
2090c698dcaSJean-Christophe PLAGNIOL-VILLARD read_ser_drv(0xbe, (unsigned char *)&bbclk, 8);
2100c698dcaSJean-Christophe PLAGNIOL-VILLARD
2110c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Sanity checks */
2120c698dcaSJean-Christophe PLAGNIOL-VILLARD mod = 0;
2130c698dcaSJean-Christophe PLAGNIOL-VILLARD if (bbclk.CH) {
2140c698dcaSJean-Christophe PLAGNIOL-VILLARD printf("ds1302: Clock was halted, starting clock\n");
2150c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.CH=0;
2160c698dcaSJean-Christophe PLAGNIOL-VILLARD mod=1;
2170c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2180c698dcaSJean-Christophe PLAGNIOL-VILLARD
2190c698dcaSJean-Christophe PLAGNIOL-VILLARD if (bbclk.fmt) {
2200c698dcaSJean-Christophe PLAGNIOL-VILLARD printf("ds1302: Clock was in 12 hour mode, fixing\n");
2210c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.fmt=0;
2220c698dcaSJean-Christophe PLAGNIOL-VILLARD mod=1;
2230c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2240c698dcaSJean-Christophe PLAGNIOL-VILLARD
2250c698dcaSJean-Christophe PLAGNIOL-VILLARD if (bbclk.year>9) {
2260c698dcaSJean-Christophe PLAGNIOL-VILLARD printf("ds1302: Year was corrupted, fixing\n");
2270c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.year10=100/10; /* 2000 - why not? ;) */
2280c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.year=0;
2290c698dcaSJean-Christophe PLAGNIOL-VILLARD mod=1;
2300c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2310c698dcaSJean-Christophe PLAGNIOL-VILLARD
2320c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Write out the changes if needed */
2330c698dcaSJean-Christophe PLAGNIOL-VILLARD if (mod) {
2340c698dcaSJean-Christophe PLAGNIOL-VILLARD /* enable write protect */
2350c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.WP = 1;
2360c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(0xbe,(unsigned char *)&bbclk,8);
2370c698dcaSJean-Christophe PLAGNIOL-VILLARD } else {
2380c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Else just turn write protect on */
2390c698dcaSJean-Christophe PLAGNIOL-VILLARD b = 0x80;
2400c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(0x8e,&b,1);
2410c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2420c698dcaSJean-Christophe PLAGNIOL-VILLARD DPRINTF("init done\n");
2430c698dcaSJean-Christophe PLAGNIOL-VILLARD
2440c698dcaSJean-Christophe PLAGNIOL-VILLARD ds1302_initted=1;
2450c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2460c698dcaSJean-Christophe PLAGNIOL-VILLARD
2470c698dcaSJean-Christophe PLAGNIOL-VILLARD void
rtc_reset(void)2480c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_reset(void)
2490c698dcaSJean-Christophe PLAGNIOL-VILLARD {
2500c698dcaSJean-Christophe PLAGNIOL-VILLARD if(!ds1302_initted) rtc_init();
2510c698dcaSJean-Christophe PLAGNIOL-VILLARD /* TODO */
2520c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2530c698dcaSJean-Christophe PLAGNIOL-VILLARD
254b73a19e1SYuri Tikhonov int
rtc_get(struct rtc_time * tmp)2550c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_get(struct rtc_time *tmp)
2560c698dcaSJean-Christophe PLAGNIOL-VILLARD {
257b73a19e1SYuri Tikhonov int rel = 0;
2580c698dcaSJean-Christophe PLAGNIOL-VILLARD struct ds1302_st bbclk;
2590c698dcaSJean-Christophe PLAGNIOL-VILLARD
2600c698dcaSJean-Christophe PLAGNIOL-VILLARD if(!ds1302_initted) rtc_init();
2610c698dcaSJean-Christophe PLAGNIOL-VILLARD
2620c698dcaSJean-Christophe PLAGNIOL-VILLARD read_ser_drv(0xbe,(unsigned char *)&bbclk, 8); /* read burst */
2630c698dcaSJean-Christophe PLAGNIOL-VILLARD
2640c698dcaSJean-Christophe PLAGNIOL-VILLARD if (bbclk.CH) {
2650c698dcaSJean-Christophe PLAGNIOL-VILLARD printf("ds1302: rtc_get: Clock was halted, clock probably "
2660c698dcaSJean-Christophe PLAGNIOL-VILLARD "corrupt\n");
267b73a19e1SYuri Tikhonov rel = -1;
2680c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2690c698dcaSJean-Christophe PLAGNIOL-VILLARD
2700c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_sec=10*bbclk.sec10+bbclk.sec;
2710c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_min=10*bbclk.min10+bbclk.min;
2720c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_hour=10*bbclk.hr10+bbclk.hr;
2730c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_wday=bbclk.day;
2740c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_mday=10*bbclk.date10+bbclk.date;
2750c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_mon=10*bbclk.month10+bbclk.month;
2760c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_year=10*bbclk.year10+bbclk.year + 1900;
2770c698dcaSJean-Christophe PLAGNIOL-VILLARD
2780c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_yday = 0;
2790c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_isdst= 0;
2800c698dcaSJean-Christophe PLAGNIOL-VILLARD
2810c698dcaSJean-Christophe PLAGNIOL-VILLARD DPRINTF("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
2820c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
2830c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_hour, tmp->tm_min, tmp->tm_sec );
284b73a19e1SYuri Tikhonov
285b73a19e1SYuri Tikhonov return rel;
2860c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2870c698dcaSJean-Christophe PLAGNIOL-VILLARD
rtc_set(struct rtc_time * tmp)288*d1e23194SJean-Christophe PLAGNIOL-VILLARD int rtc_set(struct rtc_time *tmp)
2890c698dcaSJean-Christophe PLAGNIOL-VILLARD {
2900c698dcaSJean-Christophe PLAGNIOL-VILLARD struct ds1302_st bbclk;
2910c698dcaSJean-Christophe PLAGNIOL-VILLARD unsigned char b=0;
2920c698dcaSJean-Christophe PLAGNIOL-VILLARD
2930c698dcaSJean-Christophe PLAGNIOL-VILLARD if(!ds1302_initted) rtc_init();
2940c698dcaSJean-Christophe PLAGNIOL-VILLARD
2950c698dcaSJean-Christophe PLAGNIOL-VILLARD DPRINTF("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
2960c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
2970c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2980c698dcaSJean-Christophe PLAGNIOL-VILLARD
2990c698dcaSJean-Christophe PLAGNIOL-VILLARD memset(&bbclk,0,sizeof(bbclk));
3000c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.CH=0; /* dont halt */
3010c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.WP=1; /* write protect when we're done */
3020c698dcaSJean-Christophe PLAGNIOL-VILLARD
3030c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.sec10=tmp->tm_sec/10;
3040c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.sec=tmp->tm_sec%10;
3050c698dcaSJean-Christophe PLAGNIOL-VILLARD
3060c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.min10=tmp->tm_min/10;
3070c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.min=tmp->tm_min%10;
3080c698dcaSJean-Christophe PLAGNIOL-VILLARD
3090c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.hr10=tmp->tm_hour/10;
3100c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.hr=tmp->tm_hour%10;
3110c698dcaSJean-Christophe PLAGNIOL-VILLARD
3120c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.day=tmp->tm_wday;
3130c698dcaSJean-Christophe PLAGNIOL-VILLARD
3140c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.date10=tmp->tm_mday/10;
3150c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.date=tmp->tm_mday%10;
3160c698dcaSJean-Christophe PLAGNIOL-VILLARD
3170c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.month10=tmp->tm_mon/10;
3180c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.month=tmp->tm_mon%10;
3190c698dcaSJean-Christophe PLAGNIOL-VILLARD
3200c698dcaSJean-Christophe PLAGNIOL-VILLARD tmp->tm_year -= 1900;
3210c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.year10=tmp->tm_year/10;
3220c698dcaSJean-Christophe PLAGNIOL-VILLARD bbclk.year=tmp->tm_year%10;
3230c698dcaSJean-Christophe PLAGNIOL-VILLARD
3240c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(0x8e,&b,1); /* disable write protect */
3250c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(0xbe,(unsigned char *)&bbclk, 8); /* write burst */
326*d1e23194SJean-Christophe PLAGNIOL-VILLARD
327*d1e23194SJean-Christophe PLAGNIOL-VILLARD return 0;
3280c698dcaSJean-Christophe PLAGNIOL-VILLARD }
329