有谁知道从用户空间安装U-boot版本的方法?有fw_printenv命令可以访问U-boot的环境变量,但不能访问版本。
答案 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版本:
查找uboot分区,例如。对于MTD设备:
cat / proc / mtd
/ 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)