2 pontos por GN⁺ 2025-06-16 | 1 comentários | Compartilhar no WhatsApp
  • Para fazer um plug dummy HDMI barato, que era reconhecido como um monitor 4K, parecer um dispositivo de captura HDMI 1080p, o EEPROM de EDID interno foi regravado com um Raspberry Pi
  • O plug dummy faz o computador detectar um monitor conectado usando apenas um pull-up no pino HPD e um EEPROM I2C, e o EDID define informações do dispositivo de exibição, como resolução suportada, áudio e espaço de cor
  • A porta HDMI do Raspberry Pi tem um controlador I2C ligado ao EDID, então, ajustando apenas o número do barramento conforme o modelo, é possível ler e comparar o EDID do plug dummy e do dispositivo de captura
  • O processo prático segue a ordem: ativar o I2C, instalar i2c-tools, verificar o endereço 0x50, fazer o dump com get-edid e gravar os 256 bytes por meio de um loop com i2cset
  • Executar comandos de escrita no barramento I2C errado ou em um monitor real pode corromper o EDID ou outros EEPROMs, então é essencial fazer o parsing e confirmar o alvo antes de gravar

Fazendo um plug dummy 4K parecer um dispositivo de captura 1080p

  • Um plug dummy HDMI barato comprado anteriormente na Amazon funcionava como um monitor 4K, então a ideia era modificá-lo para parecer um dispositivo mais simples, sem suporte a resolução 4K
  • O objetivo era substituir o EDID do plug dummy por uma cópia do EDID de um entre vários dispositivos de captura HDMI 1080p
  • Depois da substituição, o computador passa a reconhecer um dispositivo de captura HDMI conectado em vez de um monitor 4K

O papel do plug dummy HDMI e do EDID

  • Plugs dummy de HDMI, DVI e similares não processam de fato o sinal de vídeo; eles só têm o circuito mínimo para que um dispositivo de saída de vídeo, como um computador, conclua que há um monitor conectado
  • Em geral, são necessários dois elementos
  • O EDID contém informações como fabricante do monitor, data de fabricação, resoluções suportadas, canais de áudio e espaço de cor
  • Esses plugs dummy são úteis para fazer o sistema operacional de uma máquina headless acreditar que há um monitor conectado

O barramento I2C de HDMI no Raspberry Pi

  • A porta HDMI do Raspberry Pi Zero tem um controlador I2C conectado aos pinos corretos para leitura de EDID
  • Em cada modelo de Pi, os barramentos I2C a verificar são os seguintes
    • Pi 0-3: /dev/i2c-2
    • Pi 4: /dev/i2c-20, /dev/i2c-21
    • Pi 5: /dev/i2c-11, /dev/i2c-12
  • No caso do Raspberry Pi Zero, a configuração usada é edid_i2c=2
  • Nos outros modelos, é preciso trocar o número do barramento conforme a lista acima

Preparação

  • Em uma instalação nova do Raspberry Pi OS Lite, primeiro é preciso preparar o ambiente de acesso ao I2C
    • Executar sudo raspi-config e, em Interface Options, ativar o I2C
    • Instalar as ferramentas de I2C com sudo apt install i2c-tools
  • No Pi Zero, o acesso à rede pode ser um problema, então talvez seja necessário um adaptador USB-Ethernet
  • Como alternativa, também dá para inserir o cartão SD em um desktop Debian/Ubuntu, instalar binfmt-support e qemu-user-static, fazer chroot no rootfs do cartão SD e executar apt install
  • Dependendo do ambiente, também pode ser necessário um adaptador HDMI-para-Mini-HDMI

Leitura e verificação do EDID original

  • Primeiro, verifica-se se o plug dummy é reconhecido como um EEPROM de EDID
edid_i2c=2
i2cdetect -y $edid_i2c
  • No resultado, foi detectado um dispositivo I2C no endereço 0x50, que é o endereço usado para EDID
  • Esse plug dummy específico também respondeu de 0x51 até 0x57, e parece que esses endereços contêm cópias do mesmo EDID
  • Nem todo plug dummy funciona assim; em outro plug, apenas 0x50 foi detectado
  • O EDID original é extraído com o seguinte comando
get-edid -b $edid_i2c > edid-orig.bin
  • O get-edid informa que leu com sucesso um EDID de 256 bytes no barramento I2C 2
  • O mesmo dump é feito duas vezes para comparar se o resultado é idêntico
  • Depois, usa-se od para gerar um hex dump e cola-se o resultado em edidreader.com para verificar se é um EDID válido
od -v -An -txC edid-orig.bin

Gravando o EDID do dispositivo de captura no plug dummy

  • Depois de fazer backup do EDID original do plug dummy, o plug é removido da porta HDMI do Pi e o dispositivo de captura HDMI é conectado
  • O EDID do dispositivo de captura é extraído da mesma forma
get-edid -b $edid_i2c > edid-capture-card.bin
  • O EDID do dispositivo de captura também é verificado para confirmar que é válido
  • Em seguida, o dispositivo de captura é removido, o plug dummy é reconectado e o EDID do dispositivo de captura é gravado no EEPROM do plug dummy
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
  • Esse script transforma o EDID do arquivo dump em um array de strings hexadecimais de dois dígitos e, adicionando 0x na frente de cada byte, grava tudo em sequência com i2cset
  • Existem ferramentas como edid-checked-writer, mas esse método funciona apenas com as ferramentas padrão de I2C em userspace no Linux e com bash ou dash

Verificando o resultado da gravação

  • Após a gravação, o EDID do plug dummy é lido novamente e comparado com o arquivo de EDID do dispositivo de captura
get-edid -b $edid_i2c > edid-test.bin
diff edid-test.bin edid-capture-card.bin
  • Como o diff não produziu nenhuma saída, confirmou-se que o novo dump é idêntico ao EDID original do dispositivo de captura
  • O EEPROM do plug dummy foi reprogramado com o EDID do dispositivo de captura
  • Depois disso, ao conectá-lo ao computador de teste e inicializar, o sistema passou a se comportar como se um dispositivo de captura HDMI estivesse conectado em vez de um monitor 4K

Riscos que precisam ser verificados antes de gravar

  • Se esse procedimento for executado com um monitor real conectado, e o EDID desse monitor não estiver protegido, o monitor pode ser danificado
  • Os comandos de gravação só devem ser executados com um dispositivo que possa ser danificado sem problema, como um plug dummy, conectado à porta HDMI
  • É preciso ter certeza de que o barramento I2C está correto e, antes de gravar, ler e fazer o parsing do EDID para confirmar que realmente há um EDID naquele alvo
  • Se esses comandos forem executados em um PC, existe a possibilidade de gravar por engano em hardware que não é EDID, como o EEPROM SPD de módulos de RAM
  • Usar um Raspberry Pi em vez de experimentar escrita I2C diretamente em um PC real reduz o risco de danificar o desktop
  • O mesmo método também pode ser usado ao contrário: para colocar um EDID com suporte a 4K em um plug dummy antigo de 1080p

1 comentários

 
GN⁺ 2025-06-16
Comentários no Hacker News
  • Um pequeno aviso para quem pretende testar isso em casa: esses plugues dummy baratos têm apenas 256 bytes de EEPROM, então não são suficientes para armazenar vários blocos de extensão EDID necessários para configurações de alta resolução e alta taxa de atualização
    Se você só precisa de 1080p60, tudo bem, mas eles não servem para simular um monitor 4k240
    Além disso, em alguns deles a linha de proteção contra escrita fica fixada em high ou low, então pode ser necessário algum trabalho de hardware para conseguir gravar de fato

    • Se o WP fica em high ou low pode depender do tipo de chip usado
  • Uma limitação desses plugues dummy é que eles não suportam HDCP
    Eles funcionam bem para forçar uma saída em determinada resolução em uma máquina headless, mas falham se você precisar executar algo que exija HDCP
    Fico curioso se existe uma boa solução que funcione como um plugue dummy HDMI e também faça a negociação HDCP
    Preciso testar apps de streaming de vídeo que exigem HDCP para reproduzir na resolução completa, e é inconveniente manter uma TV para cada teste
    A solução que encontrei até agora é um multiviewer HDMI, que parece negociar HDCP separadamente em cada porta

    • Estou usando este splitter HDMI
      Ele permite usar um EDID predefinido ou aprender o EDID do dispositivo conectado à saída HDMI 1 e, depois disso, desde que o splitter esteja ligado, faz com que pareça haver um monitor conectado mesmo sem nada ligado nas saídas
      Pelo que entendo, ele negocia HDCP entre o computador ou console e o splitter, e envia o sinal para o monitor de saída sem HDCP
      https://www.amazon.com/dp/B07VP37KMB
    • Tenho outro caso de uso
      Tenho um sistema embarcado que emite HDMI e quero trocar a tela de boot por outro stream HDMI. Uma imagem estática já seria suficiente
      Por vários motivos, não quero alterar em nada o sistema embarcado em si, e queria saber se há uma forma barata e robusta de fazer isso
    • Há produtos no Aliexpress que afirmam encerrar o HDCP e repassar o HDMI
      Mas é preciso cuidado ao comprar
    • Você pode experimentar um daqueles splitters HDMI na Amazon que são anunciados quase explicitamente como “HDCP stripper”
    • Encerrar HDCP é difícil; para funcionar como um monitor dummy, é preciso fazer downgrade para HDCP 1.4 e ter um dispositivo “compatível” com 1.4 na ponta
      Se você precisar de algo mais recente que HDCP 1.4, provavelmente é quase impossível
  • Relacionado a isso, queria saber se existe algum bom arquivo de binários EDID ou um gerador melhor
    Tenho um plugue emulador EDID programável, então consigo clonar meu monitor ou outros monitores, mas às vezes não há um jeito de configurar uma resolução ou recurso específico. Por exemplo, 8K com DSC
    Conheço https://github.com/bsdhw/EDID, mas ele é bem limitado para monitores mais recentes
    Também já tentei criar eu mesmo com https://www.analogway.com/products/aw-edid-editor, mas acertar corretamente diferenças detalhadas entre vários modos, ordem de preferência etc. é bastante difícil, pelo menos para mim

    • Tenho experiência demais editando EDID
      Minhas recomendações são: o AW EDID Editor já mencionado, o CRU exclusivo para Windows, o 010 Hex Editor com templates de EDID, no Linux o wxEDID via Flatpak, e o edid-decode do v4l-utils
      O CRU funciona, embora, ao modificar um arquivo EDID dumpado de um monitor, ele remova descritores como o número de série para abrir espaço para resoluções detalhadas. Não roda no Wine
      Lembro que o pacote de distribuição do wxEDID travava no WxWidgets, e não sei se ele consegue criar novas seções
      O edid-decode também pode ser usado como ferramenta textconv do git diff, mas não ajuda a codificar arquivos EDID
      Pelo que vejo, EDIDs HDMI têm bloco de extensão CEA, e EDIDs DP têm bloco de extensão DisplayID
      Nunca trabalhei com EDID multipágina acima de 256 bytes, e também não sei que chip EEPROM usar para emular isso nem qual é o protocolo/API de leitura e escrita
    • https://www.extron.com/product/software/edidmanager30
      https://www1.kramerav.com/au/product/edid%20designer
      Ambos são gratuitos, mas não são softwares livremente redistribuíveis
      No caso da Extron, talvez você precise trabalhar em um projeto ou organização que use esse hardware
    • Tive um problema parecido recentemente
      Comprei uma soundbar surround 5.1 barata com suporte até Dolby TrueHD via HDMI, mas a pegadinha é que ela só funciona corretamente com dispositivos compatíveis com eARC, ou seja, TVs mais novas
      Se eu conectar ao PC, preciso usar SPDIF ou AUX, com qualidade inferior
      Em vez de comprar um extrator de áudio ou splitter, há uma forma de enganar o EDID do PC para que a soundbar seja reconhecida como eARC
      Ainda estou trabalhando nisso e, infelizmente, não há diretrizes claras
    • Queria saber qual plugue emulador EDID programável você está usando
      Pesquisei recentemente, mas não ficou claro quais recursos cada dispositivo tem nem se há algum produto mais barato que preste
  • Esse tipo de produto também pode ser comprado em versões com pass-through, e é útil para sistemas antigos que têm problemas com monitores de alta resolução
    Tenho um sistema AMD FX8350 de por volta de 2011, e o chipset integrado 880G northbridge+vídeo não consegue emitir vídeo HDMI corretamente para um display 4K
    Se eu conectar um dispositivo desses no meio e disser para ele enviar uma imagem 1080p, funciona bem, e o monitor faz upscaling inteiro 2x para 4K

    • Também tenho alguns com pass-through, e acho que o texto deveria tê-los mencionado como outra opção
      Os que tenho são bem avançados: conseguem ler e salvar o EDID do monitor e depois usá-lo como override para outro monitor
      Outro ponto excelente é que eles podem forçar o monitor a ser sempre detectado
      Um dos meus monitores, quando desligado, se comporta praticamente como se tivesse sido desconectado, o que causava vários problemas; o pass-through resolveu completamente
      O produto que uso é o HD-EWB da THWT
  • Um plugue dummy HDMI é uma solução de hardware para um problema de software que nem deveria existir

    • Parece uma frase que descreve uma enorme quantidade de soluções de hardware existentes
  • Fico curioso sobre por que um plugue dummy é necessário
    Não sei o que dá para fazer só com um plugue dummy e não com software. Pergunto como alguém que já usou 18 displays virtuais sem dummy e sem problemas

    • Como exemplo, uso um software chamado Looking Glass para interagir com uma máquina virtual Windows no meu PC
      O computador tem duas GPUs: a GPU AMD fica para o host Linux, e a GPU NVidia é passada para o guest Windows
      O Looking Glass captura a saída da GPU NVidia e a exibe em uma janela no meu desktop
      Com esse método, dá para usar software Windows na VM com desempenho decente. Desde o Windows 7, o Windows basicamente precisa de aceleração gráfica para rodar de forma aceitável
      O problema é que a GPU NVidia não faz nada se não houver um display conectado
      GPUs NVidia Quadro permitem despejar o EDID do monitor e mapear esse arquivo para uma saída, mas GPUs de consumidor não oferecem suporte a isso
      Por isso é preciso um plugue dummy
    • Para quem está em movimento, fica muito fácil usar o modo de exibição do apresentador do PowerPoint durante uma chamada no Zoom ou Teams tendo apenas uma tela
      Basta usar a tela do plugue dummy como saída do PowerPoint, e a tela do notebook para as notas do apresentador
      Depois é só compartilhar a tela do plugue dummy
      Talvez não seja a melhor resposta para leitores do Hacker News, mas para professores ou vendedores é realmente simples
    • Muitas combinações de sistema operacional, GPU e driver não permitem criar de fato um display virtual com configurações arbitrárias
      Isso pode ser necessário por causa de configurações de streaming no OBS ou streaming de jogos como Steam e Parsec
      Alguns anos atrás, dava para fazer em certa medida no Linux com Xorg e drivers open source, e no Windows com Nvidia, mas no macOS ou no Windows+GPUs AMD/Intel isso não funcionava tão bem
    • Uso ao testar distribuições Linux embarcadas binárias
      Enganar o sistema operacional para parecer que um display está conectado cria uma nova variável que não existe no ambiente real de distribuição do usuário; um plugue dummy é uma solução de hardware barata
      É bem possível que comprar e plugar um seja mais econômico do que fazer um engenheiro escrever echo on > /sys/whatever e a lógica ao redor disso
    • Para a maioria das pessoas, um plugue dummy é muito mais fácil
      Adicionei por software um monitor 4K falso ao desktop para streaming remoto de jogos, e foi muito mais complicado do que eu esperava
      https://pfy.ch/programming/4k-sunshine.html
  • Dica interessante: com o mesmo procedimento também dá para modificar o EDID armazenado em um monitor comum ou na tela de um notebook
    Às vezes também dá para escrever em outro endereço I2C e até alterar várias configurações do TCON
    Nem precisa ser necessariamente um Raspberry Pi; qualquer computador serve

    • Já fiz isso uma vez em um monitor Acer
      Eu estava modificando o backlight de LED para fazer strobe e gerar uma imagem sem blur, como em um CRT
      Descobri que o barramento DDC também expunha outros registradores que controlavam coisas como o backlight, e conectei um circuito externo para o strobing
      Também apareceram registradores para ler e escrever a flash ROM; então fiz o dump, escrevi um disassembler 8051 e fiz uma engenharia reversa aproximada, e no fim modifiquei a ROM para incluir um modo de strobe
      Fiz esse modo ocupar a faixa inferior do controle de brilho, para que pudesse ser ligado e ajustado pelo OSD ou pelo controle de brilho DDC comum
      Para fazer o flash, foi preciso abrir o aparelho e conectar a linha de escrita
      Convenientemente havia uma interrupção de vblank, e o timer que controlava o backlight de LED tinha um modo em que ele podia ligar pouco antes da próxima interrupção e desligar após um tempo ajustável
      Era o timing perfeito para ligar o backlight logo depois que a atualização do LCD estivesse estável
      O objetivo original era apenas remover um logo de boot de alguns segundos, e isso deu certo
    • Chips flash geralmente têm um pino de habilitação/desabilitação de escrita, e a maioria dos monitores e TVs é cabeada para impedir a escrita do EDID
      Imagino que só produtos de baixo custo omitam isso
      Sem proteção, é arriscado: um glitch de tensão durante uma leitura pode virar uma escrita e corromper a flash
    • O autor recomenda usar um Pi, mas escreve que não é obrigatório
      “Se você tentar este comando em um PC, pode acabar fazendo flash por engano de hardware que não é o EDID, por exemplo a EEPROM SPD de um módulo de RAM”
    • Se o EDID armazenado em um monitor comum pode ser modificado da mesma forma, isso parece um erro estranho do ponto de vista de um desenvolvedor de hardware
      Normalmente, você compraria uma EEPROM pré-programada, a montaria na placa e faria a fiação para que o pino de habilitação de escrita nunca subisse para high
      Colocar uma EEPROM em um produto como um monitor e deixá-la gravável é estranho, embora eu já tenha visto coisas ainda mais estranhas em hardware lançado
  • Fiquei confuso
    Eu esperava ver o plugue conectado aos pinos GPIO I2C, mas parece que simplesmente conectá-lo ao RPi já basta
    Então fico imaginando se o HDMI expõe diretamente uma interface I2C

    • Isso mesmo. O link DDC, que é a parte de comunicação de VGA/HDMI/DVI, é basicamente um link I2C, e é assim que o sistema operacional consulta o EDID durante a operação normal
      Como mencionado no texto, o RPi tem um controlador I2C conectado a esses pinos da porta HDMI, porque precisa ler o EDID via DDC
  • Fico me perguntando se alguém conhece um emulador de EDID para DisplayPort barato que resolva problemas de KVM e Linux
    Da última vez que verifiquei, era muito mais caro que HDMI, a ponto de valer mais a pena comprar um KVM novo

  • Fico me perguntando se um plugue dummy também pode ser usado para alterar o rastreamento por fingerprint de dispositivo