452 lines
15 KiB
Plaintext
452 lines
15 KiB
Plaintext
|
Linux XFree-to-Xinside mini-HOWTO
|
|||
|
by Marco Melgazzi, marco@techie.com
|
|||
|
v1.3, September 1997
|
|||
|
|
|||
|
How to convert an XFree86 modeline into an XInside/XiGraphics one
|
|||
|
______________________________________________________________________
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
|
|||
|
1. Introduction
|
|||
|
|
|||
|
2. Why should I need it ?
|
|||
|
|
|||
|
3. Let's go
|
|||
|
|
|||
|
4. Fixing up things
|
|||
|
|
|||
|
5. The end...
|
|||
|
|
|||
|
6. Automating the process
|
|||
|
|
|||
|
7. Thanks to
|
|||
|
|
|||
|
8. Copyright/legalese
|
|||
|
|
|||
|
|
|||
|
|
|||
|
______________________________________________________________________
|
|||
|
|
|||
|
1. Introduction
|
|||
|
|
|||
|
During the spring of 1996 I've seen a lot of posts in comp.os.linux.x
|
|||
|
asking how to convert video modes between XFree86 and one of its
|
|||
|
commercial alternatives: XInside ( now named XiGraphics, note anyway
|
|||
|
that in this document I'll use the old product name, since I will
|
|||
|
mainly refer to that version )
|
|||
|
|
|||
|
I had evaluated before the product and had this evaluation version
|
|||
|
still floating on my hard disk: since I like problem solving, I've
|
|||
|
decided to give it a try and, after a couple of hours of fiddling and
|
|||
|
calculating, I came up with a supposedly informative article that was
|
|||
|
promptly posted.
|
|||
|
|
|||
|
The discussions about how to convert suddendly vanished and I received
|
|||
|
1 (one) mail thanking me for the article so, since maybe somebody else
|
|||
|
could need this information in the future, I decided to transform that
|
|||
|
post in the mini-HOWTO you are reading.
|
|||
|
|
|||
|
Let me state something first: I do NOT work for XInside and I only had
|
|||
|
access to the evaluation 1.2 version for Linux. I know that nowadays (
|
|||
|
May 97 ) AccelX has reached revision 3.1, but I do think that the
|
|||
|
information included in this document, if not verbatim, is still
|
|||
|
applicable.
|
|||
|
|
|||
|
Due to the fact that this HOWTO has been written with the help of a
|
|||
|
pretty old Xinside version, it may well happen that some of the
|
|||
|
information contained here is not completely accurate: as you will
|
|||
|
read later, thanks to the birth of XFree 3.2, I haven't bought this
|
|||
|
commercial server, so if you have, and if you notice any incorrect
|
|||
|
information here please take the time to email me.
|
|||
|
|
|||
|
Notice anyway that fiddling with monitor timings can be hazardous and,
|
|||
|
for this reason, I absolutely make no guarantees. If it works for you
|
|||
|
, fine, if you blow up your computer I shall not be held responsible
|
|||
|
for it.
|
|||
|
As you may have noticed from may name, I'm not a native speaker of
|
|||
|
English so you will probably find some errors here and there, I
|
|||
|
apologize for them and I ask you to please avoid flooding my mailbox
|
|||
|
with language-related flames. Thanks !
|
|||
|
|
|||
|
|
|||
|
|
|||
|
2. Why should I need it ?
|
|||
|
|
|||
|
|
|||
|
I think that the Xinside policy of not giving you an utility to tweak
|
|||
|
your video modes ( like xvidtune ) and/or to import your existing
|
|||
|
XFree ones in the evaluation ( and AFAIK commercial ) version is
|
|||
|
incomprehensible. I've spent about three hours putting this together
|
|||
|
( hint: I've compared the VESA 1024x768@70Hz entry in the two formats
|
|||
|
( and I'm nearly an electronic engineer ;-)) while an Xinside
|
|||
|
programmer could have written a comparable article in a fraction of
|
|||
|
this time...
|
|||
|
|
|||
|
I haven't downloaded any evaluation version from 1.3 onwards and I
|
|||
|
really hope they have fixed this. Well, if they have, this mini-HOWTO
|
|||
|
could be considered useless but, alas, if you read it you will learn
|
|||
|
something more about how everything works...
|
|||
|
|
|||
|
|
|||
|
3. Let's go
|
|||
|
|
|||
|
Let's suppose that you have your oh-so-tweaked XFree86 mode and you
|
|||
|
want to evaluate Xinside in the same conditions: follow the steps
|
|||
|
described below and you should be able to do it; we will use my
|
|||
|
default video mode as a real-life example and I will explain what you
|
|||
|
will have to do to convert it.
|
|||
|
|
|||
|
An Xfree86 entry looks like this:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Modeline "blahblah" DOTCLK A B C D a b c d
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Every one of the A-D and a-d numbers has a meaning: if you want you
|
|||
|
can search for it in the 'The Hitchhiker's Guide to X386/XFree86 Video
|
|||
|
Timing' ( /usr/lib/X11/doc/VideoModes.doc ) but you don't need to know
|
|||
|
the theory behind all this to perform a succesful conversion...
|
|||
|
|
|||
|
My modeline in /usr/lib/X11/XF86Config is:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Modeline "1168x876" 105 1168 1256 1544 1640 876 877 891 900
|
|||
|
| | | | | | | | |
|
|||
|
DOT_CLK A B C D a b c d
|
|||
|
|
|||
|
|
|||
|
|
|||
|
In Xinside, you have to add an entry in the Xtimings file, which
|
|||
|
should be located in etc/ ( from now on we suppose you are in the top
|
|||
|
Xaccel directory that should be something like
|
|||
|
/usr/X11/lib/X11/AcceleratedX )
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Somewhere in the file, put here the name you want
|
|||
|
|
|||
|
[PREADJUSTED_TIMING]
|
|||
|
PreadjustedTimingName = "1168x876 @ 72Hz";
|
|||
|
|
|||
|
!
|
|||
|
! These four are obvious
|
|||
|
!
|
|||
|
HorPixel = 1168; // pixels
|
|||
|
VerPixel = 876; // lines
|
|||
|
PixelWidthRatio = 4;
|
|||
|
PixelHeightRatio = 3;
|
|||
|
|
|||
|
!
|
|||
|
! hsync: DOT_CLK / D * 1000 [KHz]
|
|||
|
!
|
|||
|
! hsync = 105 / 1640 * 1000 = 64.024 KHz
|
|||
|
!
|
|||
|
! vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Hz]
|
|||
|
!
|
|||
|
! vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000
|
|||
|
! ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Hz
|
|||
|
!
|
|||
|
|
|||
|
HorFrequency = 64.180; // kHz
|
|||
|
VerFrequency = 71.138; // Hz
|
|||
|
|
|||
|
! Obvious
|
|||
|
|
|||
|
ScanType = NONINTERLACED;
|
|||
|
|
|||
|
!
|
|||
|
! Put here the +/-hsync +/-vsync XFree86 options
|
|||
|
!
|
|||
|
HorSyncPolarity = POSITIVE;
|
|||
|
VerSyncPolarity = POSITIVE;
|
|||
|
|
|||
|
! Shouldn't change
|
|||
|
|
|||
|
CharacterWidth = 8; // pixels
|
|||
|
|
|||
|
! DOT_CLK here
|
|||
|
|
|||
|
PixelClock = 105.000; // MHz
|
|||
|
!
|
|||
|
!
|
|||
|
! horizontal timings section: [usec]
|
|||
|
!
|
|||
|
HorTotalTime = D / DOT_CLK = 15.619;
|
|||
|
HorAddrTime = A / DOT_CLK = 11.124;
|
|||
|
HorBlankStart = A / DOT_CLK = 11.124;
|
|||
|
HorBlankTime = HorTotalTime - HorBlankStart = 4.495;
|
|||
|
HorSyncStart = B / DOT_CLK = 11.962;
|
|||
|
HorSyncTime = C / DOT_CLK - HorSyncStart = 2.743;
|
|||
|
|
|||
|
!
|
|||
|
! vertical timings section: [msec]
|
|||
|
!
|
|||
|
|
|||
|
VerTotalTime = ( HorTotalTime * d ) / 1000 = 14.057;
|
|||
|
VerAddrTime = ( HorTotalTime * a ) / 1000 = 13.682;
|
|||
|
VerBlankStart = ( HorTotalTime * a ) / 1000 = 13.682;
|
|||
|
VerBlankTime = VerTotalTime - VerBlankStart = 0.375;
|
|||
|
VerSyncStart = ( HorTotalTime * b ) / 1000 = 13.698;
|
|||
|
VerSyncTime = ( HorTotalTime * ( c - b ) ) / 1000
|
|||
|
= 0.219
|
|||
|
! Finished !
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Now you have to put this newly created mode in the files shown below
|
|||
|
in the appropriate place.
|
|||
|
|
|||
|
|
|||
|
4. Fixing up things
|
|||
|
|
|||
|
In the excerpts shown below the -> sign tells you what was modified:
|
|||
|
do NOT include it in your files!
|
|||
|
|
|||
|
Monitor entry ( mine is monitors/mfreq/mfreq64.vda)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
[ESTABLISHED_TIMINGS]
|
|||
|
"640x480 @ 60Hz",
|
|||
|
"640x480 @ 72Hz",
|
|||
|
"640x480 @ 75Hz",
|
|||
|
"800x600 @ 56Hz",
|
|||
|
"800x600 @ 60Hz",
|
|||
|
"800x600 @ 72Hz",
|
|||
|
"800x600 @ 75Hz",
|
|||
|
"1024x768 Interlaced",
|
|||
|
"1024x768 @ 60Hz",
|
|||
|
"1024x768 @ 70Hz",
|
|||
|
"1024x768 @ 75Hz",
|
|||
|
"1152x900 Interlaced",
|
|||
|
"1152x900 @ 60Hz",
|
|||
|
"1152x900 @ 67Hz",
|
|||
|
-> "1168x876 @ 72Hz",
|
|||
|
"1280x1024 Interlaced",
|
|||
|
"1280x1024 @ 60Hz",
|
|||
|
"1600x1200 Interlaced";
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Board info file ( mine is boards/s3/764-2.xqa , I wonder why they have
|
|||
|
nearly all the Hercules boards but not MINE: Terminator 64/Dram )
|
|||
|
|
|||
|
|
|||
|
|
|||
|
[VISUAL]
|
|||
|
BitsPerPixel = 8;
|
|||
|
MemoryModel = Packed;
|
|||
|
ColorModel = Indexed;
|
|||
|
BitsRGB = 6;
|
|||
|
NumberOfColors = 256;
|
|||
|
|
|||
|
[RESOLUTIONS]
|
|||
|
640x480,
|
|||
|
800x600,
|
|||
|
1024x768,
|
|||
|
-> 1168x876,
|
|||
|
1152x900,
|
|||
|
1280x1024
|
|||
|
|
|||
|
[DESKTOPS]
|
|||
|
640x480,
|
|||
|
800x600,
|
|||
|
1024x768,
|
|||
|
1152x900,
|
|||
|
-> 1168x876,
|
|||
|
1280x1024,
|
|||
|
1600x1200
|
|||
|
|
|||
|
|
|||
|
|
|||
|
If the dot clock is low enough ( NOT in this case for my board ) you
|
|||
|
can put the entry even in the 16bpp and 32bpp sec- tions.
|
|||
|
|
|||
|
The /etc/Xaccel.ini will look something like this
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--------------------------------------------------------------
|
|||
|
Board = "s3/764-2.xqa";
|
|||
|
Monitor = "mfreq/mfreq64.vda";
|
|||
|
Depth = 8;
|
|||
|
-> Desktop = 1168x876;
|
|||
|
|
|||
|
[RESOLUTIONS]
|
|||
|
-> 1168x876,
|
|||
|
1024x768;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The actual Xinside mode entry in etc/Xtimings
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--------------------------------------------------------------
|
|||
|
[PREADJUSTED_TIMING]
|
|||
|
PreadjustedTimingName = "1168x876 @ 72Hz";
|
|||
|
|
|||
|
HorPixel = 1168; // pixels
|
|||
|
VerPixel = 876; // lines
|
|||
|
PixelWidthRatio = 4;
|
|||
|
PixelHeightRatio = 3;
|
|||
|
HorFrequency = 64.024; // kHz
|
|||
|
VerFrequency = 71.138; // Hz
|
|||
|
ScanType = NONINTERLACED;
|
|||
|
HorSyncPolarity = POSITIVE;
|
|||
|
VerSyncPolarity = POSITIVE;
|
|||
|
CharacterWidth = 8; // pixels
|
|||
|
PixelClock = 105.000; // MHz
|
|||
|
HorTotalTime = 15.619; // (usec) = 205 chars
|
|||
|
HorAddrTime = 11.124; // (usec) = 146 chars
|
|||
|
HorBlankStart = 11.124; // (usec) = 146 chars
|
|||
|
HorBlankTime = 4.495; // (usec) = 59 chars
|
|||
|
HorSyncStart = 11.962; // (usec) = 157 chars
|
|||
|
HorSyncTime = 2.743; // (usec) = 36 chars
|
|||
|
VerTotalTime = 14.057; // (msec) = 900 lines
|
|||
|
VerAddrTime = 13.682; // (msec) = 876 lines
|
|||
|
VerBlankStart = 13.682; // (msec) = 876 lines
|
|||
|
VerBlankTime = 0.375; // (msec) = 24 lines
|
|||
|
VerSyncStart = 13.698; // (msec) = 877 lines
|
|||
|
VerSyncTime = 0.219; // (msec) = 14 lines
|
|||
|
|
|||
|
|
|||
|
|
|||
|
You can check your conversion by running the vgaset program with no
|
|||
|
parameters while running the Xinside server: it will output an XFree-
|
|||
|
like line and, if everything went OK, this line will be equal to the
|
|||
|
line you started from ( except if b and c are equal, I haven't been
|
|||
|
able to reproduce this situation in Xinside: the best case was c=b+1
|
|||
|
).
|
|||
|
|
|||
|
|
|||
|
5. The end...
|
|||
|
|
|||
|
That's all folks ! I hope this will be useful to you. I don't think
|
|||
|
I'll buy the XiGraphics server in the near future for one simple
|
|||
|
reason: the release of XFree86 3.2 solved all of the text speed
|
|||
|
problems I was having on my humble Trio 64 video board ;)
|
|||
|
|
|||
|
It seems anyway that the XiGraphics server supports a much wider array
|
|||
|
of chipsets and video boards than XFree, so it may well happen that
|
|||
|
the commercial 'alternative' is the only viable one for you. If this
|
|||
|
is the case, and you bought the XiGraphics server, I would really like
|
|||
|
to hear from you to know if the information presented here has been
|
|||
|
useful to you, or if you found it too complex or whatever.
|
|||
|
|
|||
|
|
|||
|
6. Automating the process
|
|||
|
|
|||
|
This small script automates most of the work. Be very careful with the
|
|||
|
ScanType and with the two Polarity lines: the script do not set them
|
|||
|
and, if you are too lazy to correct them, the risks of blowing up your
|
|||
|
monitor increase quite a lot.
|
|||
|
|
|||
|
Notice that I don't know if the 'Doublescan' flag has meaning in
|
|||
|
XInside: if you try to convert a low-res doublescan mode BE CAREFUL,
|
|||
|
you can easily kill your monitor since the refresh rate that you get
|
|||
|
is doubled ( in fact my 400x300@72Hz became a 400x300@144Hz !).
|
|||
|
|
|||
|
#!/bin/sh
|
|||
|
##########################################################################
|
|||
|
# XF2XInside
|
|||
|
#
|
|||
|
# This script converts modelines from XF86Config format to XInside
|
|||
|
# format as needed for the etc/Xtiming file.
|
|||
|
#
|
|||
|
# This is a quick hack, so don't expect much error checking (not to
|
|||
|
# speak of anything like user friendlyness).
|
|||
|
#
|
|||
|
# If you call it without arguments it should tell you what to do.
|
|||
|
#
|
|||
|
# ( July 1996, hcz@tazlwurm.bb.bawue.de)
|
|||
|
#
|
|||
|
# Btw: New modes created as described in the HOWTO work, but don't
|
|||
|
# show up in Xsetup's menu. Anybody who knows why?
|
|||
|
#
|
|||
|
##########################################################################
|
|||
|
#----------------------------------------------- Here we go:
|
|||
|
# Change this if your modeline file lives somewhere else:
|
|||
|
XF=/usr/X11/lib/X11/XF86Config
|
|||
|
if [ $# -ne 1 ] ; then
|
|||
|
echo "usage: ${0##*/} <mode>"
|
|||
|
echo " example: ${0##*/} 1024x764"
|
|||
|
echo -e " function: converts $XF modeline entry into\n Xinside Format (stdout)"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
egrep -i "^[\t ]*modeline.+\"$1\"" /usr/X11/lib/X11/XF86Config |
|
|||
|
gawk '
|
|||
|
NF < 11 { print "! invalid Modeline:\n! " $0 "\n!"; next }
|
|||
|
{
|
|||
|
print "//", $0 ":"
|
|||
|
name = $2
|
|||
|
DOT_CLK = $3;
|
|||
|
A = $4;
|
|||
|
B = $5;
|
|||
|
C = $6;
|
|||
|
D = $7;
|
|||
|
a = $8;
|
|||
|
b = $9;
|
|||
|
c = $10;
|
|||
|
d = $11;
|
|||
|
VerFrequency = 1000000 / ((D / DOT_CLK) * d)
|
|||
|
print "[PREADJUSTED_TIMING]"
|
|||
|
printf " PreadjustedTimingName = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency
|
|||
|
print " HorPixel\t\t= " A ";"
|
|||
|
print " VerPixel\t\t= " a ";"
|
|||
|
print " PixelWidthRatio\t= 4;\n PixelHeightRatio\t= 3;"
|
|||
|
print " HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz"
|
|||
|
print " VerFrequency\t\t= " VerFrequency ";\t// Hz"
|
|||
|
print " ScanType\t\t= NONINTERLACED;\t\t// *CHECK*"
|
|||
|
print " HorSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
|
|||
|
print " VerSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
|
|||
|
print " CharacterWidth\t= 8;"
|
|||
|
print " PixelClock\t\t= " DOT_CLK ";"
|
|||
|
HorTotalTime = D / DOT_CLK
|
|||
|
print " HorTotalTime\t\t= " HorTotalTime ";"
|
|||
|
print " HorAddrTime \t\t= " A / DOT_CLK ";"
|
|||
|
print " HorBlankStart\t\t= " A / DOT_CLK ";"
|
|||
|
print " HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";"
|
|||
|
print " HorSyncStart\t\t= " B / DOT_CLK ";"
|
|||
|
print " HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";"
|
|||
|
VerTotalTime = ( HorTotalTime * d ) / 1000
|
|||
|
print " VerTotalTime\t\t= " VerTotalTime ";"
|
|||
|
print " VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";"
|
|||
|
VerBlankStart = ( HorTotalTime * a ) / 1000
|
|||
|
print " VerBlankStart\t\t= " VerBlankStart ";"
|
|||
|
print " VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";"
|
|||
|
print " VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";"
|
|||
|
print " VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000
|
|||
|
print ""
|
|||
|
}'
|
|||
|
|
|||
|
|
|||
|
|
|||
|
7. Thanks to
|
|||
|
|
|||
|
|
|||
|
<20> Heike Claudia Zimmerer hcz@tazlwurm.bb.bawue.de for pointing out a
|
|||
|
small inconsistency and for sending me a script that automates most
|
|||
|
of the work.
|
|||
|
|
|||
|
<20> Bartosz Maruszewski B.Maruszewski@zsmeie.torun.pl for translating
|
|||
|
this mini HOWTO in Polish and for pointing out a small typo.
|
|||
|
|
|||
|
|
|||
|
8. Copyright/legalese
|
|||
|
|
|||
|
(c)opyright 1996-7 by Marco Melgazzi (marco@techie.com) - the GPL (Gnu
|
|||
|
Public License) applies. To obtain a copy of the GPL write to the Free
|
|||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
|
|
|||
|
Trademarks are owned by their owners. There is no warranty on the
|
|||
|
accuracy and/or the usefulness of the information given in this
|
|||
|
document.
|
|||
|
|
|||
|
|
|||
|
|