How to Reflash a Monitor with corrupted EDID

Could be a (monitor) Life Saver
I do wish to share a useful program by author Mark Blakeney at GitHub.com which saved a 'faulty' monitor of mine from going to the scrap heap..
This program (edid-rw) allows you to 're-flash' the EDID chip inside a monitor to correct settings so that modern operating systems can boot it to native resolution.
The program runs on linux Ubuntu/Debian and probably any of it's derivatives or live CDs.
A word of warning: You should only use this process as a ' last resort '. It could be that your monitor's problem is not EDID related at all. Flashing wrong data could also corrupt an EDID.

What is an EDID ?
Most consumer monitors these days carry inside an EEPROM chip called the EDID. It contains the name and specifications of the monitor's technical data including it's capabilities. Using a special Display Data Channel (DDC) in the monitor cable, the PC communicates with the monitor to get it's info.
The EDID can be re-written using special software.

Why on Earth Would I Want to do That ?
Unlike earlier versions of Linux, modern distros are increasingly relying on 'Auto-Detection' of hardware, and that includes monitors.
This means the OS will 'ask' the monitor, what it is capable of. In the old days, before this type of auto-detection, the user would just pre-config these settings manually into config files.
If the boot process does not detect the monitor correctly, you could end up with the following symptoms.
Unable to achieve a higher resolution supported.
Incorrectly detecting a resolution that does not exist.
Unable to detect the monitor at all.
Tip: This also means that it's better to have your monitor 'on' before booting, otherwise the OS would default to a lower resolution.
These symptoms could be because of incorrect settings on the PC side, or it could also be because the EDID data in the monitor has been corrupted.
So what? There's nothing wrong with my monitor.
No, I'm not saying there is. But EDID chips can go corrupt.
The chip is sensitive to electric shocks. Just the act of unplugging a cable without switching off the monitor might cause this. Ok it's unusual but it does happen, and there's scant solutions on the internet to fix it.
Ok, What's the solution ?
On Windows, there's the 'Phoenix'solution by Phoenix EDID Designer from Raylar Design, Inc. Since I don't use windows anymore, I don't know if this works or not, try Google for more info. It looks simple enough, good luck. There are also other programs made by monitor manufacturers themselves that run on Windows, but they are hard to find.
Instead I'm going to show you how it can be done in Linux Lubuntu, which would probably work for any other Ubuntu derivative. You can even use a bootable linux live CD and install the software temporarily, if you wish, it works just the same.
edid-rw
edid-rw is a python script from Mark Blakeney at GitHub.
It reads and writes EDID data on the i2c channel between the PC and monitor.
The EDID is basically a 128 byte block. edid-rw alone is not enough to read and write to this block, you also need some supporting software.
Instructions
I assume you know how to open a terminal and execute commands as root.
1. Install Software
First download the edid-rw python script from GitHub
https://github.com/bulletmark/edid-rw
Then install the support software;
apt-get install python-smbus
apt-get install edid-decode
apt-get install ghex
edid-decode displays the raw EDID as readable text.
ghex is a hex code editor.
Also, make edid-rw excutable: i.e chmod 755 edid-rw
(To see the help text : ./edid-rw -h )
2. Display EDID info
To see the current EDID info from the monitor you must specify an i2c device number. This example uses 3, but you must experiment yourself find which is the your monitor i2c device number. I suggest you start from 0 and work you way up. An incorrect device# will give a program traceback and IO error.
Get the EDID data block and pipe it into a decoder to readable form;
./edid-rw 3 | edid-decode
If there are any errors, edid-decode will indicate so, it will also validate and display the last-byte checksum.
3. Modify the EDID
First get the raw block and save it to a file;
./edid-rw 3 > edid.bin
(You can also check the file using edid-decode; i.e cat edid.bin | edid-decode )
Edit the block using ghex;
ghex edid.bin
( It will help to set Ghex preferences with cursor offset as decimal. )
The complete EDID data block specification can be found on Wikipedia.
At this point only You will know how bad the block has been corrupted. If you are lucky you will be able to find a duplicate block on the web from somebody who has exactly the same monitor as you. If not, you will have to repair it byte by byte using the spec.
Often, it's just the case of a corrupted checksum (last byte of the file). The suggested checksum is always displayed by edid-decode, you can try using that. Another important part are bytes 38-39, this gives info of the first standard supported mode, e.g 1280x1024 @ 60Hz.
After editing your modifications, save it as edid-new.bin.
Run edid-new.bin through edid-decode to get the new checksum.
cat edid-new.bin | edid-decode
Edit again with ghex to poke in the new checksum.
ghex edid-new.bin
and save the file.
4. Burn in the new EDID
./edid-rw -w 3 < edid-new.bin
Be sure to use the same i2c device number.
Good Luck !
Hopefully, you can now reboot to your desired resolution.
Tip: I have found that you can still get the monitor to work even if edid-decode says "block does not conform" or "Bad year of manufacture".
That's all for now !
More from the author_
Comments
Gracias salvo mi monitor
First of all, thank you so much for taking the time to publish this. That is an amazing process (which fixed my monitor after hours of searching).
Hey, my old monitor has had this problem who knows since when and it turned a little catastrophic when KMS deprecated xorg.conf in Ubuntu about 2 years ago (I guess), polluting my logs and dmesg, and I've been just adding the xrandr lines to a script in order to have it working at full resolution, but that was dirty and machine-dependant.
It's not been easy to get python-smbus under openSUSE, but a rpm from mageia did the trick :D
My EDID looked rather OK, so I just changed the last byte and that was it, problem solved!
Thank you very much for taking your time to write this guide!
This is also very handy if you have one of the infamous "WP enabled" panels which gets wrecked after a Windows 10 "upgrade".
I've also found that laptop panels are also sometimes affected by this, typically manufacturers lock them to a specific make and model as well so changing out a panel with a slightly different version will sometimes cause a black screen/no backlight symptom.
My Viewsonic VX2025WM is working again. The EDID was all corrupted. Got a clean EDID from there http://www.komeil.com/blog/fix-edid-monitor-no-sig... changed serial/mfg date and uploaded it.
Thank you !
I have a monitor with a corrupt checksum. I get to the end of your directions and try to write and I get an IO error. I know this is an old post, but do you have any idea why it would be giving an IO error?


6