public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Alexander Gordeev <lasaine@lvk.cs.msu.su>
To: Rodolfo Giometti <giometti@linux.it>
Cc: linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Dave Jones <davej@redhat.com>, Sam Ravnborg <sam@ravnborg.org>,
	Greg KH <greg@kroah.com>, Randy Dunlap <randy.dunlap@oracle.com>,
	Kay Sievers <kay.sievers@vrfy.org>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Michael Kerrisk <mtk.manpages@gmail.com>,
	Christoph Hellwig <hch@infradead.org>,
	Rodolfo Giometti <giometti@linux.it>
Subject: Re: [PATCH 1/8] pps: userland header file for PPS API.
Date: Tue, 16 Feb 2010 15:33:01 +0300	[thread overview]
Message-ID: <20100216153301.534f2722@desktopvm.lvknet> (raw)
In-Reply-To: <1266313885-1195-2-git-send-email-giometti@linux.it>

[-- Attachment #1: Type: text/plain, Size: 7738 bytes --]

Hi Rodolfo,

On Tue, 16 Feb 2010 10:51:18 +0100
Rodolfo Giometti <giometti@linux.it> wrote:

> 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. :)

Isn't libc a proper place for this file? This header file provides a
generic standardized interface (PPSAPI) to the custom Linux
implementation (linux/pps.h). I think this is just what libc is for.

I wanted to file a bug in Debian BTS last week to add this header to
libc6-dev package and also push it upstream but something distracted
me. If you agree that the header should be in libc then I can do it now.

> Signed-off-by: Rodolfo Giometti <giometti@linux.it>
> ---
>  Documentation/pps/timepps.h |  198
> +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 198
> 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..d2628d2
> --- /dev/null
> +++ b/Documentation/pps/timepps.h
> @@ -0,0 +1,198 @@
> +/*
> + * timepps.h -- PPS API main header
> + *
> + * Copyright (C) 2005-2007   Rodolfo Giometti <giometti@linux.it>
> + *
> + *   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 <errno.h>
> +#include <sys/time.h>
> +#include <sys/ioctl.h>
> +#include <linux/types.h>
> +#include <linux/pps.h>
> +
> +#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;
> +	struct pps_kparams dummy;
> +
> +	if (!handle) {
> +		errno = EINVAL;
> +		return -1;
> +	}
> +
> +	/* First we check if current device is a valid PPS one by
> +	 * doing a dummy PPS_GETPARAMS...
> +	 */
> +	ret = ioctl(source, PPS_GETPARAMS, &dummy);
> +	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_ */


-- 
  Alexander

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 489 bytes --]

  parent reply	other threads:[~2010-02-16 12:33 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-16  9:51 LinuxPPS new functionalities Rodolfo Giometti
2010-02-16  9:51 ` [PATCH 1/8] pps: userland header file for PPS API Rodolfo Giometti
2010-02-16  9:51   ` [PATCH 2/8] pps: documentation programs and examples Rodolfo Giometti
2010-02-16  9:51     ` [PATCH 3/8] pps: LinuxPPS clients support Rodolfo Giometti
2010-02-16  9:51       ` [PATCH 4/8] ldisc: new dcd_change() method for line disciplines Rodolfo Giometti
2010-02-16  9:51         ` [PATCH 5/8] ldisc n_tty: add new method n_tty_inherit_ops() Rodolfo Giometti
2010-02-16  9:51           ` [PATCH 6/8] pps: serial clients support Rodolfo Giometti
2010-02-16  9:51             ` [PATCH 7/8] serial 8250: enable PPS support Rodolfo Giometti
2010-02-16  9:51               ` [PATCH 8/8] serial amba-pl010: " Rodolfo Giometti
2010-02-19 21:53             ` [PATCH 6/8] pps: serial clients support Andrew Morton
2010-02-21 19:21               ` Rodolfo Giometti
2010-02-19 21:45           ` [PATCH 5/8] ldisc n_tty: add new method n_tty_inherit_ops() Andrew Morton
2010-02-16 12:44     ` [PATCH 2/8] pps: documentation programs and examples Alexander Gordeev
2010-02-16 13:56       ` Rodolfo Giometti
2010-02-16 12:33   ` Alexander Gordeev [this message]
2010-02-16 13:53     ` [PATCH 1/8] pps: userland header file for PPS API Rodolfo Giometti
2010-02-16 12:28 ` LinuxPPS new functionalities Alan Cox

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100216153301.534f2722@desktopvm.lvknet \
    --to=lasaine@lvk.cs.msu.su \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=davej@redhat.com \
    --cc=dwmw2@infradead.org \
    --cc=giometti@linux.it \
    --cc=greg@kroah.com \
    --cc=hch@infradead.org \
    --cc=hpa@zytor.com \
    --cc=kay.sievers@vrfy.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=mtk.manpages@gmail.com \
    --cc=randy.dunlap@oracle.com \
    --cc=sam@ravnborg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox