Skip to content

Instantly share code, notes, and snippets.

@tourdefran
Forked from ejdyksen/patch-edid.md
Created November 10, 2020 17:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tourdefran/f6c64b3ab3d87db8e2f56791933567a1 to your computer and use it in GitHub Desktop.
Save tourdefran/f6c64b3ab3d87db8e2f56791933567a1 to your computer and use it in GitHub Desktop.
A script to fix EDID problems on external monitors in Mac OS.Source:http://embdev.net/topic/284710

patch-edid.rb

A script to fix EDID problems on external monitors in Mac OS.

Additional reading

Instructions

⚠️ This requires disabling SIP, so run this at your own risk. Be sure to re-enable SIP at the end.

  1. Disable System Integrity Protection while in Recovery Mode. Reboot back into macOS when done.

    csrutil disable
    
  2. For macOS Catalina and newer (which uses a read-only system volume), mount the system drive read/write (yes, this is in addition to disabling SIP)

    sudo mount -uw /
    
  3. Connect only the problem monitor

  4. Download this script in the directory containing all the display override plist files (note: even with the steps above, this command requires sudo to run):

    cd /System/Library/Displays/Contents/Resources/Overrides
    sudo curl -O https://gist.githubusercontent.com/ejdyksen/8302862/raw/patch-edid.rb
    

    You may also want to use adaugherity's version of the script:

    cd /System/Library/Displays/Contents/Resources/Overrides
    sudo curl -O https://gist.githubusercontent.com/adaugherity/7435890/raw/patch-edid.rb
    
  5. Run the script we just downloaded (as root again). This creates a new display override plist.

    sudo ruby patch-edid.rb
    
  6. Reboot into recovery mode to re-enable SIP.

    csrutil enable
    
#!/usr/bin/ruby
# Create display override file to force Mac OS X to use RGB mode for Display
# see http://embdev.net/topic/284710
#
# Update 2013-06-24: added -w0 option to prevent truncated lines
require 'base64'
data=`ioreg -l -w0 -d0 -r -c AppleDisplay`
edid_hex=data.match(/IODisplayEDID.*?<([a-z0-9]+)>/i)[1]
vendorid=data.match(/DisplayVendorID.*?([0-9]+)/i)[1].to_i
productid=data.match(/DisplayProductID.*?([0-9]+)/i)[1].to_i
puts "found display: vendorid #{vendorid}, productid #{productid}, EDID:\n#{edid_hex}"
bytes=edid_hex.scan(/../).map{|x|Integer("0x#{x}")}.flatten
puts "Setting color support to RGB 4:4:4 only"
bytes[24] &= ~(0b11000)
puts "Number of extension blocks: #{bytes[126]}"
puts "removing extension block"
bytes = bytes[0..127]
bytes[126] = 0
bytes[127] = (0x100-(bytes[0..126].reduce(:+) % 256)) % 256
puts
puts "Recalculated checksum: 0x%x" % bytes[127]
puts "new EDID:\n#{bytes.map{|b|"%02X"%b}.join}"
Dir.mkdir("DisplayVendorID-%x" % vendorid) rescue nil
f = File.open("DisplayVendorID-%x/DisplayProductID-%x" % [vendorid, productid], 'w')
f.write '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">'
f.write "
<dict>
<key>DisplayProductName</key>
<string>Display with forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>#{Base64.encode64(bytes.pack('C*'))}</data>
<key>DisplayVendorID</key>
<integer>#{vendorid}</integer>
<key>DisplayProductID</key>
<integer>#{productid}</integer>
</dict>
</plist>"
f.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment