Skip to content

CMSIS DAP

askn37 edited this page Nov 2, 2026 · 2 revisions

CMSIS-DAP Protocol / EDBG-based Protocol

Cortex Microcontroller Software Interface Standard - Debug Access Port

本稿は CMSIS-DAP や EDBG の規約書を読むための端し書きで、詳細な解説までは踏み込んでいない。

概要

CMSIS-DAP は、Arm Cortex processor の デバッグアクセスポート(DAP)に ホストPCから標準化された手順で接続するための プロトコル および ファームウェア規格。

  • 標準インターフェース : Arm CoreSight DAP を介し、JTAG や SWD で MCU と通信。
  • USB接続 : ホストPC側とは USBで接続し、追加の専用ドライバー不要 または 簡易な USB-HID応用ドライバーで動作。
  • 対応ツール : Keil MDK、OpenOCD、IAR、PyOCD など、多くの開発環境や デバッガーで幅広く利用可能。
  • 公式リポジトリ : 詳細は ARM-software(GitHub)で仕様や Cortex 用ファームウェアが公開されている。
  • 採用ライセンス : Apache License Version 2.0
  • 必要スペック: Cortex-M 系統、48 MHz 以上、USB High-Speed 推奨。SWO_STREAMスループットが8倍速い
  • 更新状況 : v2.1.2 (latest) - v1.x 新規設計非推奨

ARM Ltd. のサポート責任範囲は当然ながら Cortex processor 系統専用。他社ベンダーは各自独自の拡張(ベンダーIDとコマンド)で個別対応している。

  • これらのベンダー固有定義が公式に取り込まれることは、将来にわたってないとされる。そりゃそうでしょ

発展的ベンダー固有実装

Microchip の場合;

  • Atmel SAMD 系統 : コアが Cortex-M なので Full-Speed 専用であるけれど実質フルスペック。
  • デバッガー(プロトコルブリッジ) : これらは EDBG-based Protocol を下位層に持つ。
    • ATMEL-ICE 系統 : High-Speed。初期から JTAG-10P ミニコネクタ搭載が特徴。SAM/AVR 対応。VCPなし。
    • PICKit 系統 : 3以降 Atmel 委託開発、4以降 High-Speed対応、5以降 VCP対応。PIC/AVR対応。
      • これらの単体デバッガー製品は伝統的に給電機能を有していないので、ホビイストには扱いづらい。以下のオンボード型のが適する。
    • Xplained Pro : Atmel AT32UC3A4256(AVR32)で実装。ATMEL-ICE同等。PICKit4の原型。High-Speed。AVR専用。VCPなし。
      • なにぶんコアが AVR32なので、オンボードデバッグ対象の MCU に比べると不釣り合いに高コスト。
    • Xplained Mini : Atmel ATmega32U4 で実装。Full-Speed。mini-EDBG。AVR専用。VCP対応。かなり機能が限定されている。
    • PKOBN : Curiosity Nano製品に搭載。Atmel ATSAMD21E18(Cortex-M)で実装。Full-Speed。nano-EDBG。VCP対応。PIC/SAM/AVR対応。
      • 低コストだが割と性能が良い。VCPバッファは 50バイトなので、そこは性能控えめ。
  • Android の デバッガー仕様も CMSIS-DAP ベースで構築されていて eDBG と略されるが、同じではない。

OpenOCD、PyOCD の視点;

  • 最近新製品が続々出ている PKOBN 系統群に追いつけていない。PIC/AVR対応はおざなり。

AVRDUDE の視点;

  • メモリの読み書きだけが目的なので、下層コマンドセットに JTAG/SWOを用いていても、OCD関係には関与しない。採用ライセンスは GPL 2.0。
  • USBライブラリの都合もあり、伝統的に Product ID で実装区別をしている。状況によっては High-Speed/Full-Speed の切り分けができず、USBハブを挟むと混乱しがち。
  • USB記述子をちゃんと読んで調べれば良いのだが、USBライブラリの抽象化程度に依存してしまうため、それがうまく解決できていない。
  • CMSIS-DAP 規約の多くを満たしているわけではなく、最低限必要な機能だけを使用する。

UPDI4AVR と euboot の視点;

  • AVRDUDE から要求される EDBGサブセットだけを実装している。Full-Speed。現状は JTAG/SWO/OCD非対応。採用ライセンスは MIT。
  • EDBG の下層は JTAG3様式ペイロードで UPDI制御指令をコンテナ化している。
  • USB認識のために CMSIS-DAP 相当の挙動をするが、ソースコードは AVR DU 系統専用に書かれた クリーンルーム・ベアメタル・フルスクラッチ。AI不使用。
  • 概ね PKOBN を模倣している。UPDI4AVR の VCPバッファは 64バイト。GPSの NMEAを流すには不足気味

Configuring USB Peripheral

以下は USB装置 周辺機能の 記述子を構成する際の要点。

Device Descriptor

  • bcdUSB : 0x0200 - USB版番号。0x0210 にすると、後述の Windows 拡張記述子(BOS)に対応できる。
  • bDeviceClass : 0xFF - ベンダー定義クラス符号。インターフェース記述子で上書きできるので 0x00 も可。
  • bDeviceSubClass : 0x00 - 補助クラス符号は、インターフェース依存。
  • bDeviceProtocol : 0x00 - 規約符号は、インターフェース依存。
  • iProduct : 製品文字列を示す、文字列記述子指標番号。この文中に "CMSIS-DAP" を含めるのが推奨される。
    • これは インターフェース記述子側で宣言しても良いらしい。
  • iSerialNumber : 製品番号を示す、文字列記述子指標番号。複数装置を同時認識するなら必須。
    • 製品番号文字列はユニークであること。USB規約的には 16進数表記(大文字)で 12桁以上を推奨。

Endpoint Descriptor

使用される バルクエンドポイントは、番号で用途が固定されている。後述の BOD を使わない場合、EP1と EP2は "USB HID" 標準クラスドライバーで認識する。

  • Endpoint 1 (0x81): Bulk Out – used for commands received from host PC.
  • Endpoint 2 (0x02): Bulk In – used for responses send to host PC.
  • Endpoint 3 (0x03): Bulk In (optional) – used for streaming SWO trace (if enabled with SWO_STREAM).

オプションの VCP用エンドポイントは双方向とも 4を例に挙げているが、普通に CDC-ACM として構成するのなら上記以外の任意の EP番号でも関係ない。

エンドポイント記述子の wMaxPacketSize は、USB 対応速度によって指定できる値が異なる。

wMaxPacketSize

Speed EP1 EP2 EP3
Full-Speed (USB 2.0) 64 64 4
High-Speed (USB 3.0) 512 512 4
  • この値は DAP_Info#Packet_Size 取得値と一致するはずだ。

Additional settings for Microsoft Windows

Windows の場合、BOS(Binary Device Object Store)記述子に対応することで、Windows 8 以降で標準の "winusb.sys" に適合させることができる。(Windows XP 以降は要追加導入)

  • この機能を使わなければ、ふつうの "USB HID" クラス装置として動作する。
  • BODは、先頭がbLength + bDescriptorTypeではなくwLength + wDescriptorTypeになっている。数値項はLSB先行、文字列は UTF16-LE(null終了)形式。
  • Device Descriptor の bcdUSB は 0x0210(using Microsoft Windows OS 2.0 Descriptor)を指定するのが肝要。
  • Vendor Class Request の bDescriptorType = 0x20 で、ホストは取得しにくる。中身はまんま レジストリDB検索クエリ。
Size Field Value (LE) Description
(Descriptor Set Header)
2 wLength 0x000A この機能単位の長さ(10)
2 wDescriptorType 0x0000 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 0x06030000 対応Windows版番号
2 wTotalLength 0x00A0 この記述子セットの全体長(160)
(Compatible ID Function)
2 wLength 0x0014 この機能単位の長さ(20)
2 wDescriptorType 0x0003 MSOS20_FEATURE_COMPATIBLE_ID
8 wCompatibleID[4] UTF16-LE "WINUSB"
8 wSubCompatibleID[4] UTF16-LE (未指定:0 埋め)
(GUIDs Property Function)
2 wLength 0x0082 この機能単位の長さ(130)
2 wDescriptorType 0x0004 MSOS20_FEATURE_REG_PROPERTY
2 wPropertyDataType 0x0007 MSOS20_PROPERTY_DATA_REG_MULTI_SZ
2 wPropertyNameLength 0x002A 次の文字列長(42)
42 wPropertyName[21] UTF16-LE "DeviceInterfaceGUIDs"
2 wPropertyDataLength 0x004E 次の文字列長(78)
78 wPropertyData[39] UTF16-LE "{CDB3B5AD-293B-4663-AA36-1AAE46463776}"

USB HID Report Descriptor

装置が Full-Speed か、High-Speed かで、ホストに返すべき内容が異なる。前者は 64バイトバッファ、後者は 512バイトバッファの設定になる。つまり High-Speed 対応を有効にするには High-Speed 用のエンドポイント記述子(wMaxPacketSize = 512)と構成記述子セットを用意し、"Device Qualifier Descriptor" と "Other-speed Configuration Descriptor" に応答できなければならない。

High-Speed HID Report Descriptor

06 00 FF  G Usage Page (Page# for Vendor-Specific),
09 01     L Usage (unknown),
A1 01     M Collection (Application),             ;Start collection
15 00     G  Logical Minimum (0),
25 FF     G  Logical Maximum (255),               ;Fields return values from 0 to 255
75 08     G  Report Size (8),                     ;Create 8 bit fields
96 00 02  G  Report Count (512),                  ;Full-Speed ではこの行を 64 (96 40 00) に変更する
09 01     L  Usage (unknown),
81 02     M  Input (Data, Variable, Absolute),    ;512 bytes input report
09 01     L  Usage (unknown),
91 02     M  Output (Data, Variable, Absolute),   ;512 bytes output report
95 04     G  Report Count (4),                    ;(optional)
09 01     L  Usage (unknown),                     ;(optional)
B1 02     M  Feature (Data, Variable, Absolute),  ;(optional) 4 bytes feature report
C0        M End Collection                        ;Close collection

DAP Command Stream

  • EP1/EP2 送受信とも、64(または512)バイト固定長を 1フレームとし、先頭 第1バイトで DAPコマンドを表す。第2バイト以降は各コマンドでフォーマットが異なる。
  • EP1 で要求された DAPコマンドに対し、EP2 で同じ DAPコマンドで応答を返すと、1回の DAPコマンドセットが完了する。
Command Group Description
0x00 General DAP_Info
0x01 DAP_HostStatus
0x02 DAP_Connect
0x03 DAP_Disconnect
0x08 DAP_WriteABORT
0x09 DAP_Delay
0x0A DAP_ResetTarget
0x10 Common SWD/JTAG DAP_SWJ_Pins
0x11 DAP_SWJ_Clock
0x12 DAP_SWJ_Sequence
0x13 SWD DAP_SWD_Configure
0x1D DAP_SWD_Sequence
0x17 SWO DAP_SWO_Transport
0x18 DAP_SWO_Mode
0x19 DAP_SWO_Baudrate
0x1A DAP_SWO_Control
0x1B DAP_SWO_Status
0x1C DAP_SWO_Data
0x1E DAP_SWO_ExtendedStatus
0x14 JTAG DAP_JTAG_Sequence
0x15 DAP_JTAG_Configure
0x16 DAP_JTAG_IDCODE
0x04 Transfer DAP_TransferConfigure
0x05 DAP_Transfer
0x06 DAP_TransferBlock
0x07 DAP_TransferAbort
0x7E Atomic DAP_QueueCommands
0x7F DAP_ExecuteCommands
0x1F UART COM DAP_UART_Transport
0x20 DAP_UART_Configure
0x21 DAP_UART_Transfer
0x22 DAP_UART_Control
0x23 DAP_UART_Status
0x80...0x9F Vendor DAP_VENDOR_Commands
  • DAP_Info は、すべての対応装置でなにがしか実装されているはず。それ以外はベンダーで対応の可否が異なる。
  • DAP_HostStatus は接続テスト用で、装置に装備した LEDを任意で”Lチカ”させられる機能。ないこともある。
  • DAP_Connect / DAP_Disconnect は、SWO/JTAG の接続開始/終了制御する機能。たいてい実装されている。
  • UART COM群は、CDC-ACMの SerialState 等と同じ機能を、DAPコマンド層で扱えるようにしたもの。OCD(GDB)経由での制御を想定。
  • 0x80から0x9Fの 32個の IDは、ベンダーコマンドセクションという。この範囲は各ベンダーが自由に定義することができるが、当然ベンダーが異なれば IDが重複することになるので、DAP_Info#Product_Name コマンド等で どのベンダー対応なのかを識別できることが好ましい。

DAP_Info Command

DAP_Info コマンドは、すべて 2バイトからなり、EP1_OUTで送出される。第2バイトに機能ID が指定される。装置からの応答は EP2_INを通じて行い、第1バイトにコマンド番号、第2バイトに続くデータ長、第3バイト以降に結果を格納する。

  • 全ての実装で全ての機能が実装されているわけではない。おもな対応機能は "Capabilities" で返すビットマップで示される。
  • 結果の "String" は ASCIIZ 形式(C言語型)が想定される。ゼロ長応答可。UTF16-LE ではない
ID Function Response
0x01 Vendor Name String
0x02 Product Name String
0x03 Serial Number String
0x04 CMSIS-DAP Protocol Version String
0x05 Target Device Vendor String
0x06 Target Device Name String
0x07 Target Board Vendor String
0x08 Target Board Name String
0x09 Product Firmware Version String
0xF0 Capabilities BYTE(1)
0xF1 Test Domain Timer LONG(8)
0xFB UART Receive Buffer Size WORD(4)
0xFC UART Transmit Buffer Size WORD(4)
0xFD SWO Trace Buffer Size WORD(4)
0xFE maximum Packet Count BYTE(1)
0xFF maximum Packet Size SHORT(2)
  • "CMSIS-DAP Protocol Version" は "2.1.2" 等と書く。
  • "Test Domain Timer" は Cortex 依存の汎用 32 bit タイマー設定周波数。FLOAT(8)かも
  • "UART Buffer Size" は、フロー制御非対応 UARTでの文字落ち救済に関わる。
  • "maximum Packet Size" は重要で、最大コマンド長が 64 か 512(あるいはそれ以外)かは、これで検証できる。

"Xplained Mini/Nano" の仕様が古い Firmware は基本的に後述のベンダーコマンドしか受け付けず、非対応の DAP コマンドを呼ぶだけで STALLED するから、とても困る。

Capabilities Bitmap

Bit Support Function
0 SWD
1 JTAG
2 SWO UART
3 SWO Manchester
4 Atomic Commands
5 Test Domain Timer
6 SWO Streaming Trace
7 UART Communication Port
8 USB COM Port
  • Bit3 は SWO物理層がマンチェスタ符号化対応という意味。送信はともかく受信回路が面倒なやつ
  • Bit7 は 装置の UARTポートが外部開放、Bit8 は VCP(Virtual COM)対応の意味。VCPのみ有効だと内部完結なので、ボーレート設定に意味がないことがわかる。
  • ベンダー拡張しか実装しない装置の場合、全部非サポートという応答も普通にある。euboot はそう

DAP Other Commands

その他の DAP コマンドは、原書を参照のこと。

AVR Vendor Commands

EDBGベースでの "AVR Communication Protocol" が使用される実装では、以下の CMSIS-DAP ベンダーコマンドが使用される。EDBG 仕様プロトコルの根幹部分。

ID Command Usage Description
0x80 AVR_CMD AVR AVRプロトコルをカプセル化したコマンド
0x81 AVR_RSP AVR AVRプロトコルをカプセル化したレスポンス(のポーリング)
0x82 AVR_EVT AVR AVRプロトコルをカプセル化したイベント(のポーリング)
0x83 GET_CONFIG EDBG EDBGボード構成の取得
0x84 SET_CONFIG EDBG EDBGボード構成の設定("HHB"が付く製品のみ)
0x85 RESET ARM カスタムリセットシーケンスの実行
0x86 ERASE_PIN ARM/EDBG 消去ピン(Erase Pin)の制御
0x87 SERIAL_TRACE ARM 直列トレース取得コマンド
0x88 GET_REQUEST EDBG EDBGの GETコマンドをカプセル化したもの
0x89 SET_REQUEST EDBG EDBGの SETコマンドをカプセル化したもの
0x8A DATA_POLLING ALL データポーリングサービスの設定

AVR_CMD Command

AVR_CMD コマンドは、装置に送るべき AVR プロトコル を 60(あるいは 508)バイト以下に細分化し、4バイトのヘッダを付加した 1個以上の複数のエンベロープとして、ホストから EP1_OUT を通じて送出される。装置側はそれを 1個のエンベロープを受領するたびに、EP2_IN で 受領状態を報告する。(半二重フロー制御ハンドシェーク)

1個のエンベロープの最大長は エンドポイントパケット長(かつ HIDレポート長)に等しい。その第2バイトには、下位ニブルが全エンベロープ分割数(n)、上位ニブルが 1から始まる エンベロープ通番(m)の FragmentInfo が示される。第3と 第4バイト目は合わせて MSB先行の 無符合整数 Size となり、続く CommandPacket 長を示す。

  • データ長 0 は許容しうるが、FragmentInfo の各ニブルが 0 になることは仕様上ない。
  • フラグメント最大値は 15なので、64バイトEPパケットでは 60 * 15 == 900バイト、512バイトEPパケットでは 508 * 15 == 7620 バイトが、仕様上の最大 AVR パケット長となる。ただし通常、AVR パケット長が 540バイトを超えることはないはずだ。

ホストから装置:EP1

Field Byte Description
AVR_CMD 1 0x80
FragmentInfo 1 フラグメント情報(通番 m : 全数 n)
Size 2 以下の AVR パケットのバイト長 N(MSB 先行)
CommandPacket N 細分化された AVR パケット

装置からホスト:EP2

Field Byte Description
AVR_CMD 1 0x80
FragmentCode 1 0x00: 次フラグメント送信要求 (m < n)
0x01: AVR パケット全体の受領完了 (m == n)

AVR_CMD 実行例

EP1_OUT 0x80,0x12,0x3C,最初の60バイト
EP2_IN  0x80,0x00
EP1_OUT 0x80,0x22,0x28,残りの40バイト
EP2_IN  0x80,0x01

途中で 0x80,0x01 を返したりタイムアウトすれば、エラー中断となる。都度受信する CommandPacket 領域は、別のバッファに memcpy して直列化し、所望の AVR プロトコル全体を再構成する。

仕様上は、必ずしも毎回きっちり 60(508)バイトずつ細分化する必要はない。15フラグメントの範疇で任意に区切っても、問題ないことになっている。 データ構造とハンドシェークの仕様により 喪失パケット検出/再送要求も可能とみられるが、現状では実装要件にない。

AVR_RSP Command

AVR_RSP コマンドは、ホストから装置に応答すべき AVR レスポンス を要求する。第2バイトの FragmentInfo が 0 の場合は、返されるべき有意の AVR レスポンス はない。この場合は パケットの残りの部分は棄却し、ホストは AVR_RSP コマンド を再送(ポーリング)する。FragmentInfo が 0 でない場合は、AVR_CMD コマンド と同じ様式で AVR レスポンスを 細分化した 1個以上の複数の エンベロープに編成して、ホストに返す。

ホストから装置:EP1

Field Byte Description
AVR_RSP 1 0x81

パケットの残りは棄却する。

装置からホスト:EP2

Field Byte Description
AVR_RSP 1 0x81
FragmentInfo 1 0x00: 装置は応答を返す準備ができていない
その他: フラグメント情報(通番 m : 全数 n)
Size 2 以下の AVR パケットのバイト長 N(MSB 先行)
Response N 細分化された AVR レスポンス

AVR_RSP 実行例

EP1_OUT 0x81      (AVR_RSP要求)
EP2_IN  0x81,0x00 (装置からの返却なし)
EP1_OUT 0x81      (再送)
EP2_IN  0x81,0x12,0x3C,最初の60バイト
EP1_OUT 0x81
EP2_IN  0x81,0x22,0x14,残りの20バイト

AVR_CMD と違い、ホストからは FragmentInfo を要求しない仕様なので、喪失パケット検出/再送はできない。

AVR_EVT Command

AVR_EVT コマンドは、AVR_RSP コマンド と同様のポーリングにより、装置からのイベントメッセージを要求することができる。ただし FragmentInfo は含まないので、最大長は 1個のエンドポイントパケット長で制限される。

ホストから装置:EP1

Field Byte Description
AVR_EVT 1 0x82

パケットの残りは棄却する。

装置からホスト:EP2

Field Byte Description
AVR_EVT 1 0x82
Size 2 以下の AVR パケットのバイト長 N(MSB 先行)
ただし 0 の場合は、応答すべきイベントなし
Event N AVR イベントエンベロープ

AVR Communication Protocol (EDBG-based)

EDBG における AVR 通信プロトコルは、AVR_CMD と AVR_RSP、または AVR_EVT と AVR_RSP の組でカプセル化された フレームによって、ホストと装置の間を送受信される。

  • "Protocol handler ID" は、パケットをデコードする際に使用すべきサブプロトコルを特定し、どのコマンドハンドラにデータ本体を渡すべきかを指定する。

Command Frame Format

Field Size Value
SOF 1 0x0E(Start of Frame 固定値)
Protocol version 1 0x00(全パケット共通、現バージョンでは 0)
Sequence ID 2 0x00 からインクリメント(LSB先行)
Protocol handler ID 1 宛先サブプロトコルハンドラのID
Payload N 宛先サブプロトコルに依存した様式データ

Response Frame Format

Field Size Value
SOF 1 0x0E
Sequence ID 2 受信したIDの折り返し(LSB先行)
Protocol handler ID 1 送信元サブプロトコルハンドラのID
Payload N 送信元サブプロトコルに依存した様式データ

Event Response Frame Format

Field Size Value
SOF 1 0x0E(Start of Frame 固定値)
Protocol version 1 0x00(全パケット共通、現バージョンでは 0)
Sequence ID 2 0x00 からインクリメント(LSB先行)
Protocol handler ID 1 送信元サブプロトコルハンドラのID
Payload N 送信元サブプロトコルに依存した様式データ

Protocol Sub-sets

ID Name Description
0x00 DISCOVERY 支援される機能セットを検出するための機能
0x01 HOUSEKEEPING (HK) 管理・保守(ハウスキーピング)機能
0x11 AVRISP SPI実装ベースの AVRISP 様式プログラミング
0x12 AVR8GENERIC debugWIRE/JTAG/PDI/UPDI実装ベースの JTAG3 様式プログラミング
0x13 AVR32GENERIC AVR32実装ベースの JTAG/aWire 様式プログラミング
0x14 TPI TPI実装ベースの STK600-XPRG 様式プログラミング
0x20 EDBG_CTRL EDBG の制御および設定
  • "AVR8GENERIC" ペイロードには、さらに下層の各実装別 サブプロトコルハンドラ構造がある。つまり、例えば UPDI読み書き指令は、"USB-HID > CMSIS-DAP > EDBG > AVR8GENERIC > UPDI" という 5重のプロトコル階層の中に格納されている。

関連リンク

CMSIS / CMSIS-DAP Protocol

EDBG (Embedded Debugger) Protocol

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally