PDA

View Full Version : VGA controller detection: multiscreen >>SOLVED<<



mathis
08-25-2004, 10:46 PM
Hi,
I have been customizing my own Knoppix CD, but in one thing I am failing: I want to have all my graphic adapters recognized and put together as Xinerama screens one "RightOf" the other.
I began with the problem to find the PCI addresses of the vga cards, and I found the following:

lspci -m|grep VGA|cut -b 1-7|sed -e s/\\./:/

But I don't really understand how Knoppix gets its XF86Config-4 file, where the information comes from and stuff. Could you explain to me how the X configuration system works and how I can change it to support multiple screen environments if more than one graphic card is installed?

Thanks in advance, Mathis

EDIT:
Just to clarify, I am trying to make a bootable Knoppix CD which can automatically discover one, two, three... graphic cards and configure them nicely with KDE to be right of the previous one.
I am aware of existing topics which seem to be about this problem, but it seems to me that some of them have a HD install of knoppix and the others have one graphic card with dual head support.

locutus
08-28-2004, 03:40 AM
I'll 2nd the motion for any insight/direction on where to look to make changes such that during the boot process a remastered KNOPPIX can handle multiple graphics cards and they can be recognized and configured.

Thanks in advance.

mathis
08-30-2004, 04:05 PM
I had to find a way, and so I created a shell script which modifies the XF86Config-4 created by Knoppix.
I put the script (which I called updateconfig.sh) and dms.txt (see below) into the newly created directory /var/multiscreen (in the KNOPPIX tree) and modified my /etc/init.d/xsession to look like this:


...
case "$X" in
*XFree86*) XCONFIG="/etc/X11/XF86Config-4"; BPP="-depth"; NORESET="-noreset"; ;;vesa|fbdev)
for i in xserver knoppix; do echo 'XSERVER="XFree86"' >> /etc/sysconfig/$i; echo 'XMODULE="'"$X"'"' >> /etc/sysconfig/$i; done
echo "${NORMAL}"
echo -n "${BLUE}Retrying with Server ${GREEN}XFree86(${YELLOW}$X${GREEN})${NORMAL} "
rm -f /etc/X11/XF86Config-4
mkxf86config >/dev/null 2>&1
X=XFree86 ; XCONFIG="/etc/X11/XF86Config-4"; BPP="-depth"; NORESET="-noreset"; XOPTIONS=""
;;
esac

# now get a new XF86Config-4 for *all* VGA cards
/var/multiscreen/updateconfig.sh

# Try hwsetup-generated flags first, if present
$X $NORESET -xf86config "$XCONFIG" $XOPTIONS $DPI :0 2>/dev/null && break
...

And it works fine! Here is the script:


# update /etc/X11/XF86Config-4 to support multiple screens if available
#
# Mathis Dirksen-Thedens [ dude@zephyrsoft.net ]
# August 2004
#
# written for KNOPPIX 3.4
#
# this script needs to know the following file locations:
# $infile what is configured yet by KNOPPIX
# $outfile where the new configuration shall be written to
# (if identical to $infile the output is temporarily redirected
# and moved to $infile later)
# $dms where the template with standard "Device", "Monitor" and
# "Screen" sections of XF86Config-4 is

infile=/etc/X11/XF86Config-4
outfile=$infile
dms=/var/multiscreen/dms.txt

# ---------- no modifications needed from this line on -----------

if [ $infile == $outfile ]; then
out_tmp=$outfile.new
else
out_tmp=$outfile
fi

echo ""

anz=`lspci -m|grep VGA|wc -l`
echo -n found $anz VGA cards

adrhex=`lspci -m|grep VGA|cut -b 1-7|sed -e s/\\\./:/|sort`

# hex -> dec
adr=""
for adr_i in $adrhex
do
hexnumber1=`echo $adr_i | cut -d : -f 1 | tr [a-z] [A-Z]`
hexnumber2=`echo $adr_i | cut -d : -f 2 | tr [a-z] [A-Z]`
hexnumber3=`echo $adr_i | cut -d : -f 3 | tr [a-z] [A-Z]`
decnumber1=`echo "obase=10;ibase=16; $hexnumber1" | bc`
decnumber2=`echo "obase=10;ibase=16; $hexnumber2" | bc`
decnumber3=`echo "obase=10;ibase=16; $hexnumber3" | bc`
adr=$adr" "$decnumber1\:$decnumber2\:$decnumber3
done

echo \ \(adresses: $adr\)
echo ""

already=`grep BusID $infile | expand | sed -e s/PCI\:// | sed -e s/[A-Za-z#\ \"]//g`
anzalready=`echo $already | sed -e s/[0-9\:]/x/g | wc -w`
echo already configured: $already \($anzalready of $anz\)

adr_new=""
for adr_i in $adr
do
cnt=0
for adr_a in $already
do
if [ $adr_i != $adr_a ]; then
let "cnt+=1"
fi
done
if [ $cnt == $anzalready ]; then
adr_new=$adr_new" "$adr_i
fi
done
echo still to configure: $adr_new
echo ""

# $out_tmp vorbereiten
cp $infile $out_tmp
cat $out_tmp|sed -e s/"\"Screen0\" 0\ 0"/"\"Screen0\" 0 0\n Option \"Xinerama\" \"on\""/ > $out_tmp.tmp
mv $out_tmp.tmp $out_tmp

i=1
for adr_i in $adr_new
do
# neue Blöcke Device/Monitor/Screen einfügen
cat $dms | sed -e s/\#\#\#NUMMER\#\#\#/$i/g | sed -e s/\#\#\#ADRESSE\#\#\#/$adr_i/g >> $out_tmp
# neue Zeile in Block ServerLayout einfügen
let "a=i-1"
newline=" Screen "$i" \"Screen"$i"\" RightOf \"Screen"$a"\""
cat $out_tmp|sed -e s/\#.*BusID/\\tBusID/|sed -e s/"\"Screen0\" 0\ 0"/"\"Screen0\" 0 0\n$newline"/ > $out_tmp.tmp
mv $out_tmp.tmp $out_tmp
# Counter erhöhen
let "i+=1"
done

# falls nötig Konfiguration sichern und überschreiben:
if [ $infile == $outfile -a $anz != $anzalready ]; then
mv $infile $infile.bak
mv $out_tmp $infile
else
rm $out_tmp
fi

if [ $anz == $anzalready ]; then
if [ $infile == $outfile ]; then
echo configuration was left unchanged
else
echo old configuration was copied to $outfile
fi
else
echo new configuration was written to $outfile
fi
echo ""

It is accompanied by a template with standard "Device", "Monitor" and "Screen" Sections (named dms.txt):


Section "Device"
Option "sw_cursor"
Identifier "Card###NUMMER###"
Driver "vesa"
VendorName "All"
BoardName "All"
BusID "PCI:###ADRESSE###"
EndSection

Section "Monitor"
Identifier "Monitor###NUMMER###"
Option "DPMS" "true"
ModelName "Standard-Monitor"
HorizSync 28.0 - 96.0 # Warning: This may fry old Monitors
VertRefresh 50.0 - 60.0 # Extreme conservative. Will flicker. TFT default.

# Default modes distilled from
# "VESA and Industry Standards and Guide for Computer Display Monitor
# Timing", version 1.0, revision 0.8, adopted September 17, 1998.
# $XFree86: xc/programs/Xserver/hw/xfree86/etc/vesamodes,v 1.4 1999/11/18 16:52:17 tsi Exp $
# 640x350 @ 85Hz (VESA) hsync: 37.9kHz
ModeLine "640x350" 31.5 640 672 736 832 350 382 385 445 +hsync -vsync
# 640x400 @ 85Hz (VESA) hsync: 37.9kHz
ModeLine "640x400" 31.5 640 672 736 832 400 401 404 445 -hsync +vsync
# 720x400 @ 85Hz (VESA) hsync: 37.9kHz
ModeLine "720x400" 35.5 720 756 828 936 400 401 404 446 -hsync +vsync
# 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz
ModeLine "640x480" 25.2 640 656 752 800 480 490 492 525 -hsync -vsync
# 640x480 @ 72Hz (VESA) hsync: 37.9kHz
ModeLine "640x480" 31.5 640 664 704 832 480 489 491 520 -hsync -vsync
# 640x480 @ 75Hz (VESA) hsync: 37.5kHz
ModeLine "640x480" 31.5 640 656 720 840 480 481 484 500 -hsync -vsync
# 640x480 @ 85Hz (VESA) hsync: 43.3kHz
ModeLine "640x480" 36.0 640 696 752 832 480 481 484 509 -hsync -vsync
# 800x600 @ 56Hz (VESA) hsync: 35.2kHz
ModeLine "800x600" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync
# 800x600 @ 60Hz (VESA) hsync: 37.9kHz
ModeLine "800x600" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
# 800x600 @ 72Hz (VESA) hsync: 48.1kHz
ModeLine "800x600" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsync
# 800x600 @ 75Hz (VESA) hsync: 46.9kHz
ModeLine "800x600" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync
# 800x600 @ 85Hz (VESA) hsync: 53.7kHz
ModeLine "800x600" 56.3 800 832 896 1048 600 601 604 631 +hsync +vsync
# 1024x768i @ 43Hz (industry standard) hsync: 35.5kHz
ModeLine "1024x768" 44.9 1024 1032 1208 1264 768 768 776 817 +hsync +vsync Interlace
# 1024x768 @ 60Hz (VESA) hsync: 48.4kHz
ModeLine "1024x768" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync
# 1024x768 @ 70Hz (VESA) hsync: 56.5kHz
ModeLine "1024x768" 75.0 1024 1048 1184 1328 768 771 777 806 -hsync -vsync
# 1024x768 @ 75Hz (VESA) hsync: 60.0kHz
ModeLine "1024x768" 78.8 1024 1040 1136 1312 768 769 772 800 +hsync +vsync
# 1024x768 @ 85Hz (VESA) hsync: 68.7kHz
ModeLine "1024x768" 94.5 1024 1072 1168 1376 768 769 772 808 +hsync +vsync
# 1152x864 @ 75Hz (VESA) hsync: 67.5kHz
ModeLine "1152x864" 108.0 1152 1216 1344 1600 864 865 868 900 +hsync +vsync
# 1280x960 @ 60Hz (VESA) hsync: 60.0kHz
ModeLine "1280x960" 108.0 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync
# 1280x960 @ 85Hz (VESA) hsync: 85.9kHz
ModeLine "1280x960" 148.5 1280 1344 1504 1728 960 961 964 1011 +hsync +vsync
# 1280x1024 @ 60Hz (VESA) hsync: 64.0kHz
ModeLine "1280x1024" 108.0 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync
# 1280x1024 @ 75Hz (VESA) hsync: 80.0kHz
ModeLine "1280x1024" 135.0 1280 1296 1440 1688 1024 1025 1028 1066 +hsync +vsync
# 1280x1024 @ 85Hz (VESA) hsync: 91.1kHz
ModeLine "1280x1024" 157.5 1280 1344 1504 1728 1024 1025 1028 1072 +hsync +vsync
# 1600x1200 @ 60Hz (VESA) hsync: 75.0kHz
ModeLine "1600x1200" 162.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync
# 1600x1200 @ 65Hz (VESA) hsync: 81.3kHz
ModeLine "1600x1200" 175.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync
# 1600x1200 @ 70Hz (VESA) hsync: 87.5kHz
ModeLine "1600x1200" 189.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync
# 1600x1200 @ 75Hz (VESA) hsync: 93.8kHz
ModeLine "1600x1200" 202.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync
# 1600x1200 @ 85Hz (VESA) hsync: 106.3kHz
ModeLine "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync
# Extended modelines with GTF timings
# 640x480 @ 100.00 Hz (GTF) hsync: 50.90 kHz; pclk: 43.16 MHz
ModeLine "640x480" 43.16 640 680 744 848 480 481 484 509 -HSync +Vsync
# 768x576 @ 60.00 Hz (GTF) hsync: 35.82 kHz; pclk: 34.96 MHz
ModeLine "768x576" 34.96 768 792 872 976 576 577 580 597 -HSync +Vsync
# 768x576 @ 72.00 Hz (GTF) hsync: 43.27 kHz; pclk: 42.93 MHz
ModeLine "768x576" 42.93 768 800 880 992 576 577 580 601 -HSync +Vsync
# 768x576 @ 75.00 Hz (GTF) hsync: 45.15 kHz; pclk: 45.51 MHz
ModeLine "768x576" 45.51 768 808 888 1008 576 577 580 602 -HSync +Vsync
# 768x576 @ 85.00 Hz (GTF) hsync: 51.42 kHz; pclk: 51.84 MHz
ModeLine "768x576" 51.84 768 808 888 1008 576 577 580 605 -HSync +Vsync
# 768x576 @ 100.00 Hz (GTF) hsync: 61.10 kHz; pclk: 62.57 MHz
ModeLine "768x576" 62.57 768 816 896 1024 576 577 580 611 -HSync +Vsync
# 800x600 @ 100.00 Hz (GTF) hsync: 63.60 kHz; pclk: 68.18 MHz
ModeLine "800x600" 68.18 800 848 936 1072 600 601 604 636 -HSync +Vsync
# 1024x768 @ 100.00 Hz (GTF) hsync: 81.40 kHz; pclk: 113.31 MHz
ModeLine "1024x768" 113.31 1024 1096 1208 1392 768 769 772 814 -HSync +Vsync
# 1152x864 @ 60.00 Hz (GTF) hsync: 53.70 kHz; pclk: 81.62 MHz
ModeLine "1152x864" 81.62 1152 1216 1336 1520 864 865 868 895 -HSync +Vsync
# 1152x864 @ 85.00 Hz (GTF) hsync: 77.10 kHz; pclk: 119.65 MHz
ModeLine "1152x864" 119.65 1152 1224 1352 1552 864 865 868 907 -HSync +Vsync
# 1152x864 @ 100.00 Hz (GTF) hsync: 91.50 kHz; pclk: 143.47 MHz
ModeLine "1152x864" 143.47 1152 1232 1360 1568 864 865 868 915 -HSync +Vsync
# 1280x960 @ 72.00 Hz (GTF) hsync: 72.07 kHz; pclk: 124.54 MHz
ModeLine "1280x960" 124.54 1280 1368 1504 1728 960 961 964 1001 -HSync +Vsync
# 1280x960 @ 75.00 Hz (GTF) hsync: 75.15 kHz; pclk: 129.86 MHz
ModeLine "1280x960" 129.86 1280 1368 1504 1728 960 961 964 1002 -HSync +Vsync
# 1280x960 @ 100.00 Hz (GTF) hsync: 101.70 kHz; pclk: 178.99 MHz
ModeLine "1280x960" 178.99 1280 1376 1520 1760 960 961 964 1017 -HSync +Vsync
# 1280x1024 @ 100.00 Hz (GTF) hsync: 108.50 kHz; pclk: 190.96 MHz
ModeLine "1280x1024" 190.96 1280 1376 1520 1760 1024 1025 1028 1085 -HSync +Vsync
# 1400x1050 @ 60.00 Hz (GTF) hsync: 65.22 kHz; pclk: 122.61 MHz
ModeLine "1400x1050" 122.61 1400 1488 1640 1880 1050 1051 1054 1087 -HSync +Vsync
# 1400x1050 @ 72.00 Hz (GTF) hsync: 78.77 kHz; pclk: 149.34 MHz
ModeLine "1400x1050" 149.34 1400 1496 1648 1896 1050 1051 1054 1094 -HSync +Vsync
# 1400x1050 @ 75.00 Hz (GTF) hsync: 82.20 kHz; pclk: 155.85 MHz
ModeLine "1400x1050" 155.85 1400 1496 1648 1896 1050 1051 1054 1096 -HSync +Vsync
# 1400x1050 @ 85.00 Hz (GTF) hsync: 93.76 kHz; pclk: 179.26 MHz
ModeLine "1400x1050" 179.26 1400 1504 1656 1912 1050 1051 1054 1103 -HSync +Vsync
# 1400x1050 @ 100.00 Hz (GTF) hsync: 111.20 kHz; pclk: 214.39 MHz
ModeLine "1400x1050" 214.39 1400 1512 1664 1928 1050 1051 1054 1112 -HSync +Vsync
# 1600x1200 @ 100.00 Hz (GTF) hsync: 127.10 kHz; pclk: 280.64 MHz
ModeLine "1600x1200" 280.64 1600 1728 1904 2208 1200 1201 1204 1271 -HSync +Vsync
EndSection

Section "Screen"
Identifier "Screen###NUMMER###"
Device "Card###NUMMER###"
Monitor "Monitor###NUMMER###"
DefaultColorDepth 16
SubSection "Display"
Depth 1
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 4
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 8
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 15
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 16
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 32
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection

If you like this, feel free to enhance it even more, but be aware that lspci gives you the addresses in hex numbers while X needs them decimal! (This was the biggest annoyance while writing the script.)
If you enhance it, please send me an email ot post it on this site, thank you.

mathis
08-30-2004, 04:05 PM
The one big flaw is that the VESA driver operates the second, third... VGA card(s). If someone knows how to detect this properly please let me know.

If you try this on other versions of Knoppix, please tell how it worked! Thanks