- Para hacer que un dummy plug HDMI barato que era detectado como un monitor 4K pareciera un dispositivo de captura HDMI 1080p, se reescribió su EEPROM EDID interna usando una Raspberry Pi
- El dummy plug hace que la computadora detecte un monitor conectado solo con un pull-up en el pin HPD y una EEPROM I2C, y el EDID define información de la pantalla como resolución compatible, audio y espacio de color
- El puerto HDMI de la Raspberry Pi tiene conectado un controlador I2C para EDID, así que si se usa el número de bus correcto según el modelo, se puede leer y comparar el EDID del dummy plug y del dispositivo de captura
- El trabajo real se hace en este orden: activar I2C, instalar
i2c-tools, verificar la dirección 0x50, volcar con get-edid y hacer la escritura de 256 bytes mediante un bucle con i2cset
- Si se usa el bus I2C equivocado o se ejecutan comandos de escritura sobre un monitor real, se puede dañar el EDID u otra EEPROM, por lo que es indispensable analizar el contenido y confirmar el dispositivo de destino antes de escribir
Hacer que un dummy plug 4K parezca un dispositivo de captura 1080p
- Un dummy plug HDMI barato comprado antes en Amazon funcionaba como si fuera un monitor 4K, así que la idea es cambiarlo para que parezca un dispositivo más simple que no soporte resolución 4K
- El objetivo es reemplazar el EDID del dummy plug por una copia del EDID de uno de varios dispositivos de captura HDMI 1080p
- Una vez hecho el cambio, la computadora detectará un dispositivo de captura HDMI conectado en lugar de un monitor 4K
El papel del dummy plug HDMI y del EDID
- Los dummy plugs de HDMI, DVI y similares no procesan realmente la señal de video, sino que solo incluyen el circuito mínimo para que un dispositivo de salida de video, como una computadora, crea que hay un monitor conectado
- Normalmente se necesitan dos elementos
- El EDID contiene información como fabricante del monitor, fecha de fabricación, resoluciones compatibles, canales de audio y espacio de color
- Estos dummy plugs son útiles para hacer que el sistema operativo en una máquina sin monitor piense que hay una pantalla conectada
El bus I2C HDMI de la Raspberry Pi
- El puerto HDMI de una Raspberry Pi Zero tiene conectado en los pines correctos un controlador I2C para leer el EDID
- Los buses I2C que hay que revisar según el modelo de Pi son los siguientes
- Pi 0-3:
/dev/i2c-2
- Pi 4:
/dev/i2c-20, /dev/i2c-21
- Pi 5:
/dev/i2c-11, /dev/i2c-12
- Si se usa una Raspberry Pi Zero, se configura
edid_i2c=2
- En otros modelos hay que cambiar el número de bus de acuerdo con la lista anterior
Preparación
- En una instalación nueva de Raspberry Pi OS Lite, primero hay que preparar el entorno de acceso a I2C
- Ejecutar
sudo raspi-config y activar I2C en Interface Options
- Instalar las herramientas de I2C con
sudo apt install i2c-tools
- En una Pi Zero el acceso a red puede ser problemático, así que puede hacer falta un adaptador USB-Ethernet
- Como alternativa, se puede insertar la tarjeta SD en una PC de escritorio con Debian/Ubuntu, instalar
binfmt-support y qemu-user-static, hacer chroot al rootfs de la SD y ejecutar allí apt install
- Según el entorno de trabajo, también puede hacer falta un adaptador de HDMI a Mini-HDMI
Lectura y verificación del EDID original
- Primero se comprueba si el dummy plug es detectado como una EEPROM EDID
edid_i2c=2
i2cdetect -y $edid_i2c
- En el resultado se detectó un dispositivo I2C en la dirección
0x50, que es la dirección usada para EDID
- Ese dummy plug también respondió de
0x51 a 0x57, y parece que esas direcciones contienen copias del mismo EDID
- No todos los dummy plugs se comportan así; otro dummy plug solo fue detectado en
0x50
- El EDID original se vuelca con el siguiente comando
get-edid -b $edid_i2c > edid-orig.bin
get-edid mostró que leyó correctamente un EDID de 256 bytes desde el bus I2C 2
- Conviene hacer el mismo volcado dos veces y comparar si los resultados coinciden
- Después se imprime un volcado hexadecimal con
od y se pega en edidreader.com para comprobar si es un EDID válido
od -v -An -txC edid-orig.bin
Escribir en el dummy plug el EDID del dispositivo de captura
- Tras respaldar el EDID original del dummy plug, se desconecta del puerto HDMI de la Pi y se conecta el dispositivo de captura HDMI
- Luego se vuelca el EDID del dispositivo de captura de la misma forma
get-edid -b $edid_i2c > edid-capture-card.bin
- También se comprueba que el EDID del dispositivo de captura sea válido
- Después se desconecta el dispositivo de captura, se vuelve a conectar el dummy plug y se escribe el EDID del dispositivo de captura en la EEPROM del dummy plug
edidbytes=($(od -v -An -txC edid-capture-card.bin))
for i in "${!edidbytes[@]}"; do
byte=0x${edidbytes[$i]}
echo Writing byte $i: $byte...
i2cset -f -y $edid_i2c 0x50 $i $byte
done
- Este script convierte el EDID del archivo volcado en un arreglo de cadenas hexadecimales de dos dígitos, añade
0x delante de cada byte y los escribe en orden en la EEPROM con i2cset
- También existen herramientas como edid-checked-writer, pero este método funciona solo con herramientas I2C estándar de userspace en Linux y bash o dash
Verificar el resultado de la escritura
- Después de grabar, se vuelve a leer el EDID desde el dummy plug y se compara con el archivo EDID del dispositivo de captura
get-edid -b $edid_i2c > edid-test.bin
diff edid-test.bin edid-capture-card.bin
- Como
diff no produjo ninguna salida, se confirmó que el nuevo volcado es idéntico al EDID original del dispositivo de captura
- La EEPROM del dummy plug quedó reprogramada con el EDID del dispositivo de captura
- Después, al conectarlo a la computadora de prueba y arrancar, la máquina se comportó como si hubiera un dispositivo de captura HDMI conectado en vez de un monitor 4K
Riesgos que hay que revisar antes de escribir
- Si se ejecuta este procedimiento con un monitor real conectado y su EDID no está protegido, se puede dañar el monitor
- Los comandos de escritura solo deben ejecutarse cuando en el puerto HDMI haya conectado un dispositivo que se pueda dañar sin problema, como un dummy plug
- Hay que estar seguro de que se está usando el bus I2C correcto y, antes de escribir, leer y analizar el EDID para confirmar que realmente contiene un EDID válido
- Si estos comandos se ejecutan en una PC, existe la posibilidad de flashear por error hardware que no usa EDID, como la EEPROM SPD de módulos de RAM
- Usar una Raspberry Pi en lugar de experimentar con escrituras I2C en una PC real reduce el riesgo de dañar la computadora de escritorio
- El mismo método también puede usarse a la inversa para poner un EDID compatible con 4K en un dummy plug antiguo de 1080p
1 comentarios
Comentarios de Hacker News
Una pequeña advertencia para quienes quieran probar esto en casa: estos dummy plugs baratos solo tienen 256 bytes de EEPROM, así que no alcanzan para almacenar varios bloques de extensión EDID necesarios para configuraciones de alta resolución y alta tasa de refresco.
Si solo necesitas 1080p60, está bien, pero no sirven para simular un monitor 4k240.
Además, en algunos casos la línea de protección contra escritura queda fija en high o low, así que para escribir realmente se requiere algo de trabajo de hardware.
Una limitación de estos dummy plugs es que no admiten HDCP.
Funcionan bien para forzar una salida con cierta resolución en una máquina headless, pero fallan si necesitas ejecutar algo que requiere HDCP.
Me pregunto si existe una buena solución que actúe como un dummy plug HDMI y además haga la negociación HDCP.
Necesito probar apps de streaming de video que requieren HDCP para reproducir a resolución completa, y es incómodo tener un televisor para cada prueba.
La solución que he encontrado hasta ahora es un multiviewer HDMI, que parece negociar HDCP por separado en cada puerto.
Permite usar un EDID preconfigurado o aprender el EDID del dispositivo conectado a la salida HDMI 1, y luego, mientras el splitter tenga alimentación, hace que parezca que hay un monitor conectado aunque no haya nada conectado a la salida.
Entiendo que negocia HDCP entre la computadora o consola y el splitter, y envía la señal al monitor de salida sin HDCP.
https://www.amazon.com/dp/B07VP37KMB
Tengo un sistema embebido que emite HDMI, y quiero reemplazar la pantalla de arranque por otro stream HDMI. Una imagen estática sería suficiente.
Por varias razones no quiero cambiar en absoluto el sistema embebido en sí, y me pregunto si hay una forma barata y robusta de hacerlo.
Pero hace falta cuidado comprador.
Si necesitas algo más nuevo que HDCP 1.4, probablemente sea casi imposible.
Relacionado con esto, me pregunto si hay un buen archivo de binarios EDID o un mejor programa generador.
Tengo un plug emulador EDID programable que puede clonar mi monitor u otros monitores, pero a veces no hay manera de configurar una resolución o función específica. Por ejemplo, 8K con DSC.
Conozco https://github.com/bsdhw/EDID, pero está bastante limitado en monitores recientes.
También intenté crearlo yo mismo con https://www.analogway.com/products/aw-edid-editor, pero ajustar bien las diferencias detalladas entre varios modos, el orden de preferencia, etc., al menos para mí, es bastante difícil.
Mis recomendaciones son estas: el ya mencionado AW EDID Editor, CRU solo para Windows, 010 Hex Editor con plantillas EDID, wxEDID desde Flatpak en Linux, y edid-decode de v4l-utils.
CRU funciona, aunque modifica archivos EDID volcados desde el monitor eliminando descriptores como el número de serie para crear espacio para resoluciones detalladas. No se ejecuta en Wine.
Recuerdo que el paquete de la distro de wxEDID se caía en WxWidgets, y no sé si puede crear secciones nuevas.
edid-decode también puede usarse como herramienta textconv para git diff, pero no ayuda a codificar archivos EDID.
Según veo, los EDID HDMI tienen bloques de extensión CEA, y los EDID DP tienen bloques de extensión DisplayID.
Nunca he trabajado con EDID multipágina de más de 256 bytes, y tampoco sé qué chip EEPROM habría que usar para emularlo ni cuál es el protocolo/API de lectura y escritura.
https://www1.kramerav.com/au/product/edid%20designer
Ambos son gratuitos, pero no son software que pueda redistribuirse libremente.
En el caso de Extron, quizá tengas que trabajar en un proyecto u organización que use ese hardware.
Compré una barra de sonido surround 5.1 barata compatible incluso con Dolby TrueHD por HDMI, pero la trampa es que solo funciona bien con dispositivos compatibles con eARC, es decir, televisores nuevos.
Si la conecto a una PC, tengo que usar SPDIF o AUX y la calidad baja.
En lugar de comprar un extractor de audio o un splitter, hay una forma de engañar al EDID de la PC para que la barra de sonido se reconozca como eARC.
Todavía estoy trabajando en ello y, lamentablemente, no hay pautas claras.
Lo estuve investigando hace poco, pero no quedaba claro qué funciones tiene cada dispositivo ni si entre los productos más baratos hay alguno decente.
Estos productos también se pueden comprar en versiones con passthrough, y son útiles para sistemas viejos que tienen problemas con monitores de alta resolución.
Tengo un sistema AMD FX8350 de alrededor de 2011, cuyo chipset integrado 880G northbridge+video no puede sacar correctamente video HDMI a una pantalla 4K.
Si conecto un dispositivo de este tipo en medio y le indico que envíe una imagen 1080p, funciona bien, y el monitor hace un escalado entero 2x a 4K.
Los que tengo son bastante avanzados: pueden leer y guardar el EDID de un monitor y luego usarlo como override para otro monitor.
Otra gran ventaja es que pueden forzar que el monitor se detecte siempre.
Uno de mis monitores, al apagarse, se comportaba prácticamente como si se hubiera desconectado, lo que causaba varios problemas; el passthrough lo solucionó por completo.
El producto que uso es el HD-EWB de THWT.
Un conector HDMI dummy es una solución de hardware para un problema de software que no debería existir en primer lugar.
Me pregunto por qué hace falta un conector dummy.
No sé qué se puede hacer solo con un conector dummy y no por software. Lo pregunto como alguien que ha usado 18 pantallas virtuales sin dummy y sin problemas.
La computadora tiene dos GPU: la GPU AMD es para el host Linux y la GPU NVidia se pasa al invitado Windows.
Looking Glass captura la salida de la GPU NVidia y la muestra en una ventana de mi escritorio.
Con este enfoque puedo usar software de Windows en la VM y el rendimiento es decente. Desde Windows 7 en adelante, Windows prácticamente necesita aceleración gráfica para ser usable.
El problema es que la GPU NVidia no hace nada si no hay una pantalla conectada.
Las GPU NVidia Quadro permiten volcar el EDID de un monitor y mapear ese archivo a una salida, pero las GPU de consumo no lo soportan.
Por eso hace falta el conector dummy.
Usa la pantalla del conector dummy como salida de PowerPoint y la pantalla de la laptop para las notas del presentador.
Luego comparte la pantalla del conector dummy.
Tal vez no sea la mejor respuesta para lectores de Hacker News, pero para docentes o vendedores es realmente simple.
Puede hacer falta para configuraciones de streaming con OBS, o de streaming de juegos como Steam y Parsec.
Hace unos años se podía hasta cierto punto con Linux usando Xorg y drivers open source, y con Windows y Nvidia, pero no funcionaba tan bien en MacOS o con Windows+GPU AMD/Intel.
Si engañas al sistema operativo para que parezca que hay una pantalla conectada, introduces una variable nueva que no existe en el entorno real de despliegue del usuario; un conector dummy es una solución de hardware barata.
Probablemente sea más costo-efectivo comprarlo y conectarlo que hacer que un ingeniero escriba
echo on > /sys/whatevery toda la lógica alrededor.Agregué por software un monitor 4K falso a mi escritorio para streaming remoto de juegos, y fue mucho más complicado de lo esperado.
https://pfy.ch/programming/4k-sunshine.html
Tip interesante: con el mismo procedimiento también puedes modificar el EDID guardado en un monitor común o en la pantalla de una laptop.
A veces incluso puedes escribir en otra dirección I2C y cambiar varias configuraciones del TCON.
Tampoco es que se necesite una Raspberry Pi; se puede hacer con cualquier computadora.
Lo estaba modificando para hacer que la retroiluminación LED hiciera strobing, con el fin de lograr una imagen sin blur, como en un CRT.
Descubrí que el bus DDC también exponía otros registros que controlaban la retroiluminación y demás, y conecté un circuito externo para el strobing.
También vi registros para leer y escribir la ROM flash, así que la volqué, escribí un desensamblador 8051 e hice una ingeniería inversa aproximada; al final modifiqué la ROM para incluir un modo de strobe.
Hice que ese modo ocupara el tramo bajo del control de brillo, de modo que pudiera activarse y ajustarse desde el OSD o con el control de brillo DDC normal.
Para flashearlo tuve que abrir el equipo y conectar la línea de escritura.
Convenientemente había una interrupción de vblank, y el temporizador que controla la retroiluminación LED tenía un modo que permitía encenderla justo antes de la siguiente interrupción y apagarla después de un tiempo ajustable.
Era el timing perfecto para encender la retroiluminación justo después de que la actualización del LCD se estabilizara.
El objetivo original era solo eliminar el logo de arranque de unos segundos, y eso sí lo logré.
Supongo que solo los productos de bajo costo lo omiten.
Sin protección, un glitch de voltaje durante una lectura podría convertirse en una escritura y arruinar la flash, así que es peligroso.
“Si pruebas este comando en una PC, podrías flashear por accidente hardware que no es el EDID, por ejemplo la EEPROM SPD de un módulo RAM”.
Normalmente comprarías una EEPROM ya programada, la montarías en la placa y cablearías el pin de habilitación de escritura para que nunca suba a high.
Es extraño dejar una EEPROM dentro de un producto como un monitor y mantenerla escribible, aunque he visto cosas más raras en hardware lanzado al mercado.
Estoy confundido.
Esperaba ver que conectaran el plug a los pines GPIO I2C, pero parece que basta con enchufarlo a la RPi.
Entonces me pregunto si HDMI expone directamente una interfaz I2C.
Como se menciona en el artículo, la RPi tiene un controlador I2C conectado a esos pines del puerto HDMI, porque necesita leer el EDID a través de DDC.
Me pregunto si alguien conoce un emulador EDID DisplayPort barato para resolver problemas con KVM y Linux.
La última vez que revisé, eran mucho más caros que los HDMI, al punto de que convenía más comprar un KVM nuevo.
En su lugar, usa el bus AUX de alta velocidad propio de DisplayPort, que es mucho más complejo de manejar.
Parece difícil incluso encontrar documentación adecuada sin unirse a VESA y firmar un montón de NDA.
https://foosel.net/til/how-to-override-the-edid-data-of-a-mo...
Aunque, si lo que se quiere es agregar un monitor virtual, no estoy seguro de que funcione https://askubuntu.com/questions/453109/add-fake-display-when....
Me pregunto si los conectores dummy también se pueden usar para cambiar la huella digital del dispositivo.