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:
- Opfind et navn til den nye modeline
- Bestem horisontal og vertikal opløsning i pixels
- Indsæt båndbredde
- Beregn højde/bredde i dot-clocks
- Gæt på nogen værdier for timing af skærmens CRT
- Brug xvidtune programmet til at justere billedet ind.
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:
- 1600x1200 pixels
- 79.87 Hz refresh
Rigtig god fornøjelse!
 |
 |
 |
| |
|
|
 |
| |
|
Fel och synpunkter angående webb-sidorna skickas till <www_admin>.
|
Senaste ändring
2004-03-07, klockan 21:25
.
|
|
|
 |
 |
 |
Siden vedligeholdes af Jakob Østergaard (<jakob@sslug.dk>).
$Revision: 1.2 $