NXP iMX8系列處理器TSN網(wǎng)絡(luò)時鐘同步測試
By Toradex秦海
1). 簡介
IEEE 802.1 TSN(Time-Sensitive Networking) 工作組定義了一個基于 802.x 網(wǎng)絡(luò)架構(gòu)上提供同步時間低延遲服務(wù)能力的協(xié)議,其前身為 IEEE AVB(Audio Video Bridgin) 工作組,后于2012年重命名為 TSN 工作組以便于將相關(guān)協(xié)議標(biāo)準(zhǔn)更廣泛推廣; AVB/TSN 包含多種具體協(xié)議標(biāo)準(zhǔn)(見如下表格),其中最重要的協(xié)議標(biāo)準(zhǔn)之一就是 IEEE 802.1AS 時鐘同步協(xié)議標(biāo)準(zhǔn),它基于 IEEE 1588 協(xié)議進(jìn)行精簡和修改,也稱為 gPTP 協(xié)議。
PTP 協(xié)議是一種精確的時間同步協(xié)議,IEEE 1588 標(biāo)準(zhǔn)為時鐘分配定義了一個主從式架構(gòu),由一個或多個網(wǎng)段及一個或多個時鐘組成。在局域網(wǎng)中能將時間同步精度控制在亞微秒級。 PTP 協(xié)議對時間戳在 MAC 層進(jìn)行加蓋, 消除了數(shù)據(jù)包在網(wǎng)絡(luò)協(xié)議棧中的處理時間延遲; 對時間戳的記錄和發(fā)送進(jìn)行確認(rèn), 得到數(shù)據(jù)包準(zhǔn)確的發(fā)送和接收時間。 相比于其它時間同步協(xié)議(如 NTP ), PTP 協(xié)議的同步精度是最高的。
本文就基于 NXP 最新的 i.MX8 系列 ARM 處理器平臺進(jìn)行 TSN 時鐘同步的簡單測試。
本文所演示的平臺來自于Toradex Verdin iMX8M Plus 和 Apalis iMX8 嵌入式平臺,這兩個平臺是基于近年發(fā)布的 NXP iMX8 系列 ARM 處理器,核心為 Cortex-A53/A72 。
2). 硬件準(zhǔn)備
a). Verdin iMX8MP ARM 核心版配合 Dahlia Carrier Board 載板,并連接調(diào)試串口,后續(xù)測試中作為TSN網(wǎng)絡(luò)中的 Master Clock 節(jié)點(diǎn)平臺。Verdin iMX8MP核心板板載 PHY 芯片的一路千兆網(wǎng)絡(luò)是完整支持包括TSN/AVB/IEEE1588等相關(guān)協(xié)議標(biāo)準(zhǔn)的網(wǎng)口,另外一路RGMII接口的MAC則支持AVB/IEEE1588。
b). Apalis iMX8 ARM 核心版配合 Apalis Eva Board 載板,并連接調(diào)試串口,后續(xù)測試中作為TSN網(wǎng)絡(luò)中的 Slave Clock 節(jié)點(diǎn)平臺。Apalis iMX8核心板提供的兩路千兆網(wǎng)絡(luò)都是只支持 AVB/IEEE1588 ,而不支持完整的 TSN ,不過由于本文僅測試時鐘同步因此也可以正常和Verdin iMX8MP搭配使用。
c). 兩個平臺的千兆網(wǎng)口通過一根網(wǎng)線直通連接。
3). 軟件準(zhǔn)備
a). 如下圖,Toradex Verdin iMXMP 模塊標(biāo)準(zhǔn) Ycoto Linux BSP 中已經(jīng)包含了測試 IEEE 802.1AS 時鐘同步的 Linuxptp 工具,可以參考這里說明分別在 Verdin iMX8MP 模塊以及 Apalis iMX8 模塊上面安裝目前最新的LTS 5.7.2版本。
b). 如果需要在本文基礎(chǔ)上進(jìn)一步測試 IEEE 802.1Qav/Qbu/Qbv 等隊列轉(zhuǎn)發(fā)協(xié)議,則需要如下方式在 Ycoto 編譯環(huán)境或者 Linux BSP Runtime 環(huán)境手動安裝 ipoute2-tc 工具軟件,并且可能需要對Linux Kernel/Device Tree做適當(dāng)?shù)男薷模梢詤⒖歼@里一個 NXP Application Note 文章說明。
---------------------------------------
### Ycoto Environment ###
# Add below to
IMAGE_INSTALL_append = " iproute2-tc"
### Linux BSP Runtime ###
$ opkg install iproute2-tc_5.5.0-r0_aarch64.ipk
---------------------------------------
3). 具體測試流程
a). Toradex Ycoto Linux 默認(rèn)使能了 NTP 時間同步協(xié)議,這是目前應(yīng)用最為廣泛的網(wǎng)絡(luò)時間同步協(xié)議,精度可以達(dá)到毫秒級別,在大多數(shù)對于時間同步精度要求沒有那么高的場景都可以應(yīng)用,本文為了測試 gPTP 高精度時間同步,具體測試過程中需要關(guān)閉 NTP 服務(wù),詳細(xì)步驟后續(xù)說明會提供。
b). 實際的 TSN 網(wǎng)絡(luò)中,Master Clock 節(jié)點(diǎn)通常會產(chǎn)生一個高精度時鐘,來源一般是 GNSS(Global Navigation Satellite System) 結(jié)合 PPS(Pulse?Per?Second)信號來進(jìn)行衛(wèi)星授時,本文重點(diǎn)不在于此,因此對于作為 Master Clock 節(jié)點(diǎn)的 Verdin iMX8MP 設(shè)備在安裝好 Linux 系統(tǒng)后,先僅只通過默認(rèn)開啟的 NTP 服務(wù)來進(jìn)行 System Clock 的同步校準(zhǔn),來簡單替代衛(wèi)星授時的功能。
./ NTP服務(wù)詳細(xì)配置方法可以參考這里,首先在Verdin iMX8MP Linux 下完成 NTP 時間同步。
---------------------------------------
### NTP 同步完成前的狀態(tài)信息 ###
root@verdin-imx8mp-07250979:~# timedatectl
Local time: Thu 2023-03-16 04:20:08 UTC
Universal time: Thu 2023-03-16 04:20:08 UTC
RTC time: Thu 2023-03-16 04:20:07
Time zone: Universal (UTC, +0000)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
### NTP同步完成后的狀態(tài)信息 ###
root@verdin-imx8mp-07250979:~# timedatectl
Local time: Thu 2023-03-16 06:12:27 UTC
Universal time: Thu 2023-03-16 06:12:27 UTC
RTC time: Thu 2023-03-16 06:12:28
Time zone: Universal (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
---------------------------------------
./ 同步完成后關(guān)閉 NTP 服務(wù)
---------------------------------------
root@verdin-imx8mp-07250979:~# timedatectl set-ntp false
root@verdin-imx8mp-07250979:~# timedatectl
Local time: Thu 2023-03-16 06:17:49 UTC
Universal time: Thu 2023-03-16 06:17:49 UTC
RTC time: Thu 2023-03-16 06:17:50
Time zone: Universal (UTC, +0000)
System clock synchronized: yes
NTP service: inactive
RTC in local TZ: no
---------------------------------------
b). Verdin iMX8MP Master Clock 節(jié)點(diǎn)上面通過 linuxptp 工具來配置 gPTP 服務(wù)
./ 主要使用的工具如下
ptp4l: daemon that synchronizes the PTP Hardware Clock (PHC) from the NIC
phc2sys: daemon that synchronizes the PHC and the System clock
pmc: utility tool to configure ptp4l in run-time
./ 首先后臺加載 ptp4l daemon 進(jìn)程,用于同步 PHC
---------------------------------------
root@verdin-imx8mp-07250979:~# ptp4l -i eth0 -f ./gPTP.cfg --step_threshold=1 -m &
[1] 1092
ptp4l[1140.933]: selected /dev/ptp0 as PTP clock
root@verdin-imx8mp-07250979:~# ptp4l[1140.972]: port 1: INITIALIZING to LISTENING on INIT_COMPLE
TE
ptp4l[1140.972]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[1144.641]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[1144.641]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[1144.641]: assuming the grand master role
---------------------------------------
// 參數(shù)說明如下,更多參數(shù)選項以及詳細(xì)說明可以查看 ptp4l manpage
-f 選項指定 gPTP.cfg 配置文件,這個文件用于配置 ptp4l 工作于 gPTP 模式的設(shè)置參數(shù)
-i 選項指定 ptp4l 所要控制的 NIC 網(wǎng)口界面
--step_threshold 選項用于配置步進(jìn)時鐘的閾值,超過閾值,直接調(diào)整時鐘時間,單位秒
-m 參數(shù)使能 log 信息打印輸出,這個可以視測試需要打開或者關(guān)閉
// Master 所需的 gPTP.cfg 文件如下,更詳細(xì)的配置文件參考說明和模板可以參考這里。需要主要目前 Linux 系統(tǒng)里面的 linuxptp 軟件版本是 2.0.1 ,請查看對應(yīng)branch的信息。
---------------------------------------
#
# 802.1AS example configuration containing those attributes which
# differ from the defaults. See the file, default.cfg, for the
# complete list of available options.
#
[global]
gmCapable 1
priority1 248
priority2 248
logAnnounceInterval 0
logSyncInterval -3
syncReceiptTimeout 3
neighborPropDelayThresh 800
min_neighbor_prop_delay -20000000
assume_two_step 1
path_trace_enabled 1
follow_up_info 1
transportSpecific 0x1
ptp_dst_mac 01:80:C2:00:00:0E
network_transport L2
delay_mechanism P2P
masterOnly 1
---------------------------------------
// 默認(rèn)情況下, ptp4l 通過 BMCA(Best Master Clock Algorithm) 來判定當(dāng)前 PHC 是否可以被作為 Grand Master 職責(zé),也可以通過 masterOnly 或者 slaveOnly 參數(shù)來強(qiáng)制指定,本文使用后者。
---------------------------------------
ptp4l[1144.641]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[1144.641]: assuming the grand master role
---------------------------------------
./ PHC 同步完成后,接下來進(jìn)行 System Clock同步,這個步驟主要針對那些依賴于 System clock 工作的應(yīng)用,比如 ALSA/GStreamer frameworks AVTP 插件。
// 由于 PHC 時間采用 TAI(International Atomic Time) 標(biāo)準(zhǔn),而 System Clock 采用(Coordinated Universal Time) 標(biāo)準(zhǔn),需要通過 pmc runtime 工具配置相應(yīng)的轉(zhuǎn)換參數(shù)
---------------------------------------
root@verdin-imx8mp-07250979:~# pmc -u -b 0 -t 1 "SET GRANDMASTER_SETTINGS_NP clockClass 248 \
clockAccuracy 0xfe offsetScaledLogVariance 0xffff \
currentUtcOffset 37 leap61 0 leap59 0 currentUtcOffsetValid 1 \
ptpTimescale 1 timeTraceable 1 frequencyTraceable 0 \
timeSource 0xa0"
sending: SET GRANDMASTER_SETTINGS_NP
ptp4l[3021.662]: selected local clock 00142d.fffe.6ea423 as best master
00142d.fffe.6ea423-0 seq 0 RESPONSE MANAGEMENT GRANDMASTER_SETTINGS_NP
clockClass 248
clockAccuracy 0xfe
offsetScaledLogVariance 0xffff
currentUtcOffset 37
leap61 0
ptp4l[3021.662]: assuming the grand master role
leap59 0
currentUtcOffsetValid 1
ptpTimescale 1
timeTraceable 1
frequencyTraceable 0
timeSource 0xa0
---------------------------------------
// 然后通過 phc2sys 工具來同步 PHC 和 System Clock
---------------------------------------
root@verdin-imx8mp-07250979:~# phc2sys -s eth0 -c CLOCK_REALTIME --step_threshold=1 --transportSpecific=1 -w -m &
[2] 1058
phc2sys[600.436]: CLOCK_REALTIME phc offset 37000001087 s0 freq +0 delay 875
phc2sys[601.437]: CLOCK_REALTIME phc offset 37000001117 s1 freq +30 delay 875
phc2sys[602.437]: CLOCK_REALTIME phc offset -75 s2 freq -45 delay 875
phc2sys[603.437]: CLOCK_REALTIME phc offset 30 s2 freq +37 delay 875
phc2sys[604.437]: CLOCK_REALTIME phc offset -58 s2 freq -42 delay 875
---------------------------------------
// 參數(shù)說明如下,更多參數(shù)選項以及詳細(xì)說明可以查看 ptp4l manpage
-s 選項指定來自于對應(yīng) NIC(eth0) 設(shè)備的 PHC 作為 master clock
-c 選項指定 System Clock 作為 slave clock
--step_threshold 選項用于配置步進(jìn)時鐘的閾值,超過閾值,直接調(diào)整時鐘時間,單位秒
--transportSpecific 選項在基于 gPTP domain 運(yùn)行是必要選項
-w 參數(shù)使得 phc2sys 處于等待狀態(tài)直到 ptp4l 完成同步
-m 參數(shù)使能 log 信息打印輸出,這個可以視測試需要打開或者關(guān)閉
// 打印的 log 信息中,當(dāng) phc offset 小于 100ns 即表示時鐘同步成功
c). Apalis iMX8 Slave Clock 節(jié)點(diǎn)上面通過 linuxptp 工具來配置 gPTP 服務(wù),具體的流程和命令和 Master 一致,只是在 gPTP.cfg 配置文件中將 masterOnly 修改未 slaveOnly 。
./ 首先由于是 Slave 節(jié)點(diǎn)設(shè)備,保持 Linux System Clock 為系統(tǒng)安裝后的默認(rèn)時間設(shè)置,直接關(guān)閉 NTP 服務(wù)不進(jìn)行任何時間同步操作
---------------------------------------
root@apalis-imx8-07308034:~# timedatectl
Local time: Wed 2023-03-01 07:21:21 UTC
Universal time: Wed 2023-03-01 07:21:21 UTC
RTC time: Wed 2023-03-01 07:21:21
Time zone: Universal (UTC, +0000)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
---------------------------------------
./ 通過和 Verdin iMX8MP 設(shè)備的直連網(wǎng)絡(luò)和 Master Clock同步 PHC 時間,由于 gPTP協(xié)議都是基于 MAC 層的,因此網(wǎng)口無需設(shè)置 IP 地址也沒有問題。
---------------------------------------
root@apalis-imx8-07308034:~# ptp4l -i eth0 -f ./gPTP.cfg --step_threshold=1 -m &
[1] 28567
ptp4l[2838.949]: selected /dev/ptp0 as PTP clock
root@apalis-imx8-07308034:~# ptp4l[2838.996]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[2838.996]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[2842.064]: selected local clock 00142d.fffe.6f8302 as best master
ptp4l[2842.197]: port 1: new foreign master 00142d.fffe.6ea423-1
ptp4l[2844.197]: selected best master clock 00142d.fffe.6ea423
ptp4l[2844.197]: updating UTC offset to 37
ptp4l[2844.197]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[2845.348]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[2845.973]: rms 646417001599952 max 1292834003200590 freq +9621 +/- 3636 delay 668 +/- 0
ptp4l[2846.973]: rms 8 max 10 freq +10997 +/- 6 delay 668 +/- 0
ptp4l[2847.974]: rms 9 max 10 freq +11008 +/- 1 delay 668 +/- 0
ptp4l[2848.974]: rms 4 max 6 freq +11006 +/- 3 delay 668 +/- 0
......
---------------------------------------
// 打印 log 信息中,rms 為 PHC 和 Grand Master clock 之間 offset 的平方值,當(dāng) rms 輸出持續(xù)小于 100ns 時候,表示同步成功。
// 同時在 Verdin iMX8MP 的 Master 端,ptp4l 也會打印如下信息,證明 Slave 以及連接 Master 進(jìn)行精準(zhǔn)時間同步。
---------------------------------------
ptp4l[4137.874]: port 1: link up
ptp4l[4137.924]: port 1: FAULTY to LISTENING on INIT_COMPLETE
ptp4l[4141.728]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[4141.728]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[4141.728]: assuming the grand master role
---------------------------------------
// 此時查看 System Clock 還是未同步的時間
---------------------------------------
### synchronous System clock on Verdin iMX8MP ###
root@verdin-imx8mp-07250979:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-16 08:01:22.94530
### non- synchronous System clock on Apalis iMX8 ###
root@apalis-imx8-07308034:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-01 08:02:46.75497
---------------------------------------
./ 通過 phc2sys 工具來同步 PHC 和 System Clock
---------------------------------------
root@apalis-imx8-07308034:~# phc2sys -s eth0 -c CLOCK_REALTIME --step_threshold=1 --transportSpecific=1 -w -m &
[2] 15230
phc2sys[1487.465]: CLOCK_REALTIME phc offset -1295917493725168 s0 freq +0 delay 2625
phc2sys[1488.466]: CLOCK_REALTIME phc offset -1295917493714065 s1 freq +11096 delay 2625
phc2sys[1489.466]: CLOCK_REALTIME phc offset -64 s2 freq +11032 delay 2625
phc2sys[1490.467]: CLOCK_REALTIME phc offset -71 s2 freq +11006 delay 2624
phc2sys[1491.467]: CLOCK_REALTIME phc offset 34 s2 freq +11090 delay 2625
---------------------------------------
// 打印 log 信息中 phc offset 小于 100ns 即表示時鐘同步成功
// 此時查看 System Clock 則已經(jīng)和 Grand Master 同步
---------------------------------------
### synchronous System clock on Verdin iMX8MP ###
root@verdin-imx8mp-07250979:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-16 08:07:39.33336
### synchronous System clock on Apalis iMX8 ###
root@apalis-imx8-07308034:~# date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-25
2023-03-16 08:07:40.54055
---------------------------------------
d). 另外為了更方便的測試 PHC 和 System Clock 是否同步成功,可以使用 check_clocks 工具,下載源碼后參考這里說明用如下命令進(jìn)行交叉編譯,生成可執(zhí)行文件在設(shè)備 Linux 下運(yùn)行驗證時鐘同步情況
---------------------------------------
### compile binary on developing host ###
$ ${CROSS_COMPILE}gcc -o check_clocks check_clocks.c
### check on Verdin iMX8MP Master ###
root@verdin-imx8mp-07250979:~# ./check_clocks -v -d eth0
Dumping timestamps and deltas
rt tstamp: 1678954738288637418
tai tstamp: 1678954775288637543
phc tstamp: 1678954775288641175
rt latency: 125
tai latency: 125
phc latency: 1860
phc-rt delta: 37000003757
phc-tai delta: 3632
Clocks on this system are synchronized :)
### check on Apalis iMX8 Slave ###
root@apalis-imx8-07308034:~# ./check_clocks -v -d eth0
Dumping timestamps and deltas
rt tstamp: 1678954739151415597
tai tstamp: 1678954776151415847
phc tstamp: 1678954776151421106
rt latency: 125
tai latency: 250
phc latency: 3468
phc-rt delta: 37000005509
phc-tai delta: 5259
Clocks on this system are synchronized :)
---------------------------------------
5). 總結(jié)
本文基于NXP iMX8系列處理器簡單演示了 TSN 通過 gPTP 協(xié)議進(jìn)行網(wǎng)絡(luò)時間同步的機(jī)制。
參考文檔
https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/AVB-TSN-demo-on-i-MX8MP/ta-p/1123791
https://tsn.readthedocs.io/timesync.html
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試