2 points par GN⁺ 2025-06-16 | 1 commentaires | Partager sur WhatsApp
  • Pour faire passer un bouchon HDMI factice bon marché, détecté comme un moniteur 4K, pour un périphérique de capture HDMI 1080p, son EEPROM EDID interne a été réécrite avec un Raspberry Pi
  • Un bouchon factice fait croire à l’ordinateur qu’un moniteur est connecté uniquement grâce à un pull-up sur la broche HPD et à une EEPROM I2C ; l’EDID détermine les informations de l’afficheur comme les résolutions prises en charge, l’audio et les espaces colorimétriques
  • Le port HDMI du Raspberry Pi dispose d’un contrôleur I2C connecté pour l’EDID ; en choisissant le bon numéro de bus selon le modèle, on peut lire et comparer l’EDID du bouchon factice et celle du périphérique de capture
  • La procédure consiste à activer l’I2C, installer i2c-tools, vérifier l’adresse 0x50, dumper avec get-edid, puis effectuer une écriture de 256 octets via une boucle i2cset
  • Exécuter une commande d’écriture sur le mauvais bus I2C ou sur un vrai moniteur peut endommager l’EDID ou une autre EEPROM ; il est donc indispensable de parser les données et de vérifier la cible avant toute écriture

Faire passer un bouchon factice 4K pour un périphérique de capture 1080p

  • Il s’agit de modifier un bouchon HDMI factice bon marché acheté auparavant sur Amazon, qui se comporte comme un moniteur 4K, afin qu’il apparaisse comme un appareil plus simple ne prenant pas en charge la résolution 4K
  • L’objectif est de remplacer l’EDID du bouchon factice par une copie de l’EDID de l’un de plusieurs périphériques de capture HDMI 1080p
  • Une fois le remplacement effectué, l’ordinateur reconnaît un périphérique de capture HDMI connecté au lieu d’un moniteur 4K

Rôle des bouchons HDMI factices et de l’EDID

  • Les bouchons factices HDMI, DVI, etc. ne traitent pas réellement le signal vidéo ; ils ne comportent que le circuit minimal permettant à une source vidéo, comme un ordinateur, de conclure qu’un moniteur est connecté
  • En général, deux éléments sont nécessaires
  • L’EDID contient des informations comme le fabricant du moniteur, sa date de fabrication, les résolutions prises en charge, les canaux audio et les espaces colorimétriques
  • Ce type de bouchon factice est utile sur les machines headless pour que le système d’exploitation pense qu’un moniteur est connecté

Bus I2C HDMI du Raspberry Pi

  • Sur le port HDMI du Raspberry Pi Zero, un contrôleur I2C destiné à lire l’EDID est connecté aux bonnes broches
  • Les bus I2C à vérifier selon le modèle de Pi sont les suivants
    • Pi 0-3 : /dev/i2c-2
    • Pi 4 : /dev/i2c-20, /dev/i2c-21
    • Pi 5 : /dev/i2c-11, /dev/i2c-12
  • Avec un Raspberry Pi Zero, on utilise edid_i2c=2
  • Sur les autres modèles, il faut adapter le numéro de bus selon la liste ci-dessus

Préparation

  • Sur une nouvelle installation de Raspberry Pi OS Lite, il faut d’abord préparer l’accès I2C
    • Exécuter sudo raspi-config, puis activer I2C dans Interface Options
    • Installer les outils I2C avec sudo apt install i2c-tools
  • Sur un Pi Zero, l’accès réseau peut poser problème ; un adaptateur USB-Ethernet peut être nécessaire
  • Une autre option consiste à insérer la carte SD dans un PC de bureau sous Debian/Ubuntu, à installer binfmt-support et qemu-user-static, puis à faire un chroot dans le rootfs de la carte SD pour exécuter apt install
  • Selon l’environnement de travail, un adaptateur HDMI vers Mini-HDMI peut aussi être nécessaire

Lecture et validation de l’EDID d’origine

  • Il faut d’abord vérifier que le bouchon factice est détecté comme une EEPROM EDID
edid_i2c=2
i2cdetect -y $edid_i2c
  • Dans le résultat, un périphérique I2C a été détecté à l’adresse 0x50, qui est l’adresse utilisée pour l’EDID
  • Ce bouchon factice répondait aussi de 0x51 à 0x57, adresses qui semblent contenir des copies de la même EDID
  • Tous les bouchons factices ne se comportent pas ainsi ; un autre bouchon factice n’était détecté qu’en 0x50
  • L’EDID d’origine se dumpe avec la commande suivante
get-edid -b $edid_i2c > edid-orig.bin
  • get-edid indique avoir lu avec succès une EDID de 256 octets sur le bus I2C 2
  • Il faut effectuer deux fois le même dump et comparer les résultats pour vérifier qu’ils sont identiques
  • Ensuite, afficher un dump hexadécimal avec od, puis le coller dans edidreader.com pour vérifier qu’il s’agit d’une EDID valide
od -v -An -txC edid-orig.bin

Écrire l’EDID du périphérique de capture sur le bouchon factice

  • Après avoir sauvegardé l’EDID d’origine du bouchon factice, retirer le bouchon du port HDMI du Pi et brancher le périphérique de capture HDMI
  • Dumper l’EDID du périphérique de capture de la même manière
get-edid -b $edid_i2c > edid-capture-card.bin
  • Vérifier également que l’EDID du périphérique de capture est valide
  • Ensuite, retirer le périphérique de capture, reconnecter le bouchon factice et écrire l’EDID du périphérique de capture dans l’EEPROM du bouchon
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
  • Ce script transforme l’EDID du fichier dump en tableau de chaînes hexadécimales à deux caractères, préfixe chaque octet par 0x, puis les écrit dans l’ordre dans l’EEPROM avec i2cset
  • Il existe aussi des outils comme edid-checked-writer, mais cette méthode fonctionne avec les outils I2C userspace Linux standard et bash ou dash

Vérification du résultat de l’écriture

  • Après l’écriture, relire l’EDID du bouchon factice et la comparer au fichier EDID du périphérique de capture
get-edid -b $edid_i2c > edid-test.bin
diff edid-test.bin edid-capture-card.bin
  • diff ne produisant aucune sortie, cela confirme que le nouveau dump est identique à l’EDID d’origine du périphérique de capture
  • L’EEPROM du bouchon factice a été reprogrammée avec l’EDID du périphérique de capture
  • Après l’avoir branché sur un ordinateur de test et démarré celui-ci, l’ordinateur se comporte comme si un périphérique de capture HDMI était connecté au lieu d’un moniteur 4K

Risques à vérifier avant l’écriture

  • Si cette procédure est exécutée alors qu’un vrai moniteur est connecté et que l’EDID de ce moniteur n’est pas protégée, elle peut endommager le moniteur
  • Il faut impérativement n’exécuter les commandes d’écriture que lorsqu’un appareil dont la panne est acceptable, comme un bouchon factice, est connecté au port HDMI
  • Il faut être certain d’utiliser le bon bus I2C, et lire puis parser l’EDID avant l’écriture pour confirmer qu’il s’agit bien d’une EDID réelle
  • Si ces commandes sont exécutées sur un PC, il est possible de flasher par erreur du matériel qui n’est pas une EDID, comme l’EEPROM SPD d’un module RAM
  • Utiliser un Raspberry Pi plutôt que de tester l’écriture I2C sur un vrai PC réduit le risque d’endommager un ordinateur de bureau
  • La même méthode peut aussi être utilisée en sens inverse pour placer une EDID compatible 4K dans un ancien bouchon factice 1080p

1 commentaires

 
GN⁺ 2025-06-16
Avis sur Hacker News
  • Petite mise en garde pour ceux qui voudraient essayer chez eux : ces dongles factices bon marché n’ont qu’une EEPROM de 256 octets, ce qui ne suffit pas à stocker les multiples blocs d’extension EDID nécessaires aux hautes résolutions et aux taux de rafraîchissement élevés
    Si vous n’avez besoin que de 1080p60, ça va, mais ce n’est pas utilisable pour simuler un moniteur 4k240
    De plus, sur certains modèles, la ligne de protection en écriture est fixée à high ou low, donc il faut un peu de bricolage matériel pour pouvoir réellement écrire dessus

    • Que WP soit high ou low peut dépendre du type de puce utilisé
  • Une limite de ces dongles factices est qu’ils ne prennent pas en charge HDCP
    Ils conviennent bien pour forcer une certaine résolution de sortie sur une machine headless, mais échouent s’il faut lancer quelque chose qui exige HDCP
    Je me demande s’il existe une bonne solution qui se comporte comme un dongle HDMI factice tout en assurant aussi la négociation HDCP
    Je dois tester des applications de streaming vidéo qui nécessitent HDCP pour lire en pleine résolution, et avoir une TV dédiée pour chaque test n’est pas pratique
    La solution que j’ai trouvée jusqu’ici est un multiviewer HDMI, qui semble négocier HDCP séparément pour chaque port

    • J’utilise ce répartiteur HDMI
      Il permet d’utiliser un EDID prédéfini ou d’apprendre l’EDID depuis l’appareil connecté à la sortie HDMI 1, puis, tant que le répartiteur est alimenté, il se présente comme un moniteur connecté même si rien n’est branché en sortie
      D’après ce que je comprends, il négocie HDCP entre l’ordinateur ou la console et le répartiteur, puis envoie le signal vers le moniteur de sortie sans HDCP
      https://www.amazon.com/dp/B07VP37KMB
    • J’ai un autre cas d’usage
      J’ai un système embarqué qui sort en HDMI, et je voudrais remplacer l’écran de démarrage par un autre flux HDMI. Une image statique suffirait
      Pour diverses raisons, je ne veux absolument pas modifier le système embarqué lui-même, et je me demande comment faire ça de manière peu coûteuse et robuste
    • On trouve sur Aliexpress des appareils qui prétendent terminer HDCP et relayer le HDMI
      Mais acheteur, attention
    • Vous pouvez essayer l’un de ces répartiteurs HDMI vendus sur Amazon presque ouvertement comme des « HDCP strippers »
    • Terminer HDCP est difficile ; il faut rétrograder vers HDCP 1.4, puis avoir un appareil « compatible » 1.4 en bout de chaîne pour qu’il puisse se comporter comme un moniteur factice
      Si vous avez besoin de quelque chose de plus récent que HDCP 1.4, c’est probablement presque impossible
  • À ce sujet, je me demande s’il existe une bonne archive de binaires EDID ou un meilleur générateur
    J’ai un dongle émulateur EDID programmable qui peut cloner mon moniteur ou d’autres moniteurs, mais il arrive qu’il n’y ait pas de moyen de définir une résolution ou une fonctionnalité précise, par exemple du 8K avec DSC
    Je connais https://github.com/bsdhw/EDID, mais il est assez limité pour les moniteurs récents
    J’ai aussi déjà essayé d’en créer moi-même avec https://www.analogway.com/products/aw-edid-editor, mais régler correctement les différences de détail entre les modes et l’ordre de préférence, entre autres, est assez difficile, en tout cas pour moi

    • J’ai beaucoup trop d’expérience en édition d’EDID
      Mes recommandations : AW EDID Editor déjà mentionné, CRU sous Windows uniquement, 010 Hex Editor avec des templates EDID, wxEDID via Flatpak sous Linux, et edid-decode de v4l-utils
      CRU fonctionne en modifiant un fichier EDID dumpé depuis le moniteur et en supprimant des descripteurs comme le numéro de série pour faire de la place aux résolutions détaillées. Il ne fonctionne pas sous Wine
      Pour wxEDID, il me semble que le paquet de ma distribution plantait dans WxWidgets, et je ne sais pas s’il permet de créer de nouvelles sections
      edid-decode peut aussi servir d’outil textconv pour git diff, mais il n’aide pas à encoder les fichiers EDID
      D’après ce que j’ai vu, les EDID HDMI ont un bloc d’extension CEA, tandis que les EDID DP ont un bloc d’extension DisplayID
      Je n’ai jamais fait d’EDID multipage de plus de 256 octets, et je ne sais pas non plus avec quelle puce EEPROM les émuler, ni quel protocole/API utiliser pour lire et écrire
    • https://www.extron.com/product/software/edidmanager30
      https://www1.kramerav.com/au/product/edid%20designer
      Les deux sont gratuits, mais ce ne sont pas des logiciels librement redistribuables
      Pour celui d’Extron, il faut peut-être travailler sur un projet ou dans une organisation qui utilise leur matériel
    • J’ai eu récemment un problème similaire
      J’ai acheté une barre de son surround 5.1 bon marché prenant en charge jusqu’au Dolby TrueHD via HDMI, mais le piège est qu’elle ne fonctionne vraiment bien qu’avec des appareils compatibles eARC, donc des TV récentes
      Si on la branche à un PC, il faut utiliser SPDIF ou AUX, ce qui dégrade la qualité
      Plutôt que d’acheter un extracteur audio ou un répartiteur, il existe une façon de tromper l’EDID du PC pour que la barre de son soit reconnue comme eARC
      C’est encore en cours, et malheureusement il n’y a pas de guide clair
    • Je serais curieux de savoir quel dongle émulateur EDID programmable vous utilisez
      J’ai regardé récemment, mais il n’était pas clair quel appareil offrait quelles fonctionnalités, ni s’il existait de bons modèles moins chers
  • Ce type de produit existe aussi avec passthrough, et c’est utile pour de vieux systèmes qui posent problème avec les moniteurs haute résolution
    J’ai un système AMD FX8350 datant d’environ 2011, dont le chipset northbridge+vidéo intégré 880G n’arrive pas à sortir correctement de la vidéo HDMI vers un écran 4K
    Si je branche ce genre d’appareil entre les deux pour lui indiquer d’envoyer une image 1080p, ça fonctionne bien, et le moniteur fait un upscaling entier x2 en 4K

    • J’ai aussi quelques modèles passthrough, et je pense que l’article aurait dû les mentionner comme autre option
      Ceux que j’ai sont plutôt haut de gamme : ils peuvent lire l’EDID du moniteur et l’enregistrer, puis l’utiliser comme override pour un autre moniteur
      Autre point excellent : ils peuvent forcer la détection permanente du moniteur
      L’un de mes moniteurs se comporte quasiment comme s’il était débranché quand on l’éteint, ce qui causait divers problèmes, et le passthrough les a entièrement résolus
      Le produit que j’utilise est le HD-EWB de THWT
  • Les dummy plugs HDMI sont une solution matérielle à un problème logiciel qui ne devrait pas exister au départ

    • On dirait une formule qui décrit une grande partie des solutions matérielles existantes
  • Je me demande pourquoi les dummy plugs sont nécessaires
    Je ne vois pas ce qu’on peut faire uniquement avec un dummy plug et pas en logiciel. Je pose la question en ayant utilisé 18 écrans virtuels sans dummy et sans problème

    • Par exemple, sur mon PC, j’utilise un logiciel appelé Looking Glass pour interagir avec une machine virtuelle Windows
      L’ordinateur a deux GPU : le GPU AMD sert à l’hôte Linux, et le GPU NVidia est passé en passthrough à l’invité Windows
      Looking Glass capture la sortie du GPU NVidia et l’affiche dans une fenêtre sur mon bureau
      Avec cette approche, je peux utiliser des logiciels Windows dans la VM avec des performances correctes. Depuis Windows 7, Windows a pratiquement besoin de l’accélération graphique pour être utilisable
      Le problème, c’est que le GPU NVidia ne fait rien si aucun écran n’est connecté
      Les GPU NVidia Quadro peuvent dumper l’EDID d’un moniteur et mapper ce fichier à une sortie, mais les GPU grand public ne le prennent pas en charge
      C’est pourquoi un dummy plug est nécessaire
    • Pour quelqu’un en déplacement, il devient très facile d’utiliser le mode Présentateur de PowerPoint tout en passant un appel Zoom ou Teams avec un seul écran
      Il suffit d’utiliser l’écran du dummy plug comme sortie PowerPoint, et l’écran du portable pour les notes du présentateur
      Ensuite, on partage l’écran du dummy plug
      Ce n’est peut-être pas la meilleure réponse pour les lecteurs de Hacker News, mais pour un enseignant ou un commercial, c’est vraiment simple
    • De nombreuses combinaisons système d’exploitation/GPU/pilote ne permettent pas réellement de créer un écran virtuel avec des paramètres arbitraires
      On peut en avoir besoin pour des configurations de streaming OBS ou de streaming de jeux comme Steam ou Parsec
      Il y a quelques années, cela fonctionnait dans une certaine mesure avec Xorg et des pilotes open source sous Linux, ainsi qu’avec Windows et Nvidia, mais pas très bien avec MacOS ou Windows+GPU AMD/Intel
    • J’en utilise pour tester des distributions Linux embarquées binaires
      Tromper le système d’exploitation pour lui faire croire qu’un écran est connecté introduit une nouvelle variable qui n’existe pas dans l’environnement réel de déploiement de l’utilisateur ; un dummy plug est une solution matérielle peu coûteuse
      Il est probablement plus rentable d’en acheter un et de le brancher que de demander à un ingénieur d’écrire echo on > /sys/whatever et toute la logique autour
    • Pour la plupart des gens, un dummy plug est beaucoup plus simple
      J’ai ajouté en logiciel un faux moniteur 4K à mon bureau pour du streaming de jeu à distance, et c’était bien plus compliqué que prévu
      https://pfy.ch/programming/4k-sunshine.html
  • Astuce intéressante : avec la même procédure, on peut aussi modifier l’EDID stocké dans un moniteur classique ou dans l’écran d’un ordinateur portable
    Parfois, on peut même écrire à d’autres adresses I2C pour changer plusieurs paramètres du TCON
    Le Raspberry Pi n’est pas indispensable non plus : n’importe quel ordinateur peut faire l’affaire

    • Je l’ai fait une fois sur un moniteur Acer
      Je le modifiais pour faire stroboscoper le rétroéclairage LED afin d’obtenir une image sans flou comme sur un CRT
      J’ai découvert que le bus DDC exposait aussi d’autres registres contrôlant le rétroéclairage, etc., et j’ai raccordé un circuit externe pour le strobing
      J’ai aussi vu les registres permettant de lire et d’écrire la ROM flash ; je l’ai dumpée, puis j’ai écrit un désassembleur 8051 et fait une rétro-ingénierie approximative, avant de modifier finalement la ROM pour y ajouter un mode stroboscopique
      J’ai fait en sorte que ce mode occupe la partie basse du réglage de luminosité, afin qu’on puisse l’activer et l’ajuster via l’OSD ou le contrôle de luminosité DDC standard
      Pour flasher, il fallait ouvrir l’appareil et connecter la ligne d’écriture
      Pratique : il y avait une interruption vblank, et le timer qui contrôlait le rétroéclairage LED avait un mode permettant de l’allumer juste avant l’interruption suivante, puis de l’éteindre après une durée réglable
      Le timing était parfait pour allumer le rétroéclairage juste après la stabilisation du rafraîchissement LCD
      L’objectif initial était seulement de supprimer le logo de démarrage de quelques secondes, et ça a réussi
    • Les puces flash ont généralement une broche d’activation/désactivation de l’écriture, et la plupart des moniteurs et TV la câblent de manière à empêcher l’écriture de l’EDID
      Je pense que seuls les produits bas de gamme l’omettent
      Sans protection, c’est risqué : un glitch de tension pendant une lecture peut se transformer en écriture et corrompre la flash
    • L’auteur recommande d’utiliser un Pi, mais précise que ce n’est pas obligatoire
      « Si vous essayez cette commande sur un PC, vous risquez de flasher accidentellement un matériel qui n’est pas l’EDID, par exemple l’EEPROM SPD d’un module RAM »
    • Si l’on peut modifier de la même façon l’EDID stocké dans un moniteur classique, du point de vue d’un développeur matériel, cela ressemble à une étrange erreur
      Normalement, on achèterait une EEPROM préprogrammée, on la monterait sur la carte, et on câblerait la broche d’activation d’écriture pour qu’elle ne puisse jamais passer à l’état haut
      Mettre une EEPROM dans un produit comme un moniteur et la laisser inscriptible est étrange, même si j’ai déjà vu plus bizarre sur du matériel commercialisé
  • Je suis perplexe
    Je m’attendais à voir la fiche connectée aux broches GPIO I2C, mais il semble suffire de la brancher directement au RPi
    Je me demande donc si HDMI expose directement une interface I2C

    • Oui. Le lien DDC, qui est la partie communication de VGA/HDMI/DVI, est essentiellement un lien I2C, et c’est aussi ainsi que le système d’exploitation interroge l’EDID en fonctionnement normal
      Comme mentionné dans l’article, le RPi dispose d’un contrôleur I2C connecté à ces broches du port HDMI, puisqu’il doit lire l’EDID via DDC
  • Je me demande si quelqu’un connaît un émulateur EDID DisplayPort bon marché qui permettrait de résoudre les problèmes avec les KVM et Linux.
    La dernière fois que j’ai vérifié, c’était tellement plus cher que le HDMI qu’il valait presque mieux acheter un nouveau KVM.

    • Le problème ici, c’est que DisplayPort n’utilise pas une simple EEPROM connectée au bus I2C pour l’EDID.
      À la place, il utilise le bus AUX haut débit propre à DisplayPort, bien plus complexe à manipuler.
      J’ai l’impression qu’il est difficile de trouver une documentation correcte sans adhérer à la VESA et signer une pile de NDA.
    • On peut remplacer l’EDID via une option du noyau.
      https://foosel.net/til/how-to-override-the-edid-data-of-a-mo...
      En revanche, si l’objectif est d’ajouter un écran virtuel, je ne sais pas trop si https://askubuntu.com/questions/453109/add-fake-display-when... fonctionne.
  • Je me demande si les dummy plugs peuvent aussi servir à modifier le fingerprinting des appareils.