TV-Top Kiosk: 1080p da un Raspberry Pi Pico 2 W senza framebuffer

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.

Pico 2 W e ESP32-C3 DevKitM-1 collegati sul banco di prova, con il breakout HSTX DVI tra il Pico e il cavo HDMI
Option 2 sul banco: un Pico 2 W e un ESP32-C3 DevKitM-1, con il breakout HSTX DVI tra il Pico e il cavo HDMI. (foto: Aaron Gayle)

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.


Fonte: https://github.com/aarongayle/tvtop-kiosk-firmware

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Menu