Skip to content

Commit

Permalink
USB: serial: invoke dcd_change ldisc's handler.
Browse files Browse the repository at this point in the history
The DCD pin of the serial port can receive a PPS signal. By calling
the port line discipline dcd handle, this patch allow to monitor PPS
through USB serial devices.

However the performance aren't as good as the uart drivers, so
document this point too.

Signed-off-by: Paul Chavent <[email protected]>
Acked-by: Rodolfo Giometti <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Paul Chavent authored and gregkh committed Sep 26, 2013
1 parent d14654d commit 833efc0
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
15 changes: 15 additions & 0 deletions Documentation/pps/pps.txt
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,21 @@ In LinuxPPS the PPS sources are simply char devices usually mapped
into files /dev/pps0, /dev/pps1, etc..


PPS with USB to serial devices
------------------------------

It is possible to grab the PPS from an USB to serial device. However,
you should take into account the latencies and jitter introduced by
the USB stack. Users has reported clock instability around +-1ms when
synchronized with PPS through USB. This isn't suited for time server
synchronization.

If your device doesn't report PPS, you can check that the feature is
supported by its driver. Most of the time, you only need to add a call
to usb_serial_handle_dcd_change after checking the DCD status (see
ch341 and pl2303 examples).


Coding example
--------------

Expand Down
10 changes: 10 additions & 0 deletions drivers/usb/serial/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,16 @@ void usb_serial_handle_dcd_change(struct usb_serial_port *usb_port,

dev_dbg(&usb_port->dev, "%s - status %d\n", __func__, status);

if (tty) {
struct tty_ldisc *ld = tty_ldisc_ref(tty);

if (ld) {
if (ld->ops->dcd_change)
ld->ops->dcd_change(tty, status);
tty_ldisc_deref(ld);
}
}

if (status)
wake_up_interruptible(&port->open_wait);
else if (tty && !C_CLOCAL(tty))
Expand Down

0 comments on commit 833efc0

Please sign in to comment.