2011-04-25 66 views

回答

2

沒有定義的方式來做到這一點。一旦Linux啓動,u-boot不再運行,並且它的RAM被回收供Linux使用。 Linux甚至不知道u-boot。它也不必由u-boot啓動。

如果你真的想這樣做,唯一的方法就是將u-boot版本添加到內核的命令行中,編寫代碼來掃描u-boot映像在flash中的版本,厲害。

+0

如果沒有明確的方法來做到這一點,有可靠的方法從您啓動的閃存中提取數據。完成這個任務的一個防彈方法是將你的u-boot版本傳給內核(uboot = blah),然後讀取/ proc。如果你想確保你知道你啓動的是哪個版本,而不僅僅是閃存上的內容。 – synthesizerpatel 2014-11-08 01:40:42

1

在我的設備UBOOT自動創建包含其版本「版本」環境變量:

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,但我想,這個變量被傳承下去爲好。也許你的系統中已經有類似的東西了?

UPDATE(2012/5/23): 我添加fw_printenv到我的Linux映像,可以確認的是我看到「版本」變量:

[[email protected] /]# 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 
[[email protected] /]# 
+0

這個「工作正常」,直到你更新你的U-Boot。在那一刻之後,除非你改變了一些環境變量並且從U-Boot提示符中說'保存',否則你將以這種方式得到你的舊版U-Boot的版本。 這是因爲fw_printenv提供對存儲環境的訪問,而不是當前的(您的新U-Boot將放置其版本)。 解決方案是讓你的U-Boot檢查'ver'的存儲值和當前值是否有差異,如果是,則重新刷新環境,但這可能會帶來一些不良影響。 – 2014-09-16 08:15:58

0

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

fw_printenv只是查找printenv分區並轉儲其數據。所以對於普通變量來說是可以的,但對於「ver」變量來說是不正確的,這個變量是動態變量,並且它的值在引導時由u-boot初始化。 u-boot退出後,此變量的值不會保留,除非您手動將其保存到環境中。

例如,我的船上,如果我打印 「版本」 從u-boot提示符變量:

U-Boot >  printenv ver 
ver=U-Boot 2009.11-00393-g5ca9497-dirty (Nov 26 2012 - 11:08:44) 

這是u-boot的真實版,從u-boot的本身來。

現在,如果我啓動我的主板和使用fw_printenv:

[email protected] # 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版本絕對不是一個好主意。

1

嘗試讀取uboot的版本是這樣的:

  1. 查找uboot的分區,如。爲MTD設備:

    執行cat/proc/MTD

  2. 尋找/ dev/mtd5:

    貓的/ dev/mtd5 | hexdump都-C -n 64

14

如果的U-boot位於mtd0,你可以得到的版本信息如下:

[email protected]:/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 
+0

我已經使用了類似的版本,將grep擴展爲更加精確一些,例如'U-Boot [0-9] * \。[0-9] *。* \\(Build。*)'回報較少。如果您對閃存設備上的u-boot映像的位置有一個大致的瞭解,可以對此進行優化。如果你知道事實是它在第一兆字節,你可以使用dd來抽取數據的第一個兆字節,然後在其上運行字符串以節省處理時間。 – synthesizerpatel 2014-11-08 01:38:48

+0

謝謝。使用dd來節省處理時間。 – 2016-10-27 02:02:43

1

alternative solution是直接從U-Boot的閱讀版本二進制文件(甚至可以嵌入到包含其他二進制文件的圖像文件中,例如第一階段引導加載程序),例如mmcblk0boot0爲分區(設備mmcblk0)的引導程序位於:

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

網站不會備註:工作不僅爲Arch Linux的,但如Ubuntu也是如此。