Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) .. SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) ======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) PPS - Pulse Per Second
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) ======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) Copyright (C) 2007 Rodolfo Giometti <giometti@enneenne.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) Overview
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) --------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) LinuxPPS provides a programming interface (API) to define in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) system several PPS sources.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) PPS means "pulse per second" and a PPS source is just a device which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) provides a high precision signal each second so that an application
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) can use it to adjust system clock time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) A PPS source can be connected to a serial port (usually to the Data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) Carrier Detect pin) or to a parallel port (ACK-pin) or to a special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) CPU's GPIOs (this is the common case in embedded systems) but in each
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) case when a new pulse arrives the system must apply to it a timestamp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) and record it for userland.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) Common use is the combination of the NTPD as userland program, with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) GPS receiver as PPS source, to obtain a wallclock-time with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) sub-millisecond synchronisation to UTC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) RFC considerations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) ------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) While implementing a PPS API as RFC 2783 defines and using an embedded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) CPU GPIO-Pin as physical link to the signal, I encountered a deeper
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) problem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)    At startup it needs a file descriptor as argument for the function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)    time_pps_create().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) This implies that the source has a /dev/... entry. This assumption is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) OK for the serial and parallel port, where you can do something
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) useful besides(!) the gathering of timestamps as it is the central
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) task for a PPS API. But this assumption does not work for a single
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) purpose GPIO line. In this case even basic file-related functionality
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) (like read() and write()) makes no sense at all and should not be a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) precondition for the use of a PPS API.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) The problem can be simply solved if you consider that a PPS source is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) not always connected with a GPS data source.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) So your programs should check if the GPS data source (the serial port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) for instance) is a PPS source too, and if not they should provide the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) possibility to open another device as PPS source.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) In LinuxPPS the PPS sources are simply char devices usually mapped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) into files /dev/pps0, /dev/pps1, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) PPS with USB to serial devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) ------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) It is possible to grab the PPS from an USB to serial device. However,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) you should take into account the latencies and jitter introduced by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) the USB stack. Users have reported clock instability around +-1ms when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) synchronized with PPS through USB. With USB 2.0, jitter may decrease
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) down to the order of 125 microseconds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) This may be suitable for time server synchronization with NTP because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) of its undersampling and algorithms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) If your device doesn't report PPS, you can check that the feature is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) supported by its driver. Most of the time, you only need to add a call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) to usb_serial_handle_dcd_change after checking the DCD status (see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) ch341 and pl2303 examples).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) Coding example
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) --------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) To register a PPS source into the kernel you should define a struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) pps_source_info as follows::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)     static struct pps_source_info pps_ktimer_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	    .name         = "ktimer",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	    .path         = "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	    .mode         = PPS_CAPTUREASSERT | PPS_OFFSETASSERT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 			    PPS_ECHOASSERT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			    PPS_CANWAIT | PPS_TSFMT_TSPEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	    .echo         = pps_ktimer_echo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	    .owner        = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)     };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) and then calling the function pps_register_source() in your
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) initialization routine as follows::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)     source = pps_register_source(&pps_ktimer_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 			PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) The pps_register_source() prototype is::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)   int pps_register_source(struct pps_source_info *info, int default_params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) where "info" is a pointer to a structure that describes a particular
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) PPS source, "default_params" tells the system what the initial default
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) parameters for the device should be (it is obvious that these parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) must be a subset of ones defined in the struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) pps_source_info which describe the capabilities of the driver).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) Once you have registered a new PPS source into the system you can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) signal an assert event (for example in the interrupt handler routine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) just using::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)     pps_event(source, &ts, PPS_CAPTUREASSERT, ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) where "ts" is the event's timestamp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) The same function may also run the defined echo function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) (pps_ktimer_echo(), passing to it the "ptr" pointer) if the user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) asked for that... etc..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) Please see the file drivers/pps/clients/pps-ktimer.c for example code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) SYSFS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) -------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) If the SYSFS filesystem is enabled in the kernel it provides a new class::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)    $ ls /sys/class/pps/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)    pps0/  pps1/  pps2/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) Every directory is the ID of a PPS sources defined in the system and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) inside you find several files::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)    $ ls -F /sys/class/pps/pps0/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)    assert     dev        mode       path       subsystem@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)    clear      echo       name       power/     uevent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) Inside each "assert" and "clear" file you can find the timestamp and a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) sequence number::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)    $ cat /sys/class/pps/pps0/assert
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)    1170026870.983207967#8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) Where before the "#" is the timestamp in seconds; after it is the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) sequence number. Other files are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  * echo: reports if the PPS source has an echo function or not;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)  * mode: reports available PPS functioning modes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)  * name: reports the PPS source's name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  * path: reports the PPS source's device path, that is the device the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)    PPS source is connected to (if it exists).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) Testing the PPS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) -----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) In order to test the PPS support even without specific hardware you can use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) the pps-ktimer driver (see the client subsection in the PPS configuration menu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) and the userland tools available in your distribution's pps-tools package,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) http://linuxpps.org , or https://github.com/redlab-i/pps-tools.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) Once you have enabled the compilation of pps-ktimer just modprobe it (if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) not statically compiled)::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)    # modprobe pps-ktimer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) and the run ppstest as follow::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)    $ ./ppstest /dev/pps1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)    trying PPS source "/dev/pps1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)    found PPS source "/dev/pps1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)    ok, found 1 source(s), now start fetching data...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)    source 0 - assert 1186592699.388832443, sequence: 364 - clear  0.000000000, sequence: 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)    source 0 - assert 1186592700.388931295, sequence: 365 - clear  0.000000000, sequence: 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)    source 0 - assert 1186592701.389032765, sequence: 366 - clear  0.000000000, sequence: 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) Please note that to compile userland programs, you need the file timepps.h.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) This is available in the pps-tools repository mentioned above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) Generators
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) ----------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) Sometimes one needs to be able not only to catch PPS signals but to produce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) them also. For example, running a distributed simulation, which requires
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) computers' clock to be synchronized very tightly. One way to do this is to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) invent some complicated hardware solutions but it may be neither necessary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) nor affordable. The cheap way is to load a PPS generator on one of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) computers (master) and PPS clients on others (slaves), and use very simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) cables to deliver signals using parallel ports, for example.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) Parallel port cable pinout::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	pin	name	master      slave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	1	STROBE	  *------     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	2	D0	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	3	D1	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	4	D2	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	5	D3	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	6	D4	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	7	D5	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	8	D6	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	9	D7	  *     |     *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	10	ACK	  *     ------*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	11	BUSY	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	12	PE	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	13	SEL	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	14	AUTOFD	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	15	ERROR	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	16	INIT	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	17	SELIN	  *           *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	18-25	GND	  *-----------*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) Please note that parallel port interrupt occurs only on high->low transition,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) so it is used for PPS assert edge. PPS clear edge can be determined only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) using polling in the interrupt handler which actually can be done way more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) precisely because interrupt handling delays can be quite big and random. So
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) current parport PPS generator implementation (pps_gen_parport module) is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) geared towards using the clear edge for time synchronization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) Clear edge polling is done with disabled interrupts so it's better to select
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) delay between assert and clear edge as small as possible to reduce system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) latencies. But if it is too small slave won't be able to capture clear edge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) transition. The default of 30us should be good enough in most situations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) The delay can be selected using 'delay' pps_gen_parport module parameter.