2 điểm bởi GN⁺ 2025-06-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Giới thiệu cách có thể dễ dàng thay đổi EDID của HDMI dummy plug bằng Raspberry Pi
  • Dummy plug được dùng để khiến thiết bị nhận rằng có màn hình được kết nối dù không có thiết bị xuất hình thực tế
  • Có thể sao chép thông tin EDID giống hệt thiết bị capture 1080p để cấu hình sao cho plug không hiển thị như một màn hình 4K
  • Có thể đọc và ghi EEPROM của plug chỉ với bộ điều khiển I2C của Raspberry Pi và các công cụ Linux tiêu chuẩn
  • Trong toàn bộ quá trình, việc chọn đúng bus I2C và sao lưu là bắt buộc để ngăn ngừa hư hỏng thiết bị

Tổng quan về dummy plug và EDID

  • Dummy plug là một thiết bị dạng dongle nhỏ, khi cắm vào cổng HDMI hoặc DVI thì không xử lý hình ảnh thực tế mà chỉ với mạch tối thiểu sẽ khiến thiết bị phát hiện rằng màn hình đã được kết nối
  • Bên trong có chip EEPROM mô phỏng EDID (Extended Display Identification Data) của màn hình cùng các mạch như điện trở pull-up nối với +5V
  • Nó hữu ích để khiến hệ điều hành (OS) đánh giá rằng có màn hình hiện diện trong các môi trường như máy chủ headless, thiết bị không giám sát trực tiếp, v.v.

Mục tiêu và cách tiếp cận

  • Chia sẻ trải nghiệm muốn thay đổi EDID để HDMI dummy plug hỗ trợ độ phân giải 4K hiện có được nhận diện như một thiết bị 1080p đơn giản
  • Mục tiêu là thay thế EDID bên trong dummy plug để nó giống hệt thông tin EDID của thiết bị capture HDMI (hỗ trợ 1080p)
  • Không chắc EEPROM của dummy plug có cho phép ghi hay không, nhưng đáng để thử
  • Cổng HDMI trên Raspberry Pi Zero được nối với bộ điều khiển I2C, nên việc truy cập khá thuận tiện

Lưu ý an toàn và bắt đầu quy trình

  • Nếu thực hiện quy trình này khi đang kết nối với màn hình thật, các màn hình không có bảo vệ EDID có nguy cơ bị hỏng
  • Chỉ nên thao tác trên các thiết bị như dummy plug, tức là thiết bị mà nếu có hỏng cũng không sao
  • Ngoài ra, bắt buộc phải dùng đúng bus I2C, đồng thời phải đọc trước và xác minh EDID chính xác trước khi ghi

Thiết lập môi trường và chuẩn bị

  • Cài Raspberry Pi OS Lite, sau đó điều chỉnh cấu hình bằng sudo raspi-config
  • Cài công cụ I2C bằng sudo apt install i2c-tools (với Pi Zero cần có mạng; có thể обход bằng bộ chuyển USB-Ethernet hoặc chroot trên thẻ SD)
  • Cần dùng adapter HDMI-to-Mini-HDMI

Nhận diện và sao lưu EEPROM EDID

  • Với Raspberry Pi Zero, sử dụng bus I2C số 2 (các mẫu Pi khác có thể dùng số khác)
  • Dùng lệnh i2cdetect để xác nhận thiết bị được nhận tại địa chỉ 0x50, đây là địa chỉ tiêu chuẩn của EEPROM EDID
  • Điều khá lạ là các địa chỉ 0x51~0x57 cũng phản hồi, cho thấy EDID được lưu theo dạng nhiều bản sao
  • Dùng get-edid để sao lưu EDID gốc của dummy plug, đọc hai lần rồi so sánh để xác minh tính nhất quán
  • Dùng od -v -An -txC để xuất EDID dưới dạng mảng hex, rồi kiểm tra tính hợp lệ bằng edidreader.com

Trích xuất EDID từ thiết bị capture và ghi vào plug

  • Tháo dummy plug ra rồi kết nối thiết bị capture HDMI với Pi
  • Trích xuất EDID của thiết bị capture theo cùng cách, rồi kiểm tra lại tính hợp lệ
  • Kết nối lại dummy plug và ghi EDID của thiết bị capture vào EEPROM
  • Ghi từng byte bằng lệnh i2cset, việc này có thể thực hiện chỉ với các công cụ Linux tiêu chuẩn và bash

Xác minh cuối cùng và kết quả

  • Sau khi hoàn tất, trích xuất lại EDID của dummy plug rồi so sánh bằng diff với tệp gốc để xác nhận nội dung khớp nhau
  • Khi kết nối vào máy tính thử nghiệm, nó không còn được nhận là màn hình 4K ban đầu mà được nhận là thiết bị capture HDMI
  • Việc thay thế EDID của dummy plug đã hoàn tất thành công

Kết luận và gợi ý ứng dụng

  • Với cùng quy trình, cũng có thể biến dummy plug 1080p đời cũ thành thiết bị hỗ trợ 4K
  • Chỉ khuyến nghị thực hiện thao tác ghi I2C trên Raspberry Pi; nếu làm trực tiếp trên PC thông thường có nguy cơ làm hỏng phần cứng
  • Nếu bạn cần chức năng liên quan, quy trình này có thể hữu ích

1 bình luận

 
GN⁺ 2025-06-16
Ý kiến trên Hacker News
  • Xin chia sẻ một mẹo nhỏ cho ai muốn thử ở nhà: các dummy plug giá rẻ đa số chỉ có EEPROM 256 byte, nên không đủ dung lượng để lưu toàn bộ các khối mở rộng EDID cần cho độ phân giải cao và tần số quét cao. Chúng chỉ mô phỏng được tới 1080p60; ví dụ không thể giả lập một màn hình 4k240. Ngoài ra, một số sản phẩm có sẵn đường write-protect đã được nối, nên muốn ghi dữ liệu thì phải can thiệp vật lý như hàn trực tiếp
  • Nhược điểm của các dummy plug này là không xử lý được HDCP. Chúng rất phù hợp để ép máy headless xuất ra độ phân giải mong muốn, nhưng không dùng được để thử nghiệm các dịch vụ streaming yêu cầu HDCP. Có ai biết giải pháp HDMI dummy plug nào có thể đàm phán cả HDCP không? Lúc nào cũng phải dùng TV làm thiết bị thử nghiệm thì khá phiền. Một cách tôi tìm ra là dùng HDMI multiviewer, vì nó đàm phán HDCP riêng cho từng cổng
    • Tôi đang dùng HDMI splitter; nó có thể đặt EDID được lập trình sẵn hoặc học EDID từ màn hình nối vào HDMI output 1, và chỉ cần splitter được cấp nguồn thì nó sẽ hoạt động như thể màn hình vẫn đang được kết nối dù thực tế không có màn hình. Splitter đàm phán HDCP với PC hoặc console trước, rồi chuyển tín hiệu sang phía màn hình thật mà không có HDCP. Xem amazon.com
    • Trên Aliexpress cũng có nhiều quảng cáo bán thiết bị kết thúc HDCP rồi pass-through HDMI, nên cần lưu ý trước khi mua
    • Việc gỡ HDCP không hề dễ; cách làm là hạ xuống HDCP 1.4 rồi nối một thiết bị “compliant” hỗ trợ chuẩn 1.4 để dùng làm dummy monitor. Nếu cần HDCP 1.4 trở lên thì gần như không thể
    • Tôi có một hệ thống nhúng xuất HDMI và muốn thay màn hình khởi động bằng một luồng HDMI khác, kể cả chỉ là ảnh tĩnh cũng được, trong khi tuyệt đối không thể đụng vào phía hệ thống nhúng. Tôi cần một cách rẻ và chắc chắn để chỉ thay tín hiệu HDMI
    • Khuyên bạn thử các HDMI splitter trên Amazon vốn thực chất được quảng cáo như “HDCP stripper”
  • Không biết có nơi nào cung cấp bộ sưu tập file EDID dạng nhị phân, hoặc phần mềm giúp tạo chúng dễ dàng không. Tôi dùng plug giả lập EDID có thể lập trình, nhưng việc tự thiết lập các độ phân giải cụ thể hay tính năng chi tiết (ví dụ độ phân giải 8K có kèm DSC) thì khá khó hoặc không thể. github.com/bsdhw/EDID thiếu dữ liệu của các màn hình đời mới. Tôi cũng từng tự tạo bằng AnalogWay EDID Editor, nhưng quá trình tinh chỉnh như khác biệt nhỏ giữa các mode được hỗ trợ hay mức ưu tiên của chúng không hề dễ
    • Tôi cũng gặp vấn đề tương tự. Tôi mua một soundbar 5.1ch giá rẻ có hỗ trợ tới Dolby TrueHD, nhưng kết nối HDMI chỉ hoạt động với thiết bị hỗ trợ eArc như TV đời mới. Nếu nối PC thì chỉ dùng được SPDIF hoặc aux nên chất lượng âm thanh bị giảm. Thay vì dùng audio extractor/splitter, tôi đang thử chỉnh giá trị edid của PC để soundbar nhận nó như một thiết bị eArc, nhưng có vẻ vẫn chưa có hướng dẫn chặt chẽ nào cho việc này
  • Cũng có thể mua dummy plug có chức năng pass-through, khá hữu ích khi hệ thống cũ gặp vấn đề tương thích với màn hình độ phân giải cao. Ví dụ hệ thống AMD FX8350 năm 2011 của tôi gặp trục trặc khi xuất 4K, nên tôi ép xuống 1080p bằng cách cắm plug inline; sau đó màn hình tự upscale 2x để hiển thị 4K rất gọn gàng
    • Tôi cũng có vài thiết bị pass-through; đúng ra bài viết nên nhắc đến lựa chọn này. Sản phẩm tôi dùng hơi lạ ở chỗ nó có thể đọc và lưu EDID của màn hình, rồi áp dụng đè lên màn hình khác. Một điểm thú vị nữa là nó có thể ép hệ thống luôn coi như màn hình đang được kết nối. Một màn hình của tôi khi tắt nguồn sẽ bị xem như đã rút cáp ảo và gây ra vấn đề, nhưng thiết bị pass-through xử lý hoàn hảo việc này. Sản phẩm tôi dùng là HD-EWB của THWT
  • Thông tin edid được lưu trên màn hình thường hoặc màn hình laptop cũng có thể sửa theo cách này. Nhiều thiết lập của TCON cũng có thể thay đổi bằng cách ghi vào các địa chỉ i2c khác. Thậm chí không cần Raspberry Pi; có thể dùng bất kỳ máy tính nào
    • Tác giả bài viết có khuyên dùng Pi, nhưng không bắt buộc. Tuy nhiên nếu làm y nguyên trên PC thì có thể lỡ tay flash nhầm phần cứng khác thay vì EDID, chẳng hạn SPD EEPROM của mô-đun RAM
    • Chip flash có chân bật/tắt ghi riêng, và phần lớn màn hình hay TV được đi dây để chặn việc ghi edid. Có lẽ chỉ các mẫu giá rẻ mới để mặc như vậy. Nếu không được bảo vệ thì chỉ riêng nhiễu điện áp trong lúc đọc cũng có thể kích hoạt ghi và làm hỏng flash
    • Việc có thể sửa edid trên phần lớn màn hình cho thấy lỗ hổng trong khâu phát triển phần cứng. Thông thường người ta nhận EEPROM đã được lập trình sẵn và không kéo chân ghi lên mức high ngay từ đầu. Việc xuất xưởng với khả năng ghi mở sẵn là thiết kế không phổ biến, nhưng ngoài thực tế đôi khi vẫn có những trường hợp ngoài dự đoán
  • Tôi thắc mắc tại sao lại cần dummy plug? Có điều gì mà phần mềm không giải quyết được sao? Tôi đang dùng 18 màn hình ảo hoàn toàn bằng phần mềm mà không gặp vấn đề gì
    • Một trường hợp là khi tôi dùng phần mềm Looking Glass trên PC để điều khiển máy ảo Windows. Tôi có hai GPU (AMD và NVidia), trong đó NVidia được passthrough cho Windows VM. Looking Glass hiển thị đầu ra của GPU NVidia trong một cửa sổ desktop, nhờ đó tôi có thể dùng chương trình Windows trong VM mà không bị giảm hiệu năng đáng kể (từ Windows 7 trở đi thì gần như không dùng nổi nếu không có tăng tốc GPU). Tuy nhiên GPU NVidia phải thấy có màn hình thật được kết nối thì mới hoạt động. GPU Quadro có thể dump file EDID từ màn hình và giả như luôn được kết nối, nhưng GPU tiêu dùng thông thường thì không có tính năng này. Khi đó dummy plug là lựa chọn duy nhất
    • Tùy tổ hợp OS / GPU / driver mà mức độ tự do khi thiết lập màn hình ảo khác nhau rất nhiều. Để thêm màn hình cho OBS hoặc game streaming qua Steam/Parsec thì dummy plug đơn giản hơn hẳn. Trên Linux + Xorg + driver mã nguồn mở hay Windows + Nvidia thì đôi khi làm được, nhưng với MacOS hoặc Windows + GPU AMD/Intel thì gần như không chạy
    • Tôi mod Chromebook để chạy Windows/Linux, nhưng nếu cổng HDMI không có thiết bị video thì máy thậm chí không boot được. Không có dummy plug thì hoàn toàn bị chặn
    • Dummy plug dễ và tiện hơn rất nhiều cho người dùng phổ thông. Việc thiết lập một màn hình ảo 4K chỉ bằng phần mềm cho mục đích remote game streaming thực tế phức tạp hơn tưởng tượng rất nhiều. Xem trình cấu hình 4k-sunshine
    • Remote desktop trên Raspberry Pi chỉ render desktop khi có màn hình vật lý được kết nối, nên với nghiên cứu sinh thiếu thời gian và ngân sách thì dummy plug là lựa chọn tốt nhất
  • Không biết có bộ giả lập EDID cho DisplayPort nào đủ rẻ và dùng ổn để xử lý vấn đề trong môi trường KVM và Linux không. So với bản HDMI thì giá cao hơn rất nhiều, đến mức thà mua KVM mới còn hơn
    • DisplayPort không đơn giản là dùng EEPROM trên bus I2C, mà dùng bus AUX riêng của DisplayPort, thứ này phức tạp hơn rất nhiều. Cũng khó tìm tài liệu công khai; muốn có tài liệu tham chiếu tử tế thì phải gia nhập VESA và ký NDA
  • Kết quả hex dump của USB ibus2 plug được nối tiếp với EDID