Slide 1

Slide 1 text

Seeeduino XIAOで CMSIS-DAPデバッガを作る MBED祭り 2020@初夏のオンライン (HTTPS://YOUTU.BE/UQ0PC0QMAX8) 2020/07/05 Kenta IDA (@ciniml)

Slide 2

Slide 2 text

自己紹介 •井田 健太 (@ciniml) •仕事:組み込みソフト開発 •使用言語:C++, SystemVerilog, Go, Python •Arm歴:nRF51, STM32F405をちょっとだけ ここ2か月はATSAMD51 あとはZYNQとか •Mbed歴:nRF51+オンラインコンパイラをちょっと。 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る

Slide 3

Slide 3 text

最近やっていること:Wio Terminal 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る • 最近流行の筐体入りマイコン・モジュール • ATSAMD51P19A (Microchip) • Cortex-M4F@120MHz • RTL8720DN (Realtek) • Cortex-M4F@200MHz • Cortex-M0@20MHz • BLE5.0 + WiFi • 液晶 (320x240) ボタン スピーカー etc… • いろいろ付いてて楽しい

Slide 4

Slide 4 text

Wio Terminalのデバッグ 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •基板上にSWDのパッドが出ている • 出荷時のファーム書き込み用 →配線すればデバッガつなげられる! Wio Terminal schematics v1.2より

Slide 5

Slide 5 text

接続確認 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •OpenOCD + FT2232Dで動作確認 •デバッガとしては普通に使える AE-FT2232 (秋月のFT2232基板)

Slide 6

Slide 6 text

接続確認 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •欠点: • FT2232D基板とブレッドボードが邪魔 →OpenOCDで使える もっとコンパクトな デバッグ・アダプタが欲しい! AE-FT2232 (秋月のFT2232基板)

Slide 7

Slide 7 text

OpenOCDで使えるデバッグ・アダプタの例 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る • FT2232系 • FTDIのFT232H, FT2232などMPSSEモードのJTAG機能を使う • 抵抗を一本追加するとSWDに対応可能 • ST-Link v2 • STMicroelectronicsのデバッグ・アダプタ • クローンが結構出回っている • CMSIS-DAP • Arm公式のデバッグ・アダプタの仕様・実装

Slide 8

Slide 8 text

Seeeduino XIAO 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •秋月でSeeeduino XIAOを買っていたのを思い出した •Seeeduino XIAO • ATSAMD21G18 • Cortex-M0+, USB2.0 FS • 安い (600円弱) • ちいさい • USB Type-Cコネクタ •これをCMSIS-DAP準拠のデバッグ・アダプタにできるとよさげ USB Type-C Seeeduino XIAO

Slide 9

Slide 9 text

CMSIS-DAP 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る • Cortex系プロセッサ内部の デバッグ機能にアクセスするための仕様とファームウェア実装 • ホストとUSB経由で通信 • ターゲットとJTAGもしくはSWDで通信 • Armが策定しており、仕様とソースコードが公開されている • 現在はGitHub上で管理されている • https://arm-software.github.io/CMSIS_5/DAP/html/index.html ホスト PC USBついてるArm MCU デバッグしたい Arm CPU CMSIS-DAP USB JTAG SWD

Slide 10

Slide 10 text

CMSIS-DAPの実装例(1/2) 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る • CMSIS-DAP • Arm公式実装 (CMSIS-DAPは仕様だけでなく実装も含む) • https://github.com/ARM- software/CMSIS_5/tree/develop/CMSIS/DAP/Firmware • DAPLink • Mbedで使われるシリアル・モニタ、 デバッグ・アダプタ、プログラマを統合したファームウェア • CMSIS-DAPの実装は前述の公式実装から派生した物が使われている模様 • https://github.com/ARMmbed/DAPLink

Slide 11

Slide 11 text

CMSIS-DAPの実装例(2/2) 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •free-dap • 個人開発のCMSIS-DAPオープンソース実装 • ATSAMD系デバイスでの動作を標準サポート (というか、 ATSAMD系以外は対応してない) • https://github.com/ataradov/free-dap •Seeeduino XIAOはATSAMD21なのでfree-dapがよさげ

Slide 12

Slide 12 text

free-dapのビルド 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •元々ATSAMD21の定義がある •これをベースにSeeeduino XIAO用定義を作成 • ピンのマッピングとか • ペリフェラルは使わないので左側のピンにマップ • 左側は+3.3VやGNDの電源ピンもあるので +3.3V GND RST SWDIO SWDCLK +5V NC HAL_GPIO_PIN(SWCLK_TCK, A, 7) HAL_GPIO_PIN(SWDIO_TMS, A, 5) HAL_GPIO_PIN(TDI, A, 2) HAL_GPIO_PIN(TDO, A, 9) HAL_GPIO_PIN(nTRST, B, 8) HAL_GPIO_PIN(nRESET, A, 6) HAL_GPIO_PIN(LED, A, 17)

Slide 13

Slide 13 text

free-dapのビルドと書き込み •Seeeduino XIAO対応のコードをダウンロードしてビルド 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る $ git clone https://github.com/ciniml/free-dap.git $ cd free-dap/platform/seeeduino_xiao/make $ make -j CC build/dap.o CC build/main.o CC build/udc.o CC build/usb.o CC build/usb_descriptors.o CC build/startup_samd21.o LD build/free_dap.elf OBJCOPY build/free_dap.hex OBJCOPY build/free_dap.bin size: text data bss dec hex filename 7616 0 628 8244 2034 build/free_dap.elf 7616 0 628 8244 2034 (TOTALS) $ bossac -e -w -v -b -o 0x2000 -R build/free_dap.bin Erase flash Done in 0.803 seconds Write 7616 bytes to flash (119 pages) [==============================] 100% (119/119 pages) Done in 0.046 seconds Verify 7616 bytes of flash [==============================] 100% (119/119 pages) Verify successful Done in 0.061 seconds Set boot flash true

Slide 14

Slide 14 text

OpenOCDのビルド 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •UbuntuのOpenOCDは古いので自分でビルド git clone git://git.code.sf.net/p/openocd/code openocd-code cd openocd-code ./bootstrap mkdir build; cd $_ ../configure --prefix=$HOME/openocd --enable-cmsis-dap make make install

Slide 15

Slide 15 text

Seeduino XIAOの接続確認 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •試しに繋いでみる • 右側のopenocd.tclを保存しておく •gdb接続 ~/openocd/bin/openocd -f interface/cmsis-dap.cfg -f openocd.tcl set CHIPNAME samd51p19a source [find target/atsame5x.cfg] adapter speed 3200 adapter_nsrst_delay 200 gdb_flash_program enable gdb_breakpoint_override hard init targets openocd.tcl gdb-multiarch hogehoge.elf (以降gdb上で) target remote localhost:3333 monitor reset halt load monitor reset halt break main cont 適当にデバッグしたいプログラムを指定 OpenOCDに接続 ターゲットをリセットして停止 プログラムを書き込み ターゲットをリセットして停止 main()にブレークポイント設定 実行再開

Slide 16

Slide 16 text

Seeduino XIAOの接続確認 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る $ gdb-multiarch SimpleLoader.elf GNU gdb (Ubuntu 9.1-0ubuntu1) 9.1 (略) Reading symbols from SimpleLoader.elf... (gdb) target remote localhost:3333 Remote debugging using localhost:3333 main () at ../firmware/src/main.c:132 132 USER_LED_OutputEnable(); (gdb) monitor reset halt target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x0000056c msp: 0x2000d6a0 (gdb) load Loading section .text, size 0x1ad78 lma 0x4000 Loading section .ARM.exidx, size 0x4f0 lma 0x1ed78 Loading section .relocate, size 0x880 lma 0x1f268 Start address 0x00004000, load size 113384 Transfer rate: 13 KB/sec, 12598 bytes/write. (gdb) monitor reset halt target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x0000056c msp: 0x2000d6a0 (gdb) break main Breakpoint 1 at 0xaab8: file ../firmware/src/main.c, line 132. (gdb) cont Continuing. Note: automatically using hardware breakpoints for read-only addresses. Breakpoint 1, main () at ../firmware/src/main.c:132 132 USER_LED_OutputEnable(); (gdb) info reg r0 0x2000d6d0 536925904 r1 0x193c 6460 r2 0x2000e0b0 536928432 r3 0x14db9 85433 r4 0xaad5 43733 r5 0x0 0 r6 0x200008a0 536873120 r7 0x2000d680 536925824 r8 0x1 1 r9 0xa5a5a5a5 -1515870811 r10 0xa5a5a5a5 -1515870811 r11 0xa5a5a5a5 -1515870811 r12 0x20000478 536872056 sp 0x200296c0 0x200296c0 lr 0xab15 43797 pc 0xaab8 0xaab8 (略)

Slide 17

Slide 17 text

問題点 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •デバッガの動作がとても遅い! • ステップ実行に1秒以上かかる…

Slide 18

Slide 18 text

2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る

Slide 19

Slide 19 text

遅い原因 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •CMSIS-DAPのホストとデバッグ・アダプタ間の通信は USB HIDクラス上のプロトコル • インタラプト転送 = 1[ms]に1回のみ転送可能 • USB2.0 FSは64[bytes/パケット]まで • 最大64[kB/s]しかでない • USB FSは理論帯域1.5[MB/s] • 追加ドライバなしで使えて便利ではある

Slide 20

Slide 20 text

対策 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •USB2.0 HSを使う • USB2.0 HSは1024[bytes]まで1パケットで転送可能 • インタラプト転送でも1.024[MB/s]は出せる • ATSAMD21はUSB2.0 FSのみなのでHSは使えない •CMSIS-DAP v2を使う

Slide 21

Slide 21 text

CMSIS-DAP v2 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •従来のCMSIS-DAPと異なりHIDではなくベンダ固有クラス • バルク転送が使える • 帯域が空いている限り好きなだけ転送できる • ただしWindowsではドライバ(WinUSB)が必要 • Zadigなどでインストールする必要がある •USB上でやり取りするコマンド形式は従来から変わらない • USB通信部分の変更だけで実装可能 (ちゃんと作っていれば)

Slide 22

Slide 22 text

free-dapのCMSIS-DAP v2対応 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •free-dapは従来のCMSIS-DAPのみ対応なので要変更 •基本的にUSBのディスクリプタの修正のみでOK • HIDからVendor Specific Class(0xff,0x00,0x00)に変更 • エンドポイントをインタラプトからバルクに変更 • HIDのレポート・ディスクリプタを削除 • 各ディスクリプタの説明用ストリング・ディスクリプタに CMSIS-DAPの文字を含める • これはOpenOCDの都合のような気もする

Slide 23

Slide 23 text

OpenOCDのCMSIS-DAP v2対応 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •OpenOCDのmasterはCMSIS-DAP v2に対応していない •2019年1月にCMSIS-DAP v2対応パッチ登録 • 2020年5月ごろにぼちぼちマージしない?というコメント • まだマージされていない • http://openocd.zylin.com/#/c/4831/ •仕方ないので手元でmasterにrebase

Slide 24

Slide 24 text

改造版OpenOCDのビルド 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •configure時のオプションにv2を追加してビルド ./bootstrap mkdir build; cd $_ ../configure --prefix=$HOME/openocd --enable-cmsis-dap --enable-cmsis-dap-v2 make make install

Slide 25

Slide 25 text

CMSIS-DAP v2の動作確認 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る $ ~/openocd_cmsis_v2/bin/openocd -f interface/cmsis-dap.cfg - f ./openocd.tcl Open On-Chip Debugger 0.10.0+dev-01294-g181b54de-dirty (2020-07-01- 22:04) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "swd". To override use 'transport select '. DEPRECATED! use 'adapter srst delay' not 'adapter_nsrst_delay' force hard breakpoints Info : Using CMSIS-DAPv2 interface with VID:PID=0x6666:0x6666, serial=123456 (gdb) load Loading section .text, size 0x1ad78 lma 0x4000 Loading section .ARM.exidx, size 0x4f0 lma 0x1ed78 Loading section .relocate, size 0x880 lma 0x1f268 Start address 0x00004000, load size 113384 Transfer rate: 40 KB/sec, 12598 bytes/write. (gdb) monitor reset halt target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x0000056c msp: 0x2000d6a0 (gdb) break main

Slide 26

Slide 26 text

CMSIS-DAP v2の動作確認 (vscode) 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る

Slide 27

Slide 27 text

2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る

Slide 28

Slide 28 text

CMSIS-DAP v2の動作確認 (vscode) 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •ステップ実行に1秒かからなくなった。 • 快適!

Slide 29

Slide 29 text

余談:最新版Wio Terminal (v1.2) 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •基板左上にFPCコネクタが増えている • FPC 10pin 0.5mmピッチ •ATSAMD51のSWD接続あり •aitendoのFPC+変換基板 で接続確認できた Wio Terminal schematics v1.2より

Slide 30

Slide 30 text

まとめ •Seeeduino XIAOはCMSIS-DAP v2対応の デバッグ・アダプタにすることができる •CMSIS-DAP v2はCMSIS-DAP v1.xと比べて ステップ実行などを高速に実行できて快適 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る

Slide 31

Slide 31 text

ソースコードなど •改造版free-dap (forkしたやつ) • https://github.com/ciniml/free-dap •CMSIS-DAP v2パッチ適用版OpenOCD • https://github.com/ciniml/openocd • はやく本家でマージされるといいな・・・ 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る

Slide 32

Slide 32 text

おしまい 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る