[time-nuts] Raspberry Pi NTP server
jimlux
jimlux at earthlink.net
Sun Jul 12 01:57:39 UTC 2020
On 7/11/20 1:30 PM, Steven Sommars wrote:
> Using GPIO with an RPi is a good direction, of course. That wasn't my
> question. Some data may help explain.
> Configuration =
> RPi4 (raspbian buster)
> Uputronics RPi GPS board (includes PPS) connected to GPIO pins. This
> is the time of day source for the RPi4. (via GPSD+chrony).
> Navisys USB GR701 (includes PPS and Integrated serial->USB
> conversion). Contains integrated Prolific Technology, Inc. PL2303
>
> The observed PPS variation on the Uputronics PPS is a few microseconds.
> (ppstest was used for measurements). Using a PPS to drive NTP's computer
> clock disciplining, which is in turn used to measure the same PPS makes for
> a dubious circular measurement. It is comforting though to see that the
> variance is in the ~1-3 microsecond range. One must also add Trent's
> interrupt latency measurement (3 microseconds). With the GPIO connection
> the RPi time base should be within say 10 microseconds of UTC.
>
> The USB-connected Navisys fares worse.
> [image: image.png]
> By the time the PPS reaches the OS there is about 1 msec of variance with
> an average offset of a bit over 0.6 msec.
> I suspect the 1 msec USB polling is the largest latency contributor, though
> there are other sources as mentioned by Tim.
> I'd like to reduce the USB polling contribution by polling at 125
> microseconds as the Linux PPS folks suggest
> (http://linuxpps.org/doku.php/technical_information) Would an FTDI-based
> USB convertor do the trick?
>
> Why bother with GPS/USB? Sometimes I use laptops. Few laptops today
> directly support PPS/serial.
> I just checked with Dell and found zero laptops with native RS232.
>
>
I would not expect another kind of USB to serial converter to do better.
The problem is higher up in the way that Linux handles USB devices. The
USB hardware can certainly handle higher rates (and does), but the
"software interrupts" as the event travels up the stack limits the
timing resolution.
You might want to look into one of the "real time" linux kernels or
other similar implementations - they might have "turned some of the
knobs" to improve the handling of device data.
USB device handling in Linux (and Windows, and Mac OSX) is quite
complex, if only because USB itself is quite complex in that it has to
support multiple "kinds" of devices with wildly varying properties (HID,
Mass Storage, Isochronous data, etc.) - Not to mention all the
complexities associated with hot plugging and unplugging and
"enumeration" and "power control".
You might also want to delve into the handling of USB request Blocks
(URBs) which is how Linux handles USB related events.
https://www.oreilly.com/library/view/linux-device-drivers/0596005903/ch13.html
https://www.kernel.org/doc/html/v4.12/driver-api/usb/index.html
The above document describes a variety of ways to get at USB devices in
non-standard ways, through the USB API.
Another interesting alternative might be to modify the low level
interrupt handler for your Prolific chip (or whatever you're using) -
you could probably snapshot the system timer in the IRQ. But then you're
faced with the challenge of propagating that time to where you need it,
and hopefully in a way that doesn't break Linux.
In any case, your problem is not that it's USB. Your problem is that
Linux has some compromises in how it handles USB devices that
essentially imposes a 1kHz quantization on it.
There is a reason why USB support was late in coming to Linux compared
to other devices. And there's a reason why everyone curses at serial
interfaces, particularly over USB. Their character at a time behavior
fits real well for read() and write() in most OSes, but the ioctl() call
tends to be very, very complex. And getting high speed or deterministic
behavior is always a challenge.
I feel your pain. All of my serial interfaces stopped working when I
went from Mavericks to Mojave... I finally got a SiLabs interface
working, and one instance of a FTDI device. The Prolific PL2303, not
yet. I was seriously contemplating making Ethernet to USB interfaces on
an Arduino, where there's no OS involved.
I have so many pieces of equipment with USB interfaces, all a bit
different, all sort of using a serial port model.
More information about the Time-nuts_lists.febo.com
mailing list