ptp4l是关于1588v2 ptp协议栈的开源代码,其中实现了各种ITU 规定的profile. ITU规定的各种profile主要满足电信要求的一些profile, profile的定义请参看1588v2协议。Ptp4l实现了BC时钟和OC时钟. 本文主要分析ptp4l的开源代码。
ptp4l的使用手册 https://linux.die.net/man/8/ptp4l.
语法:
ptp4l [ -A | -E | -P ] [ -2 | -4 | -6 ] [ -H | -S | -L ] [ -f config ] [ -p phc-device ] [ -s ] [ -l print-level ] [ -q ] [ -v ] [ -i interface ] ...
选项
-A 自动选择延迟机制,初始为E2E,当收到对端的delay request的时候切换到P2P.
-E 选择延迟 请求-响应机制E2E。默认机制
-P 选择对端延迟机制P2P.
-2 IEEE802.3网络传输
-4 UDP IPv4传输 默认值
-6 UDP IPv6 传输
-H 硬件打时间戳
-S 软件打时间戳
-L legacy硬件时间戳
-f config 读取配置文件
-p phc设备,硬件时间戳的设备 /dev/ptp0
-s 只作为从时钟
-l 打印级别,级别是根据syslog定义的。默认为6 LOG_INFO
-q 不打印消息到系统日志
-v 打印消息的标准输出
-i interface 确定一个ptp的端口。
-h 显示帮助信息
配置文件
配置文件分为几个部分,每个部分的前面都是中括号包含名字,后面每一行都是名字和相应的设置组成。空行和以#开头的行忽略。
全局配置部分[global]设置程序的参数,时钟的参数,和端口的参数。其他的部分是端口特有的,端口特头的设置会覆盖默认全局的设置。端口的设置部分以端口的名字开头,例如[eth0].
端口参数选项
logAnnounceInterval
Announce消息的平均时间间隔。时间间隔越小,ptp4l对变化的反应也越快。时间间隔在整个域中是一致的。它表示为2的多少次幂,单位是秒,默认值是1(2秒).
logSyncInterval
Sync消息的平均时间间隔。时间间隔越小越可能改善本地时钟的精度。表示为2的多少次幂,单位是秒。默认值是0,(1秒).
logMinDelayReqInterval
Delay_req消息允许的最小时间间隔。间隔越小,ptp4l对于path_delay的计算越快。表示为2的多少次幂,单位是秒。默认值是0(1秒).
logMinPdelayReqInterval Pdelay_req消息允许的最小时间间隔。表示为2的多少次幂。默认值是0(1秒).
announceReceiptTimeout
在最后一个Announce消息过期前丢失Announce消息的数量。默认值是3.
transportSpecific
传输域中的特殊值,值是0-255,默认是0.
path_trace_enabled
跟踪Announce消息的路由,默认是不使能的。
follow_up_info
此选项如果使能,将在Follow_Up消息里面包含802.1AS数据,默认是禁止的。
delay_mechanism
延迟机制,E2E, P2P还是Auto, 默认值是E2E
network_transport
网络传输方式。默认值为UDPv4
程序和时钟参数选项
twoStepFlag
slaveOnly
priority1
priority2
clockClass
clockAccuracy
offsetScaledLogVariance
domainNumber
free_running
freq_est_interval
assume_two_step
tx_timestamp_retries
clock_servo
pi_proportional_const
pi_integral_const
pi_offset_const
ptp_dst_mac
p2p_dst_mac
logging_level
verbose
use_syslog
time_stamping
生成配置文件
echo -e "[global]\ntx_timestamp_timeout\t1000\n" > ptp4l.cfg
echo -e "sanity_freq_limit\t0\n" >> ptp4l.cfg
echo -e "logSyncInterval\t0\n" >> ptp4l.cfg
echo -e "assume_two_step\t0\n" >> ptp4l.cfg
echo -e "twoStepFlag\t0\n" >> ptp4l.cfg
echo -e "time_stamping\tonestep\n" >> ptp4l.cfg
启动ptp4l
/tmp # ptp4l -m -q -l 7 -p /dev/ptp0 -s -f ptp4l.cfg -i ieth
日志
ptp4l[76381.759]: config item (null).assume_two_step is 0
ptp4l[76381.759]: config item (null).check_fup_sync is 0
ptp4l[76381.759]: config item (null).tx_timestamp_timeout is 1000
ptp4l[76381.759]: config item (null).clock_servo is 0
ptp4l[76381.759]: config item (null).clock_type is 32768
ptp4l[76381.759]: config item (null).clock_servo is 0
ptp4l[76381.759]: config item (null).clockClass is 248
ptp4l[76381.759]: config item (null).clockAccuracy is 254
ptp4l[76381.759]: config item (null).offsetScaledLogVariance is 65535
ptp4l[76381.759]: config item (null).productDescription is ';;'
ptp4l[76381.759]: config item (null).revisionData is ';;'
ptp4l[76381.759]: config item (null).userDescription is ''
ptp4l[76381.759]: config item (null).manufacturerIdentity is '00:00:00'
ptp4l 中支持的servo, 比例积分控制器(PI), 线性回归(linreg)。比例积分控制器(PI)是一种常用的自动控制器,请参考自动控制理论中PID控制器。