Adds support for the PPS sources connected with the CD (Carrier
Detect) pin of a serial port.Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
drivers/pps/clients/Kconfig | 10 +++++
drivers/serial/8250.c | 2 +
drivers/serial/serial_core.c | 81 +++++++++++++++++++++++++++++++++++++++++-
include/linux/serial_core.h | 30 ++++++++++++---
4 files changed, 116 insertions(+), 7 deletions(-)diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
index 60b83be..517c338 100644
--- a/drivers/pps/clients/Kconfig
+++ b/drivers/pps/clients/Kconfig
@@ -15,4 +15,14 @@ config PPS_CLIENT_KTIMER
This driver can also be built as a module. If so, the module
will be called ktimer.ko.+comment "UART serial support (forced off)"
+ depends on ! (SERIAL_CORE != n && !(PPS = m && SERIAL_CORE = y))
+
+config PPS_CLIENT_UART
+ bool "UART serial support"
+ depends on SERIAL_CORE != n && !(PPS = m && SERIAL_CORE = y)
+ help
+ If you say yes here you get support for a PPS source connected
+ with the CD (Carrier Detect) pin of your serial port.
+
endif
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 77f7a7f..880cbeb 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2119,6 +2119,8 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
up->ier |= UART_IER_MSI;
if (up->capabilities & UART_CAP_UUE)
up->ier |= UART_IER_UUE | UART_IER_RTOIE;
+ if (up->port.flags & UPF_HARDPPS_CD)
+ up->ier |= UART_IER_MSI; /* enable interrupts */serial_out(up, UART_IER, up->ier);
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 0f5a179..37e9962 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -33,6 +33,7 @@
#include <linux/serial.h> /* for serial_state and serial_icounter_struct */
#include <linux/delay.h>
#include <linux/mutex.h>
+#include &...
Should I resubmit the whole patch set?
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
Please do.
thanks,
greg k-h
--
This patch set adds the PPS support into Linux.
PPS means "pulse per second" and its API is specified by RFC 2783
(Pulse-Per-Second API for UNIX-like Operating Systems, Version 1.0).The code has been tested with the NTPD program
(http://www.eecis.udel.edu/~mills/ntp/html/index.html) and several GPS
antennae.Rodolfo
--
Documentation/pps/Makefile | 2
b/Documentation/ABI/testing/sysfs-pps | 73 +++++++
b/Documentation/ioctl-number.txt | 2
b/Documentation/pps/Makefile | 27 ++
b/Documentation/pps/pps.txt | 170 +++++++++++++++++
b/Documentation/pps/ppsctl.c | 63 ++++++
b/Documentation/pps/ppsfind | 17 +
b/Documentation/pps/ppstest.c | 152 +++++++++++++++
b/Documentation/pps/timepps.h | 196 +++++++++++++++++++
b/MAINTAINERS | 7
b/drivers/Kconfig | 2
b/drivers/Makefile | 1
b/drivers/char/lp.c | 61 ++++++
b/drivers/pps/Kconfig | 33 +++
b/drivers/pps/Makefile | 8
b/drivers/pps/clients/Kconfig | 18 +
b/drivers/pps/clients/Makefile | 9
b/drivers/pps/clients/ktimer.c | 115 +++++++++++
b/drivers/pps/kapi.c | 330 +++++++++++++++++++++++++++++++++
b/drivers/pps/pps.c | 335 ++++++++++++++++++++++++++++++++++
b/drivers/pps/sysfs.c | 103 ++++++++++
b/drivers/serial/8250.c | 2
b/drivers/serial/serial_core.c | 81 ++++++++
b/include/linux/Kbuild | 1
b/include/linux/parport.h | 13 +
b/include/linux/pps.h | 203 ++++++++++++++++++++
b/include/linux/serial_core.h | 31 ++-
drivers/pps/Kconfig | 2
drivers/pps/Makefile | 1
drivers/pps/clients/Kconfig | 20 ++
30 files changed, 2063 insertions(+), 15 deletions(-)--
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 <giometti@linux.it>
---
Documentation/ABI/testing/sysfs-pps | 73 ++++++++
Documentation/ioctl-number.txt | 2 +
Documentation/pps/pps.txt | 170 ++++++++++++++++++
MAINTAINERS | 7 +
drivers/Kconfig | 2 +
drivers/Makefile | 1 +
drivers/pps/Kconfig | 33 ++++
drivers/pps/Makefile | 8 +
drivers/pps/kapi.c | 330 ++++++++++++++++++++++++++++++++++
drivers/pps/pps.c | 335 +++++++++++++++++++++++++++++++++++
drivers/pps/sysfs.c | 103 +++++++++++
include/linux/Kbuild | 1 +
include/linux/pps.h | 202 +++++++++++++++++++++
13 files changed, 1267 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.hdiff --git a/Documentati...
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 <giometti@linux.it>
---
Documentation/pps/timepps.h | 195 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 195 insertions(+), 0 deletions(-)
create mode 100644 Documentation/pps/timepps.hdiff --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 <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 <sys/syscall.h>
+#include <unistd.h>
+#include <errno.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 asse...
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.Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
Documentation/pps/Makefile | 27 ++++++++
Documentation/pps/ppsfind | 17 +++++
Documentation/pps/ppstest.c | 151 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 195 insertions(+), 0 deletions(-)
create mode 100644 Documentation/pps/Makefile
create mode 100644 Documentation/pps/ppsfind
create mode 100644 Documentation/pps/ppstest.cdiff --git a/Documentation/pps/Makefile b/Documentation/pps/Makefile
new file mode 100644
index 0000000..af4f9b4
--- /dev/null
+++ b/Documentation/pps/Makefile
@@ -0,0 +1,27 @@
+TARGETS = ppstest
+
+CFLAGS += -Wall -O2 -D_GNU_SOURCE
+CFLAGS += -I .
+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..d125ffa
--- /dev/null
+++ b/Documentation/pps/ppstest.c
@@ -0,0 +1,151 @@
+#include <stdio.h>
+#in...
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 <giometti@linux.it>
---
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.cdiff --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.
...
Adds support for the PPS sources connected with the CD (Carrier
Detect) pin of a serial port.Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
drivers/pps/clients/Kconfig | 10 +++++
drivers/serial/8250.c | 2 +
drivers/serial/serial_core.c | 81 +++++++++++++++++++++++++++++++++++++++++-
include/linux/serial_core.h | 30 ++++++++++++---
4 files changed, 116 insertions(+), 7 deletions(-)diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
index 60b83be..517c338 100644
--- a/drivers/pps/clients/Kconfig
+++ b/drivers/pps/clients/Kconfig
@@ -15,4 +15,14 @@ config PPS_CLIENT_KTIMER
This driver can also be built as a module. If so, the module
will be called ktimer.ko.+comment "UART serial support (forced off)"
+ depends on ! (SERIAL_CORE != n && !(PPS = m && SERIAL_CORE = y))
+
+config PPS_CLIENT_UART
+ bool "UART serial support"
+ depends on SERIAL_CORE != n && !(PPS = m && SERIAL_CORE = y)
+ help
+ If you say yes here you get support for a PPS source connected
+ with the CD (Carrier Detect) pin of your serial port.
+
endif
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 77f7a7f..880cbeb 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2119,6 +2119,8 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
up->ier |= UART_IER_MSI;
if (up->capabilities & UART_CAP_UUE)
up->ier |= UART_IER_UUE | UART_IER_RTOIE;
+ if (up->port.flags & UPF_HARDPPS_CD)
+ up->ier |= UART_IER_MSI; /* enable interrupts */serial_out(up, UART_IER, up->ier);
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 0f5a179..37e9962 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -33,6 +33,7 @@
#include <linux/serial.h> /* for serial_state and serial_icounter_struct */
#include <linux/delay.h>
#include <linux/mutex.h>
+#include &...
On Thu, 10 Apr 2008 20:22:29 +0200
Better and now readable but this is definitely in the wrong place and
should be pushed up the stack so it can be generalised for all serial
devices as an ldisc or similar.This bit is definitely not ready to go upstream but the general PPS
stuff looks fairly sane.
--
How can I do that? From a serial device I just need the IRQ time
arrival, no other data at all. How a ldisc can help me in this task?This patch adds PPS support just for UARTs, other devices should
provide their own support by using the new provided API. :)Ciao,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
At the moment you can't. That needs fixing. Most of the infrastructure is
I do not want PPS code adding to every single serial driver. That way
lies madness. We do it once, and in the right layer. I'll take a further
look at it after the tty->ops patch is merged. At that point we'll be in
a good position to add the needed ops/callbacks.Alan
--
I thought it just required that the uart driver call
uart_handle_dcd_change when the state of the CD changes, and all the PPS
stuff happened in that function.That seems pretty low intrusion, since the serial driver wouldn't need
to be touched with the PPS code at all as long as it already calls the
uart_handle functions.Now if the driver doesn't generate an IRQ whenever a status line
changes, then the driver does need to be updated to do that. Some (like
jsm) already do, and have no need for the HARDPPS setting at all. It
seems reasonable though that the serial drivers should already have had
support for generating interrupts when a status line changes.--
Len Sorensen
--
uart_ is only used by some drivers. We have a whole army of drivers using
the tty layer directly and another army of drivers using the USB layer.You also need a sensible way to talk to the devices, identify support and
avoid clashing uses of carrier pins.Alan
--
Hello Alan,
if I add a dedicated line discipline to register/unregister the PPS
source and I leave the pps_event management into
uart_handle_dcd_change() function, it can be acceptable?The uart_handle_dcd_change() is generic and I need the DCD status to
correctly manage the pps_event. The USB layer is not useful for PPS
stuff.Thanks for your suggestions,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
Keep the two things apart.
uart_handle_dcd_change looks a good basis for the UART layer support for
drivers serial
an LDISC looks right for the top layerWe just need the bits in the middle right. I've added the serial layer
pass through for the set_ldisc() interface so that bit is done. Probably
the main thing we need is to add tty->ldisc.dcd_change() for reporting
DCD change back to the line discipline. We could queue it as a TTY_ eventNot every character driver uses drivers/serial or USB. That is fine. What
I care about is that you *could* add PPS support to another serial driver
cleanly, not that it is done immediately. What matters is the interface,
the rest will follow.Alan
--
Yes, you are right. PPS events should be registered as soon as they
arrive, that's why I'd like to put events registration (or at least
IRQ timestamps) into do_IRQ() as follow:fastcall unsigned int do_IRQ(struct pt_regs *regs)
{
struct pt_regs *old_regs;
/* high bit used in ret_from_ code */
int irq = ~regs->orig_eax;
struct irq_desc *desc = irq_desc + irq;
#ifdef CONFIG_4KSTACKS
union irq_ctx *curctx, *irqctx;
u32 *isp;
#endifif (unlikely((unsigned)irq >= NR_IRQS)) {
printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
__FUNCTION__, irq);
BUG();
}pps_irq_event_register(irq);
old_regs = set_irq_regs(regs);
irq_enter();but this solution arises two drawbacks:
1) the PPS echo functions should be executed by
pps_irq_event_register() into do_IRQ(). Brrrr... :)2) the shared IRQ line may cause "false" PPS events.
The latter drawback can be solved simply not using the shared IRQs for
PPS sources but the former is not an easy task... so I suppose we
should delay the echo function call at "safer" time, maybe using theI see. So what do you suggest to do? Should I add an ldisc to
register/unregister serial PPS sources and adding function
tty->ldisc.dcd_change() to manage the events?Thanks for your suggestions,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
I think so. To me that sounds the ideal solution.
Alan
--
So I should rewrite the uart_handle_dcd_change() as follow?
static inline void
uart_handle_dcd_change(struct uart_port *port, unsigned int status)
{
struct uart_info *info = port->info;
struct tty_struct *tty = info->tty;
struct tty_ldisc *ld;ld = tty_ldisc_ref(tty);
if (ld != NULL) {
if (ld->dcd_change)
(ld->dcd_change)(tty, port, status);
tty_ldisc_deref(ld);
}port->icount.dcd++;
#ifdef CONFIG_HARD_PPS
if ((port->flags & UPF_HARDPPS_CD) && status)
hardpps();
#endifif (info->flags & UIF_CHECK_CD) {
if (status)
wake_up_interruptible(&info->open_wait);
else if (tty)
tty_hangup(tty);
}
}Is that right?
Thanks a lot,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
The ifdef bit can go - it will be in your dcd_change callback ..
Alan
--
The "#ifdef CONFIG_HARD_PPS" is currently into kernel code, is *not*
my modification at all. In fact you can find the flag UPF_HARDPPS_CD
defined into include/linux/serial_core.h. It's a part of a very old
PPS implemention (never merged into mainline) and it was used to
enable the PPS layer for serial ports. That's why I didn't define an
ldisc but implemented my PPS version using it. :)Ciao,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
The problem is that deferencing the pps_event() call will cause severe
problems to PPS accuracy... here you can find some considerations on
this topic:Can you please give me an URL where I can see that patch?
Thanks a lot for your help,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
What about adding precise timestamping to the lowest possible irq
handling level ( arch/*/entry*.S ) and then export that information
in a general way so it is useful for other applications?
--
The problem is that at such level you cannot easily retrieve info
about where your serial port is connected to and which PPS source you
should manage...Ciao,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
--
Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
Documentation/pps/Makefile | 2 +-
Documentation/pps/ppsctl.c | 62 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 1 deletions(-)
create mode 100644 Documentation/pps/ppsctl.cdiff --git a/Documentation/pps/Makefile b/Documentation/pps/Makefile
index af4f9b4..8ef4f47 100644
--- a/Documentation/pps/Makefile
+++ b/Documentation/pps/Makefile
@@ -1,4 +1,4 @@
-TARGETS = ppstest
+TARGETS = ppstest ppsctlCFLAGS += -Wall -O2 -D_GNU_SOURCE
CFLAGS += -I .
diff --git a/Documentation/pps/ppsctl.c b/Documentation/pps/ppsctl.c
new file mode 100644
index 0000000..83fd08a
--- /dev/null
+++ b/Documentation/pps/ppsctl.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <linux/serial.h>
+
+void usage(char *name)
+{
+ fprintf(stderr, "usage: %s <ttyS> [enable|disable]\n", name);
+
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+ int fd;
+ int ret;
+ struct serial_struct ss;
+
+ if (argc < 2)
+ usage(argv[0]);
+
+ fd = open(argv[1], O_RDWR);
+ if (fd < 0) {
+ perror("open");
+ exit(EXIT_FAILURE);
+ }
+
+ ret = ioctl(fd, TIOCGSERIAL, &ss);
+ if (ret < 0) {
+ perror("ioctl(TIOCGSERIAL)");
+ exit(EXIT_FAILURE);
+ }
+
+ if (argc < 3) { /* just read PPS status */
+ printf("PPS is %sabled\n",
+ ss.flags & ASYNC_HARDPPS_CD ? "en" : "dis");
+ exit(EXIT_SUCCESS);
+ }
+
+ if (argv[2][0] == 'e' || argv[2][0] == '1')
+ ss.flags |= ASYNC_HARDPPS_CD;
+ else if (argv[2][0] == 'd' || argv[2][0] == '0')
+ ss.flags &= ~ASYNC_HARDPPS_CD;
+ else {
+ fprintf(stderr, "invalid state argument \"%s\"\n", argv[2]);
+ exit(EXIT_FAILURE);
+ }
+
+ ret = ioctl(fd, TIOCSSERIAL, &ss);
+...
Adds support for the PPS sources connected with the interrupt pin of a
parallel port.Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
drivers/char/lp.c | 61 +++++++++++++++++++++++++++++++++++++++++++
drivers/pps/clients/Kconfig | 10 +++++++
include/linux/parport.h | 12 ++++++++
3 files changed, 83 insertions(+), 0 deletions(-)diff --git a/drivers/char/lp.c b/drivers/char/lp.c
index 60ac642..b201fed 100644
--- a/drivers/char/lp.c
+++ b/drivers/char/lp.c
@@ -746,6 +746,27 @@ static struct console lpcons = {#endif /* console on line printer */
+/* Support for PPS signal on the line printer */
+
+#ifdef CONFIG_PPS_CLIENT_LP
+
+static void lp_pps_echo(int source, int event, void *data)
+{
+ struct parport *port = data;
+ unsigned char status = parport_read_status(port);
+
+ /* echo event via SEL bit */
+ parport_write_control(port,
+ parport_read_control(port) | PARPORT_CONTROL_SELECT);
+
+ /* signal no event */
+ if ((status & PARPORT_STATUS_ACK) != 0)
+ parport_write_control(port,
+ parport_read_control(port) & ~PARPORT_CONTROL_SELECT);
+}
+
+#endif
+
/* --- initialisation code ------------------------------------- */static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
@@ -816,6 +837,38 @@ static int lp_register(int nr, struct parport *port)
}
#endif+#ifdef CONFIG_PPS_CLIENT_LP
+ port->pps_info.owner = THIS_MODULE;
+ port->pps_info.dev = port->dev;
+ snprintf(port->pps_info.path, PPS_MAX_NAME_LEN, "/dev/lp%d", nr);
+
+ /* No PPS support if lp port has no IRQ line */
+ if (port->irq != PARPORT_IRQ_NONE) {
+ strncpy(port->pps_info.name, port->name, PPS_MAX_NAME_LEN);
+
+ port->pps_info.mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
+ PPS_ECHOASSERT | \
+ PPS_CANWAIT | PPS_TSFMT_TSPEC;
+
+ port->pps_info.echo = lp_pps_echo;
+
+ port->pps_source = pps_register_source(&(port->pps_info),
+ PPS_CAPTUREASSERT | PPS_OFFSETASS...
| Bart Van Assche | Integration of SCST in the mainstream Linux kernel |
| Andrew Morton | 2.6.23-mm1 |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Justin Piszcz | Re: 2.6.23.1: mdadm/raid5 hung/d-state |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Kenny Chang | Multicast packet loss |
| Stephen Hemminger | Re: HTB accuracy for high speed |
| David Miller | [GIT]: Networking |
git: | |
| Sander | 'struct task_struct' has no member named 'mems_allowed' (was: Re: 2.6.20-rc4-mm1) |
