1121153_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1121153_ja-JP

1121153_ja-JP

System Controller Firmware 101-はじめに

評価キットを使用する際には、BSPに含まれるSystem Controller Firmware(SCFW)バイナリが提供されます。このscfwバイナリはそのボード専用に調整されており、ご使用のハードウェアに合わせてボード依存部分を変更する必要がある場合があります。

本書ではSCFWのポーティング手順の概要を説明します。詳細についてはSystem Controller Porting guide(sc_fw_port.pdf)を参照してください。


システムを設定する

SCFWはLinuxホスト上でビルドされます。システムをセットアップする手順は次のとおりです:

  • GNU ARM Embedded Toolchain: 6-2017-q2-update June 28, 2017をARM websiteからダウンロードします:

Selection_036.png

  • ファイルを展開するディレクトリを選択します。例:
    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‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

  • ツールチェーンを含むディレクトリ(上記例では"~/gcc_toolchain")を指すようTOOLS環境変数を設定します。.bash_profileを編集してこの環境変数をexportすることもできます:
    export TOOLS=~/gcc_toolchain/
  • srec_catもビルドに必要です。これは通常srecordパッケージに含まれており、ubuntuでは次のように実行します:

    sudo apt-get update

    sudo apt-get install srecord

  • これでポーティングキットのディレクトリ(例:scfw_export_mx8qm)に移動し、scfwをビルドできます。

System Controller Firmwareポーティングキット

SCFW 移植キットには、SCFW をお客様のボードで動作するように変更できるソースファイルとオブジェクトファイルが含まれています。

最新のSystem Controller Firmwareポーティングキットは i.MX Software and development webpageから入手できます:

Selection_288.png

ポーティングキットを入手したら展開します:

tar xvzf imx-scfw-porting-kit-1.1.tar.gz‍

次のようなファイル構成が表示されます:

Selection_301.png

ポーティングキットはpackages以下に含まれており、READMEに展開手順が記載されています。基本的には:

cd packages/
chmod a+x imx-scfw-porting-kit-1.1.bin
./imx-scfw-porting-kit-1.1.bin‍‍‍

エンドユーザーライセンス契約の同意を求められます:

Selection_302.png

同意するとポーティングキットは新しいフォルダに展開されます。フォルダ構成は次のとおりです:

Selection_303.png

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/‍

Selection_304.png

すべてのビルドフォルダーには、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一般的な修正

  • 変更が必要な主なファイル(場合によっては唯一)は「board.c」で、場所は「platform/board/mx8X_board/」です。board.cファイルにはSCU UARTポート、PMIC初期化ルーチン、PMIC温度アラーム設定などボード関連情報のほとんどが含まれており、LDO電圧を設定したりPMICと通信するように変更することもできます。board.c内のすべての関数はSCU自身によって実行されるため、PMICとの通信に使用されるI2Cインターフェースにアクセスできます。
  • 外部電源(たとえばPMIC LDO)で駆動されるSoCリソース(APコアやGPUなど)はboard_set_power_modeによってオン/オフされ、リソースを特定のPMIC電源にマッピングする処理はboard_get_pmic_infoで行われます。例としてi.MX8QMバリデーションボードでは、A53サブシステムがPF100 PMICカードの3番目のPMIC(PMIC_2_ADDR、アドレスはPMIC_0から開始)のSW2とPF8100 PMICカードの1番目のPMIC(PMIC_0_ADDR)のSW5により給電されます。
    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;
    ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍
  • 外部電源で駆動されるSoCリソース(APコア、GPUなど)の電圧はboard.c内のboard_set_voltageで管理されます。リソースと電源のマッピングは前述のとおりboard_get_pmic_infoで行われます。
  • 8個の「ボードリソース」(SC_R_BOARD_R0〜SC_R_BOARD_R7)が利用可能で、これらを用いてSCUが管理できるボード上のコンポーネントを定義できます。たとえばPMICのLDOの1つで駆動されるセンサをボードリソースにマッピングし、board.cを変更してセンサの電源オン/オフや電圧変更を行えます。
  • ボードリソースの電圧変更は、board_trans_resource_powerで電圧を設定するか、実行時に電圧を変更する必要がある場合はboard_set_controlを修正して、Miscellaneous Service 101で説明されているミスレニアスコールがそのリソースに対して発行されるたびに電圧を変更します。たとえばSC_R_BOARD_R7の電圧を変更する場合、board_set_controlに以下のcaseを追加します:
    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);‍‍‍‍‍‍‍‍
  • ボードリソースの電源オン/オフはboard.c内のboard_trans_resource_powerで行われます。例えばNXPのバリデーションボードでは、ボード上のPTN5150はボードリソース0で管理され、電源のオン/オフは次のように制御されます:
    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);‍‍‍‍‍‍‍‍
  • board_config_scは、I2CモジュールやPMICとの通信に使用されるパッドなど、SCUが必要とするリソースをマーキングするために使用します。board.cの関数が動作するために必要なリソースは、本関数で移動不可に設定する必要があります。例えばSCUのI2Cモジュールを保持するには、次の行を追加します:
    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_system_configは初期リソース管理を行う関数で、イメージ内でalt_configフラグが設定されている場合にのみ呼び出され、パーティションを作成してリソースを割り当てることができます。詳細はResource Management Service 101を参照してください。
  • board_get_pcie_clk_srcはPCIeが使用するクロックを定義し、BOARD_PCIE_PLL_EXTERNALまたはBOARD_PCIE_PLL_INTERNALのいずれかを指定できます。
  • board_printは変更内容のデバッグに非常に便利で、構文は次のとおりです:
    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


System Controller Firmware 101

i.MX 8ファミリ | i.MX 8QuadMax (8QM) | 8QuadPlus
Tags (1)
No ratings
Version history
Last update:
‎11-19-2025 03:43 AM
Updated by: