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 2/8] pps: documentation programs and examples.
Date: Tue, 16 Feb 2010 15:44:56 +0300 [thread overview]
Message-ID: <20100216154456.2cea05d2@desktopvm.lvknet> (raw)
In-Reply-To: <1266313885-1195-3-git-send-email-giometti@linux.it>
[-- Attachment #1: Type: text/plain, Size: 6755 bytes --]
On Tue, 16 Feb 2010 10:51:19 +0100
Rodolfo Giometti <giometti@linux.it> wrote:
> Here some utilities and examples about the PPS API and the LinuxPPS
> support.
>
> * ppstest.c implements an useful testing program, while
>
> * ppsfind tries to help the user into finding a specific PPS source by
> using its name or path.
Maybe these tools should be in a separate package (say pps-tools)? I've
written several tools too. They are based on your code. I think there
should be at least two of them:
* ppsctl to get/set params, get capabilities and bind/unbind kernel
consumer
* ppstest to fetch data and provide several representations for it
I can assist in this task too.
> Signed-off-by: Rodolfo Giometti <giometti@linux.it>
> ---
> Documentation/pps/Makefile | 27 ++++++++
> Documentation/pps/ppsfind | 17 +++++
> Documentation/pps/ppstest.c | 150
> +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 194
> insertions(+), 0 deletions(-) create mode 100644
> Documentation/pps/Makefile create mode 100644
> Documentation/pps/ppsfind create mode 100644
> Documentation/pps/ppstest.c
>
> diff --git a/Documentation/pps/Makefile b/Documentation/pps/Makefile
> new file mode 100644
> index 0000000..3848aba
> --- /dev/null
> +++ b/Documentation/pps/Makefile
> @@ -0,0 +1,27 @@
> +TARGETS = ppstest
> +
> +CFLAGS += -Wall -O2 -D_GNU_SOURCE
> +CFLAGS += -I . -I ../../include/
> +CFLAGS += -ggdb
> +
> +# -- Actions section --
> +
> +.PHONY : all depend dep
> +
> +all : .depend $(TARGETS)
> +
> +.depend depend dep :
> + $(CC) $(CFLAGS) -M $(TARGETS:=.c) > .depend
> +
> +ifeq (.depend,$(wildcard .depend))
> +include .depend
> +endif
> +
> +
> +# -- Clean section --
> +
> +.PHONY : clean
> +
> +clean :
> + rm -f *.o *~ core .depend
> + rm -f ${TARGETS}
> diff --git a/Documentation/pps/ppsfind b/Documentation/pps/ppsfind
> new file mode 100644
> index 0000000..93c0e17
> --- /dev/null
> +++ b/Documentation/pps/ppsfind
> @@ -0,0 +1,17 @@
> +#!/bin/sh
> +
> +SYS="/sys/class/pps/"
> +
> +if [ $# -lt 1 ] ; then
> + echo "usage: ppsfind <name>" >&2
> + exit 1
> +fi
> +
> +for d in $(ls $SYS) ; do
> + if grep $1 $SYS/$d/name >& /dev/null || \
> + grep $1 $SYS/$d/path >& /dev/null ; then
> + echo "$d: name=$(cat $SYS/$d/name) path=$(cat
> $SYS/$d/path)"
> + fi
> +done
> +
> +exit 0
> diff --git a/Documentation/pps/ppstest.c b/Documentation/pps/ppstest.c
> new file mode 100644
> index 0000000..30c8f6d
> --- /dev/null
> +++ b/Documentation/pps/ppstest.c
> @@ -0,0 +1,150 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +
> +#include <timepps.h>
> +
> +int find_source(char *path, pps_handle_t *handle, int *avail_mode)
> +{
> + pps_params_t params;
> + int ret;
> +
> + printf("trying PPS source \"%s\"\n", path);
> +
> + /* Try to find the source by using the supplied "path" name
> */
> + ret = open(path, O_RDWR);
> + if (ret < 0) {
> + fprintf(stderr, "unable to open device
> \"%s\" (%m)\n", path);
> + return ret;
> + }
> +
> + /* Open the PPS source (and check the file descriptor) */
> + ret = time_pps_create(ret, handle);
> + if (ret < 0) {
> + fprintf(stderr, "cannot create a PPS source from
> device "
> + "\"%s\" (%m)\n", path);
> + return -1;
> + }
> + printf("found PPS source \"%s\"\n", path);
> +
> + /* Find out what features are supported */
> + ret = time_pps_getcap(*handle, avail_mode);
> + if (ret < 0) {
> + fprintf(stderr, "cannot get capabilities (%m)\n");
> + return -1;
> + }
> + if ((*avail_mode & PPS_CAPTUREASSERT) == 0) {
> + fprintf(stderr, "cannot CAPTUREASSERT\n");
> + return -1;
> + }
> + if ((*avail_mode & PPS_OFFSETASSERT) == 0) {
> + fprintf(stderr, "cannot OFFSETASSERT\n");
> + return -1;
> + }
> +
> + /* Capture assert timestamps, and compensate for a 675 nsec
> + * propagation delay */
> + ret = time_pps_getparams(*handle, ¶ms);
> + if (ret < 0) {
> + fprintf(stderr, "cannot get parameters (%m)\n");
> + return -1;
> + }
> + params.assert_offset.tv_sec = 0;
> + params.assert_offset.tv_nsec = 675;
> + params.mode |= PPS_CAPTUREASSERT | PPS_OFFSETASSERT;
> + params.mode &= ~(PPS_CAPTURECLEAR | PPS_OFFSETCLEAR);
> + ret = time_pps_setparams(*handle, ¶ms);
> + if (ret < 0) {
> + fprintf(stderr, "cannot set parameters (%m)\n");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +int fetch_source(int i, pps_handle_t *handle, int *avail_mode)
> +{
> + struct timespec timeout;
> + pps_info_t infobuf;
> + int ret;
> +
> + /* create a zero-valued timeout */
> + timeout.tv_sec = 3;
> + timeout.tv_nsec = 0;
> +
> +retry:
> + if (*avail_mode & PPS_CANWAIT) /* waits for the next event */
> + ret = time_pps_fetch(*handle, PPS_TSFMT_TSPEC,
> &infobuf,
> + &timeout);
> + else {
> + sleep(1);
> + ret = time_pps_fetch(*handle, PPS_TSFMT_TSPEC,
> &infobuf,
> + &timeout);
> + }
> + if (ret < 0) {
> + if (ret == -EINTR) {
> + fprintf(stderr, "time_pps_fetch() got a
> signal!\n");
> + goto retry;
> + }
> +
> + fprintf(stderr, "time_pps_fetch() error %d (%m)\n",
> ret);
> + return -1;
> + }
> +
> + printf("source %d - "
> + "assert %ld.%09ld, sequence: %ld - "
> + "clear %ld.%09ld, sequence: %ld\n",
> + i,
> + infobuf.assert_timestamp.tv_sec,
> + infobuf.assert_timestamp.tv_nsec,
> + infobuf.assert_sequence,
> + infobuf.clear_timestamp.tv_sec,
> + infobuf.clear_timestamp.tv_nsec,
> infobuf.clear_sequence); +
> + return 0;
> +}
> +
> +void usage(char *name)
> +{
> + fprintf(stderr, "usage: %s <ppsdev> [<ppsdev> ...]\n", name);
> + exit(EXIT_FAILURE);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> + int num;
> + pps_handle_t handle[4];
> + int avail_mode[4];
> + int i = 0;
> + int ret;
> +
> + /* Check the command line */
> + if (argc < 2)
> + usage(argv[0]);
> +
> + for (i = 1; i < argc && i <= 4; i++) {
> + ret = find_source(argv[i], &handle[i - 1],
> &avail_mode[i - 1]);
> + if (ret < 0)
> + exit(EXIT_FAILURE);
> + }
> +
> + num = i - 1;
> + printf("ok, found %d source(s), now start fetching
> data...\n", num); +
> + /* loop, printing the most recent timestamp every second or
> so */
> + while (1) {
> + for (i = 0; i < num; i++) {
> + ret = fetch_source(i, &handle[i],
> &avail_mode[i]);
> + if (ret < 0 && errno != ETIMEDOUT)
> + exit(EXIT_FAILURE);
> + }
> + }
> +
> + for (; i >= 0; i--)
> + time_pps_destroy(handle[i]);
> +
> + return 0;
> +}
--
Alexander
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 489 bytes --]
next prev parent reply other threads:[~2010-02-16 12:45 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 ` Alexander Gordeev [this message]
2010-02-16 13:56 ` [PATCH 2/8] pps: documentation programs and examples Rodolfo Giometti
2010-02-16 12:33 ` [PATCH 1/8] pps: userland header file for PPS API Alexander Gordeev
2010-02-16 13:53 ` 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=20100216154456.2cea05d2@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