Oh, no! It’s the monitor with the missing DVI EDID (Extended Display Indentification Data) again!
After testing new kernels, installing the latest Linux distributions, updating video drivers, reconfiguring video settings, testing different video hardware, testing different motherboards, and then swapping it all back again, the problematic monitor would only display in 1024×768 or 640×480 when connected through its DVI port.
This problem was encountered and resolved before as described in this article. The monitor simply does not send its EDID information when connected via its DVI port. The VGA and HDMI ports function properly, but not the DVI port. This behavior is consistent in every Linux distribution tried as well as Windows XP and Windows 7.
However, once the problem was identified, it was easily remedied in Linux, but not in Windows.
EDID software, such as Phoenix EDID Designer, PowerStrip [http://www.entechtaiwan.com/util/ps.shtm], and read-edid [http://polypux.org/projects/read-edid/], could not read the EDID information from the DVI port even though they could read the VGA and HDMI information fine.
Adding Modelines into xorg.conf or forcing modes with xrandr would switch to 1920×1080, but the picture was distorted — as if pixels ware squashed together. This is an indication of incorrect monitor timings.
Modelines can be generated using cvt and gtf. Modelines produced by these programs worked fine in the past, but this time, they no longer worked. The timings were off.
After much trial and error, the solution was to use the read-edid utility (consists of get-edid and parse-edid) on a different good monitor of the same model.
IMPORTANT: Connect the monitor through its DVI port so get-edid will read the DVI EDID information instead of the VGA or HDMI EDID information.
Install read-edid from the repositories.
sudo apt-get install read-edid
Use get-edid to grab the EDID block from the monitor and use parse-edid to view the binary data as text.
sudo get-edid | parse-edid
Or, save the EDID information to a 128-byte binary file and then redirect that file into parse-edid.
sudo get-edid > edid-bin
The edid.bin file must be exactly 128 bytes.
Then, to read the edid.bin file,
parse-edid < edid.bin
Either way, the EDID file will be parsed into readable text and displayed in the terminal. The problematic monitor supports all of the modes that the good monitor does. The difference is that the computer has no way of knowing what modes to use because the problematic monitor does not send its EDID data when connected through its DVI port.
What we want to do is duplicate the timings of the good monitor and force Linux to use them with the problem monitor. We use parse-edid to get these timings.
After running parse-edid on the EDID information from the good monitor, we will see the needed DVI timings near the bottom of the text. It looks like this:
Mode "1920x1080" # vfreq 60.000Hz, hfreq 67.500kHz DotClock 148.500000 HTimings 1920 2008 2052 2200 VTimings 1080 1084 1089 1125 Flags "+HSync" "+VSync" EndMode
From this, we create a ModeLine.
Modeline "1920x1080" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync
The timings shown here are different from those generated by cvt and gtf.
cvt: Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync gft: Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
This is why the 1920×1080 picture was distorted. The timings produced by cvt and gtf were incorrect. Let’s make these changes permanent so they will always be available to the system.
Open xorg.conf. If xorg.conf, does not exist, this will create an empty file.
sudo gedit /etc/X11/xorg.conf
As described in the other EDID article, we need to create a section that contains the 1920×1080 information for the DVI port. Add the modeline in this section.
Section "Monitor" Identifier "DVI-0" DisplaySize 1920 1080 Option "DPMS" "true" Modeline "1920x1080" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync EndSection
Save. Restart X with CTRL+ALT+Backspace or reboot the computer. Even though the username/password font is extremely tiny at the login screen, Linux Mint 16 now runs at a sharp 1920×1080.
If the computer does not default to 1920×1080, go to Menu > Preferences > Displays to change the resolution. The new 1920×1080 resolution should appear in the dropdown box. Click Apply to change the display settings.
It is still a mystery as to why this occurred since it is the same monitor as before with the same missing EDID information from its DVI port. Somehow, the monitor no longer wanted to use the timings that were working well in the past.
What About Windows 7?
Windows 7 was a recalcitrant troglodyte. I wrestled for hours and hours trying to make Windows 7 recognize the faulty monitor through its DVI port or at least display at 1920×1080 by forcing the resolution like I could with Linux.
No good. PowerStrip refused to force the resolution. I tried many things:
- tinkering with the registry
- copying EDID blocks from a good monitor
- forcing Windows 7 to use a known good EDID block
- editing EDID blocks
- trying different DVI ports on the graphics adapter
- trying every possible combination of display settings possible
- using .inf files
- trying various monitor drivers
- reinstalling video drivers
All to no avail. Nothing worked in Windows 7. It was as if Windows 7 thought it knew what was best for me and decided to force its will upon my computer at a fixed 1024×768 resolution because it would only detect a generic monitor. The most feedback Windows 7 would give was a dialog reporting that settings could not be saved.
On the other hand, Linux (Linux Mint 16 in this case) was a breeze of fresh air that worked with me, not against me. Once it was determined that the timings were faulty, it took less than two minutes to fix:
1. Grab the DVI EDID information from a good monitor using sudo get-edid | parse-edid
2. Write a Modeline in xorg.conf using these settings, and
Beautiful, sharp, crisp 1920×1080 graphics appeared on the first try in Linux, and it has worked perfectly ever since. Linux has always been an easy operating system to troubleshoot, and once again, it proves its worth.