2026年4月9日木曜日

Time server, reloaded

 前回書いてから、家のリフォームがあったり、Jetson Nanoでarmbianがどうにもうまく動かないとかLichee Zero DockでDVPなカメラ(モジュール)を動かすためにbuildrootするとか結局DVP I/F周りが壊れてしまったらしくV3Sがチンチンになっちまう(Linux自体は走行している)、みたいな、ネタになりそうなことはそれなりに無くはなかったのだけど、まとめるモチベはちょっと無かった。

とはいえ、ぼーっとPrimeVideoばっかり眺めてても仕方ない。


GPSとgpsd

昔制作したtime server、Trimbleの古いGPSを使っているのだけどもバックアップバッテリが切れてしまっていて、再起動が必要になるたびに、NMEAモード及び通信モード切り替え(Trimbleなのでデフォルトは、TSIPでかつUARTによるシリアル通信モードは9600bps 8O1であるため、NMEAモード切替と通信モード9600N1への設定変更を、Windowsを使って実施)をしてやらないとならない。最初に製作したときは、テキストでgpsデータを読むことができるNMEAモードを使ってちゃんと衛星掴めているかどうかなど目視していたのだけど、実際、gpsdとクライアントが使えていれば、ASCIIテキストである必要はもうない。通信モード(パリティ設定)を変えないとならないのは、Jammyに含まれているgpsdが、8N1じゃないと通信できないためで、バッテリが切れてしまったとき、初期状態のgpsを使えないが故だった。


systemd

gpsdのクライアントであるcgpsでは、NMEAじゃなくともTSIPをハンドリングできるので(gpsmonはだめだが)、Linuxサイドで起動時にUARTの通信モードを8N1から8O1へ変更してやればよい。それをやるにはsystemdを使って、gpsdが立ち上がる前にsttyしてやれば良い(のだけど、gpsdは、nobleのものならparityを自動判別しているようには思うので、仮にgpsモジュールのデフォルトが8N1ではないとしても、何もしなくても動くかもしれない…)。

gpsは、Nanopi NeoのttyS2に接続、ppsはPA6に接続しているので、armbianEnv.txtに

param_pps_pin=PA6

追加し、gpsdを起動するgpsd.serviceに:

ExecStartPre=/bin/stty speed 9600 parenb parodd cs8 -cstopb -F /dev/ttyS2

を追加してリロードさせてやれば良いことになる。

pps

念の為(…)、Windows用の設定ツールを使ってgpsのpps出力が有効であることを確認、armbian側で設定が認識されているようではあるのだけど、ppstestではなかなかうまくfetchできていない。

$ sudo ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
time_pps_fetch() error -1 (Connection timed out)
...

PPS信号の立ち上がりを使うのか立ち下がりを使うのか?デフォルトは立ち上がりのはず。

$ sudo cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-223, parent: platform/1c20800.pinctrl, 1c20800.pinctrl:
 gpio-6   (                    |pps@0               ) in  lo IRQ 
 gpio-166 (                    |cd                  ) in  lo ACTIVE LOW
 gpio-204 (                    |usb0_id_det         ) in  hi IRQ 

立ち下がりで割り込み検出?
なら、armbianEnv.txtにparam_pps_falling_edge=1を追加して立ち下がりにしてみると、ppstest上は検出できるようになる。

$ sudo ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1775693725.000138656, sequence: 55 - clear  0.000000000, sequence: 0

chrony

NTPサーバーとしてはchronyが最近はよく使われるようで、使ってみることにする。よくGPSとの組み合わせではNMEAメッセージも使うように設定されているようだけど、ppsだけ使えれば良いので、次の一行をchrony.confの最後に追加。

refclock PPS /dev/pps0 refid PPS

次の状況。

$ chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#* PPS                           0   4   377    16   +737ns[+1442ns] +/- 1891ns
^- alphyn.canonical.com          2   6   337    45  +3332us[+3329us] +/-  120ms
...

ということで、ppsがソースとして使われるようになりました。

0 件のコメント:

コメントを投稿