void rtc_settimereg(unsigned char r, unsigned char v) { unsigned char ctlb = rtc_readreg(DS_REG_CTLB); rtc_writereg(DS_REG_CTLB, ctlb | DS_CTLB_SET); rtc_writereg(r, byte_to_bcd(v)); rtc_writereg(DS_REG_CTLB, ctlb & ~DS_CTLB_SET); }
static int rtc_gettime_ymdhms(todr_chip_handle_t handle, struct clock_ymdhms *dt) { struct rtc_softc *sc; int i, year; bool read_okay; uint8_t rtc_registers[NUM_RTC_REGS]; sc = handle->cookie; /* read rtc registers */ read_okay = false; while (!read_okay) { read_okay = true; for (i = 0; i < NUM_RTC_REGS; i++) rtc_registers[i] = rtc_readreg(sc, i); for (i = 0; i < NUM_RTC_REGS; i++) if (rtc_registers[i] != rtc_readreg(sc, i)) read_okay = false; } #define rtc_to_decimal(a,b) (rtc_registers[a] * 10 + rtc_registers[b]) dt->dt_sec = rtc_to_decimal(1, 0); dt->dt_min = rtc_to_decimal(3, 2); dt->dt_hour = (rtc_registers[5] & RTC_REG5_HOUR) * 10 + rtc_registers[4]; dt->dt_day = rtc_to_decimal(8, 7); dt->dt_mon = rtc_to_decimal(10, 9); year = rtc_to_decimal(12, 11) + RTC_BASE_YEAR; if (year < POSIX_BASE_YEAR) year += 100; dt->dt_year = year; #undef rtc_to_decimal return 0; }
unsigned char rtc_gettimereg(unsigned char r) { return bcd_to_byte(rtc_readreg(r)); }