はじめに
MPFS-DISCO-KIT(Microchip PolarFire SoC FPGA Discovery Kit) で動作する Ubuntu 22.04 を構築する方法をいくつかの記事に分けて説明します。
- イントロ編(この記事)
- HSS(Hart Software Services)編
- U-Boot 標準編
- U-Boot bootmenu 改造編
- Linux Kernel linux4microchip+fpga-2024.09 編
- Linux Kernel mpfs-fpga-first 編
- Ubuntu 22.04 Root File System 編
- SD-Card 作成編
- SD-Card 起動編
上記の記事で構築した MPFS-DISCO-KIT 向け Ubuntu 22.04 Root File System、Linux Kernel、Boot Loader は次の URL にて公開しています。なお、これらはオフシャルなものではなく、筆者の魔改造がはいっています。ご使用の際はこの点にご留意してください。
- https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04
- https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6
- https://github.com/ikwzm/MPFS-DISCO-KIT-U-Boot
この記事では、MPFS-DISCO-KIT の簡単な紹介、ブートシーケンス、クロス開発環境について説明します。
MPFS-DISCO-KIT とは
MPFS-DISCO-KIT(Microchip PolarFire SoC FPGA Discovery Kit) は、Microchip Technology 社の PolarFire SoC FPGA(MPFS095T_1FCSG325E) を搭載した開発用のキットです。主な構成は次のとおりです。
- PolarFire SoC FPGA with 95k LEs
- 1GByte main memory
- 1x Gigabit Ethernet
- 3x UART
- 1x micro-SD interface
- Form factor 4.1" x3.3"
詳細は次の URL を参照してください。
PolarFire SoC FPGA とは
PolarFire SoC FPGA は Microchip Technology 社が提供する SoC(System on Chip) FPGA ファミリの一つです。PolarFire SoC FPGA の主な構成は次のとおりです。
- MSS(Micro Processor Sub System)
- CPU Core Complex
- 1x E51 RISC-V Monitor Core(RV64IMAC + 16KB iCache + 8KB DTIM)
- 4x U54 RISC-V Application Core(RV64GC + 32KB iCache + 32KB dCache + MMU-Sv39)
- 2MB L2 Cache or 1.8MB LIM
- Branch Prediction
- TileLink (Cache Coherency Inter Connect)
- DMA Engine(4x independent DMA channels)
- WCB(Write Combining Buffer)
- PLIC(Platform Level Interrupt Controller)
- CLINT(Core Local Interrupt Controller)
- System Controller
- pNVM(private Non-Volatile Memory)
- AXI Switch
- User Crypto Processor
- DDR Memory Controller
- Peripherals
- 2x GbE
- eMMC SD/SDIO
- 2x CAN
- 2x SPI
- 2x I2C
- 5x UART
- 3x GPIO
- 1x USB 2.0 OTG
- RTC(Real-time Counter)
- Timer
- Watchdog
- Frequency Meter
- MSS-Fabric Interrupt Controller
- 128KB eNVM(embedded Non-Volatile Memory)
- FIC(Fabric Interface Controller)
- CPU Core Complex
- FPGA Fabric
詳細は次の URL を参照してください。
ブートシーケンス
PolarFire SoC MSS には4つのブートモードがあります。
- ブートモード0 はブランクデバイス、または組み込みソフトウェアのデバッグ時に使用されます。
- ブートモード1 は MSS が電源投入時に eNVM からセキュアでないコードを実行を開始する場合に使用されます。
- ブートモード2 はユーザー定義のセキュアブート認証を実装するためのものです。
- ブートモード3 は Microchip 社が工場出荷時に提供する eNVM のセキュアブート認証を実装するためのものです。
今回説明する Ubuntu 22.04 システムでは、ブートモード1 でブートします。ブートシーケンスは次の手順で進みます。
ステージ0 (内部ROM)
ステージ0 のブートプログラムは内部 ROM にあり、PolarFire SoC のシステムコントローラーが実行します。
電源投入直後、PolarFire SoC のシステムコントローラーは デバイスのコンフィギュレーションが完了するまで、MSS をリセット状態に保ちます。その後、システムコントローラーは内部ROM のコードを実行します。pNVM に格納されたコンフィギュレーションデータに基づいて Core Complex(1x RISC-V CPU + 4x RISC-V CPU)をコンフィギュレーションします。
ステージ1 (HSS - Hart Software Services)
ステージ1 のブートプログラムは eNVM にあり、MSS が実行します。
今回説明する Ubuntu 22.04 システムでは HSS(Hart Software Services) を使います。
HSS は eNVM にプログラムされたステージ1 のプログラムで、主に次のような役割があります。
- ブートローダーとしての機能
- MSS の RISC-V Core (Hart: Hardware Thread) を初期化。
- 外部ストレージ(eMMC、SD-Card、QSPI フラッシュなど)や内部ストレージからアプリケーションをロード。
- 各 Hart に対応するコードを割り当てて実行を開始。
- マルチコア管理
- マルチコアシステムでの Hart の役割を設定。
- 必要に応じて Hart を停止、再開、リセット。
- 各 Hart のリソースを制御し、アプリケーションの分散実行をサポート。
- 各 Hart 間のデータ共有や同期を提供。
- メッセージパッシングや割り込み制御をサポート。
- セキュアブート
- セキュアブートプロセスを管理し、不正なコードの実行を防止。
- 暗号化されたイメージの複合や検証を実行。
- 仮想化サポート
- 仮想化のための環境を準備し、各 Hart が異なる OS や RTOS を実行可能にする。
- 周辺機器の初期化
- DDR Memory やクロック、その他の周辺デバイスの初期化を担当。
- PolarFire SoC 全体のシステムの初期化を実施。
- コンソールとデバッグ支援
- シリアルポート経由でデバッグコンソールを提供。
- PolarFire SoC のデバッグや状態監視を支援。
なお、eNVM の内容を MSS から読むことは出来ますが、書き込むことは出来ません。
eNVM に書き込むには JTAGを介して行われます。
・ステージ2 (U-Boot)
ステージ2 のブートプログラムは外部ストレージにあり、DDR Memory にロードされて、MSS が実行します。
今回説明する Ubuntu 22.04 システムでは U-Boot を使います。
U-Bootはファイルシステムを使えたり、スクリプトや環境変数などが使えるので、その設定にしたがって、Linux のカーネルイメージ、Device Tree、場合によってはルートファイルシステムを DDR Memeoryに ロードします。その後、Linuxカーネルイメージに制御を移します。
クロス開発環境
U-Boot や Linux Kernel をビルドするためには RISC-V 用のコンパイラが必要です。また開発環境として PC を使う場合はクロス開発環境が必要です。
Ubuntu には gcc-riscv64-unknown-elf というパッケージがあるのですが、残念ながらこちらのコンパイラでは上手くいきませんでした。
そこで定番の riscv-gnu-toolchain をビルドして使います。詳細なビルド方法に関しては、以下の URL や参考をご覧ください。
今回説明する Ubuntu 22.04 システムでは riscv64-unknown-linux-gnu- を使います。
参考
- https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas
- https://www.microchip.com/en-us/development-tool/mpfs-disco-kit
- https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04
- https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6
- https://github.com/ikwzm/MPFS-DISCO-KIT-U-Boot
- 『Ubuntu上でのRISC-Vの環境構築』@Qiita