Armadilloフォーラム

Armadillo-640のUSBメモリでのアップデート

msasai

2020年3月10日 11時25分

いつもお世話になっております。
佐々井と申します。

現在、Armadillo640について
USBメモリでのアップデートを実施しようとしております。
過去の記事を参考にさせて頂き以下の内容を確認中です。
 参考記事:https://users.atmark-techno.com/forum/armadillo/3951
 ・USBブートの実行(正常動作確認済)
 ・U-bootスクリプトの実行(確認中)
 ・U-bootスクリプトで、USBが接続された際のみUSBブートへ切り替え(未確認)
 ・USBブート後、自動でemmcのイメージ更新(未確認)

この作業の中で、どうしても"U-bootスクリプトの実行"が上手くできません。
実施している環境は以下の通りです。

 基板:Armadillo-640
 U-boot:u-boot-a600-v2018.03-at4
 Linux:linux-v4.14-at11.tar.gz
 Rootfs:at-debian-builder-v1.2.0
 boot.scr:
  Armadillo-640の/bootに格納(uImageとa640.dtbが存在するディレクトリ)に格納
  "echo BootScriptTest!!!"と記載したboot.txtをATDE上で下記コマンドで変換
  mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d boot.txt boot.scr

この環境で、ブートモードを保守モードにして実行しましたが、
"BootScriptTest!!!"というメッセージログが確認できませんでした。

大変御手数ですが、手順などに誤り等ございましたら御指摘くださいませんでしょうか。
よろしくお願い致します。

以上です。

コメント

佐藤です。

標準状態での Armadillo-640 では、boot.scr の実行には対応しておりません。

Armadillo-640 で USBメモリを用いたアップデートであれば、下記の Howto が参考になるかと思います。
※u-boot のバージョンは v2018.03-at5 以降で実施してください。
https://armadillo.atmark-techno.com/howto/usb-update-image-a640

佐々井です。

ご返信頂きありがとうございます。

> 佐藤です。
>
> 標準状態での Armadillo-640 では、boot.scr の実行には対応しておりません。
>
> Armadillo-640 で USBメモリを用いたアップデートであれば、下記の Howto が参考になるかと思います。
> ※u-boot のバージョンは v2018.03-at5 以降で実施してください。
> https://armadillo.atmark-techno.com/howto/usb-update-image-a640

そちらの記事も参照させて頂きましたが、基板にシリアル接続してコマンドを実行する等の特別な操作をせずに
USBメモリのみでイメージのアップデートが行いたいので、boot.scrを実行しX1等と同様の
制御(USBが接続されている場合のみUSBブートに切り替える)を実施したいのですが
それは製品仕様的に困難ということでしょうか?
もし、実行方法がございましたら、ご教授頂ければ幸いです。

佐藤です。

> もし、実行方法がございましたら、ご教授頂ければ幸いです。
次に一例を示します。

u-bootのビルドコンフィギュレーションで以下を有効にします。

[atde7]$ make ARCH=arm menuconfig
Command line interface
 --> [*] Use hush shell
 --> Shell scripting commands
   --> [*] source

ビルドした後、A640に書き込んでください。

u-boot の環境変数を修正します。

=> setenv bootcmd "ext4load mmc 0:2 ${loadaddr} /boot/boot.scr; source;"
=> saveenv

これで、boot を実行したときに、boot.scr が実行されるようになるかと思います。

=> boot
95 bytes read in 54 ms (1000 Bytes/s)                                           
## Executing script at 82000000                                                 
BootScriptTest!!! 

初期状態に戻すには環境変数をリセットしてください。

=> env default -a                                                               
## Resetting to default environment                                             
=> saveenv

佐々井です。

ご返信頂きありがとうございます。

> u-bootのビルドコンフィギュレーションで以下を有効にします。
>

> [atde7]$ make ARCH=arm menuconfig
> Command line interface
>  --> [*] Use hush shell
>  --> Shell scripting commands
>    --> [*] source
> 

> ビルドした後、A640に書き込んでください。
>
> u-boot の環境変数を修正します。
>

> => setenv bootcmd "ext4load mmc 0:2 ${loadaddr} /boot/boot.scr; source;"
> => saveenv
> 

> これで、boot を実行したときに、boot.scr が実行されるようになるかと思います。
>

> => boot
> 95 bytes read in 54 ms (1000 Bytes/s)                                           
> ## Executing script at 82000000                                                 
> BootScriptTest!!! 
> 

> 初期状態に戻すには環境変数をリセットしてください。
>

> => env default -a                                                               
> ## Resetting to default environment                                             
> => saveenv
> 

以上の件、承知致しました。すぐ確認させて頂きます。
また、不明点等ございましたら質問させて頂きます。

以上です。よろしくお願い致します。

いつもお世話になっております。
佐々井と申します。

"BootScriptTest!!!"という出力が確認でき、boot.scrの読み込みを確認できました。
しかし、下記URLのブートスクリプトをそのままコピーさせて頂き、USBブートするかを確認してみた。
https://armadillo.atmark-techno.com/howto/linux-kernel-usbboot

実施結果は以下の通りとなり、シンタックスエラーが発生しました。

=> setenv bootcmd "ext4load mmc 0:2 ${loadaddr} /boot/boot.scr; source;"
=> saveenv
Saving Environment to MMC... Writing to MMC(0)... OK
=> boot
1005 bytes read in 56 ms (16.6 KiB/s)
## Executing script at 82000000
' - try 'help'd '
syntax error
=>

自分の方でもシンタックスエラーの原因を探しているのですが、
大変御手数ですが、お心当たりがございましたら、ご教授頂けませんでしょうか。

以上です。よろしくお願い致します。

佐藤です。

> https://armadillo.atmark-techno.com/howto/linux-kernel-usbboot
>
> 実施結果は以下の通りとなり、シンタックスエラーが発生しました。
上記の boot.scr はあくまでもArmadillo-X1,G3,G3L 向けに書かれたものですので、エラーが発生していると思います。
例えば、${fdt_addr} という環境変数を参照している箇所がありますが、A640 の u-boot ではこの環境変数はデフォルトでは定義されていません。
上記の boot.scr を参考として修正する必要があるかと思います。

いつもお世話になっております。
佐々井と申します。

> 佐藤です。
>
> > https://armadillo.atmark-techno.com/howto/linux-kernel-usbboot
> >
> > 実施結果は以下の通りとなり、シンタックスエラーが発生しました。
> 上記の boot.scr はあくまでもArmadillo-X1,G3,G3L 向けに書かれたものですので、エラーが発生していると思います。
> 例えば、${fdt_addr} という環境変数を参照している箇所がありますが、A640 の u-boot ではこの環境変数はデフォルトでは定義されていません。
> 上記の boot.scr を参考として修正する必要があるかと思います。

現在修正させて頂き、スクリプト直打ちで正常動作を確認できました。御指摘頂きありがとうございました。

setenv get_usbstart usb start
setenv get_usbstop usb stop
setenv get_usbboot_enable fatload usb 0:1 ${loadaddr} usbboot_enable
 
if run get_usbstart; then
 if run get_usbboot_enable; then
  echo try USB boot...
  run get_usbstop
  run usbboot
 else
  echo try MMC boot...
  env default -a
  boot
 fi
else
 echo try MMC boot...
 env default -a
 boot
fi

上記コードで大丈夫でしょうか?何かおかしい点などございましたら御指摘頂けますと幸いです。
また、質問事項ができ次第投稿させて頂きます。

以上です。よろしくお願い致します。

いつもお世話になっております。
佐々井と申します。

以下のスクリプトを作成し、sourceコマンドでboot時に実行しようとしておりますが上手くいきません。

スクリプト内容

setenv get_usbstart usb start
setenv get_usbboot_enable fatload usb 0:1 ${loadaddr} usbboot_enable
 
if run get_usbstart; then
 if run get_usbboot_enable; then
  echo try USB boot...
  usb stop
  run usbboot
 else
  echo try MMC boot...
  usb stop
  setenv boot_cmd "run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/${fdt_file}; bootm ${loadaddr} - 0x83000000;"
  boot
 fi
else
 echo try MMC boot...
 setenv boot_cmd "run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/${fdt_file}; bootm ${loadaddr} - 0x83000000;"
 boot
fi

スクリプト変換コマンド

mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n Armadillo640UpdateScript -d boot.txt boot.scr

スクリプト内容自体は、直に保守モードでコマンドを実行すると正常動作するのですが、
スクリプトファイルにし、sourceコマンドで読み込もうとすると以下のような結果となります。

sourceコマンド実行結果

=> ext4load mmc 0:2 ${loadaddr} /boot/boot.scr
706 bytes read in 57 ms (11.7 KiB/s)
=> source
## Executing script at 82000000
' - try 'help'd '
syntax error

もし誤り等ございましたら、大変御手数ですが御指摘頂けませんでしょうか。
以上です。よろしくお願い致します。

佐藤です。

掲示いただいたスクリプトの

  setenv boot_cmd "run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/${fdt_file}; bootm ${loadaddr} - 0x83000000;"
  boot
 fi
else
 echo try MMC boot...
 setenv boot_cmd "run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/${fdt_file}; bootm ${loadaddr} - 0x83000000;"

こうなっている個所を

  setenv boot_cmd "run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/a640.dtb; bootm ${loadaddr} - 0x83000000;"
  boot
 fi
else
 echo try MMC boot...
 setenv boot_cmd "run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/a640.dtb; bootm ${loadaddr} - 0x83000000;"

と修正するとどうでしょうか。

佐々井と申します。

ご返信ありがとうございます。

御指摘頂きました通り、修正してみましたが結果は以下の通りで変わらずでした。

=> ext4load mmc 0:2 ${loadaddr} /boot/boot.scr
700 bytes read in 56 ms (11.7 KiB/s)
=> source
## Executing script at 82000000
' - try 'help'd '
syntax error
=>

自身の方でも原因箇所について引き続き調査させて頂きます。
また何か心当たり等ございましたら、御指摘頂けますと幸いです。

佐藤です。

こちらでも試してみましたが、エラーにはなりませんでした。
ファイルを添付します。

ファイル ファイルの説明
boot.txt

佐々井です。

ご確認大変ありがとうございます。

すみません。大変初歩的なミスをしておりました。

改行コードがWindows上でテキストファイルを弄っておりましたので
CRLFとなっておりました。LFに直したところ、こちらでも正常動作を確認することができました。

大変お騒がせし、申し訳ございませんでした。
また、不明点等ございましたら、ご連絡させて頂きます。
以上です。よろしくお願い致します。

いつもお世話になっております。
佐々井と申します。

1点質問なのですが、emmcのブートローダ(u-boot.imx)を誤って破損させた場合
(恐らく上書きインストール等している際に電源断等すれば破損する可能性があると思われますが)
復旧の手段等はございますでしょうか?

お手数ですが、ご教授お願い致します。
以上です。

佐藤です。

> 1点質問なのですが、emmcのブートローダ(u-boot.imx)を誤って破損させた場合
> (恐らく上書きインストール等している際に電源断等すれば破損する可能性があると思われますが)
> 復旧の手段等はございますでしょうか?
この場合は、microSD からブートを行い、 emmc にブートローダーを書き込むことで復旧できるかと思います。
・SDブート
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

いつもお世話になっております。
佐々井と申します。

> この場合は、microSD からブートを行い、 emmc にブートローダーを書き込むことで復旧できるかと思います。
> ・SDブート
> https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

確認なのですが、起動デバイス設定ジャンパのJP1、JP2をショートさせた場合、
マイクロSDのブートローダを使用するため、emmcのブートローダが破損していても
大丈夫という理解で正しいでしょうか?

佐藤です。

> 確認なのですが、起動デバイス設定ジャンパのJP1、JP2をショートさせた場合、
> マイクロSDのブートローダを使用するため、emmcのブートローダが破損していても
> 大丈夫という理解で正しいでしょうか?
はい、ご認識のとおりです。

サイト管理者様

私も最近、G3で下記URL参考に行ったところ、ほぼ全く同じエラーにハマりましたが、若干異なります。
直接的な原因は、以下のコードのインデントを「スペース」で作ったことでした。

setenv optargs overlay
mmc dev ${mmcdev};
if mmc rescan; then
 if run loadimage; then
   run mmcboot;
 fi
fi

WindowsのVS Codeで、UTF-8、CRLFで作りましたが、改行コードをLFにしても動かず。
結果的に、上記のインデントを「スペース」ではなく「タブ」で入れると、Shift-JISでもUTF-8でも、CRLFでもLFでも行けました。

なお、こちらでは以下のようなエラーでした

switch to partitions #0, OK
mmc1(part 0) is current device
switch to partitions #0, OK
mmc1(part 0) is current device
reading boot.scr
423 bytes read in 9 ms (45.9 KiB/s)
Running bootscript from mmc ...
## Executing script at 82000000
" not definedcdev
switch to partitions #0, OK
mmc1(part 0) is current device
' - try 'help'd '
" not definedst1
syntax error

下記URLの「2.u-bootコマンドを記述したテキストファイルの作成」に注意事項として、
インデントをタブで入れることを追記して頂けたら幸いです。
https://armadillo.atmark-techno.com/howto/u-boot-script