Well here is my current version of the refclock_nmea.c.patch for
LinuxPPS.  It now uses /dev/gps# for the nmea messages and /dev/pps# for
the PPS device (which in my case is of course the same device).  I am
running some more tests on it, but I think it is OK.

--- refclock_nmea.c.ori 2007-03-14 11:24:14.000000000 -0400
+++ refclock_nmea.c     2007-03-14 11:31:04.000000000 -0400
@@ -69,6 +69,7 @@
 # define DEVICE "COM%d:"       /* COM 1 - 3 supported */
 #else
 # define DEVICE        "/dev/gps%d"    /* name of radio device */
+# define PPSDEVICE     "/dev/pps%d"    /* name of pps device */
 #endif
 #define        SPEED232        B4800   /* uart speed (4800 bps) */
 #define        PRECISION       (-9)    /* precision assumed (about 2 ms) */
@@ -79,6 +80,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
@@ -99,6 +101,7 @@
        pps_params_t pps_params; /* pps parameters */
        pps_info_t pps_info;    /* last pps data */
        pps_handle_t handle;    /* pps handlebars */
+       int handle_created;     /* pps handle created flag */
 #endif /* HAVE_PPSAPI */
 };
 
@@ -147,6 +150,11 @@
        register struct nmeaunit *up;
        struct refclockproc *pp;
        int fd;
+#ifdef PPS_HAVE_FINDPATH
+       char id[LENPPS] = "",
+            path[LENPPS],
+            ppsdevice[LENPPS] = "";    /* just a default device */
+#endif /* PPS_HAVE_FINDPATH */
        char device[20];
 
        /*
@@ -238,12 +246,26 @@
         * Start the PPSAPI interface if it is there. Default to use
         * the assert edge and do not enable the kernel hardpps.
         */
+#ifdef PPS_HAVE_FINDPATH
+       /* Get the PPS source's real name */
+       (void)sprintf(ppsdevice, PPSDEVICE, unit);
+       time_pps_readlink(ppsdevice, LENPPS, path, LENPPS);
+
+       /* Try to find the source */
+       fd = time_pps_findpath(path, LENPPS, id, LENPPS);
+       if (fd < 0) {
+               msyslog(LOG_ERR, "refclock_nmea: cannot find PPS path \"%s\" in 
the system", path);
+               return (0);
+       }
+       msyslog(LOG_INFO, "refclock_nmea: found PPS source \"%s\" at id #%d on 
\"%s\"", path, fd, id);
+#endif /* PPS_HAVE_FINDPATH */
        if (time_pps_create(fd, &up->handle) < 0) {
-               up->handle = 0;
+               up->handle_created = 0;
                msyslog(LOG_ERR,
                    "refclock_nmea: time_pps_create failed: %m");
                return (1);
        }
+       up->handle_created = ~0;
        return(nmea_ppsapi(peer, 0, 0));
 #else
        return (1);
@@ -265,8 +287,10 @@
        pp = peer->procptr;
        up = (struct nmeaunit *)pp->unitptr;
 #ifdef HAVE_PPSAPI
-       if (up->handle != 0)
+       if (up->handle_created) {
                time_pps_destroy(up->handle);
+               up->handle_created = 0;
+       }
 #endif /* HAVE_PPSAPI */
        io_closeclock(&pp->io);
        free(up);
@@ -374,7 +398,7 @@
        /*
         * Convert the timespec nanoseconds field to ntp l_fp units.
         */ 
-       if (up->handle == 0)
+       if (!up->handle_created)
                return (0);
        timeout.tv_sec = 0;
        timeout.tv_nsec = 0;

--
Len Sorensen
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to