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:
parent
5ce34d07fb
commit
323a8aedfb
2 changed files with 17 additions and 8 deletions
19
rtc_linux.c
19
rtc_linux.c
|
@ -786,7 +786,9 @@ RTC_Linux_CheckInterrupt(int fd)
|
|||
}
|
||||
|
||||
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;
|
||||
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
|
||||
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);
|
||||
if (status < 0) {
|
||||
|
@ -826,7 +828,7 @@ read_from_device(int fd_, int event, void *any)
|
|||
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) {
|
||||
error = 1;
|
||||
goto turn_off_interrupt;
|
||||
|
@ -931,7 +933,9 @@ RTC_Linux_WriteParameters(void)
|
|||
}
|
||||
|
||||
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;
|
||||
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);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
@ -977,7 +984,7 @@ RTC_Linux_TimePreInit(time_t driftfile_time)
|
|||
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);
|
||||
|
||||
|
|
|
@ -45,8 +45,10 @@ extern void RTC_Linux_CycleLogFile(void);
|
|||
extern int RTC_Linux_SwitchInterrupt(int fd, int on_off);
|
||||
extern int RTC_Linux_CheckInterrupt(int fd);
|
||||
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,
|
||||
struct timespec *sys_time_cooked);
|
||||
struct timespec *sys_time_cooked,
|
||||
struct timespec *sys_time_raw);
|
||||
|
||||
#endif /* _GOT_RTC_LINUX_H */
|
||||
|
|
Loading…
Reference in a new issue