[NXP プロセッサー 初心者ガイド 2] | [NXP プロセッサー 初心者ガイド 4] | ||
NXP プロセッサー 初心者ガイドまとめ | NXP プロセッサー実機検証ガイド まとめ |
もくじ
1. はじめに
NXP 社が提供する i.MX Linux OS BSP(Board Support Package)は、i.MX 開発システム用の U-Boot、Linux Kernel イメージなどの作成に使用できるバイナリーファイル、ソースコード、およびサポートファイルのコレクションです。
Yocto プロジェクトは、これらのイメージをビルドするために選択されるフレームワークですが、他の方法を使用することもできます。
今回は、前回の記事で紹介した方法にてマニュアルでビルドした成果物を使用して、ブート用の SD カードへの書き込みを行い、Linux の起動を確認するまでの手順について紹介します。
事前にこちもご覧ください。
[NXP MPU 初心者ガイド 3] i.MX Linux Kernel と U-Boot を個別 PC 環境下でビルドする方法
参考:i.MX Linux User’s Guide(IMXLUG)
2. SD カードへの各イメージファイルの書き込み
ここでは、ビルドにより生成された各イメージファイルと、RootFs(Root File System)を SD カードへ書き込む方法を説明します。
必要なファイルとして以下のものを準備しておきます。
- ブートローダー・イメージ: flash.bin
- Linux kernel イメージ
- Linux dtb(device tree binary)
- RootFs ファイル
2-1. fdisk による SD カードのパーティション分割とフォーマット
① まず USB SD カードリーダーを準備し、USB SD カードリーダーを介して仮想マシンに接続する
必要があります。
② USB SD カードリーダーに挿入された microSD カードにシステムによって割り当てられたノード
を確認します。
$ cat /proc/partitions
③ マウント状況を確認するには以下のコマンドを使用します。
$ df
挿入された microSD カードにすでにパーティションがある場合、通常、システムはそのパーティションを自動的にマウントするため、パーティションを再分割すると失敗し、そのカードが占有されているというメッセージが表示されます。
【図 14】 microSD カードのマウント状況の確認
④ まずアンマウントします。
$ umount /dev/sdb1
⑤ fdisk でパーティションを分割します。
$ sudo fdisk /dev/sdb
1) 最初のパーティション(パーティション 1)を作成します。
-
-
- 1⃣ p [Enter] キーを入力して、現在のパーティションのステータスを表示します
- 2⃣ d [Enter] キーを入力して、パーティションを削除します
- 3⃣ n [Enter] キーを入力して、新しいパーティションを作成し、パーティションの
パラメータを設定します - 4⃣ p [Enter] キーを入力して、プライマリパーティションを選択します
- 5⃣ 1 [Enter] キーを入力して、パーティション番号に 1 を指定します
- 6⃣ 20480 [Enter] キーを入力して、開始セクターを 20480 に設定します
- 7⃣ 102400 [Enter] キーを入力して、サイズを 102400 セクターに設定します
(102400-20480 * 512 = 40 MB)
-
【図 15】 最初のパーティション(パーティション 1)の作成
2) 2 番目のパーティション(パーティション 2)を作成し、残りの領域をそこに割り当て
ます。
-
-
- 1⃣ p [Enter] キーを入力して、現在のパーティションのステータスを表示します
- 2⃣ n [Enter] キーを入力して、新しいパーティションを作成し、パーティションの
パラメータを設定します - 3⃣ p [Enter] キーを入力して、プライマリパーティションを選択します
- 4⃣ 2 [Enter] キーを入力して、パーティション番号に 2 を指定します
- 5⃣ 1228800 [Enter] キーを入力して、開始セクターを 1228800 に設定します
- 6⃣ [Enter] キーを入力します (62410751-1228800 * 512 = 29.2 GB)
- 7⃣ w [Enter] キーを押してパーティションテーブルを保存し、パーティション分割を完了
します。
-
【図 16】 2 番目のパーティション(パーティション 2)の作成
3) mkfs を使用してパーティション 1 とパーティション 2 をフォーマットします。
-
-
- パーティション 1: boot
boot にパーティション 1 を使用します。VFAT (Virtual FAT) ファイルシステム形式でフォーマットします。
- パーティション 1: boot
-
$ sudo mkfs.vfat -n boot /dev/sdb1
-
-
- パーティション 2: rootfs
この例では、rootfs にパーティション 2 を使用します。ファイルシステム形式 ext3 または ext4 は、ジャーナリング機能が組み込まれているため、リムーバブル・メディアに適したオプションです。この例では ext3 を使用します。
- パーティション 2: rootfs
-
$ sudo mkfs.ext3 -L rootfs /dev/sdb2
【図 17】 パーティション 1 とパーティション 2 のフォーマット
2-2. ブートローダーの書き込み
① mkimage ディレクトリー(flash.bin ブートローダーが配置されているディレクトリー)に切り
替えます。
$ cd ~/uboot-imx/imx-mkimage/iMX8M
② dd を使用してファイルを書き込みます。
生成されたブートイメージを SD カードに書き込むには、以下のコマンドを実行します:
$ sudo dd if=<boot_image> of=/dev/sd<x> bs=1k seek=<offset> conv=fsync
上記のコマンドにおいて、
※ sd<x> は microSD カードのデバイスノードです。
※ <offset> は次のとおりです:
-
-
- 1 - i.MX 6 または i.MX 7 の場合
- 33 - i.MX 8QuadMax A0、i.MX 8QuadXPlus A0、i.MX 8M Quad、i.MX 8M Mini の場合
- 32 - i.MX 8QuadXPlus B0、i.MX 8QuadMax B0、i.MX 8DualX、i.MX 8DXL、i.MX 8M Nano、i.MX 8M Plus、i.MX 8ULP、および i.MX 9 の場合
-
※ <boot_image> は次のとおりです:
-
-
- u-boot.imx - i.MX 6 または i.MX 7 の場合
- flash.bin - i.MX8 の場合
-
例えば、i.MX 8M Plus LPDDR4 EVK(imx8mp-lpddr4-evk)ボードの場合は、以下のコマンドを実行します:
$ sudo dd if=flash.bin of=/dev/sdb bs=1k seek=32 conv=fsync
【図 18】 ブートローダーの書き込み
2-3. Linux kernel イメージと Linux dtb の書き込み
① パーティション 1 をマウントします。
$ cd ~
$ mkdir -p ~/mnt/boot
$ sudo mount /dev/sdb1 ~/mnt/boot
② Linux kernel イメージと Linux dtb を /dev/sdb1(~/mnt)にコピーします。
$ sudo cp ~/linux-imx/arch/arm64/boot/Image ~/mnt/boot
$ sudo cp ~/linux-imx/arch/arm64/boot/dts/freescale/*imx8mp*.dtb ~/mnt/boot
③ umount と sync を実行します。
$ sudo umount ~/mnt/boot
$ sync
【図 19】 Linux kernel イメージと Linux dtb の書き込み
2-4. RootFs の書き込み
① RootFs を準備します。下記説明では NXP HP からダウンロードしたプレビルドイメージを使用しています。こちらからダウンロード可能です。
参考:Embedded Linux for i.MX Applications Processors | NXP Semiconductors
【図 20】 NXP 公式コンパイル済みバージョンを直接ダウンロード
ダウンロードした LF_v6.1.22-2.0.0_images_IMX8MPEVK.zip ファイルを解凍して、
その中にある以下のいずれかを解凍して、rootfs データを microSD カードにコピーします。
-
-
- imx-image-full-imx8mpevk.tar.zst
- imx-image-multimedia-imx8mpevk.tar.zst
-
$ cd Downloads
$ unzip -d LF_v6.1.22-2.0.0_images_IMX8MPEVK LF_v6.1.22-2.0.0_images_IMX8MPEVK.zip
$ cd LF_v6.1.22-2.0.0_images_IMX8MPEVK
【図 21】 LF_v6.1.22-2.0.0_images_IMX8MPEVK.zip ファイルの解凍
② パーティション 2 をマウントします。
$ mkdir -p ~/mnt/rootfs
$ sudo mount /dev/sdb2 ~/mnt/rootfs/
③ アーカイブを解凍します。この例では imx-image-multimedia-imx8mpevk.tar.zst を使用してい
ます。
$ mkdir -p ~/work/rootfs
$ tar -I zstd -xvf imx-image-multimedia-imx8mpevk.tar.zst -C ~/work/rootfs/
④ rootfs データをコピーします。
$ sudo cp -af ~/work/rootfs/* ~/mnt/rootfs
⑤ umount と sync を実行します。
$ sudo umount ~/mnt/rootfs
$ sync
【図 22】 RootFs の書き込み
参考:
RootFs の microSD カードへの書き込みについては、下記ドキュメント・ページも併せてご参照ください。
i.MX Linux User's Guide(IMXLUG) "4.3.6 Copying the root file system (rootfs)"
ポイント: RootFs の /lib/modules ディレクトリー以下には、ドライバーモジュール(.ko)が格納されていますが、自身でビルドしたドライバーモジュールを使用したい場合にはファイルの差し替えが必要になります。ビルド成果物として生成されているドライバーモジュール(.ko)を SD カードの任意の場所へ格納しておき、手動で insmod コマンドを実行する手順でも対応できます。
注記: Linux カーネルのバージョンが異なるとドライバーモジュールは転用できません。カーネルのコンフィグを変更していない限り、通常は insmod コマンド実行時にバージョン不一致のエラーが発生します。
3. SD カードの起動確認
書き込んだ SD カードで起動を確認します。この記事の例では、NXP i.MX8MPlus LPDDR4 EVK board を使用しています。以下に起動ログの抜粋を示します。
U-Boot SPL 2022.04 (Oct 27 2023 - 11:39:23 +0900)
DDRINFO: start DRAM init
DDRINFO: DRAM rate 4000MTS
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
SEC0: RNG instantiated
Normal Boot
Trying to boot from BOOTROM
Boot Stage: Primary boot
image offset 0x8000, pagesize 0x200, ivt offset 0x0
NOTICE: Do not release JR0 to NS as it can be used by HAB
NOTICE: BL31: v2.8(release):automotive-13.0.0_2.1.0-0-g99195a23d-dirty
NOTICE: BL31: Built : 02:57:21, Oct 27 2023
U-Boot 2022.04 (Oct 27 2023 - 11:39:23 +0900)
CPU: i.MX8MP[8] rev1.1 1800 MHz (running at 1200 MHz)
CPU: Commercial temperature grade (0C to 95C) at 30C
Reset cause: POR
Model: NXP i.MX8MPlus LPDDR4 EVK board
DRAM: 6 GiB
TCPC: Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x50]
SNK.Power3.0 on CC1
PDO 0: type 0, 5000 mV, 3000 mA [E]
PDO 1: type 0, 9000 mV, 3000 mA []
PDO 2: type 0, 15000 mV, 3000 mA []
PDO 3: type 0, 20000 mV, 2250 mA []
Requesting PDO 3: 20000 mV, 2250 mA
Source accept request
PD source ready!
tcpc_pd_receive_message: Polling ALERT register, TCPC_ALERT_RX_STATUS bit failed, ret = -62
Power supply on USB2
TCPC: Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C1 0x50]
Core: 196 devices, 30 uclasses, devicetree: separate
MMC: FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... *** Warning - bad CRC, using default environment
[*]-Video Link 0adv7535_mipi2hdmi adv7535@3d: Can't find cec device id=0x3c
fail to probe panel device adv7535@3d
fail to get display timings
probe video device failed, ret -19
[0] lcd-controller@32e80000, video
[1] mipi_dsi@32e60000, video_bridge
[2] adv7535@3d, panel
adv7535_mipi2hdmi adv7535@3d: Can't find cec device id=0x3c
fail to probe panel device adv7535@3d
fail to get display timings
probe video device failed, ret -19
In: serial
Out: serial
Err: serial
SEC0: RNG instantiated
BuildInfo:
- ATF 99195a2
switch to partitions #0, OK
mmc1 is current device
flash target is MMC:1
Net: eth0: ethernet@30be0000, eth1: ethernet@30bf0000 [PRIME]
Fastboot: Normal
Normal Boot
Hit any key to stop autoboot: 0
starting USB...
Bus usb@38100000: Failed to initialize board for imx8m USB
probe failed, error -62
Bus usb@38200000: Register 2000140 NbrPorts 2
Starting the controller
USB XHCI 1.10
scanning bus usb@38200000 for devices... 1 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
Device 0: unknown device
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
86899 bytes read in 7 ms (11.8 MiB/s)
Scanning disk mmc@30b50000.blk...
Scanning disk mmc@30b60000.blk...
Found 22 disks
optee optee: OP-TEE api uid mismatch
Unable to open OP-TEE session (err=-19)
mm_communicate failed!
Error: Cannot initialize UEFI sub-system, r = 3
switch to partitions #0, OK
mmc2(part 0) is current device
Running BSP bootcmd ...
switch to partitions #0, OK
mmc1 is current device
Failed to load 'boot.scr'
32197120 bytes read in 362 ms (84.8 MiB/s)
Booting from mmc ...
86899 bytes read in 7 ms (11.8 MiB/s)
## Flattened Device Tree blob at 43000000
Booting using the fdt blob at 0x43000000
clk usb_phy_root_clk already disabled
Using Device Tree in place at 0000000043000000, end 0000000043018372
adv7535_mipi2hdmi adv7535@3d: Can't find cec device id=0x3c
fail to probe panel device adv7535@3d
fail to get display timings
probe video device failed, ret -19
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[ 0.000000] Linux version 6.1.36 (altsoc@altsoc-VBox20) (aarch64-poky-linux-gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.40.20230119) #1 SMP PREEMPT Fri Oct 27 16:15:29 JST 2023
[ 0.000000] Machine model: NXP i.MX8MPlus EVK board
[ 0.000000] efi: UEFI not found.
[ 0.000000] Reserved memory: created CMA memory pool at 0x00000000c4000000, size 960 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[ 0.000000] Reserved memory: created DMA memory pool at 0x0000000094300000, size 1 MiB
[ 0.000000] OF: reserved mem: initialized node vdev0buffer@94300000, compatible id shared-dma-pool
~(途中省略)~
[ OK ] Started containerd container runtime.
[ OK ] Reached target Multi-User System.
[ 13.283691] platform sound-bt-sco: deferred probe pending
[ OK ] Stopped ISP i.MX 8Mplus daemon.
[ OK ] Started ISP i.MX 8Mplus daemon.
NXP i.MX Release Distro 6.1-mickledore imx8mpevk ttymxc1
imx8mpevk login: root
root@imx8mpevk:~#
4. まとめ
この記事では、自身でビルドしたブートローダーや Linux カーネルイメージをブート用 SD カードイメージへ書き込む方法を紹介しました。
Yocto Project を使用するビルドフロー以外に、前回紹介したマニュアルでのビルド方法と、今回の SD カードへの書き込み方法を理解しておくことで、デバッグ時に U-Boot や Linux カーネルを差し替えて検証を行いたい場合などに役立てられると思います。
[NXP プロセッサー 初心者ガイド 2] | [NXP プロセッサー 初心者ガイド 4] | ||
NXP プロセッサー 初心者ガイドまとめ | NXP プロセッサー実機検証ガイド まとめ |