はじめに
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
この記事では、HSS(Hart Software Services)の概要と MPFS-DISCO-KIT への書き込みについて説明します。
HSS(Hart Software Services) とは
HSS は eNVM(embedded Non-Volatile Memory) に格納されたステージ1のブートプログラムで MSS(Micro Processor Sub System) が実行します。
HSS は主に次のような役割があります。
- ブートローダーとしての機能
- 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 のデバッグや状態監視を支援。
HSS のソースコード
HSS のソースコードは 下記の URL にて公開されています。
HSS のイメージファイル
今回説明する Ubuntu 22.04 システムでは、時間と手間の都合上、HSS を1からビルドしません。下記の URL からビルド済みのものをダウンロードして使います。
shell$ wget https://github.com/polarfire-soc/hart-software-services/releases/latest/download/hss-envm-wrapper.mpfs-disco-kit.hex
HSS の eNVM への書き込み
eNVM の内容を MSS から読むことは出来ますが、書き込むことは出来ません。eNVM に書き込むには JTAGを介して行われます。
ここでは、Microchip Technology 社が提供する PolarFire SoC FPGA 開発環境である Libero SoC を使って MSS を eNVM に書き込む方法を紹介します。なお、この部分については、筆者自身がまだ不馴れで知識不足が多々ある事をご了承ください。
polarfire-soc-discovery-kit-reference-design のダウンロード
eNVM に HSS を書き込む際に、polarfire-soc-discovery-kit-reference-design を利用します。これは MPFS-DISCO-KIT 用に Fabric部(FPGA部)に SRAM、I2C、DMAなどを実装したリファレンスデザインです。これを MPFS-DISCO-KIT にプログラムするついでに(?) HSS もプログラムします。
shell$ git clone --depth 1 --branch main https://github.com/polarfire-soc/polarfire-soc-discovery-kit-reference-design
polarfire-soc-discovery-kit-reference-design のビルド
プロジェクトの作成
Libero SoC を起動したら Project > Execute Script... をクリックして、前節でダウンロードしたディレクトリにある MPFS_DISCOVERY_KIT_REFERENCE_DESIGN.tcl を選択して Run します。
Fig.1 Libero-Project-Execute-Script
しばらく放っておくとプロジェクトが出来上がります。
Fig.2 Libero-Project-Execute-Script-Success
論理合成&配置配線
プロジェクトが出来上がったら、Place and Route を走らせます。ついでに Synthesize もやってくれます。
Fig.3 Libero-Project-Place-and-Route-Run
しばらく放っておくと出来上がります。
Fig.4 Libero-Project-Place-and-Route-Success
FPGA データの生成
Generate FPGA Array Data をクリックして Run します。
Fig.5 Libero-Project-Generate-FPGA-Array-Data
次に Configure Design Initialization Data and Memories をクリックして
Fig.6 Libero-Project-Design-Initialization-Data-and-Memories
Design Initialization Data and Memories View を開きます。
eNVM タブをクリックして Add > Add Boot Mode 1 Client を選択します。
Fig.7 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Add
Add PlaneText Boot Mode 1 client のダイアログボックスの Content from file: に前節でダウンロードした hss-envm-wrapper.mpfs-disco-kit.hex を指定します。
Fig.8 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Content-from-file
最後に Apply をクリックして eNVM に書き込むデータを生成します。
Fig.9 Libero-Project-Design-Initialization-Data-and-Memories-eNVM-Apply
eNVM への書き込み
MPFS-DISCO-KIT を PC に接続して、Run PROGRAM Action をクリックして Run を実行します。
Fig.10 Libero-Project-Run-PROGRAM-Action-Run
書き込みに成功すれば次のようになるはずです。
Fig.11 Libero-Project-Run-PROGRAM-Action-Success
これにて MPFS-DISCO-KIT の eNVM への HSS の書き込み(ついでに Fabric の書きこみも)は完了です。
Hart Payload Generator
HSS がブートローダーとして外部ストレージ(eMMC、SD-Card、QSPI フラッシュなど)や内部ストレージからアプリケーションをロードする際は、アプリケーションを Hart Payload としてラッピングしておく必要があります。
そこで、ラッピングするツール Hart Payload Generator をビルドしておきます。
ソースコードのダウンロード
HSS のソースコードは 下記の URL にて公開されています。
v2024.09 版をダウンロードします。
shell$ git clone --depth 1 --branch v2024.09 https://github.com/polarfire-soc/hart-software-services.git hart-software-services-v2024.09
Hart Payload Generator のビルド
Hart Payload Generator のソースコードは tools/hss-payload-generator にあります。
shell$ cd hart-software-services-v2024.09/tools/hss-payload-generator/
shell$ make