Dual Monitors under Debian

There's a lot of evidence that more than one monitor improves productivity. I am firmly convinced by this (and am not at all influenced by the fact that having two monitors is cool). I recently binned a 19-inch CRT (much-loved but sadly blurring) and replaced it with a LG 21.5-inch LCD 1902x1080 screen. This was cabled up to the VGA port, as I use a KVM box to use the same monitor/keyboard/mouse combination on my servers. Very nice; maybe two would be even nicer.

After a few weeks I bought the same LG screen, but with added digital TV tuner (an additonal £20; I'm not sure I understand the economics). This connected to the DVI port on the ATI Radeon 4670HD graphics card on amber and gave an even better quality display.

Getting this setup working on Windows 7 was easy. A little more difficult on Debian squeeze...

The proprietry drivers (fglrx) from ATI favour an Xinerama setup, although this is now deprecated in favour of xrandr. So, my challenge was to move from the Xinerama, ATI-generated /etc/X11/xorg.conf file to something that would be supported by xrandr.

I figured I would get X to generate to new /etc/X11/xorg.conf file, using

  X -configure

This did not work, as the fglrx driver died in the middle of the X probe process, as shown by this snippet from the X11.xorg.log

(WW) Falling back to old probe method for fglrx
(II) Loading PCS database from /etc/ati/amdpcsdb
(WW) fglrx: No matching Device section for instance (BusID PCI:0@1:0:1) found
(**) ChipID override: 0x9490
(**) Chipset Supported AMD Graphics Processor (0x9490) found

0: X (xorg_backtrace+0x3b) [0x80adedb]
1: X (0x8048000+0x5aab5) [0x80a2ab5]
2: (vdso) (__kernel_rt_sigreturn+0x0) [0xb788340c]
3: /usr/lib/xorg/modules/drivers/fglrx_drv.so (atiddxProbe+0x29) [0xb6a0a789]
4: X (xf86CallDriverProbe+0x182) [0x80b00e2]
5: X (DoConfigure+0x1b5) [0x80c0a85]
6: X (InitOutput+0x1da) [0x80b05ca]
7: X (0x8048000+0x1e7f0) [0x80667f0]
8: /lib/i686/cmov/libc.so.6 (__libc_start_main+0xe6) [0xb75b9c76]
9: X (0x8048000+0x1e5a1) [0x80665a1]
Segmentation fault at address (nil)

Fatal server error:
Caught signal 11 (Segmentation fault). Server aborting

To work around this, I de-installed the fglrx driver (using /usr/share/ati/fglrx-uninstall.sh) and re-ran the X -configure process. This did generate a new xorg.conf file, defaulting to the radeonhd driver. Sadly, this driver seemed unable to support the full resolution offered by the monitor when connected to the VGA port, so I re-installed the fglrx driver and manually edited the /etc/X11/xorg.conf file to use fglrx.

Finally, to get xrandr to work, I had to add these two lines to the Display subsection in the Screen section of the /etc/X11/xorg.conf file, shown below:

  Modes "1920x1080"
  Virtual 3840 3840

The complete xorg.conf file is shown below:

  Section "ServerLayout"
	Identifier     "X.org Configured"
	Screen      0  "Screen0" 0 0
	InputDevice    "Mouse0" "CorePointer"
	InputDevice    "Keyboard0" "CoreKeyboard"

Section "Files"
	ModulePath   "/usr/lib/xorg/modules"
	FontPath     "/usr/share/fonts/X11/misc"
	FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
	FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
	FontPath     "/usr/share/fonts/X11/Type1"
	FontPath     "/usr/share/fonts/X11/100dpi"
	FontPath     "/usr/share/fonts/X11/75dpi"
	FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
	FontPath     "built-ins"

Section "Module"
	Load  "dbe"
	Load  "glx"
	Load  "extmod"
	Load  "dri2"
	Load  "FGL.renamed.libdri"
	Load  "record"

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "kbd"

Section "InputDevice"
	Identifier  "Mouse0"
	Driver      "mouse"
	Option	    "Protocol" "auto"
	Option	    "Device" "/dev/input/mice"
	Option	    "ZAxisMapping" "4 5 6 7"

Section "Monitor"
	Identifier   "Monitor0"
	VendorName   "Monitor Vendor"
	ModelName    "Monitor Model"

Section "Device"
	Identifier  "Card0"
	Driver      "fglrx"
	VendorName  "ATI Technologies Inc"
	BoardName   "RV730XT [Radeon HD 4670]"
	BusID       "PCI:1:0:0"

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
	DefaultDepth 24
	SubSection "Display"
		Modes "1920x1080"
		Virtual 3840 3840
		Depth   24

You will note that the Virtual direction states 3840x3840. I originally specified 3840x1080, but xrandr was not happy as it said, on attempting to use both monitors, that the physical pixel dimensions exceeded the Virtual specification.

The command to render onto two monitors is:

  xrandr --output CRT2 --auto --left-of DFP1

which I placed just before the window manager invocation in my ~/.xinitrc file.

To determine which display devices are visible to xrandr, you can issue the xrandr -q command. Example output is shown below:

[mark@amber:~] xrandr -q
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 3840 x 3840
DFP1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 598mm x 336mm
   1920x1080      59.9*+
   1776x1000      60.0 +
   1280x720       60.0 +
   1680x1050      60.0  
   1400x1050      60.0  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       75.0     60.0  
   1280x800       75.0     60.0  
   1152x864       75.0     60.0  
   1280x768       74.9     59.9  
   1024x768       75.0     70.1     60.0  
   1152x648       60.0  
   800x600        75.0     70.0     60.3  
   720x480        60.0  
   640x480        75.0     60.0  
DFP2 disconnected (normal left inverted right x axis y axis)
CRT1 disconnected (normal left inverted right x axis y axis)
CRT2 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*+
   1680x1050      60.0  
   1400x1050      60.0  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       75.0     60.0  
   1280x800       75.0     60.0  
   1152x864       75.0     60.0  
   1280x768       74.9     59.9  
   1280x720       60.0  
   1024x768       75.0     60.0  
   800x600        75.0     60.3     56.2  
   720x480        60.0  
   640x480        75.0     60.0