Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Raspberry Pi 5のRP1でも自作プログラムをうごかしたい!
Search
hotaru
August 21, 2026
88
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Raspberry Pi 5のRP1でも自作プログラムをうごかしたい!
hotaru
August 21, 2026
More Decks by hotaru
See All by hotaru
リンカを作ってみた
hotaru_jp
0
240
Raspberry Pi 5の起動プロセスについて
hotaru_jp
1
1.3k
デバッグ支援ハイパーバイザとRaspberry pi 5でのAMP
hotaru_jp
0
120
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
490
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
490
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
480
The Invisible Side of Design
smashingmag
301
52k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
660
Skip the Path - Find Your Career Trail
mkilby
1
190
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
620
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Transcript
Raspberry Pi 5のRP1でも 自作プログラムを動かしたい! kernel/VM 東京 No19 ほたるいか 2026/8/22 1
自己紹介 ほたるいか 東京科学大学 学士3年 ロケットサークルCREATE、デジタル創作同好会 Trap所属 サイボウズ・ラボユース ‘25 SecHack365 '25
坂井ゼミ セキュリティキャンプ 2024 全国大会 ハイパーバイザ自作ゼミ ハードウェアとソフトウェアの境界で遊んでいます 詳細なプロフィール ハイパーバイザ 基板作成 コンパイラ/リンカ作成 2
自己紹介 ほたるいか 昨日まで能代宇宙イベントでロケットを飛ばしてました 詳細なプロフィール @CREATE_rocket 3
01 今回の目標 4
今回の目標 Raspberry Pi 5のRP1でも自作ファームウェアを動かしたい! 5
RP1とは Raspberry Pi 5にはBCM2712というSoCが載っているが、GPIOなどのコントローラとしてRP1というチッ プが載っている。 このチップはPCIe 2.0 x4で接続されていて、マイコン用のSoCであるCortex m3 ×
2が搭載されている。 Cortex m3 Cortex A76 Cortex A76 Cortex A76 Cortex A76 PCIe 2.0 ✕4 BCM2712 Raspberry Pi 5 Cortex m3 RP1 6
今回の目標 RP1にて自作のプログラムを動かせるようにする BCM2712側のLinuxと共存する 7
02 RP1にプログラムを書き込めるようにする 8
そもそもRP1にどうやってプログラムを書き込むか RP1は通常のマイコンとは異なり、USB経由で書き込む方法を持たない 通常は起動時に公式firmwareがRP1のSRAMに直接プログラムを書き込み、 watchdog scrachに値を書き込むことで起動する。 Cortex A76 × 4 VideoCoreVI
VPU I2C 0x43 BCM2712 Cortex m3 Cortex m3 RP1 Raspberry Pi 5 9
公式firmwareを改造してみる Raspberry Pi 5の起動はVPU内のbootromからSPI flashのbootloaderが呼び出され、その bootloaderが起動を行う このSPI flashから起動するbootloaderがI2Cを介してRP1のfirmwareを書き込んでいるの で、このbootloaderであるbootsys/bootmainを改造することを考えた bootsys/bootmainそれぞれで署名の検証が行われてそうで改造firmwareのロードができず
断念、 、 、 SPI flash firmware VideoCoreVI VPU内 bootrom bootsys BCM2712 bootmain Trusted Firmware Linuxなど I2C SRAM 64KiB RP1 Raspberry Pi 5の初期起動プロセス 10
独自3rd stage bootloaderでロードする BCM2712のCortex A76側でもRP1のfirmwareの変更は可能なので、3rd Stage Bootloaderを作成して 起動することにした この3rd Stage
BootloaderはSD bootの他にもTFTP bootに対応したので、ネットワークブートで RP1のプログラムを書き換えられる SPI flash firmware VideoCoreVI VPU内 bootrom bootsys BCM2712 bootmain Trusted Firmware 独自3rd Stage Bootloader Linuxなど I2C I2C SRAM 64KiB SRAM 64KiB RP1 RP1をリセット Raspberry Pi 5の今回の初期起動プロセス RP1 11
03 RP1とBCM2712が通信できるようにする 12
RP1がBCM2712から見えなくなった プログラムのロード以外でBCM2712からRP1に通信を行うためには、PCIeを経由する必要がある RP1の通常のプログラムでは適切にPCIeのendpointとして見えていたが、RP1のcustom firmwareを 入れたら、GPIOによるLチカはできている状態でもPCIeのendpointが見えなかった PERST# assert PCIe bridge /
Root Port reset SERDES IDDQ 解除 MDIO設定 PCIe window 設定 RP1のPCIe endpointを リセット状態にする BCM2712側PCIeコントローラを 初期状態に戻す PCIe PHYを低消費電力 状態から起こす PCIe PHYのアナログ・ リンク関連設定を行う CPUアドレスとPCIeアドレス の変換領域を設定する Root Bridge 設定 BCM2712をPCIe Root Complex として動作させる PERST# deassert Link Up待ち Configuration scan BAR割当て RP1 endpointのPCIeリセット を解除する PHY間のLink Trainingが 完了するまで待つ PCIe Configuration Space を読んでRP1を探す RP1が要求するMMIO領域へ CPU側アドレスを割り当てる Raspberry Pi 5におけるRP1のPCIeの初期化プロセス 13
Configuration SpaceがAll ffff プログラムのロード以外でBCM2712からRP1に通信を行うためには、PCIeを経由する必要がある RP1の通常のプログラムでは適切にPCIeのendpointとして見えていたが、RP1のcustom firmwareを 入れたら、GPIOによるLチカはできている状態でもPCIeのendpointが見えなかった 公式 Firmware 自作
Firmware Vendor/Device ID = 0x00011de4 Vendor/Device ID = 0xffffffff ほかもすべてffffで埋まっている 14
RP1で必要なendpoint設定 公式firmwareを解析したところ、endpoint設定を行う必要があるとわかった endpoint設定は、BCM2712での変更に対応する形で設定していく必要がある BCM2712 RP1 firmware start SRAM → ISRAM/DSRAM
PERST# assert 〜 Root Bridge 設定 PERST解除待ち PERST# deassert reset release CORE_ALIVE Link Up待ち DBI / iATU / BAR LTSSM LINKUP Configuration scan BAR割当て 通常firmware処理 15
PCIeのendpoint設定におけるSRAMの競合 ここまでの通り、PCIeのendpointのRP1での初期化はRP1のファームウェアが担当する このファームウェアはI2CによりSRAMにロードされ、実行されていた しかし、SRAMはPCIeのBAR2にてBCM2712側にも公開されている このため、PCIeのendpoint初期化の際は、SRAMの公開化操作が必要 PCIeのendpoint操作時にSRAMからプログラムをfetchしてきていると、動作が不安定になる 公式ファームウェアでもSRAMからcpu固有のISRAMにendpoint操作プログラムを移してから実行 していた これを今回のカスタムファームウェアでも利用することで、BCM2712からPCIeが無事使えるよう になった
Proc Addr Base Description 0x1000_0000 Proc Local ISRAM(local to each proc 8k) 0x1000_2000 Proc Local DSRAM(local to each proc 8k) 0x2000_0000 Shared SRAM(64k) 16
04 RP1とBCM2712が共存できるようにする 17
RP1での割り込み RP1での割り込みはまず、RP1割り込みコントローラによって処理される このコントローラがBCM2712/RP1 に割り込みを送るかどうかを決める 実際に、UART0/PWM0ではBCM2712におけるMSI-Xでの割り込み番号と同じ、NVIC 25、NVIC5 で割り込みが発生することが確認できている ただし、I2C1、SPI0についてはNVIC 8/19に割り込 みが来なかったので、もうちょっと検証が必要そう
Cortex A76 ✕ 4 PL011 UARTコントローラ ④:IRQ/FIQ ①: SPI GIC-400 (Gic v2) ③:SPI MSI-X Interrupt Peripheral BCM2712(Soc) ②:MSI-X RP1 割込みコントローラ ②:IRQ RP1(GPIOコントローラ) Raspberry Pi 5 Cortex-m NVIC
RP1、BCM2712でのリソース競合問題 ここまでで、RP1で起動→UARTなどの初期設定→UARTなどの割り込み発生 までできるようになった しかし、BCM2712でもRP1をGPIOコントローラとして使う都合上、UART0本体、CLKなどでリソース の競合が生じる e.g. UART0をRP1側、UART1をLinux側が使うと、UARTの共通CLKソースをLinux側が変更/disableし て突然UART0が動かなくなる、 、 、
RP1 BCM2712 UART0 UART1 UART0用 CLK divider UART1用 CLK divider RP1_CLK_UART UARTの共通CLKソース
共有CLKの操作をRP1 firmwareに任せる このことから、LinuxにはCLK操作を行わせず、RP1 firmwareにCLKの変更要求を通知する形にした Linuxに新規ドライバを追加せず、dtb等の変更のみで実現可能になった SCMI clockを用いて、RP1の通知の仕組みであるmailboxで通知 今回のCLK操作方法 RP1 mailboxでRP1に通知
UART1のCLK変更 Common Clock Framework clk-scmi RP1 firmware いままでのLinux手法 UART1のCLK変更 Common Clock Framework rp1-clk UARTなどのCLKを操作するまで RP1_CLK_UART RP1_CLK_UART
05 まとめ 21
今回のまとめ 3rd stage bootloaderを作成し、RP1で自作のプログラムを動かせるようになった TFTP bootにより、ネットワーク越しからRP1のプログラムをロード可能に RP1のPCIe endpointを解析して、BCM2712からPCIeをLinkUpできるようにした LinuxとRP1のUART CLKなどを共用して使える仕組みを考えた
謝辞 サイボウズ・ラボユース‘25の低レイヤ開発にて支援を受けて開発しました。 https://labs.cybozu.co.jp/youth/theme-uchan.html 23
?? 時間があったときのおまけ(AMP) 24
Raspberry Pi 5のRP1をヘテロジニアスなプロセッサとして使う実験 BCM2712にthin hypervisorを搭載して、AMPによりRTOSとLinuxを動作させるPoCも作成した Linux Linuxからは RP1が見えない RTOS パススルー
Cortex A76 Cortex A76 ハイパーバイザ Cortex A76 Cortex A76 PCIe 2.0 ✕4 BCM2712 Raspberry Pi 5 VGic 仮想割込みへ変換 RP1 25