快速瀏覽

使用 GPS/PPS 構建 NTP 服務器的指南


 
使用我們的自定義設置4.9.141 內核上的 ODROID-N2 中進行測試確認操作

您可以在 ODROID 上使用 GPS 和 PPS 構建自己的 NTP 服務器。
我們將在 NTP 服務上使用現代NMEA 驅動程序

要求:

這為您提供了非常準確的時間,並且對特定用例很有幫助。
GPS 衛星中的原子鐘由 GPS 操作控制部分監測並與“主時鐘”進行比較;這個“GPS 時間”被控制在世界時間的一微秒內。
我們的 GPS 接收器提供 1PPS 輸出信號,但您需要銲線。
該脈衝的上升沿與 GPS 秒對齊,用於調整本地時鐘以保持與世界時 (UT) 的同步。
所以我們的本地服務器可以有一個非常準確的時間,有希望小於 10 微秒的容差。


在開始之前,您必須修復 USB GPIO 模塊以通過 GPIO 放置 PPS。 需要的工具有:

  • 一個鉗子
  • 一把螺絲起子
  • 絕緣膠帶
  • 刀具
  • 一根跳線
  • 焊接工具(不在上面的屏幕截圖中)
拆解GPS模塊

GPS模塊背面有4顆螺絲。它們被背面貼紙覆蓋,因此您應該通過摩擦找出它們的位置。
之後,剪下貼紙,拆下剪掉的部分,擰下 4 個螺絲。
您可以查看以下照片以獲取幫助。

揭開並焊接

打開模塊,你可以看到一塊PCB板,這是你必須焊接的。 本指南非常重要的部分。您必須將跳線焊接到芯片的確切引腳上 圖釘的位置如下圖所示。小心短路。PPS從那個引腳出來。 如果你這樣做了,你可以清理電纜,如下圖所示。

組裝和連接

像以前一樣放置它,然後再次擰出。 將跳線連接到GPIO 引腳 #11 將 USB 線連接到 ODROID-N2,並連接LAN和電源線。 做得好。




我們的主線內核不完全支持來自 GPIO 的 PPS。一些必需的設置應該由您完成。
所以你應該在你的 ODROID-N2 上構建你自己的內核。

  • 本指南適用於在您的 ODROID-N2 上進行本機構建。不要繼續使用您的 PC。
  • 首先安裝我們的 Ubuntu 映像並更新/升級。
sudo apt update \
 &&  sudo apt install  git  gcc build-essential libncurses-dev bc

從我們的官方 Github 存儲庫中獲取 Linux 內核源代碼。

git clone --depth 1 https://github.com/hardkernel/linux.git -b odroidc4-4.9.y odroidc4-4.9.y \
&& cd odroidc4-4.9.y

編輯arch/arm64/boot/dts/amlogic/meson64-odroidn2.dts文件以添加一個從 GPIO #11 獲取 PPS 的新設備。

vi arch / arm64 / boot / dts / amlogic / meson64-odroidc4.dts

添加以下內容。

/ {
        ...
 
 
        /* add for pps-gpio */
        pps {
                compatible = "pps-gpio";
                gpios = <&gpio GPIOX_3 GPIO_ACTIVE_HIGH>;
                status = "okay";
        };
};
        ...

並製作自定義菜單配置。

make odroidc4_defconfig
make menuconfig

使用空格鍵查找並啟用:

  • 設備驅動程序→[*]PPS 支持
  • 設備驅動程序→[*]PPS 支持→<M>使用 GPIO 的 PPS 客戶端

保存結束退出。


簡單的。

make -j$ ( expr $ ( nproc ) - 1 )

然後安裝新內核。

sudo  make modules_install \
 &&  sudo  cp  -f arch / arm64 / boot / Image.gz / media / boot \
 &&  sudo  cp  -f arch / arm64 / boot / dts / amlogic / meson64_odroidc4.dtb / media / boot \
 &&  sudo  sync
sudo reboot

如果您的自定義設置運行良好,則會在/dev 上創建新設備。讓我們檢查一下。

ls  -al  / dev / { ttyACM * ,gps * ,pps * }
# results 
crw------- 1 root root     248 , 0 Jan 31  14 : 21  / dev / pps0 
crw-rw---- 1 root dialout 166 , 0 Jan 31  14 : 53  / dev / ttyACM0

如果上面例子中的任何一個不存在,你做錯了,嘗試再次設置/構建內核。

如果所有這些都存在,請製作軟鏈接文件以供以後進一步使用。

sudo ln -sF /dev/ttyACM0 /dev/gps0
sudo ln -sF /dev/pps0 /dev/gpspps0
ls -al /dev/{ttyACM*,gps*,pps*}
# results
lrwxrwxrwx 1 root root        12 Jan 31 15:50 /dev/gps0 -> ttyACM0
lrwxrwxrwx 1 root root         9 Jan 31 15:51 /dev/gpspps0 -> /dev/pps0
crw------- 1 root root    248, 0 Jan 31 15:50 /dev/pps0
crw-rw---- 1 root dialout 166, 0 Jan 31 15:50 /dev/ttyACM0

確保您的結果如上。


 

安裝 GPS 相關包並進行配置。

sudo apt install gpsd gpsd-clients \
 &&  sudo dpkg-reconfigure gpsd

並測試。

sudo gpsmon /dev/gps0

使用“gpsmon /dev/gps0”的示例截圖。

等待 5 分鐘以上才能正確獲取 GPS 信息。


安裝 PPS 工具。

sudo apt install pps-tools

測試。

sudo ppstest /dev/gpspps0
# results
trying PPS source "/dev/gpspps0"
found PPS source "/dev/gpspps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1517363638.431673232, sequence: 130 - clear  0.000000000, sequence: 0
source 0 - assert 1517363639.431676649, sequence: 131 - clear  0.000000000, sequence: 0
...

每秒鐘都會添加一個 以“source 0-assert …”開頭的新行。


安裝NTP服務。

sudo apt install ntp

編輯/etc/ntp.conf文件以使用 GPS/PPS。

備份原始文件,並創建一個新的配置文件,包括下面的設置。

sudo mv /etc/ntp.conf /etc/ntp.conf.bak
sudo vi /etc/ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

# Drift file to remember clock rate across restarts
driftfile /var/lib/ntp/ntp.drift

# Server from generic NMEA GPS Receiver
# server: NMEA serial port (/dev/gps0), mode 16 = 9600 baud + 2 = $GPGGA
# fudge:  flag 1 for use PPS (/dev/gpspps0), time2 for calibration time offset
server 127.127.20.0 mode 18 minpoll 3 maxpoll 3 prefer
fudge 127.127.20.0 flag1 1 time2 0.000 refid gPPS

請注意,time2 參數(0.000)用於編輯時間偏移以校準結果時間。
最後,重啟NTP服務。

sudo service ntp restart
sudo service ntp status
# results
● ntp.service - LSB: Start NTP daemon
   Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
   Active: active (running) since Wed 2018-01-31 17:44:58 KST; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 744 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
  Process: 754 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/ntp.service
           └─765 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 111:115
 
Jan 31 17:44:58 odroid ntp[754]:    ...done.
Jan 31 17:44:58 odroid systemd[1]: Started LSB: Start NTP daemon.
Jan 31 17:44:58 odroid ntpd[765]: proto: precision = 1.375 usec (-19)
Jan 31 17:44:58 odroid ntpd[765]: Listen and drop on 0 v6wildcard [::]:123
Jan 31 17:44:58 odroid ntpd[765]: Listen and drop on 1 v4wildcard 0.0.0.0:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 2 lo 127.0.0.1:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 3 eth0 192.168.100.28:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 4 lo [::1]:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 5 eth0 [fe80::4db2:ce0b:48f3:26af%2]:123
Jan 31 17:44:58 odroid ntpd[765]: Listening on routing socket on fd #22 for interface updates

稍等片刻,至少要20分鐘才能穩定。

PPS 輸出只有在穩定獲得多顆衛星時才啟用。

你可以在下面看到結果。

ntpq -p
# results; Check that 'o' character exists before IP numbering and reach value is increasing up to 377.
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
oGPS_NMEA(0)     .gPPS.           0 l    1    8  377    0.000    0.008   0.002
ntptime
# results; Check that estimated error is just 1 us(Microsecond).
ntp_gettime() returns code 0 (OK)
  time de1bee1d.49adfb50  Wed, Jan 31 2018 16:26:21.287, (.287811636),
  maximum error 2000 us, estimated error 1 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset -3.606 us, frequency 1.000 ppm, interval 1 s,
  maximum error 2000 us, estimated error 1 us,
  status 0x2001 (PLL,NANO),
  time constant 3, precision 0.001 us, tolerance 500 ppm,

快速瀏覽

ODROID-C4

四核ARM CORTEX-A55 |4GB RAM |4 USB3 PORTS