Novell Home

Three-Screen Xinerama on SUSE Linux 10 - cheap

Novell Cool Solutions: Feature
By Peter Van den Wildenbergh

Digg This - Slashdot This

Posted: 15 Dec 2005
 

License and Disclaimer

See http://www.opencontent.org/opl.shtml for the full software and documentation license. Basically, you can copy, redistribute, or modify this "how to," provided that modified versions, if redistributed, are also covered by the OpenContent License. Please e-mail a copy of your modified document to pvdw <@> criticalcontrol <.> com. Use this document at your own risk; it comes with no warranty. See the OpenContent License mentioned above.

Between serious things, sometimes I find time to play...
At work I got a beefy Dell Precision with dual-head screens and other goodies.
I really like the dual screen, although I cannot proof it with numbers but since I have this setup, I have the feeling that I can do more, in less time!
So, I wanted to have a dual screen at home too, just for fun.
However, at home I have a SUSE 10 setup on a cheap Dell Dimension that has an on board an intel graphics card and NO AGP/PCI-E Expansion slots, only 3 PCI slots are available...

I picked up a cheap Radeon PowerColor 9250 by Ati. This PCI card comes with 256MB that should be enough to do 1280x1024.
When unpacking the new thing I noticed that the card has 2 external connectors, 1 15 pin D-shell VGA and a DVI output.

Getting 2 screens to work - one attached to the on-board intel and one on the new PCI board wasn't that hard - just a matter of running sax2. Login as root to a console screen, type:

 
   init 3
   sax2

and when done

   init 5

and life should be good.

But the second (DVI) connector made me curious, could I make a three screen Xinerama?

The answer turned out to be yes, but sax2 wasn't helping.
I had to manually configure the /etc/X11/xorg.conf
So out came "vi", ignoring the "DO NOT ALTER" warning on top of the file.

The xorg.conf file isn't that hard to understand, once you grasp the relationship between the sections for Monitor(s), Mode(s), Screen(s), Device(s) and the ServerLayout section.

For a single head setup it looks like this:

Section "Monitor"
  Identifier  "Monitor[0]"  <----+     
  UseModes    "Modes[0]" ------+ |
EndSection                     | |
                               | |
Section "Modes"                | |
  Identifier "Modes[0]"  <-----+ |
EndSection                       |           
                                 |             
Section "Device"                 |
  Identifier   "Device[0]"  <--+ |
EndSection                     | |
                               | |
Section "Screen"               | |
  Identifier   "Screen[0]"     | |  <---------+
  Device       "Device[0]"  ---+ |            |
  Monitor      "Monitor[0]" -----+            |
EndSection                                    |
                                              |
Section "ServerLayout"                        |
  Identifier   "Layout[all]"                  |
  InputDevice  "Keyboard[0]" "CoreKeyboard"   |
  InputDevice  "Mouse[1]" "CorePointer"       |
  Screen       "Screen[0]"  ------------------+
EndSection

Read this diagram bottom-up as: A given X-server layout consists of 1 screen, screen 1 (number 0) has a device (number 0) and a monitor (number 0), Device 0 is defined in the Section "Device" with Identifier "Device[0]".

Monitor 0 is defined in the Section "Monitor" with identifier "Monitor[0]" and uses Modes[0], defined in de Section "Modes" with Identifier "Modes[0]".

For a xinerama layout you have to 'repeat' this excercise for screen 2 and eventually screen 3, 4, 5 ...

Those Identifiers are just strings you can name them what you want, as long as you make sure that when you reference a given identifier in another section you use the exact same string.

In practice:

First off, the Section "Monitor", in my case really easy, I got 3 same brand, same type, LCD screens. So I made 3 Monitor sections all looking the same, almost...

The Identifier, which is -as said- nothing more than just a string and the UseModes do differ.

Section "Monitor"
  DisplaySize  340 270
  HorizSync    28-82
  Identifier   "Monitor[0]"
  ModelName    "1280X1024@60HZ"
  Option       "DPMS"
  VendorName   "--> LCD"
  VertRefresh  50-60
  UseModes     "Modes[0]"
EndSection

Section "Monitor"
  DisplaySize  340 270
  HorizSync    28-82
  Identifier   "Monitor[1]"
  ModelName    "1280X1024@60HZ"
  Option       "DPMS"
  VendorName   "--> LCD"
  VertRefresh  50-60
  UseModes     "Modes[1]"
EndSection

Section "Monitor"
  DisplaySize  340 270
  HorizSync    28-82
  Identifier   "Monitor[2]"
  ModelName    "1280X1024@60HZ"
  Option       "DPMS"
  VendorName   "--> LCD"
  VertRefresh  50-60
  UseModes     "Modes[2]"
EndSection

The UseModes lines refer to the "Modes" section with the same Identifier.

Example Modes Section:
Section "Modes"
  Identifier   "Modes[0]"
  Modeline      "1280x1024" 105.15 1280 1360 1496 1712 1024 1025 1028 1059
  Modeline      "1280x960" 97.68 1280 1352 1488 1696 960 961 964 993
  Modeline      "1280x800" 80.58 1280 1344 1480 1680 800 801 804 827
  Modeline      "1152x864" 78.82 1152 1216 1336 1520 864 865 868 894
  Modeline      "1280x768" 77.37 1280 1344 1480 1680 768 769 772 794
  Modeline      "1024x768" 61.89 1024 1080 1184 1344 768 769 772 794
  Modeline      "800x600" 36.88 800 832 912 1024 600 601 604 621
  Modeline      "768x576" 33.74 768 792 872 976 576 577 580 596
  Modeline      "640x480" 23.06 640 656 720 800 480 481 484 497
EndSection

So I have 2 more of these sections in xorg.conf one with an Identifier "Modes[1]" and one with "Modes[2]".

The Device sections are a bit tricky.
The on-board Intel was identified by sax2 correctly, and I left it untouched.

Section "Device"
  BoardName    "865 G"
  BusID        "0:2:0"
  Driver       "i810"
  Identifier   "Device[0]"
  VendorName   "Intel"
EndSection

Although the PCI card has 2 connectors only one device was defined by sax2, if you want to use the 2 connectors you need an extra Device section and you need to alter the first one, to give it a couple "Options". Also note the different BusID's, the command "lspci" (executed as root) should reveal the BusIds for you:

00:02.0 VGA compatible controller: Intel Corporation 82865G Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: ATI Technologies Inc RV280 [Radeon 9200 PRO] (rev 01)
01:00.1 Display controller: ATI Technologies Inc: Unknown device 5940 (rev 01)

The end result on my PC for the 2 additional device sections looks like this:

Section "Device"
  BoardName    "RV280 5960"
  BusID        "1:0:0"
  Driver       "radeon"
  Identifier   "Device[1]"
  Option       "UseInternalAGPGART" "no"
  Option       "MergedFB" "true"
  Option       "CRT2Position" "RightOf"
  Screen       0
  VendorName   "ATI"
EndSection

Section "Device"
  BoardName    "RV280 5960"
  BusID        "1:0:1"
  Driver       "radeon"
  Identifier   "Device[2]"
  Screen       1
  VendorName   "ATI"
EndSection

More info on card specific options that can go into the Device section can be found on the internet.
The add/change 1 option and test approach is time consuming but returns the best results.
For this particular card I found http://wiki.x.org/X11R6.8.2/doc/radeon.4.html useful.

After reading this document, I played first with the "MonitorLayout" option, but ended up with a 3 screen Xinerama of which the middle screen turned black...

#  Option       "MonitorLayout" "TMDS, TMDS"
was commented out. The introduction of
Option       "CRT2Position" "RightOf"
was the thing that made things rolling.

Also note that it is Screen 0 in the first Device section and screen 1 in the second Device section, this IS NOT a reference to the screen sections, look at it as a 'xinerama' definition on the card itself.

Note: with the Dell Dimension 3000 I have, I had to make sure the on-board graphics card remained active after inserting the PCI card. Check your BIOS when you boot up after inserting the video card.

Once I had that figured out it was a matter of adjusting the ServerLayout section. Telling the system that the screens sit next to each other. (You can also have them "above" each other to make for example a 2x2 - 4 screen set-up...)

Section "ServerLayout"
  Identifier   "Layout[all]"
  InputDevice  "Keyboard[0]" "CoreKeyboard"
  InputDevice  "Mouse[1]" "CorePointer"
  Option       "Clone" "off"
  Option       "Xinerama" "on"
  Screen       "Screen[0]"
  Screen       "Screen[1]" RightOf "Screen[0]"
  Screen       "Screen[2]" RightOf "Screen[1]"
EndSection

Now, I have a 51 x 17 inch fishtank - when the screensaver kicks in - No cleaning, nor feeding needed!

Appendix

For a couple cool "WIDE" wallpapers start here:

http://www.matrox.com/mga/news/demos_downloads/parhelia_wallpapers.cfm
http://xavsniper.free.fr/dual_screen.htm
http://www.matrox.com/mga/news/demos_downloads/parhelia_triplehead_wallpapers.cfm

or type 3840x1024 (or whatever your preferred dimension is) in the google search for images (http://www.google.com/imghp?hl=en&tab=wi&q=), amazing what comes up...

If you want to use the ATI driver (Binary only, not open sourced) take a peek here: http://www.cosmicpothole.com/Linux/ati.php

About the author

Peter Van den Wildenbergh is a Senior Linux Administrator and a long time Linux advocate. He specializes in integrating Linux solution in existing environments and can be reached at: pvdw <@> criticalcontrol <.> com.


Novell Cool Solutions (corporate web communities) are produced by WebWise Solutions. www.webwiseone.com

© 2014 Novell