- 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
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
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
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 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
Mas é preciso cuidado ao comprar
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
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://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
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
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
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
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
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
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
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
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/whatevere a lógica ao redor dissoAdicionei 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
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
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
“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”
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
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
Em vez disso, usa um barramento AUX de alta velocidade específico do DisplayPort, muito mais complexo de lidar
Parece difícil até encontrar documentação adequada sem entrar na VESA e assinar um monte de NDAs
https://foosel.net/til/how-to-override-the-edid-data-of-a-mo...
Mas, se a ideia for adicionar um monitor virtual, não tenho certeza se https://askubuntu.com/questions/453109/add-fake-display-when... funciona
Fico me perguntando se um plugue dummy também pode ser usado para alterar o rastreamento por fingerprint de dispositivo