Injecteur EDID
Projet réalisé par fma38.
Projet abouti
Présentation
Le but de ce projet est de faire un injecteur EDID (en HDMI), pour remplacer le profil d'un diffuseur, et faire croire à la source qu'il supporte des fonctionnalités qu'il n'a pas.
Pourquoi ?
Mon fils est en train de se monter une petite installation audio-vidéo avec une barre de son, un projecteur vidéo, et un petit écran de monitoring, le tout alimenté par Kodi tournant sur un ODROID N2.
Pour ça, il faut donc un splitter, capable de piloter les 3 diffuseurs depuis la sortie unique du N2. Or, le splitter qu'il a trouvé, qui fait aussi multiplexeur, est un peu con : il regarde ce qu'il y a comme diffuseurs de connectés, et ne laisse passer que ce qui est commun a tous ! Du coup, avec la barre de son seule, ça marche bien, mais dès que le projecteur (ou l'écran) est branché, les flux audio numériques (AC-3, DTS, et leurs évolutions) ne passent plus, donc plus de son sur la barre !!!
Solution
Faire croire au splitter que le projo et l'écran supportent les flux audio numériques.
Comment ?
Les informations EDID, qui contiennent donc ce qu'un diffuseur est capable de gérer (résolutions pour un projo/écran, flux audio pour une barre de son, les 2 pour une Tv), sont en fait contenues dans une EEPROM, laquelle est lue via les lignes I²C présentes dans les liaisons audio/vidéo (HDMI, VGA, DP, DVI).
L'injecteur EDID est un petit bidule qui se branche entre la sortie du splitter et le projecteur (et le petit écran), et qui contient une EEPROM avec un profil kivabien, faisant croire au splitter que le projo (et le petit écran) supporte aussi l'audio, pour qu'il laisse donc tout bien passer.
Hardware
Version TH
Le plus simple est d'utiliser un breakout de ce type :
en prenant soin de couper les pistes du bus I²C (pins 15 et 16) entre le connecteur HDMI femelle (côté diffuseur) et le connecteur pin header 20 points (où l'on viendra greffer l'EEPROM) :
Le schéma est vraiment très simple :
On peut alors placer les composants sur une perfboard :
Et monter le tout dans un petit boîtier imprimé en 3D :
L'EEPROM utilisée pour les tests est une 24LC22A, mais une 24LC02 doit fonctionner aussi (mais il faut alors enlever R3, qui permet de basculer la 24LC22A en mode bidirectionnel, mais protège la 24LC02 en écriture, et tirer la pin 7 à la masse).
Version CMS
Une solution plus compacte, à base de composants CMS, est en cours de réalisation :
Cette solution utilise un PCB custom, et des connecteurs verticaux.
Software
Un profil peut être lu avec la commande suivante :
$ cat /sys/class/drm/card0-HDMI-A-1/edid >edid.bin
(remplacer card0-HDMI-A-1 par le port correspondant au diffuseur souhaité).
Il est possible d'afficher le profil sous forme texte avec :
$ edid-profile edid.bin
Pour écrire le profil dans l'EEPROM de l'injecteur, vous pouvez utiliser le script suivant :
#!/bin/sh
if [ "$#" -ne 2 ]; then
echo "Usage: ./edid-send.sh <i2c_num> <edid_file>"
exit 1
fi
if [ ! -f "$2" ]; then
echo "File '$2' does not exist."
exit 1
fi
for i in $(seq 0 255); do
byte=$(xxd -p -l 1 -s $i $2)
sudo i2cset -y $1 0x50 $i 0x$byte
echo -n .
if [ $(((i+1) % 16)) -eq 0 ]; then
echo
fi
sleep 0.1 # may work with shorter delay
done
echo done
Attention à bien choisir le port I²C correspondant à votre injecteur, ou vous risqueriez d'écraser le profil de votre écran !
En principe, l'EEPROM de celui-ci devrait être protégée en écriture, mais pour être certain de trouver le bon port, vous pouvez essayer de le lire avec :
$ sudo i2cdump -y <I2C_PORT> 0x50
Une EEPROM vierge retourne des ff. Si elle contient déjà un profil, il suffit de débrancher l'injecteur pour vérifier que vous lisez des XX au lieu des données du profil.
Profils
La partie tricky est de créer le profil. Pour ça, il faut utiliser un éditeur EDID, comme AW EDID Editor (qui tourne nickel sous wine), car se le farcir à la main est un peu chaud :o/
Dans le cas de l'installe de mon fils, je suis parti du profil du projecteur, et je lui ai ajouté les champs audio de la barre de son. Bon, j'ai dû au passage virer quelques résolutions du projo, car il n'y avait pas assez de place pour tout mettre ! Mais il y a peu de chance qu'il utilise des trucs du genre 480i@60Hz ;o)
Une fois le profil édité avec AW EDID Editor, il suffit de l'écrire dans l'EEPROM de l'injecteur avec le script ci-dessus → le splitter est alors mystifié :o)
Liens
Profils EDID
Éditeurs de profil
- AW EDID Editor - logiciel pour créer/éditer les profils EDID (pour Windows, mais fonctionne sous Linux avec wine)
Boîtier
Utilitaires
- write-edid - script Shell pour écrire un profil EDID sur l'EEPROM depuis Linux
- EDWriter - soft pour écrire un profil EDID sur l'EEPROM depuis Windows
- edid-rw - script Python pour écrire un profil EDID sur l'EEPROM depuis Linux (avec vérification)