Получение версии U-boot из Userspace - PullRequest
11 голосов
/ 25 апреля 2011

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

Ответы [ 8 ]

16 голосов
/ 31 июля 2014

Если 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
2 голосов
/ 25 апреля 2011

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

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

1 голос
/ 18 марта 2019

Просто обновление для этого.В нашей версии 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 общедоступной.

1 голос
/ 27 июля 2017

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

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

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

1 голос
/ 31 октября 2013

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

  1. Найти раздел загрузки, например. для устройства MTD:

    cat / proc / mtd

  2. Для / dev / mtd5:

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

1 голос
/ 22 февраля 2012

В моих устройствах 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 /]#
0 голосов
/ 10 августа 2018

Если 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)
0 голосов
/ 21 декабря 2012

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

...