Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Index   Calendar   Search
 

X Mode-lines

En kort beskrivelse


Hvorfor?

Har man en monitor der enten kan køre med en højere opløsning, eller en højere opdaterings-frekvens, end XFree86 standard-opsætningen kan følge med til, kan man skrive sin egen X mode line. Det er en linie i konfigurations-filen /etc/X11/XF86Config, der ser cirka ud som f.eks:
Modeline "1024x768"    85    1024 1032 1152 1360   768  784  787  823
Umiddelbart ser det fuldstændigt kryptisk ud. Det er det også :)

Hvordan?

Jeg vil gennemgå hvordan jeg lavede en mode-line til min egen monitor. Jeg ville gerne kunne køre 1600x1200 i omkring 80 Hz. I de eksempler jeg giver, vil du umiddelbart kunne skifte din egen monitors data ud med de værdier jeg bruger. De trin man skal igennem er: Det ser måske umiddelbart uoverskueligt ud, men i løbet af en halv time kan man have en mode-line klar, hvor ens skærm kører som man vil have det.

1. Opfind et navn til den nye modeline

Man navngiver typisk en modeline efter den opløsning den definerer. Da jeg vil køre 1600x1200 vil jeg kalde den for "1600x1200". Min modeline ser altså nu ud som:
Modeline "1600x1200"  

2. Bestem horisontal og vertikal opløsning i pixels

Horisontal og vertikal opløsning (i pixels) skrives ind på 3. og 7. position i modeline linien:
Modeline "1600x1200"  ... 1600 ... ... ... 1200 ... ... ...
Du kan naturligvis ikke køre højere opløsning end du har hukommelse til på skærmkortet. Jeg har 4 MB på mit kort, og i 1600x1200 begrænser det mit til at køre 16bit farver. Prøv selv at regne efter:
   (horisontal opl.) * (vertikal opl.) * (antal bits)/8 =
   (hukommelseskrav)
   1600 * 1200 * 16/8 = 3.84 Mbytes

3. Indsæt båndbredde

Min skærm har en båndbredde på 250MHz, mens mit skærmkort kun kan køre 220MHz. Disse tal kan man finde i dokumentationen til hhv. skærm og skærmkort. Det er altså mit skærmkort der begrænser hvor hurtigt jeg kan opfriske skærmbilledet. Jeg vælger en båndbredde på 210MHz, da det ikke særligt smart at køre sin hardware helt til grænsen her. Du kan rent faktisk ødelægge de fleste nye (og gamle) skærmkort ved at sætte båndbredden for højt!. Min modeline er nu:
Modeline "1600x1200" 210.00 1600 ... ... ... 1200 ... ... ...

4. Beregn højde/bredde i dot-clocks

Måden skærmkortet finder ud af hvornår elektron-strålen i billedrøret skal slukke/tænde på, og hvornår der skal laves horisontal/vertikal backtrace, er ved at tælle dot-clocks. Ligesom en computer har en clock-frekvens, har skærmkortet altså en dot-clock. Denne clock kører med den frekvens man sætter som båndbredde. Altså i mit tilfælde, 210 MHz.
Du skal nu finde ud af hvor hurtigt din skærm kan opdatere horisontalt. Det er den frekvens man kalder Horizontal Sync.. I manualen til min skærm står der, at den kører op til 101.3 KHz i 1600x1200. Vi prøver lige at regne lidt på det:
   (båndbredde) / (horiz. sync) = (horiz. dot-clocks)
   (210 * 10^6) / (101.3 * 10^3) = 2073
Nu er det sådan, at dot-clocks helst skal kunne deles med 8, pga. begrænsninger i hardwaren. Jeg ved ikke om det er aktuelt på mit skærmkort, men hvis nu jeg bare sørger for det, så skal jeg ikke spekulere mere over det. Jeg sætter altså min dot-clock til 2080, så vil den horisontale sync. også ligge lidt under det der er specificeret i min monitor's manual.
Så mangler vi vertikal dot-clock. Denne finder man ved lidt sort magi. Den bør være 5% længere end den vertikale opløsning i pixels. Da jeg vil køre 1200 pixels vertikalt, får jeg 1260 som vertikal dot-clock. Jeg har også sørget for, at denne værdi er delelig med 8, ved at sætte den til 1264. Dette skulle dog ikke være nødvendigt, men det virker lige godt, om ikke andet. Mode-linien ser du ud som:
Modeline "1600x1200" 210.00 1600 ... ... 2080 1200 ... ... 1264

5. Gæt på nogen værdier for timing af skærmens CRT

Nu kommer vi til det helt sorte. Vi skal gætte på nogen værdier for, hvornår elektron-strålen skal slukkes, og hvornår den skal lave backtrace. Der findes en udemærket guide til dette, i XFree86 Video Timings HOWTO, der beskriver ret detaljeret hvordan man kan regne sig frem til en masse værdier. Jeg var en doven hund da jeg skulle sætte min skærm op, så jeg slyngede bare et par tal ud, og så kunne jeg senere justere det ind. Hvis man kigger på de andre mode-lines i XF86Config filen, vil man se at de tal vi mangler ligger et sted imellem de tal vi har sat ind allerede. Det jeg gjorde var, at kaste et par værdier ind, og prøve at se hvordan det så ud. Man skal naturligvis sørge for at de tal man smider ind, er nogenlunde i forhold til hvordan tallene i de andre mode-lines er. Mine tal endte med at være:
Modeline "1600x1200"   210.00   1600 1624 1664 2080   1200 1220 1260 1264
I de første forsøg, var tallene nogen andre. Man prøver simpelthen bare at sætte nogen tal ind, starte X, se på billedet. Det vil - mindre man er _rigtigt_ heldig - være fuldstændigt skævt justeret. Det skal man bare tage stille og roligt, og skippe videre til næste og sidste lille afsnit.

6. Brug xvidtune programmet til at justere billedet ind

Programmet xvidtune kan bruges til at justere disse sidste tal ind. Hvis man har fået gættet sig til nogen værdier der er så tæt på de rigtigt, at man kan se hvad der står på skærmen (eller bare noget af skærmen), kan man starte xvidtune. Her kan man så skrue op og ned for de forskellige værdier, og se resultatet med det samme. Efter 5 minutter med dette program havde jeg et skærmbillede der stod rigtigt. Man kan så bede xvidtune om at skrive ens modeline ud, og herefter er det jo bare at cut'n'paste den ind i /etc/X11/XF86Config.

Det endelige resultat:

En båndbredde på 210 MHz med en horisontal dot-clock på 2080, giver
   (båndbredde) / (horiz. dot-clocks) = (horizontal sync.)
   (210 * 10^6) / (2080) = 100.96 KHz
Og 210 MHz fordelt på 2080 * 1264 dot-clocks giver en total opdateringsfrekvens på:
   (båndbredde) / ((horiz. dot-clocks) * (vert. dot-clocks)) =
   (refresh)
   210 * 10^6 / ( 2080 * 1264 ) = 79.87 Hz
Så alt i alt fik jeg sat en opløsning op der giver:


Rigtig god fornøjelse!


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2004-03-07, 21:25 CET .
 

Siden vedligeholdes af Jakob Østergaard (<jakob@sslug.dk>).

$Revision: 1.2 $