rtc: optionally return raw time from RTC_Linux_ReadTime_*

For use with RCL_AddSample in the incoming RTC reference clock driver,
we'll want access not to the cooked timestamps, but to the raw ones.

Otherwise, the core reference clock code complains:

  (valid_sample_time) RTC0 refclock sample time 1721242673.092211891
    not valid age=-3.092007

Support both use cases by have the RTC_Linux_ReadTime_* functions take
two nullable pointers, one for cooked and the other for raw time.
This commit is contained in:
Ahmad Fatoum 2024-07-22 17:41:47 +02:00
parent 5ce34d07fb
commit 323a8aedfb
2 changed files with 17 additions and 8 deletions

View file

@ -786,7 +786,9 @@ RTC_Linux_CheckInterrupt(int fd)
} }
time_t time_t
RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, struct timespec *sys_time_cooked) RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc,
struct timespec *sys_time_cooked,
struct timespec *sys_time_raw)
{ {
int status; int status;
struct rtc_time rtc_raw; struct rtc_time rtc_raw;
@ -794,7 +796,7 @@ RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, struct timespec *sys_time_coo
/* Read RTC time, sandwiched between two polls of the system clock /* Read RTC time, sandwiched between two polls of the system clock
so we can bound any error. */ so we can bound any error. */
SCH_GetLastEventTime(sys_time_cooked, NULL, NULL); SCH_GetLastEventTime(sys_time_cooked, NULL, sys_time_raw);
status = ioctl(fd, RTC_RD_TIME, &rtc_raw); status = ioctl(fd, RTC_RD_TIME, &rtc_raw);
if (status < 0) { if (status < 0) {
@ -826,7 +828,7 @@ read_from_device(int fd_, int event, void *any)
return; return;
} }
rtc_t = RTC_Linux_ReadTime_AfterInterrupt(fd, rtc_on_utc, &sys_time); rtc_t = RTC_Linux_ReadTime_AfterInterrupt(fd, rtc_on_utc, &sys_time, NULL);
if (rtc_t == (time_t)-1) { if (rtc_t == (time_t)-1) {
error = 1; error = 1;
goto turn_off_interrupt; goto turn_off_interrupt;
@ -931,7 +933,9 @@ RTC_Linux_WriteParameters(void)
} }
time_t time_t
RTC_Linux_ReadTime_Now(int fd, int utc, struct timespec *old_sys_time) RTC_Linux_ReadTime_Now(int fd, int utc,
struct timespec *old_sys_cooked,
struct timespec *old_sys_raw)
{ {
struct rtc_time rtc_raw, rtc_raw_retry; struct rtc_time rtc_raw, rtc_raw_retry;
int status; int status;
@ -947,7 +951,10 @@ RTC_Linux_ReadTime_Now(int fd, int utc, struct timespec *old_sys_time)
} while (status >= 0 && rtc_raw.tm_sec != rtc_raw_retry.tm_sec); } while (status >= 0 && rtc_raw.tm_sec != rtc_raw_retry.tm_sec);
/* Read system clock */ /* Read system clock */
LCL_ReadCookedTime(old_sys_time, NULL); if (old_sys_raw)
LCL_ReadRawTime(old_sys_raw);
if (old_sys_cooked)
LCL_ReadCookedTime(old_sys_cooked, NULL);
return status >= 0 ? t_from_rtc(&rtc_raw, utc) : -1; return status >= 0 ? t_from_rtc(&rtc_raw, utc) : -1;
} }
@ -977,7 +984,7 @@ RTC_Linux_TimePreInit(time_t driftfile_time)
return 0; /* Can't open it, and won't be able to later */ return 0; /* Can't open it, and won't be able to later */
} }
rtc_t = RTC_Linux_ReadTime_Now(fd, rtc_on_utc, &old_sys_time); rtc_t = RTC_Linux_ReadTime_Now(fd, rtc_on_utc, &old_sys_time, NULL);
close(fd); close(fd);

View file

@ -45,8 +45,10 @@ extern void RTC_Linux_CycleLogFile(void);
extern int RTC_Linux_SwitchInterrupt(int fd, int on_off); extern int RTC_Linux_SwitchInterrupt(int fd, int on_off);
extern int RTC_Linux_CheckInterrupt(int fd); extern int RTC_Linux_CheckInterrupt(int fd);
extern time_t RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, extern time_t RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc,
struct timespec *sys_time_cooked); struct timespec *sys_time_cooked,
struct timespec *sys_time_raw);
extern time_t RTC_Linux_ReadTime_Now(int fd, int utc, extern time_t RTC_Linux_ReadTime_Now(int fd, int utc,
struct timespec *sys_time_cooked); struct timespec *sys_time_cooked,
struct timespec *sys_time_raw);
#endif /* _GOT_RTC_LINUX_H */ #endif /* _GOT_RTC_LINUX_H */