static void ds1307_convert_to_time( struct rtc_time *dt, char *buf) { dt->tm_sec = BCD_TO_BIN(buf[0]); dt->tm_min = BCD_TO_BIN(buf[1]); if ( TWELVE_HOUR_MODE(buf[2]) ) { dt->tm_hour = HOURS_12(buf[2]); if (HOURS_AP(buf[2])) /* PM */ { dt->tm_hour += 12; } } else /* 24-hour-mode */ { dt->tm_hour = HOURS_24(buf[2]); } dt->tm_mday = BCD_TO_BIN(buf[4]); /* dt->tm_mon is zero-based */ dt->tm_mon = BCD_TO_BIN(buf[5]) - 1; /* year is 1900 + dt->tm_year */ dt->tm_year = BCD_TO_BIN(buf[6]) + 100; if( rtc_debug > 2) { printk("ds1307_get_datetime: year = %d\n", dt->tm_year); printk("ds1307_get_datetime: mon = %d\n", dt->tm_mon); printk("ds1307_get_datetime: mday = %d\n", dt->tm_mday); printk("ds1307_get_datetime: hour = %d\n", dt->tm_hour); printk("ds1307_get_datetime: min = %d\n", dt->tm_min); printk("ds1307_get_datetime: sec = %d\n", dt->tm_sec); } }
/* * Set the RTC */ void rtc_set (struct rtc_time *tmp) { unsigned char buf[8], reg15; int ret; if (!setup_done) rs5c372_enable(); if (!setup_done) return; if(rtc_debug > 2) { printf("rtc_set: tm_year = %d\n", tmp->tm_year); printf("rtc_set: tm_mon = %d\n", tmp->tm_mon); printf("rtc_set: tm_mday = %d\n", tmp->tm_mday); printf("rtc_set: tm_hour = %d\n", tmp->tm_hour); printf("rtc_set: tm_min = %d\n", tmp->tm_min); printf("rtc_set: tm_sec = %d\n", tmp->tm_sec); } memset(buf, 0, sizeof(buf)); /* only read register 15 */ ret = i2c_read(CFG_I2C_RTC_ADDR, 0, 0, buf, 1); if (ret == 0) { /* need to save register 15 */ reg15 = buf[0]; buf[0] = 0; /* register address on RS5C372 */ buf[1] = bin2bcd(tmp->tm_sec); buf[2] = bin2bcd(tmp->tm_min); /* need to handle 12 hour mode */ if (TWELVE_HOUR_MODE(reg15)) { if (tmp->tm_hour >= 12) { /* PM */ /* 12 PM is a special case */ if (tmp->tm_hour == 12) buf[3] = bin2bcd(tmp->tm_hour); else buf[3] = bin2bcd(tmp->tm_hour - 12); buf[3] |= 0x20; } } else { buf[3] = bin2bcd(tmp->tm_hour); } buf[4] = bin2bcd(tmp->tm_wday); buf[5] = bin2bcd(tmp->tm_mday); buf[6] = bin2bcd(tmp->tm_mon); if (tmp->tm_year < 1970 || tmp->tm_year > 2069) printf("WARNING: year should be between 1970 and 2069!\n"); buf[7] = bin2bcd(tmp->tm_year % 100); ret = i2c_write(CFG_I2C_RTC_ADDR, 0, 0, buf, 8); if (ret != 0) printf("rs5c372_set_datetime(), i2c_master_send() returned %d\n",ret); } return; }
static void rs5c372_convert_to_time(struct rtc_time *dt, unsigned char *buf) { /* buf[0] is register 15 */ dt->tm_sec = bcd2bin(buf[1]); dt->tm_min = bcd2bin(buf[2]); if (TWELVE_HOUR_MODE(buf[0])) { dt->tm_hour = HOURS_12(buf[3]); if (HOURS_AP(buf[3])) /* PM */ dt->tm_hour += 12; } else /* 24-hour-mode */ dt->tm_hour = HOURS_24(buf[3]); dt->tm_mday = bcd2bin(buf[5]); dt->tm_mon = bcd2bin(buf[6]); dt->tm_year = bcd2bin(buf[7]); if (dt->tm_year >= 70) dt->tm_year += 1900; else dt->tm_year += 2000; /* 0 is Sunday */ dt->tm_wday = bcd2bin(buf[4] & 0x07); dt->tm_yday = 0; dt->tm_isdst= 0; if(rtc_debug > 2) { printf("rs5c372_convert_to_time: year = %d\n", dt->tm_year); printf("rs5c372_convert_to_time: mon = %d\n", dt->tm_mon); printf("rs5c372_convert_to_time: mday = %d\n", dt->tm_mday); printf("rs5c372_convert_to_time: hour = %d\n", dt->tm_hour); printf("rs5c372_convert_to_time: min = %d\n", dt->tm_min); printf("rs5c372_convert_to_time: sec = %d\n", dt->tm_sec); } }