hardpps() jitter detection

From: Sebastian Huber <sebastian.huber_at_embedded-brains.de>
Date: Wed, 25 Jan 2023 14:19:02 UTC
Hello,

I have a question related to the hardpps() jitter detection. We have 
currently this code:

void
hardpps(struct timespec *tsp, long nsec)
{
	long u_sec, u_nsec, v_nsec; /* temps */
	l_fp ftemp;

	NTP_LOCK();

	/*
	 * The signal is first processed by a range gate and frequency
	 * discriminator. The range gate rejects noise spikes outside
	 * the range +-500 us. The frequency discriminator rejects input
	 * signals with apparent frequency outside the range 1 +-500
	 * PPM. If two hits occur in the same second, we ignore the
	 * later hit; if not and a hit occurs outside the range gate,
	 * keep the later hit for later comparison, but do not process
	 * it.
	 */
	time_status |= STA_PPSSIGNAL | STA_PPSJITTER;
	time_status &= ~(STA_PPSWANDER | STA_PPSERROR);
	pps_valid = PPS_VALID;
	u_sec = tsp->tv_sec;
	u_nsec = tsp->tv_nsec;
	if (u_nsec >= (NANOSECOND >> 1)) {
		u_nsec -= NANOSECOND;
		u_sec++;
	}
	v_nsec = u_nsec - pps_tf[0].tv_nsec;
	if (u_sec == pps_tf[0].tv_sec && v_nsec < NANOSECOND - MAXFREQ)
		goto out;
	pps_tf[2] = pps_tf[1];
	pps_tf[1] = pps_tf[0];
	pps_tf[0].tv_sec = u_sec;
	pps_tf[0].tv_nsec = u_nsec;

	/*
	 * Compute the difference between the current and previous
	 * counter values. If the difference exceeds 0.5 s, assume it
	 * has wrapped around, so correct 1.0 s. If the result exceeds
	 * the tick interval, the sample point has crossed a tick
	 * boundary during the last second, so correct the tick. Very
	 * intricate.
	 */
	u_nsec = nsec;
	if (u_nsec > (NANOSECOND >> 1))
		u_nsec -= NANOSECOND;
	else if (u_nsec < -(NANOSECOND >> 1))
		u_nsec += NANOSECOND;
	pps_fcount += u_nsec;
	if (v_nsec > MAXFREQ || v_nsec < -MAXFREQ)
		goto out;
	time_status &= ~STA_PPSJITTER;

The v_nsec value is used to reject a sample if the time difference is 
out of range. The v_nsec value is computed using the current time at the 
PPS event (tsp) and the time at the previous PPS event (pps_tf[0]). 
These time points are measured by a clock which is adjusted by the 
hardpps() outputs. Wouldn't it be better to use the uncontrolled input 
value (nsec) for the jitter detection? This is how Linux does it:

https://github.com/torvalds/linux/blob/master/kernel/time/ntp.c#L1055

Is this maybe a typo, and the

	if (v_nsec > MAXFREQ || v_nsec < -MAXFREQ)

should be

	if (u_nsec > MAXFREQ || u_nsec < -MAXFREQ)

?

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/