Ports/aarch64/RaspberryPi4andU-Boot — различия между версиями

Материал из ALT Linux Wiki
< Ports‎ | aarch64
Перейти к: навигация, поиск
(Новая страница: «Category:ARM Category:AArch64 == Загрузка Альт на Raspberry Pi 4 с помощью u-boot == === Резюме: === В Альт, при и…»)
 
(Варианты обхода проблемы)
 
(не показаны 3 промежуточные версии этого же участника)
Строка 45: Строка 45:
 
так, как принято в Альт.
 
так, как принято в Альт.
  
Однако, при исследовании этого способа загрудки было установлено, что использование немодифицированного
+
Однако, при исследовании этого способа загрузки было установлено, что использование немодифицированного
 
файла bcm2711-rpi-4-b.dtb при загрузке с использованием u-boot даёт неработающую систему -
 
файла bcm2711-rpi-4-b.dtb при загрузке с использованием u-boot даёт неработающую систему -
 
выглядит как зависание после передачи управления ядру.
 
выглядит как зависание после передачи управления ядру.
Строка 55: Строка 55:
 
и убрать fdtdir в extlinux.conf. После этого система загружается и работает.
 
и убрать fdtdir в extlinux.conf. После этого система загружается и работает.
  
Если взять dts файл на работающей Rpi4,
+
Если взять dts файл на работающей Rpi4:
 
  dtc -I fs -O dts -o bcm2711-rpi-4-b.dts /sys/firmware/devicetree/base
 
  dtc -I fs -O dts -o bcm2711-rpi-4-b.dts /sys/firmware/devicetree/base
 
компилировать его в dtb  
 
компилировать его в dtb  
Строка 63: Строка 63:
 
Для обхода проблемы и сохранения принятого в Альт способа загрузки и был использован последний вариант:
 
Для обхода проблемы и сохранения принятого в Альт способа загрузки и был использован последний вариант:
 
в исходниках ядер файлы <ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=1fd86f81f5426f1825b9427e2c7e70a02d477940;hb=3941f2697fa6e0a8493261ddeee1ef7046fd6ad4</ref> и <ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image-rpi.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=1fd86f81f5426f1825b9427e2c7e70a02d477940;hb=635d58b87e4391837cab749ec5e285a831584316</ref> были заменены на файлы, считанные с работающей Raspberry Pi 4 -
 
в исходниках ядер файлы <ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=1fd86f81f5426f1825b9427e2c7e70a02d477940;hb=3941f2697fa6e0a8493261ddeee1ef7046fd6ad4</ref> и <ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image-rpi.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=1fd86f81f5426f1825b9427e2c7e70a02d477940;hb=635d58b87e4391837cab749ec5e285a831584316</ref> были заменены на файлы, считанные с работающей Raspberry Pi 4 -
<ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=b6d49c8b1742f09cc9de7574157a5cef2cbf29a2;hb=7d2550925606273676aa51b2deaf9731a75c65fb</ref> и <ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image-rpi.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=122c283ca1dfaeb5cc3fdc8534ffbd241f8bbc06;hb=667ef859fc327fdb308ac84b9c66418f0af76459</ref> соответсвенно.
+
<ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=b6d49c8b1742f09cc9de7574157a5cef2cbf29a2;hb=7d2550925606273676aa51b2deaf9731a75c65fb</ref> и <ref>http://git.altlinux.org/people/jqt4/packages/?p=kernel-image-rpi.git;a=blob;f=arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts;h=122c283ca1dfaeb5cc3fdc8534ffbd241f8bbc06;hb=667ef859fc327fdb308ac84b9c66418f0af76459</ref> соответственно.
  
Понятно, что это только обход но не решение проблемы. При обновлении firmware или выходе
+
Понятно, что это только обход, но не решение проблемы. При обновлении firmware или выходе
 
новой версии платы Raspberry Pi 4 способ модификации dtb файла может измениться, что
 
новой версии платы Raspberry Pi 4 способ модификации dtb файла может измениться, что
 
может создать проблемы с работой системы.
 
может создать проблемы с работой системы.
Строка 78: Строка 78:
 
после обновления:
 
после обновления:
  
* rpi4-boot-nouboot: firmware загружает ядро, dtb и initrd, u-boot не используется.
+
* '''rpi4-boot-nouboot''': firmware загружает ядро, dtb и initrd, u-boot не используется.
* rpi4-boot-uboot-fw: firmware загружает dtb. U-boot загружает ядро и initrd.
+
* '''rpi4-boot-uboot-fw''': firmware загружает dtb. U-boot загружает ядро и initrd.
* rpi4-boot-uboot: u-boot загружает ядро, dtb и initrd.
+
* '''rpi4-boot-uboot''': u-boot загружает ядро, dtb и initrd.
  
 
Эти скрипты могут принимать flavour ядра в качестве аргумента.
 
Эти скрипты могут принимать flavour ядра в качестве аргумента.
Строка 94: Строка 94:
 
требуемому варианту загрузки то будет настроена загрузка с новым ядром.
 
требуемому варианту загрузки то будет настроена загрузка с новым ядром.
  
Скрипты находятся в пакете rpi4-boot-switch
+
Скрипты находятся в пакете [https://packages.altlinux.org/ru/sisyphus/specfiles/rpi4-boot-switch rpi4-boot-switch ]
  
 
=== Скрипт для переключения аудио ===
 
=== Скрипт для переключения аудио ===
  
 
По умолчению звук выводится на HDMI. Можно переключить вывод на 3.5 мм аналоговый разъём.
 
По умолчению звук выводится на HDMI. Можно переключить вывод на 3.5 мм аналоговый разъём.
Для переключения вывода звука предназначен скрипт RPi-audioswitch
+
Для переключения вывода звука предназначен скрипт [https://packages.altlinux.org/ru/sisyphus/specfiles/RPi-audioswitch RPi-audioswitch], который можно вызвать
 +
из меню программ.
  
Эти скрипты уже установлены в образ <ref>http://ftp.altlinux.org/pub/people/jqt4/images/rpi4/alt-workstation-rpi4-9.0-alpha2-aarch64.img.xz или http://get.srt.basealt.ru/images/rpi4/alt-workstation-rpi4-9.0-alpha2-aarch64.img.xz.md5</ref>
+
Эти скрипты уже установлены в образ [http://ftp.altlinux.org/pub/people/jqt4/images/rpi4/alt-workstation-rpi4-9.0-alpha2-aarch64.img.xz ALT Workstation] ([http://get.srt.basealt.ru/images/rpi4/alt-workstation-rpi4-9.0-alpha2-aarch64.img.xz.md5 md5sum]).

Текущая версия на 16:39, 29 ноября 2019


Загрузка Альт на Raspberry Pi 4 с помощью u-boot[править]

Резюме:[править]

В Альт, при использовании u-boot в качестве загрузчика, происходит загрузка в память файлов ядра Linux, dtb, initrd, прописанных в /boot/extlinux/extlinux.conf и передача управления ядру.

Загрузчик Raspberry Pi 4 (находится в файле start4.elf [1]) при загрузке модифицирует файл dtb, в зависимости от параметров в config.txt и установленных плат расширения [2].

Использование немодифицированного dtb при загрузке с u-boot приводит к неработоспособности системы.

В статье описан обход данной проблемы, примененный в образах Альт для Raspberry Pi 4, начиная с [3].

Загрузка Альт с помощью u-boot[править]

В Альт, при использовании u-boot в качестве загрузчика, принят следующий порядок загрузки:

  • U-boot ищет на rootfs файл /boot/extlinux/extlinux.conf и загружает его.
  • Выдается меню вариантов загрузки, из которого пользователь может выбрать один.
  • При отстутствии выбора пользователя используется вариант по умолчанию.
  • U-boot загружает в память файлы ядра, dtb, initrd, указанные для выбранного варианта загрузки. После этого управление передается ядру.

ПО Альт, выполняющее обновление ядер и изменение flavour ядра в системе (update-kernel) ориентировано именно на такой способ загрузки.

Загрузка Raspberry Pi 4[править]

На SD карте, установленной в Raspberry Pi 4 должен быть FAT раздел, на котором находятся файлы, необходимые для загрузки.

Начальный загрузчик Raspberry Pi 4 находится не на SD карте, а на подключенной по SPI интерфейсу микросхеме EEPROM [4] Он загружает файл start4.elf в GPU VideoCore [5] после чего производится загрузка ядра, загрузка и модификация dtb [6], а при необходимости и загрузка inintrd с FAT раздела SD карты.

При такой схеме загрузки update-kernel бесполезен, поскольку с FAT разделом не работает.

Проблема загрузки Альт на Raspberry Pi 4[править]

Вместо ядра Linux на FAT раздел может быть установлен u-boot, что позволяет загрузить Raspberry Pi 4 так, как принято в Альт.

Однако, при исследовании этого способа загрузки было установлено, что использование немодифицированного файла bcm2711-rpi-4-b.dtb при загрузке с использованием u-boot даёт неработающую систему - выглядит как зависание после передачи управления ядру.

Варианты обхода проблемы[править]

Было выяснено, что можно не загружать dtb файл с помощью u-boot, а передать ядру файл, созданный firmware в памяти. Для этого нужно прописать device_tree_address в config.txt и убрать fdtdir в extlinux.conf. После этого система загружается и работает.

Если взять dts файл на работающей Rpi4:

dtc -I fs -O dts -o bcm2711-rpi-4-b.dts /sys/firmware/devicetree/base

компилировать его в dtb

dtc -I dts -O dtb -o bcm2711-rpi-4-b.dtb bcm2711-rpi-4-b.dts

и использовать при загрузке с u-boot, то система загружается и работает.

Для обхода проблемы и сохранения принятого в Альт способа загрузки и был использован последний вариант: в исходниках ядер файлы [7] и [8] были заменены на файлы, считанные с работающей Raspberry Pi 4 - [9] и [10] соответственно.

Понятно, что это только обход, но не решение проблемы. При обновлении firmware или выходе новой версии платы Raspberry Pi 4 способ модификации dtb файла может измениться, что может создать проблемы с работой системы.

Скрипты для переключения вариантов загрузки[править]

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

Был создан набор скриптов, модифицирующих конфигурационные файлы для настройки режима загрузки, изменения flavour загружаемого ядра, изменения версии загружаемого ядра после обновления:

  • rpi4-boot-nouboot: firmware загружает ядро, dtb и initrd, u-boot не используется.
  • rpi4-boot-uboot-fw: firmware загружает dtb. U-boot загружает ядро и initrd.
  • rpi4-boot-uboot: u-boot загружает ядро, dtb и initrd.

Эти скрипты могут принимать flavour ядра в качестве аргумента.

В результате кроме изменения (или не изменения) варианта загрузки будет изменен и flavour загружаемого ядра.

Если flavour не указан, то используется flavour ядра, работающего в данный момент.

Скрипты ищут самое свежее ядро с требуемым flavour, установленное в системе.

Таким образом, если после обновления ядра update-kernel запустить скрипт, соответствующий требуемому варианту загрузки то будет настроена загрузка с новым ядром.

Скрипты находятся в пакете rpi4-boot-switch

Скрипт для переключения аудио[править]

По умолчению звук выводится на HDMI. Можно переключить вывод на 3.5 мм аналоговый разъём. Для переключения вывода звука предназначен скрипт RPi-audioswitch, который можно вызвать из меню программ.

Эти скрипты уже установлены в образ ALT Workstation (md5sum).