lkml.org 
[lkml]   [2007]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/1] LinuxPPS: Pulse per Second support for Linux
    On Tue, Mar 13, 2007 at 06:48:17PM -0400, Lennart Sorensen wrote:
    >
    > I have tried out 3.0.0-rc2 which seems to work pretty well so far (when

    Thanks. I just posted to the linux kernel ML the last release
    3.0.0. Maybe you can do a "git pull" and try it out. :)

    > combined with the patches to the jsm driver I just posted). It took soe
    > work to get ntp's refclock_nmea to work though, since the patch that is
    > linked to from the linuxpps page seems out of date. Here is the patch
    > that seems to be working for me, although I am still testing it. Given
    > you know the linuxpps code better perhaps you can see if it looks sane
    > to you.
    >
    > --- ntpd/refclock_nmea.c.ori 2007-03-13 18:38:01.000000000 -0400
    > +++ ntpd/refclock_nmea.c 2007-03-13 18:44:47.000000000 -0400
    > @@ -79,6 +79,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 +100,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 +149,11 @@
    > register struct nmeaunit *up;
    > struct refclockproc *pp;
    > int fd;
    > +#ifdef PPS_HAVE_FINDPATH
    > + char id[LENPPS] = "",
    > + path[LENPPS],
    > + mylink[LENPPS] = ""; /* just a default device */
    > +#endif /* PPS_HAVE_FINDPATH */
    > char device[20];
    >
    > /*
    > @@ -201,7 +208,20 @@
    > #else
    > return (0);
    > #endif
    > - }
    > + } else {
    > + struct serial_struct ss;
    > + if (ioctl(fd, TIOCGSERIAL, &ss) < 0 ||
    > + (
    > + ss.flags |= ASYNC_HARDPPS_CD,
    > + ioctl(fd, TIOCSSERIAL, &ss)) < 0) {
    > + msyslog(LOG_NOTICE, "refclock_nmea: TIOCSSERIAL fd %d, %m", fd);
    > + msyslog(LOG_NOTICE,
    > + "refclock_nmea: optional PPS processing not available");
    > + } else {
    > + msyslog(LOG_INFO,
    > + "refclock_nmea: PPS detection on");
    > + }
    > + }

    You should use "setserial" here. Keep in mind that the PPS source
    could be _not_ connected with the serial line at all.

    > /*
    > * Allocate and initialize unit structure
    > @@ -238,12 +258,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 */
    > + //time_pps_readlink(mylink, LENPPS, path, LENPPS);

    Remove unneeded code.

    > + time_pps_readlink(device, LENPPS, path, LENPPS);

    Test the return value (see the wiki at
    http://wiki.enneenne.com/index.php/LinuxPPS_support#How_to_modify_a_refclock_to_work_with_LinuxPPS).

    > + /* 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 +299,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 +410,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;

    Please, rewiev and test the code and I'll publish it.

    Ciao,

    Rodolfo

    --

    GNU/Linux Solutions e-mail: giometti@enneenne.com
    Linux Device Driver giometti@gnudd.com
    Embedded Systems giometti@linux.it
    UNIX programming phone: +39 349 2432127
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-03-14 10:35    [W:0.031 / U:31.792 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site