Skip to content

Commit eae9d2b

Browse files
Rodolfo Giomettitorvalds
authored andcommitted
LinuxPPS: core support
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. 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 <[email protected]> Cc: David Woodhouse <[email protected]> Cc: Greg KH <[email protected]> Cc: Randy Dunlap <[email protected]> Cc: Kay Sievers <[email protected]> Acked-by: Alan Cox <[email protected]> Cc: Michael Kerrisk <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Roman Zippel <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 8820f27 commit eae9d2b

14 files changed

Lines changed: 1249 additions & 0 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
What: /sys/class/pps/
2+
Date: February 2008
3+
Contact: Rodolfo Giometti <[email protected]>
4+
Description:
5+
The /sys/class/pps/ directory will contain files and
6+
directories that will provide a unified interface to
7+
the PPS sources.
8+
9+
What: /sys/class/pps/ppsX/
10+
Date: February 2008
11+
Contact: Rodolfo Giometti <[email protected]>
12+
Description:
13+
The /sys/class/pps/ppsX/ directory is related to X-th
14+
PPS source into the system. Each directory will
15+
contain files to manage and control its PPS source.
16+
17+
What: /sys/class/pps/ppsX/assert
18+
Date: February 2008
19+
Contact: Rodolfo Giometti <[email protected]>
20+
Description:
21+
The /sys/class/pps/ppsX/assert file reports the assert events
22+
and the assert sequence number of the X-th source in the form:
23+
24+
<secs>.<nsec>#<sequence>
25+
26+
If the source has no assert events the content of this file
27+
is empty.
28+
29+
What: /sys/class/pps/ppsX/clear
30+
Date: February 2008
31+
Contact: Rodolfo Giometti <[email protected]>
32+
Description:
33+
The /sys/class/pps/ppsX/clear file reports the clear events
34+
and the clear sequence number of the X-th source in the form:
35+
36+
<secs>.<nsec>#<sequence>
37+
38+
If the source has no clear events the content of this file
39+
is empty.
40+
41+
What: /sys/class/pps/ppsX/mode
42+
Date: February 2008
43+
Contact: Rodolfo Giometti <[email protected]>
44+
Description:
45+
The /sys/class/pps/ppsX/mode file reports the functioning
46+
mode of the X-th source in hexadecimal encoding.
47+
48+
Please, refer to linux/include/linux/pps.h for further
49+
info.
50+
51+
What: /sys/class/pps/ppsX/echo
52+
Date: February 2008
53+
Contact: Rodolfo Giometti <[email protected]>
54+
Description:
55+
The /sys/class/pps/ppsX/echo file reports if the X-th does
56+
or does not support an "echo" function.
57+
58+
What: /sys/class/pps/ppsX/name
59+
Date: February 2008
60+
Contact: Rodolfo Giometti <[email protected]>
61+
Description:
62+
The /sys/class/pps/ppsX/name file reports the name of the
63+
X-th source.
64+
65+
What: /sys/class/pps/ppsX/path
66+
Date: February 2008
67+
Contact: Rodolfo Giometti <[email protected]>
68+
Description:
69+
The /sys/class/pps/ppsX/path file reports the path name of
70+
the device connected with the X-th source.
71+
72+
If the source is not connected with any device the content
73+
of this file is empty.

Documentation/ioctl/ioctl-number.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ Code Seq# Include File Comments
149149
'p' 40-7F linux/nvram.h
150150
'p' 80-9F user-space parport
151151
152+
'p' a1-a4 linux/pps.h LinuxPPS
153+
152154
'q' 00-1F linux/serio.h
153155
'q' 80-FF Internet PhoneJACK, Internet LineJACK
154156
<http://www.quicknet.net>

Documentation/pps/pps.txt

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
2+
PPS - Pulse Per Second
3+
----------------------
4+
5+
(C) Copyright 2007 Rodolfo Giometti <[email protected]>
6+
7+
This program is free software; you can redistribute it and/or modify
8+
it under the terms of the GNU General Public License as published by
9+
the Free Software Foundation; either version 2 of the License, or
10+
(at your option) any later version.
11+
12+
This program is distributed in the hope that it will be useful,
13+
but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
GNU General Public License for more details.
16+
17+
18+
19+
Overview
20+
--------
21+
22+
LinuxPPS provides a programming interface (API) to define in the
23+
system several PPS sources.
24+
25+
PPS means "pulse per second" and a PPS source is just a device which
26+
provides a high precision signal each second so that an application
27+
can use it to adjust system clock time.
28+
29+
A PPS source can be connected to a serial port (usually to the Data
30+
Carrier Detect pin) or to a parallel port (ACK-pin) or to a special
31+
CPU's GPIOs (this is the common case in embedded systems) but in each
32+
case when a new pulse arrives the system must apply to it a timestamp
33+
and record it for userland.
34+
35+
Common use is the combination of the NTPD as userland program, with a
36+
GPS receiver as PPS source, to obtain a wallclock-time with
37+
sub-millisecond synchronisation to UTC.
38+
39+
40+
RFC considerations
41+
------------------
42+
43+
While implementing a PPS API as RFC 2783 defines and using an embedded
44+
CPU GPIO-Pin as physical link to the signal, I encountered a deeper
45+
problem:
46+
47+
At startup it needs a file descriptor as argument for the function
48+
time_pps_create().
49+
50+
This implies that the source has a /dev/... entry. This assumption is
51+
ok for the serial and parallel port, where you can do something
52+
useful besides(!) the gathering of timestamps as it is the central
53+
task for a PPS-API. But this assumption does not work for a single
54+
purpose GPIO line. In this case even basic file-related functionality
55+
(like read() and write()) makes no sense at all and should not be a
56+
precondition for the use of a PPS-API.
57+
58+
The problem can be simply solved if you consider that a PPS source is
59+
not always connected with a GPS data source.
60+
61+
So your programs should check if the GPS data source (the serial port
62+
for instance) is a PPS source too, and if not they should provide the
63+
possibility to open another device as PPS source.
64+
65+
In LinuxPPS the PPS sources are simply char devices usually mapped
66+
into files /dev/pps0, /dev/pps1, etc..
67+
68+
69+
Coding example
70+
--------------
71+
72+
To register a PPS source into the kernel you should define a struct
73+
pps_source_info_s as follows:
74+
75+
static struct pps_source_info pps_ktimer_info = {
76+
.name = "ktimer",
77+
.path = "",
78+
.mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
79+
PPS_ECHOASSERT | \
80+
PPS_CANWAIT | PPS_TSFMT_TSPEC,
81+
.echo = pps_ktimer_echo,
82+
.owner = THIS_MODULE,
83+
};
84+
85+
and then calling the function pps_register_source() in your
86+
intialization routine as follows:
87+
88+
source = pps_register_source(&pps_ktimer_info,
89+
PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
90+
91+
The pps_register_source() prototype is:
92+
93+
int pps_register_source(struct pps_source_info_s *info, int default_params)
94+
95+
where "info" is a pointer to a structure that describes a particular
96+
PPS source, "default_params" tells the system what the initial default
97+
parameters for the device should be (it is obvious that these parameters
98+
must be a subset of ones defined in the struct
99+
pps_source_info_s which describe the capabilities of the driver).
100+
101+
Once you have registered a new PPS source into the system you can
102+
signal an assert event (for example in the interrupt handler routine)
103+
just using:
104+
105+
pps_event(source, &ts, PPS_CAPTUREASSERT, ptr)
106+
107+
where "ts" is the event's timestamp.
108+
109+
The same function may also run the defined echo function
110+
(pps_ktimer_echo(), passing to it the "ptr" pointer) if the user
111+
asked for that... etc..
112+
113+
Please see the file drivers/pps/clients/ktimer.c for example code.
114+
115+
116+
SYSFS support
117+
-------------
118+
119+
If the SYSFS filesystem is enabled in the kernel it provides a new class:
120+
121+
$ ls /sys/class/pps/
122+
pps0/ pps1/ pps2/
123+
124+
Every directory is the ID of a PPS sources defined in the system and
125+
inside you find several files:
126+
127+
$ ls /sys/class/pps/pps0/
128+
assert clear echo mode name path subsystem@ uevent
129+
130+
Inside each "assert" and "clear" file you can find the timestamp and a
131+
sequence number:
132+
133+
$ cat /sys/class/pps/pps0/assert
134+
1170026870.983207967#8
135+
136+
Where before the "#" is the timestamp in seconds; after it is the
137+
sequence number. Other files are:
138+
139+
* echo: reports if the PPS source has an echo function or not;
140+
141+
* mode: reports available PPS functioning modes;
142+
143+
* name: reports the PPS source's name;
144+
145+
* path: reports the PPS source's device path, that is the device the
146+
PPS source is connected to (if it exists).
147+
148+
149+
Testing the PPS support
150+
-----------------------
151+
152+
In order to test the PPS support even without specific hardware you can use
153+
the ktimer driver (see the client subsection in the PPS configuration menu)
154+
and the userland tools provided into Documentaion/pps/ directory.
155+
156+
Once you have enabled the compilation of ktimer just modprobe it (if
157+
not statically compiled):
158+
159+
# modprobe ktimer
160+
161+
and the run ppstest as follow:
162+
163+
$ ./ppstest /dev/pps0
164+
trying PPS source "/dev/pps1"
165+
found PPS source "/dev/pps1"
166+
ok, found 1 source(s), now start fetching data...
167+
source 0 - assert 1186592699.388832443, sequence: 364 - clear 0.000000000, sequence: 0
168+
source 0 - assert 1186592700.388931295, sequence: 365 - clear 0.000000000, sequence: 0
169+
source 0 - assert 1186592701.389032765, sequence: 366 - clear 0.000000000, sequence: 0
170+
171+
Please, note that to compile userland programs you need the file timepps.h
172+
(see Documentation/pps/).

MAINTAINERS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4577,6 +4577,13 @@ S: Maintained
45774577
F: drivers/net/pppol2tp.c
45784578
F: include/linux/if_pppol2tp.h
45794579

4580+
PPS SUPPORT
4581+
P: Rodolfo Giometti
4582+
4583+
W: http://wiki.enneenne.com/index.php/LinuxPPS_support
4584+
L: [email protected] (subscribers-only)
4585+
S: Maintained
4586+
45804587
PREEMPTIBLE KERNEL
45814588
P: Robert Love
45824589

drivers/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ source "drivers/i2c/Kconfig"
5252

5353
source "drivers/spi/Kconfig"
5454

55+
source "drivers/pps/Kconfig"
56+
5557
source "drivers/gpio/Kconfig"
5658

5759
source "drivers/w1/Kconfig"

drivers/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ obj-$(CONFIG_INPUT) += input/
7272
obj-$(CONFIG_I2O) += message/
7373
obj-$(CONFIG_RTC_LIB) += rtc/
7474
obj-y += i2c/ media/
75+
obj-$(CONFIG_PPS) += pps/
7576
obj-$(CONFIG_W1) += w1/
7677
obj-$(CONFIG_POWER_SUPPLY) += power/
7778
obj-$(CONFIG_HWMON) += hwmon/

drivers/pps/Kconfig

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#
2+
# PPS support configuration
3+
#
4+
5+
menu "PPS support"
6+
7+
config PPS
8+
tristate "PPS support"
9+
depends on EXPERIMENTAL
10+
---help---
11+
PPS (Pulse Per Second) is a special pulse provided by some GPS
12+
antennae. Userland can use it to get a high-precision time
13+
reference.
14+
15+
Some antennae's PPS signals are connected with the CD (Carrier
16+
Detect) pin of the serial line they use to communicate with the
17+
host. In this case use the SERIAL_LINE client support.
18+
19+
Some antennae's PPS signals are connected with some special host
20+
inputs so you have to enable the corresponding client support.
21+
22+
To compile this driver as a module, choose M here: the module
23+
will be called pps_core.ko.
24+
25+
config PPS_DEBUG
26+
bool "PPS debugging messages"
27+
depends on PPS
28+
help
29+
Say Y here if you want the PPS support to produce a bunch of debug
30+
messages to the system log. Select this if you are having a
31+
problem with PPS support and want to see more of what is going on.
32+
33+
endmenu

drivers/pps/Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#
2+
# Makefile for the PPS core.
3+
#
4+
5+
pps_core-y := pps.o kapi.o sysfs.o
6+
obj-$(CONFIG_PPS) := pps_core.o
7+
8+
ccflags-$(CONFIG_PPS_DEBUG) := -DDEBUG

0 commit comments

Comments
 (0)