- Daha önce 4K monitör gibi algılanan ucuz bir HDMI dummy plug’un, 1080p HDMI capture device gibi görünmesi için içindeki EDID EEPROM Raspberry Pi ile yeniden yazıldı
- Dummy plug, yalnızca HPD pini pull-up’ı ve bir I2C EEPROM ile bilgisayarın bir monitör bağlı olduğunu algılamasını sağlar; EDID ise desteklenen çözünürlük, ses ve renk uzayı gibi ekran aygıtı bilgilerini belirler
- Raspberry Pi’nin HDMI portunda EDID için bağlı bir I2C denetleyicisi bulunur; modele göre doğru bus numarası seçilirse dummy plug ve capture device EDID’leri okunup karşılaştırılabilir
- Gerçek işlem sırası I2C’yi etkinleştirme,
i2c-tools kurma, 0x50 adresini doğrulama, get-edid ile dump alma ve i2cset döngüsüyle 256 bayt yazma adımlarından oluşur
- Yanlış I2C bus’ını kullanmak veya yazma komutunu gerçek bir monitöre göndermek EDID’yi ya da başka EEPROM’ları bozabilir; bu yüzden yazmadan önce parse etme ve hedef doğrulaması şarttır
4K dummy plug’u 1080p capture device gibi göstermek
- Amazon’dan zamanında alınmış ucuz bir HDMI dummy plug, 4K monitör gibi davranıyordu; amaç onu daha basit ve 4K çözünürlüğü desteklemeyen bir aygıt gibi göstermekti
- Hedef, dummy plug’un EDID’sini birkaç 1080p HDMI capture device’tan birinin EDID kopyasıyla değiştirmekti
- Değişiklik tamamlandığında bilgisayar, 4K monitör yerine bir HDMI capture device bağlı olduğunu algılıyor
HDMI dummy plug ve EDID’nin rolü
- HDMI, DVI ve benzeri dummy plug’lar görüntü sinyalini gerçekten işlemez; yalnızca bilgisayar gibi bir görüntü çıkış aygıtının monitör bağlı sanması için gerekli en küçük devreyi içerir
- Genellikle gereken iki unsur şunlardır
- EDID içinde monitörün üreticisi, üretim tarihi, desteklenen çözünürlükler, ses kanalları ve renk uzayı gibi bilgiler yer alır
- Bu tür dummy plug’lar, headless makinelerde işletim sisteminin bir monitör bağlı olduğunu sanmasını sağlamak için kullanışlıdır
Raspberry Pi’nin HDMI I2C bus’ı
- Raspberry Pi Zero’nun HDMI portunda, EDID okumak için doğru pinlere bağlı bir I2C denetleyicisi bulunur
- Pi modeline göre kontrol edilmesi gereken I2C bus’ları şöyledir
- Pi 0-3:
/dev/i2c-2
- Pi 4:
/dev/i2c-20, /dev/i2c-21
- Pi 5:
/dev/i2c-11, /dev/i2c-12
- Raspberry Pi Zero kullanılıyorsa
edid_i2c=2 olarak ayarlanır
- Diğer modellerde bus numarası bu listeye göre değiştirilmelidir
Hazırlık
- Temiz bir Raspberry Pi OS Lite kurulumunda önce I2C erişim ortamı hazırlanır
sudo raspi-config çalıştırıp Interface Options içinden I2C’yi etkinleştirme
sudo apt install i2c-tools ile I2C araçlarını kurma
- Pi Zero’da ağ erişimi sorun olabileceğinden bir USB-Ethernet adaptörü gerekebilir
- Alternatif olarak SD kart bir Debian/Ubuntu masaüstü PC’ye takılıp
binfmt-support ve qemu-user-static kurulduktan sonra kartın rootfs’ine chroot edilerek apt install çalıştırılabilir
- Çalışma ortamına göre bir HDMI-to-Mini-HDMI adaptörü de gerekebilir
Orijinal EDID’yi okuma ve doğrulama
- Önce dummy plug’un bir EDID EEPROM olarak algılanıp algılanmadığı kontrol edilir
edid_i2c=2
i2cdetect -y $edid_i2c
- Sonuçta
0x50 adresinde bir I2C aygıtı algılandı; bu adres EDID için kullanılır
- Bu dummy plug ayrıca
0x51 ile 0x57 arasındaki adreslere de yanıt verdi; buralarda aynı EDID’nin kopyalarının bulunduğu anlaşılıyor
- Her dummy plug böyle davranmaz; başka bir dummy plug’da yalnızca
0x50 algılandı
- Orijinal EDID şu komutla dump edilir
get-edid -b $edid_i2c > edid-orig.bin
get-edid, I2C bus 2 üzerinden 256 baytlık EDID’yi başarıyla okuduğunu bildirir
- Aynı dump iki kez alınıp sonuçların birebir aynı olup olmadığı karşılaştırılır
- Ardından
od ile hex dump üretilir ve edidreader.com üzerine yapıştırılarak geçerli bir EDID olup olmadığı kontrol edilir
od -v -An -txC edid-orig.bin
Capture device EDID’sini dummy plug’a yazma
- Dummy plug’un orijinal EDID’si yedeklendikten sonra, Pi’nin HDMI portundan çıkarılıp yerine HDMI capture device bağlanır
- Aynı yöntemle capture device’ın EDID’si dump edilir
get-edid -b $edid_i2c > edid-capture-card.bin
- Capture device’ın EDID’sinin de geçerli bir EDID olduğu doğrulanır
- Ardından capture device çıkarılır, dummy plug yeniden takılır ve capture device’ın EDID’si dummy plug EEPROM’una yazılır
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
- Bu betik, dump dosyasındaki EDID’yi iki basamaklı onaltılık dizelerden oluşan bir diziye dönüştürür, her baytın başına
0x ekler ve i2cset ile EEPROM’a sırayla yazar
- edid-checked-writer gibi araçlar da var, ancak bu yöntem standart Linux userspace I2C araçlarıyla ve yalnızca bash veya dash ile çalışır
Yazma sonucunu doğrulama
- Yazma işleminden sonra dummy plug’daki EDID yeniden okunur ve capture device EDID dosyasıyla karşılaştırılır
get-edid -b $edid_i2c > edid-test.bin
diff edid-test.bin edid-capture-card.bin
diff hiçbir çıktı vermedi; yani yeni dump, orijinal capture device EDID’siyle birebir aynı
- Böylece dummy plug’un EEPROM’u capture device’ın EDID’siyle yeniden programlanmış oldu
- Sonrasında test bilgisayarına takılıp açıldığında, bilgisayar 4K monitör yerine bir HDMI capture device bağlıymış gibi davrandı
Yazmadan önce kontrol edilmesi gereken riskler
- Bu prosedür gerçek bir monitör bağlıyken uygulanır ve o monitörün EDID’si korunmuyorsa, monitör bozulabilir
- Yazma komutları yalnızca dummy plug gibi bozulması sorun olmayacak bir aygıt HDMI portuna bağlıyken çalıştırılmalıdır
- Doğru I2C bus’ında olunduğundan emin olunmalı; yazmadan önce EDID okunup parse edilerek gerçekten bir EDID içerdiği doğrulanmalıdır
- Bu komutlar bir PC’de çalıştırılırsa, EDID olmayan donanımları, örneğin RAM modüllerindeki SPD EEPROM’u yanlışlıkla flash etme ihtimali vardır
- Gerçek bir PC’de I2C yazma denemeleri yapmak yerine Raspberry Pi kullanmak, masaüstü PC’ye zarar verme riskini azaltır
- Aynı yöntem ters yönde de kullanılabilir; örneğin eski bir 1080p dummy plug’a 4K destekli bir EDID yazılabilir
1 yorum
Hacker News yorumları
Evde denemek isteyenler için küçük bir uyarı: Bu tür ucuz dummy plug’larda EEPROM yalnızca 256 bayt olduğundan, yüksek çözünürlük ve yüksek yenileme hızı ayarları için gereken birden fazla genişletilmiş EDID bloğunu saklamaya yetmez
Yalnızca 1080p60 gerekiyorsa sorun yok, ancak 4k240 monitör taklidi yapmak için kullanılamaz
Ayrıca bazılarında yazma koruma hattı high ya da low’a sabitlenmiş olduğundan, gerçekten yazmak için biraz donanım işi gerekebilir
Bu tür dummy plug’ların bir sınırlaması da HDCP desteklememeleridir
Headless bir makinede belirli bir çözünürlük çıkışını zorla oluşturmak için gayet uygundur, ancak HDCP gerektiren bir şeyi çalıştırmanız gerekiyorsa işe yaramaz
HDMI dummy plug gibi davranıp HDCP anlaşmasını da yapan iyi bir çözüm var mı merak ediyorum
Tam çözünürlükte oynatmak için HDCP gerektiren video streaming uygulamalarını test etmem gerekiyor; her test için bir TV ayırmak zahmetli
Şimdiye kadar bulduğum çözüm HDMI multiviewer oldu; her port için HDCP’yi ayrı ayrı müzakere ediyor gibi görünüyor
Önceden ayarlanmış EDID’yi kullanabiliyor ya da HDMI çıkış 1’e bağladığınız cihazdan EDID’yi öğrenebiliyor; ardından splitter’a yalnızca güç verildiği sürece, çıkışa hiçbir şey bağlı olmasa bile bağlı bir monitör varmış gibi görünmesini sağlıyor
Bildiğim kadarıyla bilgisayar veya konsol ile splitter arasında HDCP müzakere ediyor, çıkış monitörüne ise sinyali HDCP olmadan gönderiyor
https://www.amazon.com/dp/B07VP37KMB
HDMI çıkışı veren bir embedded sistemim var; açılış ekranını başka bir HDMI stream’iyle değiştirmek istiyorum. Statik bir görüntü yeterli
Çeşitli nedenlerle embedded sistemin kendisini hiç değiştirmek istemiyorum; bunu ucuz ve sağlam şekilde nasıl yapabileceğimi merak ediyorum
Ancak alıcı dikkatli olmalı
HDCP 1.4’ten daha yeni bir şey gerekiyorsa muhtemelen neredeyse imkânsız
Bununla ilgili olarak, EDID binary’lerini toplayan iyi bir arşiv ya da daha iyi bir üretme programı var mı merak ediyorum
Programlanabilir EDID emülatör plug’ım var, bu yüzden kendi monitörümü veya başka monitörleri klonlayabiliyorum; ancak belirli bir çözünürlük ya da özellik ayarlamak istediğimde bazen yöntem bulamıyorum. Örneğin DSC içeren 8K gibi
https://github.com/bsdhw/EDID’yi biliyorum ama yeni monitörler tarafında oldukça sınırlı
https://www.analogway.com/products/aw-edid-editor ile kendim oluşturmayı da denedim, ancak birden çok modun ince farklarını veya tercih sırasını doğru ayarlamak en azından benim için oldukça zor
Önerilerim şöyle: zaten bahsedilen AW EDID Editor, yalnızca Windows için olan CRU, EDID şablonları bulunan 010 Hex Editor, Linux’ta Flatpak üzerinden wxEDID, v4l-utils içindeki edid-decode
CRU, monitörden dump edilen EDID dosyasını düzenlerken ayrıntılı çözünürlük alanı açmak için seri numarası gibi descriptor’ları kaldırıyor ama çalışıyor. Wine’da çalışmıyor
wxEDID için dağıtım paketinin WxWidgets’ta çöktüğünü hatırlıyorum; yeni section oluşturabiliyor mu bilmiyorum
edid-decode, git diff’in textconv aracı olarak da kullanılabilir ama EDID dosyası kodlamaya yardımcı olmaz
HDMI EDID’de CEA extension block, DP EDID’de ise DisplayID extension block olduğunu görüyorum
256 baytı aşan çok sayfalı EDID ile hiç çalışmadım; hangi EEPROM çipiyle emüle etmek gerektiğini veya okuma/yazma protokolünü/API’sini de bilmiyorum
https://www1.kramerav.com/au/product/edid%20designer
İkisi de ücretsiz, ancak özgürce yeniden dağıtılabilen yazılımlar değiller
Extron tarafında, ilgili donanımı kullanan bir projede veya kuruluşta çalışmanız gerekebilir
HDMI üzerinden Dolby TrueHD’ye kadar destekleyen ucuz bir 5.1 surround soundbar aldım; püf noktası, bunun yalnızca eARC destekli cihazlarda, yani yeni TV’lerde düzgün çalışması
PC’ye bağlayınca SPDIF veya AUX kullanmak gerekiyor ve kalite düşüyor
Ses extractor’ı veya splitter satın almak dışında, PC EDID’sini kandırıp soundbar’ın bunu eARC olarak algılamasını sağlamanın bir yolu var
Hâlâ üzerinde çalışıyorum; ne yazık ki net bir yönerge yok
Yakın zamanda araştırdım ama hangi cihazın hangi özelliklere sahip olduğu ve daha ucuz ürünler arasında iyi bir seçenek olup olmadığı net değildi
Bu tür ürünleri passthrough özellikli olarak da satın alabilirsiniz; yüksek çözünürlüklü monitörlerde sorun çıkaran eski sistemlerde işe yarar.
2011 civarından kalma bir AMD FX8350 sistemim var; dahili 880G northbridge+video yonga seti, 4K ekrana HDMI görüntüsünü düzgün veremiyor.
Araya böyle bir cihaz bağlayıp 1080p görüntü göndermesini söyleyince iyi çalışıyor; monitör de bunu 4K’ya 2x tam sayı ölçekleme ile büyütüyor.
Bendekiler oldukça üst seviye; monitörden EDID okuyup kaydedebiliyor, sonra da bunu başka bir monitör için override olarak kullanabiliyor.
Bir başka harika yanı da monitörün her zaman algılanmasını zorlayabilmesi.
Monitörlerimden biri kapatılınca fiilen bağlantısı kesilmiş gibi davranıyor ve çeşitli sorunlara yol açıyordu; passthrough bunu tamamen çözdü.
Kullandığım ürün THWT’nin HD-EWB modeli.
HDMI dummy plug, en başta var olmaması gereken bir yazılım sorununu çözen donanımsal bir çözüm.
Dummy plug’a neden ihtiyaç duyulduğunu merak ediyorum.
Yazılımla yapılamayıp yalnızca dummy plug ile yapılabilen şeyin ne olduğunu bilmiyorum. Bunu, dummy olmadan 18 sanal ekranı sorunsuz kullanmış biri olarak soruyorum.
Bilgisayarda iki GPU var; AMD GPU Linux host için, NVidia GPU ise Windows guest’e passthrough ediliyor.
Looking Glass, NVidia GPU’nun çıktısını yakalayıp masaüstümdeki bir pencerede gösteriyor.
Bu yöntemle VM’de Windows yazılımlarını kullanabiliyorum ve performans da fena değil. Windows, 7’den beri pratikte grafik hızlandırma olmadan düzgün kullanılabilir çalışmıyor.
Sorun şu ki NVidia GPU, bir ekran bağlı değilse hiçbir şey yapmıyor.
NVidia Quadro GPU’larda monitör EDID’si dump edilip bu dosya bir çıkışa eşlenebiliyor, ancak tüketici GPU’ları bunu desteklemiyor.
Bu yüzden dummy plug gerekiyor.
Dummy plug ekranını PowerPoint çıktısı, dizüstü ekranını da sunucu notları için kullanmak yeterli.
Sonra dummy plug ekranını paylaşabilirsiniz.
Hacker News okurları için en iyi yanıt olmayabilir ama öğretmenler veya satış temsilcileri için gerçekten basit.
OBS yayını veya Steam, Parsec gibi oyun streaming kurulumları için buna ihtiyaç duyulabilir.
Birkaç yıl önce Linux’ta Xorg ve açık kaynak sürücülerle, ayrıca Windows ve Nvidia kombinasyonunda bir ölçüde mümkündü; ancak MacOS veya Windows+AMD/Intel GPU’da o kadar iyi çalışmıyordu.
İşletim sistemini bir ekran bağlıymış gibi kandırmak, kullanıcının gerçek dağıtım ortamında olmayan yeni bir değişken yaratır; dummy plug ise ucuz bir donanım çözümüdür.
Bir mühendisin
echo on > /sys/whateverve etrafındaki mantığı yazmasını sağlamaktansa satın alıp takmak muhtemelen daha maliyet-etkindir.Uzaktan oyun streaming için yazılımla masaüstüme sahte bir 4K monitör ekledim; beklediğimden çok daha karmaşıktı.
https://pfy.ch/programming/4k-sunshine.html
İlginç ipucu: Aynı prosedürle sıradan bir monitörde veya dizüstü ekranında saklanan EDID de değiştirilebilir.
Bazen farklı I2C adreslerine yazarak TCON’un çeşitli ayarlarını bile değiştirebilirsiniz.
Raspberry Pi şart da değil; herhangi bir bilgisayar olur.
CRT gibi blursuz görüntü elde etmek için LED arka aydınlatmayı strobe edecek şekilde modifiye ediyordum.
DDC bus’ın arka aydınlatma vb. şeyleri kontrol eden başka register’ları da açığa çıkardığını keşfettim ve strobing için harici devre bağladım.
Flash ROM’u okumaya ve yazmaya yarayan register’lar da görünüyordu; dump ettikten sonra bir 8051 disassembler yazıp kabaca reverse engineering yaptım ve sonunda ROM’u strobe modu içerecek şekilde değiştirdim.
Bu modu parlaklık ayarının alt aralığını kullanacak şekilde yerleştirdim; böylece OSD veya normal DDC parlaklık kontrolüyle açılıp ayarlanabiliyordu.
Flash ederken içini açıp write hattını bağlamak gerekiyordu.
Uygun bir şekilde vblank interrupt vardı ve LED arka aydınlatmayı kontrol eden timer’da, bir sonraki interrupt’tan hemen önce açıp ayarlanabilir bir süre sonra kapatmaya yarayan bir mod bulunuyordu.
LCD yenileme kararlı hâle geldikten hemen sonra arka aydınlatmayı açmak için tam uygun zamanlamaydı.
Asıl hedef yalnızca birkaç saniyelik boot logosunu kaldırmaktı; onu başardım.
Bunu muhtemelen yalnızca düşük maliyetli ürünler atlar.
Koruma yoksa okuma sırasında oluşan bir voltaj glitch’i yazmaya dönüşüp flash’ı bozabilir; bu yüzden risklidir.
“Bu komutu PC’de denerseniz EDID olmayan bir donanımı, örneğin RAM modülünün SPD EEPROM’unu yanlışlıkla flash edebilirsiniz.”
Normalde önceden programlanmış EEPROM satın alıp karta monte eder ve write enable pininin asla high’a çıkmayacağı şekilde kablolardım.
Monitör gibi bir ürüne EEPROM koyup yazılabilir bırakmak garip; ama piyasaya çıkmış donanımlarda daha gariplerini de gördüm.
Kafam karıştı.
Fişin GPIO I2C pinlerine bağlandığını görmeyi bekliyordum; ama yalnızca RPi’ye takmak yeterli görünüyor.
Öyleyse HDMI’ın I2C arayüzünü doğrudan açığa çıkarıp çıkarmadığını merak ediyorum.
Yazıda da belirtildiği gibi RPi’de, HDMI portunun bu pinlerine bağlı bir I2C controller var. Çünkü EDID’in DDC üzerinden okunması gerekiyor.
KVM ve Linux sorununu çözecek ucuz bir DisplayPort EDID emülatörü bilen var mı merak ediyorum.
Son kontrol ettiğimde HDMI olanlardan çok daha pahalıydı; neredeyse yeni bir KVM almak daha mantıklıydı.
Bunun yerine, kullanımı çok daha karmaşık olan DisplayPort’a özgü yüksek hızlı AUX veri yolunu kullanıyor.
VESA’ya üye olup bir sürü NDA imzalamadan doğru düzgün dokümantasyon bulmak bile zor gibi görünüyor.
https://foosel.net/til/how-to-override-the-edid-data-of-a-mo...
Ancak sanal monitör eklemek istiyorsanız https://askubuntu.com/questions/453109/add-fake-display-when... işe yarar mı, pek emin değilim.
Dummy plug’ların cihaz parmak iziyle takip yöntemini değiştirmek için de kullanılıp kullanılamayacağını merak ediyorum.