i.MX6の起動方法
NXP(Freescale)社のSoCであるi.MX6シリーズを起動させるときは、よっぽどのことが無い限りU-Bootを使うと思います。i.MX6は起動デバイスとして、SDカード、QSPI、パラレルNORフラッシュなどをサポートしています。
U-Boot SPLとは
U-Bootは、大きく分けて2つの起動パターンがあります。
- U-Boot
- U-Boot SPL(1段目) + U-Boot(2段目)
一般的には、単一のU-Bootバイナリを利用した起動で問題ないのでそれが使われます。もう一方は、U-Boot SPLと呼ばれるサイズが小さな1段目を起動した後、2段目のU-Boot本体をロード起動する方法です。U-Boot SPLは、単一のU-Bootバイナリを動作させるだけのメモリが電源投入直後は利用できない場合などに使用されます。
他にも、U-Boot SPLから直接Linuxを起動することもできたりしますが、それについては今回割愛します。
i.MX6でU-Boot SPL
i.MX6はSoC内に十分なSRAMを持っているので、SPL起動を利用する意味はないですが、利用することは可能です。簡単なお試し方法と、パラレルNORで試行する際に起きる問題を以下に記載します。
※SDカードやフラッシュへの格納方法の詳細については省略します
SDカード起動で試す
例えばi.MX6 Sabreボードで試すには、以下のコンフィグでU-Bootをビルドすれば試すことができます。
- mx6sabresd_spl_defconfig
ビルドするとSPLというファイル(U-Boot SPL)とu-boot.imgというファイル(2段目本体)ができますので、SDカードに書き込めばOKです。
パラレルNORフラッシュ起動は問題あり
defconfigファイルの設定に
- CONFIG_SPL=y
の指定を追加することでU-Boot SPLのビルドができますが、起動デバイスにNORフラッシュを使う場合はU-Bootのソースコードを修正する必要があります。
修正しない場合は、ロードした2段目U-Boot本体バイナリのヘッダチェックでNGとなり起動処理が停止します。
修正方法
U-Bootのソースに対し修正を行います。
int spl_nor_load_image(void)
{
/*
* Loading of the payload to SDRAM is done with skipping of
* the mkimage header in this SPL NOR driver
*/
+#if !defined(CONFIG_MX6)
spl_image.flags |= SPL_COPY_PAYLOAD_ONLY;
+#endif
/*
* Load real U-Boot from its location in NOR flash to its
* defined location in SDRAM
*/
spl_parse_image_header(
(const struct image_header *)CONFIG_SYS_UBOOT_BASE);
+#if !defined(CONFIG_MX6)
memcpy((void *)spl_image.load_addr,
(void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
spl_image.size);
+#else
+ memcpy((void *)spl_image.load_addr,
+ (void *)(CONFIG_SYS_UBOOT_BASE),
+ spl_image.size);
+#endif
return 0;
}
以上の修正でU-Boot SPLからU-Bootのバイナリが正常に認識され起動できるようになります。