Получение версии U-boot из пользовательского пространства

Кто-нибудь знает способ установить версию U-boot из пользовательского пространства? Существует команда fw_printenv, которая обеспечивает доступ к переменным среды U-boot, но не та версия.


person waffleman    schedule 25.04.2011    source источник


Ответы (8)


Нет определенного способа сделать это. После загрузки Linux u-boot больше не работает, и его оперативная память освобождается для использования Linux. Linux даже не знает о u-boot. И при этом он не должен быть загружен u-boot.

Если вы действительно хотите это сделать, единственный способ сделать это — добавить версию u-boot в командную строку ядра, написать код для сканирования образа u-boot во флэш-памяти на предмет его версии или что-то еще более неприятное.

person JayM    schedule 25.04.2011
comment
Там, где нет определенного способа сделать это, есть надежные способы извлечения данных из флэш-памяти, с которой вы загрузились. Надежный способ добиться этого — передать вашу версию u-boot ядру (uboot=blah), а затем прочитать /proc. Если вы хотите убедиться, что вы точно знаете, с какой версией вы загрузились, а не только то, что на флэш-памяти. - person synthesizerpatel; 08.11.2014
comment
Не согласен, если u-boot все-таки смонтированный раздел, то можно извлечь из него эту инфу строками. Может быть, не стандартно, но выполнимо для большинства. - person Nimjox; 10.08.2018

Если 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
person SHI Shougang    schedule 31.07.2014
comment
Я использовал аналогичную версию этого, расширив grep, чтобы он был немного более точным, например, «U-Boot [0-9]*\.[0-9]*.*\(Build.*)», чтобы возвращать меньше . Это можно оптимизировать, если у вас есть общее представление о том, где находится ваш образ u-boot на флэш-устройстве. Если вы точно знаете, что он находится в первом мегабайте, вы можете использовать dd для перекачивания первого мегабайта данных, прежде чем запускать на нем строки, чтобы сэкономить время обработки. - person synthesizerpatel; 08.11.2014
comment
Спасибо. Используйте dd для экономии времени обработки. - person SHI Shougang; 27.10.2016

альтернативное решение — прочитать версию непосредственно из u-boot. двоичный файл (может быть даже встроен в файл изображения, содержащий другие двоичные файлы, а также, например, загрузчик первого этапа) с, например. mmcblk0boot0 как раздел (устройства mmcblk0), в котором находится загрузчик:

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

Примечание к сайту: работает не только для Arch Linux, но, например. Убунту тоже.

person thinwybk    schedule 27.07.2017

Как раз обновление для этого. В нашей версии U-Boot мы изменили код main_loop() в main.c на этот:

#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.

person bassklampfe    schedule 18.03.2019

В моих устройствах 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, но могу предположить, что эта переменная тоже передается. Может быть, у вас уже есть что-то подобное в вашей системе?

ОБНОВЛЕНИЕ (23.05.2012): я добавил 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 /]#
person mikhail    schedule 22.02.2012
comment
Это работает нормально, пока вы не обновите свой U-Boot. После этого момента, если вы не измените некоторые переменные среды и не скажете «сохранить» из подсказки U-Boot, вы таким образом получите свою старую версию U-Boot. Это потому, что fw_printenv предоставляет доступ к сохраненной среде, а не к текущей (куда ваш новый U-Boot положит свою версию). Решение состоит в том, чтобы заставить ваш U-Boot проверять, различаются ли сохраненные и текущие значения для «ver», и перепрошивать среду, если это так, но это также может привести к некоторым нежелательным эффектам. - person Alexander Amelkin; 16.09.2014
comment
Вы также должны убедиться, что U-Boot собран с CONFIG_VERSION_VARIABLE=y, чтобы ver отображалось в среде. - person remcycles; 07.07.2018

Попробуйте прочитать версию uboot следующим образом:

  1. Найдите раздел uboot, например. для устройства МПД:

    кот /прок/мтд

  2. Для /dev/mtd5:

    кот /dev/mtd5 | шестнадцатеричный дамп -C -n 64

person chmurli    schedule 31.10.2013

Вы не можете полагаться на fw_printenv, если хотите узнать версию u-boot.

fw_printenv просто ищет раздел printenv и выгружает его данные. Таким образом, это нормально для обычных переменных, но не подходит для переменной «ver», которая является динамической и значение которой инициализируется u-boot при загрузке. Значение этой переменной не сохраняется после выхода из u-boot, кроме случаев, когда вы вручную сохраняете его в среду.

Например, на моей плате, если я напечатаю переменную «ver» из приглашения 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:

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 определенно не очень хорошая идея.

person elboulangero    schedule 21.12.2012

Если 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)
person Nimjox    schedule 10.08.2018