从用户空间获取U-boot的版本

问题描述 投票:11回答:8

有谁知道从用户空间安装U-boot版本的方法?有fw_printenv命令可以访问U-boot的环境变量,但不能访问版本。

embedded-linux u-boot
8个回答
2
投票

没有明确的方法来做到这一点。一旦Linux启动,u-boot就不再运行了,它的RAM被回收用于Linux。 Linux甚至不知道u-boot。它也不必由u-boot启动。

如果你真的想这样做,唯一的办法就是将u-boot版本添加到内核的命令行,编写代码来扫描flash中的u-boot映像以获取它的版本,或者更糟糕的东西。


16
投票

如果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

1
投票

在我的设备中,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日):我将fw_printenv添加到我的linux映像,并确认我确实看到了“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 /]#

1
投票

尝试以这种方式阅读uboot版本:

  1. 找到uboot分区,例如。对于MTD设备: cat / proc / mtd
  2. 对于/ dev / mtd5: cat / dev / mtd5 | hexdump -C -n 64

1
投票

alternative solution是直接从u-boot二进制文件读取版本(甚至可以嵌入包含其他二进制文件的图像文件中,例如第一阶段引导加载程序),例如, mmcblk0boot0作为分区(设备mmcblk0)引导加载程序驻留在:

sudo grep -a --null-data U-Boot /dev/mmcblk0boot0

网站说明:不仅适用于Arch Linux,还适用于Ubuntu也是如此。


1
投票

只是对此的更新。在我们的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版本公开可用。


0
投票

如果你想知道u-boot版本,你不能依赖fw_printenv。

fw_printenv只查找printenv分区并转储其数据。所以对于普通变量是可以的,但是对于“ver”变量是不行的,它是动态的,并且当它引导时由u-boot初始化它的值。除非您手动将其保存到环境中,否则在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”值。然后两个值匹配。但是,我应该在更改u-boot后更新环境。

所以,我的结论是使用fw_printenv获取u-boot版本绝对不是一个好主意。


0
投票

如果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)
© www.soinside.com 2019 - 2024. All rights reserved.