i.MXの開発環境を構築してみた (Yocto編)

NXPセミコンダクターズ(以下NXP)のArmベース・マイクロプロセッサー「i.MXシリーズ」は、インダストリアル、コンシューマー、オートモーティブなどのさまざまな分野で活用されています。i.MXシリーズは、高度なグラフィックス、マシンビジョン、オーディオ、音声、ビデオ、およびセーフティーを重視するアプリケーションに最適です。

i.MX開発ユーザーが利用しやすいように、NXPはいくつかのi.MX評価ボード向けのプロジェクト・イメージファイルを提供していますが、ユーザーが実際にアプリケーションで使用したい機能が実装されていないことがあります。そこで、本コラムではYoctoを使用したi.MX開発環境の構築方法を紹介します。

Yoctoとは、Linuxのディストリビューションを作成するためのフレームワークです。このディストリビューションをカスタマイズすることで、独自の機能や開発をスムーズに立ち上げることが可能になります。

全体の流れ

Yoctoを使用したi.MX開発環境を構築する全体の流れです:

  • ① 事前準備をする: ホストマシンのセットアップ
  • ② 開発環境を構築してみよう: Yoctoで開発環境を構築
  • ③ ビルドしてみよう: イメージをビルド
  • ④ 書き込みをしてみよう: 生成されたイメージを評価ボードに書き込む

本コラムでは手順➀~③(「3.事前準備をする」、「4.開発環境を構築してみよう」、「5.ビルドしてみよう」)までを紹介し、手順④は次回のコラムで紹介します。また、イメージとはLinuxのファイルシステムを含んだブート用のイメージを指します。

  • 全体の流れ:イメージ

    Yoctoを使用したi.MX開発環境を構築する全体の流れ

必要なハードウェアを知る

Yoctoプロジェクト・ビルド環境を使用してi.MX評価ボードのイメージを構築する方法は、NXPのユーザーズ・ガイド「i.MX Yocto Project User's Guide」で紹介されています。

Yoctoプロジェクト・ビルド環境をサポートしているi.MX製品は以下の通りです。

Yoctoプロジェクト・ビルド環境をサポートしているi.MX製品

i.MX ファミリー名称 i.MX製品名称
i.MX6 6QuadPlus, 6Quad, 6DualLite, 6SoloX, 6SLL, 6UltraLite, 6ULL, 6ULZ
i.MX7 7Dual, 7ULP
i.MX8 8QuadMax, 8QuadPlus
i.MX8M 8M Plus, 8M Quad, 8M Mini, 8M Nano
i.MX8X 8QuadXPlus, 8DXL, 8ULP
i.MX9 i.MX 91, i.MX 93, i.MX 95

このコラムでは、i.MX 8M Plusを搭載した評価ボード「i.MX 8M Plus」での環境構築方法を紹介します。

  • i.MX 8M Plus:イメージ

    参考画像:i.MX 8M Plus

事前準備をする

ホストマシンのセットアップを行います。ホストマシンの必要要件は下記になります。

項目 必要要件
OS Ubuntu 20.04以降
HDD 最小50GB、推奨250B以上
CPUコア 推奨8スレッド
メモリ 推奨16GB以上
USB USB2.0 or 3.0 を1つ以上搭載

上記の要件を満たせばホストマシンとして問題ありません。ただし、HDD容量は500GB以上をお勧めします。HDD容量の推奨は250GBですが、ビルドを行うと中間ファイルや生成ファイルを含めると、かなりのHDD容量を使用します。今後の拡張性を考えると、HDD容量は500GB以上にしておいたほうが無難です。

また、Yoctoの環境を実行するには、インターネット接続が必要です。会社環境で使用する場合、Firewallの中からインターネット接続するためにProxy等の設定が必要になる場合があります。所属会社のIT部門へのご相談をお願いします。

今回のコラムで使用したホストマシンは、筆者が開発業務で使用しているPCを使用しました。そのため、Yocto環境の構築で使用する各種パッケージはあらかじめあらかじめインストールされています。お使いのホストマシンでパッケージが不足している場合は、エラーメッセージに従ってソフトウェアやパッケージのインストールをお願いします。

1.Yoctoに必要なパッケージ情報の更新をします

ホストマシンのターミナルでコマンド操作を行います。また、ディレクトリの指定はありません。

$ sudo apt update
$ sudo apt upgrade

コマンドの内容を下記に記載します。

コマンド 内容
apt update アップデートが可能なパッケージリストを更新します
apt upgrade 既にインストールされているパッケージのバージョンアップを行います

ターミナルにプロンプト記号($)が表示されたら次に進みます。

2.Yoctoに必要なパッケージをインストールします

Yoctoプロジェクトのビルドに必要なパッケージをインストールします。

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib ¥
   build-essential chrpath socat cpio python python3 python3-pip python3-pexpect ¥
   xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev ¥
   pylint3 xterm rsync curl zstd lz4 libssl-dev

コマンドの内容を下記に記載します。

コマンド 内容
apt-get install <package> <package>をインストールします
gawk package:パターン検索します
wget package:URLを指定してファイルをダウンロードします
git-core package:gitを行います
diffstat package:diffの出力結果を読み、各ファイルの挿入・削除・変更をカウントします
unzip package:zipファイルからファイルを取り出します
texinfo package:ソースファイルからTEX、HTML等にマニュアル出力します
gcc-multilib package:32bit binary出力します
build-essential package:GNU C、C++等の開発パッケージ一式
chrpath package: rpath、runpath設定を変更・一覧表示・削除します
socat package:TCPや標準入出力通信の変換します
cpio package:個々のファイル、ファイルグループ、ファイルシステム全体をコピーします
python package:python言語
python3 package:python3言語
python3-pip package:python3でpipをインストールします
python3-pexpect package:python3でインタラクティブなプログラムの自動化を行います
xz-utils package:可逆圧縮します
debianutils package:シェル・カーネル・ログ保存等の機能を追加します
iputils-ping package:pingを行います
python3-git package:python3でgitを行います
python3-jinja2 package:HTMLやXMLを生成します
libegl1-mesa package:グラフィック機能をコンパイルします
libsdl1.2-dev package: SDL1.2 バイナリ互換を行います
pylint3 package:エラーの発見を行うコードチェッカーを実行します
xterm package: X Window Systemの標準的な端末エミュレータ機能を追加します
rsync package:リモートでファイルやディレクトリと同期します
curl package:クライアントからサーバーへリクエストします
zstd package:可逆圧縮します
lz4 package:可逆圧縮します
libssl-dev package:OpenSSLのヘッダ、ライブラを追加します
apt upgrade 既にインストールされているパッケージをバージョンアップします

ターミナルにプロンプト記号($)が表示されたら次に進みます。

3.スワップファイルの設定をします

ホストマシンでビルドする際に、スレッドごとにビルドを行います。スレッドで使用するメモリサイズがホストマシンのメモリサイズを超えてしまうとビルドエラーとなります。それを避けるために、スワップファイル(32GB)の設定を行います。

補足:ホストマシンのメモリ容量が十分にある場合は、この処理は必要ありません。

$ sudo swapoff /swapfile
$ sudo rm /swapfile
$ sudo fallocate -l 32G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

コマンドの内容を下記に記載します。

コマンド 内容
swapoff <path> <path>のスワップ領域を無効にする
rm <path> <path>のディレクトリを削除する
fallocate -l 32G <path> <path>のファイルサイズ(32GB)を予約する
chmod <permission> <path> <path>のアクセス権限を設定する
mkswap <path> <path>にスワップ領域を準備する
swapon <path> <path>のスワップ領域を有効にする

ターミナルにプロンプト記号($)が表示されたら次に進みます。

開発環境を構築してみよう

ホストマシンでYoctoのi.MX開発環境を構築します。

1.repoユーティリティをインストールします

$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH

コマンドの内容を下記に記載します。

コマンド 内容
mkdir <path> <path>のスワップ領域を無効にする
curl <URL> <path> <path>のディレクトリを削除する
chmod a+x <path> <path>のフルアクセスを設定する
export PATH=<path> PATHに環境変数を設定する

ターミナルにプロンプト記号($)が表示されたら次に進みます。

2.gitをインストールします

$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
$ git config --list

コマンドの内容を下記に記載します。

コマンド 内容
git config --global user.name <name> gitで使用するユーザー名を設定する
git config --global user.email <email> gitで使用するe-mail設定する
git config --list gitで使用するユーザー名、e-mailを確認する

ターミナルにプロンプト記号($)が表示されたら次に進みます。

3.Yoctoをセットアップします

Yoctoをセットアップします。ディレクトリimx-yocto-bspを作成し、この中にYoctoをセットアップします。 https://github.com/nxp-imx/imx-manifest/tree/imx-linux-scarthgap  から使用するマニフェストファイルを選択しダウンロードします。本コラムではimx-6.6.36-2.1.0.xmlを利用します。

$ mkdir imx-yocto-bsp
$ cd imx-yocto-bsp
$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-scarthgap -m imx-6.6.36-2.1.0.xml
$ repo sync

コマンドの内容を下記に記載します。

コマンド 内容
repo Gitを補完する管理ツールです
repo init 現在のディレクトリにRepoをインストールします
–u <url> -u <url> マニフェストリポジトリの取得元URLを指定します
-b <revision> -b <revision> リビジョンを指定します
-m <manifest> -m <manifest> リポジトリ内のマニフェストファイルを選択します
repo sync リモートリポジトリ内のすべてのプロジェクトファイルを同期します

ターミナルにプロンプト記号($)が表示されたら次に進みます。

4.ビルドターゲットとサポートするウィンドシステム(グラフィック機能)を選択します

i.MXには、ビルドイメージのセットアップを簡略化するスクリプトファイル(imx-setup-release.sh)が用意されています。このスクリプトファイルを使用するには、ビルドを行う評価ボードの名称とディストリビュージョンを指定してスクリプトファイルを実行します。

スクリプトファイルで指定できる評価ボードの名称を下記に記載します。

i.MX シリーズ 選択可能な評価ボードの名称
i.MX6 imx6qpsabresd
imx6ulevk
imx6ulz-14x14-evk
imx6ull14x14evk
imx6ull9x9evk
imx6dlsabresd
imx6qsabresd
imx6solosabresd
imx6sxsabresd
imx6sllevk
i.MX7 imx7dsabresd
imx7ulpevk
i.MX8 imx8qmmek
imx8qxpc0mek
imx8mqevk
imx8mm-lpddr4-evk
imx8mm-ddr4-evk
imx8mn-lpddr4-evk
imx8mn-ddr4-evk
imx8mp-lpddr4-evk
imx8mp-ddr4-evk
imx8dxla1-lpddr4-evk
imx8dxlb0-lpddr4-evk
imx8dxlb0-ddr3l-evk
imx8mnddr3levk
imx8ulp-lpddr4-evk
imx8ulp-9x9-lpddr4-evk
i.MX9 imx91-11x11-lpddr4-evk
imx93-11x11-lpddr4x-evk
imx93-14x14-lpddr4x-evk
imx93-9x9-lpddr4-qsb
imx95-19x19-lpddr5-evk
imx95-15x15-lpddr4x-evk
imx95-19x19-verdin

スクリプトファイルで指定できるディストリビューションの名称を下記に記載します。

グラフィック機能 選択可能なディストリビューション
Wayland fsl-imx-wayland
Wayland、 X11
※EGLを使用するX11アプリは使用できません
fsl-imx-xwayland
Frame Buffer
※X11、Waylandは使用できません
※i.MX8、i.MX9は使用できません
fsl-imx-fb

本コラムでは、i.MX8M Plusに対応しているimx8mp-lpddr4-evkとグラフィック機能(Wayland、 X11)を盛り込んだfsl-imx-xwaylandを使用します。

以下のコマンドでスクリプトファイルを実行します。

$ MACHINE=imx8mp-lpddr4-evk DISTRO=fsl-imx-xwayland source ./imx-setup-release.sh -b build

ビルドしてみよう

前項で構築した開発環境でビルド(bitbake)してみます。

1.i.MXのイメージを選択します

Yocto projectは幾つかのイメージを提供しています。これを選択することで必要な機能をビルドしイメージを生成します。

下記にイメージ名称を記載します。

イメージ名称 内容 提供レイヤー
core-image-minimal ターゲットをブートさせるだけのイメージ。 poky
core-image-base ターゲットのハードウェアを完全サポートするコンソール専用のイメージ。 poky
core-image-sato モバイルデバイス用の環境とビジュアルスタイルである Satoのイメージ。
このイメージはSatoテーマをサポートし、Pimlico アプリケーションを使用します。ターミナル、エディター、ファイル マネージャーを含みます。
poky
imx-image-core Waylandに使用するi.MXテスト・アプリケーションを含むi.MXイメージ。 meta-imx/meta-sdk
fsl-image-machine-test コンソール環境を備えたFSLコミュニティi.MXコア・イメージ。
GUIインターフェースはありません。
meta-freescale-distro
imx-image-multimedia Qtコンテンツを含まないGUIを持つi.MXイメージ。 meta-imx/meta-sdk
imx-image-full 機械学習機能を備えたオープンソースのQt6イメージ。
ハードウェア・グラフィックス搭載のi.MX SoCのみサポートされ、i.MX 6UltraLite、i.MX 6UltraLiteLite、i.MX 6SLL、i.MX 7Dual、i.MX 8MNanoLite、i.MX 8DXLではサポートされません。
meta-imx/meta-sdk

イメージは上記のどれを使用しても構いませんが、本コラムでは、imx-image-fullを使用します。

2.ビルド(bitbake)を実行します

$ bitbake imx-image-full

Yoctoではbitbakeコマンドを使用してビルドを実行します。

※ビルドは数十時間がかかることもあります。

コンソール画面に"all succeeded" とメッセージが返ってくれば、ビルド成功となります。

補足情報

ホストマシンの性能にもよりますが、ビルドは数時間~数十時間かかる場合があります。bitbakeコマンドは、デフォルトでホストマシンのマルチコア数と同じスレッドを生成してビルド処理の高速化を図ります。そのため、スレッドごとにメモリを割り当てた際に、メモリ容量が足りなくなると、スワップの発生やビルド生成の順番によってはビルドエラーで処理が止まる場合があります。その場合、4.4項のbitbakeを再度実行するか、ビルド時の並列処理を制限することを推奨します。

並列処理 コマンドオプション 説明 設定例
BB_NUMBER_THREADS 並列処理するスレッド数 2
PARALLEL_MAKE ビルド時に使用するコア数 -j 2

下記はスレッド数を2とした場合の実行コマンドの例です。

$ BB_NUMBER_THREADS=2 bitbake imx-image-full

次回のコラムについて

次回は、本コラムで作成したイメージファイルをi.MX評価ボードに書き込んでみます。

おわりに

今回はi.MXシリーズのYocto開発環境を構築する方法について解説しました。実際に開発環境を構築してみると、よりi.MXシリーズの理解が深まったり、構築手法について細かいところが見えてきたりします。次回のコラムでは、今回の生成したイメージファイルを評価ボードに書込んでみます。
また、ネクスティ エレクトロニクス開発部では、i.MXシリーズを使用した製品開発や技術サポートを行っていますので、お気軽にお問い合わせください。

関連コラム