ユーザースペースからU-bootバージョンをインストールする方法を知っている人はいますか?U-bootの環境変数へのアクセスを提供するfw_printenvコマンドがありますが、バージョンは提供しません。
8 に答える
U-bootがmtd0にある場合、次のようにバージョン情報を取得できます。
root@SUPERWIFI:/proc# strings /dev/mtd0 | grep U-Boot
U-Boot 1.1.4-g1c8343c8-dirty (Feb 28 2014 - 13:56:54)
U-Boot
Now running in RAM - U-Boot at: %08lx
これの単なる更新。U-Bootのバージョンでは、main.cのmain_loop()のコードを次のように変更しました。
#ifdef CONFIG_VERSION_VARIABLE
char *oldver=getenv("ver");
if(oldver==0 ||strcmp(oldver,version_string))
{
setenv("ver", version_string); /* set version variable */
saveenv();
}
#endif /* CONFIG_VERSION_VARIABLE */
したがって、setenv / saveenvは、更新によって必要な場合にのみ呼び出されます。私たちのファームウェアに追加しました
/sbin/fw_printenv -n ver > /var/config/u-boot.ver
u-bootバージョンを公開します。
別の解決策は、u-bootバイナリファイル(たとえば、第1ステージのブートローダーなどの他のバイナリを含むイメージファイルに埋め込むこともできます)から、たとえば(デバイスの)mmcblk0boot0
パーティションとしてブートローダーが存在するバージョンを直接読み取ることです。mmcblk0
sudo grep -a --null-data U-Boot /dev/mmcblk0boot0
サイトノート:Arch Linuxだけでなく、Ubuntuなどでも機能します。
これを行うための定義された方法はありません。Linuxが起動すると、u-bootは実行されなくなり、そのRAMはLinuxで使用できるように再利用されます。Linuxはu-bootについてさえ知りません。また、u-bootで起動する必要もありません。
本当にこれを実行したい場合、それを実行する唯一の方法は、カーネルのコマンドラインにu-bootバージョンを追加するか、フラッシュ内のu-bootイメージをスキャンしてそのバージョンか、さらに厄介なものを探すコードを書くことです。
私のデバイスでは、UBootはそのバージョンを含む「ver」環境変数を自動的に作成します。
U-Boot > printenv
baudrate=115200
ethact=FEC ETHERNET
ethaddr=24-db-ad-00-00-08
bootdelay=3
bootcmd=bootm fc080000 - fc060000
bootargs=console=ttyCPM0,115200n8 rdinit=/sbin/init
stdin=serial
stdout=serial
stderr=serial
ver=U-Boot 2009.03-svn9684 (Mar 08 2010 - 17:08:32)
Environment size: 253/131068 bytes
U-Boot >
私はfw_printenvを使用しませんが、この変数も渡されると思います。たぶん、あなたはすでにあなたのシステムに似たようなものを持っていますか?
更新(2012年5月23日):Linuxイメージにfw_printenvを追加し、「ver」変数が表示されることを確認できます。
[root@ST600 /]# fw_printenv
baudrate=115200
ethact=FEC ETHERNET
ethaddr=24-db-ad-00-00-08
stdin=serial
stdout=serial
stderr=serial
ver=U-Boot 2009.03-svn9684 (Mar 11 2010 - 09:43:08)
bootcmd=bootm fc080000 - fc060000
bootdelay=3
bootargs=console=ttyCPM0,115200n8 rdinit=/sbin/init panic=10 mem=32m
[root@ST600 /]#
次のようにubootバージョンを読み取ってみてください。
たとえば、ubootパーティションを見つけます。MTDデバイスの場合:
cat / proc / mtd
/ dev / mtd5の場合:
cat / dev / mtd5 | hexdump -C -n 64
u-bootのバージョンを知りたい場合は、fw_printenvに依存することはできません。
fw_printenvは、printenvパーティションを検索し、そのデータをダンプします。したがって、通常の変数では問題ありませんが、動的で、起動時にu-bootによって値が初期化される「ver」変数では問題があります。この変数の値は、手動で環境に保存する場合を除いて、u-bootの終了後も残りません。
たとえば、私のボードでは、u-bootプロンプトから「ver」変数を出力すると、次のようになります。
U-Boot > printenv ver
ver=U-Boot 2009.11-00393-g5ca9497-dirty (Nov 26 2012 - 11:08:44)
これはu-bootの実際のバージョンであり、u-boot自体に由来します。
ここで、ボードを起動してfw_printenvを使用すると、次のようになります。
el@board # fw_printenv | grep ver=
ver=U-Boot 2009.11-00323-gbcc6e0e (Sep 21 2012 - 11:07:19)
ご覧のとおり、違います。たまたま自分の環境で「ver」変数が定義されているからです。そして、それは実際のu-bootバージョンと一致しません。
もちろん、u-bootに戻り、「saveenv」を使用して環境の「ver」値を更新することもできます。次に、2つの値が一致します。ただし、u-bootを変更した後は、常に環境を更新する必要があります。
したがって、私の結論は、fw_printenvを使用してu-bootバージョンを取得することは間違いなく良い考えではないということです。
u-bootがMTDパーティションにある場合、これは機能します。
U_BOOT_VER=$(for part in `grep u-boot-[01] /proc/mtd | cut -f 1 -d ':'`; do strings /dev/${part} | grep "^U-Boot.*("; break; done)