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); }
void rtc_init(void) { /* * Set DV0 to enable access to century register, no interrupt, * and enable oscillator. */ rtc_writereg(DS_REG_CTLA, DS_CTLA_DV0 | DS_CTLA_DV1); /* 24hr mode */ rtc_writereg(DS_REG_CTLB, DS_CTLB_24); }
static int rtc_settime_ymdhms(todr_chip_handle_t handle, struct clock_ymdhms *dt) { struct rtc_softc *sc; int i, year; uint8_t rtc_registers[NUM_RTC_REGS]; sc = handle->cookie; year = dt->dt_year - RTC_BASE_YEAR; if (year > 99) year -= 100; #define decimal_to_rtc(a,b,n) \ rtc_registers[a] = (n) % 10; \ rtc_registers[b] = (n) / 10; decimal_to_rtc(0, 1, dt->dt_sec); decimal_to_rtc(2, 3, dt->dt_min); decimal_to_rtc(7, 8, dt->dt_day); decimal_to_rtc(9, 10, dt->dt_mon); decimal_to_rtc(11, 12, year); rtc_registers[4] = dt->dt_hour % 10; rtc_registers[5] = ((dt->dt_hour / 10) & RTC_REG5_HOUR) | RTC_REG5_24HR; rtc_registers[6] = 0; #undef decimal_to_rtc /* write rtc registers */ rtc_writereg(sc, 15, 13); /* reset prescalar */ for (i = 0; i < NUM_RTC_REGS; i++) if (rtc_registers[i] != rtc_writereg(sc, i, rtc_registers[i])) return 1; return 0; }