sysop @ mousehouse:
Modelines für Monitore programmieren unter XF86Config
started on 01.09.1998 - updated 01.01.1999
Index
- Basics
- Monitor
- VideoKarte
- 1.2.1 RAM
- 1.2.2 Clocks
- ModeLine
- 2.1 An example. Standard-VGA.
- 2.2 Regeln für hsync und vsync
- 2.3 Passen die Regeln aufs Beispiel?
- 2.4 Ein Beispiel zum selber Durchrechnen
- 3. Eine sehr specielle Anwendung dieser Geschichte
1 Basics
Sie können mit einer falsch eingestellten ModeLine Ihren Monitor und die VideoKarte
unreparierbar zerstören.
Tun Sie also in dieser Richtung nichts, was Sie nicht 120%ig verstanden haben.
1.1 Monitor
Der Monitor zeichnet das sichtbare Bild zeilenweise. Er zeichnet zuerst die oberste Zeile,
dann empfängt er einen horizontalen Synchronpuls (hsync), der ein paar Pixel lang ist, läuft an
den Anfang der zweiten Zeile, zeichnet diese, usw.
Am unteren Ende des Bildes empfängt er einen vertikalen Synchronpuls, der ein paar Zeilen
lang ist (vsync). Hierauf kehrt er wieder zur ersten Zeile zurück.
Das macht er pro Sekunde so oft, wie die Bildwiederholfrequenz zuläßt. Werte über 69 Bilder
pro Sekunde sollten zur Augenschonung erreicht werden.
Das gesamte Bild ist also größer als das sichtbare Bild, in der Breite um ca. 25 (fünfundzwanzig) %,
in der Höhe um ca. 5 (fünf) %.
Beispiel:
Bei einer Auflösung von 800x600 sichtbaren Pixeln ist das (unsichtbare) Gesamtbild
1000x630 Pixel groß.
Damit der Monitor nicht kaputtgeht, müssen wir mit den folgenden Größen innerhalb der
Spezifikationen des Monitors bleiben:
- Bandweite:
- ist die Gesamt-Anzahl der (sichtbaren und unsichtbaren) Pixel pro Sekunde.
Beispiel: eine Auflösung von 600x800 bei 70 Hz Bildfrequenz bedeutet
die Darstellung von 800 * 1,25 * 600 * 1,05 * 70 = 44100000 Pixel pro Sekunde,
d.h. eine Pixelfrequenz von 44,1 MHz (MegaHertz) und eine Pixelzeit von 22,676 nsec (nanoSekunden).
- horizontale Synchronfrequenz:
- ist die Anzahl der dargestellten Zeilen pro Sekunde.
Beispiel: eine Auflösung von 600x800 bei 70 Hz Bildfrequenz bedeutet
die Darstellung von 600 * 1,05 * 70 = 44100 Zeilen pro Sekunde,
d.h. eine Zeilenfrequenz von 44,1 kHz (kiloHertz) und eine Zeilendauer von 22,676 usec (microSekunden)
Schon möglich, daß die Werte für das Beispiel blöd gewählt sind: Wer erkennt schon auf Anhieb
den Unterschied zwischen 44,1 MHz und 44,1 kHz.
1.2 VideoKarte
1.2.1 RAM
Die Videokarte speichert den sichtbaren Teil des Bildes. Dazu hat sie Speicher (RAM) eingebaut.
Bekanntermaßen sind 8 Bit = 1 Byte.
Wir brauchen für monochrom (d.h. jeder Pixel ist entweder an oder aus) 1 Bit pro Pixel.
Wir brauchen für 16 Farben 4 Bit pro Pixel.
Wir brauchen für 256 Farben 8 Bit pro Pixel, also 1 Byte pro Pixel.
Wir brauchen für 65.536 Farben 16 Bit pro Pixel, also 2 Byte pro Pixel.
Wir brauchen für 16.777.216 Farben 24 Bit pro Pixel, also 3 Byte pro Pixel.
Somit können wir als Beispiele angeben:
- monochrom 320x200: 320 *200 * 1 = 64000 Bit = 8000 Byte = 7,8 kByte (das k bedeutet hier 1024!)
- VGA mono 640x480: 640 * 480 * 1 = 307200 Bit = 38400 Byte = 37,5 kByte
- VGA 16farb 640x480: 640 * 480 * 4 = 1228800 Bit = 153600 Byte = 150 kByte
- SVGA 256 farb 800x600: 800 * 600 * 8 = 3840000 Bit = 480000 Byte = 468,75 kByte
- SVGA 16 farb 1024x786: 1024 * 768 * 4 = 3145728 Bit = 393216 Byte = 384 kByte
1.2.2 Clocks
Jede VideoKarte hat Clocks, d.h. fest eingestellte Frequenzen, bei denen sie Bilder am liebsten
darstellt.
SuperProbe liefert uns diese Clocks.
Die Standard-VGA-Karte hat die Clocks 25.2 MHz und 28.3 MHz.
D.h., sie kann 640x480 sichtbare, also 800x504 Gesamt-Pixel 62,5mal oder 70,2mal pro Sekunde
darstellen.
2 ModeLine
2.1 An example. Standard VGA. Should run on every Card and every Monitor.
# 640x480 @ 60 Hz, 31.5 kHz hsync
Modeline "640x480" 25.175 640 664 760 800 480 491 493 525
sagt XF86Config zu Linux Folgendes:
"Ich definiere hier den Modus namens "640x480".
(Ich hätte ihn auch "HansUndFranz" oder "VGAStandard" nennen können).
Wir benutzen die VGA-Karten-Clock von 25.175 MHz.
(Damit ist 1 Tick = 1 / ClockFrequenz = 39,72 nsec.)
640 ist die sichtbare Dauer der Zeilen in Ticks.
hsync soll bei 664 Ticks anfangen und bei 760 Ticks aufhören.
800 Ticks ist die Gesamtlänge einer Zeile,
das sind 31,78 usec (microsekunden). Zeilenfrequenz ist also 31.469 kHz. Stimmt.
Es gibt insgesamt 480 sichtbare Zeilen.
vsync soll bei Zeile 491 anfangen und bei Zeile 493 aufhören.
Es gibt insgesamt 525 Zeilen,
das sind 0,0167 sec pro Bild. Bildfrequenz ist also 59.94 Hz. Stimmt."
2.2 Regeln
Wir wissen nun, wie man die meisten Zahlen berechnet. Es fehlen Regeln zur Berechnung von
hsync und vsync.
- Allgemein
- Die Gesamt-Zeilenlänge soll ohne Rest durch 8 teilbar sein.
- Regeln für hsync
- hsync soll 3,5 bis 4,0 usec (microsekunden) lang sein. Startwert: 3,8 usec.
hsync soll links und rechts mindestens 30 Ticks Abstand haben.
hsync soll links und rechts gleichviel Abstand haben.
- Regeln für vsync
- vsync soll links 0..3 vertikale Ticks Abstand haben.
vsync soll 50..300 usec lang sein. Ein guter Startwert ist 150 usec.
2.3 Passen die Regeln aufs Beispiel?
Es sollte eine ModeLine für 640x480 Pixel sein, bei 25.175 MHz.
Die Zeile umfaßt insgesamt 800 Pixel, durch 8 teilbar, 25 % mehr. Stimmt.
hsync ist 760 - 664 = 96 hTicks = 3,81 usec lang. Stimmt.
hsync hat links 24 und rechts 40 hTicks Abstand. Stimmt nicht zu 100 %, läuft aber trotzdem.
vsync hat 491 - 480 = 11 vTicks Abstand. Stimmt.
vsync ist 2 vTicks = 63,56 usec. Stimmt.
2.4 Ein Beispiel zum selber Durchrechnen
Dies ist kein Spaß. Sehen Sie selbst, wie Sie MHz, GByte und nsec durcheinanderwerfen.
# 640x480 @ 72 Hz, 36.5 kHz hsync
Modeline "640x480" 31.5 640 680 720 864 480 488 491 521
3. Eine sehr specielle Anwendung dieser Geschichte
Ich habe eine Diamond Stealth Video 2000, mit einem S3-Chipsatz, den Xwin nicht kennt.
Normalerweise macht sie 1024x768x256 unter Windoze 3.1.
Der SVGA-Server von Xwin kann sie zwar mit 256 Farben ansteuern, nur daß er keinen Zugriff
auf das komplette Ram hat. Er erkennt nur das Standard-VGA-16-Farben RAM von 64 kByte,
sowie die VGA-Standard-Clocks.
Ich lege aber Wert auf 256 Farben, und stricke mir im folgenden eine ModeLine für VGA, mit
den Clocks von VGA, die mir mehr als 320x200 (Standard-SVGA-Server von Linux) liefert.
(Ich sollte noch sagen, daß S.u.S.E. einen S3-SVGA-Server herausgebracht hat, der diese Karte
versteht. Aber der ist von 1998, d.h. paßt wahrscheinlich nicht zu meiner S.u.S.E.-Distribution
von 1995, und außerdem lerne ich so mehr über VideoKarten.)
Pack mer's!
Die 153600 Byte, die ja für 640x480x16 (also 4 Bit pro Pixel) an RAM vorhanden sein müssen,
gestatten mir bei 8 Bit pro Pixel 153600 Pixel darzustellen. Bei einem Bildschirmverhältnis von
4:3 sind das z.B. 452x339 Pixel.
Ich habe beschlossen, es mal mit 448x336 zu versuchen.
Damit komme ich für die Gesamtlänge einer Zeile auf 448 * 1,25 = 560 Pixel,
was auch durch 8 ohne Rest teilbar ist,
bei einer Gesamthöhe von 336 * 1,05 = sagen wir 353 Pixel.
Damit habe ich insgesamt 560 * 336 = 188160 Pixel.
Bei einer Clock von 25,2 MHz gibt mir das 134 Frames pro Sekunde,
bei einer Zeilenfrequenz von 336 * 134 = 45 kHz.
Mein Monitor ist mindestens ein Generic 1024x768 bei 70 Hz, der also 768 * 70 = 53760 Zeilen
pro Sekunde darstellt. Das heißt, er verträgt 53,760 kHz Zeilenfrequenz, das heißt, er verträgt auch
45 kHz. Paßt.
hsync soll 3,8 usec lang sein, das sind 96 hTicks.
Die bekomme ich mit 30 hTicks Abstand links und rechts nicht in 560-448 = 112 hTicks hinein.
Also wähle ich zähneknirschend Werte mit dem 0,718fachen davon:
Abstand links 22 hTicks, hsync 69 hTicks, Abstand rechts 21 hTicks.
150 usec entsprechen 6,75 vTicks, ich nehme 7 bei 3 vTicks oberem Abstand.
Damit ist der untere Abstand (353-336) - 7 - 3 = 7 Ticks. Gut.
Meine Modeline sieht also aus wie folgt:
ModeLine "448x336" 25.2 448 470 539 560 336 339 346 353
Back home
This page hosted by Get your own Free Home Page