The newer protocol is the Precision Time Protocol (PTP), which is defined in the IEEE 1588-2008 standard.PTP was designed for local networks with broadcast/multicast transmission and, in ideal conditions, the system clock can be synchronized with sub-microsecond accuracy to the reference time.
需要在IMX8QXP板子上面验证PTP局域网时间戳同步,板子上面有AR8031工业以太网和88Q2110车载以太网。
PTP硬件支持
查看AR8031 PHY的手册,支持PTP功能:
查看88Q2110 PHY手册也支持PTP:
使用ethtool工具查看网卡支持的同步类型,都支持软件和硬件时钟同步。
root@genvict_imx8qxp:~# ethtool -T eth0【ar8031】
Time stamping parameters for eth0:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
all (HWTSTAMP_FILTER_ALL)
root@genvict_imx8qxp:~#
root@genvict_imx8qxp:~# ethtool -T eth1【88q2110】
Time stamping parameters for eth1:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 1
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
all (HWTSTAMP_FILTER_ALL)
PTP软件支持
在yocto项目中,已经有linuxptp的软件支持,位置在:meta-openembedded/meta-oe/recipes-connectivity/linuxptp/linuxptp_1.8.bb。
DESCRIPTION = "Precision Time Protocol (PTP) according to IEEE standard 1588 for Linux"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI = "http://sourceforge.net/projects/linuxptp/files/v${PV}/linuxptp-${PV}.tgz \
file://build-Allow-CC-and-prefix-to-be-overriden.patch \
file://no-incdefs-using-host-headers.patch \
file://0003-include-missing-time.h-for-time_t.patch \
file://0004-Adjust-include-header-sequence-to-avoid-duplicate-de.patch \
"
SRC_URI[md5sum] = "5688cdfe57932273e1dbf35b3b97b9a0"
SRC_URI[sha256sum] = "fa8e00f6ec73cefa7bb313dce7f60dfe5eb9e2bde3353594e9ac18edc93e5165"
EXTRA_OEMAKE = "ARCH=${TARGET_ARCH} \
EXTRA_CFLAGS='-D_GNU_SOURCE -DHAVE_CLOCK_ADJTIME -DHAVE_POSIX_SPAWN -DHAVE_ONESTEP_SYNC ${CFLAGS}'"
do_install () {
install -d ${D}/${bindir}
install -p ${S}/ptp4l ${D}/${bindir}
install -p ${S}/pmc ${D}/${bindir}
install -p ${S}/phc2sys ${D}/${bindir}
install -p ${S}/hwstamp_ctl ${D}/${bindir}
}
版本1.8,编译安装软件ptp4l,pmc,phy2sys,hwstam_ctl。还有一个工具软件ptpd2也是需要的:meta-openembedded/meta-networking/recipes-daemons/ptpd/ptpd_2.3.1.bb
SRC_URI = "http://downloads.sourceforge.net/project/ptpd/ptpd/${@get_sub(d)}/ptpd-${PV}.tar.gz \
file://ptpd-use-pkgconfig.patch \
file://ptpd.service \
file://ptpd.conf \
"
do_install() {
install -d ${D}${bindir} ${D}${mandir}/man8
install -m 0755 ${B}/src/ptpd2 ${D}${bindir}
install -m 0644 ${B}/src/ptpd2.8 ${D}${mandir}/man8
在openwrt系统中,也有对应的软件支持,有PACKAGE_linuxptp,但没有ptpd的支持。
ptp硬件时间
ptp4l测试主从设备之间时间同步延时情况,主设备:
root@genvict_imx8qxp:~# ptp4l -i eth1 -m -H
ptp4l[2354.723]: selected /dev/ptp1 as PTP clock
ptp4l[2354.725]: driver changed our HWTSTAMP options
ptp4l[2354.725]: tx_type 1 not 1
ptp4l[2354.725]: rx_filter 1 not 12
ptp4l[2354.725]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[2354.725]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[2354.726]: port 1: link up
ptp4l[2361.445]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[2361.446]: selected best master clock d2093a.fffe.ac82dc
ptp4l[2361.446]: assuming the grand master role
从设备:
root@genvict_imx8qxp:~# ptp4l -i eth1 -m -H -s
ptp4l[715.079]: selected /dev/ptp1 as PTP clock
ptp4l[715.081]: driver changed our HWTSTAMP options
ptp4l[715.081]: tx_type 1 not 1
ptp4l[715.081]: rx_filter 1 not 12
ptp4l[715.081]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[715.081]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[715.082]: port 1: link up
ptp4l[715.678]: port 1: new foreign master d2093a.fffe.ac82dc-1
ptp4l[719.679]: selected best master clock d2093a.fffe.ac82dc
ptp4l[719.679]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[720.678]: master offset -18555634823326863 s0 freq +0 path delay 0
ptp4l[721.678]: master offset -18555634823330933 s1 freq -4070 path delay 4658
ptp4l[723.679]: master offset 9306 s2 freq +5236 path delay 4652
ptp4l[723.679]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[724.680]: master offset 4661 s2 freq +3383 path delay 4658
ptp4l[725.679]: master offset 1847 s2 freq +1967 path delay 4664
ptp4l[726.679]: master offset 453 s2 freq +1127 path delay 4664
ptp4l[727.679]: master offset -204 s2 freq +606 path delay 4767
ptp4l[728.679]: master offset -288 s2 freq +461 path delay 4823
ptp4l[729.679]: master offset -173 s2 freq +490 path delay 4823
ptp4l[730.679]: master offset -87 s2 freq +524 path delay 4823
ptp4l[731.680]: master offset -43 s2 freq +542 path delay 4823
ptp4l[732.680]: master offset -9 s2 freq +563 path delay 4823
ptp4l[733.680]: master offset 0 s2 freq +569 path delay 4823
ptp4l[734.680]: master offset -1 s2 freq +568 path delay 4823
ptp4l[735.680]: master offset -3 s2 freq +566 path delay 4821
ptp4l[736.680]: master offset -5 s2 freq +563 path delay 4821
ptp4l[737.680]: master offset -4 s2 freq +562 path delay 4821
ptp4l[738.681]: master offset -11 s2 freq +554 path delay 4821
ptp4l[739.681]: master offset -10 s2 freq +552 path delay 4821
ptp4l[740.682]: master offset -2 s2 freq +557 path delay 4821
ptp4l[741.681]: master offset -3 s2 freq +555 path delay 4821
ptp4l[742.681]: master offset -7 s2 freq +550 path delay 4821
ptp4l[743.681]: master offset -6 s2 freq +549 path delay 4821
ptp4l[744.681]: master offset -4 s2 freq +549 path delay 4821
ptp4l[745.681]: master offset -6 s2 freq +546 path delay 4821
ptp4l[746.681]: master offset -17 s2 freq +533 path delay 4821
ptp4l[747.682]: master offset -2 s2 freq +543 path delay 4820
ptp4l[748.683]: master offset -6 s2 freq +539 path delay 4820
ptp4l[749.682]: master offset -5 s2 freq +538 path delay 4820
ptp4l[750.683]: master offset -7 s2 freq +534 path delay 4820
ptp4l[751.683]: master offset -6 s2 freq +533 path delay 4820
ptp4l[752.683]: master offset -4 s2 freq +534 path delay 4820
ptp4l[753.682]: master offset -2 s2 freq +534 path delay 4820
ptp4l[754.682]: master offset 4 s2 freq +540 path delay 4819
ptp4l[755.682]: master offset -3 s2 freq +534 path delay 4818
ptp4l[756.683]: master offset -1 s2 freq +535 path delay 4818
ptp4l[757.683]: master offset -8 s2 freq +528 path delay 4818
ptp4l[758.684]: master offset -8 s2 freq +525 path delay 4818
ptp4l[759.683]: master offset -18 s2 freq +513 path delay 4818
ptp4l[760.684]: master offset -10 s2 freq +516 path delay 4817
ptp4l[761.683]: master offset -10 s2 freq +513 path delay 4817
ptp4l[762.684]: master offset -11 s2 freq +509 path delay 4817
ptp4l[763.683]: master offset -4 s2 freq +512 path delay 4817
ptp4l[764.684]: master offset -9 s2 freq +506 path delay 4817
ptp4l[765.684]: master offset -7 s2 freq +505 path delay 4817
ptp4l[766.685]: master offset -14 s2 freq +496 path delay 4818
ptp4l[767.685]: master offset -15 s2 freq +491 path delay 4818
ptp4l[768.684]: master offset -1 s2 freq +501 path delay 4817
ptp4l[769.685]: master offset -10 s2 freq +491 path delay 4817
ptp4l[770.684]: master offset -22 s2 freq +476 path delay 4821
master offset : 即PTP协议中定义的主从端时间差,单位:ns
s0,s1,s2 : 表示时钟伺服器的不同状态,s0表示未锁定,s1表示正在同步,s2表示锁定,锁定状态表示不会再发生阶跃行同步,只是缓慢调整
port 0:INITIALIZING to LISTENING on INIT_COMPLET : 本地PTP管理的Unix域socket;
port 1:new foreign … : eno1上的端口;
从钟端口状态由UNCALIBRATED 变为SLAVE时,则从钟已经成功地与best master同步。
freq 值表示时钟的频率调整(以十亿分率 (ppb) 为单位)。
path delay 值表示从主时钟发送的同步消息的预计延迟(以纳秒为单位),该延迟可通过E2E或P2P(对等延迟请求/响应的点对点方法)方式测量,默认为E2E(延迟请求/响应的端到端方法)。
linuxptp源码中计算延迟代码:
int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, double *weight)
{
tmv_t delay, raw_delay = 0;
if (tmv_is_zero(tsp->t1) || tmv_is_zero(tsp->t2) ||
tmv_is_zero(tsp->t3))
return -1;
if (tsp->raw_mode || tsp->weighting)
raw_delay = get_raw_delay(tsp);
delay = tsp->raw_mode ? raw_delay : tsp->filtered_delay;
/* offset = t2 - t1 - delay */
*offset = tmv_sub(tmv_sub(tsp->t2, tsp->t1), delay);
enum servo_state clock_synchronize(struct clock *c, tmv_t ingress, tmv_t origin)
{
if (tsproc_update_offset(c->tsproc, &c->master_offset, &weight))
return state;
pr_info("master offset %10" PRId64 " s%d freq %+7.0f "
"path delay %9" PRId64,
tmv_to_nanoseconds(c->master_offset), state, adj,
tmv_to_nanoseconds(c->path_delay));
ptp4l参数:
root@genvict_imx8qxp:~# ptp4l -h
usage: ptp4l [options]
Delay Mechanism
-A Auto, starting with E2E
-E E2E, delay request-response (default)
-P P2P, peer delay mechanism
Network Transport
-2 IEEE 802.3
-4 UDP IPV4 (default)
-6 UDP IPV6
Time Stamping
-H HARDWARE (default)
-S SOFTWARE
-L LEGACY HW
Other Options
-f [file] read configuration from 'file'
-i [dev] interface device to use, for example 'eth0'
(may be specified multiple times)
-p [dev] PTP hardware clock device to use, default auto
(ignored for SOFTWARE/LEGACY HW time stamping)
-s slave only mode (overrides configuration file)
-l [num] set the logging level to 'num'
-m print messages to stdout
-q do not print messages to the syslog
-v prints the software version and exits
-h prints this message and exits
ptp软件时间
root@genvict_imx8qxp:~# ptp4l -i eth1 -m -S
ptp4l[1873.750]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[1873.750]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[1873.751]: port 1: link up
ptp4l[1880.173]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1880.173]: selected best master clock d2093a.fffe.ac82dc
ptp4l[1880.173]: assuming the grand master role
root@genvict_imx8qxp:~# ptp4l -i eth1 -m -S -s
ptp4l[269.100]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[269.101]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[269.101]: port 1: link up
ptp4l[270.392]: port 1: new foreign master d2093a.fffe.ac82dc-1
ptp4l[274.392]: selected best master clock d2093a.fffe.ac82dc
ptp4l[274.392]: foreign master not using PTP timescale
ptp4l[274.392]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[276.392]: master offset -18555634824428454 s0 freq -48507 path delay 1043720
ptp4l[277.392]: master offset -18555634824425467 s0 freq -48507 path delay 1043720
ptp4l[278.392]: master offset -18555634824433853 s0 freq -48507 path delay 1044966
ptp4l[279.392]: master offset -18555634824427912 s0 freq -48507 path delay 1042512
ptp4l[280.392]: master offset -18555634824426427 s0 freq -48507 path delay 1042512
ptp4l[281.393]: master offset -18555634824437274 s0 freq -48507 path delay 1043720
ptp4l[282.392]: master offset -18555634824456782 s0 freq -48507 path delay 1042964
ptp4l[283.393]: master offset -18555634824433920 s0 freq -48507 path delay 1042964
ptp4l[284.393]: master offset -18555634824428578 s0 freq -48507 path delay 1044234
ptp4l[285.393]: master offset -18555634824441944 s0 freq -48507 path delay 1044836
ptp4l[286.393]: master offset -18555634824429957 s0 freq -48507 path delay 1044836
ptp4l[287.393]: master offset -18555634824445587 s0 freq -48507 path delay 1045201
ptp4l[288.393]: master offset -18555634824490863 s0 freq -48507 path delay 1044836
ptp4l[289.393]: master offset -18555634824449125 s0 freq -48507 path delay 1044836
ptp4l[290.393]: master offset -18555634824520517 s0 freq -48507 path delay 1044836
ptp4l[291.393]: master offset -18555634824447828 s0 freq -48507 path delay 1044512
ptp4l[292.393]: master offset -18555634824521714 s1 freq -54336 path delay 1043755
ptp4l[293.393]: master offset 76746 s2 freq -46584 path delay 1043755【从钟锁定】
ptp4l[293.393]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[294.393]: master offset -47315 s2 freq -59038 path delay 1043755
ptp4l[295.393]: master offset 73736 s2 freq -46859 path delay 1042706
ptp4l[296.393]: master offset -34537 s2 freq -57721 path delay 1042706
ptp4l[297.393]: master offset 100759 s2 freq -44090 path delay 1022849
ptp4l[298.393]: master offset -37021 s2 freq -57905 path delay 1022849
ptp4l[299.394]: master offset 129139 s2 freq -41160 path delay 998556
ptp4l[300.393]: master offset -89000 s2 freq -63063 path delay 998556
ptp4l[301.394]: master offset 140468 s2 freq -39976 path delay 986860
ptp4l[302.393]: master offset -67289 s2 freq -60819 path delay 986860
ptp4l[303.394]: master offset 143867 s2 freq -39559 path delay 986860
ptp4l[304.393]: master offset -102454 s2 freq -64294 path delay 986860
ptp4l[305.394]: master offset 150804 s2 freq -38817 path delay 986860
ptp4l[306.393]: master offset -152484 s2 freq -69299 path delay 1014961
ptp4l[307.394]: master offset 132826 s2 freq -40635 path delay 1008634
ptp4l[308.394]: master offset -209952 s2 freq -75123 path delay 1040435
ptp4l[309.394]: master offset 118079 s2 freq -42201 path delay 1040435
ptp4l[310.394]: master offset -245562 s2 freq -78811 path delay 1040435
ptp4l[311.394]: master offset 143515 s2 freq -39760 path delay 1040435
ptp4l[312.394]: master offset -251179 s2 freq -79480 path delay 1039977
ptp4l[313.394]: master offset 166827 s2 freq -37513 path delay 1039977
ptp4l[314.394]: master offset -274175 s2 freq -81887 path delay 1042315
ptp4l[315.394]: master offset 179672 s2 freq -36323 path delay 1042315
ptp4l[316.394]: master offset -416970 s2 freq -96404 path delay 1041906
ptp4l[317.395]: master offset 211490 s2 freq -33347 path delay 1041906
ptp4l[318.394]: master offset -327499 s2 freq -87573 path delay 1041906
ptp4l[319.395]: master offset 227869 s2 freq -31808 path delay 1041676
ptp4l[320.394]: master offset -361682 s2 freq -91125 path delay 1041906
AR8031工业以太网测试:软件时间
root@genvict_imx8qxp:~# ptp4l -i eth0 -m -S
ptp4l[3834.384]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[3834.385]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[3834.385]: port 1: link up
ptp4l[3841.091]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[3841.091]: selected best master clock 8274b8.fffe.ed2fd8
ptp4l[3841.091]: assuming the grand master role
root@genvict_imx8qxp:~# ptp4l -i eth0 -m -S -s
ptp4l[2197.056]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[2197.057]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[2197.057]: port 1: link up
ptp4l[2197.381]: port 1: new foreign master 8274b8.fffe.ed2fd8-1
ptp4l[2201.381]: selected best master clock 8274b8.fffe.ed2fd8
ptp4l[2201.381]: foreign master not using PTP timescale
ptp4l[2201.381]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[2203.381]: master offset 73992419 s0 freq -91125 path delay 1030176
ptp4l[2204.381]: master offset 74040776 s0 freq -91125 path delay 1030176
ptp4l[2205.381]: master offset 74050626 s0 freq -91125 path delay 1030176
ptp4l[2206.382]: master offset 74103565 s0 freq -91125 path delay 1029720
ptp4l[2207.382]: master offset 74133374 s0 freq -91125 path delay 1029264
ptp4l[2208.382]: master offset 74171703 s0 freq -91125 path delay 1026914
ptp4l[2209.382]: master offset 74215058 s0 freq -91125 path delay 1026914
ptp4l[2210.382]: master offset 74258512 s0 freq -91125 path delay 1026317
ptp4l[2211.382]: master offset 74294741 s0 freq -91125 path delay 1026317
ptp4l[2212.382]: master offset 74329346 s0 freq -91125 path delay 1026317
ptp4l[2213.382]: master offset 74367826 s0 freq -91125 path delay 1026317
ptp4l[2214.383]: master offset 74413066 s0 freq -91125 path delay 1026809
ptp4l[2215.383]: master offset 74444050 s0 freq -91125 path delay 1029429
ptp4l[2216.383]: master offset 74480031 s0 freq -91125 path delay 1029429
ptp4l[2217.383]: master offset 74521501 s0 freq -91125 path delay 1029564
ptp4l[2218.383]: master offset 74577104 s0 freq -91125 path delay 1031566
ptp4l[2219.383]: master offset 74585956 s1 freq -54029 path delay 1031566
ptp4l[2220.383]: master offset 15231 s2 freq -52491 path delay 1031566
ptp4l[2220.383]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[2221.383]: master offset 8701 s2 freq -53135 path delay 1031566
ptp4l[2222.383]: master offset 4427 s2 freq -53558 path delay 1032830
ptp4l[2223.383]: master offset 13091 s2 freq -52679 path delay 1032830
ptp4l[2224.383]: master offset 10841 s2 freq -52893 path delay 1034742
ptp4l[2225.383]: master offset 5962 s2 freq -53375 path delay 1034742
ptp4l[2226.384]: master offset 5913 s2 freq -53374 path delay 1036519
ptp4l[2227.384]: master offset 6766 s2 freq -53282 path delay 1036519
ptp4l[2228.384]: master offset 10667 s2 freq -52881 path delay 1038131
ptp4l[2229.384]: master offset 11028 s2 freq -52834 path delay 1038131
ptp4l[2230.384]: master offset 7770 s2 freq -53152 path delay 1038703
ptp4l[2231.384]: master offset 11098 s2 freq -52808 path delay 1038131
ptp4l[2232.384]: master offset 8593 s2 freq -53050 path delay 1039049
ptp4l[2233.384]: master offset 6997 s2 freq -53203 path delay 1039049
ptp4l[2234.384]: master offset 8977 s2 freq -52996 path delay 1039126
ptp4l[2235.384]: master offset 5574 s2 freq -53330 path delay 1039880
ptp4l[2236.384]: master offset 3150 s2 freq -53570 path delay 1040487
ptp4l[2237.384]: master offset 3903 s2 freq -53490 path delay 1040158
ptp4l[2238.384]: master offset 11530 s2 freq -52716 path delay 1039126
ptp4l[2239.384]: master offset 6977 s2 freq -53165 path delay 1039126
ptp4l[2240.385]: master offset 8222 s2 freq -53032 path delay 1038525
ptp4l[2241.385]: master offset 6972 s2 freq -53150 path delay 1038410
ptp4l[2242.385]: master offset 11351 s2 freq -52701 path delay 1038410
ptp4l[2243.385]: master offset -12512 s2 freq -55099 path delay 1038080
ptp4l[2244.385]: master offset 15191 s2 freq -52314 path delay 1038080
ptp4l[2245.385]: master offset 45243 s2 freq -49263 path delay 1038080
ptp4l[2246.385]: master offset 8377 s2 freq -52942 path delay 1038080
ptp4l[2247.385]: master offset -19088 s2 freq -55707 path delay 1038080
ptp4l[2248.385]: master offset 12470 s2 freq -52539 path delay 1037455
ptp4l[2249.385]: master offset -48009 s2 freq -58635 path delay 1037455
ptp4l[2250.385]: master offset 19725 s2 freq -51842 path delay 1037455
ptp4l[2251.385]: master offset -52082 s2 freq -59075 path delay 1037846
ptp4l[2252.385]: master offset 24582 s2 freq -51384 path delay 1035974
ptp4l[2253.385]: master offset -95807 s2 freq -63518 path delay 1032487
ptp4l[2254.386]: master offset 38808 s2 freq -50018 path delay 1032487
ptp4l[2255.385]: master offset -87672 s2 freq -62754 path delay 1032487
ptp4l[2256.386]: master offset 37299 s2 freq -50219 path delay 1032487
ptp4l[2257.385]: master offset -118493 s2 freq -65917 path delay 1032487
硬件时间:
root@genvict_imx8qxp:~# ptp4l -i eth0 -m -H
ptp4l[3963.827]: selected /dev/ptp0 as PTP clock
ptp4l[3963.829]: driver changed our HWTSTAMP options
ptp4l[3963.829]: tx_type 1 not 1
ptp4l[3963.829]: rx_filter 1 not 12
ptp4l[3963.829]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[3963.829]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[3963.830]: port 1: link up
ptp4l[3971.694]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[3971.695]: selected best master clock 8274b8.fffe.ed2fd8
ptp4l[3971.695]: assuming the grand master role
root@genvict_imx8qxp:~# ptp4l -i eth0 -m -H -s
ptp4l[2323.827]: selected /dev/ptp0 as PTP clock
ptp4l[2323.829]: driver changed our HWTSTAMP options
ptp4l[2323.829]: tx_type 1 not 1
ptp4l[2323.829]: rx_filter 1 not 12
ptp4l[2323.829]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[2323.829]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[2323.830]: port 1: link up
ptp4l[2323.987]: port 1: new foreign master 8274b8.fffe.ed2fd8-1
ptp4l[2327.987]: selected best master clock 8274b8.fffe.ed2fd8
ptp4l[2327.987]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[2329.987]: master offset 68420017 s0 freq +0 path delay 962
ptp4l[2330.986]: master offset 68418929 s1 freq -1088 path delay 962
ptp4l[2331.987]: master offset -11 s2 freq -1099 path delay 962
ptp4l[2331.987]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[2332.987]: master offset -5 s2 freq -1096 path delay 962
ptp4l[2333.987]: master offset 245 s2 freq -848 path delay 708
ptp4l[2334.987]: master offset -3 s2 freq -1022 path delay 708
ptp4l[2335.988]: master offset 153 s2 freq -867 path delay 473
ptp4l[2336.987]: master offset -74 s2 freq -1048 path delay 476
ptp4l[2337.987]: master offset -127 s2 freq -1123 path delay 476
ptp4l[2338.987]: master offset -97 s2 freq -1132 path delay 473
ptp4l[2339.987]: master offset -62 s2 freq -1126 path delay 473
ptp4l[2340.988]: master offset -14 s2 freq -1096 path delay 454
ptp4l[2341.987]: master offset -22 s2 freq -1108 path delay 454
ptp4l[2342.987]: master offset -2 s2 freq -1095 path delay 450
ptp4l[2343.988]: master offset 1 s2 freq -1093 path delay 450
ptp4l[2344.988]: master offset 1 s2 freq -1092 path delay 450
ptp4l[2345.988]: master offset -7 s2 freq -1100 path delay 450
ptp4l[2346.988]: master offset -6 s2 freq -1101 path delay 450
ptp4l[2347.988]: master offset -1 s2 freq -1098 path delay 450
ptp4l[2348.989]: master offset 0 s2 freq -1097 path delay 450
ptp4l[2349.988]: master offset -7 s2 freq -1104 path delay 450
ptp4l[2350.988]: master offset 1 s2 freq -1098 path delay 450
ptp4l[2351.988]: master offset -6 s2 freq -1105 path delay 451
ptp4l[2352.988]: master offset -1 s2 freq -1102 path delay 451
ptp4l[2353.989]: master offset -9 s2 freq -1110 path delay 452
ptp4l[2354.989]: master offset 1 s2 freq -1103 path delay 452
ptp4l[2355.989]: master offset -9 s2 freq -1113 path delay 452
ptp4l[2356.990]: master offset -4 s2 freq -1110 path delay 451
ptp4l[2357.989]: master offset -6 s2 freq -1113 path delay 451
ptp4l[2358.989]: master offset 4 s2 freq -1105 path delay 450
ptp4l[2359.989]: master offset -7 s2 freq -1115 path delay 450
ptp4l[2360.989]: master offset 0 s2 freq -1110 path delay 450
ptp4l[2361.990]: master offset 2 s2 freq -1108 path delay 450
ptp4l[2362.989]: master offset -10 s2 freq -1120 path delay 450
ptp4l[2363.990]: master offset 1 s2 freq -1112 path delay 450
ptp4l[2364.989]: master offset -8 s2 freq -1120 path delay 450
ptp4l[2365.990]: master offset 4 s2 freq -1111 path delay 450
ptp4l[2366.990]: master offset -12 s2 freq -1125 path delay 452
ptp4l[2367.991]: master offset 1 s2 freq -1116 path delay 452
ptp4l[2368.990]: master offset -4 s2 freq -1121 path delay 453
ptp4l[2369.991]: master offset 0 s2 freq -1118 path delay 453
ptp4l[2370.990]: master offset 1 s2 freq -1117 path delay 453
ptp4l[2371.991]: master offset 5 s2 freq -1113 path delay 453
ptp4l[2372.990]: master offset -11 s2 freq -1127 path delay 453
ptp4l[2373.990]: master offset -4 s2 freq -1123 path delay 453
ptp4l[2374.991]: master offset -17 s2 freq -1138 path delay 453
ptp4l[2375.990]: master offset -3 s2 freq -1129 path delay 452
ptp时间同步
网上说可用phc2sys设置时间同步,但没有成功。使用ptpd2同步时间。
ptpd2在多台设备间会选举出一个master设备,其他设备同步master设备上的时间戳,猜测是根据多台设备时间,看那个设备时间最新就设置为master,有时候也会选举一个时间慢的设备来更新,所以最好指定master设备。ptpd2参数:
-C --foreground global:foreground=<Y/N> Don't run in background
-m --masterslave ptpengine:preset=masterslave Master, slave when not best
-M --masteronly ptpengine:preset=masteronly Master, passive when not best GM
-s --slaveonly ptpengine:preset=slaveonly Slave only mode
-i --interface [dev] ptpengine:interface=<dev> Interface to use (required)
主机:
root@genvict_imx8qxp:~# ptpd2 -C -m -i eth1
2022-05-12 09:30:13.832429 ptpd2[9587].startup (info) (___) Configuration OK
2022-05-12 09:30:13.833745 ptpd2[9587].startup (info) (___) Successfully acquired lock on /var/run/ptpd2.lock
2022-05-12 09:30:13.834079 ptpd2[9587].startup (notice) (___) PTPDv2 started successfully on eth1 using "masterslave" preset (PID 9587)
2022-05-12 09:30:13.834204 ptpd2[9587].startup (info) (___) TimingService.PTP0: PTP service init
2022-05-12 09:30:13.836174 ptpd2[9587].eth1 (info) (init) Observed_drift loaded from kernel: -46279 ppb
2022-05-12 09:30:13.936592 ptpd2[9587].eth1 (notice) (lstn_init) Now in state: PTP_LISTENING
2022-05-12 09:30:23.834353 ptpd2[9587].eth1 (notice) (lstn_init) TimingService.PTP0: elected best TimingService
2022-05-12 09:30:23.834526 ptpd2[9587].eth1 (info) (lstn_init) TimingService.PTP0: acquired clock control
2022-05-12 09:30:25.937648 ptpd2[9587].eth1 (notice) (mst) Now in state: PTP_MASTER, Best master: 723f47fffedc7e39(unknown)/1 (self)
2022-05-12 09:33:00.512400 ptpd2[9587].eth1 (info) (mst) TimingService: Timing domain shutting down
2022-05-12 09:33:00.512567 ptpd2[9587].eth1 (info) (mst) TimingService.PTP0: PTP service shutdown
2022-05-12 09:33:00.513110 ptpd2[9587].eth1 (notice) (___) Shutdown on close signal
从机:
root@genvict_imx8qxp:~# ptpd2 -C -m -i eth1
2021-10-08 16:30:40.211752 ptpd2[24089].startup (info) (___) Configuration OK
2021-10-08 16:30:40.213153 ptpd2[24089].startup (info) (___) Successfully acquired lock on /var/run/ptpd2.lock
2021-10-08 16:30:40.213556 ptpd2[24089].startup (notice) (___) PTPDv2 started successfully on eth1 using "masterslave" preset (PID 24089)
2021-10-08 16:30:40.213638 ptpd2[24089].startup (info) (___) TimingService.PTP0: PTP service init
2021-10-08 16:30:40.215653 ptpd2[24089].eth1 (info) (init) Observed_drift loaded from kernel: -50697 ppb
2021-10-08 16:30:40.316119 ptpd2[24089].eth1 (notice) (lstn_init) Now in state: PTP_LISTENING
2021-10-08 16:30:49.607161 ptpd2[24089].eth1 (info) (lstn_init) New best master selected: 723f47fffedc7e39(unknown)/1
2021-10-08 16:30:49.607351 ptpd2[24089].eth1 (notice) (slv) Now in state: PTP_SLAVE, Best master: 723f47fffedc7e39(unknown)/1
2021-10-08 16:30:49.607463 ptpd2[24089].eth1 (notice) (slv) Received first Sync from Master
2021-10-08 16:30:49.607549 ptpd2[24089].eth1 (critical) (slv) Offset above 1 second. Clock will step.
2022-05-12 09:30:27.938434 ptpd2[24089].eth1 (warning) (slv) Stepped the system clock to: 05/12/22 09:30:27.938365376
2022-05-12 09:30:28.041299 ptpd2[24089].eth1 (notice) (lstn_reset) Now in state: PTP_LISTENING
2022-05-12 09:30:28.544542 ptpd2[24089].eth1 (notice) (lstn_reset) TimingService.PTP0: elected best TimingService
2022-05-12 09:30:28.544718 ptpd2[24089].eth1 (info) (lstn_reset) TimingService.PTP0: acquired clock control
2022-05-12 09:30:29.937067 ptpd2[24089].eth1 (info) (lstn_reset) New best master selected: 723f47fffedc7e39(unknown)/1
2022-05-12 09:30:29.937295 ptpd2[24089].eth1 (notice) (slv) Now in state: PTP_SLAVE, Best master: 723f47fffedc7e39(unknown)/1
2022-05-12 09:30:30.936944 ptpd2[24089].eth1 (notice) (slv) Received first Sync from Master
2022-05-12 09:30:31.939547 ptpd2[24089].eth1 (notice) (slv) Received first Delay Response from Master
2022-05-12 09:33:01.696386 ptpd2[24089].eth1 (info) (slv) TimingService: Timing domain shutting down
2022-05-12 09:33:01.696558 ptpd2[24089].eth1 (info) (slv) TimingService.PTP0: PTP service shutdown
2022-05-12 09:33:01.697074 ptpd2[24089].eth1 (notice) (___) Shutdown on close signal
root@genvict_imx8qxp:~# date
Thu May 12 09:33:32 CST 2022
测试延时
1、测试主从设备时间延迟数据不严谨方法1:在应用层,根据系统时间跳变后GPIO模拟输出一个pps波形,高电平占空比10%。
#!/bin/bash
echo 403 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio403/direction
echo 0 > /sys/class/gpio/gpio403/value
old=$(date +%T)
while true
do
new=$(date +%T)
if [ "$old" != "$new" ];then
old=$new
echo 1 > /sys/class/gpio/gpio403/value
usleep 100000;
echo 0 > /sys/class/gpio/gpio403/value
fi
usleep 10;
done
测试在同一个板子上面GPS时间同步后,pps与时间跳变的GPIO模拟pps时间延时:8ms
测试脚本设备GPIO拉高拉低的时间延迟:延时1us,实际测出3400us,不延时实际测出84us。
不同板子之间测试实际延迟,master的pps与另外一台板子的时间GPIO跳变:10ms,【怎么另外板子时间绿色波形还快些呢?
总结:这样通过示波器测量,局限于slave板子GPIO模拟pps的延时问题,导致测量数据在ms的精度,达不到PTP要求的ns级别。那应该用什么仪器和方法来测量呢?
2、内核代码中根据系统时间输出GPIO波形。在gpiolib_sysfs_init函数中创建内核线程,读取系统时间,设置GPIO电平。
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/sched.h>
static struct task_struct *test_TaskStruct;
#include <linux/time.h>
#include <linux/timex.h>
#include <linux/rtc.h>
static int __init gpiolib_sysfs_init(void)
{
test_TaskStruct = kthread_create(threadTask, NULL, "KernelThead");
if (IS_ERR(test_TaskStruct)) {
printk("kthread_create error\n");
} else {
wake_up_process(test_TaskStruct);
}
}
int threadTask(void *arg)
{
struct timex txc;
//struct rtc_time tm;
long old = 0;
long gpio = 403;
//static long value = 1;
struct gpio_desc *desc;
while (1) {
desc = gpio_to_valid_desc(gpio);
/* reject invalid GPIOs */
if (!desc) {
pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
ssleep(5);
continue;
} else {
if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
pr_warn("%s: ls not out %ld\n", __func__, gpio);
ssleep(5);
continue;
}
}
/* 获取当前的UTC时间 */
do_gettimeofday(&(txc.time));
//printk("sec=%ld, usec=%ld\n",txc.time.tv_sec, txc.time.tv_usec);//sec=1653616954, usec=971971
if(txc.time.tv_sec != old){
gpiod_set_value_cansleep(desc, 1);
//sleep?
msleep(100);
gpiod_set_value_cansleep(desc, 0);
old = txc.time.tv_sec;
}
msleep(1);//del?
/* 把UTC时间调整为本地时间 */
//txc.time.tv_sec -= sys_tz.tz_minuteswest * 60;
/* 算出时间中的年月日等数值到tm中 */
//rtc_time_to_tm(txc.time.tv_sec, &tm);
/*
printk(KERN_ERR "%04d-%02d-%02d %02d:%02d:%02d\n"
,tm.tm_year+1900
,tm.tm_mon+1
,tm.tm_mday
,tm.tm_hour+8
,tm.tm_min
,tm.tm_sec);
*/
//ssleep(2);
}
return 0;
}
开机后导出GPIO和设置GPIO输出模式:
echo 403 > /sys/class/gpio/export;echo out > /sys/class/gpio/gpio403/direction;echo 0 > /sys/class/gpio/gpio403/value
不延时拉高拉低GPIO电平的间隔时间:400ns
pps与本地时间同步时间延时:8ms。这8ms是解析NEMA数据的延时时间吗?
两个板子之间PTP时间同步后,内核读本地时间改变GPIO后的之间延时:13ms
测试f9k与TH830的pps之间的延时:几乎可以重叠