Aaron Gayle publicó TV-Top Kiosk, un firmware que convierte una Raspberry Pi Pico 2 W en una consola HDMI para TV-Top Games, la plataforma de juegos de mesa en que el televisor hace de tablero y cada jugador usa su propio teléfono. El kiosco se conecta a una red wifi, se empareja con el servidor de TV-Top y dibuja lo que el juego en curso le manda. La salida de video es de 1920×1080 a 30 Hz con 8 bits de color por canal, sin framebuffer y sin hardware de video externo, según Open Electronics.

El problema se reduce a una división. Un cuadro 1080p a 24 bits pesa casi 6 MB, y el RP2350 tiene 520 KB de memoria. El cuadro no cabe en la RAM, ni de cerca. Por eso no hay ningún cuadro guardado en memoria. Cada línea de barrido se arma como un flujo de comandos HSTX con codificación por longitud de corrida justo antes de que el haz llegue a ella, seis líneas por adelantado, a partir de geometría vectorial guardada en caché en la memoria flash.

El serializador HSTX del RP2350 está especificado para 300 Mbit/s por pin, y 1080p30 necesita 744. El chip corre entonces a 372 MHz con el regulador del núcleo a 1,30 V, y en 1080p cada carril lleva 744 Mbit/s desde pines CMOS de 3,3 V. La señal HDMI sale por cuatro pares diferenciales repartidos en ocho GPIO. La línea positiva de cada par es el GPIO de número menor, así que no hay nada que invertir.

  • D0 azul en GPIO12 y GPIO13
  • Reloj en GPIO14 y GPIO15
  • D2 rojo en GPIO16 y GPIO17
  • D1 verde en GPIO18 y GPIO19

El pinout HSTX y los modos de video

Este pinout es el mismo de pico_sock_cfg de libdvi, que siguen la mayoría de las placas DVI para la Pico. Funciona con un adaptador HSTX-DVI, con una Pico DVI Sock, con una placa HDMI simple o con cables soldados a mano. De forma opcional, el canal DDC en GPIO4 (SDA) y GPIO5 (SCL) permite que el comando edid de la consola lea los modos que la pantalla declara soportar. El video funciona igual sin él.

El firmware ofrece estos modos de video.

  • 720p60, o sea 1280×720, CEA VIC 4, con clk_sys a 372 MHz
  • 1080p30, o sea 1920×1080, CEA VIC 34, con clk_sys a 372 MHz
  • 1080p25, o sea 1920×1080, CEA VIC 33, con clk_sys a 372 MHz
  • 1080p24, o sea 1920×1080, CEA VIC 32, con clk_sys a 372 MHz
  • 960x540p60, con clk_sys entre 351 y 372 MHz
  • 480p60, o sea 640×480, con clk_sys a 252 MHz

El modo 1080p30 exige un receptor que acepte una frecuencia de línea de 33,8 kHz. Los modos 1080p25 y 1080p24 existen justamente para los televisores que no pasan de 30 kHz. Elegir el modo no es solo cuestión de compatibilidad. Pasar a 720p60 libera unos 140 KB del pool de líneas, porque las líneas que hay que armar son más cortas.

¿Dónde vive el TLS y cuánta memoria queda?

Con la opción 1, en 1080p y con TLS en el propio RP2350, quedan unos 48 KB de los 520 KB para el heap. Un handshake de mbedTLS necesita entre 30 y 40 KB de ese heap, así que el margen es estrecho. Con la opción 2, en que el TLS corre en un ESP32, quedan libres unos 79 KB. En los dos casos el módem ESP32 se compila con ESP-IDF.

En el primer arranque el kiosco no tiene credenciales wifi y levanta un punto de acceso abierto llamado TVTOP-xxxx, que muestra su nombre en el televisor. Uno se conecta desde el teléfono, la página de configuración se abre sola, elige la red y presiona Save. El kiosco se registra entonces en el servidor y muestra en el televisor un código de emparejamiento que se ingresa en la app. Para el portal de configuración, el proyecto reutiliza el servidor DHCP de pico-examples.

¿Qué se necesita para compilarlo?

Para reconstruir todo hace falta Pico SDK 2.2.0 o posterior, la cadena de herramientas Arm GNU, cmake, ninja y picotool. El proyecto incluye PicoDVI de Luke Wren como vendor/libdvi, usa stb para rasterizar las fuentes y requiere ESP-IDF para compilar el módem ESP32. Todo el material, firmware incluido, está en el repositorio de código de Aaron Gayle.