[LinuxPPS] refclock_nmea patch

Rodolfo Giometti giometti at enneenne.com
Mon Oct 22 20:12:48 CEST 2007


On Mon, Oct 22, 2007 at 07:43:33PM +0200, Udo van den Heuvel wrote:

> id was in the old syslog messages. Do we lose functionality if I remove
> the id variable?

No.

> > Ok, you are very near to the final patch! :)
> 
> I dared to test the previous version:
> 
> Oct 22 19:19:53 epia ntpd[3498]: ntpd 4.2.4p2 at 1.1495-o Sun Oct 21
> 12:07:11 UTC 2007 (1)
> Oct 22 19:19:53 epia ntpd[3499]: precision = 1.000 usec
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #0 wildcard,
> 0.0.0.0#123 Disabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #1 wildcard,
> ::#123 Disabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #2 sit0,
> ::192.168.10.98#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #3 lo, ::1#123
> Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #4 sit0,
> ::10.0.0.150#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #5 eth1,
> fe80::240:63ff:fee9:176d#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #6 sit0,
> ::127.0.0.1#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #7 eth0,
> fe80::240:63ff:fee9:176c#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #8 eth0,
> 192.168.10.98#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #9 eth1,
> 10.0.0.150#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #10 lo,
> 127.0.0.1#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: Listening on interface #11 ppp0,
> 82.92.197.115#123 Enabled
> Oct 22 19:19:53 epia ntpd[3499]: kernel time sync status 0040
> Oct 22 19:19:53 epia ntpd[3499]: refclock_nmea: try alternate PPS device
> /dev/pps0
> Oct 22 19:19:53 epia ntpd[3499]: refclock_nmea: found PPS source
> "/dev/pps%d" at id #6 on ""
> Oct 22 19:19:53 epia ntpd[3499]: refclock_nmea: time_pps_kcbind failed:
> Operation not supported
> Oct 22 19:19:53 epia ntpd[3499]: refclock_atom: time_pps_kcbind failed:
> Operation not supported
> Oct 22 19:19:53 epia ntpd[3499]: frequency initialized -114.295 PPM from
> /var/lib/ntp/drift
> Oct 22 19:20:46 epia ntpd[3499]: time reset +0.202196 s
> Oct 22 19:20:46 epia ntpd[3499]: kernel time sync status change 0001
> 
> Note the %d in the message string and that the first gps0 device is not
> used. %d was fixed with your suggestion.

Good.

> /dev/gps0 points to /dev/ttyS0. Is the fd still open when it reaches the
> LinuxPPS part that we change? Maybe reopen the fd?

No, the fd is opened since it is passed to the first
pps_time_create().

> I see:
> 
> [root at epia ntpd]# setserial /dev/ttyS0
> /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4, Flags: hardpps low_latency
> [root at epia ntpd]# setserial /dev/gps0
> /dev/gps0, UART: 16550A, Port: 0x03f8, IRQ: 4, Flags: hardpps low_latency

Are yo uusing patched setserial? If so I don't see the hardpps
flag. Did you run:

   # setserial /dev/gps0 hardpps 

> [root at epia ntpd]# setserial /dev/pps0

Why do you use setserial on /dev/pps0?

> [root at epia ntpd]# ls -l /dev/?ps0
> lrwxrwxrwx 1 root root     10 2007-10-22 19:17 /dev/gps0 -> /dev/ttyS0
> crw------- 1 root root 254, 0 2007-10-22 19:17 /dev/pps0
> [root at epia ntpd]# ls -l /dev/ttyS0
> crw-rw---- 1 root uucp 4, 64 2007-10-22 19:36 /dev/ttyS0
> 
> Any ideas!?

About what?

> and:
> 
> #  ntpq -pn
>      remote           refid      st t when poll reach   delay   offset
> jitter
> ==============================================================================
>  127.127.1.0     .LOCL.          10 l   45   64   17    0.000    0.000
>  0.001
> +127.127.20.0    .GPS.            0 l   15   16  377    0.000    5.161
>  0.833
> o127.127.22.0    .PPS.            0 l   11   16  377    0.000    5.198
>  0.881
> x194.109.22.18   193.79.237.14    2 u   40   64   17    7.679    0.734
>  2.499
>  213.84.46.114   130.149.17.8     2 u   60   64   17   15.933    7.398
>  2.503
>  80.85.129.25    130.235.20.3     3 u   13   64   17   11.608    6.658
>  1.764
>  213.249.66.35   193.190.230.65   2 u   29   64   17    8.687    5.542
>  2.941
>  83.81.175.82    130.149.17.8     2 u   64   64   17   18.075    5.007
>  2.510
>  81.19.16.225    .STEP.          16 u    -   64    0    0.000    0.000
>  0.000
> +85.91.1.164     193.120.10.3     2 u    2   64   37   27.219    4.832
>  2.343
>  62.84.188.34    193.67.79.202    2 u    2   64   37   15.396    1.178
>  2.488
> 
> So looks reasonable for this short run?
> BTW: I did not change the PPS driver patch but it runs!?

I never said that it was not functional, just said it was not correct. :)

> --- org.ntp-4.2.4p2/ntpd/refclock_nmea.c	2006-06-06 22:16:53.000000000 +0200
> +++ ntp-4.2.4p2/ntpd/refclock_nmea.c	2007-10-22 19:35:33.000000000 +0200
> @@ -61,6 +61,7 @@
>  # define DEVICE "COM%d:" 	/* COM 1 - 3 supported */
>  #else
>  # define DEVICE	"/dev/gps%d"	/* name of radio device */
> +# define DEVICEPPS "/dev/pps%d" /* name of alternate PPS radio device */
>  #endif
>  #define	SPEED232	B4800	/* uart speed (4800 bps) */
>  #define	PRECISION	(-9)	/* precision assumed (about 2 ms) */
> @@ -71,6 +72,7 @@
>  #define RANGEGATE	500000	/* range gate (ns) */
>  
>  #define LENNMEA		75	/* min timecode length */
> +#define LENPPS		PPS_MAX_NAME_LEN
>  
>  /*
>   * Tables to compute the ddd of year form icky dd/mm timecode. Viva la
> @@ -231,15 +233,27 @@
>  	 * the assert edge and do not enable the kernel hardpps.
>  	 */
>  	if (time_pps_create(fd, &up->handle) < 0) {
> -		up->handle = 0;
> -		msyslog(LOG_ERR,
> -		    "refclock_nmea: time_pps_create failed: %m");
> -		return (1);
> +		/* Try the alternare PPS device */
> +                (void) sprintf(device, DEVICEPPS, unit);
> +		msyslog(LOG_ERR, "refclock_nmea: try alternate PPS device %s", device);
> +                fd = open(device, O_RDWR);
> +                if (fd < 0)
> +                	goto pps_error;
> +		if (time_pps_create(fd, &up->handle) < 0)
> +               		goto pps_error;
>  	}
> +	else (void) sprintf(device, DEVICE, unit); /* just rebuild device's name */
> +	msyslog(LOG_INFO, "refclock_nmea: found PPS source \"%s\" at id #%d", device , fd);

Why do you still wish using "at id #%d"? Just use:

+     msyslog(LOG_INFO, "refclock_nmea: found PPS source \"%s\"", device)

instead. "fd" is just a file descriptor with no meaning for the user.

>  	return(nmea_ppsapi(peer, 0, 0));
> -#else
> +#else /* HAVE_PPSAPI */

If the original author didn't use it, you shouldn't change it.

>  	return (1);
>  #endif /* HAVE_PPSAPI */
> +
> +pps_error:
> +	/* No luck, no PPS unit available! */
> +	up->handle = -1;
> +	msyslog(LOG_ERR, "refclock_nmea: no PPS devices found at " DEVICE " nor " DEVICEPPS ": %m", unit, unit);
> +	return (1);
>  }
>  
>  /*
> @@ -257,8 +271,7 @@
>  	pp = peer->procptr;
>  	up = (struct nmeaunit *)pp->unitptr;
>  #ifdef HAVE_PPSAPI
> -	if (up->handle != 0)
> -		time_pps_destroy(up->handle);
> +	time_pps_destroy(up->handle);
>  #endif /* HAVE_PPSAPI */
>  	io_closeclock(&pp->io);
>  	free(up);
> @@ -366,7 +379,7 @@
>  	/*
>  	 * Convert the timespec nanoseconds field to ntp l_fp units.
>  	 */ 
> -	if (up->handle == 0)
> +	if (up->handle == -1)
>  		return (0);
>  	timeout.tv_sec = 0;
>  	timeout.tv_nsec = 0;

Great job! Just fix these few errors and you may submit your patch to
the NTPD mail list for inclusion! :)

Whae you do it please keep in mind that:

1) this patch is not to add LinuxPPS support, but just to _correctly_
support a PPS device which could be different from the GPS data
source.

You may refere this thread:
http://ml.enneenne.com/pipermail/linuxpps/2007-August/001011.html

2) in the message which you use to post your patch, please refere to
this mail list but don't put it in Cc otherwise non members cannot
replay to your post.

Thanks for your help,

Rodolfo

-- 

GNU/Linux Solutions                  e-mail:    giometti at enneenne.com
Linux Device Driver                             giometti at gnudd.com
Embedded Systems                     		giometti at linux.it
UNIX programming                     phone:     +39 349 2432127



More information about the LinuxPPS mailing list