JTAGとSWDの違いは?各ケーブルの信号を解析してみた

インターフェース

デバッグ用のインターフェースとして使われるJTAGとSWDの差異を確認してみました。

両方の信号をロジアナで解析をしています。

通信速度からプロトコルの中身まで、実際の波形交えて紹介していきます。

 

スポンサーリンク

JTAGとSWDの違いは?各ケーブルの信号を解析してみた

JTAGとSWDの大きな違いとしては信号線の本数が異なります

JTAGが4本で、SWDが2本です。

JTAGの「TDI,TDO,TMS」の3本が、SWDの「SWDIO」の1本に集約されたイメージです。

  • JTAG「TCK」⇔SWD「SWCLK」
  • JTAG「TDI,TDO,TMS」⇔SWD「SWDIO」

 

JTAGは基本的にTDI,TDO,TCK,TMSの4本の信号で通信します。

※JTAG…Joint Test Action Group

CPUやFPGAのデバッグ用のインターフェースとしてよく使われています。

 

SWDの信号線はSWDIO(データ)とSWCLK(クロック)の2本です。

※SWD…Serial Wire Debug

ARMのデバッグ用のインターフェースとして使われているケースが多いです。

 

JTAGとSWDの違いを解析した結果含めて、詳しく紹介していきます。

 

JTAGの信号解析

JTAGの信号であるTDI,TDO,TCK,TMSの波形をロジアナで測定してみました。

  • TDI…Test Data In
  • TDO…Test Data Out
  • TCK…Test Clock
  • TMS…Test Mode Select

 

実際にJTAG通信をロジアナで測定した動画も下記で紹介しています。

信号解析できている様子が分かりますので、是非合わせてご覧ください。

JTAGの信号を解析!ロジックアナライザで測定してみた

 

JTAGのケーブル

今回JTAGのテストで使用したケーブルはJTAG-HS2です。

XilinxのFPGAにプログラムを書き込むためのツールです。

パソコンからUSB→JTAG変換してFPGAと通信することが可能です。

 

Xilinxの評価ボードメーカとしても有名なDiligent製のケーブルとなります。

下記記事で詳細を紹介しています。

XilinxをJTAG-USBケーブルで書き込み!JTAG-HS2を試してみた

XilinxをJTAG-USBケーブルで書き込み!JTAG-HS2を試してみた
JTAG-HS2を使ってXilinxのFPGAにプログラムを書き込んでみました。 従来の純正のダウンロードケーブルより、小型で非常に使いやすいです。 JTAG-USBケーブルを使ったFPGAへの書き込み方法を分かりやすく紹介します。

 

JTAGの通信速度

JTAGの通信速度(クロック)であるTCKが設定した値になっていることを確認します。

今回のロジアナは安い趣味用ですので、デフォルトの10MHzから1MHzに変更しています。

 

TCKの周波数1MHz(周期1us)であることを測定出来ました。

 

JTAGのステートを確認する

TMSはJTAGデバイスのコントローラ(TAPコントローラ)の状態遷移に使われます。

※TMS…Test Mode Select

TMS信号により、JTAG通信のステートが切り替わります。

 

全てのJTAG(TAPコントローラ)のステートは難しいですが、部分的にでも確認していきます。

TMS信号はステートの状態遷移に使われます。

最初にTMS信号が入ってリセットがかかる箇所を中心に確認していきます。

 

Run-Test-Idle

TMSがLow(0)が続く場合、「Run-Test-Idle」のアイドル状態が維持されています。

TMSをHi(1)にすることでステートが遷移することを確認出来ました。

 

Test-Logic-Reset

TMSをHi(1)後に「Select-DR-Scan」「Select-IR-Scan」に移行しています。

その後「Test-Logic-Reset」のステートに遷移してリセットをしています。

(仕様通りに)TCKの5回分、TMSがHi(1)を維持していることを確認できました。

 

SHIFR-DR

リセットが終わった後は、再度TMSが動きます。

「Run-Test-Idle」「Select-DR-Scan」「Capture-DR」の順でステートが遷移しています。

そして「SHIFT-DR」でTMSはLow(0)を維持して、データが入出力されています。

 

他にも多くのステート・状態遷移があります。(全16ステート)

今回紹介したのはあくまで、ほんの一部であることをご了承下さい。

 

JTAGとロジアナの接続・設定方法などについては下記記事で説明しています。

JTAGのTMS含めた波形をロジアナで解析してみた

JTAGのTMS含めた波形をロジアナで解析してみた
JTAG通信の波形をロジックアナライザで解析してみました。 TMS信号からのステートの状態遷移含めて確認しています。 JTAGが未接続・アイドル・書き込みの際に、どのような波形になるかを紹介します。

 

SWDの信号解析

SWDの信号であるSWDIOとSWCLKの波形もロジアナで測定してみました。

SWDIO…Serial Wire Debug Input Output

SWCLK…Serial Wire  Clock

 

実際にSWD通信をロジアナで測定した動画も下記で紹介しています。

信号解析できている様子が分かりますので、是非合わせてご覧ください。

ARMのSWDのプロトコルをロジアナで確認してみた

 

SWDのケーブル

SWDのケーブルに関してはラズパイを利用しました。

「ラズパイ」からジャンパー線を飛ばして「ラズパイPico」に接続しています。

 

ラズパイPicoはSWDの通信インターフェースを持っています。

 

ラズパイPicoの使い方に関しては下記記事でも紹介しています。

ラズパイでAD変換!Picoでアナログ入力してみた

ラズパイでAD変換!Picoでアナログ入力してみた
ラズベリーパイpicoでAD変換してみました。 簡単に温度や電圧のアナログ入力値を測定することができます。 設定方法からプログラムまで一連の手順を紹介します。

 

SWDのデバッガはOPENOCD

今回のテストではOPENOCDというオープンソースのデバッガで対応しています。

ラズパイPicoに初期通信するタイミングでロジアナを測定しています。

 

ラズパイPicoへのSWD通信に関しては下記ラズパイ公式のドキュメントを参考にしています。

 https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf

Chapter 5. Debugging with SWD

 

SWDの接続方法

ラズパイとPicoのSWD接続は下記形になっています。

ロジアナ含めてジャンパー線とICクリップ-ワニ口で接続しています。

  • ラズパイ_22ピン→Pico_SWCLK
  • ラズパイ_20ピン→Pico_GND
  • ラズパイ_18ピン→Pico_SWDIO

 

ラズパイのOPENOCDの結果

ラズパイからPicoにOPENOCDの通信コマンドを打った時の時の結果です。

SWDで正常に通信できていると、Pico側からIDを取得できています。

 

もし正常に通信できない場合は「Info : DAP init failed」とエラー表示されます。

 

SWDが接続できたログ

SWDが接続できたコマンドのログを貼り付けておきます。

 

SWDが接続できなかったログ

わざとSWDが接続しなかった際のコマンドのログを貼り付けておきます。

 

SWDをロジアナで信号解析を行う

SWDの信号解析をするためにロジアナの設定を行います。

デコードの設定をSWDにして、SWCLKとSWDIOに接続しているCHを選びます。

 

今回の個人で使えるロジアナ・ソフトに関しては下記記事で紹介しています。

ロジアナの使い方!USB接続で簡単に信号解析

ロジアナの使い方!USB接続で簡単に信号解析
ロジックアナライザ(ロジアナ)の使い方をまとめてみました。 1000円程度の個人のロジアナで、簡単に信号解析が可能になります。 I2C、SPI、UARTなど多くの波形測定・解析した事例を紹介します。

 

先述したOPENOCDのコマンド前後では下記波形になります。

何も通信していない状態はプルアップされて、コマンド入力時には一定の通信が見られます。

その後、待機(アイドル)状態では約100ms間隔で通信していました。

 

今回はOPENOCDのコマンド直後の波形を解析していきます。

 

SWDの通信速度

波形をアップしてSWCLKの周波数を確認すると「約1.4MHz」でした。

 

ただ、OPENOCDのコマンドの結果では1.001kHz「約1MHz」という表示でした。

おそらくこの差分に関しては、表示されている通信速度がJTAG換算のためかとは思います。

 

SWDのプロトコル

SWDではデータ線がSWDIOの1本しかありません。

ReadかWriteかを判断するためには、データの頭にパケットが必要になります。

ARMのSWDのプロトコルを規格書から見ると下記形になります。

  • ホストからターゲットへの 「8 bit」のパケット要求
  • ターゲットからホストへの 「3 bit」のACK応答
  • データ32bitとパリティ1bitの「33 bit」データ転送
  • パケット・ACK・データの隙間のTrn(Turnaround)も考慮すると「2bit」

 

素のデータ量「32bit」と比べると、SWDのデータ量は(8+3+33+2)/32≒約1.4倍になる。

そのため、SWDの実通信速度が1MHz→約1.4MHzとなっていそうです。

(もし計算・考えが間違っていたら、ページ末尾箇所にコメントしてもらえると幸いです)

 

SWDの仕様・規格について

ARMの公式HPにSWD含めたデバッグのインターフェースのドキュメントがあります。

もしARMのSWDの仕様を詳しく調査したい方は下記からダウンロードすると良いと思います。

 https://developer.arm.com/documentation/

ARM Debug Interface Architecture Specification ADIv*.*

 

SWDのリセット

SWDのリセット(LINERESET)に関しては「50クロック以上データをHi」にします。

実際のSWDのリセットを確認すると、約64クロック程度Hiになっていました。

 

SWDのACK

SWDのACKは3bitで構成されています。

ACK[0:2]が「100_OK」「010_WAIT」「001_FAULT」となります。

下記例ではACKは「100_OK」となっていました。

 

まとめ

今回はJTAGのSWDの違いに関して紹介させていただきました。

記事をまとめますと下記になります。

JTAG(4本)とSWD(2本)では信号線の本数が違います
SWDはデータ線が1本のため、データの前にパケット・ACKがあります。
JTAG・SWDも両方とも個人的なロジアナで解析可能です。

 

ロジアナは1000円程度で購入可能です。

今回のJTAG・SWD含めて多くの通信インターフェースで測定・解析が可能です。

よろしければ皆さまも是非試してみてください

コメント