評価キットを使用する際には、BSPに含まれるSystem Controller Firmware(SCFW)バイナリが提供されます。このscfwバイナリはそのボード専用に調整されており、ご使用のハードウェアに合わせてボード依存部分を変更する必要がある場合があります。
本書ではSCFWのポーティング手順の概要を説明します。詳細についてはSystem Controller Porting guide(sc_fw_port.pdf)を参照してください。
SCFWはLinuxホスト上でビルドされます。システムをセットアップする手順は次のとおりです:
mkdir ~/gcc_toolchain
cp ~/Downloads/gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 ~/gcc_toolchain/
cd ~/gcc_toolchain/
tar xvjf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2
export TOOLS=~/gcc_toolchain/
sudo apt-get update
sudo apt-get install srecord
SCFW 移植キットには、SCFW をお客様のボードで動作するように変更できるソースファイルとオブジェクトファイルが含まれています。
最新のSystem Controller Firmwareポーティングキットは i.MX Software and development webpageから入手できます:
ポーティングキットを入手したら展開します:
tar xvzf imx-scfw-porting-kit-1.1.tar.gz
次のようなファイル構成が表示されます:
ポーティングキットはpackages以下に含まれており、READMEに展開手順が記載されています。基本的には:
cd packages/
chmod a+x imx-scfw-porting-kit-1.1.bin
./imx-scfw-porting-kit-1.1.bin
エンドユーザーライセンス契約の同意を求められます:
同意するとポーティングキットは新しいフォルダに展開されます。フォルダ構成は次のとおりです:
SCFWに関するドキュメントはdoc/pdfにあるか、html形式で提供されています。sc_fw_port.pdfに目を通すことを推奨します。
異なるSoCバリアント(QM A0、QM B0、QXP B0)のポーティングキットはsrcにtar.gzとして格納されています。その他のファイルはLinux、QNX、FreeRTOS、U-boot、ARM Trusted Firmwareなど向けのSCFWライブラリです。
複数のSoCバリアント(QXPとQMの両方など)で作業する場合は、すべてのポーティングキットを1つのディレクトリに展開することを推奨します。これにより、そのディレクトリから任意のバリアント向けにビルドできます。実行コマンドは次のとおりです:
cd imx-scfw-porting-kit-1.1/
cd src/
find scfw_export_mx8*.gz -exec tar --strip-components 1 --one-top-level=scfw_export_mx8 -xzvf {} \;
scfw_export_mx8フォルダが作成され、ここからサポートされている任意のバリアント向けにSCFWをビルドできます。または、目的のバリアントのパッケージだけを展開して使用することもできます。
cd scfw_export_mx8/
すべてのビルドフォルダーには、SCFWのビルド結果が含まれており、プラットフォームにはSCFWのソースが保存されています。
ボード固有のコードはすべて「platform/board/mx8_」にあります。ここでderivativeはQXPやQMなどのi.MX8シリコンファミリ、board_nameはSCFWパッケージの対象ボード名です。
SCFWをお使いのボードにポーティングする最初のステップは、i.MX8のderivativeとボード用のフォルダを作成することです。既存のボード例をコピーしてフォルダ名を変更すると、すぐに開始できるプロジェクトが得られます。例:
cp -r platform/board/mx8qm_val/ platform/board/mx8qm_myBoard/
この例のボードは「myBoard」と呼ばれ、i.MX8QM B0 デバイス用です。このボード用の SCFW を構築するには、単に次のコマンドを呼び出してください。
make qm R=B0 B=myBoard
ターゲットがi.MX8QXPの場合は、このデバイスをベースにしたボードを選び、「make qx」を実行するだけです。
ビルドオプションや詳細なブート情報などの追加情報はSCFWポーティングガイド(sc_fw_port.pdf)に記載されています。本書の第2章はポーティングプロセスの優れた入門です。
PMICの設定概要およびboard.c一般的な修正
case SC_SUBSYS_A53:
pmic_init();
if (pmic_card == PF100)
{
pmic_id[0] = PMIC_2_ADDR;
pmic_reg[0] = SW2;
*num_regs = 1;
}
else
{/* PF8100_dual Card */
pmic_id[0] = PMIC_0_ADDR;
pmic_reg[0] = PF8100_SW5;
*num_regs = 1;
}
break;
case SC_R_BOARD_R7:
if (ctrl == SC_C_VOLTAGE)
{
/* Example only PMIC_X_ADDR and PMIC_SUPPLY need to match an actual device */
pmic_interface.pmic_set_voltage(PMIC_X_ADDR, PMIC_SUPPLY, val, step);
}
else
return SC_ERR_PARM;
break;
上記のcaseはアプリケーションが次の関数を呼び出すたびにSCUによって実行されます。
sc_misc_set_control( ipc, SC_R_BOARD_R7, SC_C_VOLTAGE, voltage_val);case BRD_R_BOARD_R0 : /* PTN5150 (use SC_R_BOARD_R0) */
if (pmic_ver.device_id == PF100_DEV_ID)
{
if (to_mode > SC_PM_PW_MODE_OFF)
{
pmic_interface.pmic_set_voltage(PMIC_2_ADDR, VGEN6,
3300, SW_RUN_MODE);
pmic_interface.pmic_set_mode(PMIC_2_ADDR, VGEN6,
VGEN_MODE_ON);
}
else
{
pmic_interface.pmic_set_mode(PMIC_2_ADDR, VGEN6,
VGEN_MODE_OFF);
}
}
else
{/* PF8100_dual Card */
if (to_mode > SC_PM_PW_MODE_OFF)
{
pmic_interface.pmic_set_voltage(PMIC_1_ADDR, PF8100_LDO1,
3300, REG_RUN_MODE);
pmic_interface.pmic_set_mode(PMIC_1_ADDR, PF8100_LDO1,
RUN_EN_STBY_EN);
}
else
{
pmic_interface.pmic_set_mode(PMIC_1_ADDR, PF8100_LDO1,
RUN_OFF_STBY_OFF);
}
}
break;
アプリケーション側で以下の関数が呼び出されるたびに、SCUは上記のコードを実行します:
sc_pm_set_resource_power_mode(ipc, SC_R_BOARD_R0, SC_PM_PW_MODE_ON/OFF);rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, false);
以下のパッドはSCUに属しており、アプリケーションからはアクセスできません:
- SC_P_SCU_PMIC_MEMC_ON
- SC_P_SCU_WDOG_OUT
- SC_P_PMIC_EARLY_WARNING
- SC_P_PMIC_INT_B
- SC_P_SCU_BOOT_MODE0〜SC_P_SCU_BOOT_MODE5
board_print(3, "Debug printout %d\n", val);
最初のパラメータがデバッグレベルで、それ以降は標準printfと同様に動作します。出力はSCUが対応するデバッグレベルでビルドされている場合にのみSCUのデバッグ出力で確認できます。上記の例では出力を表示するためにSCFWを次のようにビルドする必要があります:
make qm B=myBoard DL=3 or higher (debug level goes from 0 to 5)
以下のユーティリティはSystem Controller Firmwareリクエストの方法を示し、QNXとLinuxの両方でコマンドラインからリクエストを行う手段を提供します。
System Controller Firmware Command Line Utility for Linux and QNX