[NXP プロセッサー 初心者ガイド 1] | [NXP プロセッサー 初心者ガイド 3] | ||
NXP プロセッサー 初心者ガイドまとめ | NXP プロセッサー実機検証ガイド まとめ |
もくじ
1. はじめに
NXP 社が提供する i.MX Linux OS BSP(Board Support Package)は、通常、Yocto Project を使用して開発を進めて行きます。
Yocto Project に用意されている Yocto SDK (Software Development Kit) を使用することで、Yocto Project の環境を他の PC に移植して引き続き U-Boot および Linux Kernel/ドライバー/デバイスツリーやアプリケーションを開発することができます。
今回は Yocto SDK (Software Development Kit) を活用して、他の ホスト PC で U-boot と Linux Kernel をビルドする方法を解説します。
参考:
i.MX Linux User’s Guide(IMXLUG)"4.5.12 How to build U-Boot and Kernel in standalone environment"
2. ホストマシンのセットアップ
U-Boot および Linux Kernel/ドライバー/デバイスツリーをビルドするためには、Linux ホストマシンが必要になります。この記事の説明では、Ubuntu 20.04 LTS を使用しました。
ホストマシンのセットアップについては、下記参考に、「3. ホストマシンのセットアップ」に記載されるソフトウェア・パッケージのインストールを実施した上で、「7. オプション:Yocto SDK (Software Development Kit) のビルド」に記載される Yocto SDK のインストールを実施してください。
参考:[NXP MPU 初心者ガイド] i.MX 系の Linux イメージ作成方法
ポイント: この記事の手順では、Yocto SDK に含まれるコンパイラー・ツールチェーンを使用します。これにより、Yocto Project(bitbake)を使用する場合と同じツールチェーンを使用してマニュアル操作でのビルド作業が行えます。
ポイント: この記事の手順では、Yocto Project そのものは使用しませんが、不要なトラブルを避けるために Yocto Project 向けのホスト・セットアップ要件に含まれるソフトウェア・パッケージのインストールも実施することをお勧めします。
注記: Yocto SDK のビルドには、Yocto Project の bitbakeを使用した Linux イメージ作成と同等の時間が掛かるので、Yocto Project 環境をセットアップ済みのマシンでビルドすることをお勧めします。
3. ツールチェーンの設定
Yocto SDK にはツールチェーンを利用するための環境設定用スクリプトが付属しているため、スクリプトを実行するだけでツールチェーンのパス設定や環境変数のセットアップが完了します。
- i.MX 6 および i.MX 7 をビルドする場合は、ビルドする前に次のコマンドで環境を設定します。
$ cd ~/
$ source /opt/fsl-imx-fb/6.1-mickledore/environment-setup-cortexa9hf-neon-poky-linux-gnueab
$ export ARCH=arm
$ export CROSS_COMPILE=arm-poky-linux-gnueabi-
- i.MX 8 および i.MX 9 をビルドする場合は、ビルドする前に次のコマンドで環境を設定します。
$ cd ~/
$ source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-poky-linux-
【図 1】 ツールチェーンの設定例(i.MX 8 および i.MX 9 の場合)
ポイント: 上記手順には export コマンドによる環境変数 ARCH および CROSS_COMPILE の設定が記載されていますが、この設定は割愛可能です。Yocto SDK のスクリプトにも ARCH および CROSS_COMPILE の設定が含まれています。
4. U-Boot のビルド
スタンドアロン環境で U-Boot をビルドする手順は以下のとおりです。
① クローンして U-Boot ソースコードをダウンロードします。
$ cd ~
$ git clone https://github.com/nxp-imx/uboot-imx -b lf_v2022.04
$ cd uboot-imx
【図 2】 U-Boot ソースコードのダウンロード
② i.MX の U-Boot をビルドするには、uboot-imx ソースコードの configs/ディレクトリーでターゲットブートのコンフィグレーションを探して、以下のコマンドを実行します。
【図 3】 i.MX 8M Plus 系のコンフィグレーション
i.MX 8M Plus LPDDR4 EVK(imx8mp-lpddr4-evk)ボードの場合は以下のコマンドを実行します。
$ sudo apt install -y libssl-dev ⇒ openssl/evp.h エラー対応
$ sudo apt install -y libgnutls28-dev ⇒ gnutls/gnutls.h エラー対応
$ make distclean
$ make imx8mp_evk_defconfig
$ make
【図 4】 U-Boot のビルド(i.MX 8M Plus の場合の例)
③ imx-mkimage を使用して、最終的な flash.bin ブートイメージを生成します。デバイスによって手順が異なります。今回は、i.MX 8M Family を例に記載します。
参考:
i.MX Linux User’s Guide(IMXLUG) "4.5.13 How to build imx-boot image by using imx-mkimage"
- imx-mkimage を使用してブートイメージをビルドします。imx-mkimage をダウンロードします:
$ git clone https://github.com/nxp-imx/imx-mkimage -b lf-6.1.22-2.0.0 --single-branch
- /tools/mkimage から mkimage をコピーし、imx-mkimage/iMX8M/mkimage_uboot にリネームします:
$ cp tools/mkimage imx-mkimage/iMX8M/mkimage_uboot
- u-boot-spl.bin を /spl/u-boot-spl.bin から imx-mkimage/iMX8M/ にコピーします:
$ cp spl/u-boot-spl.bin imx-mkimage/iMX8M/u-boot-spl.bin
- u-boot-nodtb.bin を imx-mkimage/iMX8M/ にコピーします:
$ cp u-boot-nodtb.bin imx-mkimage/iMX8M/u-boot-nodtb.bin
- i.MX 8M Plus LPDDR4 EVK(imx8mp-lpddr4-evk)ボードの場合、imx8mp-evk.dtb を /arch/arm/dts から imx-mkimage/iMX8M/ にコピーします:
$ cp arch/arm/dts/imx8mp-evk.dtb imx-mkimage/iMX8M/imx8mp-evk.dtb
- Arm Trusted Firmware (imx-atf) をビルドして、bl31.bin を imx-mkimage/iMX8M/ にコピーします:
$ git clone https://github.com/nxp-imx/imx-atf -b lf-6.1.22-2.0.0 --single-branch
$ cd imx-atf
$ make clean PLAT=imx8mp
$ LDFLAGS="" make -j $(nproc) PLAT=imx8mp bl31
$ cd ..
$ cp imx-atf/build/imx8mp/release/bl31.bin ./imx-mkimage/iMX8M/
【図 5】 Arm Trusted Firmware (imx-atf) のビルド(i.MX 8M Plus の場合の例)
- firmware-imx パッケージから firmware/hdmi/cadence/signed_hdmi_imx8m.bin を
imx-mkimage/iMX8M/ にコピーします:
$ wget http://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.20.bin
$ chmod +x firmware-imx-8.20.bin
$ ./firmware-imx-8.20.bin --auto-accept
$ cp firmware-imx-8.20/firmware/hdmi/cadence/signed_hdmi_imx8m.bin ./imx-mkimage/iMX8M/
【図 6】 firmware-imx パッケージのダウンロードと signed_hdmi_imx8m.bin のコピー(i.MX 8M Plus の場合の例)
- i.MX 8M Plus LPDDR4 EVK(imx8mp-lpddr4-evk)ボードの場合、
lpddr4_pmu_train_1d_dmem_202006.bin
lpddr4_pmu_train_1d_imem_202006.bin
lpddr4_pmu_train_2d_dmem_202006.bin
lpddr4_pmu_train_2d_imem_202006.bin
を、firmware-imx の firmware/ddr/synopsys から imx-mkimage/iMX8M/ にコピーします:
$ cp firmware-imx-8.20/firmware/ddr/synopsys/lpddr4_pmu_train_1d_dmem_202006.bin ./imx-mkimage/iMX8M/
$ cp firmware-imx-8.20/firmware/ddr/synopsys/lpddr4_pmu_train_1d_imem_202006.bin ./imx-mkimage/iMX8M/
$ cp firmware-imx-8.20/firmware/ddr/synopsys/lpddr4_pmu_train_2d_dmem_202006.bin ./imx-mkimage/iMX8M/
$ cp firmware-imx-8.20/firmware/ddr/synopsys/lpddr4_pmu_train_2d_imem_202006.bin ./imx-mkimage/iMX8M/
- i.MX 8M Plus LPDDR4 EVK(imx8mp-lpddr4-evk)ボードの場合、make SOC=iMX8MP flash_evk を実行して flash.bin(imx-boot イメージ)を生成します:
$ cd imx-mkimage
$ make SOC=iMX8MP flash_evk
【図 7】 flash.bin(imx-boot イメージ)の生成(i.MX 8M Plus の場合の例)
ビルドに成功すると、flash.bin が imx-mkimage/iMX8M に生成されます。
【図 8】 生成された flash.bin(i.MX 8M Plus の場合の例)
④ 生成されるブートイメージは次のとおりです:
- u-boot.imx - i.MX 6 または i.MX 7 用
- flash.bin - i.MX 8 用
5. Linux Kernel のビルド
スタンドアロン環境で Linux Kernel をビルドする手順は以下のとおりです。
① クローンして Linux ソースコードをダウンロードします。
git clone リポジトリには、すべての NXP リリースが含まれています。以下のコマンド例では、lf-6.1.y のスナップショットを選択しています。
$ cd ~
$ git clone https://github.com/nxp-imx/linux-imx -b lf-6.1.y --single-branch
$ cd linux-imx
【図 9】 Linux ソースコードのダウンロード
② スタンドアロン環境で i.MX の Linux Kernel をビルドするには、linux-imx ソースコードの configs/
ディレクトリーでターゲットのコンフィグレーションを探して、以下のコマンドを実行します。
- i.MX 6 または i.MX 7 用 Linux Kernel をビルドする場合:
$ make distclean // 生成されたファイルをすべて削除します
$ make imx_v7_defconfig // i.MX 6 および i.MX 7 の設定
$ make -j $(nproc) // -j: 同時ジョブの数。使用可能なホスト CPU を数値として使用します
- i.MX 8 および i.MX 9 用 Linux Kernel をビルドする場合:
$ make distclean // 生成されたファイルをすべて削除します
$ make imx_v8_defconfig // i.MX 8 の設定
$ make -j $(nproc) // -j: 同時ジョブの数。使用可能なホスト CPU を数値として使用します
【図 10】 Linux Kernel のビルド(i.MX 8M Plus の場合の例)
③ Linux Kernel で生成された以下のディレクトリーには次のファイルが生成されます。
- arch/arm64/boot - i.MX 8 および i.MX 9 の場合のディレクトリー
- arch/arm/boot - i.MX 6 または i.MX 7 の場合のディレクトリー
- 生成されるファイルは以下の通りです:
- dts
- Image
- Image.gz
- install.sh
- Makefile
【図 11】 arch/arm64/boot ディレクトリーの内容
- i.MX 8M Plus LPDDR4 EVK(imx8mp-lpddr4-evk)ボードの場合に必要なファイルは以下の通り
です:- arch/arm64/boot/dts/freescale/*imx8mp*.dtb(device tree binary)
- arch/arm64/boot/Image(Kernal image)
ポイント: ここでは詳細には触れませんが、Linux カーネルイメージ(Image)とデバイスツリー(.dtb)の他に、モジュールタイプのドライバーを使用する場合には、ビルド成果物としてドライバーモジュール(.ko)も実行時に必要となります。
メモ: ドライバーモジュール(.ko)は、ターゲット Linux 環境下で insmod コマンド等でインストールして使用します。
6. まとめ
この記事では、NXP 社の i.MX Linux User’s Guide の情報をもとに、Yocto Project を使用せずにスタンドアロン環境をセットアップし、U-Boot および Linux Kernel/ドライバー/デバイスツリーをマニュアルでビルドする方法についてご紹介しました。
次回の記事では、ビルド成果物のファイル一式を i.MX ブート用の SD カードに書き込む手順および、起動確認について紹介予定です。
[NXP プロセッサー 初心者ガイド 1] | [NXP プロセッサー 初心者ガイド 3] | ||
NXP プロセッサー 初心者ガイドまとめ | NXP プロセッサー実機検証ガイド まとめ |