Raspberry Pi Pico 2は、RP2350を搭載した新しいマイクロコントローラー開発ボードで、外形やピン配置はPicoと互換性がありますが、RP2350の搭載によって、よりパワフルなボードになりました。価格は5ドルです。
RP2350は、RP2040の機能を強化した新しいマイクロコントローラーチップです。CPUはPicoで採用されていたデュアルArm Cortex-M0+@133MHzから、浮動小数点およびDSPをサポートするDual Arm Cortex-M33@150MhzもしくはDual RISC-V Hazard3@150Mhzに強化され、ArmコアかRISC-Vコアかのどちらかを選んで使えるようになりました。SRAMは264KBから520KBとほぼ倍になり、QSPI Flashも2MBから4MBと倍に増量しています。PIO state machinesは8から12に強化されています。
Raspberry Pi AI Kitは、Hailo 社と共同開発したAIアクセラレータ モジュールに、先日販売開始したRaspberry Pi M.2 HAT+をセットにしたキットです。モジュールにはHailo-8L コプロセッサを搭載しており、Raspberry Pi 5と組み合わせることで、ニューラル ネットワーク、人工知能、機械学習を低遅延かつ低消費電力で試すことが可能としています。
実際に自分も0.5mmピッチのフレキシブルケーブルと端子を購入してJTAGデバッガーとつなげて様子を見てみたところ、Raspberry Pi Trading LtdのTAPが見つかりました。
~/p/t/r/pi5_jtag ❯❯❯ openocd -f interface/ftdi/olimex-arm-usb-tiny-h.cfg -c 'transport select jtag'
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
jtag
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Warn : An adapter speed is not selected in the init scripts. OpenOCD will try to run the adapter at the low speed (100 kHz)
Warn : To remove this warnings and achieve reasonable communication speed with the target, set "adapter speed" or "jtag_rclk" in the init scripts.
Warn : libusb_detach_kernel_driver() failed with LIBUSB_ERROR_ACCESS, trying to continue anyway
Info : clock speed 100 kHz
Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
Info : JTAG tap: auto0.tap tap/device found: 0x20001927 (mfg: 0x493 (Raspberry Pi Trading Ltd), part: 0x0001, ver: 0x2)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 5 -expected-id 0x20001927"
Warn : gdb services need one or more targets defined
これがRP1のCortex-M3コアのTAPと考えてDAPの接続等を試行しましたが、うまくいきませんでした。 Arm Debug Interfaceでは命令ビット長は4または8bitと決められていますが、OpenOCDがAutoProbeで見つけた命令ビット長は5bitなので、合っていません。 よって、Cortex-M3以外の何らかのTAPが見えていると考えられます。
~/p/t/r/pi5_jtag ❯❯❯ openocd -f interface/ftdi/olimex-arm-usb-tiny-h.cfg -f rp1.cfg
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
3758153728
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Warn : libusb_detach_kernel_driver() failed with LIBUSB_ERROR_ACCESS, trying to continue anyway
Info : clock speed 100 kHz
Info : JTAG tap: cpu0.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Info : JTAG tap: cpu1.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Info : [cpu0] Cortex-M3 r2p1 processor detected
Info : [cpu0] target has 6 breakpoints, 4 watchpoints
Info : [cpu1] Cortex-M3 r2p1 processor detected
Info : [cpu1] target has 6 breakpoints, 4 watchpoints
Info : gdb port disabled
Info : starting gdb server for cpu0 on 3333
Info : Listening on port 3333 for gdb connections
Info : gdb port disabled
Info : starting gdb server for cpu1 on 3334
Info : Listening on port 3334 for gdb connections
Raspberry Pi 5からのハードウェアデバッグは、Raspberry Pi 4までと比べて以下の点が変わっていました。
デバッグインターフェイスがJTAGからSWDに変わった
デバッグ用端子が出ている場所が40pin GPIOからUART/デバッグ用コネクタに変わった
UARTとハードウェアデバッグ機能は排他
Raspberry Pi Debug Probeがあれば簡単に接続可能
デバッグ・CTIのアドレスが変わった
OpenOCDの設定ファイルに変更が必要
デバッグの仕組みがSWDに変わったので、Raspberry Pi 4まで利用していたJTAGデバッガーは使えなくなりました。 一方、Raspberry Pi Debug Probeは一般的なデバッガーの中では比較的安価ですし、接続もケーブル1本でよくなりました。 そのため、全体的なデバッグの敷居は低くなった印象です。
Raspberry Pi ImagerなどでRaspberry Pi OS(64bit)をmicroSDカードに書き込んでください。 その後、第1パーティション(Raspberry Pi OS上からは /boot/firmware/ 以下)の config.txt の末尾に以下の行を追記してください。
enable_jtag_gpio=1
この設定を入れることでRaspberry Pi 5のUART端子の機能が起動時にSWDへ変わり、デバッガーをつなげるようになります。
接続
以下の画像を参考に、Raspberry Pi 5のUART端子(HDMI端子の間)とDebug ProbeのSWD端子(右側のDと書かれたほう)をコネクタで繋いでください。
OpenOCDを使ってデバッグを行う際は、デバッグターゲットの設定ファイルが必要です。 ROM infoから得られる情報を用いてRaspberry Pi 5に搭載されているBCM2712用の設定ファイルを作ったので、以下を適当な場所に保存してください。 (OpenOCDに含まれる target/bcm2711.cfg をベースに作成したので、このファイルのライセンスは元ファイルと同じくGPL2.0で提供します)
# bcm2712.cfg
# SPDX-License-Identifier: GPL-2.0-or-later
# OpenOCD target config file
# This file is based on target/bcm2711.cfg
# I have checked that it works with Open On-Chip Debugger 0.12.0
# using the Raspberry Pi Debug-Probe interface
transport select swd
adapter speed 1000
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME bcm2712
}
if { [info exists CHIPCORES] } {
set _cores $CHIPCORES
} else {
set _cores 4
}
if { [info exists USE_SMP] } {
set _USE_SMP $USE_SMP
} else {
set _USE_SMP 0
}
if { [info exists DAP_TAPID] } {
set _DAP_TAPID $DAP_TAPID
} else {
set _DAP_TAPID 0x2ba00477
}
# swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_DAP_TAPID
swd newdap $_CHIPNAME cpu -expected-id $_DAP_TAPID
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
# MEM-AP for direct access
target create $_CHIPNAME.ap mem_ap -dap $_CHIPNAME.dap -ap-num 0
# these addresses are obtained from the ROM table via 'dap info 0' command
set _DBGBASE {0x80010000 0x80110000 0x80210000 0x80310000}
set _CTIBASE {0x80020000 0x80120000 0x80220000 0x80320000}
set _smp_command "target smp"
for { set _core 0 } { $_core < $_cores } { incr _core } {
set _CTINAME $_CHIPNAME.cti$_core
set _TARGETNAME $_CHIPNAME.cpu$_core
cti create $_CTINAME -dap $_CHIPNAME.dap -ap-num 0 -baseaddr [lindex $_CTIBASE $_core]
target create $_TARGETNAME aarch64 -dap $_CHIPNAME.dap -ap-num 0 -dbgbase [lindex $_DBGBASE $_core] -cti $_CTINAME
set _smp_command "$_smp_command $_TARGETNAME"
}
if {$_USE_SMP} {
eval $_smp_command
}
# default target is cpu0
targets $_CHIPNAME.cpu0
以上で準備は完了です。
ハードウェアデバッグ
ここからは実際にOpenOCDを立ち上げてデバッグを行ってみます。
OpenOCDの起動
さきほど取得したファイル等を用いてOpenOCDを起動し、Raspberry Pi 5に接続します。 Raspberry Pi 5の電源を入れて数秒待った後(※)、以下のコマンドをPC上で実行してください。 (※: 最初しばらくはブートローダーのログ出力のために使われるので、SWD機能に変わるのを待つ必要があります)
openocd -f interface/cmsis-dap.cfg -f bcm2712.cfg
うまく接続ができれば、以下のようなログが出てきます。
~/p/t/r/pi5_jtag ❯❯❯ openocd -f interface/cmsis-dap.cfg -f bcm2712.cfg
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : Using CMSIS-DAPv2 interface with VID:PID=0x2e8a:0x000c, serial=SERIAL_NUMBER
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: Atomic commands supported
Info : CMSIS-DAP: Test domain timer supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x2ba01477
Info : bcm2712.cpu0: hardware has 6 breakpoints, 4 watchpoints
Info : bcm2712.cpu1: hardware has 6 breakpoints, 4 watchpoints
Info : bcm2712.cpu2: hardware has 6 breakpoints, 4 watchpoints
Info : bcm2712.cpu3: hardware has 6 breakpoints, 4 watchpoints
Info : gdb port disabled
Info : starting gdb server for bcm2712.cpu0 on 3333
Info : Listening on port 3333 for gdb connections
Info : starting gdb server for bcm2712.cpu1 on 3334
Info : Listening on port 3334 for gdb connections
Info : starting gdb server for bcm2712.cpu2 on 3335
Info : Listening on port 3335 for gdb connections
Info : starting gdb server for bcm2712.cpu3 on 3336
Info : Listening on port 3336 for gdb connections
日本ではRaspberry Pi 5の発売はまだですが、先週末には日本の技適に関する証書PDFがRaspberry Piのポータルにアップロードされ、進捗が見えてきています。残念ながらこのPDFをもって日本で買ったり使ったりして良いことにはなっておらず、製品(またはパッケージ等)にマークと番号が印字されたものが販売開始されて初めて適法に利用できるようになるため、もう少しの辛抱です。
今回遊ぶ内容的にはどれを使用しても同じですが、今回はEthernet HATの方を使用しました。こちらの場合別途Raspberry Pi Picoが必要になりますが、EVB-Picoよりも全長が少し短くなってコンパクトになります。また、EVB-Picoと比べるとボード上の通電LEDがPicoで覆い隠せるため、実運用に投入するとLEDが眩しくて邪魔という問題が緩和できます。まあ、EVB-PicoのEVBはEValuation Boardの略だと思うので、実運用に適しているのかは不明ですが……。
import time
import usb_hid
from adafruit_hid.mouse import Mouse
mouse = 0
while not mouse:
try:
mouse = Mouse(usb_hid.devices)
except:
pass
time.sleep(1)
for i in range(0, 8):
mouse.move(x=20, y=20)
time.sleep(0.25)