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控制器。