- कम कीमत वाले HDMI डमी प्लग, जिसे 4K मॉनिटर की तरह पहचाना जा रहा था, को 1080p HDMI capture device जैसा दिखाने के लिए उसके अंदरूनी EDID EEPROM को Raspberry Pi से दोबारा लिखा गया
- डमी प्लग सिर्फ HPD पिन pull-up और I2C EEPROM के जरिए कंप्यूटर को मॉनिटर कनेक्ट होने का संकेत देता है, और EDID supported resolution, audio और color space जैसी display device जानकारी तय करता है
- Raspberry Pi के HDMI पोर्ट में EDID के लिए I2C controller जुड़ा होता है, इसलिए मॉडल के हिसाब से bus number सही रखने पर डमी प्लग और capture device के EDID को पढ़कर compare किया जा सकता है
- असली प्रक्रिया I2C enable करने,
i2c-tools install करने, 0x50 address जांचने, get-edid dump लेने, और i2cset loop से 256-byte write करने के क्रम में होती है
- गलत I2C bus या असली monitor पर write command चलाने से EDID या कोई दूसरा EEPROM खराब हो सकता है, इसलिए लिखने से पहले parsing और target verification जरूरी है
4K डमी प्लग को 1080p capture device जैसा दिखाना
- Amazon से पहले खरीदा गया सस्ता HDMI डमी प्लग 4K monitor जैसा काम कर रहा था, इसलिए इसे ज्यादा simple और 4K resolution support न करने वाले device जैसा दिखाने के लिए बदला गया
- लक्ष्य था डमी प्लग के EDID को कई 1080p HDMI capture devices में से किसी एक की EDID copy से replace करना
- बदलाव पूरा होने के बाद कंप्यूटर 4K monitor के बजाय HDMI capture device connected होने के रूप में इसे पहचानता है
HDMI डमी प्लग और EDID की भूमिका
- HDMI, DVI जैसे डमी प्लग video signal को वास्तव में process नहीं करते; उनमें बस इतना minimum circuit होता है कि कंप्यूटर जैसा video output device समझे कि monitor connected है
- आम तौर पर जरूरी चीजें दो होती हैं
- EDID में monitor का manufacturer, manufacture date, supported resolutions, audio channels और color space जैसी जानकारी होती है
- ऐसे डमी प्लग headless machines में operating system को यह महसूस कराने के लिए उपयोगी होते हैं कि monitor लगा हुआ है
Raspberry Pi का HDMI I2C bus
- Raspberry Pi Zero के HDMI port में EDID पढ़ने के लिए I2C controller सही pins से जुड़ा होता है
- Pi model के हिसाब से जांचने वाले I2C buses इस प्रकार हैं
- 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 इस्तेमाल करते समय
edid_i2c=2 set करें
- दूसरे models में ऊपर की list के हिसाब से bus number बदलना होगा
तैयारी
- नए Raspberry Pi OS Lite install पर पहले I2C access environment तैयार करें
sudo raspi-config चलाकर Interface Options में I2C enable करें
sudo apt install i2c-tools से I2C tools install करें
- Pi Zero पर network access समस्या हो सकती है, इसलिए USB-Ethernet adapter की जरूरत पड़ सकती है
- विकल्प के तौर पर SD card को Debian/Ubuntu desktop PC में लगाकर,
binfmt-support और qemu-user-static install करने के बाद SD card के rootfs में chroot करके apt install चलाया जा सकता है
- setup के हिसाब से HDMI-to-Mini-HDMI adapter भी जरूरी हो सकता है
original EDID पढ़ना और verify करना
- पहले जांचें कि डमी प्लग EDID EEPROM के रूप में पहचाना जा रहा है या नहीं
edid_i2c=2
i2cdetect -y $edid_i2c
- result में address
0x50 पर I2C device detect हुआ, और यही EDID के लिए इस्तेमाल होने वाला address है
- उस डमी प्लग ने
0x51 से 0x57 तक भी response दिया, और लगता है कि इन addresses में उसी EDID की copies हैं
- हर डमी प्लग ऐसे काम नहीं करता; एक दूसरे डमी प्लग में सिर्फ
0x50 detect हुआ
- original EDID को नीचे दिए command से dump करें
get-edid -b $edid_i2c > edid-orig.bin
get-edid ने output दिया कि I2C bus 2 से 256-byte EDID सफलतापूर्वक पढ़ा गया
- वही dump दो बार लेकर compare करें कि दोनों results identical हैं या नहीं
- इसके बाद
od से hex dump print करें, और edidreader.com में paste करके verify करें कि यह valid EDID है या नहीं
od -v -An -txC edid-orig.bin
capture device EDID को डमी प्लग में लिखना
- डमी प्लग के original EDID का backup लेने के बाद, Pi के HDMI port से डमी प्लग निकालकर HDMI capture device connect करें
- उसी तरीके से capture device का EDID dump करें
get-edid -b $edid_i2c > edid-capture-card.bin
- capture device का EDID भी valid EDID है या नहीं, यह verify करें
- इसके बाद capture device निकालकर डमी प्लग फिर से connect करें, और capture device का EDID डमी प्लग EEPROM में लिखें
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
- यह script dump file के EDID को दो-character hexadecimal string array में बदलती है, हर byte के आगे
0x लगाती है और i2cset से EEPROM में क्रम से लिखती है
- edid-checked-writer जैसे tools भी हैं, लेकिन ऊपर वाला तरीका standard Linux userspace I2C tools और bash या dash होने पर काम करता है
write result जांचना
- लिखने के बाद फिर से डमी प्लग से EDID पढ़कर capture device EDID file से compare करें
get-edid -b $edid_i2c > edid-test.bin
diff edid-test.bin edid-capture-card.bin
diff ने कोई output नहीं दिया, जिससे confirm हुआ कि नया dump original capture device EDID जैसा ही है
- डमी प्लग का EEPROM capture device के EDID से reprogram हो गया
- इसके बाद test computer में लगाकर boot करने पर, कंप्यूटर 4K monitor के बजाय HDMI capture device connected होने जैसा व्यवहार करता है
लिखने से पहले जांचने योग्य जोखिम
- अगर यह प्रक्रिया असली monitor connected होने पर चलाई जाए और उस monitor का EDID protected न हो, तो monitor खराब हो सकता है
- write command सिर्फ HDMI port में ऐसे device connected होने पर चलानी चाहिए जो डमी प्लग की तरह खराब हो जाए तो भी चले
- सही I2C bus होने का भरोसा होना चाहिए, और लिखने से पहले EDID पढ़कर parse करना चाहिए कि वास्तव में EDID ही मौजूद है
- PC पर यह command चलाने से RAM module के SPD EEPROM जैसे EDID न होने वाले hardware को गलती से flash करने की संभावना होती है
- असली PC पर I2C write के साथ experiment करने के बजाय Raspberry Pi इस्तेमाल करने से desktop PC खराब करने का जोखिम कम होता है
- यही तरीका उल्टा, किसी पुराने 1080p डमी प्लग में 4K-supported EDID डालने के लिए भी इस्तेमाल किया जा सकता है
1 टिप्पणियां
Hacker News टिप्पणियाँ
घर पर इसे आज़माने वालों के लिए एक छोटी-सी सावधानी: ऐसे सस्ते dummy plugs में EEPROM सिर्फ 256 bytes का होता है, इसलिए high-resolution और high-refresh-rate settings के लिए ज़रूरी कई extension EDID blocks स्टोर करने के लिए यह पर्याप्त नहीं है
अगर आपको सिर्फ 1080p60 चाहिए तो ठीक है, लेकिन 4k240 monitor की नकल करने के लिए इसका इस्तेमाल नहीं हो सकता
साथ ही कुछ में write-protect line high या low पर फिक्स होती है, इसलिए वास्तव में write करने के लिए थोड़े hardware work की ज़रूरत पड़ती है
ऐसे dummy plugs की एक सीमा यह है कि ये HDCP support नहीं करते
headless machine पर किसी खास resolution output को जबरन बनाने के लिए ये ठीक हैं, लेकिन जिस चीज़ को HDCP चाहिए उसे चलाने के उपयोग में ये fail हो जाते हैं
मैं सोच रहा हूँ कि क्या कोई अच्छा समाधान है जो HDMI dummy plug की तरह काम करे और HDCP negotiation भी कर दे
full resolution में playback के लिए HDCP मांगने वाले video streaming apps को test करना है, लेकिन हर test के लिए एक TV रखना असुविधाजनक है
अब तक मिला समाधान HDMI multiviewer है, जो हर port के लिए HDCP अलग-अलग negotiate करता हुआ लगता है
यह preset EDID इस्तेमाल कर सकता है, या HDMI output 1 से जुड़े device से EDID learn करने के बाद, splitter में सिर्फ power रहे तो output में कुछ connect न होने पर भी connected monitor जैसा दिखाता है
मेरी समझ में computer या console और splitter के बीच HDCP negotiate होता है, और output monitor को signal HDCP के बिना भेजा जाता है
https://www.amazon.com/dp/B07VP37KMB
मेरे पास HDMI output देने वाला एक embedded system है, और मैं boot screen को किसी दूसरे HDMI stream में बदलना चाहता हूँ। static image भी पर्याप्त होगी
कई कारणों से embedded system को बिल्कुल बदलना नहीं चाहता, और सोच रहा हूँ कि इसे सस्ते और robust तरीके से कैसे किया जाए
हालांकि buyer beware लागू है
अगर HDCP 1.4 से नया कुछ चाहिए, तो शायद यह लगभग असंभव है
इससे जुड़ा सवाल: क्या EDID binaries का कोई अच्छा archive या बेहतर generator program है?
मेरे पास programmable EDID emulator plug है, इसलिए मैं अपना monitor या कोई दूसरा monitor clone कर सकता हूँ, लेकिन जब किसी खास resolution या feature को set करना हो तो कई बार तरीका नहीं मिलता। जैसे DSC के साथ 8K
https://github.com/bsdhw/EDID के बारे में जानता हूँ, लेकिन latest monitors के मामले में यह काफी सीमित है
https://www.analogway.com/products/aw-edid-editor से खुद बनाने की कोशिश भी की है, लेकिन कई modes के detailed differences या preferred order settings आदि ठीक से मिलाना, कम-से-कम मेरे लिए, काफी मुश्किल है
मेरी recommendations ये हैं: पहले से mention किया गया AW EDID Editor, Windows-only CRU, EDID templates वाला 010 Hex Editor, Linux पर Flatpak का wxEDID, और v4l-utils का edid-decode
CRU monitor से dump की गई EDID file को modify करते हुए detailed resolution space बनाने के लिए serial number जैसे descriptors हटाता है, लेकिन काम करता है। Wine में नहीं चलता
wxEDID के बारे में याद है कि distro package WxWidgets में crash हुआ था, और यह section नया बना सकता है या नहीं, पता नहीं
edid-decode को git diff के textconv tool के रूप में भी इस्तेमाल कर सकते हैं, लेकिन यह EDID file encoding में मदद नहीं करता
HDMI EDID में CEA extension block होता है, और DP EDID में DisplayID extension block होता है, ऐसा मैंने देखा है
256 bytes से बड़े multi-page EDID पर काम नहीं किया है, और किस EEPROM chip से emulation करना चाहिए या read/write protocol/API क्या है, यह भी नहीं जानता
https://www1.kramerav.com/au/product/edid%20designer
दोनों free हैं, लेकिन freely redistributable software नहीं हैं
Extron वाले के लिए शायद आपको उस hardware का इस्तेमाल करने वाले project या organization में काम करना पड़े
मैंने HDMI के ज़रिए Dolby TrueHD तक support करने वाला सस्ता 5.1 surround soundbar खरीदा, लेकिन catch यह है कि यह सिर्फ eARC support वाले device, यानी नए TV, पर ही ठीक से काम करता है
PC से connect करने पर SPDIF या AUX इस्तेमाल करना पड़ता है, जिससे quality घटती है
audio extractor या splitter खरीदने के अलावा, PC EDID को trick करके soundbar को eARC के रूप में recognize करवाने का तरीका है
अभी काम चल रहा है, और अफसोस कि कोई clear guideline नहीं है
हाल में खोजा था, लेकिन यह clear नहीं था कि कौन-सा device कौन-कौन-से features रखता है, और cheaper products में कोई अच्छा option है या नहीं
ऐसे उत्पाद पास-थ्रू वाले रूप में भी खरीदे जा सकते हैं, और ये उन पुराने सिस्टमों के लिए उपयोगी हैं जो high-resolution मॉनिटर पर समस्या पैदा करते हैं
मेरे पास लगभग 2011 का AMD FX8350 सिस्टम है, जिसका built-in 880G northbridge+video chipset 4K display पर HDMI वीडियो ठीक से output नहीं कर पाता
बीच में ऐसा डिवाइस लगाकर उसे 1080p image भेजने को बता दें तो यह ठीक चलता है, और मॉनिटर उसे 4K में 2x integer upscaling कर देता है
मेरे पास वाला काफी high-end है, इसलिए यह मॉनिटर से EDID पढ़कर save कर सकता है और फिर उसे दूसरे मॉनिटर के लिए override की तरह इस्तेमाल कर सकता है
एक और बढ़िया बात यह है कि यह मॉनिटर को हमेशा detected दिखाने के लिए force कर सकता है
मेरे एक मॉनिटर को बंद करने पर वह असल में disconnect हो गया हो, ऐसा behave करता था और कई समस्याएं होती थीं; पास-थ्रू ने इसे पूरी तरह ठीक कर दिया
मैं THWT का HD-EWB इस्तेमाल करता हूं
HDMI dummy plug असल में ऐसे software problem का hardware solution है, जो पहली जगह मौजूद ही नहीं होना चाहिए
जिज्ञासा है कि dummy plug की जरूरत क्यों पड़ती है
समझ नहीं आता कि ऐसा क्या है जो software से नहीं हो सकता और सिर्फ dummy plug से हो सकता है। यह सवाल मैं इसलिए पूछ रहा हूं क्योंकि मैंने dummy के बिना 18 virtual displays बिना समस्या इस्तेमाल किए हैं
कंप्यूटर में दो GPU हैं: AMD GPU Linux host के लिए है और NVidia GPU Windows guest को passthrough किया गया है
Looking Glass NVidia GPU का output capture करके मेरे desktop की window में दिखाता है
इस तरीके से VM में Windows software इस्तेमाल किया जा सकता है और performance भी ठीक रहती है। Windows 7 के बाद से Windows को व्यावहारिक रूप से ठीक से चलाने के लिए graphics acceleration चाहिए ही होता है
समस्या यह है कि अगर display connected न हो तो NVidia GPU कुछ भी नहीं करता
NVidia Quadro GPU में monitor EDID dump करके उस file को output से map किया जा सकता है, लेकिन consumer GPU इसे support नहीं करते
इसलिए dummy plug चाहिए
dummy plug screen को PowerPoint output के रूप में इस्तेमाल करें, और laptop screen को presenter notes के लिए
फिर dummy plug screen share कर दें
Hacker News readers के लिए यह सबसे अच्छा जवाब न हो, लेकिन teachers या sales reps के लिए यह वाकई बहुत सरल है
OBS streaming या Steam, Parsec जैसे game streaming setup के लिए इसकी जरूरत पड़ सकती है
कुछ साल पहले Linux के Xorg और open source drivers, तथा Windows और Nvidia combination में यह कुछ हद तक संभव था, लेकिन MacOS या Windows+AMD/Intel GPU पर यह उतना अच्छी तरह काम नहीं करता था
operating system को यह दिखाने के लिए धोखा देना कि display connected है, user के वास्तविक deployment environment में मौजूद नहीं होने वाला नया variable जोड़ देता है; dummy plug एक सस्ता hardware solution है
किसी engineer से
echo on > /sys/whateverऔर उसके आसपास का logic लिखवाने की तुलना में, इसे खरीदकर plug in करना संभवतः ज्यादा cost-effective हैremote game streaming के लिए मैंने software से desktop में fake 4K monitor जोड़ा था, लेकिन यह उम्मीद से कहीं ज्यादा जटिल निकला
https://pfy.ch/programming/4k-sunshine.html
मजेदार tip: इसी procedure से सामान्य monitor या laptop screen में stored EDID भी modify किया जा सकता है
कभी-कभी अलग I2C address पर लिखकर TCON की कई settings तक बदली जा सकती हैं
Raspberry Pi अनिवार्य भी नहीं है; कोई भी computer चल जाएगा
CRT जैसी blur-free image बनाने के लिए मैं LED backlight को strobe करने वाला modification कर रहा था
पता चला कि DDC bus backlight आदि control करने वाले दूसरे registers भी expose करती है, और strobing के लिए मैंने external circuit connect किया
flash ROM को read और write करने वाले registers भी दिखे, इसलिए मैंने dump किया, फिर 8051 disassembler लिखा और मोटे तौर पर reverse engineering की; अंत में ROM को strobe mode शामिल करने के लिए modify किया
इस mode को brightness control के lower range में रख दिया, ताकि इसे OSD या सामान्य DDC brightness control से turn on और adjust किया जा सके
flash करते समय अंदर खोलकर write line connect करनी पड़ी
सुविधाजनक रूप से vblank interrupt था, और LED backlight control करने वाले timer में ऐसा mode था जो अगले interrupt से ठीक पहले on कर सकता था और adjustable time के बाद off कर सकता था
LCD refresh स्थिर होने के तुरंत बाद backlight on करने के लिए timing बिल्कुल सही थी
मूल लक्ष्य सिर्फ कुछ seconds वाले boot logo को हटाना था, और वह सफल रहा
लगता है सिर्फ low-cost products ही इसे छोड़ते होंगे
protection न हो तो read के दौरान voltage glitch write में बदलकर flash खराब कर सकता है, इसलिए यह जोखिम भरा है
“अगर आप PC पर यह command आजमाते हैं, तो EDID के बजाय hardware, जैसे RAM module के SPD EEPROM, को गलती से flash कर सकते हैं”
आम तौर पर pre-programmed EEPROM खरीदकर board पर mount किया जाएगा, और write enable pin को कभी high न होने देने के लिए wiring की जाएगी
monitor जैसे product में EEPROM डालकर उसे writable छोड़ देना अजीब है, हालांकि released hardware में इससे भी अजीब चीजें देखी हैं
उलझन हो रही है
मुझे उम्मीद थी कि plug को GPIO I2C pins से connect करते दिखाया जाएगा, लेकिन लगता है सिर्फ RPi में plug करना ही काफी है
तो क्या HDMI सीधे I2C interface expose करता है?
जैसा लेख में बताया गया है, RPi में उस HDMI port pin से जुड़ा I2C controller होता है, क्योंकि DDC के जरिए EDID पढ़ना जरूरी है
सोच रहा/रही हूँ कि क्या किसी को KVM और Linux की समस्या हल करने के लिए कोई सस्ता DisplayPort EDID emulator पता है
पिछली बार जब देखा था, तो यह HDMI से इतना ज़्यादा महंगा था कि नया KVM खरीदना ही बेहतर लगता था
इसके बजाय यह DisplayPort के लिए खास, कहीं ज़्यादा जटिल high-speed AUX bus का उपयोग करता है
लगता है VESA में शामिल हुए और ढेर सारे NDA पर साइन किए बिना ठीक-ठाक documentation तक मिलना मुश्किल होगा
https://foosel.net/til/how-to-override-the-edid-data-of-a-mo...
हालांकि अगर मकसद virtual monitor जोड़ना है, तो https://askubuntu.com/questions/453109/add-fake-display-when... काम करेगा या नहीं, यह पक्का नहीं है
सोच रहा/रही हूँ कि क्या dummy plug को device fingerprint tracking बदलने के लिए भी इस्तेमाल किया जा सकता है