Why does only register 0 affect expire time, and not all 3 registers?
Thanks, the toymatch[1]/[2] should also affect expire time. I fixed it like
this:
+static void rtc_toymatch_write(LS7ARtcState *s, struct tm *tm, uint64_t val)
+{
+ int64_t alarm_offset, year_diff, expire_time;
+
+ qemu_get_timedate(tm, s->offset);
+ tm->tm_sec = FIELD_EX32(val, TOY_MATCH, SEC);
+ tm->tm_min = FIELD_EX32(val, TOY_MATCH, MIN);
+ tm->tm_hour = FIELD_EX32(val, TOY_MATCH, HOUR);
+ tm->tm_mday = FIELD_EX32(val, TOY_MATCH, DAY);
+ tm->tm_mon = FIELD_EX32(val, TOY_MATCH, MON) - 1;
+ year_diff = FIELD_EX32(val, TOY_MATCH, MON);
+ year_diff = year_diff - (tm->tm_year & TOY_MATCH_YEAR_MASK);
+ tm->tm_year = tm->tm_year + year_diff;
+ alarm_offset = qemu_timedate_diff(tm) - s->offset;
+ if ((alarm_offset < 0) && (alarm_offset > -5)) {
+ alarm_offset = 0;
+ }
+ expire_time = qemu_clock_get_ms(rtc_clock);
+ expire_time += ((alarm_offset * 1000) + 100);
+ timer_mod(s->timer, expire_time);
+}
...
case SYS_TOYMATCH0:
s->toymatch[0] = val;
+ rtc_toymatch_write(s, &tm, val);
break;
case SYS_TOYMATCH1:
s->toymatch[1] = val;
+ rtc_toymatch_write(s, &tm, val);
break;
case SYS_TOYMATCH2:
s->toymatch[2] = val;
+ rtc_toymatch_write(s, &tm, val);
break;
...
+ case SYS_RTCCTRL:
+ s->cntrctl = val;
+ break;
Need to check REN, TEN, and EO fields.
Thanks, i fixed the rtc_ctrl writing function like this:
...
case SYS_RTCCTRL:
- s->cntrctl = val;
+ if (FIELD_EX32(val, RTC_CTRL, RTCEN) &&
+ FIELD_EX32(val, RTC_CTRL, TOYEN) &&
+ FIELD_EX32(val, RTC_CTRL, EO)) {
+ s->cntrctl = val;
+ }