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

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

Ответ 1

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

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

Ответ 2

Если 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

Ответ 3

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

ОБНОВЛЕНИЕ (5/23/2012): Я добавил fw_printenv к своему изображению linux и могу подтвердить, что вижу переменную "ver":

[[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] /]#

Ответ 4

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

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

    cat/proc/mtd

  • Для/dev/mtd5:

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

Ответ 5

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

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

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

Ответ 6

Вы не можете полагаться на 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:

[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 определенно не является хорошей идеей.