インターフェース・バス(有線)

JTAG

チップのデバッグ・書き込み用の標準インターフェース。

概要

JTAG(Joint Test Action Group)は、半導体チップや回路基板のテスト・デバッグ・プログラミングを目的として策定された業界標準インターフェースである。正式規格名は IEEE 1149.1 であり、1990年に初版が策定された。現在に至るまでマイクロコントローラ(MCU)、FPGA、SoC、CPUなど事実上すべてのデジタルチップに搭載されており、組み込み開発においてほぼ不可欠な技術となっている。

JTAGの主な用途は以下の3つに大別される。

  1. バウンダリスキャン(Boundary Scan) — 実装後の基板において、ICピン同士の接続不良やはんだブリッジを外部から検査する。
  2. インサーキットデバッグ(In-Circuit Debug) — CPU内部のレジスタやメモリをリアルタイムで読み書きし、ブレークポイント設定や変数ウォッチを実現する。
  3. フラッシュ書き込み(Flash Programming) — ファームウェアイメージをフラッシュメモリに書き込む。

ホストPCとターゲット基板の間には JTAGアダプタ(プローブ)と呼ばれるハードウェアが介在し、USB やイーサネット経由で接続する。代表的なアダプタとして J-Link(SEGGER)、ST-LINK(STMicroelectronics)、CMSIS-DAP 準拠デバイスなどが挙げられる。


歴史・背景

1980年代後半、表面実装技術(SMT)の普及によりICのピンが基板裏面や内部に隠れるようになり、従来の物理的なプローブを使ったインサーキットテストが困難になった。この課題を解決するため、1985年に複数の半導体メーカーが集まって JTAG コンソーシアムを設立した。

1990年に IEEE 1149.1 として標準化され、その後以下のように拡張されてきた。

規格追加内容
IEEE 1149.11990基本バウンダリスキャン規格
IEEE 1149.41999アナログバウンダリスキャン拡張
IEEE 1149.62003高速差動信号対応
IEEE 1149.720092線式縮小版(cJTAG)標準化
IEEE 1149.102017高速JTAG(HSSTP)

Arm が CoreSight デバッグアーキテクチャを導入してからは、JTAG は単なるテスト手段を超えて「CPUコアへのデバッグアクセスポート」として広く使われるようになった。組み込みLinuxや RTOS 上での GDB リモートデバッグも、多くの場合 JTAG 経由で実現されている。


技術仕様

信号線

標準的な JTAG インターフェースは以下の4本の必須信号線と、1本のオプション信号線で構成される。

信号名方向(ホスト視点)説明
TCK(Test Clock)出力クロック信号。通常 1〜40 MHz
TMS(Test Mode Select)出力TAP ステートマシンの制御
TDI(Test Data In)出力チップへのデータ入力(シリアル)
TDO(Test Data Out)入力チップからのデータ出力(シリアル)
TRST(Test Reset)出力(任意)TAP ステートマシンの非同期リセット

これらに加えて電源(VCC)とGNDが接続される。コネクタの物理形状は標準化されていないが、20ピンや10ピンの2.54mm ピッチが一般的であり、ARM 系では 20ピン 2.54mm ピッチの「ARM Standard JTAG」コネクタが広く普及している。

TAP(Test Access Port)ステートマシン

JTAG の中核は TAP コントローラと呼ばれる16状態のステートマシンである。TMS 信号の HIGH/LOW によってステートが遷移し、どのレジスタ(命令レジスタ・データレジスタ)にアクセスするかを決定する。

          TMS=1      TMS=0
Reset ──────────────▶ Run-Test/Idle

                    TMS=1 ▼
                    Select-DR-Scan ──▶ Select-IR-Scan
                          │                   │
                    TMS=0 ▼             TMS=0 ▼
                    Capture-DR       Capture-IR
                          │                   │
                    TMS=0 ▼             TMS=0 ▼
                    Shift-DR         Shift-IR
                          │                   │
                    TMS=1 ▼             TMS=1 ▼
                    Exit1-DR         Exit1-IR
                          ...

デイジーチェーン接続

複数チップの TDO → TDI を数珠つなぎにすることで、1本の JTAG チェーンで複数デバイスをテストできる。

Host                Chip A              Chip B
TDI ──────────────▶ TDI   TDO ────────▶ TDI   TDO ──────▶ Host TDO
TCK ─────────────┬─ TCK        ┌────── TCK
TMS ─────────────┴─ TMS        └────── TMS

動作原理

バウンダリスキャンの仕組み

各 I/O ピンに バウンダリスキャンセルと呼ばれるフリップフロップが挿入されている。このセルをシリアルにつなぐと「シフトレジスタ」として機能し、外部から全ピンの状態を読み書きできる。

        Core Logic

    ┌──────┴──────┐
    │  Scan Cell  │◀── TDI(シリアル入力)
    │  Flip-Flop  │──▶ TDO(シリアル出力)
    └──────┬──────┘

        I/O Pin

デバッグアクセスの仕組み(ARM CoreSight)

ARM コアでは JTAG ポートは DAP(Debug Access Port) を介してコアの内部バスへアクセスする。DAP 内部には AP(Access Port) が複数存在し、主なものに以下がある。

  • MEM-AP — システムバス経由でメモリやペリフェラルレジスタにアクセス
  • JTAG-AP — 配下の JTAG デバイスへのゲートウェイ

デバッガソフトウェア(例: OpenOCD)は TCK/TMS/TDI/TDO を操作して DAP にアクセスし、CPU レジスタの読み書き・ブレークポイント設定・ステップ実行などを実現する。

フラッシュ書き込みの流れ

1. JTAGアダプタがターゲットMCUにハルト(停止)命令を送信
2. フラッシュコントローラのレジスタ設定(アンロック・消去・書き込みシーケンス)
3. RAM上に「フラッシュアルゴリズム」をロードして実行
4. バイナリデータをチャンク単位でRAMに転送 → フラッシュへ書き込み
5. ベリファイ(書き込み内容の読み出し比較)
6. MCUリセット → 実行開始

用途・ユースケース

製造テスト

基板実装後の量産テストでは、JTAG バウンダリスキャンを使って ICE(インサーキットエミュレータ)なしに接続不良を検出できる。テストカバレッジが高く、QFP・BGA 実装品の検査に特に有効である。

ファームウェア開発・デバッグ

IDE(Keil MDK、STM32CubeIDE、VS Code + Cortex-Debug 拡張など)から JTAG 経由でターゲットに接続し、ブレークポイント・変数ウォッチ・メモリダンプを利用した対話的デバッグが可能になる。

IDE(GDB Client)──── OpenOCD(GDB Server)──── JTAGアダプタ(J-Link等)──── ターゲットMCU

セキュリティ研究・リバースエンジニアリング

製品化されたデバイスの JTAG ポートを発見・解析することで、ファームウェアの抽出や脆弱性評価が行われる場合がある。このため、製品出荷時には JTAG を ロック(Disable) する設定が一般的である。

FPGA の設定・デバッグ

Xilinx(AMD)や Intel(Altera)の FPGA はビットストリームを JTAG 経由で書き込む。さらに Xilinx の ChipScope / ILA(Integrated Logic Analyzer)のようなオンチップデバッグ機能も JTAG 経由で動作する。


実装・開発のポイント

OpenOCD の設定例(STM32)

OpenOCD はオープンソースの JTAG/SWD ソフトウェアであり、GDB サーバーとして機能する。

# openocd.cfg(STM32F4 + J-Link の例)
source [find interface/jlink.cfg]
transport select jtag

source [find target/stm32f4x.cfg]

init
reset halt

起動コマンド:

openocd -f openocd.cfg

別ターミナルで GDB 接続:

arm-none-eabi-gdb firmware.elf
(gdb) target remote localhost:3333
(gdb) monitor reset halt
(gdb) load
(gdb) continue

VS Code + Cortex-Debug での設定例

// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug (OpenOCD)",
      "type": "cortex-debug",
      "request": "launch",
      "servertype": "openocd",
      "configFiles": ["openocd.cfg"],
      "executable": "${workspaceFolder}/build/firmware.elf",
      "runToEntryPoint": "main",
      "svdFile": "${workspaceFolder}/STM32F407.svd"
    }
  ]
}

JTAG の速度とノイズ対策

  • TCK 周波数はターゲットクロックの 1/6 以下 が推奨(例: 16MHz 動作なら TCK は 2〜4MHz)
  • ケーブル長は 30cm 以内が目安。長い場合は直列終端抵抗(33〜100Ω)を挿入する
  • TDO ラインは特に高インピーダンスで誘導されやすいため、プルアップ抵抗(10kΩ)を付けておくと安定する

JTAGロック(セキュリティ保護)

製品出荷後に JTAG アクセスを禁止する手順は MCU ごとに異なるが、一般的には以下のようなオプションバイト(Option Bytes)やヒューズビットを設定する。

// STM32 の場合: FLASH_OBR の RDP(Read Protection)を設定
// HAL ライブラリを使用
FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
OBInit.OptionType = OPTIONBYTE_RDP;
OBInit.RDPLevel   = OB_RDP_LEVEL_1;  // Level 1: デバッグ禁止
HAL_FLASHEx_OBProgram(&OBInit);
HAL_FLASH_OB_Launch();

他技術との比較

項目JTAGSWDUART(BootROM)
信号線数4〜5本2本2本(TX/RX)
デバッグ機能完全対応完全対応(ARM限定)限定的
フラッシュ書き込み対応対応MCU依存で対応
バウンダリスキャン対応非対応非対応
対応アーキテクチャ汎用ARM専用汎用
コネクタ占有面積大きめ小さい小さい
一般的な用途FPGA・大規模SoC・製造テストARM MCU開発初期書き込み

JTAG と SWD は多くの ARM MCU(STM32、nRF52 等)で 共用ピン として実装されており、アダプタ側でどちらを使うか選択できる。ピン数が限られた小型製品では SWD が好まれるが、FPGA や複数チップのデイジーチェーンが必要な場合は JTAG が適している。

Arduino などの低コストプラットフォームは JTAG デバッグ端子を持たない場合が多いが、ESP32 は JTAG をサポートしており、USB 内蔵の JTAG(ESP32-S3 等)も登場している。

関連用語

参考リンク