/** * Updates the date-data in the global time struct */ void rtc_update() { outb(RTC_ADDR, RTC_SEC); time.sec = inb(RTC_DATA); if (time.sec == 0) { outb(RTC_ADDR, RTC_MIN); time.min = inb(RTC_DATA); if (time.min == 0) { outb(RTC_ADDR, RTC_HOUR); time.hour = inb(RTC_DATA); if (time.hour == 0) { outb(RTC_ADDR, RTC_DAY); time.day = inb(RTC_DATA); if (time.day == 1) { outb(RTC_ADDR, RTC_MONTH); time.month = inb(RTC_DATA); if (time.month == 1) { outb(RTC_ADDR, RTC_YEAR); time.year = inb(RTC_DATA); if (time.year == 1) { outb(RTC_ADDR, RTC_CENTURY); time.century = inb(RTC_DATA); } } } calculate_weekday(&time); } } } }
void SharpRTC::write(unsigned addr, uint8 data) { addr &= 1, data &= 15; if(addr == 1) { if(data == 0x0d) { rtc_state = State::Read; rtc_index = -1; return; } if(data == 0x0e) { rtc_state = State::Command; return; } if(data == 0x0f) return; //unknown behavior if(rtc_state == State::Command) { if(data == 0) { rtc_state = State::Write; rtc_index = 0; } else if(data == 4) { rtc_state = State::Ready; rtc_index = -1; //reset time second = 0; minute = 0; hour = 0; day = 0; month = 0; year = 0; weekday = 0; } else { //unknown behavior rtc_state = State::Ready; } return; } if(rtc_state == State::Write) { if(rtc_index >= 0 && rtc_index < 12) { rtc_write(rtc_index++, data); if(rtc_index == 12) { //day of week is automatically calculated and written weekday = calculate_weekday(1000 + year, month, day); } } return; } } }
/** * Initializes the global data struct */ void rtc_init() { // TODO: is this necessary? // sets rtc parameters // outb(RTC_ADDR, RTC_STATB); // outb(RTC_DATA, 0x7E); outb(RTC_ADDR, RTC_SEC); time.sec = inb(RTC_DATA); outb(RTC_ADDR, RTC_MIN); time.min = inb(RTC_DATA); outb(RTC_ADDR, RTC_HOUR); time.hour = inb(RTC_DATA); outb(RTC_ADDR, RTC_DAY); time.day = inb(RTC_DATA); outb(RTC_ADDR, RTC_MONTH); time.month = inb(RTC_DATA); outb(RTC_ADDR, RTC_YEAR); time.year = inb(RTC_DATA); outb(RTC_ADDR, RTC_CENTURY); time.century = inb(RTC_DATA); calculate_weekday(&time); }