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

Железо

Я использовал Waveshare, 1,44-дюймовый ЖК-дисплей HAT 128x128 пикселей для 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-карты, используемой для установки ОС.

Затем выполняем следующие шаги:

  1. Загрузитесь с установочной SD-карты, выполните начальную настройку Fedora, создайте пользователя RetroArch и сделайте его участником групп video и inputs.

  2. Установите эмулятор Libretro (например, mGBA для Game Boy Advance) и интерфейс Retroarch.

sudo dnf install libretro-mgba retroarch

  1. Создайте сервис для запуска игр

$ 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
  1. Включите автозапуск сервиса из под пользователя RetroArch в режиме lingering. Последнее необходимо, чтобы служба запускалась при загрузке, даже если пользователь не входил в систему.

$ systemctl --user enable retroarch.service
$ sudo loginctl enable-linger retroarch
  1. Добавьте сниппеты конфигов 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
  1. Решите проблему с ошибкой в драйвере st7735r, из-за которой модуль не загружается автоматически. Чтобы обойти эту проблему, создайте сниппет конфигурации modules-load.d, позволяющий принудительно загрузить модуль:

$ echo st7735r | sudo tee /etc/modules-load.d/st7735r.conf

К сожалению, это частая ошибка в драйверах SPI. Для этого конкретного драйвера обходной путь больше не потребуется, поскольку он уже исправлен нашим коммитом. Но на момент написания этой статьи используемая версия Fedora (36) по-прежнему не содержала исправления.

  1. Запретите инициализацию драйвера simpledrm.

Похоже, что прошивка добавляет узел дерева устройств с «simple-framebuffer», даже если к его mini HDM порту не подключён монитор. Это приводит к проверке драйвера simpledrm, поэтому его необходимо запретить с помощью команды:

$ sudo grubby --update-kernel=DEFAULT \
--args=initcall_blacklist=simpledrm_platform_driver_init
  1. Обновите 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 и ВКонтакте.

Свежая серия

Комментарии (1)


  1. axe_chita
    13.07.2022 04:16

    А ещё говорят, что лепить троллейбус из буханки это чисто русское развлечение. Ну судя по источнику перевода, это интернациональное занятие. :)
    Особенно умилил ЖК экран разрешением 128х128 и диагональю 1,44 дюйма, словно сошедший из какойто цветной Nokia из середины 2000-х.