[PATCH 2/7] PPS: userland header file for PPS API. - Kernel

This is a discussion on [PATCH 2/7] PPS: userland header file for PPS API. - Kernel ; This patch adds into the PPS's documentation directory a possible implementation of the PPS API (RFC 2783) by using the LinuxPPS's char devices. This file is not just an example but it can be used into real systems. Signed-off-by: Rodolfo ...

+ Reply to Thread
Results 1 to 2 of 2

Thread: [PATCH 2/7] PPS: userland header file for PPS API.

  1. [PATCH 2/7] PPS: userland header file for PPS API.

    This patch adds into the PPS's documentation directory a possible
    implementation of the PPS API (RFC 2783) by using the LinuxPPS's char
    devices.

    This file is not just an example but it can be used into real
    systems.

    Signed-off-by: Rodolfo Giometti
    ---
    Documentation/pps/timepps.h | 195 +++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 195 insertions(+), 0 deletions(-)
    create mode 100644 Documentation/pps/timepps.h

    diff --git a/Documentation/pps/timepps.h b/Documentation/pps/timepps.h
    new file mode 100644
    index 0000000..2372949
    --- /dev/null
    +++ b/Documentation/pps/timepps.h
    @@ -0,0 +1,195 @@
    +/*
    + * timepps.h -- PPS API main header
    + *
    + * Copyright (C) 2005-2007 Rodolfo Giometti
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License as published by
    + * the Free Software Foundation; either version 2 of the License, or
    + * (at your option) any later version.
    + *
    + * This program is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    + * GNU General Public License for more details.
    + *
    + * You should have received a copy of the GNU General Public License
    + * along with this program; if not, write to the Free Software
    + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    + */
    +
    +#ifndef _SYS_TIMEPPS_H_
    +#define _SYS_TIMEPPS_H_
    +
    +#include
    +#include
    +#include
    +#include
    +
    +#define LINUXPPS 1 /* signal we are using LinuxPPS */
    +
    +/*
    + * New data structures
    + */
    +
    +struct ntp_fp {
    + unsigned int integral;
    + unsigned int fractional;
    +};
    +
    +union pps_timeu {
    + struct timespec tspec;
    + struct ntp_fp ntpfp;
    + unsigned long longpad[3];
    +};
    +
    +struct pps_info {
    + unsigned long assert_sequence; /* seq. num. of assert event */
    + unsigned long clear_sequence; /* seq. num. of clear event */
    + union pps_timeu assert_tu; /* time of assert event */
    + union pps_timeu clear_tu; /* time of clear event */
    + int current_mode; /* current mode bits */
    +};
    +
    +struct pps_params {
    + int api_version; /* API version # */
    + int mode; /* mode bits */
    + union pps_timeu assert_off_tu; /* offset compensation for assert */
    + union pps_timeu clear_off_tu; /* offset compensation for clear */
    +};
    +
    +typedef int pps_handle_t; /* represents a PPS source */
    +typedef unsigned long pps_seq_t; /* sequence number */
    +typedef struct ntp_fp ntp_fp_t; /* NTP-compatible time stamp */
    +typedef union pps_timeu pps_timeu_t; /* generic data type for time stamps */
    +typedef struct pps_info pps_info_t;
    +typedef struct pps_params pps_params_t;
    +
    +#define assert_timestamp assert_tu.tspec
    +#define clear_timestamp clear_tu.tspec
    +
    +#define assert_timestamp_ntpfp assert_tu.ntpfp
    +#define clear_timestamp_ntpfp clear_tu.ntpfp
    +
    +#define assert_offset assert_off_tu.tspec
    +#define clear_offset clear_off_tu.tspec
    +
    +#define assert_offset_ntpfp assert_off_tu.ntpfp
    +#define clear_offset_ntpfp clear_off_tu.ntpfp
    +
    +/*
    + * The PPS API
    + */
    +
    +static __inline int time_pps_create(int source, pps_handle_t *handle)
    +{
    + int ret;
    +
    + if (!handle) {
    + errno = EINVAL;
    + return -1;
    + }
    +
    + /* First we check if current device is a PPS valid PPS one...
    + */
    + ret = ioctl(source, PPS_CHECK);
    + if (ret) {
    + errno = EOPNOTSUPP;
    + return -1;
    + }
    +
    + /* ... then since in LinuxPPS there are no differences between a
    + * "PPS source" and a "PPS handle", we simply return the same value.
    + */
    + *handle = source;
    +
    + return 0;
    +}
    +
    +static __inline int time_pps_destroy(pps_handle_t handle)
    +{
    + return close(handle);
    +}
    +
    +static __inline int time_pps_getparams(pps_handle_t handle,
    + pps_params_t *ppsparams)
    +{
    + int ret;
    + struct pps_kparams __ppsparams;
    +
    + ret = ioctl(handle, PPS_GETPARAMS, &__ppsparams);
    +
    + ppsparams->api_version = __ppsparams.api_version;
    + ppsparams->mode = __ppsparams.mode;
    + ppsparams->assert_off_tu.tspec.tv_sec = __ppsparams.assert_off_tu.sec;
    + ppsparams->assert_off_tu.tspec.tv_nsec = __ppsparams.assert_off_tu.nsec;
    + ppsparams->clear_off_tu.tspec.tv_sec = __ppsparams.clear_off_tu.sec;
    + ppsparams->clear_off_tu.tspec.tv_nsec = __ppsparams.clear_off_tu.nsec;
    +
    + return ret;
    +}
    +
    +static __inline int time_pps_setparams(pps_handle_t handle,
    + const pps_params_t *ppsparams)
    +{
    + struct pps_kparams __ppsparams;
    +
    + __ppsparams.api_version = ppsparams->api_version;
    + __ppsparams.mode = ppsparams->mode;
    + __ppsparams.assert_off_tu.sec = ppsparams->assert_off_tu.tspec.tv_sec;
    + __ppsparams.assert_off_tu.nsec = ppsparams->assert_off_tu.tspec.tv_nsec;
    + __ppsparams.clear_off_tu.sec = ppsparams->clear_off_tu.tspec.tv_sec;
    + __ppsparams.clear_off_tu.nsec = ppsparams->clear_off_tu.tspec.tv_nsec;
    +
    + return ioctl(handle, PPS_SETPARAMS, &__ppsparams);
    +}
    +
    +/* Get capabilities for handle */
    +static __inline int time_pps_getcap(pps_handle_t handle, int *mode)
    +{
    + return ioctl(handle, PPS_GETCAP, mode);
    +}
    +
    +static __inline int time_pps_fetch(pps_handle_t handle, const int tsformat,
    + pps_info_t *ppsinfobuf,
    + const struct timespec *timeout)
    +{
    + struct pps_fdata __fdata;
    + int ret;
    +
    + /* Sanity checks */
    + if (tsformat != PPS_TSFMT_TSPEC) {
    + errno = EINVAL;
    + return -1;
    + }
    +
    + if (timeout) {
    + __fdata.timeout.sec = timeout->tv_sec;
    + __fdata.timeout.nsec = timeout->tv_nsec;
    + __fdata.timeout.flags = ~PPS_TIME_INVALID;
    + } else
    + __fdata.timeout.flags = PPS_TIME_INVALID;
    +
    + ret = ioctl(handle, PPS_FETCH, &__fdata);
    +
    + ppsinfobuf->assert_sequence = __fdata.info.assert_sequence;
    + ppsinfobuf->clear_sequence = __fdata.info.clear_sequence;
    + ppsinfobuf->assert_tu.tspec.tv_sec = __fdata.info.assert_tu.sec;
    + ppsinfobuf->assert_tu.tspec.tv_nsec = __fdata.info.assert_tu.nsec;
    + ppsinfobuf->clear_tu.tspec.tv_sec = __fdata.info.clear_tu.sec;
    + ppsinfobuf->clear_tu.tspec.tv_nsec = __fdata.info.clear_tu.nsec;
    + ppsinfobuf->current_mode = __fdata.info.current_mode;
    +
    + return ret;
    +}
    +
    +static __inline int time_pps_kcbind(pps_handle_t handle,
    + const int kernel_consumer,
    + const int edge, const int tsformat)
    +{
    + /* LinuxPPS doesn't implement kernel consumer feature */
    + errno = EOPNOTSUPP;
    + return -1;
    +}
    +
    +#endif /* _SYS_TIMEPPS_H_ */
    --
    1.5.4.3

    --
    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/

  2. [PATCH 4/7] PPS: LinuxPPS clients support.

    Each PPS source can be registered/deregistered into the system by
    using special modules called "clients". They simply define the PPS
    sources' attributes and implement the time signal registartion
    mechanism.

    This patch adds a special directory for such clients and adds a dummy
    client that can be useful to test system integrity on real systems.

    Signed-off-by: Rodolfo Giometti
    ---
    drivers/pps/Kconfig | 2 +
    drivers/pps/Makefile | 1 +
    drivers/pps/clients/Kconfig | 18 +++++++
    drivers/pps/clients/Makefile | 9 +++
    drivers/pps/clients/ktimer.c | 114 ++++++++++++++++++++++++++++++++++++++++++
    5 files changed, 144 insertions(+), 0 deletions(-)
    create mode 100644 drivers/pps/clients/Kconfig
    create mode 100644 drivers/pps/clients/Makefile
    create mode 100644 drivers/pps/clients/ktimer.c

    diff --git a/drivers/pps/Kconfig b/drivers/pps/Kconfig
    index cc2eb8e..1afe4e0 100644
    --- a/drivers/pps/Kconfig
    +++ b/drivers/pps/Kconfig
    @@ -30,4 +30,6 @@ config PPS_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.

    +source drivers/pps/clients/Kconfig
    +
    endmenu
    diff --git a/drivers/pps/Makefile b/drivers/pps/Makefile
    index 19ea582..98960dd 100644
    --- a/drivers/pps/Makefile
    +++ b/drivers/pps/Makefile
    @@ -4,5 +4,6 @@

    pps_core-y := pps.o kapi.o sysfs.o
    obj-$(CONFIG_PPS) := pps_core.o
    +obj-y += clients/

    ccflags-$(CONFIG_PPS_DEBUG) := -DDEBUG
    diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
    new file mode 100644
    index 0000000..60b83be
    --- /dev/null
    +++ b/drivers/pps/clients/Kconfig
    @@ -0,0 +1,18 @@
    +#
    +# PPS clients configuration
    +#
    +
    +if PPS
    +
    +comment "PPS clients support"
    +
    +config PPS_CLIENT_KTIMER
    + tristate "Kernel timer client (Testing client, use for debug)"
    + help
    + If you say yes here you get support for a PPS debugging client
    + which uses a kernel timer to generate the PPS signal.
    +
    + This driver can also be built as a module. If so, the module
    + will be called ktimer.ko.
    +
    +endif
    diff --git a/drivers/pps/clients/Makefile b/drivers/pps/clients/Makefile
    new file mode 100644
    index 0000000..f3c1e39
    --- /dev/null
    +++ b/drivers/pps/clients/Makefile
    @@ -0,0 +1,9 @@
    +#
    +# Makefile for PPS clients.
    +#
    +
    +obj-$(CONFIG_PPS_CLIENT_KTIMER) += ktimer.o
    +
    +ifeq ($(CONFIG_PPS_DEBUG),y)
    +EXTRA_CFLAGS += -DDEBUG
    +endif
    diff --git a/drivers/pps/clients/ktimer.c b/drivers/pps/clients/ktimer.c
    new file mode 100644
    index 0000000..5845188
    --- /dev/null
    +++ b/drivers/pps/clients/ktimer.c
    @@ -0,0 +1,114 @@
    +/*
    + * ktimer.c -- kernel timer test client
    + *
    + *
    + * Copyright (C) 2005-2006 Rodolfo Giometti
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License as published by
    + * the Free Software Foundation; either version 2 of the License, or
    + * (at your option) any later version.
    + *
    + * This program is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    + * GNU General Public License for more details.
    + *
    + * You should have received a copy of the GNU General Public License
    + * along with this program; if not, write to the Free Software
    + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    + */
    +
    +
    +#include
    +#include
    +#include
    +#include
    +#include
    +
    +#include
    +
    +/*
    + * Global variables
    + */
    +
    +static int source;
    +static struct timer_list ktimer;
    +
    +/*
    + * The kernel timer
    + */
    +
    +static void pps_ktimer_event(unsigned long ptr)
    +{
    + pr_info("PPS event at %lu\n", jiffies);
    +
    + pps_event(source, PPS_CAPTUREASSERT, NULL);
    +
    + mod_timer(&ktimer, jiffies + HZ);
    +}
    +
    +/*
    + * The echo function
    + */
    +
    +static void pps_ktimer_echo(int source, int event, void *data)
    +{
    + pr_info("echo %s %s for source %d\n",
    + event & PPS_CAPTUREASSERT ? "assert" : "",
    + event & PPS_CAPTURECLEAR ? "clear" : "",
    + source);
    +}
    +
    +/*
    + * The PPS info struct
    + */
    +
    +static struct pps_source_info 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,
    +};
    +
    +/*
    + * Module staff
    + */
    +
    +static void __exit pps_ktimer_exit(void)
    +{
    + del_timer_sync(&ktimer);
    + pps_unregister_source(source);
    +
    + pr_info("ktimer PPS source unregistered\n");
    +}
    +
    +static int __init pps_ktimer_init(void)
    +{
    + int ret;
    +
    + ret = pps_register_source(&pps_ktimer_info,
    + PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
    + if (ret < 0) {
    + printk(KERN_ERR "cannot register ktimer source\n");
    + return ret;
    + }
    + source = ret;
    +
    + setup_timer(&ktimer, pps_ktimer_event, 0);
    + mod_timer(&ktimer, jiffies + HZ);
    +
    + pr_info("ktimer PPS source registered at %d\n", source);
    +
    + return 0;
    +}
    +
    +module_init(pps_ktimer_init);
    +module_exit(pps_ktimer_exit);
    +
    +MODULE_AUTHOR("Rodolfo Giometti ");
    +MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)");
    +MODULE_LICENSE("GPL");
    --
    1.5.4.3

    --
    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/

+ Reply to Thread