Repository navigation
CMSIS DAP
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を流すには不足気味
以下は USB装置 周辺機能の 記述子を構成する際の要点。
-
bcdUSB: 0x0200 - USB版番号。0x0210 にすると、後述の Windows 拡張記述子(BOS)に対応できる。 -
bDeviceClass: 0xFF - ベンダー定義クラス符号。インターフェース記述子で上書きできるので 0x00 も可。 -
bDeviceSubClass: 0x00 - 補助クラス符号は、インターフェース依存。 -
bDeviceProtocol: 0x00 - 規約符号は、インターフェース依存。 -
iProduct: 製品文字列を示す、文字列記述子指標番号。この文中に "CMSIS-DAP" を含めるのが推奨される。- これは インターフェース記述子側で宣言しても良いらしい。
-
iSerialNumber: 製品番号を示す、文字列記述子指標番号。複数装置を同時認識するなら必須。- 製品番号文字列はユニークであること。USB規約的には 16進数表記(大文字)で 12桁以上を推奨。
使用される バルクエンドポイントは、番号で用途が固定されている。後述の 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 取得値と一致するはずだ。
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}" |
装置が 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
- 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 コマンドは、すべて 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 コマンドは、原書を参照のこと。
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 コマンドは、装置に送るべき 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 コマンドは、ホストから装置に応答すべき 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 コマンドは、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 イベントエンベロープ |
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
-
CMSIS-DAP : Overview versiin 2.1.2 (latest) Document / Github Pages
- CMSIS_6 version 6.4.0 Document / Github Pages
-
CMSIS-DAP : Overview versiin 2.1.1 Document / Github Pages
- CMSIS_5 version 5.9.0 Document / Github Pages
- CMSIS-DAP : Repository Cortex-M Firmware / Github Repository
EDBG (Embedded Debugger) Protocol
- EDBG-based Tools Protocols (Microchip DS50002630A) / PDF
Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/
Copyright (c) 2026 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/
multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)