Il firmware TV-Top Kiosk trasforma un Raspberry Pi Pico 2 W in una console HDMI per TV-Top Games, la piattaforma di giochi da tavolo in cui il televisore fa da tabellone e i giocatori usano il proprio telefono. Il kiosk si collega al Wi-Fi, si accoppia con il server TV-Top e disegna quello che il gioco corrente gli invia. L’uscita video è a 1920×1080 a 30 Hz in colore a 8 bit per canale, senza framebuffer e senza hardware video esterno. Il firmware è opera di Aaron Gayle.
Il problema da risolvere sta tutto in una divisione. Un frame a 1080p a 24 bit pesa quasi 6 MB, mentre l’RP2350 ha 520 KB di memoria: il frame in RAM non ci sta, e non ci sta nemmeno lontanamente. Perciò non esiste alcun frame in memoria. Ogni scanline viene costruita come flusso di comandi HSTX run-length appena prima che il fascio la raggiunga, sei righe in anticipo, a partire da geometria vettoriale in cache nella flash.
Il serializzatore HSTX dell’RP2350 è dichiarato per 300 Mbit/s per pin, mentre il 1080p30 ne richiede 744. Il chip gira quindi a 372 MHz con il regolatore del core a 1,30 V, e a 1080p ogni lane porta 744 Mbit/s da pin CMOS a 3,3 V. Il segnale HDMI esce da quattro coppie differenziali su otto GPIO: la linea positiva di ogni coppia è il GPIO più basso, quindi non serve invertire nulla. D0 blu su GPIO12 e GPIO13, clock su GPIO14 e GPIO15, D2 rosso su GPIO16 e GPIO17, D1 verde su GPIO18 e GPIO19.
Il pinout HSTX e i modi video supportati
Questo pinout è lo stesso della pico_sock_cfg di libdvi, seguito dalla maggior parte dei breakout DVI per Pico. Di conseguenza va bene un adattatore HSTX-DVI, un Pico DVI Sock, un semplice breakout HDMI o fili saldati a mano. Opzionalmente il DDC su GPIO4 (SDA) e GPIO5 (SCL) permette al comando edid della console di leggere i modi che il display dichiara di supportare. Il video funziona anche senza.
I modi video previsti dal firmware sono questi:
- 720p60, cioè 1280×720, CEA VIC 4, con clk_sys a 372 MHz
- 1080p30, cioè 1920×1080, CEA VIC 34, con clk_sys a 372 MHz
- 1080p25, cioè 1920×1080, CEA VIC 33, con clk_sys a 372 MHz
- 1080p24, cioè 1920×1080, CEA VIC 32, con clk_sys a 372 MHz
- 960x540p60, con clk_sys fra 351 e 372 MHz
- 480p60, cioè 640×480, con clk_sys a 252 MHz
Il 1080p30 richiede un sink che accetti una line rate di 33,8 kHz. Infatti i modi 1080p25 e 1080p24 servono proprio per TV che non salgono sopra i 30 kHz. La scelta del modo non è solo una questione di compatibilità: passando a 720p60 si liberano circa 140 KB di line pool, perché le scanline da costruire sono più corte.
Dove sta il TLS: due opzioni e la memoria che resta
La configurazione option 1 a 1080p con TLS lascia circa 48 KB dei 520 KB dell’RP2350 per lo heap. Un handshake mbedTLS richiede da 30 a 40 KB di quello heap, quindi il margine è stretto. Con option 2, dove il TLS sta sull’ESP32, restano circa 79 KB liberi. In entrambi i casi il modem ESP32 si costruisce con ESP-IDF.

Al primo avvio il kiosk non ha credenziali Wi-Fi e avvia un access point aperto chiamato TVTOP-xxxx, mostrandone il nome sul televisore. Ci si collega dal telefono, la pagina di setup si apre da sola, si sceglie la rete e si preme Save. Poi il kiosk si registra con il server e mostra sul TV un codice di accoppiamento da inserire nell’app. Per il portale di setup il progetto riusa il server DHCP preso da pico-examples.
Per ricompilare tutto servono Pico SDK dalla versione 2.2.0 in poi, la Arm GNU toolchain, cmake, ninja e picotool. Il progetto incorpora PicoDVI di Luke Wren come vendor/libdvi, usa stb per la rasterizzazione dei font e richiede ESP-IDF per la build del modem ESP32. Chi vuole rifarlo trova tutto nel repository di codice di Aaron Gayle, firmware compreso.
