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!!!"というメッセージログが確認できませんでした。
大変御手数ですが、手順などに誤り等ございましたら御指摘くださいませんでしょうか。
よろしくお願い致します。
以上です。
コメント
msasai
佐々井です。
ご返信頂きありがとうございます。
> 佐藤です。
>
> 標準状態での 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ブートに切り替える)を実施したいのですが
それは製品仕様的に困難ということでしょうか?
もし、実行方法がございましたら、ご教授頂ければ幸いです。
at_makoto.sato
佐藤です。
> もし、実行方法がございましたら、ご教授頂ければ幸いです。
次に一例を示します。
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
msasai
佐々井です。
ご返信頂きありがとうございます。
> 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 >
以上の件、承知致しました。すぐ確認させて頂きます。
また、不明点等ございましたら質問させて頂きます。
以上です。よろしくお願い致します。
msasai
いつもお世話になっております。
佐々井と申します。
"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 =>
自分の方でもシンタックスエラーの原因を探しているのですが、
大変御手数ですが、お心当たりがございましたら、ご教授頂けませんでしょうか。
以上です。よろしくお願い致します。
at_makoto.sato
佐藤です。
> https://armadillo.atmark-techno.com/howto/linux-kernel-usbboot
>
> 実施結果は以下の通りとなり、シンタックスエラーが発生しました。
上記の boot.scr はあくまでもArmadillo-X1,G3,G3L 向けに書かれたものですので、エラーが発生していると思います。
例えば、${fdt_addr} という環境変数を参照している箇所がありますが、A640 の u-boot ではこの環境変数はデフォルトでは定義されていません。
上記の boot.scr を参考として修正する必要があるかと思います。
msasai
いつもお世話になっております。
佐々井と申します。
> 佐藤です。
>
> > 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
上記コードで大丈夫でしょうか?何かおかしい点などございましたら御指摘頂けますと幸いです。
また、質問事項ができ次第投稿させて頂きます。
以上です。よろしくお願い致します。
msasai
いつもお世話になっております。
佐々井と申します。
以下のスクリプトを作成し、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
もし誤り等ございましたら、大変御手数ですが御指摘頂けませんでしょうか。
以上です。よろしくお願い致します。
at_makoto.sato
佐藤です。
掲示いただいたスクリプトの
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;"
と修正するとどうでしょうか。
msasai
佐々井と申します。
ご返信ありがとうございます。
御指摘頂きました通り、修正してみましたが結果は以下の通りで変わらずでした。
=> 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 =>
自身の方でも原因箇所について引き続き調査させて頂きます。
また何か心当たり等ございましたら、御指摘頂けますと幸いです。
at_makoto.sato
msasai
msasai
at_makoto.sato
佐藤です。
> 1点質問なのですが、emmcのブートローダ(u-boot.imx)を誤って破損させた場合
> (恐らく上書きインストール等している際に電源断等すれば破損する可能性があると思われますが)
> 復旧の手段等はございますでしょうか?
この場合は、microSD からブートを行い、 emmc にブートローダーを書き込むことで復旧できるかと思います。
・SDブート
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…
msasai
いつもお世話になっております。
佐々井と申します。
> この場合は、microSD からブートを行い、 emmc にブートローダーを書き込むことで復旧できるかと思います。
> ・SDブート
> https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…
確認なのですが、起動デバイス設定ジャンパのJP1、JP2をショートさせた場合、
マイクロSDのブートローダを使用するため、emmcのブートローダが破損していても
大丈夫という理解で正しいでしょうか?
at_makoto.sato
oshiro
サイト管理者様
私も最近、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
at_makoto.sato
2020年3月10日 16時34分
佐藤です。
標準状態での Armadillo-640 では、boot.scr の実行には対応しておりません。
Armadillo-640 で USBメモリを用いたアップデートであれば、下記の Howto が参考になるかと思います。
※u-boot のバージョンは v2018.03-at5 以降で実施してください。
https://armadillo.atmark-techno.com/howto/usb-update-image-a640