Перевод статьи Configure early boot splash screens for SPI and I2C based displays — Thomas Griffiths, Raspberry Pi.

В начале этого года M5Stack показала крошечный компьютер на базе CM0, который собиралась выпустить через Kickstarter. Одной из целей было вывести заставку на экран как можно раньше, но для этого пришлось запускать U-Boot как целый дополнительный этап загрузки. Поскольку Томас Гриффитс присоединился к нам на лето, мы решили, что будет здорово поручить ему расширение прошивки, которое позволит настраивать такие SPI/I2C-дисплеи на самом раннем этапе загрузки и показывать заставку уже через пару секунд.

Предсерийный M5Stack Cardputer Zero

Предсерийный M5Stack Cardputer Zero, который нам прислали для ускорения отклика при загрузке

Мода на кибердеки вдохновила множество красочных самоделок на Raspberry Pi, а с выходом новых карманных устройств для мейкеров вроде Cardputer Zero и Hackberry Pi всё чаще основным дисплеем для Raspberry Pi становятся маленькие SPI- и I2C-экраны. Чтобы такие устройства выглядели отзывчивее при включении, мы сделали способ добавлять на них собственные заставки — с помощью небольшого языка и интерпретатора в загрузчике.

Мини-язык#

Во многом структуру и синтаксис языка я позаимствовал у языка mipi-dbi Норальфа Трённеса: многие из используемых дисплеев в итоге всё равно будут работать через его Linux-драйвер. При этом я позволил себе некоторые вольности — добавил возможностей и изменил часть архитектуры.

Дисплей ST7789 с заставкой Raspberry Pi

Дисплей ST7789 у меня на столе показывает заставку

Язык заставок поддерживает также I2C и статически встраивает изображение в бинарник, но значительная часть кода конфигурации в итоге совместима с mipi-dbi. А поскольку по сути это просто выгрузка данных на устройство, при старте можно выводить не только картинки.

Рабочий стол разработчика с платами и дисплеями

Самый аккуратный стол разработчика ПО в Raspberry Pi (серьёзно)

Следующий код — пример слегка нестандартного применения: он выводит «HELLO» на семисегментный индикатор. Сначала задаётся используемый выход (SPI с указанием выводов и частоты), затем инициализируется индикатор и выставляется яркость, после чего в регистры разрядов записываются символы и индикатор включается:

# Set the output that we are using
define mled spi [copi 10] [cipo 9] [sclk 11] [cs 8] [freq 1000000]
# Setup the screen and set the brightness
mled 0x0c 0x00
mled 0x09 0x00
mled 0x0b 0x07
mled 0x0a 0x08
mled 0x0f 0x00
# Set each charecter register - shows HELLO
mled 0x01 0x00
mled 0x02 0x00
mled 0x03 0x7e
mled 0x04 0x0e
mled 0x05 0x0e
mled 0x06 0x4f
mled 0x07 0x37
mled 0x08 0x00
# Turn on
mled 0x0c 0x01

А если позволить себе вольности с SPI, можно работать и с другими протоколами…

Вот пример на YouTube: SPI с передискретизацией программно эмулирует UART и управляет чековым принтером, который печатает заставку.

Подключение к загрузчику#

Сейчас функция доступна в бета-версии прошивки. Чтобы её получить, запустите sudo raspi-config, перейдите в Advanced Settings, затем в Beta Access. После этого выполните sudo apt update и sudo apt full-upgrade. Рекомендуем, чтобы система была записана с последнего образа ОС — так она гарантированно будет актуальной.

Чтобы поместить заставку (или что-то другое) в загрузчик, следуйте инструкциям в папке splashasm репозитория raspberrypi/utils: итоговый бинарник кладётся в папку с загрузочной прошивкой, а ссылка на него прописывается в config.txt. Поскольку функция в бете, краткую документацию мы пока разместили там же.