PICO-IMX8MQ

Материал из ALT Linux Wiki

Установка ALT Linux на устройство PICO-IMX8MQ (TechNexion)

Введение

Данный документ описывает как самостоятельно из открытых источников, используя инструменты ALT Linux, подготовить рабочую прошивку для устройства PICO-IMX8MQ.

Эта статья будет так же полезна тем, кто пытается разобраться как именно приготовляется прошивка для данного устройства, как оно загружается, какие требования предъявляются. Официальная сборка на базе Yocto достаточно трудна для понимания.

Ссылки

Устройство: https://www.technexion.com/products/pico-evaluation-kits/detail/PICOPIIMX8M1G (ссылка устарела), можно найти аналоги так: https://www.mouser.be/Search/Refine?Keyword=PICO-PI-IMX8M

SOM модуль отдельно: https://www.technexion.com/products/system-on-modules/pico/pico-compute-modules/detail/PICO-IMX8M

Репозиторий upstream загрузчика с wiki страницей с основной информацией: https://github.com/TechNexion/u-boot-edm/wiki/PICO%E2%80%90IMX8M

Характеристики PICO-IMX8MQ

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

Устройство состоит из двух плат:

  • base board (которая "PICO") с интерфейсами и периферией.
  • Подключенного к base board SOM (system on module) -- мезонина с основным вычислительным блоком. SOM как таковой легко отделяется и может быть заменен на аналогичный с другими характеристиками.

Техническое описание:

  • CPU: NXP i.MX8M Quad (четырёхядерный), максимальная частота 1.3GHz, архитектура ARM Cortex-A53
  • в состав процессора i.MX8MQ включено ядро ARM Cortex-M4 -- микроконтроллер, который может работать независимо от основного процессора
  • RAM: 1GB LPDDR4
  • ROM: 8GB EMMC (в одном чипе с CPU и RAM, внешняя SD карта не используется)
  • Отладочные порты: UART через microUSB коннектор; USB-C коннектор, через который обеспечивается питание, и доступен отладочный интерфейс процессора
  • Ethernet: Gigabit LAN PHY Atheros AR8031
  • Wi-Fi/Bluetooth: QCA9377 + antenna
  • Коннектор, совместимый с Raspberry PI с интерфейсами GPIO, I2C, I2S, PWM, SPI, UART
  • Интерфейс для подключения дисплея MIPI CSI + DSI
  • HDMI (полноразмерный)
  • 1 USB 2.0
  • Кнопка сброса
  • Видео: Vivante GC7000Lite

Данное техническое решение имеет следующие достоинства:

  • Малый форм-фактор (85/56/25 мм).
  • Малое энергопотребление: способно работать питаясь от стандартного компьютерного USB3 порта (если этот порт достаточно качественный, в противном случае часть периферии работать откажется).
  • Малое тепловыделение: при работе без видео и работающем планировщике частоты, радиатор на модуле остаётся чуть теплым.
  • Достаточно высокая производительность (в том числе благодаря EMMC).
  • Наличие микроконтроллера позволяет строить крайне малопотребляющие решения.
  • Имеется высокопроизводительный Wi-Fi чип и гигабитный Ethernet.
  • Отладочный UART через USB, не требуется дополнительных переходников.

Недостатки:

  • Только один USB2 порт.
  • CPU поддерживает PCIe, но он не выведен на стандартный разъем (хотя сигналы доступны).
  • Не используется внешняя SD карта, хотя разъем на base board имеется (не припаян адаптер). Это затрудняет прошивку устройства.
  • Плохо поддерживаемый (открытыми драйверами) Wi-Fi модуль.
  • Нестабильно работающий Ethernet PHY (не всегда корректно инициализируется, источник проблемы (аппаратное или программное обеспечения) неясен).

TL;DR

К сожалению, кратенько не выйдет. В связи с закрытостью прошивок, требуемых для загрузки устройства, не получится выложить готовый образ (даже частично готовый) без нарушения лицензии. Корневую файловую систему подготовить можно, но её нельзя будет даже прошить на устройство без наличия загрузчика, так как сам процесс прошивки предполагает наличие рабочего минимального загрузчика. Сам по себе загрузчик уже требует прошивок. Кроме того, закрытой прошивки требует Wi-Fi модуль.

В связи с этим данном документе предлагается рецепт по которому каждый интересующийся (и достаточно терпеливый) сможет из доступных источников собрать готовую прошивку для данного устройства.

От читателя требуется возможность исполнять предложенные инструкции из-под установленной ОС на базе ALT Linux Sisyphus. Без знания Git и базового понимания как собираются пакеты для ALT Linux: Gear + Hasher будет достаточно сложно.

Состав и процесс в целом

Прошивка для устройства состоит из загрузчика, который передаёт эстафету ядру Linux, и корневой файловой системы.

С корневой файловой системой всё относительно просто: она устроена точно так же как и для настольных систем. Разве что целевая архитектура aarch64. Для подготовки корневой ФС используется проект mkimage-profiles.

Загрузчик для данного устройства -- достаточно сложная конструкция. В её основе U-Boot с относительно небольшим набором изменений для поддержки устройства. Из образа U-Boot специальным образом подготавливается финальный загрузчик, в том числе путём добавления прошивок для CPU и оперативной памяти.

Корневая ФС и загрузчик соединяются вместе в единый образ. Данный образ затем заливается на целевое устройство через отладочный USB-C порт (внешней SD карты то нет) с помощью специальной утилиты.

Общие приготовления

Для сборки ядра хостовая система должна быть достаточно мощная.

На хостовой системе должен быть настроен Hasher. Рекомендуется использование заранее синхронизированного Sisyphus доступного локально или через NFS. В прилагаемых файлах конфигурации как раз это и используется.

apt.conf

Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
Dir::Etc::SourceParts "/var/empty";
Dir::Etc::sourcelist "/home/user/pico-imx8mq/sources.list";

sources.list

rpm [alt] file:///home/user Sisyphus/aarch64 classic
rpm [alt] file:///home/user Sisyphus/noarch classic
#rpm file:///home/user/pico-imx8mq repo/aarch64 extra

Не забудьте поменять пути на реально существующие! А именно, путь до sources.list файла, репозитория Sisyphus и отдельной директории куда мы будем складывать получающиеся пакеты. Последнее нужно только для mkimage-profiles и может оставаться закомментированным на остальных этапах.

Сборка пакетов

Наша цель -- собрать отдельные компоненты прошивки в RPM пакеты, их сложить в отдельный репозиторий, затем использовать mkimage-profiles чтобы собрать образ корневой ФС.

Сборка пакетов выполняется кросс-платформенно. Для того, чтобы это работало, необходмо выполнить команду register-qemu-aarch64 от суперпользователя (один раз после загрузки системы). Команду можно найти в пакете livecd-qemu-arch.

Сборка любого из пакетов выполняется одной и той же командой:

gear-hsh -v --commit --no-sisyphus-check=packager,gpg,changelog,fhs --mountpoints=/proc -- -v --with-qemu=aarch64 --target=aarch64 --apt-config=/home/user/pico-imx8mq/apt.conf

Путь до apt.conf замените на реальный.

Результирующие пакеты попадут в ~/hasher/repo/aarch64/RPMS.hasher/.

Компоненты прошивки

Здесь описан каждый компонент: зачем он и какие изменения были внесены.

Компоненты указаны в порядке их сборки (но это не очень строго).

Пройдитесь по каждому компоненту и выполните указанную выше команду чтобы получить RPM пакет.

Замечание: указанные репозитории скорее всего будут обновляться с т.н. force push, так как окончательное видение не полностью сформировано, да и upstream сам обновляет репозитории таким образом.

U-Boot

Основной загрузчик.

Подготовленные изменения относительно upstream сосредоточены в отдельных патчах в корне директории исходников. Патчи обеспечивают загрузку нормальным способом, через distro_bootcmd.

Отдельный интерес может представлять патч `pico-imx8mq-on-the-first-boot-expand-rootfs-partitio.patch`:

--- a/include/configs/pico-imx8mq.h
+++ b/include/configs/pico-imx8mq.h

...
 
+/* trick to prepare MMC partitions */
+#define CONFIG_BOOTCOMMAND "" \
+       "if test ${part_resized} = 0; then " \
+               "run setup_emmc;" \
+               "setenv part_resized 1; saveenv;" \
+               "reset;" \
+       "fi;" \
+       "run distro_bootcmd"
+

...

+       "rootfs_start=8MiB\0" \
+       "rootfs_size=7400MiB\0" \
+       "finduuidrootfs=part uuid mmc 0:1 uuid_gpt_rootfs\0" \
+       "partitions=uuid_disk=${uuid_gpt_disk};name=rootfs,start=${rootfs_start},size=${rootfs_size},uuid=${uuid_gpt_rootfs}\0" \
+       "part_resized=0\0" \
+       "setup_emmc=run finduuidrootfs;gpt guid mmc 0 uuid_gpt_disk;gpt write mmc 0 $partitions;\0" \

...
 \

Добавленные команды решают вопрос со слишком малым размером корневой ФС на выходе после mkimage-profiles, см. переменную $partitions и как она заполняется.

Результатом сборки будет RPM пакет с образом только U-Boot.

IMX ARM Trusted Firmware

Прошивка для CPU.

Данная прошивка требуется для формирования финального загрузчика. Никаких дополнительных изменений в неё не внесено.

Замечание: upstream очень мутный и изменения там появляются довольно часто. Однако, они требуют внимательного тестирования: простое обновление на свежую версию может вызвать совершенно неожиданные ошибки в работе аппаратного обеспечения.

IMX Firmware

Прошивка для различных модулей SoC: DDR, HDMI, VPU.

Данная прошивка требуется для формирования финального загрузчика. Никаких дополнительных изменений в неё не внесено.

Однако, лицензия не позволяет её распространять. Описание как собирать данный пакет указано в README. В кратце: требуется отдельно скачать архив и распаковать его, приняв лицензию.

IMX MKIMAGE

Итоговый загрузчик процессора.

Репозиторий на самом деле содержит утилиту mkimage (модифицированный вариант) для подготовки финального загрузчика на основе предварительно созданных образов. Однако, так как эта утилита сама по себе интереса не представляет, из spec-файла получается пакет с загрузочным образом.

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

Изменения внесены минимальные в сам процесс сборки.

В результате в пакете будет единственный файл: /usr/share/ico-imx8mq-bootimage/flash.bin. Это и есть финальный загрузчик. Он понадобится потом отдельно.

Ядро Linux

Ядро Linux, модули ядра.

Из-за наличия большого количества изменений к апстримному ядру, которые не попали в основную ветку разработки, необходимо собирать собственный вариант.

Изменений в исходный код не потребовалось. В основном необходимо исправлять конфигурацию, но из-за криво написанных драйверов к этому устройству, трогать предлагаемый конфиг опасно. Поэтому на данный момент используется конфиг на основе ./arch/arm64/configs/tn_imx8_defconfig.

Исходники драйвера QCA9377

Пакет предоставляет исходники для драйвера Wi-Fi чипа.

Драйвер QCA9377

Данный пакет служит для сборки исходников драйвера Wi-Fi чипа под соответствующее ядро.

Изменения (относительно оригинальных исходников) внесены только в сам процесс сборки. На выходе в пакете получается только один модуль: wlan.ko

Прошивка для QCA9377

Прошивка, необходимая для работы драйвера QCA9377.

Это ещё один закрытый компонент, который требует явного согласия с лицензией. С другой стороны, если Wi-Fi чип не требуется, то можно не собирать ни данную прошивку ни драйверы для QCA9377. Как действовать с данным пакетом указано в его README.

Сценарий сборки корневой ФС

Эта часть описана отдельно далее.

Подготовка финального образа

Для подготовки финального образа используется инструмент mkimage-profiles. В его репозиторий внесён набор изменений. БОльшая их часть не имеет надежды на включение в апстрим, но необходимы для получения желаемого.

В данном случае указанной ниже командой подготавливается именно образ (а не архив ФС). В процессе сама корневая ФС создаётся из некоторого набора пакетов, в который из "наших" входит ядро и драйвер для QCA9377. Далее создаётся образ, в начало которого записывается загрузчик ("финальный") и далее располагается раздел с корневой ФС.

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

  • tar2fs: оставляются 8МБ вначале на загрузчик (он достаточно объемный), оставляется 1МБ в конце на безболезненную работу с GPT разделами.
  • используется нестандартный отладочный UART: ttymxc0
  • задаётся название финального образа и набор входящих пакетов, см. conf.d/regular-vm.mk и features.in/aarch64-picoimx8mq/*.

Запись загрузчика на подготовленный образ выполняется в процессе сборки следующей командой (эта информация не нужна непосредственно, но может быть полезна любопытствующим):

dd if=$(WORKDIR)/chroot/.work/chroot/usr/share/pico-imx8mq-bootimage/flash.bin of="$(IMAGEDIR)/$(IMAGE_OUTFILE)" bs=1K seek=33 conv=notrunc

Для кастомизации итогового образа удобно создать собственный скрипт features.in/aarch64-picoimx8mq/image-scripts.d/50-misc, который будет выполнен внутри уже подготовленной ФС перед её упаковкой.

Собственно команда на сборку:

make ARCH=aarch64 APTCONF=~/apt.conf DEBUG=1 vm/picoimx8mq-regular-server.img

Не забудьте подправить путь до apt.conf.

Прошивка образа

Прошивка устройства выполняется следующей командой:

uuu -b emmc_all /usr/share/pico-imx8mq-bootimage/flash.bin picoimx8mq-regular-server-latest-aarch64.img

Здесь:

  • uuu -- команда из пакета mfgtools
  • flash.bin -- файл финального загрузчика из пакета pico-imx8mq-bootimage
  • picoimx8mq-regular-server-latest-aarch64.img -- результат работы mkimage-profiles, образ корневой ФС

Устройство при этом должно быть подключено к компьютеру USB-C кабелем (соответственно, через USB-C порт устройства). Настоятельно рекомендуется использовать USB3 порт. Перед подключением джамперы на устройстве должны быть выставлены в режим "serial boot", как показано на иллюстрации. J1 в позиции 3-5, J2 в 1-3. Отладочный UART не должен быть при этом подключен.

После завершения прошивки устройство отключается, джамперы возвращаются в рабочее положение (J1 -- 4-6, J2 -- 2-4).

Включение и использование

Установите джамперы в режим загрузки с EMMC (J1 -- 4-6, J2 -- 2-4). Включите питание, подключив плату через USB-C кабель к компьютеру либо отдельному источнику питания.

Для доступа к отладочной информации используйте microUSB кабель. После его подключения к компьютеру автоматически подгрузятся необходимые драйвера и консоль будет доступна на /dev/ttyUSB0. Использовать её можно, к примеру, с помощью minicom -D /dev/ttyUSB0.

Замечания:

  • /dev/ttyUSB0 не сразу становится "доступен" для терминала.
  • Если устройство загружается с подключенным отладочным UART, образуется некоторый мусор на входе, который сбивает загрузку загрузчика. Необходимо с терминала "сбросить мусор" через Ctrl+C, затем либо перезагрузить плату (reset), либо продолжить загрузку (boot).

Альтернативно UART можно использовать консоль на HDMI (не проверено, возможно к параметрам ядра потребуется добавить console=tty0).

Пароль root по умолчанию alt.