HDMI to DVI problem

From Organic Design

We found on our Dell laptops under Ubuntu Linux (one an XPS, the other an Inspiron) that the external monitor would not work at the right resolution when connected to from the HDMI output to the monitor's DVI input. It would work fine using the VGA analogue output, but when using digital it would always result in a resolution one line short on the external monitor, for example 1680x1049 instead of 1680x1050.

This problem should be fixed in a future kernel or driver update, but in the mean time the problem can be overcome by creating a custom resolution which is one line higher than the monitors natural resolution.

Defining a new video mode requires nine parameters which are difficult to work out manually so first we'll use the gtf utility to work out the sequence of numbers from the resolution and frequency we want. In our case we wanted to create a resolution of 1680 by 1051 at 60Hz.

gtf 1680 1051 60 -x

Alternatively you can use cvt to produce ModeLine's which some say is better suited to LCD's than gtf. You should try with and without the reduced parameter in the case of failure.

cvt --reduced 1680 1051 60

This resulted in the following information on my system:

# 1680x1051 @ 60.00 Hz (GTF) hsync: 65.28 kHz; pclk: 147.27 MHz
Modeline "1680x1051_60.00"  147.27  1680 1784 1968 2256  1051 1052 1055 1088  -HSync +Vsync

Next use these number to create and set a new video mode as follow:

xrandr --newmode "1680x1051_60.00"  147.27  1680 1784 1968 2256  1051 1052 1055 1088  -HSync +Vsync
xrandr --addmode TMDS-1 1680x1051_60.00
xrandr --output TMDS-1 --mode 1680x1051_60.00

I'm not sure how to translate these settings in to xorg.conf if you just want to run only the external monitor, but for dual monitor configuration, simply add the ModeLine to the appropriate monitor section. For now I've created a shell script which applies the new mode and turns off the laptop panel. Make a file containing the following script, set it executable permission and drop it onto your taskbar.

#!/bin/bash
xrandr --newmode "1680x1051_60.00"  147.27  1680 1784 1968 2256  1051 1052 1055 1088  -HSync +Vsync
xrandr --addmode TMDS-1 1680x1051_60.00
xrandr --output TMDS-1 --mode 1680x1051_60.00
xrandr --output LVDS --off

See also