Инструменты пользователя

Инструменты сайта


загрузка:u-boot

U-Boot

Поддержка устройств Sunxi все чаще из U-Boot. Эта страница описывает эту поддержку. Чтобы узнать, поддерживается ли ваше устройство в U-Boot, зайдите на соответствующую страницу устройства. Вот список всех устройств, поддерживающих mainline U-Boot.

А список изменений здесь. Есть отдельная страница для старой ветки Sunxi U-Boot. Этот документ в основном для 32-битного устройства ARM. Различия для ARM64 упоминаются только в разделе Compile U-Boot. Для получения дополнительной информации см. board/sunxi/README.sunxi64 в источниках uboot.

Таблица статусов

Цель этой таблицы - дать представление о работе каждого SoC, над которым работает linux-sunxi.

Model F1C-100s A10 A10s A13 R8 A20 A23 A31 A33 R16 A64 A80 A83T GR8 H3 H5 H6 R40 T3
MMC ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
USB ? ? ? ? ? ? ? ? ? NO ? ? ? ? ? ?
NET ? ? ? ? ? ? ? ? ? NO ? ? ? ? NO ?
  • MMC для возможности загрузки с SD-карты
  • USB - это возможность подключения USB-устройств (например, Ethernet-флешки)
  • NET это возможность загрузки с TFTP

Конфигурирование U-Boot

Установка инструментов

Если вы еще этого не сделали, установите подходящий набор инструментов и добавьте ее в PATH. Вам также может понадобиться добавить несколько дополнительных пакетов для сборки U-Boot:

apt-get install swig python-dev

Установка компилятора дерева устройств

В зависимости от предпочтительной версии U-Boot, потребуется достаточно обновленная версия dtc. (Процесс сборки выдаст ошибку на устаревшем dtc и попросит вас обновить её.) Установка dtc описана в статье.

Если вы хотите собирать ядро ​​Linux вместе с U-Boot, тогда стоит также изучить исходные коды ядра - так как они поставляются с dtc, которые находятся в директории ${KERNEL_DIR}/scripts/dtc/.

Клонирование репозитория

Вы можете склонировать репозиторий u-boot, выполнив:

git clone git://git.denx.de/u-boot.git

Вы должны использовать стабильный выпуск, если вы не тестируете недавно добавленные платы или экспериментальные функции, которые еще не вошли в стабильный выпуск:

git checkout v2019.10 # or whatever is latest

Определить цель сборки

Перейдите в дерево u-boot и найдите в каталоге config/ вашу плату, имя файла выглядит как <board_name>_defconfig. К примеру, если ваше устройство - Cubieboard2, ваша цель сборки - Cubieboard2_defconfig.

Сборка

Arm Trusted Firmware (arm64)

Чтобы создать U-Boot для устройства arm64, сначала необходимо создать Arm Trusted Firmware (ATF). Измените <platform> в соответствии с вашими потребностями. PLAT = sun50i_a64, например, подходит для устройств H5 и A64. (См. Board/sunxi/README.sunxi64 в источниках uboot для получения дополнительной информации.)

git clone https://github.com/ARM-software/arm-trusted-firmware.git
cd arm-trusted-firmware
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=<platform> DEBUG=1 bl31

Когда вы определили, что <board_name>, просто настройте U-Boot с подходящей конфигурацией по умолчанию. Используйте menuconfing, чтобы поиграть с настройками, если вам это нравится, а затем просто создайте его:

armhf

make CROSS_COMPILE=arm-linux-gnueabihf- <board_name>_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make CROSS_COMPILE=arm-linux-gnueabihf-

arm64

make CROSS_COMPILE=aarch64-linux-gnu- BL31=<path_to_arm-trusted-firmware>/build/sun50i_a64/debug/bl31.bin  <board_name>_defconfig
make CROSS_COMPILE=aarch64-linux-gnu- BL31=<path_to_arm-trusted-firmware>/build/sun50i_a64/debug/bl31.bin menuconfig
make CROSS_COMPILE=aarch64-linux-gnu- BL31=<path_to_arm-trusted-firmware>/build/sun50i_a64/debug/bl31.bin

(При компиляции на изначальной платформе опустите CROSS_COMPILE =…)

Когда сборка будет завершена, в вашем дереве u-boot будет доступен файл u-boot-sunxi-with-spl.bin. На этапе установки будет указано, как установить его на установочный носитель (например, на SD-карту), но сначала необходимо настроить U-Boot.

Конфигурирование U-Boot

В этой статье представлен набор различных сценариев загрузки с U-Boot.

Загрузка

Чтобы загрузить эти биты на аппаратное обеспечение, пожалуйста, обратитесь к соответствующей инструкции:

Загрузка используя boot.cmd

Для загрузки с SD при помощи mainline U-Boot, рекомендуемый способ:

  • создайте в первом разделе файл boot.cmd (также проверьте аргументы ядра для дополнительных параметров 'bootargs'):

mainline kernel

setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
load mmc 0:1 0x43000000 ${fdtfile} || load mmc 0:1 0x43000000 boot/${fdtfile}
load mmc 0:1 0x42000000 uImage || load mmc 0:1 0x42000000 boot/uImage
bootm 0x42000000 - 0x43000000

sunxi-3.4 kernel

setenv bootm_boot_mode sec
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
load mmc 0:1 0x43000000 script.bin || load mmc 0:1 0x43000000 boot/script.bin
load mmc 0:1 0x42000000 uImage || load mmc 0:1 0x42000000 boot/uImage
bootm 0x42000000
  • Если вы также хотите использовать initramfs, пожалуйста, обратитесь к статье Initial Ramdisk за подробностями.
    • Если вам интересно, почему установка bootm_boot_mode может быть необходима для старых ядер, взгляните на подробности PSCI.
    • Примечание. Непосредственное использование zImage также поддерживается U-Boot для платформы Sunxi. Замените zImage вместо uImage в приведенных выше командах, а затем используйте команду bootz вместо bootm.
    • Примечание. Чтобы загрузить только что созданное ядро ​​arm64, не забудьте использовать Image вместо uImage / zImage. Вы также должны загрузить его с помощью booti вместо bootm / bootz. Таким образом, вы должны принять соответствующие строки в файле boot.cmd.
  • boot.cmd не используется напрямую, но его нужно обернуть заголовком uboot с помощью команды:
mkimage -C none -A arm -T script -d boot.cmd boot.scr

Загрузка с extlinux.conf

Mainline U-Boot также использует syslinux/extlinux в качестве полезной нагрузки. Вам необходимо установить загрузочный файл конфигурации extlinux.conf в раздел ext2/3/4 на SD-карте, и U-Boot найдет и использует его. Это концептуально идентично созданию файла конфигурации GRUB на настольном ПК.

Пример extlinux.conf:

TIMEOUT 100
DEFAULT default
MENU TITLE Boot menu

LABEL default
	MENU LABEL Default
        LINUX /zImage
        FDT /sun4i-a10-marsboard.dtb
        APPEND root=/dev/sda1 rootwait console=tty0 console=ttyS0,115200n8

LABEL exit
	MENU LABEL Local boot script (boot.scr)
        LOCALBOOT 1

Установка переменных среды u-boot

Существует разница в настройке переменных среды между сценарием загрузки и оболочкой U-Boot. Внутри оболочки вы бы установили, например:

setenv root /dev/sda1

Но в сценарии вы бы использовали:

root=/dev/sda1

NAND

Пример среды U-Boot, найденный в uEnv.txt из стандартного раздела android-а.

bootdelay=0
bootcmd=run setargs boot_normal
console=ttyS0,115200
nand_root=/dev/nandc
mmc_root=/dev/mmcblk0p4
init=/init
loglevel=8
setargs=setenv bootargs console=${console} root=${nand_root} init=${init} loglevel=${loglevel}
boot_normal=nand read 40007800 boot;boota 40007800
boot_recovery=nand read 40007800 recovery;boota 40007800
boot_fastboot=fastboot

NFS

Последние версии U-Boot могут загружаться как с NFS, так и с TFTP, но вам нужно избавиться от автоматической загрузки по FTP. Для получения дополнительной информации читайте здесь.

  • Примечание: на cubieboards платах на основе A20 этот функционал работает только на стабильном ядре.

FB консоль

Чтобы получить вывод U-Boot, показанный во встроенном framebuffer драйвере (в настоящее время HDMI только в разрешении 1024×768), добавьте следующее в свой boot.cmd:

setenv stdout=serial,vga
setenv stderr=serial,vga

В среде по умолчанию эти значения также установлены.

LCD настройки

Существует отдельная вики-страница о настройке LCD в U-Boot.

Установка U-Boot

  • Преобразуйте boot.cmd в boot.scr, используя mkimage:

armhf

mkimage -C none -A arm -T script -d boot.cmd boot.scr

arm64

mkimage -C none -A arm64 -T script -d boot.cmd boot.scr
  • Скопируйте загрузчик на установочный носитель
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
  • скопировать файлы ядра в первый раздел
    • Для ядра версии 3.4 вам нужны uImage (ядро Linux) и script.bin (двоичное представление FEX).
    • Для ядра на основе дерева устройств («mainline», 4.x) вам необходим образ ядра (uImage, zImage или Image) и файл .dtb для конкретного устройства (тот, на который есть ссылка в ${fdtfile} выше), который генерируется как часть вашей сборки ядра.

Посмотрите Руководство по сборке для более подробной информации.

Поиск проблем

USB 1.x, USB клавиатуры (U-Boot < v2015.07)

U-Boot v2015.07 и более поздние версии не должны иметь проблем с поддержкой смешанных устройств USB 1.x / 2.0. OHCI и EHCI больше не конфликтуют друг с другом (после переключения на модель устройства).

Предыдущие версии U-Boot (v2015.04 и более ранние) имеют проблемы с поддержкой одновременно USB 1.x (OHCI) и USB 2.0 (EHCI) - последняя включает драйвер SUNXI_EHCI для плат Allwinner.

К сожалению, это также касается многих USB HID / клавиатурных устройств, которые не были бы правильно обнаружены U-Boot. Типичное сообщение в этом случае - «не удается сбросить порт N !?», где N - это тот порт USB, к которому были подключены эти устройства.

Возможный обходной путь - разместить внешний USB 2.0-концентратор между вашей платой и этими USB-устройствами.

Смотри: http://lists.denx.de/pipermail/u-boot/2015-January/200162.html

U-Boot 2015.07+ не хочет запускаться

Если вы используете недавнюю (основанную на модели устройства) U-Boot, и SPL просто зависает после инициализации DRAM (CPU: 912000000Hz, AXI/AHB/APB:3/2/2 или что-то подобное), скорее всего, в вашем основном двоичном файле U-Boot может отсутствовать информация DTB/правильное дерево устройств. В зависимости от (возможно, устаревших) инструкций, которые вы выполняли: перепроверьте, правильно ли вы используете u-boot.bin вместо u-boot-dtb.bin или u-boot.img вместо u-boot-dtb.img .

Устаревшее ядро ​​не запустится

  • Если ваше ядро ​​3.4.x отказывается загружаться или зависает сразу после «Starting kernel …»:
    • Дважды проверьте, что bootm_boot_mode установлен в «sec»! (см. выше)
    • Для U-Boot 2018.09-rc1 или более поздней версии установите CONFIG_ARMV7_LPAE=n в .config или смотрите https://patchwork.ozlabs.org/patch/1058338/
  • Если у вас нет последовательной консоли и вы используете только VGA/HDMI/LCD, это также может быть случай «Unrecognized/unsupported machine ID» (см. ниже).

Нераспознанный/неподдерживаемый ID машины

Ядро sunxi-3.4 может не загрузиться с одной из следующих сообщений об ошибках на последовательной консоли (но это сообщение не отображается на мониторе HDMI или ЖК-дисплее!):

Error: unrecognized/unsupported machine ID (r1 = 0x10001008).
Error: unrecognized/unsupported machine ID (r1 = 0x1000102a).
Error: unrecognized/unsupported machine ID (r1 = 0x100010bb).

В этом случае либо обновите ядро ​​до последней версии stage/sunxi-3.4 (ветка github), либо попробуйте «Enable workarounds for booting old kernels» в U-Boot:

  • make menuconfig или make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig, опция находится в разделе «ARM architecture». (Обязательно пересоберите U-Boot после его изменения.)

Если обновление до stage/sunxi-3.4 не является возможным (т.е. действительно необходимо использовать какой-то старый и очень сильно разветвленный форк sunxi-3.4), то можно выбрать следующие патчи (= выборочно объединить в набор):

wget https://github.com/linux-sunxi/linux-sunxi/commit/5052b83aa44dc16d6662d8d9d936166c139ad8c5.patch
wget https://github.com/linux-sunxi/linux-sunxi/commit/9a1cd034181af628d4145202289e1993c1687db6.patch
wget https://github.com/linux-sunxi/linux-sunxi/commit/c4c4664ed1a2f35e54a33ae4e65f517721ff43b5.patch
wget https://github.com/linux-sunxi/linux-sunxi/commit/ade08aa6e5249a9e75a97393e86c250b2bcb3ec8.patch
wget https://github.com/linux-sunxi/linux-sunxi/commit/16b25a95327f45a995f6efcf3e9d83a414231af9.patch
wget https://github.com/linux-sunxi/linux-sunxi/commit/dea62f21deb177053b84b15a519dff6c74d061d9.patch
wget https://github.com/linux-sunxi/linux-sunxi/commit/d47d367036be38c5180632ec8a3ad169a4593a88.patch
git am 5052b83aa44dc16d6662d8d9d936166c139ad8c5.patch
git am 9a1cd034181af628d4145202289e1993c1687db6.patch
git am c4c4664ed1a2f35e54a33ae4e65f517721ff43b5.patch
git am ade08aa6e5249a9e75a97393e86c250b2bcb3ec8.patch
git am 16b25a95327f45a995f6efcf3e9d83a414231af9.patch
git am dea62f21deb177053b84b15a519dff6c74d061d9.patch
git am d47d367036be38c5180632ec8a3ad169a4593a88.patch

Необходимо накатить все, так как они содержат важные изменения стабильности и безопасности. Последний патч в этой серии заботится только о защите, которая существует специально для блокировки загрузки проблемных ядер. Простое удаление защитного устройства без применения всех исправлений приведет к неясным проблемам во время выполнения, пожалуйста, не поддавайтесь соблазну сделать это.

ImportError: No module named _libfdt

Если вы видите следующую ошибку при компиляции в Arch Linux arm:

ImportError: No module named _libfdt

установите dtc

sudo pacman -S dtc

Добавление нового устройства в U-Boot

Настройки DRAM

Отказоустойчивые настройки DRAM, основанные на стандартных таймингах JEDEC

Каждое устройство имеет настройки DRAM, настроенные в его файле defconfig в каталоге «config» U-Boot (вот пример для Cubietruck платы). Параметры медленной отказоустойчивой DRAM для устройства A10/A13/A20 могут выглядеть следующим образом:

+S:CONFIG_DRAM_CLK=360
+S:CONFIG_DRAM_ZQ=123
+S:CONFIG_DRAM_EMR1=4
+S:CONFIG_DRAM_TIMINGS_DDR3_800E_1066G_1333J=y

Более полный набор доступных параметров Kconfig и их описания можно найти здесь: https://git.denx.de/?p=u-boot.git;a=blob;f=board/sunxi/Kconfig;h=e1d4ab148f0838d746889775cfbab5bed57838bf;hb=a705ebc81b7f91bbd0ef7c634284208342901149#l177

Настройки из прошивки Android

Несколько лучшие настройки можно получить с помощью инструмента meminfo из стандартной системы Android или GNU/Linux, предоставленной производителем устройства. Все еще имеет смысл проверить надежность полученной конфигурации DRAM. Потому что некоторые поставщики предоставляют плохую конфигурацию для ZQ или EMR1, но, тем не менее, пытаются слишком оптимистично установить тактовую частоту DRAM.

Оптимизированные настройки для увеличения производительности DRAM

Настройка параметров DRAM для каждой отдельной платы может обеспечить гораздо лучшую производительность, чем настройки по умолчанию. Включение тестовых и отладочных настроек, позволит найти оптимальную комбинация. Страница контроллера DRAM содержит ссылки для изучения этой темы. Это займет много времени, поэтому лучше всего начать с удовлетворительного решения с использованием одного из других подходов.

Смотри также

  • Mainline Kernel Howto
  • Mainline U-Boot supported devices
  • U-Boot/Changelog
загрузка/u-boot.txt · Последние изменения: 2020/05/02 20:56 — admin