Ports/aarch64/Raspberry Pi4: различия между версиями

Материал из ALT Linux Wiki
< Ports‎ | aarch64
(boot & firmware)
(boot partition, kernel, known bugs)
Строка 1: Строка 1:
[[File:Raspberry_Pi4.jpg|thumbnail|240px|Собственно, сабж. Внизу - питание и microHDMI, справа - USB и Ethernet, к плате подключены последовательный порт (бело-красно-черный провод) и кнопка Reset (сине-белый провод)]]
[[File:Raspberry_Pi4.jpg|thumbnail|240px|Собственно, сабж. Внизу - питание и microHDMI, справа - USB и Ethernet, к плате подключены последовательный порт (сверху, на разъеме GPIO) и кнопка Reset (сине-белый провод посередине)]]
[[Category:ARM]] [[Category:AArch64]]
[[Category:ARM]] [[Category:AArch64]]
Данное описание относится в основном к Pi4, но в целом подходит и для других железок на основе Broadcom BCM2711 или даже BCM2710 (как, например, Pi3).
Данное описание относится в основном к Pi4, но в целом подходит и для других железок на основе Broadcom BCM2711 или даже BCM2710 (как, например, Pi3).
Строка 40: Строка 40:
Вам понадобится двух- или трехконтактный разъем, аналогичный GPIO-гребенке - с расстоянием между контактами в одну линию (2.54 мм, 1/10 дюйма). Его место на плате малины можно легко опознать по надписям RUN и Global_EN. Так вот: если этот самый Global_EN (правый контакт) соединить с общим (центральный контакт) - это и будет нажатие кнопки Reset.
Вам понадобится двух- или трехконтактный разъем, аналогичный GPIO-гребенке - с расстоянием между контактами в одну линию (2.54 мм, 1/10 дюйма). Его место на плате малины можно легко опознать по надписям RUN и Global_EN. Так вот: если этот самый Global_EN (правый контакт) соединить с общим (центральный контакт) - это и будет нажатие кнопки Reset.


== Загрузочный раздел и firmware ==
== Firmware и загрузка ==
=== Процесс загрузки ===
=== Процесс загрузки ===
Внутри ПЗУ малины находится примитивный начальный загрузчик, который выполняет следующие действия:
Внутри ПЗУ малины находится примитивный начальный загрузчик, который выполняет следующие действия:
* проверяет доступность SDHC-флешки (скорее всего, SDXC его тоже устроит, а вот просто SD не воспринимает)
* проверяет доступность SDHC-флешки (SDXC его скорее всего тоже устроит, а вот просто SD не воспринимает)
* проверяет наличие на ней корректной таблицы разделов MBR (если когда-то там делали GPT, нужно вычистить все ошметки)
* проверяет наличие на ней корректной таблицы разделов MBR (если когда-то там делали GPT, нужно вычистить все ошметки)
* проверяет существование первого раздела с типом FAT32 (/dev/sdx1 0x0C)
* проверяет существование первого раздела с типом FAT32 (/dev/sdx1 0x0C)
Строка 74: Строка 74:
Все, копию репозитария можно удалять - больше от нее никакой пользы.
Все, копию репозитария можно удалять - больше от нее никакой пользы.


=== Создание загрузочного раздела ===
=== Создание загрузочного раздела и корневой ФС ===
* Возьмите microSDHC флешку объемом хотя бы 4 Гб, а лучше 8 Гб.
* Очистите ее от возможных ошметков GPT и аналогичной ерунды:
dd bs=1M count=1 if=/dev/zero of=/dev/sdx
* Создайте на ней два раздела:
** /dev/sdx1 - 128...256 Мб, тип 0x0C, загрузочный
** /dev/sdx2 - все остальное, тип 0x83, для корневой ФС
* Создайте файловые системы на этих разделах:
mkfs.vfat -F 32 -n RPI-BOOT -v /dev/sdx1
mke2fs -j -m1 /dev/sdx2
* Смонтируйте их в удобные вам каталоги
* Скопируйте в загрузочный раздел содержимое архива [http://rsync.altlinux.org/pub/people/gremlin/rpi/boot/ rpi4-boot] - помимо упомянутых выше bootcode.bin fixup*dat и start*elf он содержит конфигурационные файлы, ядро и файлы Device Tree
* Скопируйте в корневой раздел содержимое нужной вам [[Regular/arm|сборки ALT Linux для AArch64]]
 
== Ядро ==
=== 4.19 ===
Как ни печально, оно единственное более-менее поддерживаемое, а потому и рабочее. Собрано с IOMMU_DEBUGFS, так что не удивляйтесь страшному сообщению в логе ядра: оно пока действительно для разработчиков.
=== 5.3rc ===
Не работают USB-порты. Подробное описание - в разделе "Известные проблемы".
 
== Известные проблемы ==
=== USB ===
* При использовании ядра 5.* не работают USB-порты. Проблема - в неполном соответствии контроллера VIA VL805 стандарту xHCI (хост USB 3.0). В ядрах 4.19 для этого контроллера добавлен специальный PCI quirk (см. drivers/usb/host/xhci-pci.c), но в более свежих ядрах этот способ не помогает.
=== Выключение и перезагрузка ===
* Пока не работают ни с ядром 4.19, ни с ядрами 5.*

Версия от 16:48, 10 сентября 2019

Собственно, сабж. Внизу - питание и microHDMI, справа - USB и Ethernet, к плате подключены последовательный порт (сверху, на разъеме GPIO) и кнопка Reset (сине-белый провод посередине)

Данное описание относится в основном к Pi4, но в целом подходит и для других железок на основе Broadcom BCM2711 или даже BCM2710 (как, например, Pi3).

Аппаратная часть и отладка

Самая большая сложность - практически полное отсутствие документации. Это, конечно, Broadcom, но все равно фу такими быть. Тем не менее, три самых главных отладочных средства на малине есть и работают.

JTAG

Очень надеюсь, что в такие дебри вам лезть не потребуется, но на всякий случай...

Положите малину разъемами питания и видео к себе, а разъемами Ethernet и USB вправо. В левом дальнем углу окажется 40-контактная гребенка GPIO:

2 oooooooooooooooooooo 40
1 oooooooooooooooooooo 39

Соответствие сигналов JTAG (3.3V TTL) и контактов GPIO такое:

Name    Pin     Function
TCLK    22      test clock
TDI     37      test data in
TDO     18      test data out
TMS     13      test master-slave
TRCK    16      test return clock
TRST    15      test reset

Общий провод (GND) можно подключить к любому из контактов 6,9,14,20,25,30,34,39; рекомендую использовать одновременно 14, 20 и 39 ввиду их максимальной близости к сигнальным. Питание +3.3V можно взять с контактов 1 или 17; питание +5V присутствует на контактах 2 и 4.

Консоль

/dev/ttyAMA0 115200 8N1, 3.3V TTL. Подключать очень удобно - три контакта подряд:

Name    Pin     Function
URXD    10      UART RX data
UTXD    08      UART TX data

Разумеется, общий провод (GND) в этом случае удобнее всего подключить к 6 контакту. Главное, не промахнитесь: рядом +5V, которые уже могут быть опасными для USB-serial адаптера (рекомендую PL2303 и CH340, они более живучие).

Кнопка RESET

Увы, незаменимая вещь. Впрочем, здесь разработчики малины немного сэкономили: контактные площадки на плате есть, а разъем туда не впаян. Если вы уверены в своих руках и знаете, с какой стороны браться за паяльник - ничего сложного. Если есть сомнения - обратитесь к тому, кто умеет. Вам понадобится двух- или трехконтактный разъем, аналогичный GPIO-гребенке - с расстоянием между контактами в одну линию (2.54 мм, 1/10 дюйма). Его место на плате малины можно легко опознать по надписям RUN и Global_EN. Так вот: если этот самый Global_EN (правый контакт) соединить с общим (центральный контакт) - это и будет нажатие кнопки Reset.

Firmware и загрузка

Процесс загрузки

Внутри ПЗУ малины находится примитивный начальный загрузчик, который выполняет следующие действия:

  • проверяет доступность SDHC-флешки (SDXC его скорее всего тоже устроит, а вот просто SD не воспринимает)
  • проверяет наличие на ней корректной таблицы разделов MBR (если когда-то там делали GPT, нужно вычистить все ошметки)
  • проверяет существование первого раздела с типом FAT32 (/dev/sdx1 0x0C)
  • запускает основной загрузчик, находящийся в файле start4.elf (на старых малинах - start.elf)

Основной загрузчик читает с того же раздела файл config.txt и в целом принимает его к сведению, но действует все же по собственному разумению. Выглядит этот файл примерно так:

arm_64bit=1
device_tree=bcm2711-rpi-4-b.dtb
enable_gic=1
dtoverlay=disable-bt
enable_uart0=1
init_uart_baud=115200
dtoverlay=vc4-fkms-v3d
gpu_mem=32
disable_overscan=1
ignore_lcd=1
display_default_lcd=0
hdmi_force_hotplug=1
max_frambuffers=2
framebuffer_priority=2

Нетрудно видеть, что именно здесь мы разрешаем процессору использовать 64-битный режим, загружаем параметры Device Tree, включаем ПКП (который, кстати, появился только на четвертой малине), отключаем bluetooth и освобождаем последовательный порт для консоли, устанавливаем скорость этого порта, а также настраиваем видеоподсистему. Когда все настроено, загрузчик запускает ядро из файла kernel8.img и передает ему параметры - как на свое усмотрение, так и из файла cmdline.txt

Firmware

Распространяется в виде готовых бинарников, доступно по адресу https://github.com/raspberrypi/firmware К сожалению, репозитарий превращен в помойку - помимо собственно firmware туда зачем-то пихают ядра (собранные непонятно кем непонятно как) и какой-то дополнительный софт. Поэтому просто вытягиваем оттуда актуальную версию:

git clone --depth=1 https://github.com/raspberrypi/firmware

и копируем нужные файлы к себе:

cp -a boot/bootcode.bin boot/fixup*dat boot/start*elf ~/packages/rpi4-firmware/

Все, копию репозитария можно удалять - больше от нее никакой пользы.

Создание загрузочного раздела и корневой ФС

  • Возьмите microSDHC флешку объемом хотя бы 4 Гб, а лучше 8 Гб.
  • Очистите ее от возможных ошметков GPT и аналогичной ерунды:
dd bs=1M count=1 if=/dev/zero of=/dev/sdx
  • Создайте на ней два раздела:
    • /dev/sdx1 - 128...256 Мб, тип 0x0C, загрузочный
    • /dev/sdx2 - все остальное, тип 0x83, для корневой ФС
  • Создайте файловые системы на этих разделах:
mkfs.vfat -F 32 -n RPI-BOOT -v /dev/sdx1
mke2fs -j -m1 /dev/sdx2
  • Смонтируйте их в удобные вам каталоги
  • Скопируйте в загрузочный раздел содержимое архива rpi4-boot - помимо упомянутых выше bootcode.bin fixup*dat и start*elf он содержит конфигурационные файлы, ядро и файлы Device Tree
  • Скопируйте в корневой раздел содержимое нужной вам сборки ALT Linux для AArch64

Ядро

4.19

Как ни печально, оно единственное более-менее поддерживаемое, а потому и рабочее. Собрано с IOMMU_DEBUGFS, так что не удивляйтесь страшному сообщению в логе ядра: оно пока действительно для разработчиков.

5.3rc

Не работают USB-порты. Подробное описание - в разделе "Известные проблемы".

Известные проблемы

USB

  • При использовании ядра 5.* не работают USB-порты. Проблема - в неполном соответствии контроллера VIA VL805 стандарту xHCI (хост USB 3.0). В ядрах 4.19 для этого контроллера добавлен специальный PCI quirk (см. drivers/usb/host/xhci-pci.c), но в более свежих ядрах этот способ не помогает.

Выключение и перезагрузка

  • Пока не работают ни с ядром 4.19, ни с ядрами 5.*