Armadilloフォーラム

SDブートが出来ない

nemo

2021年12月16日 22時36分

何時もお世話になっております。
根本と言います。

Armadillo 640 のマニュアル 第12章を読んでSD作成してブートを行いたいのですが

https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

上手く起動しません。
U-bootのメッセージは以下の様になっています。
SDは認識しているのですが。ファイルがないと言われてしまいます。
PCでmountして/dev/sdb1 を見るとあるのですが。
違うとは思いますが。マニュアル12.3章ではカーネルの検出可能条件がext4になって
いるのですが。 12.1.1章ではカーネルを格納する/dev/sdb1はvfatで作成しています。

SD作成時のログをSD作成.txtとして添付しました。

起動しない原因調査方法を教えて頂けたら助かります。
宜しくお願い致します。

===U-BOOTメッセージ===

U-Boot 2018.03-at10 (Nov 24 2021 - 17:31:46 +0900)

CPU: Freescale i.MX6ULL rev1.0 at 396 MHz
Reset cause: POR
I2C: ready
DRAM: 512 MiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
PMIC: PFUZE3000 DEV_ID=0x30 REV_ID=0x11
Net: FEC
=> mmc dev 1
switch to partitions #0, OK
mmc1 is current device
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 2
OEM: 544d
Name: SA04G
Bus Speed: 50000000
Mode : SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 3.6 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
=> setenv bootcmd ext4load mmc 1:2 \${loadaddr} /boot/uImage\; ext4load mmc 1:2 0x83000000 /boot/a640.dtb\; bootm \${loadaddr} - 0x83000000\;
=> setenv bootargs root=/dev/mmcblk1p2 rootwait
=> saveenv
Saving Environment to MMC... Writing to MMC(0)... OK
=> boot
** File not found /boot/uImage **
** File not found /boot/a640.dtb **
Wrong Image Format for bootm command
ERROR: can't get kernel image!
=>

以上

ファイル ファイルの説明
sd作成.txt SD作成時のログ
コメント

at_shiita.ishigaki

2021年12月17日 9時43分

石垣です。

> https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

参照しているマニュアルが古いので、下記URLから最新のマニュアルをご覧ください。
https://armadillo.atmark-techno.com/resources/documents/armadillo-640/m…

現在のマニュアルでは、Linuxカーネルイメージをブートディスクの第2パーティションに配置するようになっております。
こちらのマニュアルに記載されている手順を再度実行して頂ければ、SDブートが行えると思います。
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

> SD作成時のログをSD作成.txtとして添付しました。

添付して頂いたテキストファイルでmkfs.vfatを行う際、フォーマット先が/dev/sdb!となっていますので、
おそらくタイプミスだと思いますが、正しくは/dev/sdb1となります。

石垣様 ありがとうございました。
根本です。

無事SDから立ち上がりました。
ありがとうございました。

一つ教えて頂きたいのですが。
SDをセットしてJP1 JP2 をショートして電源を入れた時の
U-BOOTは基板上のU-BOOTが立ち上がるのでしょうか?

以上

at_shiita.ishigaki

2021年12月17日 13時34分

石垣です。

> SDをセットしてJP1 JP2 をショートして電源を入れた時の
> U-BOOTは基板上のU-BOOTが立ち上がるのでしょうか?

いいえ、JP1、JP2をショートした状態で電源を投入した場合は、まずSDカード上のu-bootを読み込みます。
SDカード上にu-bootがない場合は、eMMC上のu-bootを読み込みに行きます。

石垣様 お忙しい中ご指導ありがとうございます。
根本です。
了解しました。

と言う事は
SDをセットしてJP1 JP2をショートさせて電源投入後に
SD起動用にU-BOOTの設定を行って設定書き込み後にSDのOS起動して電源OFF後に

SDを抜いてJP1 JP2のショートピンを外して電源を投入して
起動させればU-BOOTの設定を変更せずそのまま基板上のOSが起動。

(これが上手く行きません設定をデフォルトに戻さないとOSが起動しません)

再度SDを挿入してJP1 JP2をショートさせて設定なしで起動させればSDのOSが起動。

となるわけでしょうか。
これが上手く行ってないのはSDのU-BOOTの書き込みが上手く行っていないと言う事でしょうか。

以上

at_shiita.ishigaki

2021年12月17日 16時34分

石垣です。

> SDを抜いてJP1 JP2のショートピンを外して電源を投入して
> 起動させればU-BOOTの設定を変更せずそのまま基板上のOSが起動。
>
> (これが上手く行きません設定をデフォルトに戻さないとOSが起動しません)

SDブートを行うために、以下のコマンドを実行したと思います。

=> setenv bootcmd run setup_mmcargs\; ext4load mmc 1:2 \${loadaddr} /boot/uImage\; ext4load mmc 1:2 0x83000000 /boot/a640.dtb\; bootm \${loadaddr} - 0x83000000\; 
=> saveenv 

このコマンドは、u-bootがSDカード上の Linux カーネルイメージと DTB を使用するように設定しています。
この設定はeMMCに保存されます。
u-bootをeMMCとSDカードどちらから起動してもこの設定はeMMCから読み出します。
ですので、SDカードを抜き、JP1、JP2をショートさせずに電源を投入した場合(=eMMCから起動)でも、
u-bootはSDカード上のLinux カーネルイメージと DTBを参照しています。
しかし、SDカードが挿入されていないため、参照先が見つからず起動に失敗します。

ですので、eMMCから起動する場合は以下のコマンドを実行して、環境変数を初期化してください。

=> env default bootcmd setup_mmcargs
=> saveenv

中村です。
横から失礼します。

> ですので、eMMCから起動する場合は以下のコマンドを実行して、環境変数を初期化してください。
>

> => env default bootcmd setup_mmcargs
> => saveenv
> 

SDカードのu-bootのソースを修正して、
デフォルト環境変数にSDブート用の設定を埋め込んででしまえば、
環境変数の設定変更をすることなくSDブートとeMMCブートを切り替えられます。

具体的な方法ここ(↓)に。
[Armadillo-640:SDブート起動用の環境変数設定済みのU-boot作成方法]
https://armadillo.atmark-techno.com/blog/615/3971

--
なかむら

中村様

お忙しい中ありがとうございます。
根本です。

ありがとうございます。
このソース修正をすればSD起動時にU-BOOTの設定をしても基板のU-BOOTの設定は
変更されない訳ですね。また、一度SDでU-BOOTの設定を行えば以後
JP1 JP2をショートしただけでSDから起動される訳ですね。
想像ですがインストールディスクの起動のU-BOOTも同じ修正をされてるんでしょうね。

マニュアルの"10.1. ブートローダーをビルドする"も読んで修正U-BOOTでテストしてみたいと思います。
ありがとうございました。

根本

中村です。

> このソース修正をすればSD起動時にU-BOOTの設定をしても基板のU-BOOTの設定は
> 変更されない訳ですね。また、一度SDでU-BOOTの設定を行えば以後

JPの設定でSDカードから起動するときに、eMMC上のU-BOOT用の環境変数に
何も設定がされていなければU-BOOT埋め込みのデフォルト環境変数が使用されます。
そのデフォルトの環境変数に「SDカードからブートするんだよ」という設定を
埋め込んでおくというものです。

> 想像ですがインストールディスクの起動のU-BOOTも同じ修正をされてるんでしょうね。

推測ですけど、アットマークテクノさんが提供しているインストールディスクは、
U-BOOT用の環境変数に何か設定がされていてもそれを使わない、
というようなU-BOOTが入っているのだと思います。

そのような(eMMCのU-BOOT用の環境変数を読み込まない)U-BOOTを作る方法は、
だいぶ前の私の投稿に書いてありますので、それも参考にしてみてください。
https://armadillo.atmark-techno.com/forum/armadillo/3784#comment-6735

--
なかむら

中村様

ありがとうございます。
根本です。
キチンと理解していませんでした。
設定をなにも変更しないでSDブートが出来ると便利ですね。

これが出来るとアプリの書き換えがLinuxの知識が全くない方でも基板上にROMのアプリの入れ替えがSDを刺した
だけで出来る様な仕掛けを作る事が出来るんですよね。

ところが今教えて頂いたヘッダファイルを修正しようとしたのですがソースが変更されていて
ドキュメント通りに出来ないで悩んでおります。最新のソースは以下の様になっていました。

#define CONFIG_BOOTCOMMAND \
"run setup_mmcargs; ext4load mmc " MMCDEV ":2 ${loadaddr} /boot/uImage; ext4load mmc " MMCDEV ":2 0x83000000 /boot/${fdt_file}; bootm ${loadaddr} - 0x83000000;"
#define CONFIG_EXTRA_ENV_SETTINGS \
"setup_mmcargs=setenv bootargs root=/dev/mmcblk" MMCDEV "p2 rootwait ${optargs};\0"\

すみません。基本的な知識がなくって。

根本

中村です。

> これが出来るとアプリの書き換えがLinuxの知識が全くない方でも基板上にROMのアプリの入れ替えがSDを刺した
> だけで出来る様な仕掛けを作る事が出来るんですよね。

SDブートの方に起動時に自動で何かするようなスクリプトなどを書いておけば、
A640本体のROM(eMMC)の一部書き換えなど、いろいろなことができると思います。

> ところが今教えて頂いたヘッダファイルを修正しようとしたのですがソースが変更されていて
> ドキュメント通りに出来ないで悩んでおります。最新のソースは以下の様になっていました。
>
> #define CONFIG_BOOTCOMMAND \
> "run setup_mmcargs; ext4load mmc " MMCDEV ":2 ${loadaddr} /boot/uImage; ext4load mmc " MMCDEV ":2 0x83000000 /boot/${fdt_file}; bootm ${loadaddr} - 0x83000000;"
> #define CONFIG_EXTRA_ENV_SETTINGS \
> "setup_mmcargs=setenv bootargs root=/dev/mmcblk" MMCDEV "p2 rootwait ${optargs};\0"\

MMCDEVの3箇所ですね。
調べてみました。

at8からat9になったときにこの部分が変更になっていました。
これはArmadillo-IoTA6対応だと思います。
Armadillo-IoTA6はU-BOOTの環境変数の設定変更をせずに、
A6本体のスライドスイッチを変更するだけでeMMCブートと
SDカードブートを切り替えできるようになっていて、これのようです。
(A6のときには起動時にハードウェア設定をGPIOで読み込んで、
このMMCDEVの部分を自動で"0"または"1"に切り替えるようになっています)

U-BOOTのソース、armadillo-640.hのその部分のすぐ上に

#ifdef CONFIG_SYS_BOOT_DEVICE_SELECT
#define MMCDEV "${mmcdev}"
#else
#define MMCDEV "0"
#endif

というのがあって、U-BOOTのコンフィグレーションで
SYS_BOOT_DEVICE_SELECTが有効になっていないとき(無効のとき)には、
MMCDEVは"0"に置き換えられ、その部分は"0:2"や"/dev/mmcblk0p2"となり、
以前のもの(at8以前)と同じになります。

SYS_BOOT_DEVICE_SELECTの設定は、
IOTA6では有効、A640では無効になってるようです。

このような実装となっていますので、A640決め打ちでソース修正をするならば、
[Armadillo-640:SDブート起動用の環境変数設定済みのU-boot作成方法]
https://armadillo.atmark-techno.com/blog/615/3971
に説明されているように、つまり、

#define CONFIG_BOOTCOMMAND \
    "run setup_mmcargs; ext4load mmc 1:2 ${loadaddr} /boot/uImage; ext4load mmc 1:2 0x83000000 /boot/a640.dtb; bootm ${loadaddr} - 0x83000000;"
#define CONFIG_EXTRA_ENV_SETTINGS \
    "setup_mmcargs=setenv bootargs root=/dev/mmcblk1p2 rootwait ${optargs};\0"\

のように修正すればいいと思います。

--
なかむら

中村様

お忙しい中ありがとうございました。
根本です。

ヘッダファイルを修正してU-BOOTのコマンドbootだけで
SDから起動出来ました。

ありがとうございました。
これからもご指導宜しくお願い致します。

根本

石垣様

根本です。
お忙しいなご指導ありがとうございました。
やっと理解でしかした。
ありがとうございました。

根本