Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Seeeduino XIAOでCMSIS-DAPデバッガを作る

Seeeduino XIAOでCMSIS-DAPデバッガを作る

Seeeduino XIAOでCMSIS-DAP対応のデバッガを作ります。

Kenta IDA

July 05, 2020
Tweet

More Decks by Kenta IDA

Other Decks in Programming

Transcript

  1. 自己紹介 •井田 健太 (@ciniml) •仕事:組み込みソフト開発 •使用言語:C++, SystemVerilog, Go, Python •Arm歴:nRF51,

    STM32F405をちょっとだけ ここ2か月はATSAMD51 あとはZYNQとか •Mbed歴:nRF51+オンラインコンパイラをちょっと。 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る
  2. 最近やっていること: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… • いろいろ付いてて楽しい
  3. OpenOCDで使えるデバッグ・アダプタの例 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る • FT2232系 • FTDIのFT232H, FT2232などMPSSEモードのJTAG機能を使う •

    抵抗を一本追加するとSWDに対応可能 • ST-Link v2 • STMicroelectronicsのデバッグ・アダプタ • クローンが結構出回っている • CMSIS-DAP • Arm公式のデバッグ・アダプタの仕様・実装
  4. 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
  5. 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
  6. 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
  7. 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)
  8. 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
  9. 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()にブレークポイント設定 実行再開
  10. 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 <main> (略)
  11. 遅い原因 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] • 追加ドライバなしで使えて便利ではある
  12. 対策 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を使う
  13. CMSIS-DAP v2 2020/7/5 Seeeduino XIAOでCMSIS-DAPデバッガを作る •従来のCMSIS-DAPと異なりHIDではなくベンダ固有クラス • バルク転送が使える • 帯域が空いている限り好きなだけ転送できる

    • ただしWindowsではドライバ(WinUSB)が必要 • Zadigなどでインストールする必要がある •USB上でやり取りするコマンド形式は従来から変わらない • USB通信部分の変更だけで実装可能 (ちゃんと作っていれば)
  14. 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の都合のような気もする
  15. 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
  16. 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 <transport>'. 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
  17. 余談:最新版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より