lkml.org 
[lkml]   [2008]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] LinuxPPS core support.
    On Tue, 19 Feb 2008 00:28:33 +0100 Rodolfo Giometti wrote:

    > This patch adds the kernel side of the PPS support currently named
    > "LinuxPPS".
    >
    > PPS means "pulse per second" and a PPS source is just a device which
    > provides a high precision signal each second so that an application
    > can use it to adjust system clock time.
    >
    > Common use is the combination of the NTPD as userland program with a
    > GPS receiver as PPS source to obtain a wallclock-time with
    > sub-millisecond synchronisation to UTC.

    Hi,
    I'm mostly reading documentation and Kconfig/Makefiles...

    > To obtain this goal the userland programs shoud use the PPS API
    > specification (RFC 2783 - Pulse-Per-Second API for UNIX-like Operating
    > Systems, Version 1.0) which in part is implemented by this patch. It
    > provides a set of chars devices, one per PPS source, which can be used
    > to get the time signal. The RFC's functions can be implemented by
    > accessing to these char devices.
    >
    > Signed-off-by: Rodolfo Giometti <giometti@linux.it>
    > ---
    > Documentation/ABI/testing/sysfs-pps | 73 ++++++++
    > Documentation/pps/pps.txt | 170 +++++++++++++++++
    > MAINTAINERS | 7 +
    > drivers/Kconfig | 2 +
    > drivers/Makefile | 1 +
    > drivers/pps/Kconfig | 32 ++++
    > drivers/pps/Makefile | 8 +
    > drivers/pps/kapi.c | 272 ++++++++++++++++++++++++++++
    > drivers/pps/pps.c | 342 +++++++++++++++++++++++++++++++++++
    > drivers/pps/sysfs.c | 130 +++++++++++++
    > include/linux/Kbuild | 1 +
    > include/linux/pps.h | 204 +++++++++++++++++++++
    > 12 files changed, 1242 insertions(+), 0 deletions(-)
    > create mode 100644 Documentation/ABI/testing/sysfs-pps
    > create mode 100644 Documentation/pps/pps.txt
    > create mode 100644 drivers/pps/Kconfig
    > create mode 100644 drivers/pps/Makefile
    > create mode 100644 drivers/pps/kapi.c
    > create mode 100644 drivers/pps/pps.c
    > create mode 100644 drivers/pps/sysfs.c
    > create mode 100644 include/linux/pps.h
    >
    > diff --git a/Documentation/pps/pps.txt b/Documentation/pps/pps.txt
    > new file mode 100644
    > index 0000000..2af58bd
    > --- /dev/null
    > +++ b/Documentation/pps/pps.txt
    > @@ -0,0 +1,170 @@
    > +
    > + PPS - Pulse Per Second
    > + ----------------------
    > +

    ...

    > +
    > +
    > +Coding example
    > +--------------
    > +
    > +To register a PPS source into the kernel you should define a struct
    > +pps_source_info_s as follow:
    > +
    > + static struct pps_source_info_s pps_ktimer_info = {
    > + .name = "ktimer",
    > + .path = "",
    > + .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
    > + PPS_ECHOASSERT | \
    > + PPS_CANWAIT | PPS_TSFMT_TSPEC,
    > + .echo = pps_ktimer_echo,
    > + .owner = THIS_MODULE,
    > + };

    Oops, bad struct name "pps_source_info_s". What's that trailing _s
    doing there? We already know that it's a struct, so it must be
    something else. :)
    We don't add such trailing (or leading) type/struct indicators in Linux.

    > +
    > +and then calling the function pps_register_source() in your
    > +intialization routine as follow:
    > +
    > + source = pps_register_source(&pps_ktimer_info,
    > + PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
    > +
    > +The pps_register_source() prototype is:
    > +
    > + int pps_register_source(struct pps_source_info_s *info, int default_params)
    > +
    > +where "info" is a pointer to a structure that describes a particular
    > +PPS source, "default_params" tells the system what the initial default
    > +parameters for the device should be (is obvious that these parameters
    > +must be a subset of ones defined into the struct
    > +pps_source_info_s which describe the capabilities of the driver).
    > +
    > +Once you have registered a new PPS source into the system you can
    > +signal an assert event (for example in the interrupt handler routine)
    > +just using:
    > +
    > + pps_event(source, PPS_CAPTUREASSERT, ptr);
    > +
    > +The same function may also run the defined echo function
    > +(pps_ktimer_echo(), passing to it the "ptr" pointer) if the user
    > +asked for that... etc..
    > +
    > +Please see the file drivers/pps/clients/ktimer.c for an example code.

    Drop "an".


    > diff --git a/drivers/pps/Kconfig b/drivers/pps/Kconfig
    > new file mode 100644
    > index 0000000..dce4a1f
    > --- /dev/null
    > +++ b/drivers/pps/Kconfig
    > @@ -0,0 +1,32 @@
    > +#
    > +# PPS support configuration
    > +#
    > +
    > +menu "PPS support"
    > +
    > +config PPS
    > + tristate "PPS support"
    > + depends on EXPERIMENTAL
    > + ---help---
    > + PPS (Pulse Per Second) is a special pulse provided by some GPS
    > + antennae. Userland can use it to get an high time reference.

    s/an/a/

    "high time reference": maybe a "high-resolution time reference"?
    or "high-precision time reference"?
    Just having "high time reference" is missing something...

    > +
    > + Some antennae's PPS signals are connected with the CD (Carrier
    > + Detect) pin of the serial line they use to communicate with the
    > + host. In this case use the SERIAL_LINE client support.
    > +
    > + Some antennae's PPS signals are connected with some special host
    > + inputs so you have to enable the corresponding client support.
    > +
    > + To compile this driver as a module, choose M here: the module
    > + will be called pps_core.ko.
    > +
    > +config PPS_DEBUG
    > + bool "PPS debugging messages"
    > + depends on PPS
    > + help
    > + Say Y here if you want the PPS support to produce a bunch of debug
    > + messages to the system log. Select this if you are having a
    > + problem with PPS support and want to see more of what is going on.
    > +
    > +endmenu

    > diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
    > new file mode 100644
    > index 0000000..b3b9af8
    > --- /dev/null
    > +++ b/drivers/pps/pps.c
    > @@ -0,0 +1,342 @@
    > +/*
    > + * pps.c -- Main PPS support file
    > + *

    ...

    > +/*
    > + * Module staff

    stuff

    > + */

    > diff --git a/include/linux/pps.h b/include/linux/pps.h
    > new file mode 100644
    > index 0000000..5a86109
    > --- /dev/null
    > +++ b/include/linux/pps.h
    > @@ -0,0 +1,204 @@

    > +#define PPS_CHECK _IO('P', 0)
    > +#define PPS_GETPARAMS _IOR('P', 1, struct pps_kparams *)
    > +#define PPS_SETPARAMS _IOW('P', 2, struct pps_kparams *)
    > +#define PPS_GETCAP _IOR('P', 3, int *)
    > +#define PPS_FETCH _IOWR('P', 4, struct pps_fdata *)

    Did you add any line(s) to Documentation/ioctl-number.txt ?
    If not, please do so.

    > +#ifdef __KERNEL__
    > +
    > +#include <linux/cdev.h>
    > +#include <linux/device.h>
    > +
    > +#define PPS_VERSION "5.0.0"
    > +#define PPS_MAX_SOURCES 16 /* should be enought... */

    s/enought/enough/

    ---
    ~Randy


    \
     
     \ /
      Last update: 2008-02-19 01:07    [W:0.038 / U:0.820 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site