Недавно я сделал игровую ретро-консоль для своих детей. И подумал, что было бы полезно поделиться своим опытом на тот случай, если другие захотят создать что-то похожее.
Железо
Я использовал Waveshare, 1,44-дюймовый ЖК-дисплей HAT 128×128 пикселей для Raspberry Pi. Это отличное решение, так как в нём есть не только ЖК-дисплей, но и кнопки GPIO, которые можно использовать в качестве геймпада. Плата представляет собой HAT для платы Raspberry Pi Zero 2W, Платы расширения (HAT) — это платы, которые имеют примерно такой же размер, как и плата Raspberry Pi, а разъёмы совместимы с распиновкой RPi Zero 2W. Платы расширения одеваются сверху на плату Raspberry Pi и при этом не требуют никаких других соединений с платой.
Это всё необходимое оборудование, если мы будем запитывать консоль только с помощью кабеля micro USB. Чтобы запитать его от батареи, нужно больше компонентов. Не буду перечислять их все, а просто дам ссылку на прекрасный туториал, которому я следовал.
Софт
Я использовал стоковый образ Fedora Server для этого проекта, никакого дополнительного ПО кроме включённого в дистрибутив не требовалось.
Образ можно прошить с помощью arm-image-installer. Поддержка RPi Zero 2W там не заявлена, но поскольку он очень похож на RPi3, его можно использовать:
sudo arm-image-installer --image=Fedora-Server-36-1.5.aarch64.raw.xz \
--target=rpi3 --media=/dev/$device --addkey=id_rsa.pub --norootpass --resizefs
Здесь $device
— это блочное устройство для загрузочной SD-карты, используемой для установки ОС.
Затем выполняем следующие шаги:
-
Загрузитесь с установочной SD-карты, выполните начальную настройку Fedora, создайте пользователя RetroArch и сделайте его участником групп video и inputs.
-
Установите эмулятор Libretro (например, mGBA для Game Boy Advance) и интерфейс Retroarch.
sudo dnf install libretro-mgba retroarch
-
Создайте сервис для запуска игр
$ mkdir -p ~/.config/systemd/user/
$ cat << EOF > ~/.config/systemd/user/retroarch.service
> [Unit]
Description=Start Doom
[Service]
ExecStart=retroarch -L /lib64/libretro/mgba_libretro.so /home/retroarch/roms/doom.zip
Restart=always
[Install]
WantedBy=default.target
EOF
-
Включите автозапуск сервиса из под пользователя RetroArch в режиме lingering. Последнее необходимо, чтобы служба запускалась при загрузке, даже если пользователь не входил в систему.
$ systemctl --user enable retroarch.service
$ sudo loginctl enable-linger retroarch
-
Добавьте сниппеты конфигов RPi для поддержки LCD и кнопок GPIO.
Бинарные файлы дерева устройств для наложения (DTBO) используются для управления контроллером SPI ЖК-панели и кнопками GPIO. Это adafruit-st7735r.dtbo и gpio-key.dtbo.
Наложения поддерживают параметры, которые можно настроить в файле RPi config.txt. Например, используемые пины, разрешение экрана, необходимость поворота дисплея, код события, о котором необходимо сообщать для каждой кнопки GPIO и т. д.
Для упомянутой выше HAT необходимо добавить в файл /boot/efi/config.txt следующее:
# Enable SPI
dtparam=spi=on
# TFT LCD Hat
dtoverlay=adafruit-st7735r,128x128,dc_pin=25,reset_pin=27,led_pin=24,rotate=90
# GPIO keys configuration
# Directional pad (KEY_UP, KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_ENTER)
dtoverlay=gpio-key,gpio=6,active_low=1,gpio_pull=up,label=UP,keycode=103
dtoverlay=gpio-key,gpio=5,active_low=1,gpio_pull=up,label=LEFT,keycode=105
dtoverlay=gpio-key,gpio=26,active_low=1,gpio_pull=up,label=RIGHT,keycode=106
dtoverlay=gpio-key,gpio=19,active_low=1,gpio_pull=up,label=DOWN,keycode=108
dtoverlay=gpio-key,gpio=13,active_low=1,gpio_pull=up,label=PRESS,keycode=28
# Buttons (KEY_X, KEY_C)
dtoverlay=gpio-key,gpio=21,active_low=1,gpio_pull=up,label=KEY_1,keycode=45
dtoverlay=gpio-key,gpio=20,active_low=1,gpio_pull=up,label=KEY_2,keycode=44
# Power (KEY_POWER), useful to power off the console
dtoverlay=gpio-key,gpio=16,active_low=1,gpio_pull=up,label=KEY_3,keycode=116
-
Решите проблему с ошибкой в драйвере st7735r, из-за которой модуль не загружается автоматически. Чтобы обойти эту проблему, создайте сниппет конфигурации modules-load.d, позволяющий принудительно загрузить модуль:
$ echo st7735r | sudo tee /etc/modules-load.d/st7735r.conf
К сожалению, это частая ошибка в драйверах SPI. Для этого конкретного драйвера обходной путь больше не потребуется, поскольку он уже исправлен нашим коммитом. Но на момент написания этой статьи используемая версия Fedora (36) по-прежнему не содержала исправления.
-
Запретите инициализацию драйвера simpledrm.
Похоже, что прошивка добавляет узел дерева устройств с «simple-framebuffer», даже если к его mini HDM порту не подключён монитор. Это приводит к проверке драйвера simpledrm, поэтому его необходимо запретить с помощью команды:
$ sudo grubby --update-kernel=DEFAULT \
--args=initcall_blacklist=simpledrm_platform_driver_init
-
Обновите adafruit-st7735r.dtbo до последней версии
Это было единственное изменение, которое потребовалось в Fedora 36. Проблема заключается в том, что наложение adafruit-st7735r.dtbo предназначено для устаревшего драйвера fb_st7735r вместо драйвера DRM st7735r. Последний имеет другое свойство узла дерева устройств для указания поворота дисплея, и поэтому параметр rotate=90, указанный в config.txt, будет игнорироваться.
$ curl https://github.com/raspberrypi/firmware/raw/master/boot/overlays/adafruit-st7735r.dtbo -O
$ sudo mv adafruit-st7735r.dtbo /boot/efi/overlays/
Попробуйте! И отличной вам игры.
Что ещё интересного есть в блоге Cloud4Y
→ Как открыть сейф с помощью ручки.
→ Сделайте Linux похожим на Windows 95
→ Как распечатать цветной механический телевизор на 3D-принтере
→ WD-40: средство, которое может почти всё
→ Взлёт и падение игрового чипа 6502.
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем только по делу. А ещё напоминаем про второй сезон нашего сериала ITить-колотить. Его можно посмотреть на YouTube и ВКонтакте.