2 คะแนน โดย GN⁺ 2025-06-16 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แนะนำวิธีเปลี่ยน EDID ของ ปลั๊กดัมมี HDMI ได้อย่างง่ายดายด้วย Raspberry Pi
  • ปลั๊กดัมมีใช้เพื่อทำให้อุปกรณ์รับรู้เสมือนว่ามีจอภาพเชื่อมต่ออยู่ ทั้งที่ไม่มีอุปกรณ์แสดงผลจริง
  • สามารถคัดลอก ข้อมูล EDID ให้เหมือนกับของอุปกรณ์แคปเจอร์ 1080p เพื่อไม่ให้ปลั๊กถูกแสดงเป็นจอ 4K
  • สามารถอ่านและเขียน EEPROM ของปลั๊กได้ด้วย I2C controller ของ Raspberry Pi และเครื่องมือ Linux มาตรฐานเท่านั้น
  • ตลอดทุกขั้นตอน จำเป็นต้องเลือก I2C bus ให้ถูกต้องและสำรองข้อมูลไว้ก่อนเสมอเพื่อป้องกันความเสียหายของอุปกรณ์

ภาพรวมของปลั๊กดัมมีและ EDID

  • ปลั๊กดัมมีคืออุปกรณ์ขนาดเล็กแบบดองเกิลที่เมื่อเสียบเข้ากับพอร์ต HDMI หรือ DVI จะไม่มีการประมวลผลภาพจริง แต่ใช้งาน วงจรขั้นต่ำ เพื่อให้อุปกรณ์ตรวจพบว่า มีจอภาพเชื่อมต่ออยู่
  • ภายในมีวงจร เช่น ชิป EEPROM ที่เลียนแบบ EDID (Extended Display Identification Data) ของจอภาพ และตัวต้านทาน pull-up ที่เชื่อมกับ +5V
  • มีประโยชน์สำหรับเซิร์ฟเวอร์แบบ headless, อุปกรณ์ไร้ผู้ดูแล และงานอื่น ๆ ที่ต้องการให้ ระบบปฏิบัติการ (OS) ตัดสินว่ามีจอภาพอยู่

เป้าหมายและแนวทาง

  • ผู้เขียนแชร์ประสบการณ์ที่ต้องการเปลี่ยน EDID ของ ปลั๊กดัมมี HDMI ที่รองรับความละเอียด 4K เดิม ให้ถูกมองเห็นเป็นอุปกรณ์ 1080p แบบธรรมดา
  • เป้าหมายคือแทนที่ EDID ภายในปลั๊กดัมมี ให้ตรงกับข้อมูล EDID ของ อุปกรณ์แคปเจอร์ HDMI ที่รองรับ 1080p
  • แม้จะไม่แน่ใจว่า EEPROM ของปลั๊กดัมมีจะเขียนทับได้หรือไม่ แต่ก็น่าลอง
  • พอร์ต HDMI ของ Raspberry Pi Zero เชื่อมต่อกับ I2C controller จึงเข้าถึงได้ง่าย

ข้อควรระวังด้านความปลอดภัยและการเริ่มขั้นตอน

  • หากทำขั้นตอนนี้ขณะมีจอภาพจริงเชื่อมต่ออยู่ จอที่ไม่มี การป้องกัน EDID อาจมีความเสี่ยงเสียหาย
  • ควรทำกับอุปกรณ์อย่าง ปลั๊กดัมมี เท่านั้น ซึ่งหากเสียหายก็ยังยอมรับได้
  • นอกจากนี้ ต้องใช้ I2C bus ให้ถูกต้อง และก่อนเขียนข้อมูลต้องอ่านและตรวจสอบ EDID ล่วงหน้าให้แน่ใจเสมอ

การตั้งค่าสภาพแวดล้อมและการเตรียมงาน

  • ติดตั้ง Raspberry Pi OS Lite แล้วปรับค่าด้วย sudo raspi-config
  • ติดตั้งเครื่องมือ I2C ด้วย sudo apt install i2c-tools (สำหรับ Pi Zero ต้องมีเครือข่าย ซึ่งอาจใช้ USB-Ethernet adapter หรือเลี่ยงด้วย chroot บน SD card ได้)
  • จำเป็นต้องใช้อะแดปเตอร์ HDMI-to-Mini-HDMI

การตรวจพบ EEPROM ของ EDID และการสำรองข้อมูล

  • ในกรณีของ Raspberry Pi Zero จะใช้ I2C bus 2 (Pi รุ่นอื่นอาจใช้หมายเลขต่างกัน)
  • ใช้คำสั่ง i2cdetect เพื่อตรวจว่าพบอุปกรณ์ที่ ที่อยู่ 0x50 ซึ่งเป็นที่อยู่มาตรฐานของ EDID EEPROM
  • ที่น่าสนใจคือมีการตอบสนองที่ที่อยู่ 0x51~0x57 ด้วย ทำให้ดูเหมือนมีการเก็บ EDID ไว้หลายชุด
  • ใช้ get-edid เพื่อ สำรอง EDID ต้นฉบับ ของปลั๊กดัมมี โดยอ่านสองครั้งแล้วเทียบความตรงกัน
  • ใช้ od -v -An -txC เพื่อแสดง EDID ในรูปแบบเลขฐานสิบหก และตรวจสอบความถูกต้องด้วย edidreader.com

การดึง EDID ของอุปกรณ์แคปเจอร์และเขียนลงปลั๊ก

  • ถอดปลั๊กดัมมีออก แล้วเชื่อมต่อ อุปกรณ์แคปเจอร์ HDMI เข้ากับ Pi
  • ดึง EDID ของอุปกรณ์แคปเจอร์ด้วยวิธีเดียวกัน และตรวจสอบความถูกต้องอีกครั้ง
  • จากนั้นเสียบปลั๊กดัมมีกลับเข้าไป แล้ว เขียน EDID ของอุปกรณ์แคปเจอร์ลงใน EEPROM
  • เขียนข้อมูลด้วยคำสั่ง i2cset ทีละไบต์ ซึ่งทำได้ด้วยเครื่องมือ Linux มาตรฐานและ bash เท่านั้น

การตรวจสอบขั้นสุดท้ายและผลลัพธ์

  • เมื่อทำเสร็จแล้ว ให้ดึง EDID ของปลั๊กดัมมีออกมาอีกครั้ง แล้วใช้ diff เทียบกับไฟล์ต้นฉบับ เพื่อยืนยันว่าเนื้อหาตรงกัน
  • เมื่อนำไปเชื่อมต่อกับคอมพิวเตอร์ทดสอบ ระบบจะมองเห็นเป็น อุปกรณ์แคปเจอร์ HDMI แทนที่จะเป็นจอ 4K เดิม
  • สรุปคือสามารถแทนที่ EDID ของปลั๊กดัมมีได้สำเร็จ

ปิดท้ายและคำแนะนำการใช้งาน

  • ใช้ขั้นตอนเดียวกันนี้เพื่อเปลี่ยน ปลั๊กดัมมี 1080p รุ่นเก่าให้เป็นอุปกรณ์ที่รองรับ 4K ก็ได้
  • แนะนำให้ทำการเขียนผ่าน I2C บน Raspberry Pi เท่านั้น เพราะการทำโดยตรงจากพีซีทั่วไปอาจเสี่ยงทำให้ฮาร์ดแวร์เสียหาย
  • หากต้องการความสามารถลักษณะนี้ ขั้นตอนนี้ก็น่าจะเป็นประโยชน์

1 ความคิดเห็น

 
GN⁺ 2025-06-16
ความคิดเห็นจาก Hacker News
  • อยากแชร์ทิปเล็ก ๆ สำหรับคนที่อยากลองทำที่บ้าน: dummy plug ราคาถูกส่วนใหญ่มักมี EEPROM แค่ 256 ไบต์ จึงมีพื้นที่ไม่พอสำหรับเก็บ EDID extension block ทั้งหมดที่ต้องใช้กับความละเอียดสูงและรีเฟรชเรตสูง ทำให้จำลองได้แค่ 1080p60 เท่านั้น เช่น ไม่สามารถปลอมตัวเป็นจอ 4k240 ได้ และบางรุ่นมีการต่อสาย write-protect ไว้แล้ว จึงต้องลงมือแก้ทางกายภาพเอง เช่น บัดกรี ก่อนถึงจะเขียนข้อมูลได้
  • ข้อเสียของ dummy plug พวกนี้คือไม่รองรับ HDCP ใช้บังคับให้เครื่องแบบ headless ส่งภาพออกที่ความละเอียดที่ต้องการได้ดีมาก แต่ใช้ทดสอบบริการสตรีมมิงที่ต้องการ HDCP ไม่ได้ มีใครรู้จักโซลูชัน HDMI dummy plug ที่ต่อรอง HDCP ได้ด้วยไหม? การต้องใช้ทีวีเป็นอุปกรณ์ทดสอบทุกครั้งมันยุ่งยากมาก วิธีหนึ่งที่ฉันเจอคือ HDMI multiviewer ซึ่งจะต่อรอง HDCP แยกกันในแต่ละพอร์ต
    • ฉันใช้ HDMI splitter อยู่ สามารถตั้งค่า EDID ที่โปรแกรมไว้ล่วงหน้า หรือเรียนรู้ EDID จากจอที่ต่ออยู่กับ HDMI output 1 ได้ และตราบใดที่ splitter ยังมีไฟเลี้ยงอยู่ มันก็จะทำงานเหมือนมีจอเชื่อมต่ออยู่แม้ไม่ได้เสียบจอจริง ตัว splitter จะต่อรอง HDCP กับ PC หรือคอนโซลก่อน แล้วส่งสัญญาณต่อไปยังจอจริงโดยไม่มี HDCP ดู amazon.com
    • ใน Aliexpress ก็มีโฆษณาขายอุปกรณ์ที่ terminate HDCP แล้วทำ HDMI passthrough อยู่เยอะเหมือนกัน ควรระวังก่อนซื้อ
    • การถอด HDCP ไม่ใช่เรื่องง่าย วิธีคือบังคับ downgrade ไปเป็น HDCP 1.4 แล้วต่ออุปกรณ์ ‘compliant’ ที่รองรับสเปก 1.4 ให้ทำหน้าที่เป็น dummy monitor ถ้าต้องใช้ HDCP 1.4 ขึ้นไปก็แทบเป็นไปไม่ได้
    • ฉันมีระบบ embedded ที่มี HDMI output และอยากเปลี่ยนหน้าบูตให้เป็น HDMI stream อื่นแทน (จะเป็นภาพนิ่งก็ได้) โดยฝั่ง embedded system ห้ามแตะต้องเด็ดขาด เลยต้องการวิธีสลับเฉพาะสัญญาณ HDMI ที่ราคาถูกและทนทาน
    • แนะนำให้ลองใช้ HDMI splitter จาก Amazon ที่โฆษณากันแบบกลาย ๆ ว่าเป็น “HDCP stripper”
  • อยากรู้ว่ามีที่ไหนรวบรวมไฟล์ EDID แบบไบนารี หรือมีโปรแกรมที่ทำได้สะดวกบ้างไหม ฉันใช้ programmable EDID emulator plug อยู่ แต่การตั้งค่าความละเอียดเฉพาะหรือฟีเจอร์ย่อยต่าง ๆ เอง (เช่น ความละเอียด 8K ที่มี DSC) ทำได้ยากหรือแทบเป็นไปไม่ได้ github.com/bsdhw/EDID ก็ยังมีข้อมูลจอรุ่นใหม่ไม่มากพอ ฉันเคยลองทำเองด้วย AnalogWay EDID Editor แต่ขั้นตอนตั้งค่าละเอียด ๆ อย่างความต่างเล็กน้อยของโหมดที่รองรับหรือการจัดลำดับความสำคัญนั้นไม่ง่ายเลย
    • เคยเจอปัญหาคล้ายกัน ฉันซื้อ soundbar 5.1ch ราคาถูกที่รองรับถึง Dolby TrueHD แต่ HDMI ใช้งานได้เฉพาะกับอุปกรณ์ที่รองรับ eArc (ทีวีรุ่นใหม่) ถ้าต่อกับ PC ก็ต้องใช้แค่ SPIDF หรือ aux ทำให้คุณภาพเสียงลดลง ตอนนี้เลยกำลังลองหาวิธีแก้ค่า edid ของ PC ให้ soundbar มองว่าเป็นอุปกรณ์ eArc แทนการใช้ audio extractor/splitter ดูเหมือนว่ายังไม่มีแนวทางที่ชัดเจนนัก
  • สามารถซื้อ dummy plug ที่มีฟังก์ชัน passthrough ได้ด้วย มีประโยชน์เมื่อระบบเก่ามีปัญหาความเข้ากันได้กับจอความละเอียดสูง เช่น ระบบ AMD FX8350 ปี 2011 ของฉันมีปัญหากับการแสดงผล 4K เลยเสียบปลั๊กแบบ in-line เพื่อบังคับให้เป็น 1080p แล้วจอก็อัปสเกล 2x อัตโนมัติ ทำให้แสดงผล 4K ได้คมชัด
    • ฉันก็มีอุปกรณ์ passthrough อยู่หลายตัวเหมือนกัน ควรจะพูดถึงตัวเลือกนี้ในโพสต์ด้วย ของฉันค่อนข้างแปลกตรงที่มันอ่านและบันทึก EDID ของจอไว้ แล้วเอาไป override ใช้กับจออีกตัวได้ อีกอย่างที่น่าสนใจคือมันบังคับให้ระบบมองว่าจอเชื่อมต่ออยู่ตลอดเวลาได้ จอตัวหนึ่งของฉันพอปิดเครื่องแล้วจะเหมือนถูกถอดปลั๊กเสมือน ทำให้เกิดปัญหา แต่อุปกรณ์ passthrough แก้ได้สมบูรณ์ รุ่นที่ฉันใช้คือ HD-EWB ของ THWT
  • ข้อมูล edid ที่เก็บอยู่ในจอทั่วไปหรือหน้าจอโน้ตบุ๊กก็แก้ด้วยวิธีนี้ได้เหมือนกัน ค่าตั้งหลายอย่างของ TCON ก็เปลี่ยนได้ด้วยการเขียนไปยังที่อยู่ i2c อื่น ๆ ไม่จำเป็นต้องใช้ Raspberry Pi ด้วย ใช้คอมพิวเตอร์อะไรก็ได้
    • ผู้เขียนแนะนำ Pi ก็จริง แต่ไม่จำเป็น ถ้าทำตามบน PC ตรง ๆ ก็อาจเผลอแฟลชฮาร์ดแวร์อื่นที่ไม่ใช่ EDID ได้ เช่น SPD EEPROM ของแรม
    • ชิปแฟลชจะมีขาเปิด/ปิดการเขียนแยกต่างหาก และจอหรือทีวีส่วนใหญ่จะเดินสายให้บล็อกการเขียน edid ไว้ คาดว่ามีแต่รุ่นราคาถูกที่ปล่อยไว้เฉย ๆ ถ้าไม่ป้องกัน แม้แต่ noise ของแรงดันไฟระหว่างการอ่านก็อาจทำให้เกิดการเขียนขึ้นมาโดยไม่ได้ตั้งใจจนแฟลชพังได้
    • การที่จอส่วนใหญ่แก้ edid ได้ หมายถึงมีจุดอ่อนในฝั่งผู้พัฒนาฮาร์ดแวร์ โดยปกติจะรับ EEPROM ที่โปรแกรมมาแล้วและไม่ปล่อยขาเขียนไว้เป็น high ตั้งแต่แรก การส่งสินค้าที่เขียนได้ออกมาจึงไม่ใช่การออกแบบที่พบได้บ่อย แต่ในภาคสนามจริงก็มีกรณีนอกเหนือคาดเกิดขึ้นอยู่บ่อย
  • สงสัยว่าทำไมถึงต้องใช้ dummy plug? มีอะไรที่ซอฟต์แวร์แก้ไม่ได้หรือเปล่า เพราะฉันใช้ virtual display 18 จอผ่านซอฟต์แวร์ได้ไม่มีปัญหาเลย
    • กรณีหนึ่งคือฉันใช้ซอฟต์แวร์ Looking Glass บน PC เพื่อใช้งาน Windows virtual machine มี GPU สองตัว (AMD และ NVidia) โดยส่งผ่าน NVidia ให้กับ Windows VM แล้วใช้ Looking Glass แสดงผลของ GPU NVidia เป็นหน้าต่างบนเดสก์ท็อป ทำให้ใช้โปรแกรม Windows ใน VM ได้โดยไม่เสียประสิทธิภาพ (ตั้งแต่ Windows 7 เป็นต้นมา ถ้าไม่มี GPU acceleration ก็ใช้งานลำบากมาก) แต่ GPU ของ NVidia ต้องมีจอจริงเชื่อมต่ออยู่จึงจะทำงานได้ GPU ตระกูล Quadro สามารถ dump ไฟล์ EDID ของจอแล้วทำให้เหมือนเชื่อมต่ออยู่ตลอดได้ แต่ GPU สำหรับผู้บริโภคทั่วไปไม่มีฟังก์ชันนี้ ในกรณีนั้น dummy plug คือทางเลือกเดียว
    • ความยืดหยุ่นในการตั้งค่า virtual display แตกต่างกันมากตามชุด OS / GPU / ไดรเวอร์ ถ้าจะเพิ่มจอสำหรับ OBS หรือสตรีมเกมผ่าน Steam/Parsec การใช้ dummy plug ง่ายกว่ามาก บางครั้ง Linux+Xorg+ไดรเวอร์โอเพนซอร์ส หรือ Windows+Nvidia ทำได้ แต่บน MacOS หรือ Windows+AMD/Intel GPU แทบใช้ไม่ได้เลย
    • ฉันดัดแปลง Chromebook ให้รัน Windows/Linux และถ้าไม่มีอุปกรณ์วิดีโออยู่ที่พอร์ต HDMI มันจะไม่บูตเลย ถ้าไม่มี dummy plug ก็ไปต่อไม่ได้
    • dummy plug ง่ายและสะดวกกว่าสำหรับคนทั่วไปมาก การตั้งค่า virtual monitor 4K ด้วยซอฟต์แวร์อย่างเดียวเพื่อสตรีมเกมระยะไกลนั้นซับซ้อนอย่างไม่น่าเชื่อ ดู ตัวตั้งค่า 4k-sunshine
    • สำหรับ remote desktop บน Raspberry Pi จำเป็นต้องมีจอจริงเชื่อมต่ออยู่จึงจะเรนเดอร์เดสก์ท็อปได้ สำหรับนักศึกษาปริญญาโท/เอกที่มีทั้งงบและเวลาจำกัด dummy plug คือคำตอบที่ดีที่สุด
  • สงสัยว่ามี DisplayPort EDID emulator ราคาย่อมเยาที่ใช้แก้ปัญหาในสภาพแวดล้อม KVM และ Linux ได้ไหม เพราะเมื่อเทียบกับ HDMI แล้วแพงกว่ามาก จนระดับที่ซื้อ KVM ใหม่อาจคุ้มกว่า
    • DisplayPort ไม่ได้ใช้แค่ EEPROM บนบัส I2C แบบตรง ๆ แต่ใช้ AUX bus เฉพาะของ DisplayPort ซึ่งมีโครงสร้างซับซ้อนกว่ามาก เอกสารสาธารณะก็หาได้ยาก และถ้าจะเอา reference ที่ใช้ได้จริงต้องสมัครสมาชิก VESA และเซ็น NDA
  • ผล hex dump ของ USB ibus2 plug ต่อเนื่องกับ EDID อยู่