Под "с нуля", конечно же, понимается использование готового процессора (в данном случае - ARM-микроконтроллер), готового дисплейного модуля и.т.п. Моя задача заключается в разводке платы, придумывании дизайна (а-ля кирпич) и написании прошивки с драйверами, которая позволяет использовать ресурсы консоли на максимум.
Характеристики:
Процессор (микроконтроллер): Raspberry Pi Pico (RP2040), 133мгц, два ядра Cortex-M3. Второе ядро пока не юзаю - притулить некуда (возможно будет растеризатором примитивной 3D-графики на уровне пс1, сонерики же смогли с Mascot Capsule - чего я не смогу?).
ОЗУ: 264кб SRAM. При таком разрешении экрана, этого хватает даже на весьма комплексные игры.
ПЗУ: Внешняя 2мб SPI-флэшка. Как ее организовывать пока не придумал, скорее всего сделаю сейвы как в PlayStation. ФС пока что нет - ассеты линкуются статически с игрой в виде C-массивов.
Питание: Автономная работа от аккумулятора. Хотелось бы результата около 6 часов на BL-4C (800мАч), пока что потребление составляет 210мАч (нужно настроить клоки и подсветку дисплея - она кушает больше всего). Зарядка АКБ будет обеспечиваться модулем TP4056.
Дисплей: 1.8", TN с разрешением 128x160. Считаю это разрешение оптимальным для МК - и процу не тяжело в роли блиттера выступать, и на SPI-контроллер нагрузка не слишком тяжелая. Жалко нет матриц диагональю побольше - на 2.4 тоже смотрелось бы нормально.
Звук: Динамик, звук скорее всего будет через встроенный ШИМ-контроллер (хардварный само собой). Можно было бы реализовать внешний ЦАП с i2s, но для удешевления пусть звуком занимается проц
Управление: 6 кнопок - 4 направления и 2 действий. Должно быть вполне достаточно для небольших игрушек.
Запуск игр: Пока не определился. Либо игры будут статически лнковаться с остальной прошивкой, либо будем писать их на lua (местное ABI пока ниасилил, но буду разбираться позже. Если разберусь - то будут бинарники).
По сути, консоль по мощности и хар-кам близка к телефонам 2004-2005 года: Siemens S65/C75, Samsung X100, Sony Ericsson K510i.
Прошивка:
Быстрая работа с дисплеем. Отрисовкой (по сути - блиттингом, т.к векторных операций там мало) занимается процессор. После подготовки кадра, фреймбуфер скармливается DMA-контроллеру, а тот передает его через SPI на дисплей на частоте ~60мгц. Получаем неплохой FPS.
Прямой доступ к стейту ввода. Кнопки опрашиваются каждый кадр, получить к ним доступ можно напрямую - без всяких новомодных axis и.т.п.
Простое и понятное API. Вся игра пишется с использованием простого и понятного API, прям как Pico-8: grDrawBitmap, grFillRect, fwGetTime и.т.п.
Сейчас уже есть наработки:
Собрал прототип на макетке, написал часть прошивки. На данный момент есть: графика, ввод, драйвер дисплея, что-то типа фреймворка для игр и пишется первая сэмпловая игра. Позже будет менюшка с выбором игр и какой-никакой ассет-пайплайн.
Вот так выглядит прототип:
Позже хочу написать статью про разработку этой консоли и если кому интересно - готов буду собрать экземпляр для них, по себестоимости (в пределах 800-1.000 рублей за штуку).
Я прост смотрю на вот эти консольки, которые люди собирают на малинах или ардуинах с готовыми библиотеками для работы с дисплеями и.т.п.
Но это же не так круто, как пилить что-то с нуля. Да, конечно же API RPi Pico весьма простое по меркам эмбеда, но оно достаточно близко к bare-metal, в отличии от ESP32, где всем рулит FreeRTOS.
Консольки на линухе я уважаю, но не когда люди подключают здоровые дисплеи через HDMI(!) с преобразователями LVDS -> HDMI, которые сами по себе жрут немало. Это дичь как по мне, и как это портативом назвать? Настоящая портативная консоль сможет работать хотя-бы 3-4 часа даже на АКБ <1.000мАч. Особенно мне не нравится, когда люди накатят иксы и ретропай и вот типа - моя консоль. Я б на их месте напрямую написал бы "морду", которая общалась бы с фреймбуфером (что я уже делал) и сам портировал эмули под свою платформу - так в разы интереснее!
monobogdan
> Управление: 6 кнопок - 4 направления и 2 действий.
Очень мало для таких характеристик. Настоятельно рекомендую ориентироваться на геймпад от SNES. Если дойдёт до эмуляции то таковым покроется и SNES и SMD, но главное что это действительно удобно и уместно для нормальных игр.
=A=L=X=
Пока консоль все еще находится на стадии прототипа, можно будет добавить) подумаю об этом, как минимум start и select пригодились бы!
Интересно что там китайцы юзают в всяких Sup. Полагаю, тоже какие-то похожие мощные МК, либо дешевые системы на чипе (AllWinner V3s/F1C100s как вариант).
monobogdan
> как минимум start и select пригодились бы!
Вот селект довольно бестолковая кнопка. Start как вызов меню/паузы нужен, да, но опять таки исторически как кнопка запуска игры есть просто атавизм от игровых автоматов где это был сигнал от монетоприёмника. В любом случае двухкнопочность это слишком мало - даже на денди было четыре кнопки включая селект и старт. Но две кнопки экшона реально мало - сейчас уже даже аналог контры стрельбой и прыжком не обходится - нужны вещи типа выбора оружия, подката, активации крюка и так далее. :) В общем контроллер по типу SNES для таких мощностей, имхо, самое то. Можно даже 3D-шутер затащить типа Doom без костыльного управления (бамперы ходят влево-вправо).
monobogdan
> Под "с нуля", конечно же, понимается использование готового пр
Нет с нуля, так с нуля. Бери лопату иди копай руду.
=A=L=X=
Будем пилить! Порт вольфа был бы интересен, но ОЗУ не хватит.
monobogdan
> Дисплей: 1.8", TN с разрешением 128x160.
Нет, такой хоккей нам не нужен. 320x200 и возможность запускать эмуляторы/пилить порты с 8/16 бит консолей это необходимый минимум. Если в малинке нет нормального видеоядра, - можно прицепить FT81x по SPI (можно посмотреть, как это сделано на Gameduino)
monobogdan
> Можно было бы реализовать внешний ЦАП с i2s, но для удешевления пусть звуком
> занимается проц
Оно какие-то копейки стоит же. Я себе собирал ёRadio, там как раз i2s ЦАП применяется, в районе 200р за модуль.
=A=L=X=
> Настоятельно рекомендую ориентироваться на геймпад от SNES. Если дойдёт до
> эмуляции то таковым покроется и SNES и SMD, но главное что это действительно
> удобно и уместно для нормальных игр.
Можно увеличить характеристики до платы Raspberry Pi Pico W и цеплять плоевский джой по блюпупу
0iStalker
> Gameduino
У Gameduino в какой-то версии вообще роль видеоядра ПЛИС выполняет :) Может сразу и фпга распаивать начнем!?
0iStalker
> Если в малинке нет нормального видеоядра
128кб фреймбуфер при 565 пиксельформате - хочешь чтобы половину ОЗУ съел чисто экран? :)
monobogdan
> половину ОЗУ съел чисто экран
Так увеличь ОЗУ, с таким-то процоп.
master-sheff
> Так увеличь ОЗУ, с таким-то процоп.
У проца нет внешней шины для ОЗУ, только для SPI-памяти. Шина есть у ESP32, причем именно для SPI SRAM :)
Ren
> Нет с нуля, так с нуля. Бери лопату иди копай руду.
В Майнкрафте давно уже процессор запилили. Накопав предварительно руды.
Запилил первую игрушку для консоли. Сейчас это еще прототип - поиграть уже можно, но цели как таковой нет.
Писал на C, трушно, практически везде статика, кроме пулов (для противников и пуль) - для них используются аллоки. Аллоки же и помогли найти попорченную память в одном из драйверов.
monobogdan
> 128кб фреймбуфер при 565 пиксельформате - хочешь чтобы половину ОЗУ съел чисто
> экран? :)
При некоторой ловкости рук фреймбуфер заменяется на строчный буфер - https://habr.com/ru/articles/496046/
inoremap
Пасиб за наводку. Потом возможно второе ядро займется 3D-графикой полностью, там ресурсов для этого хватит.