Blog:
NXP i.MX 8 シリーズプロセッサー TSN ネットワーククロック同期テスト

Wednesday, November 8, 2023

はじめに


IEEE 802.1 TSN (Time-Sensitive Networking) は、802.x ネットワークアーキテクチャーに基づくプロトコルで、時刻同期と低レイテンシーサービスの機能を提供します。先行のプロトコルは IEEE AVB (Audio Video Bridge) で、関連するプロトコル規格の広がりを推進するため、2012年に TSN へと名称が変更されました。AVB/TSN にはさまざまな特定の規格が含まれています (下表を参照)。なかでも最も重要な規格の 1 つは IEEE 802.1AS のクロック同期規格で、これは IEE 1588 に基づいています。合理化され、変更が加えられており、gPTP 規格とも呼ばれます。

PTP 規格は、精密な時刻同期を実現するプロトコルです。IEEE 1588 規格は、時刻配信のためにマスタースレーブのアーキテクチャーを定義しており、このアーキテクチャーは、1 つまたは複数のネットワークセグメントと 1 つまたは複数のクロックから成ります。ローカルエリアネットワークでは、時刻同期の正確さはマイクロ秒未満の精度で制御できます。PTP 規格では、MAC 層にタイムスタンプを押すため、ネットワークプロトコルのスタック内でのデータパケット処理時間の遅れを排除します。タイムスタンプの記録と送信を確認し、データパケットの正確な送信と受信のタイムスタンプを取得します。ほかの時刻同期プロトコル (NTP など) と比較して、PTP 規格の同期精度は最も高くなっています。

この記事では、NXP 最新の i.MX8 シリーズ ARM プロセッサープラットフォームを使った TSN クロック同期のシンプルなテストについて取り挙げます。
本記事のために利用したのは、Toradex Verdin iMX8M Plus および Apalis iMX8 組み込みプラットフォームです。これらは、近年リリースされた、Arm Cortex-A53/A72 プロセッサー搭載 NXP i.MX8 シリーズ製品に基づいています。


ハードウェアの準備

a). Verdin iMX8MPDahlia キャリアボード に搭載し、デバッグシリアルポートに接続しました。以下のテストでは、このプラットフォームを TSNネットワークのマスタークロックノードとして利用します。Verdin iMX8MP には、TSN、AVB、IEEE 1588 などの関連規格を完全サポートするオンボードのギガビットイーサネット PHY チップ、および AVB と IEEE 1588 をサポートする RGMII インターフェースが含まれます。

b). Apalis iMX8Apalis 評価ボード に搭載し、デバッグシリアルポートに接続しました。以下のテストでは、このプラットフォームを TSN ネットワークのスレーブクロックノードとして利用します。Apalis iMX8 コアボードが提供する 2 つのギガビットネットワークは AVB と IEEE 1588 のみをサポートし、完全な TSN に対応しません。しかし、この記事ではクロック同期を検証するだけなので、Verdin iMX8MP と一緒に利用しても正常に動作します。

c). 2 つのプラットフォームのギガビットイーサネットのポートは、ネットワークケーブルで直接接続しました。

ソフトウェアの準備

a). 下の図で示したとおり、Toradex Verdin iMXMP モジュールの標準 Yocto Linux BSP には、すでに IEEE 802.1AS クロック同期をテストするための Linuxptp ツールが含まれています。Verdin iMX8MP モジュールと Apalis iMX8 モジュールに最新の LTS 5.7.2 をインストールする手順については、こちらを参照してください。

b). この記事のために、IEEE 80.2.1Qav/Qbu/Qbv などのキューフォワーディングのプロトコルをテストする必要がある場合は、Yocto コンパイル環境または Linux BSP ランタイム環境で ioute2-tc tool ソフトウェアを次のように手動でインストールする必要があります。また、必要な変更を加えるために Linux カーネル / デバイスツリーをインストールする必要がある可能性もあります。NXP アプリケーションの記事にある説明を参照してください。

### Ycoto Environment ###
# Add below to <oe-core>/build/conf/local.conf #
IMAGE_INSTALL_append = " iproute2-tc"

### Linux BSP Runtime ###
$ opkg install iproute2-tc_5.5.0-r0_aarch64.ipk


具体的なテスト手順

a). Toradex の Yocto Linux ではデフォルトで NTP 時刻同期規格が有効化されています。これは現在、最も広く利用されているネットワーク時刻同期規格で、ミリ秒単位の精度を達成できます。非常に高精度の時刻同期を必要としない、多くのシナリオで採用することができます。この記事では、gPTP の高精度な時刻同期をテストするため、このテスト手順においては NTP サービスを無効化する必要があります。詳しい手順は後述します。

b). 実際の TSN ネットワークでは、マスタークロックのノードが高精度時刻を生成します。ソースになるのは一般的に GNSS (Global Navigation Satellite System、全地球航法衛星システム) で、PPS (Pulse Per Second) 信号による衛星の時刻を利用します。これは、この記事の主眼ではありません。このため、マスタークロックのノードである Verdin iMX8MP では、Linux システムがインストールされた後、システムクロックはデフォルトで有効になっている NTP サービスを通じて同期、調整されるのみで、これを衛星時刻機能の代用とします。

./ NTP サービスの詳しい設定方法については、こちらを参照してください。まず、Verdin iMX8MP Linux で NTP 時刻同期を完了します。

### NTP status information before synchronization is completed ###
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

### Status information after NTP synchronization is completed ###
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


./ その後、NTP サービスを停止します。

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 マスタークロックノードで、Linuxptp ツールを利用して gPTP サービスを設定します。

./ 主に利用するのは次のツールです。

ptp4l: NIC からの PTP ハードウェアクロック (PHC) を同期するデーモン
phc2sys: PHC とシステムクロックを同期するデーモン
pmc: ランタイムに ptp4l を設定するユーティリティーツール

./ まず、PHC 同期のため ptp4l デーモンのプロセスをバックグラウンドでロードします。

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


// パラメーターは次のとおりです。ほかのパラメーターのオプションや詳しい説明については、ptp4l の manページを参照してください。

-f オプションは、gPTP.cfg 構成ファイルを指定します。これは、ptp4l を gPTP モードで動作させるためのパラメーターを設定するのに利用されます。

-i オプションは、ptp4l が制御する NIC インターフェースを指定します。

--step_threshold オプションは、ステップクロックのしきい値を設定するのに利用します。このしきい値を超えると、クロック時刻が秒単位で直接調整されます。

-m パラメーターは、ログ情報の出力を有効にします。これはテストにおける必要性に合わせてオン、オフの切り換えが可能です。

// マスタークロックノードに必要な gPTP.cfg ファイルは、以下のとおりです。さらに詳しい構成ファイルのリファレンス説明とテンプレートについては、こちらを参照してください。Linux システム内の linuxptp ソフトウェアバージョンは現在 2.0.1 です。該当するブランチの情報を確認してください。

#
# 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


// デフォルトでは、ptp4l は BMCA (Best Master Clock Algorithm) を使用して、グランドマスターの役割に現在の PHC を利用できるかを判断します。または masterOnly あるいは slaveOnly のパラメーターによって強制することも可能で、本記事ではこれを利用します。

ptp4l[1144.641]: selected local clock 00142d.fffe.6ea423 as best master
ptp4l[1144.641]: assuming the grand master role


./PHC 同期が完了したら、次の手順はシステムクロックの同期です。このステップは、主にシステムクロックに依存するアプリケーション (ALSA/GStreamer フレームワーク AVTP プラグイン など) 向けです。
// PHC 時刻は TAI (International Atomic Time、国際原子時) 規格に準じ、システムクロックは協定世界時 (Coordinated Universal Time) 規格に準ずるため、pmc ランタイムツールで相応する変換パラメータ—を設定する必要があります。

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 とシステムクロックを同期します。

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


// パラメーターの説明は次のとおりです。ほかのパラメーターのオプションや詳しい説明については、ptp4l の manページを参照してください。
-s オプションは、相応する NIC (eth0) デバイスの PHC をマスタークロックとして指定します。
-c オプションは、システムクロックをスレーブクロックに指定します。
--step_threshold オプションは、クロックのステップしきい値に使用します。このしきい値を超えると、クロック時刻が直接秒単位で変更されます。
--transportSpecific オプションは、gPTP のドメインでの実行に必要です。
-w パラメーターは、ptp4l が同期を完了するまで、phc2sys を待機の状態にします。
-m パラメーターは、ログ情報の出力を有効にします。これはテストのニーズに合わせてオン、オフの切り換えが可能です。

// 出力されたログ情報で phc のオフセットが 100ns 未満の場合は、クロック同期に成功した、ということになります。

c) Apalis iMX8 スレーブクロックノードでは、linuxptp ツールを使って gPTP サービスを設定します。具体的なプロセスとコマンドはマスターと同様です。ただし、gPTP.cfg 構成ファイルで masterOnly を slaveOnly に変更します。
./まず、このデバイスはスレーブノードであるため、システムインストールの後、Linux のシステムクロックをデフォルトの時刻設定にしておき、時刻同期の操作を行わずに NTP サービスを停止します。

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 デバイスのマスタークロックとの直接のネットワーク接続を介して PHC 時刻を同期します。gPTP 規格は MAC 層に基づいているため、ネットワークポートに 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
......

// 出力されたログ情報の rms は、PHC とグランドマスタークロックの間のオフセットの累乗値です。出力される rms 値が 100ns 未満であり続ける限り、同期に成功していることになります。

// 同時に、マスター側の Verdin iMX8MP の ptp4l も次の情報を出力し、スレーブがマスターに接続して高精度の時刻同期が行われていることを示します。

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


// システムクロックが同期されていないかどうかを確認できます。

### 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


./ PHC とシステムクロックを ph2sys ツールで同期します。

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


// 出力されたログ情報で phc のオフセットが 100ns 未満の場合は、クロック同期に成功した、ということになります。

// このとき、システムクロックがグランドマスターに同期されたことを確認します。

### 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 とシステムクロックが正常に同期されているかをさらに便利に確認するには check_clocks ツールを利用することもできます。ソースコードをダウンロードしたら、こちらの手順を参照して次のコマンドでクロスコンパイルを行い、実行可能ファイルを生成、Linux で実行してクロック同期を検証します。

### 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 :)


まとめ

この記事では、NXP iMX8 シリーズプロセッサーを利用して、gPTP 規格による、ネットワーク時刻同期の TSN の仕組みを簡単にデモンストレーションしました。


参考資料
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

Author: Shanfeng Hu, FAE, Toradex
Share this on:

Leave a comment

Please login to leave a comment!
Have a Question?