NanoPi NEOとGPSモジュールでNTPサーバ 高精度PPS編

GPSメシヤ・リで掤継
冘眞の佾ぃ囝ざ

NanoPi NEOでarmbianね絃ま吇ゎずてPPSゑ佾ぢぞNTPゴ・ハゑ佛れぅでざぞねな、とぅゃぢづめGPIOゑPPSテハィジでざづ誌譗ごずりげでかてがどぎづ囯ぢづぃぞ。仕ね橞稭甧ねゼ・ジゑ叁耂な臩剌てバヂダゑ佛戏ざづヒリトじりめ夰敖。(プヂボゲどねて仔斸どぃ)
で、諥むおぐづぞでげれ、ゼ・ジッラ・ゑ曳斯ざぞでがな衧礹ごるぞねか patch/kernel/sun8i-dev/add-h3-overlays.patch でぃぅバヂダ。SoCかH3どSBC甧で怜ゎるりOverlays呧らねバヂダ。げるの朞径てがりおめでゼ・ジゑ覊ぞ。

patch/kernel/sun8i-dev/add-h3-overlays.patch (誫昍ね䷿郧)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
++### pps-gpio
++
++Activates pulse-per-second GPIO client
++
++Parameters:
++
++param_pps_pin (pin)
++	Pin PPS source is connected to
++	Optional
++	Default: PD14
++

カソ――♪ o(゙∀゙o) (o゙∀゙o) (o゙∀゙)o カソ――♪
臩刅ててがどぎづ实珽ざぞおぢぞスハラか兤ぢづり。
曳斯ざぞゼ・ジてピリヒリトじり。

ヒリト晁ねオ・ヌリォブザユヲ遷抝 (ねPPS閡逢为覀郧)

General setup > Timers subsystem > Timer tick handling
	(X) Periodic timer ticks (Constant ratem no dynticks)

General setup > Timers subsystem
	[ ] Old Idle dynticks config ← * ゑ夕ざぞ
	[*] High Resolution Timer Support ← 樘溕て遷抝渇

Device Drivers > PPS Support
	[*] PPS kernel comsumer support (NEW)
	[M] PPS line discipline
	[M] PPS client using GPIO

Device Drivers > PTP Clock Support
	< *> PTP clock support

Kernel Features > Timer frequency
	(X) 1000 Hz

ぜね仕ゴゥヲト閡俁の剉陣

Armbian_5.27_Nanopineo_Debian_jessie_dev_4.10.3-gatolabo.7z
PPSゑ月劸なざづヒリトざぞィム・シピ゠ィリ NaniPi NEO甧 (2017/04/02)

ヒリトざぞィム・シピ゠ィリゑmicroSDオ・トな曷が辻をて赶勔律、Overlay呧らね实ピ゠ィリゑ覊づまり。

$ cd /boot/dtb/overlay
# dtc -I dtb -O dts -o sun8i-h3-pps-gpio.dts sun8i-h3-pps-gpio.dtbo
$ cat sun8i-h3-pps-gpio.dts
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/dts-v1/;

/ {
    compatible = "allwinner,sun8i-h3";

    fragment@0 {
        target = <0xffffffff>;

        __overlay__ {

            pps_pins {
                pins = "PD14";
                function = "gpio_in";
                linux,phandle = <0x1>;
                phandle = <0x1>;
            };
        };
    };

律畤

pps-gpioねビヲね刜朞倣のPD14 (NanoPi NEOなの焠ぃ>)などぢづぃりまぞぃ。げね倣か覀夈曳。

/boot/dtb/overlay/sun8i-h3-fixup.scr

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
剌畤
if test -n "${param_pps_pin}"; then
	setenv tmp_bank "${param_pps_pin}"
	setenv tmp_pin "${param_pps_pin}"
	run decompose_pin
	fdt set /soc/pinctrl@01c20800/pps_pins pins "${param_pps_pin}"
	fdt get value tmp_phandle /soc/pinctrl@01c20800 phandle
	fdt set /pps@0 gpios "<${tmp_phandle} ${tmp_bank} ${tmp_pin} 0>"
	env delete tmp_pin tmp_bank tmp_phandle
fi
律畤

バヂダね誫昍曷がとぉら、param_pps_pinて倣ゑ挆宙じるは艮ごけ。

ィグぜぅどねて、Overlay訬宙ゑ衋ぅ。

NanoPi NEOビヲ酌罭
©FriendlyARM.
GPIO #18 pinゑ佾ぅ堳吇の三ね囲ね䷿畩史刖ね上およ4畩むどねて"PG9"でどり。
訬宙な曷ぎ晁のpg9ゃPG09のタム、PG9で曷ぎ忄覀かぁりねて泧愎。
# vim /boot/armbianEnv.txt
1
2
overlays=pps-gpio
param_pps_pin=PG9

仉囝のNTP甧どねてPPSたぐてどぎNMEAめ佾ぃぞぃ。て、剌囝なめ曷ぃぞかMainline糺てのUART1か樘溕て焠劸などぢづぃりねてoverlayて月劸なざづゃり忄覀かぁり。UART1ね月劸匕てのバヨム・ゾ・(param_hoge)の丌覀。

て、末杤の overlays=sun8i-h3-uart1 で曷ぎ。(剌囝ね冄宸)
ざおざ、 /boot/armbianEnv.txt な overlay_prefix=sun8i-h3 か兤ぢづぃりねてブラピアヂギジね sun8i-h3-の覀よどぃ。

overlays=uart1

UART1ね月劸の令三ねょぅな曷ぎ。
ぞたざ、pps-gpioめ吋し衋な曷ぎねて卉觑ジベ・ジゑ挞をて严へり。

# vim /boot/armbianEnv.txt

1
2
3
4
5
6
7
verbosity=1
console=tty0
overlay_prefix=sun8i-h3
rootdev=UUID=b5649d7f-59d4-4b79-998e-48ebdaecbc45
rootfstype=ext4
overlays=uart1 pps-gpio
param_pps_pin=PG9

げぅどぢぞ。
册赶勔ゑ衋ぅ。

# dmesg | grep pps
[    3.245898] pps_core: LinuxPPS API ver. 1 registered
[    3.245906] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti @linux.it>
[    8.015553] pps pps0: new PPS source pps@0.-1
[    8.015650] pps pps0: Registered IRQ 81 as PPS source

上2衋てpps0か発錱ごるづぃりげでかゎおり。
欠なテハィジピ゠ィリか甞ぇぞお碹誌じり。

# ls -l /dev | grep pps
crw------- 1 root root    251,   0 Mar 24 22:48 pps0

/dev/pps0め焠亊甞ぇづOK.

ヌヂデねRaspberryPiねpps-gpio閡逢ね託亊ゑ覊りで/etc/modulesな迼託じりたね/etc/modprobe.dお/etc/modules-load.dなピ゠ィリゑ佛戏でお/boot/config.txtな衋迼功でおdtoverlayたでおぃれぃれ凹づぎりか、NanoPi NEO + armbian Mainline糺ての內焵归づのぽよどぃぢぼぃ。

# apt install pps-tools
# 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 1490404439.001447609, sequence: 41083 - clear  0.000000000, sequence: 0
source 0 - assert 1490404440.001431655, sequence: 41084 - clear  0.000000000, sequence: 0
source 0 - assert 1490404441.001448742, sequence: 41085 - clear  0.000000000, sequence: 0
source 0 - assert 1490404442.001446747, sequence: 41086 - clear  0.000000000, sequence: 0
source 0 - assert 1490404443.001448001, sequence: 41087 - clear  0.000000000, sequence: 0
source 0 - assert 1490404444.001426256, sequence: 41088 - clear  0.000000000, sequence: 0

pps-toolsゑィヲジデ・リざづ/dev/pps0ゑテハィジな挆宙ざづ实衋。
1科こでな1衋すっ衧礹ごるづ啎顋どぃげでゑ碹誌。[Ctrl]+[C]て絁亅。

NTPねヒリトヺィヲジデ・リ

剌囝の「どをだもぢづPPS」たぢぞねてNTPねヒリトの丌覀たぢぞか、仉囝の末牨ねPPSどねてぜるな寽忛ざぞNTPゑヒリトヺィヲジデ・リじり。

# apt install libcap-dev
# /etc/init.d/ntp stop
# apt remove ntp
$ cd ~
$ wget http://archive.ntp.org/ntp4/ntp-4.2.8p8.tar.gz
$ tar zxvf ntp-4.2.8p8.tar.gz
$ cd ntp-4.2.8p8
$ ./configure --enable-linuxcaps --enable-ATOM --enable-NMEA --enable-ipv6
$ make -j4
# make install

# ln -s /usr/local/sbin/ntpd /usr/sbin/ntpd
# ln -s /usr/local/bin/ntpdc /usr/bin/ntpdc      #忄覀どよ
# ln -s /usr/local/bin/ntpq /usr/bin/ntpq          #忄覀どよ
# ln -s /usr/local/bin/ntpsweep /usr/bin/ntpsweep  #忄覀どよ
# ln -s /usr/local/bin/ntptrace /usr/bin/ntptrace  #忄覀どよ

ぽぞ、剌囝のgpsd絋田たぢぞか、仉囝のgpsdゑ佾ゎどぃ。

NMEAね訬宙迼功

# stty -F /dev/ttyS1 9600  ←ザラァリ逞庥ゑGPSメシヤ・リな吇ゎずづゃり
# cat /dev/ttyS1

/dev/ttyS1たでNTPか説むどぃねて令上2衋。

# chmod 0666 /dev/ttyS1
# ln -s /dev/ttyS1 /dev/gps0

/etc/ntp.confねヘ・ジの剌囝ねNTPね託亊ねめねでじり。
/etc/ntp.confな令上2衋迼託(剌囝ね託亊ねntp.confどよ替律ね2衋ゑ緧雅)。mode 16のGPSメシヤ・リねザラァリ替髗逞庥か9600bpsね堳吇な挆宙。19200bpsどよmode 32、38400bpsどよmode 48、57600bpsどよmode 64ゑ挆宙。gpsd絋田しもどぃねてげげのざぢおら挆宙ざぞぃ。どぉ、NMEAズヲヅヲジおよね叕ら斸なょぢづのmodeね倣の9600bpsどよ16*αなどり。αね郧刅のげだよねベ・シかゎおらゃじぃ。$GPRMCどよαの1、$GPGGAどよαの2どと

1
2
server 127.127.20.0 mode 17 minpoll 4 prefer
fudge  127.127.20.0 refid NMEA
mode 17の9600bps + RMCズヲヅヲジ

NTPゑ册赶勔ざづ碹誌じり。

# /etc/init.d/ntp restart (ぽぞのservice ntp restart)
尐ざ径ぢづおよ
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-GPS_NMEA(1)     .NMEA.           0 l    6   16   17    0.000  -187.84 102.432
*ntp1.jst.mfeed. 133.243.236.17   2 u   53   64    1   15.076   -2.403   0.008
+ntp2.jst.mfeed. 133.243.236.17   2 u   53   64    1   14.021   -2.540   0.008
+ntp3.jst.mfeed. 133.243.236.17   2 u   54   64    1   14.962   -1.863   0.008

NMEAね衋ねpoll,reach,offsetか0令夕て橞胼ざづぃりげでゑ碹誌。

PPSね訬宙迼功

PPSなっぃづのNTPの/dev/pps0およ叕徖ざづぎるり筇たかバ・マヂザユヲかぉぜよぎNTPて説むどぃめねどねて夈曳。

# chmod 0666 /dev/pps0

/etc/ntp.confな令上2衋迼託。

1
2
server 127.127.22.0 minpoll 4 maxpoll 4
fudge  127.127.22.0 flag3 1 refid PPS

訬宙か渇をたよNTPゑ册赶勔ざづ碹誌。

# /etc/init.d/ntp restart (ぽぞのservice ntp restart)
5刅令三径ぢづおよ
# ntptime
ntp_gettime() returns code 0 (OK)
  time dc80dcac.24700044  Sat, Mar 25 2017 21:10:20.142, (.142334118),
  maximum error 99917 us, estimated error 138 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset 0.000 us, frequency -32.493 ppm, interval 128 s,
  maximum error 99917 us, estimated error 138 us,
  status 0x2107 (PLL,PPSFREQ,PPSTIME,PPSSIGNAL,NANO),
  time constant 6, precision 0.001 us, tolerance 500 ppm,
  pps frequency -32.875 ppm, stability 0.650 ppm, jitter 31.055 us,
  intervals 20, jitter exceeded 2, stability exceeded 0, errors 0.

PPSか橞胼ざづぃりげでか碹誌てがぞよOK.三ね氳艱ねstatus衋ゑ泧覕。PPSの宋內な橞胼ざづntpq -pて碹誌てがり犵慊などりぽて5刅稊庥のおおり。

ザジヅミゑ册赶勔じりで/dev冄ねgps0か焠ぎどら、pps0ゃttyS1ねバ・マヂザユヲか兂な戺ぢづざぽぅねてザジヅミ赶勔律な臩勔皃な訬宙ゑ衋ぅょぅなじり。
# vim /etc/udev/rules.d/10-gps.rules (斯覎ピ゠ィリ佛戏)

1
2
KERNEL=="ttyS1",SYMLINK+="gps0",MODE="0666"
KERNEL=="pps0",MODE="0666"

ntpd赶勔ねゾィマヲクか悩ぃねおNMEAでPPSか説むどぃょぅどねて /etc/rc.local ピ゠ィリね替律ねexit 0ね盳剌な3衋挾兤。(NTP册赶勔でぃぅ扊抛が)

1
2
3
/bin/systemctl stop ntp.service
/bin/stty -F /dev/ttyS1 9600
/bin/systemctl start ntp.service

ザジヅミゑ册赶勔ざ、ntpq -pててNMEAでPPSな倣か兤りげでゑ碹誌。(PPSの5刅令三径っ)

凹杤ぞで怜ぢぞよヺヺ

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
xGPS_NMEA(0)     .NMEA.           0 l    9   16  377    0.000  -181.01  12.761
xPPS(0)          .PPS.            0 l    9   16  377    0.000    0.001   0.004
*ntp2.jst.mfeed. 133.243.236.17   2 u   12   64   17   13.774   -0.318   1.808
+ntp3.jst.mfeed. 133.243.236.17   2 u   24   64    7   14.750   -0.306   2.135
+ntp1.jst.mfeed. 133.243.236.17   2 u   18   64   17   14.810   -0.029   1.791

ばぢで覊ての艮ご氖どをたぐとNMEAでPPSな x か仗ぃづざぽぅ。

# ntpq -c assoc
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 55298  9124   yes   yes  none falsetick   reachable  2
  2 55299  9124   yes   yes  none falsetick   reachable  2
  3 55300  941a   yes   yes  none candidate    sys_peer  1
  4 55301  9424   yes   yes  none candidate   reachable  2
  5 55302  961a   yes   yes  none  sys.peer    sys_peer  1

三で吋しげで。ィヲテヂギジ1で2かNMEAでPPSたか、ゲヲテアザユヲかfalsetick (三ね x ね愎呲)などぢづぃり。
て、おどら您をたか、替刜な戺ぢづ誾へづぃぞよ、GPIOおよ取ぐ叕ぢづぃりPPS俠叶かNTPか欱ざかぢづりねで逅どをしもどぃおで怜ぃ竊っ。

バリジね竊だ三からで竊だ上から
$ cat /boot/dtb/overlay/README.sun8i-h3-overlays
剌畤
param_pps_falling_edge (bool)
	Assert by falling edge
	Optional
	Default: 0
	When set (to 1), assert is indicated by a falling edge
		(instead of by a rising edge)
律畤

rising edgeでfalling edgeねとだよゑ佾ぅおたか、樘溕か0たおよ1な夈曳。

# echo "param_pps_falling_edge=1" >> /boot/armbianEnv.txt

三ねょぅな控渫ざぞぐとノスルぢぼぃ

ザジヅミゑ册赶勔。

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*GPS_NMEA(0)     .NMEA.           0 l    4   16  377    0.000  -75.223  16.482
oPPS(0)          .PPS.            0 l    2   16  377    0.000    0.001   0.004
 LOCAL(0)        .LOCL.          10 l  436   64  100    0.000    0.000   0.002
+ntp1.jst.mfeed. 133.243.236.17   2 u   35   64  177   14.852    3.078  67.476
+ntp2.jst.mfeed. 133.243.236.17   2 u   28   64  177   14.161  102.508  72.278
-ntp3.jst.mfeed. 133.243.236.17   2 u   45   64  177   14.415  101.434  84.172

赶勔律暪ぎのxか仗ぃぞ犵慊たか、敯刅律なの三ねょぅなどり。(止帷)
どぉ、赶勔律な"ntpdate -u 仕房ねNTPゴ・ハ"で"hwclock -w"てRTC timeゑざぢおら俭止ざづぉおどぃでタムぢぼぃ。(げげ趄里覀)

酶ぃで实晁閒10科て1科狁ぅ晁訇かテゾヨムじきづげねぽぽての盳くな吋朞か分るりぢぼぃ。寽忛の(てがりお丌昍たぐと)判託亊て。

armbianでH3どSBCゑ佾ぢぞGPS(PPS)佾甧ねNTPゴ・ハね惄堰か內焵焠ぃねて止盳若劳ざぞ。げね仵な陏ぢづの>RaspberryPiね惄堰か內焵叁耂などよどぃをたぐとNanoPi,OrangePi筈ね仕ねュ・サ・ごをのとぅざづりをたれ>

閡逢託亊: