Armadilloフォーラム

Linux動作中のU-Bootパラメータ変更

tishihara

2021年9月17日 13時55分

下記ブログを参考にして,Linux動作中のU-Bootパラメータ設定を試しています.
 https://armadillo.atmark-techno.com/blog/53/3323

すると,下記のような動作となったのですが,何が原因なのか,どうすれば解消できるか等,ご教授頂けないでしょうか?

(1) fw_setenv後,U-Bootコマンドでsaveenvに失敗する

=> saveenv
Saving Environment to SPI Flash... SF: Detected N25Q64 with page size 256 Bytes, erase size 64 KiB, total 8 MiB
Erasing SPI flash...offset 0xe0000 is protected and cannot be erased
Failed (-22)
Saving Environment to SPI Flash... Erasing SPI flash...offset 0xe0000 is protected and cannot be erased
Failed (-22)

(2) 2回目以降のfw_setenvが正常に動作しない
  (一見正常に終了したように見えるが,反映されていない)

root@armadillo:~# fw_printenv mmcdev
mmcdev=1
root@armadillo:~# fw_setenv mmcdev 0
root@armadillo:~# fw_printenv mc mcdev
mmcdev=0
root@armadillo:~# fw_setenv mmcdev 1
root@armadillo:~# fw_printenv mmcdev
mmcdev=0

【環境】
Armadillo-IoT G3 (AGX3000-C00Z)
※install_disk_sd_jessie_20200720_iotg3.imgによりインストール(Linux3.14で試したいため)

よろしくお願い致します.

コメント

at_koseki

2021年9月29日 22時06分

古関です。

Linux側からu-boot-toolsでsetenvすることで
SPI Flashのsectorがlockされたのかもしれません。

u-bootでunlockしてみるとどうなるか試していただけますでしょうか。
※ 申し訳ありません、こちらでまだ試していません。

=> sf probe
=> sf protect unlock 0xe0000 0x10000
=> saveenv

at_koseki

2021年9月30日 12時51分

古関です。

> (1) fw_setenv後,U-Bootコマンドでsaveenvに失敗する
こちらの環境でも再現しました。

> => sf probe
> => sf protect unlock 0xe0000 0x10000

上記だとunlockできないようです。
u-boot側のSPI Flashドライバーの実装が足りないのかもしれません。。

Linux側からmtd-utilsでunlockしてみると、
u-boot側からもsaveenvできるようになりました。

root@armadillo:~# apt-get install mtd-utils
root@armadillo:~# flash_unlock /dev/mtd0 0xe0000 1

... u-bootへ...

=> saveenv

> (2) 2回目以降のfw_setenvが正常に動作しない
環境も可能な範囲で合わせてみたのですが、
今のところこちらは再現できていません。

install_disk_sd_jessie_20200720_iotg3.imgで初期化

u-boot-toolsのバージョン
root@armadillo:~# dpkg -l |grep u-boot-tools
ii u-boot-tools 2014.10+dfsg1-5 armhf companion tools for Das U-Boot bootloader

tishihara

2021年9月30日 14時49分

古閑さま

ご確認&ご回答,ありがとうございます.

> > (1) fw_setenv後,U-Bootコマンドでsaveenvに失敗する
>
> Linux側からmtd-utilsでunlockしてみると、
> u-boot側からもsaveenvできるようになりました。

ご教授頂いた手順で確認したところ,saveenv は OK となるのですが,Linux起動後に fw_printenv で確認すると,
値が反映されていないようです(saveenvも異様に早く終了する…).

=> setenv mmcdev 0
=> saveenv
Saving Environment to SPI Flash... Erasing SPI flash...Writing to SPI flash...done
OK

 ... Linux起動 ...

root@armadillo:~# fw_printenv mmcdev
mmcdev=1

また,その後,fw_setenv しても,値が反映されていないようです...

root@armadillo:~# fw_setenv mmcdev 0
root@armadillo:~# fw_printenv mmcdev
mmcdev=1

再度,ご確認頂けないでしょうか?

> > (2) 2回目以降のfw_setenvが正常に動作しない
> 環境も可能な範囲で合わせてみたのですが、
> 今のところこちらは再現できていません。

インストールイメージ,u-boot-toolsのバージョンともに,こちらの環境と同じ同じでした.

root@armadillo:~# dpkg -l | grep u-boot-tools
ii  u-boot-tools                  2014.10+dfsg1-5                  armhf        companion tools for Das U-Boot bootloader

上記以外で,こちらの環境で確認すべきことがありましたら,ご連絡をお願いいたします.

at_koseki

2021年9月30日 15時05分

古関です。

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

こちらの環境では問題なくsaveenvした値をfw_printenvで確認できました。
・kernelからfw_saveenv
・u-bootからsaveenvエラー
・kernelからflash_unlock
・u-bootからsaveenv OK
・u-bootからprintenv compare OK
・kernelからfw_printenv compare OK

症状に個体依存性はありますでしょうか?
(Armadillo-IoT G3の個体を変えても同様に問題が起こるか)

個体不良やSPI NOR FlashのErase回数による寿命の可能性を疑っています。

tishihara

2021年9月30日 17時25分

古関さま

早々のご確認,ありがとうございます.
別のArmadillo-IoT G3(ただしAGX3020)で試してみた結果,一度目は値が反映されたのですが,その後は値が反映されませんでした.
また,fw_setenvについても値が反映されないことがありました.
/etc/fw_env.configと別Armadilloでの確認手順を添付しますので,何かまずい個所がありましたら,ご指摘頂けますでしょうか?
なお,saveenvがOKでfw_printenvの比較NGとなった個所に★,fw_setenvがOKでfw_printenv/printenvの比較NGとなった個所に☆を記載しています.

# Configuration file for fw_(printenv/saveenv) utility.
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
#
# XXX this configuration might miss a fifth parameter for the "Number of
# sectors"
 
# MTD device name   Device offset   Env. size   Flash sector size
/dev/mtd0           0xe0000         0x2000      0x10000
ファイル ファイルの説明
別Armadilloでの確認.txt

at_koseki

2021年9月30日 19時55分

古関です。

こちらでも同様の手順を実施したところ
問題が再現できました。
個体依存やハードウェア故障ではなさそうです。
お手数をおかけし、申し訳ありません。

u-boot側からと、kernel側のu-boot-toolsの双方から
setenvすることで、SPI Nor Flashのセクタlock/unlock管理で
不整合が起きるソフトの問題ではと考えていますが、原因を特定できていません。

bootloaderとして書き込んでいるu-bootのベースバージョンが2016.07なのに対して、
debian jessie側のu-boot-toolsは2014.10をベースにしているのも気になっています。

u-boot動作中のenv値はRAM上でも保持しており、printenvはその値を表示しているようです。
saveenv実行のレスポンスが早いときは、
RAM -> SPI NOR Flashへのsyncができていないようです。

また、以下サイトの報告も気になっており、合わせて確認・調査中です。
https://community.nxp.com/t5/i-MX-Processors/i-MX6-Linux-fw-printenv-fw…
https://u-boot.denx.narkive.com/Yicy7TMV/between-2015-10-and-2016-01-sp…

tishihara

2021年10月1日 9時39分

古関さま

問題が再現できたとのこと,了解いたしました.
お手数をおかけしますが,引き続きの調査,よろしくお願いいたします.

tishihara

2021年10月8日 17時35分

古関さま

お忙しいところ恐れ入りますが,本件,どのような状況でしょうか?
よろしくお願いいたします.

at_koseki

2021年10月8日 18時00分

古関です。

申し訳ありません。
現在確認中ですが、詳しい原因は今のところわかっておりません。

tishihara

2021年10月11日 9時27分

古関さま

ご確認頂いている最中とのこと,承知しました.
ありがとうございます.

お忙しいところ恐れ入りますが,引き続き,よろしくお願いいたします.

at_syunya.ohshio

2021年11月12日 18時47分

大塩です。

返答が遅くなり大変申し訳ございません。

調査致しましたので、最初にいただいたご質問に回答いたします。

> 下記のような動作となったのですが,何が原因なのか,どうすれば解消できるか等,ご教授頂けないでしょうか?
> (1) fw_setenv後,U-Bootコマンドでsaveenvに失敗する
> (2) 2回目以降のfw_setenvが正常に動作しない

・原因について
上記現象は「fw_setenv コマンド後に SPI Flash 全体が lock される」ことが原因です。
このため、fw_setenv 以降の saveenvfw_setenv がエラーまたは反映されない状態になっていました。
この lock 処理は u-boot-tools の仕様です。

・解決方法について
以下コマンドで解決可能です。

flash_unlock /dev/mtd2

flash_unlock コマンドの引数に、/dev/mtd2 を指定することで
SPI Flash 全体を unlock できます。
これにより SPI Flash の lock 箇所がなくなり、再度 fw_setenv などが反映されるようになります。

以上を踏まえ、お客様が運用する上では
fw_setenv コマンド後には必ず flash_unlock /dev/mtd2 を実行するようにしてください。

以上です。

tishihara

2021年11月16日 10時41分

大塩さま

お忙しい中,調査して頂き,ありがとうございました.
ご教授頂いた方法について,確かめてみたいと思います.
追って確認結果はご報告したいと思いますが,ひとまず,お礼まで….

tishihara

2021年11月16日 18時31分

大塩さま

fw_setenvコマンド後に必ず”flash_unlock /dev/mtd2"を実施するようにしたところ,問題なく動作することが確認できました.
調査&回避策のご教授,ありがとうございました.
大変助かりました.

今後とも,よろしくお願いいたします.