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

时间:2011-04-25 18:35:42

标签: embedded-linux u-boot

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

8 个答案:

答案 0 :(得分: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 :(得分:2)

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

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

答案 2 :(得分: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 /]#

答案 3 :(得分:1)

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

  1. 查找uboot分区,例如。对于MTD设备:

    cat / proc / mtd

  2. / dev / mtd5:

    cat / dev / mtd5 | hexdump -C -n 64

答案 4 :(得分:1)

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

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

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

答案 5 :(得分: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版本。

答案 6 :(得分: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版本绝对不是一个好主意。

答案 7 :(得分: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)