Skip to content

Instantly share code, notes, and snippets.

@mauricerkelly
Forked from adaugherity/patch-edid.rb
Last active June 3, 2019 17:17
Show Gist options
  • Save mauricerkelly/d7d3a0ca3049e9f24415 to your computer and use it in GitHub Desktop.
Save mauricerkelly/d7d3a0ca3049e9f24415 to your computer and use it in GitHub Desktop.

This Gist contains the script and generated output file for an Acer B276HUL.

The pre-generated file below is known to work with:

  • OS X Mavericks
  • OS X Yosemite
  • OS X El Capitan

For El Capitan:

  1. Restart your Mac while holding Command-R: this puts your Mac into Recovery Mode.

  2. When in Recovery Mode, select Utilities > Terminal from the menu bar.

  3. In the Terminal type csrutil disable: this disables System Integrity Protection

  4. Restart your Mac and log in.

  5. Issue the following instructions:

    sudo mkdir /System/Library/Displays/Contents/Resources/Overrides/DisplayVendorID-472
    sudo cp DisplayProductID-361 /System/Library/Displays/Contents/Resources/Overrides/DisplayVendorID-472
  6. Restart your Mac while holding Command-R for Recovery Mode

  7. When in Recovery Mode, select Utilities > Terminal from the menu bar.

  8. In the Terminal type csrutil enable: this reenables System Integrity Protection

  9. Restart your Mac

For Yosemite and Mavericks:

  1. Issue the following instructions:

    sudo mkdir /System/Library/Displays/Overrides/DisplayVendorID-472
    sudo cp DisplayProductID-361 /System/Library/Displays/Overrides/DisplayVendorID-472
<?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">
<dict>
<key>DisplayProductName</key>
<string>Acer B276HUL - forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>AP///////wAEcmEDs0xgMhoXAQS1PCJ4Ikt1p1ZLoyUKUFS9SwDRANHAgYCV
D5UAswCBwKlAVl4AoKCgKVAwIDUAVVAhAAAeAAAA/QAXTA9jFgEKICAgICAg
AAAA/wBMWjJFRTAwMTQyMDAKAAAA/ABBY2VyIEIyNzZIVUwKAGM=
</data>
<key>DisplayVendorID</key>
<integer>1138</integer>
<key>DisplayProductID</key>
<integer>865</integer>
</dict>
</plist>
#!/usr/bin/ruby
# Create display override file to force Mac OS X to use RGB mode for Display
# see http://embdev.net/topic/284710
require 'base64'
data=`ioreg -l -d0 -w 0 -r -c AppleDisplay`
edids=data.scan(/IODisplayEDID.*?<([a-z0-9]+)>/i).flatten
vendorids=data.scan(/DisplayVendorID.*?([0-9]+)/i).flatten
productids=data.scan(/DisplayProductID.*?([0-9]+)/i).flatten
displays = []
edids.each_with_index do |edid, i|
disp = { "edid_hex"=>edid, "vendorid"=>vendorids[i].to_i, "productid"=>productids[i].to_i }
displays.push(disp)
end
# Process all displays
if displays.length > 1
puts "Found %d displays! You should only install the override file for the one which" % displays.length
puts "is giving you problems.","\n"
end
displays.each do |disp|
# Retrieve monitor model from EDID data
monitor_name=[disp["edid_hex"].match(/000000fc00(.*?)0a/){|m|m[1]}.to_s].pack("H*")
if monitor_name.empty?
monitor_name = "Display"
end
puts "found display '#{monitor_name}': vendorid #{disp["vendorid"]}, productid #{disp["productid"]}, EDID:\n#{disp["edid_hex"]}"
bytes=disp["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" % disp["vendorid"]) rescue nil
f = File.open("DisplayVendorID-%x/DisplayProductID-%x" % [disp["vendorid"], disp["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>#{monitor_name} - forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>#{Base64.encode64(bytes.pack('C*'))}</data>
<key>DisplayVendorID</key>
<integer>#{disp["vendorid"]}</integer>
<key>DisplayProductID</key>
<integer>#{disp["productid"]}</integer>
</dict>
</plist>"
f.close
puts "\n"
end # displays.each
@gchaturvedi
Copy link

gchaturvedi commented Sep 30, 2016

I'm on macOS Sierra..everything seems larger for me though..can it not support the 2560x1440 resolution?

@johnmjoyce
Copy link

How do I create the same thing for a different monitor? I'm using an HP Pavilion 27XW.

Thanks,

  • John

@matt3036
Copy link

matt3036 commented Nov 14, 2016

Hi,
nice work since it's suitable also for Sierra!
I would also be interested in how to use this for another monitor (I have an Asus VX279Q).
Also is there an explanation how these overrides work and why there is an executable I only have to copy paste and not execute?
And how would I revert the change?

Regards,
Matt

@matt3036
Copy link

Hi,
I found out how to use this for every other monitor:

  1. right-click open URL(!) and download script: http://embdev.net/topic/284710#3027030
  2. run in terminal: ruby patch-edid.rb
    Important: ONLY the targeted (external) monitor should be connect (maybe even internal display has to be deactivated)!
  3. Copy/Merge generated Folder into /System/Library/Displays/Contents/Resources/Overrides/
  4. Reboot

Regards,
Matt

@nodupe
Copy link

nodupe commented Sep 7, 2017

I've just like to thank you. My ASUS monitor suddenly became usable in Mac OS X!

@dberzano
Copy link

Thank you. You saved my day. For the record, I have an Acer B276HUL (like yours) and El Capitan instructions work with High Sierra too.

@jpage4500
Copy link

Much appreciated! Every time I upgrade my Mac I realize that I need to run this again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment