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