Портативная игровая консоль Pocket Pi SF32¶
Зафиксированный снимок исходников
Если не указано иное, описание поведения кода в этой статье относится к commit 7d9fac2 проекта PocketPi. Ветка main исходного проекта может изменяться; для воспроизведения описанного состояния переключитесь на зафиксированный commit.
Что такое Pocket Pi?¶
SiFliSparks/PocketPi — это проект-образец портативной игровой консоли и эмулятора для SF32LB52. В зафиксированной ревизии исходного кода объединены эмулятор NES Nofrendo, игровой каталог на LVGL, дисплей ST7789 с интерфейсом 8080 и разрешением 320 × 240, аудиотракт, сохранение и загрузка состояния, встроенная файловая система и каталог ROM на TF-карте. В качестве открытой базовой конфигурации сборки используется Huangshan Pi / sf32lb52-lchspi-ulp.
Проект позволяет проверить совместную работу локальной графики, ввода, аудио, внешнего хранилища, распределения PSRAM и нагрузки эмулятора на системе SF32LB52. В репозитории нет коммерческих игровых ROM: пользователь должен самостоятельно предоставить файлы .nes/.NES, которыми вправе пользоваться. Открытый исходный код также не является готовым к серийному производству проектом портативной консоли и не заменяет проверку безопасности аккумулятора, аудио, ЭМС, теплового режима, лицензий и распространения контента.

Зачем нужна реализация на SF32?¶
Эмуляция NES объединяет несколько характерных для встраиваемых систем задач в одном наглядном сценарии: эмуляция CPU, графика PPU, обработка аудиосэмплов, низколатентный ввод, чтение файлов, буферизация кадров и сохранение состояния должны работать согласованно. Система на базе SF32LB52 предоставляет необходимые для этого ресурсы дисплея, аудио, внешнего хранения и PSRAM; Huangshan Pi также служит платформой для оценки работы от аккумулятора.
Это не означает, что все игры NES полностью совместимы. Поддержка мапперов ROM, частота кадров, аудио, сохранение состояния, пиковое потребление памяти и задержка ввода могут различаться в зависимости от игры. Для каждого добавляемого ROM-файла или маппера отдельно проверяйте совместимость и авторские права.
Результат, область применения и условия начала¶
Ожидаемый результат: собрать воспроизводимый образ из commit PocketPi, зафиксированного в спецификации ПО, запустить хотя бы один ROM-файл, которым разрешено пользоваться, проверить дисплей, ввод, аудио, паузу, сохранение, загрузку, выход и восстановление, а затем выполнить одно ограниченное изменение.
Эта статья не гарантирует поддержку всех мапперов NES, режимов PAL/NTSC, аудиотрактов игр, форматов сохранений или сторонних ROM-файлов. Она не предоставляет права копировать или распространять игровой контент. В корне репозитория на зафиксированной ревизии нет файла лицензии; прежде чем использовать код в продукте или распространять бинарные файлы, ответственный должен установить условия лицензирования PocketPi, Nofrendo и каждого включённого стороннего компонента.
Перед началом подготовьте:
- SF32LB52-DevKit-ULP / Huangshan Pi либо оборудование, соответствующее описанию платы
sf32lb52-lchspi-ulpв репозитории; - дисплей 320 × 240, расширитель ввода-вывода AW9523 с интерфейсом I²C, кнопки, аудио и предусмотренный кодом зафиксированной ревизии опциональный тракт TF-карты; одно лишь название платы не подтверждает, что все периферийные устройства установлены;
- SiFli-SDK, SCons, средства загрузки по UART и ведения журналов;
- тестовую ROM
.nes, созданную самостоятельно, находящуюся в общественном достоянии или имеющую подходящую лицензию; - ROM-файл в каталоге
disk/репозитория для встроенной файловой системы либо в каталоге ROM на TF-карте, настроенном в прошивке. Зафиксированная ревизия во время работы ищет ROM в/sdcard/roms/nes; проверьте по исходному коду этой ревизии, соответствует ли ему точка монтирования карты; - средства наблюдения за кадрами, аудио, вводом, памятью и током потребления.
| Область | Конфигурация в зафиксированном исходном коде | Что зафиксировать перед адаптацией |
|---|---|---|
| Плата | sf32lb52-lchspi-ulp |
Ревизии платы, расширителя, дисплея, аудио, хранилища и цепей питания |
| Контент | В зафиксированной ревизии сканируются только .nes и .NES; файл .jpg с тем же именем может служить обложкой |
Источник и лицензия ROM, хеш файла, маппер и происхождение изображения |
| Хранение | Из disk/ собирается fs_root; во время работы также выполняется поиск в /sdcard/roms/nes |
Образ файловой системы, формат TF-карты, каталог и журнал восстановления после ошибок |
| Ввод | В зафиксированной ревизии код считывает A/B, направления, Start, Select, Menu, L/R и связанные кнопки через расширитель AW9523 I²C | Схема и назначение выводов, полная матрица кнопок и результаты одновременных нажатий |
| Эмулятор | Ядро NES Nofrendo, дисплей, аудиотракт 32 kHz, сохранение и загрузка состояния | Совместимость игр, кадры и аудио, состояние, память и результаты проверки после сброса |
Аппаратные и программные спецификации¶
Аппаратная спецификация¶
| Компонент | Требования | Назначение | Статус | Где получить | Совместимость и варианты замены |
|---|---|---|---|---|---|
| Базовая сборка Huangshan Pi / SF32LB52-DevKit-ULP | Цель платы sf32lb52-lchspi-ulp; исходники PocketPi в зафиксированной ревизии рассчитаны на дисплей ST7789 с разрешением 320 × 240, I²C-расширитель ввода-вывода AW9523, аудио и интерфейс TF-карты |
Запускает эмулятор и подсистемы дисплея, ввода, аудио и хранения | Обязательно | Описание платы μForge; страница LCKFB; исходники проекта | Проверьте точную сборку и установленную периферию; одно лишь имя цели не подтверждает эквивалентность плат |
| TF-карта | Карта и файловая система, читаемые выбранной прошивкой; в зафиксированной ревизии путь во время работы — /sdcard/roms/nes |
Дополнительное внешнее хранилище ROM | Необязательно | Исходники PocketPi | Проверьте точку монтирования, формат, горячее подключение и восстановление на зафиксированной ревизии |
| Хост для сборки и USB-кабель с линиями данных | Хост с выбранной цепочкой инструментов SiFli-SDK; кабель с линиями данных для документированного подключения платы при загрузке/отладке | Сборка, загрузка и сбор журналов последовательного порта | Обязательно | Краткое руководство SiFli-SDK | Запишите ОС и архитектуру хоста, кабель/адаптер, порт и способ восстановления; кабель только для зарядки не подходит |
Huangshan Pi не подтверждена как готовая конфигурация с подходящей периферией
В руководстве SiFli по Huangshan Pi описан AMOLED-дисплей диагональю 1,85 дюйма, разрешением 390 × 450 и интерфейсом Quad-SPI, а также функциональная кнопка и кнопка питания платы. Исходный код PocketPi в зафиксированной ревизии, напротив, рассчитан на тракт дисплея ST7789 с разрешением 320 × 240 и интерфейсом 8080, а также на ввод через AW9523 по I²C. Официальное руководство не подтверждает, что в описанную сборку входят подходящие периферийные устройства. Проверьте фактические дисплей, адаптер и оборудование ввода либо перенесите соответствующие программные тракты и повторите регрессионные проверки дисплея и ввода, прежде чем считать эту плату готовой к использованию без адаптации.
Программная спецификация¶
| Пакет или сервис | Требуемая версия или ревизия | Назначение | Статус | Где получить | Совместимость и обновление |
|---|---|---|---|---|---|
| SiFliSparks/PocketPi | Проверенный commit 7d9fac2 |
Приложение, интеграция Nofrendo, образ файловой системы и цель платы | Обязательно | Репозиторий | Отдельно учитывайте лицензии и хеши ROM и исходников репозитория |
| OpenSiFli/SiFli-SDK | В статье не зафиксирован точный commit; выберите совместимую ревизию и запишите её | RTOS, поддержка платы, драйверы, сборка SCons и средства загрузки | Обязательно | Репозиторий | Не считайте main заведомо совместимым; используйте вместе зафиксированные commits приложения и SDK |
| Среда SCons и средства загрузки UART | Версии, соответствующие выбранной ревизии SiFli-SDK | Сборка и загрузка sf32lb52-lchspi-ulp |
Обязательно | Краткое руководство SiFli-SDK | Запишите ОС хоста, настройку SDK, журнал сборки и созданный скрипт загрузки |
| Тестовая ROM | Выбранный пользователем файл .nes/.NES, который разрешено использовать; запишите mapper и SHA-256 |
Проверка обнаружения файла, декодирования, эмуляции и аудио | Обязательный тестовый материал | PocketPi не публикует ROM для загрузки; подготовьте файл с подтверждёнными правами и сверьтесь с исходниками проекта | Проверяйте совместимость для каждой игры и mapper; права и хеш контента учитывайте отдельно от исходников проекта |
| Обложка | Необязательный файл .jpg с тем же базовым именем, что и ROM; запишите источник, права и SHA-256 |
Проверка декодирования обложки и перехода к изображению по умолчанию в игровом каталоге | Необязательно | Предоставляется пользователем; PocketPi не публикует обложки. См. исходники проекта | Помещайте в disk/ только изображения, разрешённые для распространения; запишите источник и хеш |
Выбор поддерживаемой базовой конфигурации¶
Используйте ревизию PocketPi, зафиксированную в спецификации ПО, а не коммит, на который в данный момент указывает main:
git clone https://github.com/SiFliSparks/PocketPi.git
cd PocketPi
git checkout 7d9fac2cb577d6c9b66a99521aebf3c9de0ae163
cd project
scons --board=sf32lb52-lchspi-ulp -j8
Скрипт сборки преобразует ../disk в образ файловой системы и добавляет его в прошивку под именем fs_root. В Windows для загрузки используется созданный файл build_sf32lb52-lchspi-ulp_hcpu\uart_download.bat. В других ОС применяйте соответствующую утилиту SiFli-SDK и фиксируйте эквивалентные параметры.
| Элемент | Базовый вариант | Важное ограничение |
|---|---|---|
| ROM | Начните с небольшого файла ROM .nes или .NES, которым разрешено пользоваться и у которого известен маппер |
Сканер в зафиксированной ревизии принимает только .nes и .NES; наличие файла в списке не означает совместимость с эмулятором |
| Обложка | Необязательный файл .jpg в том же каталоге с тем же базовым именем |
При ошибке декодирования должно отображаться изображение по умолчанию, а список игр должен оставаться доступным |
| Дисплей | Интерфейс в зафиксированной ревизии использует разрешение 320 × 240, а исходный код задаёт поворот на 270° | Для другого LCD или ориентации нужна полная регрессионная проверка дисплея и ввода |
| Ввод | Следуйте назначению AW9523 из input.c и input.h в зафиксированной ревизии |
Раздел README о прямом GPIO, девяти кнопках и сочетаниях с Select устарел |
| Состояние игры | Используйте пункты Save State / Load State в меню паузы | Целостность после потери питания, формат слотов и совместимость между версиями ещё нужно подтвердить |
Описание ввода в README расходится с зафиксированным исходным кодом
В README описаны key_pin_def[], опрос GPIO с частотой 200 Hz и сочетания с Select. Код зафиксированной ревизии считывает кнопки через расширитель AW9523 I²C с адресом 0x5B; Menu открывает меню паузы с пунктами Save State, Load State и Exit Game, а L/R управляют настройкой Audio Shift. При воспроизведении проекта и разработке аппаратуры ориентируйтесь на зафиксированный исходный код и схему, а не на устаревшую таблицу GPIO.
Этапы проекта¶
| Этап | Какое решение поддерживает | Требуемый результат |
|---|---|---|
| 1. Неизменённая база | Может ли целевая аппаратура отобразить в списке и запустить одну ROM, которой разрешено пользоваться? | Запись версий, сборки, ROM, загрузки, изображения и аудио |
| 2. Взаимодействие и восстановление | Надёжны ли ввод, пауза, сохранение, загрузка, выход и сброс? | Запись функциональных проверок и восстановления на уровне игры |
| 3. Воспроизводимость исходников | Может ли второй инженер собрать такую же файловую систему и образ? | Сборка с зафиксированными версиями, хеши артефактов и повторный результат |
| 4. Контролируемая адаптация | Можно ли изменить ROM, интерфейс или аппаратуру, не нарушив базовую работу? | Описание изменения, лицензии контента, производительности и регрессионных тестов |
| 5. Оценка продукта | Достаточно ли надёжна эта основа для собственной портативной аппаратуры и стратегии распространения контента? | Решение по совместимости, лицензиям, питанию и рискам |
Архитектура системы и зависимости¶
flowchart LR
B["Входные данные сборки\nROM NES, которыми разрешено пользоваться, в disk/"] --> F["Образ файловой системы fs_root"]
C["TF-карта\n/sdcard/roms/nes"] --> L["Каталог игр LVGL"]
F --> L
L --> N["Эмулятор NES Nofrendo\nCPU, PPU, мапперы, состояние"]
I["Кнопки AW9523 по I²C\nA/B, направления, Start, Select, Menu, L/R"] --> N
N --> V["Дисплей ST7789 (320 × 240)"]
N --> A["Аудиотракт 32 kHz"]
N <--> S["Сохранение / загрузка состояния"]
D["SiFli-SDK и поддержка платы\nPSRAM, Flash, TF-карта, аккумулятор"] --> L
D --> N
К основным областям отказа относятся файловая система/ROM, маппер/эмулятор, PSRAM/память, дисплей/тайминг кадров, ввод AW9523, аудио, сохранение состояния и питание/сброс. При чёрном экране сначала выясните, не обнаружена ли ROM, не удалось ли декодировать обложку, поддерживается ли маппер, выделился ли буфер кадров и исправен ли тракт LCD. Не сводите все такие случаи к общей ошибке эмулятора.
Этап 1 — Зафиксируйте исходную конфигурацию игры¶
Цель: на одной тестовой ROM, использование которой разрешено, подтвердить весь путь от входных данных сборки до запущенной игры.
- Зафиксируйте коммиты PocketPi и SiFli-SDK, а также ревизии платы и периферийных устройств.
- Поместите разрешённую ROM
.nesвdisk/; если добавляете обложку, используйте файл.jpgс тем же базовым именем. Запишите хеш ROM, источник и маппер. - Выполните чистую сборку и убедитесь, что
fs_rootсоздан и включён в файлы для загрузки. - Загрузите прошивку и выполните запуск после полного снятия питания. Убедитесь, что игра появилась в списке, отображается обложка или изображение по умолчанию и игру можно запустить.
- Запишите время запуска, стабильность изображения, реакцию кнопок, аудио и последовательный журнал; затем сбросьте устройство и повторите тест.
Сохраняемые свидетельства: коммиты репозитория/SDK, версии платы и периферии, хеш и лицензия ROM, журнал сборки, образ файловой системы, журнал загрузки, последовательный журнал, снимки списка игр и работающей игры.
Критерий выхода из контрольной точки 1: при двух холодных запусках одна и та же ROM отображается в списке и запускается; поведение дисплея, основных направлений/A/B/Start/Select и аудио воспроизводимо.
Этап 2 — Проверьте ввод, сохранения и восстановление после отказов¶
Цель: превратить факт «игра запускается» в проверяемую базовую конфигурацию портативной консоли.
| Проверка | Метод | Признак успешного прохождения |
|---|---|---|
| Все кнопки | По отдельности и в нужных сочетаниях проверьте A, B, направления, Start, Select, Menu, L и R | Нет залипаний, перестановок или необъяснимых повторных нажатий; назначение соответствует коду зафиксированной ревизии |
| Экран паузы | Во время игры нажмите Menu; проверьте возврат, Save State, Load State и Exit Game | Фокус меню, пауза/возобновление и выход работают воспроизводимо |
| Сохранение/загрузка | Сохраните состояние в узнаваемом эпизоде, измените его и загрузите сохранение | Восстанавливается ожидаемое состояние; файл и слот сохранения можно отследить |
| Файловые системы | Проверьте пустой disk/, недопустимое расширение, повреждённую ROM, отсутствующий/повреждённый JPG и недоступную TF-карту |
Интерфейс не завершается аварийно; последовательный журнал пригоден для диагностики; изображение по умолчанию и корневая файловая система остаются доступными |
| Сброс и питание | Выполняйте сброс или отключайте питание во время игры, паузы, до/после сохранения и на экране списка | Файловая система остаётся целой; устройство возвращается к доступному списку или выдаёт явное состояние отказа |
| Длительная работа | Запустите одну показательную игру на продолжительное время | Нет непрерывного роста потребления памяти, сбоев аудио/видео, потери ввода или аномального нагрева |
Критерий выхода из контрольной точки 2: для выбранной ROM задокументированы ввод, дисплей, аудио, пауза, сохранение, загрузка, выход и сброс; каждый отказ отнесён к определённой области.
Этап 3 — Подготовьте воспроизводимую базу исходников и контента¶
Цель: дать другому инженеру возможность собрать ту же прошивку и образ контента.
- Зафиксируйте версии PocketPi, SiFli-SDK и всех сторонних ядер.
- Создайте для
disk/манифест с именами файлов, хешами, источниками и лицензиями каждой ROM и обложки. Не добавляйте в репозиторий ROM, которые нельзя распространять. - Выполните сборку из пустого каталога результатов и сохраните
fs_root, прошивку, результаты анализа памяти/разделов, скрипт загрузки и хеши. - Повторите сборку на втором компьютере или в чистом каталоге и заново выполните основные проверки этапа 2.
Критерий выхода из контрольной точки 3: по манифестам исходников и контента можно получить образ с совпадающими хешами либо объяснимыми различиями без недокументированных локальных файлов.
Этап 4 — Меняйте только одну переменную за раз¶
Цель: измерить границы возможностей эмулятора, контента и аппаратуры.
| Категория изменения | Подходящее первое изменение | Необходимые регрессионные проверки |
|---|---|---|
| Контент | Добавьте одну ROM, которой разрешено пользоваться, и при необходимости обложку | Обнаружение, маппер, запуск, кадры/аудио, ввод, сохранение и лицензия |
| Интерфейс списка игр | Шрифт, обложка, сортировка или сообщение для пустого списка | Память, прокрутка, изображение по умолчанию, длинные имена файлов и повреждённый JPG |
| Ввод | Измените одно назначение AW9523 или физическое расположение кнопок | Все кнопки, одновременные нажатия, меню, сбой I²C и запуск |
| Дисплей | Ориентация, LCD или стратегия буферизации кадров | Геометрия 320 × 240, тайминг кадров, разрывы изображения, память и восстановление после выхода |
| Аудио | Громкость, Audio Shift или выходная аппаратура | Тракт 32 kHz, искажения, опустошение аудиобуфера, одновременная работа дисплея/хранилища и отключение звука |
| Хранение | Каталог на TF-карте или политика файлов состояния | Ограничения горячего подключения, повреждение данных, потеря питания, заполнение носителя и резервный путь |
Критерий выхода из контрольной точки 4: изменение и права на контент проверены, исходный образ можно восстановить, а все проверки этапа 2 для выбранной ROM проходят.
Этап 5 — Оценка готовности продукта¶
Перед разработкой собственной аппаратуры портативной консоли или распространением контента ответьте на вопросы:
- Какие мапперы требуются целевому набору игр? Проверены ли частота кадров, аудио, память и сохранение состояния для каждой ROM?
- Ясны ли лицензии и права распространения PocketPi, Nofrendo, SiFli-SDK, шрифтов, обложек, звуковых файлов и ROM?
- Подготовлены ли полные схемы, ведомость компонентов (BOM) и производственные тесты для AW9523, LCD, аудио, TF-карты, аккумулятора и цепи зарядки?
- Каковы ток потребления во время игры, отображения списка, паузы, сна и выключения, а также время работы, температура и поведение при низком заряде?
- Как защищать и переносить сохранения после потери питания, обновления версии, заполнения носителя или повреждения данных?
- Как восстановить устройство при повреждении файловой системы, неудачном обновлении, чёрном экране или ROM-файле, из-за которого устройство не загружается?
Критерий выхода из контрольной точки 5: для рисков, связанных с матрицей совместимости, лицензированием контента и ПО, ответственностью за аппаратную часть, питанием и восстановлением, назначены ответственные и принято решение продолжать, отложить или прекратить работу.
Передача материалов для проектирования изделия¶
Передайте дальше сведения о выборе микросхемы/модуля SF32, пиковом использовании PSRAM и Flash, тракте дисплея/буфера кадров, матрице ввода AW9523, аудиоусилителе и динамике, TF-карте и встроенной файловой системе, формате сохранений, аккумуляторе/зарядке, порте загрузки для восстановления, матрице совместимости ROM/мапперов и полном манифесте лицензий. Продолжите с материалов SF32LB52x, SF32LB52-DevKit-ULP, Сборка, прошивка и мониторинг последовательного вывода в SiFli-SDK и Разработка для серийного производства.
Основные источники¶
- SiFliSparks/PocketPi
- Зафиксированный эталонный коммит
7d9fac2 - Плата LCKFB Huangshan Pi SF32LB52-ULP
- OpenSiFli/SiFli-SDK
- Руководство SiFli по Huangshan Pi
- SiFli-SDK: руководство по началу работы
- pebri86/esplay-retro-emulation
- Документация LVGL
Последнее обновление: