embedded-deck
TEKNİK REHBER ENDÜSTRİYEL IEEE 1588 PTP 2026

IEEE 1588 PTP
Hassas Zaman Senkronizasyonu.

NTP'nin yetersiz kaldığı submikrosaniye senkronizasyon gereksinimlerinden PTP mesaj mekanizmasına, hardware timestamping'den linuxptp yapılandırmasına ve gPTP/TSN profilinden i.MX8 + Intel I210 üzerinde sub-μs ölçüme kadar IEEE 1588 PTP'nin eksiksiz rehberi.

00 Neden PTP

NTP (Network Time Protocol) Internet üzerinde ±1–50 ms senkronizasyon sağlar. Endüstriyel otomasyon, TSN ağları ve telekomünikasyon altyapısı bu seviyeyle yetinmez; submikrosaniye (±100 ns veya daha iyi) senkronizasyon gerektirir.

NTP vs PTP karşılaştırması

ÖzellikNTPPTP (IEEE 1588)
Doğruluk±1–50 ms (WAN), ±1 ms (LAN)±10–100 ns (HW timestamp)
Zaman kaynağıİnternet stratum sunucularıYerel grandmaster (GPS/atom)
HW desteğiGereksizPHC zorunlu (sub-μs için)
Kullanım alanıSunucu, genel ITTSN, 5G, enerji, üretim
ProtokolUDP/123L2 (Eth) veya UDP/319,320

Kullanım alanları

TSN (Time-Sensitive Networking)802.1Qbv Time-Aware Shaper: paket gönderme zamanlaması için ±1 μs senkronizasyon gerekli
Endüstriyel otomasyonServo motor koordinasyonu, robot kolu senkronizasyonu — IEC 61158 Profinet IRT
Telekomünikasyon5G fronthaul (eCPRI), LTE CPRI — ITU-T G.8275 telecom profili, ±130 ns
Medya & broadcastSMPTE ST 2059 AES67 ses ağları, video senkronizasyonu
Akıllı şebekeIEC 61850 GOOSE mesajları, PMU senkrofazör ölçümü — IEEE C37.238
ÖNEMLİ

Software timestamping ile NTP kalitesinde (~1 μs) PTP yapılabilir fakat sub-μs için mutlaka NIC'in PHC (PTP Hardware Clock) donanımı kullanılmalıdır. Çoğu modern Intel, Marvell ve NXP NIC/MAC PHC destekler.

01 PTP mimarisi

PTP ağında saati yayan bir grandmaster, senkronize olan slave'ler ve aralarında köprüler kurarak yayılımı sağlayan boundary/transparent clock'lar bulunur.

Clock türleri

Grandmaster Clock (GM)GPS, atom saati veya GNSS alıcısına bağlı en doğru kaynak. PTP zamanını yayar. Tüm ağa referans saat sağlar
Ordinary Clock (OC)Tek ağ portlu cihaz. Ya master (zaman yayar) ya da slave (zaman alır) rolünde çalışır
Boundary Clock (BC)Birden fazla port: upstream'den zaman alır, downstream'e master olarak dağıtır. Büyük ağlarda gecikme birikimini kesmek için kullanılır
Transparent Clock (TC)Paket geçiş gecikmesini ölçüp Sync paketine ekler (residence time correction). Switch katmanında şeffaf senkronizasyon

BMCA (Best Master Clock Algorithm)

Her clock periyodik Announce mesajı gönderir:
  - grandmasterClockQuality (accuracy, clockClass)
  - grandmasterPriority1 (0=en iyi, 255=en kötü)
  - grandmasterPriority2 (eşitlik bozucu)
  - grandmasterIdentity (EUI-64)
  - stepsRemoved (GM'e kaç hop)

BMCA seçim sırası:
1. priority1 en küçük → GM
2. clockClass en küçük → GM
3. clockAccuracy en küçük → GM
4. offsetScaledLogVariance → GM
5. priority2 → GM
6. clockIdentity (deterministik, EUI-64) → GM
    

PTP domain

# Farklı domainlar birbirinden bağımsız PTP ağları oluşturur
# Domain 0: varsayılan (IEEE 1588)
# Domain 24-31: IEEE 802.1AS (gPTP) için ayrılmış
# Domain 127: test amaçlı

# ptp4l.conf'ta domain ayarı:
# domainNumber 0

02 PTP mesaj tipleri

PTP, zaman senkronizasyonu için iki kategori mesaj kullanır: event mesajları (timestamp alınır) ve general mesajlar (timestamp alınmaz).

Event mesajları (timestamped)

MesajYönAçıklama
SyncMaster → Slavet1 gönderim zamanı (one-step'te gömülü, two-step'te Follow_Up'ta)
Delay_ReqSlave → MasterSlave'in gönderim zamanı t3
Pdelay_ReqHer yönPeer-delay mekanizması — her segmentte gecikim ölçümü
Pdelay_RespKarşı tarafPdelay_Req'e yanıt

General mesajlar

MesajAçıklama
AnnounceGM bilgisi, BMCA için — her 2 saniye
Follow_UpTwo-step Sync'teki t1 gönderim zamanı
Delay_RespMaster'ın t2 alım + slave'in t3 gönderim zamanı
Pdelay_Resp_Follow_UpTwo-step Pdelay_Resp'teki timestamp
ManagementUzaktan konfigürasyon ve durum sorgulama
SignalingUnicast müzakere, mesaj hızı talepleri

Two-step vs one-step

# One-step: Sync mesajı içine HW timestamp gömülür
# → Daha az mesaj, HW desteği şart
# → Intel I210, Marvell 88E1512 one-step destekler

# Two-step: Sync gönderilir, ardından Follow_Up ile t1 bildirilir
# → Daha toleranslı, SW timestamp ile de çalışır
# → linuxptp varsayılanı

# ptp4l'de ayar:
# twoStepFlag 1   ← iki adımlı (varsayılan)
# twoStepFlag 0   ← tek adımlı (HW gerektirir)

Delay_Request-Response mekanizması

Master                              Slave
  |                                   |
  |──── Sync (t1) ───────────────────→|  t2 kaydedilir
  |──── Follow_Up (t1) ──────────────→|
  |                                   |
  |←─── Delay_Req ────────────────────| t3 kaydedilir
  |──── Delay_Resp (t4) ─────────────→|

offsetFromMaster = ((t2-t1) - (t4-t3)) / 2
meanPathDelay    = ((t2-t1) + (t4-t3)) / 2
    

03 Hardware timestamping

Sub-μs doğruluk için PTP paketlerinin gönderim/alım zamanının donanım (NIC PHC) tarafından kaydedilmesi gerekir. Software timestamping kernel+interrupt gecikmesinden etkilenir.

NIC timestamping kapasitesini kontrol et

# ethtool ile HW timestamp desteği
ethtool -T eth0
# 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)
#   raw-hardware          (SOF_TIMESTAMPING_RAW_HARDWARE)
# PTP Hardware Clock: 0      ← /dev/ptp0'a karşılık gelir
# Hardware Transmit Timestamp Modes:
#   off                    (HWTSTAMP_TX_OFF)
#   on                     (HWTSTAMP_TX_ON)
# Hardware Receive Filter Modes:
#   none                   (HWTSTAMP_FILTER_NONE)
#   ptpv1-l4-event         (HWTSTAMP_FILTER_PTP_V1_L4_EVENT)
#   ptpv2-l4-event         (HWTSTAMP_FILTER_PTP_V2_L4_EVENT)
#   ptpv2-l2-event         (HWTSTAMP_FILTER_PTP_V2_L2_EVENT)
#   ptpv2-event            (HWTSTAMP_FILTER_PTP_V2_EVENT)

/dev/ptp0 — PHC arayüzü

# PHC cihazlarını listele
ls -la /dev/ptp*

# PHC bilgisi
cat /sys/class/ptp/ptp0/clock_name
# eth0

# phc_ctl ile PHC saatini yönet
phc_ctl /dev/ptp0 get          # mevcut PHC zamanı
phc_ctl /dev/ptp0 set          # sistem saatini PHC'ye yaz
phc_ctl /dev/ptp0 adj 1000     # 1000 ns ileri ayarla
phc_ctl /dev/ptp0 freq 0       # frekans düzeltmesi sıfırla
phc_ctl /dev/ptp0 cmp          # PHC ile CLOCK_REALTIME farkı

# PHC ve sistem saati farkı (phc2sys olmadan)
phc_ctl /dev/ptp0 get 2>&1 | awk '{print $NF}'

Yazılım vs donanım timestamping farkı

KIYASLAMA

Yazılım timestamping: ±1–10 μs (kernel interrupt latency, scheduling jitter)
Donanım timestamping: ±10–100 ns (NIC PHC, doğrudan wire event)
Fark yaklaşık 100x. Sub-μs hedef için HW timestamping zorunludur.

04 linuxptp kurulumu

linuxptp, ptp4l (PTP clock servo) ve phc2sys (PHC ile sistem saati senkronizasyonu) araçlarını içeren Linux için standart PTP implementasyonudur.

Kurulum

# Debian/Ubuntu
sudo apt install linuxptp

# Kaynak koddan derle (son sürüm için)
git clone https://git.code.sf.net/p/linuxptp/code linuxptp
cd linuxptp
make
sudo make install

# Araçlar:
# ptp4l    — PTP clock daemon (mesaj alışverişi + servo)
# phc2sys  — PHC ↔ CLOCK_REALTIME senkronizasyon
# ts2phc   — harici timestamp kaynağını PHC'ye sync
# pmc      — PTP Management Client (sorgulama)
# tstool   — timestamp test aracı

ptp4l — temel çalıştırma

# Slave mode — eth0 üzerinde HW timestamp
sudo ptp4l -i eth0 -f /etc/linuxptp/ptp4l.conf -s -m

# Parametreler:
# -i eth0  : ağ arayüzü
# -s       : slave only (master olmaz)
# -m       : mesajları stdout'a yaz
# -f       : konfigürasyon dosyası

# Master mode
sudo ptp4l -i eth0 -f /etc/linuxptp/ptp4l.conf -m

# Software timestamp ile test (HW yoksa)
sudo ptp4l -i eth0 -S -m   # -S = software timestamping

phc2sys — PHC ile sistem saati senkronizasyonu

# PHC'yi (ptp4l'in senkronize ettiği) CLOCK_REALTIME'a yaz
sudo phc2sys -s /dev/ptp0 -c CLOCK_REALTIME \
             -n 24 -O -37 -m

# Parametreler:
# -s /dev/ptp0      : kaynak saat (PHC)
# -c CLOCK_REALTIME : hedef saat
# -n 24             : domain numarası
# -O -37            : UTC offset (TAI-UTC = 37 saniye, 2025 itibarıyla)
# -m                : mesajları stdout'a yaz

# ptp4l'den otomatik PHC bilgisi al
sudo phc2sys -a -r -m   # auto mode

ts2phc — PPS/GPS → PHC senkronizasyonu

# GPS PPS sinyalini PHC'ye sync
sudo ts2phc -f /etc/linuxptp/ts2phc.conf \
            -s nmea -c eth0 -m

# ts2phc.conf örneği:
# [global]
# ts2phc.nmea_serialport /dev/ttyS0
# ts2phc.nmea_baudrate 9600
# leapfile /usr/share/zoneinfo/leap-seconds.list

# Doğrulama:
journalctl -u ts2phc -f

05 ptp4l konfigürasyonu

ptp4l.conf dosyası, transport katmanı, delay mekanizması, clock servo ve boundary clock ayarlarını içerir. Doğru konfigürasyon senkronizasyon kalitesini belirler.

Temel ptp4l.conf

cat /etc/linuxptp/ptp4l.conf

[global]
# ─── Transport ───────────────────────────────────────────
# L2 (Ethernet) — sub-μs doğruluk için tercih
network_transport   L2

# UDP üzerinden (NAT geçişi, farklı subnet)
# network_transport   UDPv4

# ─── Delay mekanizması ───────────────────────────────────
# E2E: End-to-End delay (Request-Response)
delay_mechanism     E2E

# P2P: Peer-to-Peer (her segment bağımsız ölçüm, TC için)
# delay_mechanism   P2P

# ─── Clock servo ─────────────────────────────────────────
# PI (orantılı-integral) servo — varsayılan
clock_servo         pi

# linreg (doğrusal regresyon) — bazı ortamlarda daha iyi
# clock_servo       linreg

# ─── Adım eşiği ──────────────────────────────────────────
# 1 sn'den büyük fark → step (ani ayar), küçük → slew
step_threshold      1.0

# ─── İlk ayar ────────────────────────────────────────────
# İlk senkronizasyonda büyük offset → hemen adım at
first_step_threshold  0.00002   # 20 μs

# ─── Mesaj aralıkları (log2 saniye) ──────────────────────
logSyncInterval         -3   # 2^-3 = 0.125 sn = 8 msg/sn
logAnnounceInterval      1   # 2^1  = 2 sn
logMinDelayReqInterval  -3

# ─── Boundary clock ──────────────────────────────────────
# Birden fazla port varsa BC modu
# boundary_clock_jbod 1

# ─── Mesaj log seviyesi ──────────────────────────────────
verbose      1
logging_level  6   # INFO

[eth0]
# Arayüz başına HW timestamp
network_transport L2

PI servo parametreleri

# [global] bölümüne ekle:
pi_proportional_const    0.0
pi_integral_const        0.0
# 0 = otomatik hesaplama

# Özelleştirme (çok titreyen sistemler için):
pi_proportional_exponent   -0.3
pi_proportional_norm_max    0.7
pi_integral_exponent        0.4
pi_integral_norm_max        0.3

06 gPTP (IEEE 802.1AS)

gPTP (generalized PTP), IEEE 802.1AS standardında tanımlanmış TSN profilidir. Otomotiv (AUTOSAR, AVB) ve endüstriyel ağlarda IEEE 1588 PTP'nin kısıtlı ve optimize edilmiş alt kümesidir.

gPTP ile IEEE 1588 farkları

ÖzellikIEEE 1588gPTP (802.1AS)
TransportL2 veya UDPSadece L2 (Ethernet)
Delay mekanizmasıE2E veya P2PSadece P2P (her segment)
Domain0–127Domain 0 (veya sabit)
AnnounceGerekli802.1AS-2020'de opsiyonel
Propagation delayVarsayılan kablosuz destekliKablolu odaklı (≤100 hop)
Multicast01:1B:19:00:00:0001:80:C2:00:00:0E

gPTP ptp4l konfigürasyonu

cat /etc/linuxptp/gPTP.cfg

[global]
gmCapable               1
priority1               248
priority2               248
logAnnounceInterval     1
logSyncInterval         -3
logMinPdelayReqInterval  0
network_transport       L2
delay_mechanism         P2P
time_stamping           hardware
assume_two_step         1
follow_up_info          1
transportSpecific       0x1   # gPTP = 0x1

[eth0]
asCapable               auto

Automotive gPTP (AUTOSAR / DoIP)

# Araç içi Ethernet (100BASE-T1, 1000BASE-T1)
# AUTOSAR araç ağlarında gPTP domain 0 kullanılır

# OpenAVB / avb-lib ile gPTP (automotive AVB)
# https://github.com/AVnu/OpenAvnu

# Örnek: qdisc ile TSN + gPTP kombinasyonu
tc qdisc add dev eth0 parent root handle 100 taprio \
    num_tc 4 \
    map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
    queues 1@0 1@1 1@2 1@3 \
    base-time 1000000000 \
    sched-entry S 0x07 300000 \
    sched-entry S 0x0f 700000 \
    flags 0x2   # clockid CLOCK_TAI

07 PTP over Ethernet vs UDP

PTP mesajları iki transport modunda taşınabilir: doğrudan Ethernet frame (L2) veya UDP/IP (L3). Her ikisinin avantaj/dezavantajları ve konfigürasyonu farklıdır.

L2 (Ethernet multicast)

# L2 PTP — Ethernet frame üzerinde doğrudan
# EtherType: 0x88F7
# Multicast MAC: 01:1B:19:00:00:00 (PTP v2 event)
#                01:80:C2:00:00:0E (gPTP)

# Avantajlar:
# + En düşük gecikme (IP başlığı/routing yok)
# + VLAN desteği (802.1Q etiketli)
# + Switch'te hardware timestamping daha kolay

# Dezavantajlar:
# - Router/NAT'tan geçemez (L2 broadcast domain kısıtı)
# - Farklı subnet'lerde çalışmaz

# ptp4l.conf:
# network_transport L2

UDP/IPv4 ve IPv6

# UDP PTP portları:
# 319 — event mesajları (Sync, Delay_Req)
# 320 — general mesajlar (Announce, Follow_Up)

# Multicast adresleri (IPv4):
# 224.0.1.129  — PTP primary multicast
# 224.0.0.107  — PTP pdelay multicast

# ptp4l.conf:
# network_transport UDPv4

# Unicast mode (multicast yoksa, L3 routing):
# [eth0]
# unicast_master_table 1
# [unicast_master_table]
# table_id         1
# UDPv4            192.168.1.1   # grandmaster IP

# Firewall kuralları:
iptables -A INPUT -p udp --dport 319 -j ACCEPT
iptables -A INPUT -p udp --dport 320 -j ACCEPT

VLAN ile PTP

# PTP trafiğini VLAN 100'de izole et
ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up

# VLAN arayüzünde ptp4l çalıştır
ptp4l -i eth0.100 -f /etc/linuxptp/ptp4l.conf -m

# Switch tarafı: PTP portunu VLAN 100 tagged olarak ayarla
# ve hardware timestamping VLAN'da çalışıyor mu kontrol et
ethtool -T eth0.100
TAVSİYE

Sub-μs senkronizasyon hedefleniyorsa her zaman L2 transport + hardware timestamping kullanın. UDP/IP overhead ve kernel IP yığınından kaynaklanan gecikme jitter'ı birkaç yüz nanosaniye ile birkaç mikrosaniye ekler.

08 Pratik: i.MX8 + Intel I210 sub-μs PTP senkronizasyonu

NXP i.MX8M Plus işlemcili embedded board ile Intel I210 NIC üzerinde sub-microsaniye PTP senkronizasyonu kurulumu ve offset histogram ölçümü.

Adım 1: Donanım hazırlık

# Intel I210 NIC'in tanındığını doğrula
lspci | grep -i "I210\|ethernet"
# 00:19.0 Ethernet controller: Intel Corporation I210 Gigabit (rev 03)

# PHC desteğini doğrula
ethtool -T enp0s25 | grep -E "hardware|PHC|ptp"
# PTP Hardware Clock: 0   ← /dev/ptp0

# i.MX8 dahili MAC (FEC/ENET_QOS) de PHC destekler:
ethtool -T eth0
# PTP Hardware Clock: 1   ← /dev/ptp1

# IRQ afinity — PTP portunu ayrı CPU core'a pin
# (scheduling jitter azalt)
cat /proc/interrupts | grep enp0s25
echo 4 > /proc/irq/<IRQ_NUM>/smp_affinity_list  # core 2

Adım 2: ptp4l başlatma (I210 — slave)

# /etc/linuxptp/ptp4l-i210.conf
[global]
network_transport   L2
delay_mechanism     E2E
time_stamping       hardware
clock_servo         pi
step_threshold      0.000002       # 2 μs → step
first_step_threshold 0.00002
logSyncInterval     -4             # 16 msg/sn
logMinDelayReqInterval -4
verbose             1

[enp0s25]

# ptp4l çalıştır:
sudo ptp4l -i enp0s25 \
           -f /etc/linuxptp/ptp4l-i210.conf \
           -s -m 2>&1 | tee /tmp/ptp4l.log

# Çıktı örneği:
# ptp4l[100.234]: rms 45 max 120 freq -234 path delay 543
# ptp4l[101.234]: rms 12 max  28 freq -238 path delay 541
# ptp4l[102.234]: rms  8 max  15 freq -239 path delay 542
# rms: RMS offset (nanosaniye)

Adım 3: phc2sys ile CLOCK_REALTIME sync

# ptp4l kararlı olduktan sonra phc2sys başlat
sudo phc2sys -s /dev/ptp0 \
             -c CLOCK_REALTIME \
             -n 0 \
             -O -37 \
             -R 256 \
             -u 10 \
             -m 2>&1 | tee /tmp/phc2sys.log

# -R 256: saniyede 256 senkronizasyon
# -u 10:  her 10 senkronizasyonda log yaz

# Çıktı:
# phc2sys[200.123]: CLOCK_REALTIME phc offset   -18 s2 freq -324 delay  523
# phc2sys[200.127]: CLOCK_REALTIME phc offset    +5 s2 freq -319 delay  521

Adım 4: pmc ile durum sorgulama

# PTP Management Client
sudo pmc -u -b 0 'GET CURRENT_DATA_SET'
# sending: GET CURRENT_DATA_SET
# offsetFromMaster 45
# meanPathDelay    543
# stepsRemoved     1

sudo pmc -u -b 0 'GET TIME_STATUS_NP'
# master_offset          45
# ingress_time   1700000000000000000
# cumulativeScaledRateOffset 0
# scaledLastGmPhaseChange 0
# gmTimeBaseIndicator 0
# lastGmPhaseChange 00000000000000000000000000000000
# gmPresent true
# gmIdentity 68:05:ca:ff:fe:01:00:00

Adım 5: Offset histogram ölçümü

#!/bin/bash
# ptp_histogram.sh — ptp4l offset histogramı
LOG=/tmp/ptp4l.log
DURATION=300  # 5 dakika veri topla

# ptp4l logunu parse et, rms değerlerini çıkar
awk '/rms/ {
    for(i=1;i<=NF;i++) if($i=="rms") print $(i+1)
}' $LOG | sort -n | \
awk '
BEGIN { count=0; sum=0; max=0 }
{
    count++; sum+=$1
    if($1>max) max=$1
    bucket = int($1/10)*10
    hist[bucket]++
}
END {
    print "Toplam örnek:", count
    print "Ortalama offset:", sum/count, "ns"
    print "Maksimum offset:", max, "ns"
    print "\nHistogram (ns):"
    for (b in hist) printf "  %4d-%4d ns: %d\n", b, b+9, hist[b]
}
' | sort

Adım 6: Systemd servisleri

# /etc/systemd/system/ptp4l.service
[Unit]
Description=IEEE 1588 PTP Daemon
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/sbin/ptp4l -f /etc/linuxptp/ptp4l.conf -i enp0s25 -s
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

---

# /etc/systemd/system/phc2sys.service
[Unit]
Description=PTP PHC to System Clock Synchronization
After=ptp4l.service
Requires=ptp4l.service

[Service]
Type=simple
ExecStart=/usr/sbin/phc2sys -s /dev/ptp0 -c CLOCK_REALTIME -O -37 -R 256
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
ÖZET

Intel I210 + linuxptp kombinasyonu ile L2 transport ve hardware timestamping kullanıldığında rms offset tipik olarak 10–100 ns aralığında, maksimum offset ise 200–500 ns aralığında kalır. IRQ affinity ve CPU isolation (isolcpus) ile bu değerler daha da iyileştirilebilir. gPTP/TSN ağlarında ptp4l'i gPTP.cfg profiliyle çalıştırarak 802.1AS uyumluluğu sağlanır.