2 पॉइंट द्वारा GN⁺ 2025-06-16 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • कम कीमत वाले 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 टिप्पणियां

 
GN⁺ 2025-06-16
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 की ज़रूरत पड़ती है

    • WP high है या low, यह इस्तेमाल होने वाले chip type पर निर्भर हो सकता है
  • ऐसे 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 करता हुआ लगता है

    • मैं यह HDMI splitter इस्तेमाल कर रहा हूँ
      यह 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
    • एक और use case है
      मेरे पास HDMI output देने वाला एक embedded system है, और मैं boot screen को किसी दूसरे HDMI stream में बदलना चाहता हूँ। static image भी पर्याप्त होगी
      कई कारणों से embedded system को बिल्कुल बदलना नहीं चाहता, और सोच रहा हूँ कि इसे सस्ते और robust तरीके से कैसे किया जाए
    • Aliexpress पर ऐसे सामान हैं जो HDCP को terminate करके HDMI pass-through करने का दावा करते हैं
      हालांकि buyer beware लागू है
    • Amazon पर लगभग खुले तौर पर “HDCP stripper” की तरह advertise किए गए HDMI splitters में से कोई एक आज़मा सकते हैं
    • HDCP termination मुश्किल है, और HDCP 1.4 पर downgrade करने के बाद end पर 1.4 “compatible” device होना चाहिए, तभी यह dummy monitor जैसा काम कर सकता है
      अगर 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 आदि ठीक से मिलाना, कम-से-कम मेरे लिए, काफी मुश्किल है

    • EDID editing का अनुभव बहुत ज़्यादा है
      मेरी 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://www.extron.com/product/software/edidmanager30
      https://www1.kramerav.com/au/product/edid%20designer
      दोनों free हैं, लेकिन freely redistributable software नहीं हैं
      Extron वाले के लिए शायद आपको उस hardware का इस्तेमाल करने वाले project या organization में काम करना पड़े
    • हाल में ऐसी ही problem आई थी
      मैंने 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 नहीं है
    • जानना चाहता हूँ कि आप कौन-सा programmable EDID emulator plug इस्तेमाल कर रहे हैं
      हाल में खोजा था, लेकिन यह 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 है, जो पहली जगह मौजूद ही नहीं होना चाहिए

    • यह बात अभी मौजूद ढेरों hardware solutions का वर्णन करने जैसी लगती है
  • जिज्ञासा है कि dummy plug की जरूरत क्यों पड़ती है
    समझ नहीं आता कि ऐसा क्या है जो software से नहीं हो सकता और सिर्फ dummy plug से हो सकता है। यह सवाल मैं इसलिए पूछ रहा हूं क्योंकि मैंने dummy के बिना 18 virtual displays बिना समस्या इस्तेमाल किए हैं

    • एक उदाहरण के तौर पर, PC पर Windows virtual machine से interact करने के लिए मैं Looking Glass नाम का software इस्तेमाल करता हूं
      कंप्यूटर में दो 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 चाहिए
    • यात्रा में रहने वाले व्यक्ति के लिए एक ही screen पर Zoom या Teams call करते हुए भी PowerPoint Presenter View इस्तेमाल करना बहुत आसान हो जाता है
      dummy plug screen को PowerPoint output के रूप में इस्तेमाल करें, और laptop screen को presenter notes के लिए
      फिर dummy plug screen share कर दें
      Hacker News readers के लिए यह सबसे अच्छा जवाब न हो, लेकिन teachers या sales reps के लिए यह वाकई बहुत सरल है
    • कई operating system·GPU·driver combinations arbitrary settings वाला virtual display सच में बनाने नहीं देते
      OBS streaming या Steam, Parsec जैसे game streaming setup के लिए इसकी जरूरत पड़ सकती है
      कुछ साल पहले Linux के Xorg और open source drivers, तथा Windows और Nvidia combination में यह कुछ हद तक संभव था, लेकिन MacOS या Windows+AMD/Intel GPU पर यह उतना अच्छी तरह काम नहीं करता था
    • binary embedded Linux distribution test करते समय इस्तेमाल करता हूं
      operating system को यह दिखाने के लिए धोखा देना कि display connected है, user के वास्तविक deployment environment में मौजूद नहीं होने वाला नया variable जोड़ देता है; dummy plug एक सस्ता hardware solution है
      किसी engineer से echo on > /sys/whatever और उसके आसपास का logic लिखवाने की तुलना में, इसे खरीदकर plug in करना संभवतः ज्यादा cost-effective है
    • ज्यादातर लोगों के लिए dummy plug कहीं ज्यादा आसान है
      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 चल जाएगा

    • मैंने एक बार Acer monitor पर ऐसा किया था
      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 को हटाना था, और वह सफल रहा
    • flash chip में आम तौर पर write enable/disable pin होता है, और ज्यादातर monitors और TVs EDID writing रोकने के लिए wiring करते हैं
      लगता है सिर्फ low-cost products ही इसे छोड़ते होंगे
      protection न हो तो read के दौरान voltage glitch write में बदलकर flash खराब कर सकता है, इसलिए यह जोखिम भरा है
    • लेखक लिखता है कि Pi इस्तेमाल करने की सलाह है, लेकिन यह जरूरी नहीं है
      “अगर आप PC पर यह command आजमाते हैं, तो EDID के बजाय hardware, जैसे RAM module के SPD EEPROM, को गलती से flash कर सकते हैं”
    • अगर सामान्य monitor में stored EDID को इसी तरह modify किया जा सकता है, तो hardware developer के नजरिए से यह अजीब गलती लगती है
      आम तौर पर 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 करता है?

    • हां। VGA/HDMI/DVI का communication वाला हिस्सा, यानी DDC link, मूल रूप से I2C link है, और normal operation के दौरान operating system EDID query करने के लिए इसी तरीके का इस्तेमाल करता है
      जैसा लेख में बताया गया है, RPi में उस HDMI port pin से जुड़ा I2C controller होता है, क्योंकि DDC के जरिए EDID पढ़ना जरूरी है
  • सोच रहा/रही हूँ कि क्या किसी को KVM और Linux की समस्या हल करने के लिए कोई सस्ता DisplayPort EDID emulator पता है
    पिछली बार जब देखा था, तो यह HDMI से इतना ज़्यादा महंगा था कि नया KVM खरीदना ही बेहतर लगता था

    • यहाँ समस्या यह है कि DisplayPort, EDID के लिए I2C bus से जुड़े साधारण EEPROM का इस्तेमाल नहीं करता
      इसके बजाय यह DisplayPort के लिए खास, कहीं ज़्यादा जटिल high-speed AUX bus का उपयोग करता है
      लगता है VESA में शामिल हुए और ढेर सारे NDA पर साइन किए बिना ठीक-ठाक documentation तक मिलना मुश्किल होगा
    • kernel options में EDID को override किया जा सकता है
      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 बदलने के लिए भी इस्तेमाल किया जा सकता है