From: Bill Unruh Date: Tue, 26 Jun 2007 22:42:11 +0000 (+0100) Subject: Fix problems with rtc_linux. X-Git-Tag: 1.23-pre1~2^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce4e0a3c2ff795df8d3cdd61b4d14a75a0f5d8e7;p=thirdparty%2Fchrony.git Fix problems with rtc_linux. 2) Changes to rtc_linux.c which a) do a double read of /dev/rtc when the PPM interupt is turned on after the wait time expires. The current read does not block to the second, as it should, thus two reads are needed. Also, changes so that at startup the system properly ignores the last system time from the initial burst mode for setting the system time since it can be way off. At present this last system time is included in the regression, which throws it off until finally that sample is dropped. --- diff --git a/rtc_linux.c b/rtc_linux.c index 8765a129..1d19bbb8 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -174,7 +174,7 @@ static double file_ref_offset, file_rate_ppm; /* ================================================== */ /* Flag to remember whether to assume the RTC is running on UTC */ -static int rtc_on_utc = 0; +static int rtc_on_utc = 1; /* ================================================== */ @@ -226,15 +226,18 @@ accumulate_sample(time_t rtc, struct timeval *sys) discard_samples(NEW_FIRST_WHEN_FULL); } - rtc_sec[n_samples] = rtc; /* Always use most recent sample as reference */ + /* use sample only if n_sample is not negative*/ + if(n_samples >=0) + { rtc_ref = rtc; - + rtc_sec[n_samples] = rtc; rtc_trim[n_samples] = 0.0; system_times[n_samples] = *sys; - ++n_samples; ++n_samples_since_regression; + } + ++n_samples; return; } @@ -742,8 +745,12 @@ handle_initial_trim(void) run_regression(1, &coefs_valid, &coef_ref_time, &coef_seconds_fast, &coef_gain_rate); n_samples_since_regression = 0; - n_samples = 0; + /* Set sample number to -1 so the next sample is not used, as it will not yet be corrected for System Trim*/ + + n_samples = -1; + + read_coefs_from_file(); if (valid_coefs_from_file) { @@ -866,6 +873,8 @@ read_from_device(void *any) int error = 0; status = read(fd, &data, sizeof(data)); + if (operating_mode == OM_NORMAL) + status = read(fd, &data, sizeof(data)); if (status < 0) { /* This looks like a bad error : the file descriptor was indicating it was * ready to read but we couldn't read anything. Give up. */