PTP局域网时间戳同步

        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之间的延时:几乎可以重叠

 

猜你喜欢

转载自blog.csdn.net/TSZ0000/article/details/124730691