sysop @ mousehouse:

Modelines für Monitore programmieren unter XF86Config

started on 01.09.1998 - updated 01.01.1999

Index
  1. Basics
    1. Monitor
    2. VideoKarte
      1. 1.2.1 RAM
      2. 1.2.2 Clocks
  2. ModeLine
    1. 2.1 An example. Standard-VGA.
    2. 2.2 Regeln für hsync und vsync
    3. 2.3 Passen die Regeln aufs Beispiel?
    4. 2.4 Ein Beispiel zum selber Durchrechnen
  3. 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:


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