Updating SoftConsole sample project with the latest Bare Metal Library from GitHub, and also reflected Libero generated XML file (FPGA configuration).
前回、SoftConsole v6.4 に含まれるサンプルプロジェクト mpfs-blinky をビルドの上、Icicle Kit 上の PolarFire SoC にロードして実行してみました。残念ながら、サンプルプロジェクトに含まれる設定が FPGA コンフィグレーションデータと異なるためと思われますが、UART のビットレートが指定の 115.2kbps とならず、今回への宿題となっていました。
ベアメタルライブラリのアップデート
Microsemi 社の前回のウェビナーの第 10回において、SoftConsole に含まれるサンプルプロジェクト内のライブラリは最新でない可能性があるため、GitHub 上のベアメタルライブラリで差し替えるべき、という話がありました。まずはこれを試してしてみます。なお、今回採用したベアメタルライブラリのバージョンはコミット 920c14b(2020/8/26)です。
詳しくはこちらのウェビナーの第 10回を御参考頂きたいところですが、どうも Microsemi 社の DNS が不調でアクセスできないことがあり、またこのウェビナー資料がいつ見られなくか分からないため、以下に簡単にまとめておきます。
サンプルプロジェクト mpfs-blinky のディレクトリ構造を見ると、以下のようになっています。
mpfs-blinky ├── Debug └── src ├── application │ ├── hart0 │ ├── hart1 │ └── inc ├── modules │ └── config └── platform ├── config ├── drivers ├── hal └── mpfs_hal
ここで、GitHub 上のベアメタルライブラリから差替えが必要なのは src/platform 以下一式です。ただし、drivers 下のライブラリの全てをコピーする必要はないようで、例えば mpfs-blinky であれば、以下のドライバだけコピーすれば良いようです。
- mss_gpio
- mss_mmuart
リンカスクリプトのコピー
上記のように platform ディレクトリを差し替えると、リンカスクリプトが消えてしまいますので、改めて platform/config/linker/examples/mpfs-lim.ld を platform/config/linker/mpfs-lim.ld にコピーします。
ヘッダファイル include パスの修正
残念ながら、上記だけではビルドに失敗します。application 以下のファイルからベアメタルライブラリ中のヘッダファイルを include する点でのエラーは理解できるのですが、ベアメタルライブラリ中の include でエラーが出るのは、理由がよく分かりません。いずれベアメタルライブラリのドキュメントが充実すれば、明確になることでしょう。
とりあえず、mpfs-blinky の場合は、以下のようにパッチを当てて頂くと解決します。
diff --git a/mpfs-blinky/src/application/hart0/e51.c b/mpfs-blinky/src/applicati
on/hart0/e51.c
index 55506e4..ead9a1d 100644
--- a/mpfs-blinky/src/application/hart0/e51.c
+++ b/mpfs-blinky/src/application/hart0/e51.c
@@ -10,7 +10,7 @@
#include "mpfs_hal/mss_hal.h"
#include "drivers/mss_gpio/mss_gpio.h"
-#include "drivers/mss_uart/mss_uart.h"
+#include "drivers/mss_mmuart/mss_uart.h"
#include "inc/common.h"
diff --git a/mpfs-blinky/src/application/hart1/u54_1.c b/mpfs-blinky/src/application/hart1/u54_1.c
index 191c049..2d7aba9 100644
--- a/mpfs-blinky/src/application/hart1/u54_1.c
+++ b/mpfs-blinky/src/application/hart1/u54_1.c
@@ -11,7 +11,7 @@
#include "mpfs_hal/mss_hal.h"
-#include "drivers/mss_uart/mss_uart.h"
+#include "drivers/mss_mmuart/mss_uart.h"
#include "inc/common.h"
diff --git a/mpfs-blinky/src/application/inc/common.c b/mpfs-blinky/src/application/inc/common.c
index 306adcd..713b2b6 100644
--- a/mpfs-blinky/src/application/inc/common.c
+++ b/mpfs-blinky/src/application/inc/common.c
@@ -5,7 +5,7 @@
*/
-#include "drivers/mss_uart/mss_uart.h"
+#include "drivers/mss_mmuart/mss_uart.h"
#include "mpfs_hal/mss_util.h"
#include "common.h"
diff --git a/mpfs-blinky/src/platform/mpfs_hal/entry.S b/mpfs-blinky/src/platform/mpfs_hal/entry.S
index 118fdd7..0529c3d 100644
--- a/mpfs-blinky/src/platform/mpfs_hal/entry.S
+++ b/mpfs-blinky/src/platform/mpfs_hal/entry.S
@@ -16,7 +16,7 @@
#include "bits.h"
#include "encoding.h"
#include "mtrap.h"
-#include "mpfs_hal_config/mss_sw_config.h"
+#include "config/software/mpfs_hal/mss_sw_config.h"
.option norvc
.section .text.init,"ax", %progbits
diff --git a/mpfs-blinky/src/platform/mpfs_hal/mss_h2f.h b/mpfs-blinky/src/platform/mpfs_hal/mss_h2f.h
index 0d7a191..3360901 100644
--- a/mpfs-blinky/src/platform/mpfs_hal/mss_h2f.h
+++ b/mpfs-blinky/src/platform/mpfs_hal/mss_h2f.h
@@ -20,7 +20,7 @@
#ifndef MSS_H2F_H
#define MSS_H2F_H
-#include "mpfs_hal_config/mss_sw_config.h"
+#include "config/software/mpfs_hal/mss_sw_config.h"
#ifdef __cplusplus
extern "C" {
diff --git a/mpfs-blinky/src/platform/mpfs_hal/mss_hal.h b/mpfs-blinky/src/platform/mpfs_hal/mss_hal.h
index 87bd7ae..cfc5a00 100644
--- a/mpfs-blinky/src/platform/mpfs_hal/mss_hal.h
+++ b/mpfs-blinky/src/platform/mpfs_hal/mss_hal.h
@@ -38,7 +38,7 @@ typedef long ssize_t;
* mss_sw_config.h may be edited as required and should be located outside the
* mpfs_hal folder
*/
-#include "mpfs_hal_config/mss_sw_config.h"
+#include "config/software/mpfs_hal/mss_sw_config.h"
/*
* The hw_platform.h is included here only. It must be included after
* mss_sw_config.h. This allows defines in hw_platform.h be overload from
@@ -47,7 +47,7 @@ typedef long ssize_t;
#include "atomic.h"
#include "bits.h"
#include "encoding.h"
-#include "soc_config/hw_platform.h"
+#include "config/hardware/hw_platform.h"
#include "mpfs_hal/nwc/mss_ddr.h"
#include "mss_clint.h"
#include "mss_coreplex.h"
MSS コンフィグレータ出力の XML ファイル対応
MSS コンフィグレーションツールについては、以下で説明しました。
PolarFire SoC MSS Configurator を使って XML ファイルを作成したら、PolarFire SoC Configuration Generator を GitHub から clone してドキュメントの手順に従います。こちらのツールも、出来がやや荒削りですが、ちゃんと動作しているようです。
私の場合の手順を簡単に説明しておきます。今回は PolarFire SoC MSS Configurator は使わず、出来合いの XML ファイルを使います。
まず、GitHub の PolarFire SoC Icicle Kit Sample Design scripts Libero v12.5 を git clone し、XML ディレクトリにある ICICLE_MSS_eMMC_cfg.xml(eMMC ブート用)あるいは ICICLE_MSS_SD_cfg.xml(SD カードブート用)のうち、自分が使っている構成のほうのファイルを選びます。それを、上記 PolarFire SoC Configuration Generator の ref_xml ディレクトリにコピーします。
そうしたら、PolarFire SoC Configuration Generator 直下のディレクトリで次のコマンドを実行します。
bash$ mkdir -p soc_config
bash$ python3 mpfs_configuration_generator.py ref_xml/ICICLE_MSS_SD_cfg.xml .
すると、soc_config の下に次のファイルやディレクトリが生成されます。
- clocks
- ddr
- general
- hw_platform.h
- io
- memory_map
- sgmii
これらを、mpfs-blinky プロジェクトの src/platform/config/hardware の下にコピーします。あ、元からあるファイルは削除しておいたほうが良いかもです。(このとき、できたら元からあるファイルと新しく生成したファイルの diff を取ると、いろいろ勉強になるでしょう。)
コピーできたら、改めて mpfs-blinky プロジェクトをビルドして実行してみましょう。先頭の仮想 COM ポート(Linux では /dev/ttyUSB0)に 115.2kbps で接続すると、今度は文字化けせずに動作することを確認できるはずです。
追記(10月22日): プログラマ FlashPro5 を使用している場合には一点注意が必要です。同プログラマ内部には FT4232H というUSB-UART ブリッジチップが入っており、Linux ではこれが /dev/ttyUSB0 として認識されてしまうことがあります。dmesg コマンドで、どのアダプタがどの /dev/ttyUSB* につながっているか確認したほうが良いでしょう。例えば次のように表示された場合は、PolarFire SoC MSS の仮想 COM ポートは、/dev/ttyUSB1〜4 となります。
[ 13.050153] usb 1-1.4: FTDI USB Serial Device converter now attached to ttyUSB0 [ 3649.931958] usb 1-1.3: cp210x converter now attached to ttyUSB1 [ 3649.932589] usb 1-1.3: cp210x converter now attached to ttyUSB2 [ 3649.933767] usb 1-1.3: cp210x converter now attached to ttyUSB3 [ 3649.934479] usb 1-1.3: cp210x converter now attached to ttyUSB4
今日はここまで。次回は、ソースコードの中身をもう少し追ってみましょう。またできたら、HSS(Hart Software Services)経由でブートできたら、と思っています。
お問い合わせはお気軽に!