start
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| start [2018/08/29 10:56] – [Contributors] Add lost contributors from web cache giometti | start [2020/11/26 15:06] (current) – [LinuxPPS based projects] New project added giometti | ||
|---|---|---|---|
| Line 22: | Line 22: | ||
| sub-millisecond synchronisation to UTC. | sub-millisecond synchronisation to UTC. | ||
| - | ===== RFC considerations ===== | + | More detailed information regarding PPS and LinuxPPS are available at [[Technical information]] page. |
| - | While implementing a PPS API as RFC 2783 defines and using an embedded | + | ===== Resources ===== |
| - | CPU GPIO-Pin as physical link to the signal, I encountered a deeper | + | |
| - | problem: | + | |
| - | At startup it needs a file descriptor as argument for the function | + | A LinuxPPS's mail list is available at [[http:// |
| - | '' | + | |
| - | This implies that the source has a ''/ | + | However **before** sending your questions to this list, please, **take |
| - | OK for the serial and parallel port, where you can do something | + | |
| - | useful besides(!) the gathering of timestamps as it is the central | + | |
| - | task for a PPS API. But this assumption does not work for a single | + | |
| - | purpose GPIO line. In this case even basic file-related functionality | + | |
| - | (like '' | + | |
| - | precondition for the use of a PPS API. | + | |
| - | The problem can be simply solved if you consider that a PPS source is | + | ===== LinuxPPS based projects ===== |
| - | not always connected with a GPS data source. | + | |
| - | So your programs should check if the GPS data source (the serial port | + | Projects using LinuxPPS: |
| - | for instance) is a PPS source too, and if not they should provide the | + | |
| - | possibility to open another device as PPS source. | + | |
| - | In LinuxPPS the PPS sources are simply char devices usually mapped | + | * Dedicated Short Range Communications (DSRC) radio synchronization used by US-DOT's VII [[http://www.its.dot.gov/vii/]] [[http:// |
| - | into files ''/dev/pps0'', | + | |
| - | ===== PPS with USB to serial devices ===== | + | * [[http:// |
| - | It is possible to grab the PPS from an USB to serial device. However, | + | * [[http:// |
| - | you should take into account the latencies and jitter introduced by | + | |
| - | the USB stack. Users have reported clock instability around +-1ms when | + | |
| - | synchronized | + | |
| - | down to the order of 125 microseconds. | + | |
| - | This may be suitable | + | * [[https:// |
| - | of its undersampling | + | |
| - | If your device doesn' | + | If you have a project |
| - | 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 | + | ===== Press ===== |
| - | To register a PPS source into the kernel you should define a '' | + | Press talked about the LinuxPPS project on: |
| - | pps_source_info'' | + | |
| - | static struct pps_source_info pps_ktimer_info = { | + | * Linux&C. issue 68 (year 11) at page 5 (Italian magazine). |
| - | | + | |
| - | | + | |
| - | .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | | + | |
| - | PPS_ECHOASSERT | | + | |
| - | PPS_CANWAIT | PPS_TSFMT_TSPEC, | + | |
| - | .echo = pps_ktimer_echo, | + | |
| - | .owner | + | |
| - | }; | + | |
| - | and then calling the function '' | + | * Linux Journal issue 185 (September 2009) at page 14. |
| - | initialization routine as follows: | + | |
| - | + | ||
| - | source = pps_register_source(& | + | |
| - | PPS_CAPTUREASSERT | PPS_OFFSETASSERT); | + | |
| - | + | ||
| - | The '' | + | |
| - | + | ||
| - | int pps_register_source(struct pps_source_info *info, int default_params) | + | |
| - | + | ||
| - | where '' | + | |
| - | PPS source, '' | + | |
| - | parameters for the device should be (it is obvious that these parameters | + | |
| - | must be a subset of ones defined in the '' | + | |
| - | pps_source_info'' | + | |
| - | + | ||
| - | Once you have registered a new PPS source into the system you can | + | |
| - | signal an assert event (for example in the interrupt handler routine) | + | |
| - | just using: | + | |
| - | + | ||
| - | pps_event(source, | + | |
| - | + | ||
| - | where '' | + | |
| - | + | ||
| - | The same function may also run the defined echo function | + | |
| - | ('' | + | |
| - | asked for that... etc.. | + | |
| - | + | ||
| - | Please see the file '' | + | |
| - | + | ||
| - | ===== SYSFS support ===== | + | |
| - | + | ||
| - | If the SYSFS filesystem is enabled in the kernel it provides a new class: | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | + | ||
| - | Every directory is the ID of a PPS sources defined in the system and | + | |
| - | inside you find several files: | + | |
| - | + | ||
| - | $ ls -F / | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | + | ||
| - | Inside each '' | + | |
| - | sequence number: | + | |
| - | + | ||
| - | $ cat / | + | |
| - | | + | |
| - | + | ||
| - | Where before the ''#'' | + | |
| - | sequence number. Other files are: | + | |
| - | + | ||
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | PPS source is connected to (if it exists). | + | |
| - | + | ||
| - | ===== Testing the PPS support ===== | + | |
| - | + | ||
| - | In order to test the PPS support even without specific hardware you can use | + | |
| - | the '' | + | |
| - | and the userland tools available in your distribution' | + | |
| - | http:// | + | |
| - | + | ||
| - | Once you have enabled the compilation of '' | + | |
| - | not statically compiled): | + | |
| - | + | ||
| - | # modprobe pps-ktimer | + | |
| - | + | ||
| - | and the run '' | + | |
| - | + | ||
| - | $ ./ppstest /dev/pps1 | + | |
| - | | + | |
| - | found PPS source "/ | + | |
| - | ok, found 1 source(s), now start fetching data... | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | Please note that to compile userland programs, you need the file '' | + | |
| - | This is available in the **pps-tools** repository mentioned above. | + | |
| - | + | ||
| - | ===== Generators ===== | + | |
| - | + | ||
| - | Sometimes one needs to be able not only to catch PPS signals but to produce | + | |
| - | them also. For example, running a distributed simulation, which requires | + | |
| - | computers' | + | |
| - | invent some complicated hardware solutions but it may be neither necessary | + | |
| - | nor affordable. The cheap way is to load a PPS generator on one of the | + | |
| - | computers (master) and PPS clients on others (slaves), and use very simple | + | |
| - | cables to deliver signals using parallel ports, for example. | + | |
| - | + | ||
| - | Parallel port cable pinout: | + | |
| - | pin | + | |
| - | 1 | + | |
| - | 2 | + | |
| - | 3 | + | |
| - | 4 | + | |
| - | 5 | + | |
| - | 6 | + | |
| - | 7 | + | |
| - | 8 | + | |
| - | 9 | + | |
| - | 10 ACK | + | |
| - | 11 BUSY * * | + | |
| - | 12 PE * * | + | |
| - | 13 SEL | + | |
| - | 14 | + | |
| - | 15 ERROR | + | |
| - | 16 INIT * * | + | |
| - | 17 SELIN | + | |
| - | 18-25 | + | |
| - | + | ||
| - | Please note that parallel port interrupt occurs only on high-> | + | |
| - | so it is used for PPS assert edge. PPS clear edge can be determined only | + | |
| - | using polling in the interrupt handler which actually can be done way more | + | |
| - | precisely because interrupt handling delays can be quite big and random. So | + | |
| - | current parport PPS generator implementation ('' | + | |
| - | geared towards using the clear edge for time synchronization. | + | |
| - | + | ||
| - | Clear edge polling is done with disabled interrupts so it's better to select | + | |
| - | delay between assert and clear edge as small as possible to reduce system | + | |
| - | latencies. But if it is too small slave won't be able to capture clear edge | + | |
| - | transition. The default of 30us should be good enough in most situations. | + | |
| - | The delay can be selected using '' | + | |
| - | + | ||
| - | ===== Resources ===== | + | |
| - | + | ||
| - | A LinuxPPS' | + | |
| ===== Contributors ===== | ===== Contributors ===== | ||
| Line 217: | Line 56: | ||
| ==== PayPal ==== | ==== PayPal ==== | ||
| - | * Kenji Hiranuma | + | |
| - | * [[http:// | + | |
| Other contributions can be done via [[http:// | Other contributions can be done via [[http:// | ||
| Line 225: | Line 64: | ||
| ==== Hardware ==== | ==== Hardware ==== | ||
| - | * [[http:// | + | |
| ==== Misc ==== | ==== Misc ==== | ||
| Line 231: | Line 70: | ||
| [[https:// | [[https:// | ||
| - | * Many thanks to [[https:// | + | |
| - | * Thanks to [[mailto:andreas.puls@meinberg.de|Andreas Puls]] for the LinuxPPS' | + | |
| - | * Thanks to [[http:// | + | |
start.1535540175.txt.gz · Last modified: by giometti
