Получение версии U-boot из пользовательского пространства
кто-нибудь знает, как установить U-boot версию из пользовательского пространства? Есть fw_printenv команда, которая предоставляет доступ к переменным среды U-boot, но не к версии.
7 ответов
нет определенного способа сделать это. После загрузки Linux u-boot больше не работает, и его ОЗУ восстанавливается для использования Linux. Linux даже не знает об u-boot. Также он не должен быть загружен u-boot.
Если вы действительно хотите это сделать, единственный способ сделать это-добавить версию u-boot в командную строку ядра, написать код для сканирования образа u-boot во flash для его версии или что-то еще более отвратительное.
Если 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
в моих устройствах 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 /]#
попробуйте прочитать версию uboot таким образом:
-
найти раздел uboot, например. для устройства MTD:
cat/proc / mtd
-
для /dev/mtd5:
cat/dev | mtd5 / hexdump-C-n 64
An альтернативный вариант читать версию непосредственно из двоичного файла u-boot (может быть даже встроен в файл изображения, содержащий другие двоичные файлы, а также, например, загрузчик первого этапа), например,mmcblk0boot0
в разделе (Устройства mmcblk0
) загрузчик находится в:
sudo grep -a --null-data U-Boot /dev/mmcblk0boot0
примечание к сайту: работает не только для Arch Linux, но и для Ubuntu.
вы не можете полагаться на 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 версии определенно не является хорошей идеей.
Если 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)