Raspberry Pi AI Cameraをさわってみた

こんにちは、あっきぃです。

先日発売されたRaapberry Pi AI Cameraのサンプルをミドクラ様からお借りできましたので、さわってみたレポートをお送りします。

製品のようす

カメラ本体。カメラセンサーはソニーのIMX500という、2020年頃に登場したセンサーを使用しています。

一見すると今までのカメラモジュールと同じように見えますが、AI Cameraは、搭載されているIMX500カメラセンサー自体がAI処理を実行して結果を返すため、映像と結果を受け取ることも、結果だけ受け取ることもできます。後者を活用すれば、通信帯域を節約しながら物体検出を行ったり、プライバシーに配慮しながらデータを軽量に保存することも可能になります1。ちなみに、右側のパーツはレンズ部分に付属する保護カバー?のようです。使うときは外して使用するようです。

カメラセンサーの下にチップが見えていますが、これはRaspberry Pi PicoでおなじみRP2040チップです。以下は製品画像の引用2ですが、センサーの下はこうなっているようです。

こちらは特筆することはないのですが、カメラセンサーの裏側も。

パッケージと付属物はこちら。白いドーナツ状のパーツは、Camera Module2にも付属していた。レンズのフォーカス調整用リングです。カメラケーブルはPi 5で登場した、今までより硬めのケーブルが、Pi 5とZero系向けのものと、それ以外の従来モデル向けのものの2種類付属しています。

導入してみよう

今回はドキュメントのチュートリアルをそのまま試すだけとしたため、手順は以下のページを参照ください。

https://www.raspberrypi.com/documentation/accessories/ai-camera.html

とはいえ、OSを最新にアップデートして(カーネル、libcamera、Picamera2などをIMX500のバージョンに上げる必要があります)、imx500-allパッケージを導入するだけで遊び始められるため、比較的かんたんです。

動かしてみる

実際に動かしてみましょう。まずはRaspberry Pi 5を使用して、いろいろなサンプルを動かしてみました。カメラは、カメラケーブルにマスキングテープで針金(ケーブルを束ねるのに使われているネジネジのやつ)を貼り付けて、フレキシブルなケーブルにするハックと、スマホスタンドの組み合わせで固定しました。

まずはシンプルな物体検出のサンプル。最近はあまり見かけないような気もする、Raspberry Pi公式マスコットのクマ「Babbage Bear」が、きちんと「teddy bear」として認識されていますね。皆さんご存知でしょうか?Pimoroniで現在もふつうに購入できるので、気になる方はこちらです。

少し見づらいですが、ディスプレイの左下でhtopコマンドを実行しています。Raspberry Pi自体に負荷がそれほどかかっていない=カメラがAI処理をやっています。

こちらはスクリーンショットでちゃんと撮影してかつ、Picamera2バージョンの物体検出サンプルです。AI Cameraももちろん、Picamera2で開発できるのが利点の一つです。こちらのほうがhtopの結果が見やすいですね。ちなみに、左上のデモ実行の出力を見ると、Network Firmware Uploadという出力が見えますが、コマンドを実行すると、カメラにデータを転送する処理があり、起動までに30秒〜1分ほど時間がかかります。

こちらは人間のモーション検出デモ。これも先のデモも含め、AI Kitで同様のデモが実行できますが、ほぼ同じことがカメラだけでできています。おかしなポーズをとってもちゃんと認識していますね。

これはセグメンテーションのデモ。検出したものの物体に色をつけてくれるものですが、暗めの緑で色付けをされて、呪いにかかった人間のエフェクトっぽいなと思ったので、そんなポーズにしてみました。夜に試していたときの写真なので、実際に疲れているのですが。

他のモデルでも動かしてみる

AI Cameraのリリースの記事では、AI CameraはPi Zeroをふくむすべてのモデルで動作しますと言及されています。

The AI Camera can be connected to all Raspberry Pi models, including Raspberry Pi Zero, using our regular camera ribbon cables.

実際に、先日のMaker Faire Tokyo 2024のKSYブースでは、Raspberry Pi Ltdから来ていたMattさんがAI Cameraのデモを持参して展示していて、ここではPi Zero(おそらく2W)が使用されていました。

というわけでわたしもPi Zero 2Wで環境を再現してみました。ディスプレイはPimoroniのHyperPixel4を使用しました。

裏面。こちらのカメラの固定には簡易的に、厚紙とマスキングテープを使用しています。

MicroSDカードのセットアップは、あらかじめRaspberry Pi 5で済ませて、動作も確認してからPi Zero 2Wに移しました。が、どうやらこれではPiZero 2W上のRaspberry Pi OSがカメラを自動認識できないようです。ドキュメントのチュートリアルでも、「少し手を加えれば」という一文があるので、どうやら手を加える必要がありそうです。

With minor changes, you can follow these instructions on other Raspberry Pi models with a camera connector, including the Raspberry Pi Zero 2 W and Raspberry Pi 3 Model B+.

ドキュメントには記載がありませんが、はカメラを手動でも認識できるようにすれば良いので、つまり、/boot/firmware/config.txtに設定を追記すればOKです。

# この設定をコメントアウトする
# Automatically load overlays for detected cameras
#camera_auto_detect=1 

# ファイル末尾の[all]以下に追記
[all]
dtoverlay=imx500

# これはHyperPixel4用の設定
dtoverlay=vc4-kms-dpi-hyperpixel4

設定後にOSを再起動をしたら無事に認識してくれたので、試してみた結果がこちら。

動画で!

もちろん、PiZero 2WはRAMが512MBしかないため、デスクトップが起動するまで待たされたりしますが、起動してしまえば、動画のように物体検出の結果がすぐにでてきます。

AI KitとAI Cameraどちらにしよう?

公式のリリースでも言及されていますが、AI Kitはパフォーマンスの代わりにPi 5限定である一方、AI Cameraはカメラと一体になっているため用意するものがこれ一個で済んで、Pi 5以外のほぼすべてのRaspberry Piで使えます。

個人的には、手軽な入門としては、後者のほうが手軽そうな印象をもちました。

入手するには?

AI Cameraは各リセーラーを通じて販売される見込みです。観測している範囲では、KSYさんと、イギリスのPimoroniは未入荷です。スイッチサイエンスだけ昨晩に販売がありましたが、初回入荷分は少量だったようで、一瞬で完売してしまったようです(わたしはなんとか間に合って購入できました)。1万3千円ほどするのに、皆さん判断が早い……!!

そう言った状況のため、例によって当面入手が難しいと予想されます。AI Cameraが欲しい方は、リセーラーさんの入荷通知機能や、Pre-Orderを活用してみてください。

  1. https://www.sony.com/ja/SonyInfo/News/Press/202005/20-037/ ↩︎
  2. https://www.raspberrypi.com/products/ai-camera/ ↩︎

Raspberry Pi AI Camera発表

Raspberry Pi Ltd.は、9月30日にRaspberry Pi AI Cameraを発表しました。価格は70ドルです。

https://www.raspberrypi.com/news/raspberry-pi-ai-camera-on-sale-now

AI Cameraは、AI アクセラレータを統合したソニーのIMX500センサーを使用したカメラモジュールす。また、カメラモジュールのニューラルネットワークとファームウェアの管理にはRP2040が使用されています。

6月に発売されたAi Kitは、性能が高い代わりにRaspberry Pi 5専用でしたが、AI Cameraはコンパクトで、Raspberry Pi Zeroを含む全てのRaspberry Piに接続が可能です。

ソニーが提供するAIツールを使用すると、TensorFlowやPyTorchなどのフレームワークを使用したニューラルネットワークモデルを変換して、AI カメラで効率的に実行できるとしています。また、AI CameraはRaspberry Pi libcameraと統合されており、Picamera2やrpicam-appsなどのアプリケーションを通じて使用が可能です。

センサーの詳細やドキュメントは、AITRIOSの開発者サイトに掲載されています。

https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera

なお、ソニーからもニュースリリースが公開されています。合わせて参照ください。

https://www.sony-semicon.com/ja/news/2024/2024093001.html

AI Cameraは今後リセラーを通じて販売される見込みです。

https://raspberry-pi.ksyic.com/main/index/pdp.id/1098/pdp.open/1098

Raspberry Pi Pico 2およびRP2350がリリース

Raspberry Pi Ltdは2024年8月8日に、Raspberry Pi Pico 2 およびRP2350を発表しました。

https://www.raspberrypi.com/news/raspberry-pi-pico-2-our-new-5-microcontroller-board-on-sale-now

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に強化されています。

また、RP2350は60-QFNのRP2350Aと、80-QFNのRP2350Bの2種類が展開されており、RP2350Bの場合はGPIOが48個提供されます。さらに、2MBのQSPI フラッシュを内蔵したRP2354A / RP2354Bも展開されます。なお、Pico 2にはRP2350Aが搭載されます。

RP2350は、2024年末頃までに量産の開始が予定されています。今後RP2040の用にRP2350が入手可能になることで、サードパーティベンダーからRP2350を搭載した様々なボードが販売されたり、開発者は自分のボードに組み込んだりすることが可能です。

Raspberry Pi Pico 2は今後各認定リセーラーを通じて販売が開始されます。

KSY: https://raspberry-pi.ksyic.com/main/index/pdp.id/1094/pdp.open/1094
スイッチサイエンス: https://www.switch-science.com/products/9809

Raspberry Pi 4のリビジョンと消費電力の話

昨日はちょっと久々のRaspberry Pi JAM Tokyoでした。天気が悪くてどうなるかと思いましたが、ピークが前にずれたおかげで、移動してる間に雨がやんだのでなんとかなりました。よかったーー。

ミドクラさんのスペースの入口にJAMのロゴが入りました。すごい……!

参加人数は天気などの都合で参加できなくなってしまった人もいたぶん減ってしまいましたが、たこ焼きパーティをしながらラズパイの話とかとかラズパイじゃない話とかで盛り上がりました。

Raspberry Pi 4のリビジョンの話

昨日の発表はPi 5とかOSの近況をやったのですが、当日追加でつっこんで話したPi 4の話題をブログにもまとめなおしてみます。Pi 4は最初の発表から3回ほどリビジョンが変わっていて、現在はRev.1.5です。ざっくり以下の内訳です。Rev.1.3がないのは不明ですが、ボツにでもなったのでしょう……?。

  • Rev.1.1(2019/6〜): 最初。PD電源が使えない問題があった初期リビジョン。日本未発売なので大多数の日本人ユーザーには関係ない
  • Rev.1.2(2019/10〜12): PD電源が使えるように修正されたリビジョン。ここから日本で発売されるようになった。 
  • Rev.1.4(2020/5, 2021/1〜): 8GB RAM登場以降のデザイン。Dialogのsub-PMICが搭載され、TVSダイオードが移動した。2021/1〜はおそらく他のRAMのモデル?
  • Rev.1.5(2021/10〜): 現行。PMIXがMxLからDialog DA9090に変更された

カッコ内はおもに変更履歴のTransition Dateから引用(1.4の2020/5は8GB RAM登場時)ですが、現行リビジョンは2021年10月から移行ということになっていて、実はもう2年半くらい経過しているので、多分これを持っている人も多そうな気がしますが、半導体不足真っ只中だったので、そうでない可能性もあるような気がしています。どうでしょう。

変更履歴はRaspberry Pi Production Information Portal(PIP)で誰でも確認できます。

https://pip.raspberrypi.com/categories/560-pcn

また、手持ちのPi 4のリビジョンはcat /proc/cpuinfoコマンドで確認できます。

最新リビジョンが欲しい

わたしの場合、出たらすぐに買ってしまうので、最新リビジョンは持っていないことに気づきました。パーツが変わっても動作に変更はないはずですが、もしかして電力の効率が変わって省エネになってたりしたら嬉しいよななどと思ってしまい、しばらく悶々とした結局、我慢できずに買ってしまいました。

ヤフオクで1週間くらい出物を探し回り、マークしてたやつが値下げ再出品されたタイミングで即決落札して、ヤフオクのクーポンとPayPayのポイントを駆使しました。おかげで散財が軽減されました(セルフ暗示)。届いたのがこちら。赤枠部分がPMIC、MxLからDialogになっているのがわかります。

ところで、ヤフオクで物色するために見分け方を研究しまくっていたせいで、先日話題になっていた、ロシアで使われていたというPi 4も、瞬時に「こいつはRev.1.4以降…」と見分けられてしまいました。ちなみに、TVSダイオードがHDMI0の左にいなければRev.1.4以降です。

https://togetter.com/li/2385032

半導体不足でメイカー向けに流れなくてヒーヒー言ってるそばでロシアにRPiが戦争用途に流れてしまっていたのは遺憾(製品の規約でも元から禁止されている)です。ロシアには、やはりというか中国から流されているのがイギリス有料ニュース記事で指摘されていたようです。500万ドル分らしいので、4GB RAM(55ドル)と仮定して利益云々無視した単純な割り算をすれば約9万台となり、なかなかひどいお話です(なお、ウクライナ側も使っていたりするようで……?)。

https://forums.raspberrypi.com/viewtopic.php?t=368865

消費電力を見る

話を戻し「もしかして電力の効率が変わって省エネになってたりしたら嬉しいよな」を確かめるべく電力を測ってみます。USB電流計測器のUT70にPi 5の公式電源を入力して、OUTからPi 4に接続して、MicroSDからOSを起動します。起動が終わって落ち着いた頃の電流をチェックしていきます。

なお、OS側では、電源LEDオフと、無線の無効化の設定を投入しています。設定してない状態で比較すればよかったですね……。設定方法は私のブログのほうで触れています。

また、EEPROMのバージョンも全部そろえてあります。

Rev.1.2

これだけRAMが4GBですが(このリビジョンに8GBモデルはない)それは見なかったことにしつつ、結果は358mAでした。

Rev.1.4

8GBがでてすぐに買ったやつです。結果は353mA。誤差かもしれないけど、Rev.1.2よりも5mAくらい低いかも?

Rev.1.5

これも8GB RAMです。なんと285mA!?50〜60mAも差があるのですが、なんですかこれは?

ついでにRev.1.1

昔Pimoroniで2GB RAMを買ってみたら、まだ在庫のRev.1.1があったらしく来ちゃったやつもいちおう試してみます。技適はないことになっているので、ここでは念のため暗箱に投入します。特例出すよりこっちのが出すだけで早いので……。なお、今回からミドクラ様からユーザー会に貸与いただいた暗箱を使用しています。ありがとうございます。そしていきなり個人的な興味のために使ってしまいすみませんでした。

雑に箱の中にiPhoneをつっこんで、動画をとることでUT70の値を読むことにしました。

結果は390mA。1.5とは100mAも差がついてしまいました。さすがにこの結果をもってPi 4同士で買い替えることはないと思うのですが、Rev.1.1ユーザーはちょっと心揺れてしまいそうな結果です。

Rev.1.5ならSoCの温度も低い気がする

この消費電力ならと、アイドル時のRev.1.5のSoCに指を乗せると、やはりというか全然ぬるいことに気が付きました。初期のアツアツはどこへやら。SoCに指を載せては「熱くて触れない!」などと言われがち(どうしてそんなことを?)ですが、そんな一部な方にもぜひ触ってみて欲しいです。ちなみに45.7℃でした。やっぱりぬるめ。

$ vcgencmd measure_temp
temp=45.7'C

まとめ

1万円ちょっとでただ知的好奇心を満たしました。なんとなく想像だけで買ってみたものの、想定外に消費電力が減っていたのでビビりました。しかし散財である。

リビジョンアイドル時の電流(mA。無線と電源LEDを無効化した状態)
1.1390
1.2358
1.4353
1.5285
表でまとめ。

DA9090に変更後にそのような支店で見ている人がいるか探そうとしたら、フォーラムで「DA9090が壊れやすく、入手性がMxLよりも悪いため修理もできない」と騒いでいる、おそらく少数の人を見かけました。入手性はさておき、本当に壊れやすいならとっくに対策が入っているはずですから、無視して良いと思われます。

買ったPi 4は、デスクの上で動いているPi 2Bを置き換えるのに使おうと考えているところです。上に張ったカリカリチューニングのブログに書きましたが、Pi 2Bは現状340mAで動いているので、50〜60mAの節電をしながらRAMを8倍にできそうです。

Raspberry Pi AI Kit発売

Raspberry Pi Ltdは、6月4日にRaspberry Pi AI Kitを発表し、認定リセーラーを通じて販売を開始しました。価格は70ドルです。

https://www.raspberrypi.com/news/raspberry-pi-ai-kit-available-now-at-70/

Raspberry Pi AI Kitは、Hailo 社と共同開発したAIアクセラレータ モジュールに、先日販売開始したRaspberry Pi M.2 HAT+をセットにしたキットです。モジュールにはHailo-8L コプロセッサを搭載しており、Raspberry Pi 5と組み合わせることで、ニューラル ネットワーク、人工知能、機械学習を低遅延かつ低消費電力で試すことが可能としています。

Halioによってモデルが公開されているため、このモデルを使用してすぐに試せるほか、Raspberry Piのカメラで簡単に試せるようにするためにテンプレートが用意されており、今後はPicamera2フレームワークへの統合も予定されています。

Raspberry Pi AI Kitは、認定リセーラーを通じて販売されます。日本の各リセーラーでも販売が予定されているようです。

KSYさんのアナウンス
スイッチサイエンスさんのアナウンス

イギリスのPimoroniでは、予約受付中です(参考までに、日本宛の場合はRoyalMail使用で62.25GBPでした)。

また、Jeff Geerling氏によるサンプルのレビュー動画も公開されていましたので、あわせて紹介します。

Raspberry Pi Connectがでた(どこからでもラズパイにリモートデスクトップ!)

Raspberry Pi Ltdから、Raspberry Pi Connectなるサービスがベータ扱いで公開されました。

https://www.raspberrypi.com/news/raspberry-pi-connect/

あらかじめRaspberry Pi IDを取得して、Raspberry Pi OSのデスクトップ環境にRaspberry Pi Connectをセットアップしておけば、Raspberry Pi IDを使用して世界中のどこからでもWebブラウザ経由でリモートデスクトップ接続ができるというサービスです。

インストールや設定手順はドキュメントが公開されているので、興味がある人はここを参照してセットアップしてみてください。

https://www.raspberrypi.com/documentation/services/connect.html

ただし、ベータ版のため、予期せぬ不具合等が起こる場合もあるかもしれないとのこと。なにかあった場合はフォーラムで報告してみると良いでしょう。

手元で動かしてみた様子はこちら。LAN内で試しているのでさすがに動画再生もスムーズです(音声は非対応です)。

再生しているのはJeff Geerling氏のRaspberry Pi Connectレビュー動画。多分この私の記事より情報があるのでこちらをおすすめします。

自分でVPNを用意せずに手軽にリモート接続ができるので、自宅に1台セットアップしておいて、自宅LAN内の踏み台環境なんかに使うと便利そうです。最新のRaspberry Pi OSなら構築できるので、モデルはあまり問いませんが、Pi 5+NVMe SSDな環境ならアイドル4W、上のように動画を再生してActive Coolerがゆるゆると回っている状態で5〜8Wと、PCと比較すればまあ省電力なデスクトップ環境にできるので、どこでも自宅Pi 5環境に接続できるというのはアリっぽい気がします。

当然、Raspberry Piのインターネット環境はRaspberry Piの設置場所によるので、海外旅行中に日本でしか見られないサイトを見る、あるいはその逆、なんて使い方もできそうですね。

ちょっと可能性を感じるおもしろげなこのサービス、一度試してみると良いと思います。

(追記) 家から出るとやはり遅い

会社から自宅のRaspberry PiにConnectしてみたところ、画面が表示されないか、表示されてもほぼ操作できない状態になりました。Jeffの動画でも触れられていましたが、これはロンドンの中継サーバーを中継してしまっているので遅くなってしまうようです(鍵アイコンにカーソルを合わせると表示されます)。中継サーバーが増えれば改善されるかもしれませんが、そうすると無料でサービス維持ができるかどうか……?という話題にもなってきそう。

会社から自宅にVPN接続した状態でConnectすると、こちらは中継サーバーを使用しないpeer-to-peer接続になり、快適に使用できました。これはちょっとおもしろい挙動のような気がしました。

あと、Jeffの動画を全部ちゃんと見ていなくて気づいてなかったのですが、動画中に私のYoutubeアイコンが映り込んでいました😆(メンバーシップのユーザー一覧でした)

Raspberry Pi Pico Version of IchigoJam

Programming Club Networkさまから、IchigoJamのRaspberry Pi Picoバージョンについて、寄稿いただきました。

IchigoJAM P: https://pcn.club/sp/ijp/


軽快な Raspberry Pi Pico 、これで IchigoJam BASIC が動いたら楽しそう!

そこで IchigoJam BASIC を RP2040 に移植!

ブレッドボードで回路を組んで、

Picoにファームウェアを焼いて、

合体!モニタはDVI、キーボードはUSB。

10 LED1:WAIT30:LED0:WAIT30
30 GOTO10

もちろん、Lチカできるし、

かわくだりゲームだって

BASIC で動いちゃう。

ロボットに搭載すれば、

BASICで自在に動かせるよ!

ファームウェアは今夏リリース予定、お楽しみに!

RP1チップをJTAGでデバッグしてみよう

はじめに

こんにちは、tnishinagaです。
今回はRP1のJTAGデバッグ方法を見つけたので、ご紹介します。

注意

本記事ではRP1が想定していない操作を行うため、本内容の実施によりRP1含めRaspberry Pi 5が故障する可能性があります。
十分ご注意の上、実施される際は自己責任のもとでお願いします。

要約

overview in english

RP1とリバースエンジニアリング

RP1はRaspberry Pi 5に搭載されているサウスブリッジ的なチップです。
Pi 5のIOのほぼすべてをこのRP1が担っているため、RP1を自由に制御できればPi5を自由に制御できると言えるのではと勝手に思っています。

このRP1のペリフェラルマニュアルは公開されていますが、中で動いているコードや一部仕様については非公開となっています。
そのため自由に扱うにはリバースエンジニアリングが必要であり、私を含め国内外で数人が取り組んでいるようです。

リバースエンジニアリングでは、人間がコンピューターの状態をなんとかして知る手段の確保が重要です。
その中でもとくにJTAGデバッガーが利用可能になると、プロセッサの制御を自由に行えて大変嬉しいです。
どこかに使えるJTAG端子は生えていないでしょうか?

RP1のJTAGを探す旅

RP1のペリフェラルマニュアルを読んでみると、6ページのFigure2にARM DEBUGと書かれた部分があり、少なくともプロセッサコアからJTAG端子が出ているとわかります。

画像はRP1のペリフェラルマニュアル, pp.6, Figure2より引用

また、特殊電子回路株式会社のなひたふさんの解析結果より、Pi 5のUSB端子の下にあるフレキシブルケーブル用のパターンからRP1のJTAG端子が出ていることが確認されています。

実際に自分も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が見えていると考えられます。

※Arm Debug Interfaceの仕様やデバッグの詳細については手前味噌ですがこちらの資料をご覧ください。

隠しコマンド、発見

TAPID 0x20001927へのDAP接続試行を何度か試していたところ、たまに違うTAPIDが見つかる事がありました。

# 当時のログを再現
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Info : JTAG tap: auto1.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477"
Warn : AUTO auto1.tap - use "jtag newtap auto1 tap -irlen 4 -expected-id 0x4ba00477"

最初はTAPのStateがおかしくなったのかなと思っていたのですが、よく見るとTAP IDのManufacturer ID Code部がArm Ltdとなっています。
もしやと思って出てきたTAPに対しDAPの接続を試したところ、Cortex-M3のDebug Unitが見えました。

そしてさらに調査を行ったところ、以下の操作を行うことでRP1のCortex-M3のTAPが見えるようになることを見つけました。

  • IRに0x1dをセットする
  • DRに0を128bit送る

どうやら隠しコマンドを見つけてしまったようです。
もしかすると他にも似たような隠しコマンドがあるかもしれません。

RP1にJTAG接続する方法

ここでやり方をまとめましょう。

ハードウェアの準備

Raspberry Pi 5のUSB下にあるフレキケーブル端子のパターン、またはテストポイントからJTAGに使う以下の線を引き出してください。
(端子とテストポイントの対応はなひたふさんのブログ記事を参考)

  • TDI : TP53
  • TDO : TP54
  • TCK : TP55
  • TMS : TP56
  • GND : GPIO端子等
  • 3.3V: GPIO端子等

引き出したらJTAGデバッガーと接続します。
私の使用したARM-USB-TINY-Hというデバッガーと接続するための回路図を共有しますので、ARM JTAG 20のピン配置を確認しつつ接続を行ってください。

ARM JTAG 20のピン配置はなひたふさんの解説がわかりやすくてオススメです。

私はつなぎ間違えが怖いので基板を作りました。

隠しコマンドの発行

JTAGデバッガーをつなぎ、OpenOCDを入れたマシンに以下のスクリプトを保存し、実行します。
これで次回のOpenOCD実行時からCortex-M3のTAPが見えるようになります。

# SPDX-License-Identifier: GPL-2.0-or-later
# Toshifumi Nishinaga<tnishinaga.dev@gmail.com>

# rp1_init.cfg
transport select jtag
adapter speed 1

jtag newtap cpu0 cpu -expected-id 0x20001927 -irlen 5

init

pathmove IRSHIFT
irscan cpu0.cpu 0x1d 

pathmove DRSHIFT
drscan cpu0.cpu 8 0
openocd -f interface/ftdi/olimex-arm-usb-tiny-h.cfg -f rp1_init.cfg

Cortex-M3コアへの接続

先ほどと同様に、以下のファイルを作ってからopenocdを実行してください。

# rp1.cfg
# This file is based on target/bcm2711.cfg
# SPDX-License-Identifier: GPL-2.0-or-later
# Toshifumi Nishinaga<tnishinaga.dev@gmail.com>

transport select jtag
adapter speed 100

jtag newtap cpu0 cpu -expected-id 0x4ba00477 -irlen 4
jtag newtap cpu1 cpu -expected-id 0x4ba00477 -irlen 4

dap create cpu0.dap -chain-position cpu0.cpu
dap create cpu1.dap -chain-position cpu1.cpu

# cpu0
target create cpu0.ap mem_ap -dap cpu0.dap -ap-num 0
target create cpu0 cortex_m -dap cpu0.dap -ap-num 0 -dbgbase 0xe000e000
# cpu1
target create cpu1.ap mem_ap -dap cpu1.dap -ap-num 0
target create cpu1 cortex_m -dap cpu1.dap -ap-num 0 -dbgbase 0xe000e000
openocd -f interface/ftdi/olimex-arm-usb-tiny-h.cfg -f rp1.cfg

以下のようなログが出たら成功です。

~/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

あとはgdbでTCP 3333や3334番につなぐとRP1を自由に操作できます。

(gdb) tar remote :3334

(gdb) i r
r0             0x676e6f6c          1735290732
r1             0x77207265          1998615141
r2             0x696b726f          1768649327
r3             0x1                 1
r4             0x34                52
r5             0x100029b0          268446128
r6             0x34                52
r7             0x20003990          536885648
r8             0x200057d0          536893392
r9             0x10002010          268443664
r10            0x200057d8          536893400
r11            0x200057d4          536893396
r12            0x0                 0
sp             0x10002980          0x10002980
lr             0x100002dd          268436189
pc             0x100003ae          0x100003ae
xPSR           0x81000000          -2130706432
msp            0x10002980          0x10002980
psp            0x0                 0x0
primask        0x0                 0
basepri        0x0                 0
faultmask      0x0                 0
control        0x0                 0

試しにRP1のcore1に接続してレジスタを眺めたところ、PCがProc Local ISRAMの領域を指している様子が伺えました。

以上です。
Happy Hacking!

Raspberry Pi 5をハードウェアデバッグしてみよう

はじめに

はじめまして。 tnishinagaです。
この度ご縁があって、こちらのブログに寄稿させていただく事になりました。
よろしくお願いいたします。

要約

  • Raspberry Pi 5のハードウェアデバッグはJTAGからSWDを使う方法に変わりました
  • Raspberry Pi Debug ProbeとOpenOCDを使えばハードウェアデバッグできます

BareMetalで遊びたい! Raspberry Pi 5

この度Raspberry Pi 5が日本で発表されました。
ここで私を含めシステムプログラマが気になるのは「Raspberry Pi 5で自作OS開発などのベアメタル開発ができるのか」ではないでしょうか。

早速入手したRaspberry Pi5を用いてハードウェアデバッグ方法について調べてみたので、今回はその方法を共有します。

おことわり

とくに言及がない限り、本内容はすべて「オープンな情報」および「リバースエンジニアリングで得た情報」を用いて調査して書かれています。
Raspberry Pi財団等の公式見解ではないため、誤りがあったり、今後の仕様変更で記載した方法を利用できなくなることがあります。
あらかじめご了承ください。

ハードウェアデバッグの方法

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 5のデバッグには以下の製品を利用しました。

SWD接続できるデバッガーであれば何でもよいのですが、接続に使うJSTコネクタを用意するのがちょっとだけ大変なので上記Probeの利用をオススメします。

セットアップ

デバッグまでの事前準備として、以下を行います。

  • config.txt の修正
  • Raspberry PiとDebug Probeの接続
  • OpenOCDのインストールと設定ファイルの作成

Raspberry Pi側の準備

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のインストール

Debug Probe制御のためOpenOCDを利用します。
以下を参考にご自身のPCにOpenOCDをインストールしてください。

https://openocd.org/pages/getting-openocd.html

本記事ではOpenOCD 0.12.0を用いて動作を確認しています。
もしうまく動かない場合は、こちらのバージョンを使って動作を確認してください。

設定ファイルの作成

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

GDBの接続

OpenOCDが正常に立ち上がった場合、OpenOCDがtelnetとGDBのサーバーを起動します。
このサーバーに各種デバッガーで接続すると、デバッグを行えます。

例としてGDBの接続方法をご紹介します。
aarch64向けのgdb(aarch64-elf-gdbgdb-multiarch)を起動した後、以下のコマンドを実行してOpenOCDのGDBサーバー接続してください。

target remote :3333

あとは自由にデバッグを行えます。
たとえば Ctrl + C を実行してコアをhaltしたあと、i r でレジスタの中身が見られます。

(gdb) i r
x0             0xffffb001f2910000  18446656121143885824
x1             0xffff8001ffac3a70  18446603344805640816
x2             0xffffd0000d4d84c0  18446691297374602432
x3             0xffffd0000d18c008  18446691297371144200
x4             0x1                 1
x5             0xffffd0000d4d1000  18446691297374572544
x6             0x1db3292f5         7972492021
x7             0x0                 0
x8             0xffffd0000d4c3c98  18446691297374518424
x9             0xffffd0000c0df61c  18446691297353659932
x10            0x1a90              6800
x11            0x1ef               495
x12            0x2                 2
x13            0x0                 0
x14            0x1                 1
x15            0x0                 0
x16            0xffffd0000cc076a0  18446691297365358240
x17            0x0                 0
x18            0x0                 0
x19            0x0                 0
x20            0xffffd0000d4d0998  18446691297374570904
x21            0xffffd0000d4d0878  18446691297374570616
x22            0xffffd0000d1b4e38  18446691297371311672
x23            0xffffd0000cf72108  18446691297368940808
x24            0x0                 0
x25            0x0                 0
x26            0xffffd0000d4d84c0  18446691297374602432
x27            0x0                 0
x28            0x12789fc           19368444
x29            0xffffd0000d4c3d40  18446691297374518592
x30            0xffffd0000cc03464  18446691297365341284
sp             0xffffd0000d4c3d40  0xffffd0000d4c3d40
pc             0xffffd0000cc0344c  0xffffd0000cc0344c

おわり

以上でハードウェアデバッグ方法のご紹介を終わります。
この内容がみなさまのお役に立てれば幸いです。

参考資料

Raspberry Pi 5の日本国内販売が開始

Raspberry Pi 5が日本での工事設計認証取得を完了し、本日より日本のRaspberry Pi Approved ResellerであるKSYおよびスイッチサイエンスの2社から販売が開始されました。

https://raspberry-pi.ksyic.com/main/index/pdp.id/1059,1015,1016/

両リセーラーとも、本体以外にもケースやカメラ・ディスプレイケーブルなどのアクセサリーが同時に販売開始されているため、必要に応じて購入すると良いでしょう。