úterý 1. srpna 2023

RP2040 Doom

Mikrokontrolér RP2040. Dvoujádrový Cortex-M0+ na 133MHz, 264kB SRAM, žádná FLASH. Na tomhle železe dokáže běžet klasika mého dětství, střílečka Doom? Ano, díky experimentálnímu portu rp2040-doom dokáže!

Tohle jsem prostě musel zkusit. Raspberry Pi Pico s 2MB FLASH a Pimoroni Pico VGA Demo deska, nahrát software a jedem. Opravdu to funguje! Člověk, co to portoval, je borec. A povídání o jeho postupech rozhodně stojí za přečtení.

Hračku jako je tato prostě musím mít. Takže hurá na návrh vlastního dedikovaného hardwaru. Dlužno říct, že s RP2040 jsem dosud nedělal... a tady se ždímá nadoraz. Je přetaktované z 133MHz na 270MHz, napětí jádra zvednuté z nominálních 1,10V na 1,30V, QSPI komunikace s FLASH na 135MHz... všechno mimo specifikace. Na originální desce něco výjimečně zatuhne, ale většinou to funguje.

Můj design je v 0603 kde to šlo, takže blokování trochu horší než s originálními 0201 těsně u čipu. FLASH paměť jsem zvolil maximální podporovanou, tj. 16MB - když už, tak už. Místo SMPS stačí pro napájení z USB jen LDO. Audio DAC dedikované napájení nepotřebuje. Konektory: USB-A pro klávesnici a update FLASH, MiniUSB-B pro napájení, 4pin pro I2C multiplayer, audio jack a VGA konektor.

Destičky z Číny dorazily, osadil jsem, připojil přes USB bootloader, nahrál... a nic. No, takže klasika, nic nefunguje napoprvé. Aspoň byla příležitost se skamarádit s RP2040, jeho SDK a Dockerem pro build systém. Očekával jsem problém v přetaktování - blbě naroutované blokování nebo QSPI sběrnice k FLASH. V podstatě to tak bylo, i když trošku složitější. Rychlosti nakonec čip v pohodě dává, problém je v přetaktování těsně po bootu. Evidentně není dosud usazené napětí jádra, na osciloskopu to vypadalo dobře, ale drobné glitche je problém zachytit. Ačkoliv se mi 270MHz podařilo dosáhnout jak bez boostu (na nominálních 1,10V) tak při zvýšení (na 1,30V), vždy bylo potřeba před přepnutím frekvence chvíli počkat. Chvíli jsem empiricky určil na 2-3ms, s rezervou 10ms. Autor s podobným problémem evidentně příležitostně také bojoval. Po přidání pauzy jsem si schválně udělal malé srovnání rychlostí originálu a mé desky - kam až se dá jít s frekvencí jádra, než RP2040 zatuhne? Pozor na to, že experimenty v diskuzích obvykle tak leda toglují pinem (první sloupec), což není typická zátěž. Já nechal procesor přečíst celou FLASH a udělat její XOR checksum pro kontrolu (druhý sloupec).

Deska / test          Delay loop   FLASH XOR
------------          ----------   ---------
RPi Pico 1,1V                      280 MHz
RPi Pico 1,3V                      303 MHz
RP2040 Doom 1,1V      316 MHz      279 MHz
RP2040 Doom 1,3V      399 MHz      306 MHz

Výsledek uspokojivý, čísla jsou prakticky stejná jako pro RPi Pico a problém je jen v bootu. Přidal jsem tedy pauzu a přeložil binárky. Doom nastartoval! Akorát bez zvuku. Další pátrání... ach to osazování, nábojová pumpa na audio DACu s 2n2 místo 2u2 fungovat nebude. Opraveno a už to valí!

Z archivu Doom WAD souborů jsem vybral The Ultimate Doom a Doom II - Hell on Earth (v1.9) a vytvořil WHX soubory pro "not so tiny" verzi emulátoru. Pro zájemce dávám ke stažení archiv s kompletním hardwarem, UF2 binárkami a příslušnými WHX soubory. A co je možná nejdůležitější, mé náhodné poznámky z kompilace v Dockeru. Na internetu lze nalézt také funkční picotool pro Windows.