コード例 #1
0
ファイル: io_rtc.c プロジェクト: MatiasNAmendola/potatoes
/**
 * 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);
                        }
                }
        }
}
コード例 #2
0
ファイル: sharprtc.cpp プロジェクト: Brunnis/bsnes-mercury
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;
    }
  }
}
コード例 #3
0
ファイル: io_rtc.c プロジェクト: MatiasNAmendola/potatoes
/**
 * 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);
}