Poniższy tekst jest tak naprawdę tylko nieco zmienionym artykułem
<slrn.pl.b4qrdu.1m3.grzegorz@quatrin.pl>
Nie pisałem go na
potrzeby Repo, więc jego forma i wartość merytoryczna mogą być
nikczemniejsze niż w przypadku pozostałych tekstów. Jednak uważam STM za tak
interesujące narzędzie, że IMO każdy kawałek informacji na jego temat jest
przydatny.
Czym jest SVGATextMode (alias STM)?
Jest sposobem na zmuszenie karty graficznej do pracy w trybie tekstowym z niestandardową rozdzielczością tekstu. Nie używa przy tym gotowych, predefiniowanych w biosie karty trybów - zamiast tego przeprogramowuje kartę, używając niskopoziomowych poleceń SVGA. Jest alternatywą dla framebuffera, oferując wsparcie dla o wiele szerszej palety kart graficznych, oraz dodatkowo oferując lepszą wydajność. Na uwagę zasługuje także znaczna konfigurowalność - rozdzielczość można określić co do piksela, częstotliwości odświeżania również regulowane są płynnie.
Jak skonfigurować STM?
Trzeba wyłączyć framebuffer (czyli najnormalniej wykompilować go z jądra).
Potem należy przeedytować plik /etc/TextConfig. Przede wszystkim trzeba wybrać właściwy model karty. Do wyboru są różne karty na chipsetach S3, et4000, modele Ati, Cirrus, sis, et6000, matrox, GF i inne. Cała reszta prawdopodobnie zadziała na "zwykłym" driverze vga, jeśli nie wymaga jakiegoś specjalnego kombinowania. "Dedykowane" sterowniki istnieją albo dla kart które wymagają specjalnych trików (i nie działają z "generic vga"), albo dla kart które posiadają jakieś specjalne możliwości (np. ultra-szybki tryb tekstowy kart S3). To powinno być bardzo proste - znajdź swoją kartę, albo pozostaw "defaultową" starą, dobrą vga.
SVGATextMode nie ma specjalnych wymagań co do karty. Ba, jest nawet tak, że te starsze modele spisują się często dużo lepiej od nowomodnych wynalazków (ma to związek z ewolucją układów RAM na kartach graficznych, ale nie chcę teraz zagłębiać się w te nieistotne dla nas szczegóły). W każdym bądź razie - SVGATextMode działa na nieporównywalnie szerszej palecie kart niż framebuffery i jest w każdym przypadku szybsze. Przeprowadzałem kiedyś kilka testów i np. mój akcelerowany framebuffer matroksa, przy maksymalnym "tuningu" i tak był praktycznie 2x wolniejszy od identycznego trybu w SVGATextMode. A po wyłączeniu akceleracji (co równa się mniej-więcej "wydajności" vesafb, który to framebuffer w ogóle nie jest akcelerowany) przewaga SVGATextMode wzrosła do... uwaga, uwaga... proporcji 3.3 na 25.3. To oznacza blisko ośmiokrotny(!) wzrost wydajności trybu tekstowego. Myślę, że dla takiej różnicy warto jest trochę pogrzebać. Poza tym, zyska się niesamowite możliwości "dostrojenia" ekranu do możliwości sprzętu, możliwości których nie oferują często nawet najlepsze framebuffery.
Dobrze, ale wróćmy do konfiguracji. Mamy już wybrany nasz model karty. Potem należy z pewnością ustawić parametry monitora (tak jak w XF86Config), czyli wartości HorizSync i VertRefresh.
Oprócz tego można poustawiać parę innych rzeczy, często zależnych od karty. Np. jakieś lekkie przetaktowanie zegara pamięci lub inne drobiazgi. Warto zwrócić też uwagę na ustawienie DacSpeed - jest ono w 90% przypadków ustawione zbyt konserwatywnie - czyli zbyt nisko - hamując możliwości karty. Więc zwykle należy podnieść maksymalną dopuszczalną DacSpeed.
85% pliku TextConfig stanowią definicje trybów tekstowych. Definicje te wyglądają zupełnie jak wpisy Modeline w XFree86. Tyle tylko, że na końcu mają jeszcze doklejony dodatkowy parametr - wielkość fontu, jakiego należy użyć.
I teraz: można zupełnie spokojnie spocząć na laurach i użyć któregoś
z "domyślnych" trybów - jeśli mamy już poprawnie skonfigurowaną kartę
graficzną i parametry monitora wystarczy wpisać
SVGATextMode -s
Program przeskanuje wtedy bazę danych trybów i wypisze na ekranie te tryby,
które fizycznie pasują do zadeklarowanych opcji. Może być tego sporo, więc
dobrze jest to puścić do jakiegoś pliku lub na "less". Trzeba
tutaj zwrócić uwagę na parametr "CharCell" - jest to wielkość jednego
znaku w foncie.
Domyślny rozmiar linuksowego fontu to 8x16 i zapewne tylko takie tryby będą
nas interesowały - chyba że mamy też fonty innych rozmiarów. Ale załóżmy, że
nie chcemy jeszcze aż tak bardzo mieszać i będziemy używać tylko fontów
8x16.
Nazwa trybu to, standardowo, rozmiar ekranu jaki uzyskamy (w znakach). Podczas gdy framebuffer operuje trybem graficznym, np. 1024x768, w SVGATextMode używa się raczej określeń "80x25" lub "140x60".
Załóżmy, że znaleźliśmy sobie jakiś tryb. O, powiedzmy że będzie to tryb standardowo określony jako "A128x48" - jest to tryb 1024x768, przy zacnej częstotliwości odświeżania. Używa fontu 8x16, rozmiar ekranu to będzie równe 128x48 znaków. Jak go włączyć? Proste. Wystarczy uruchomić SVGATextMode A128x48 ...i wszystko powinno się "zrobić". Teraz może wystąpić jedna z 3 rzeczy:
a. SVGATextMode poczęstuje nas jakimś komunikatem o błędzie w pliku konfiguracyjnym.
W zasadzie to ew. błędy powinny nam się objawić już przy "SVGATextMode
-s", ale... Najczęstsze błędy dotyczą zapewne konfiguracji karty, nie wolno
zapomnieć o tym, że tylko jeden układ karty może być "włączony"
w TextConfig. Pozostałe powinny być zahashowane. Jeśli włączamy jakiś
dedykowany układ, to musimy wyłączyć domyślny "vga". Ale te problemy są
zwykle bardzo proste do usunięcia, bo SVGATextMode zawsze mówi co mu nie
pasuje. Więc nie ma sprawy.
Rozwiązanie: Poprawiać składnię TextConfig, aż do skutku.
b. Ekran się przełącza, ale...
No właśnie. Kaszana na ekranie, śnieg, obraz rozsynchronizowany, co
lepsze monitory wyłączają się, ogólnie tak jakoś nieswojo się czujemy.
Dobra, najwyraźniej przesadziliśmy z możliwościami monitora. Trzeba wrócić
do "normalnego" trybu - standardowo wystarczy wklepać na ślepo
"SVGATextMode" i klepnąć <Enter> - SVGATextMode wywołane bez
parametrów ustawia tzw. "domyślny tryb", który to tryb standardowo
ustawiony jest na "bezpieczne" 80x25.
Rozwiązanie: Zmniejszyć deklarowane możliwości monitora, wybrać inny,
mniej wymagający tryb.
A, istnieje tu malutka możliwość zawieszenia systemu. Nie widziałem osobiście nigdy by coś takiego się stało, a widziałem sporo kart, ale wiadomo - licho nie śpi. Dlatego też STM przy przełączaniu trybów uruchamia "sync". Jeśli by się coś stało, to przynajmniej nie będzie uszkodzeń filesystemu po wymuszonym resecie.
c. W zasadzie to wszystko działa poprawnie
Czy to możliwe? Nie wiem, może niektórzy szczęściarze już za pierwszym
podejściem się "ustawią". Załóżmy jednak bardziej prawdopodobny bieg
wydarzeń: Owszem, tryb się włącza i w ogóle, ale np. odświeżanie jest zbyt
niskie albo ekran jest tragicznie przesunięty w którąś stronę. Albo jest
zbyt mały, albo wyłazi za monitor.
Rozwiązanie: zdefiniowanie własnego trybu.
Definiowanie własnego trybu:
I tutaj dochodzimy do prawdziwego sedna sprawy - do wyrzeźbienia sobie idealnego trybu. Nie, to nie jest konieczne. Duża ilość ludzi będzie zadowolona mogąc sobie poprzełączać między gotowymi trybami które przychodzą z STM. Ale niektórzy będą chcieli dostosować obraz, choćby przez podniesienie częstotliwości, albo zechcą użyć ekranu o niestandardowych wymiarach.
Definiowanie własnego trybu jest proste. Tzn. nie jest czymś banalnym, co każdy linuksiarz robi od niechcenia przy śniadaniu, ale jak już powiedziałem - tryby STM są identyczne z trybami XFree. Więc można je wymieniać. Oczywiście tryby STM posiadają dodatkowe pole opisujące wymiary fontu, ale to nie ma znaczenia.
Oznacza to, że możemy wziąć jakiś tryb z XF86Config, dokleić do niego "... font 8x16", nadać mu jakąś nazwę, wrzucić do TextConfig i użyć jako trybu tekstowego. W sumie bardzo proste, w końcu większość ludzi ma już jakieś dopasowane tryby X-ów. Jednak nie sądzę by tryby X-ów nadawały się do pracy w trybie tekstowym, tak jak nie nadają się do tego zresztą i "domyślne" tryby framebuffera, takie jak "800x600" czy "1024x768". A dlaczego tak sądzę? Bo znaki na ekranie mają fatalne proporcje. IMO przynajmniej. Tekst to tekst, litera powinna być wyższa niż szersza, a niestety "domyślne" tryby oferują literki ciut za szerokie jak na mój gust. Więc ja i tak skończyłem wyliczając własny tryb.
No ale najpierw załóżmy, że podoba się nam jakiś tryb tekstowy, ale jest np. przesunięty w lewo. I że trybem tym jest "116x30x8". Jak już dwa razy wspomniałem, STM ma tryby w dużej mierze kompatybilne z tymi X-ów. Zależność jest obustronna. Więc można tryb STM podłożyć do XFree86. Nasz badany tryb jest w TextConfig zdefiniowany jako "116x30x8" 36 928 944 1088 1144 480 490 492 525 font 8x16 Po zamianie na klasyczny "modeline" jego wpis w XF86Config wygląda tak: Modeline "116x30x8" 36 928 944 1088 1144 480 490 492 525 (jak widać jedyne co zrobiłem, to odciąłem końcówkę "font ...")
Teraz ustawiam X-y tak, by korzystały domyślnie z trybu "116x30x8", czyli po prostu z trybu 928x480. Po uruchomieniu X-ów w tym dziwacznym trybie używam xvidtune żeby przesunąć obraz, poprawić jego wymiary itp. I xvidtune podaje mi nowy Modeline tego trybu. Wiadomo, znana wszystkim procedura.
Teraz mogę ten Modeline z powrotem przekształcić na format TextConfig, dodając ten kawałek "font ...". Po wklejeniu tego z powrotem do TextConfig powinienem już mieć bardzo ładnie wypozycjonowany tryb na monitorze. I to wszystko bez dotykania "pokręteł" samego monitora. Czyli sukces :)
A teraz przejdźmy do manipulowania odświeżaniem. Zapewne czeka nas taka sama zabawa jak z pozycjonowaniem ekranu (czyli xvidtune), z tym że możemy użyć dodatkowych programów z pakietu SVGATextMode: programy te to "grabmode" i "ClockProg". Obydwa należy uruchamiać z uprawnieniami roota.
"grabmode" postara się "wyczuć" tryb w jakim pracuje aktualnie karta graficzna i wyświetli te parametry jako gotową linijkę do wpisania w TextConfigu. Działa, co ciekawe, również pod X-ami i framebufferem. Czasem zawodzi, ale w końcu nikt nie jest idealny. "grabmode" można użyć by przekonać się, z jakim odświeżaniem mamy akurat do czynienia.
"ClockProg" to program do zmieniania odświeżania. Sposób użycia jest prosty, np. ClockProg -m = 80 ustawi odświeżanie na "80". Proponuję podnosić odświeżanie o niewielkie wartości, powiedzmy "5" czy nawet "1". Czyli najpierw 65, potem 70, potem 75, potem 80... ups, zniknął obraz... no to "na ślepo" wpisujemy "ClockProg -m = 75", a potem posuwamy się do przodu o "1".
Możemy tego programu używać również pod X-ami. Co ma swoje zalety, bo jeśli przestawimy odświeżanie o dużą wartość, to obraz może zmienić swoje drugorzędne właściwości - rozmiar, położenie, itp. I w X-ach można to szybko skorygować za pomocą xvidtune. Gdy już mamy wymarzone (lub najwyższe możliwe) odświeżanie i idealne położenie na ekranie wystarczy kazać xvidtune wydrukować aktualną modeline i, po przeróbkach, wklepać ją do TextConfig. Albo użyć grabmode i wpisać to, co on powie. Zwykle nie robi to różnicy.
I teraz zostaje nam tylko trzecia możliwość: własnoręcznie zaprojektowana rozdzielczość. Czyli własne wymiary. To ten najbardziej mroczny kawałek...
Po pierwsze, trzeba wiedzieć jaką rozdzielczość chce się osiągnąć. Załóżmy że ma to być 120x40 znaków. Czemu akurat tyle? Bo ja mam tyle :)
Po drugie, musimy się zdecydować na jakiś font. Dobra, niech będzie standardowy - 8x16. Jaki tryb będzie nam potrzebny? Proste - wystarczy przemnożyć wielkość fontu przez ilość znaków. (120x40)x(8x16) = (120x8)x(40x16) = (960)x(640) = 960x640 (nie, nie pytajcie gdzie uczyłem się mnożenia ;)
Więc potrzebny nam będzie taki tryb. Teraz, jeśli ktoś jest bardzo mądry i zna się na monitorach, może sobie na kartce papieru od razu napisać odpowiednią modeline. Jeśli ktoś się tym nie interesuje, to może skorzystać z któregoś z programów do wyliczania trybów dla XFree86. A jeśli ktoś woli metodę chałupniczą, to może wziąć jakiś istniejący, zbliżony tryb (np. 800x600) i odpowiednio pozmieniać cyferki w Modeline. Generalnie taka modeline ma postać r x1 x2 x3 x4 y1 y2 y3 y4 gdzie "r" to odświeżanie, x1 to "normalna" szerokość w pikselach, a x2, x3, x4 to liczby stopniowo coraz większe od x1. Relacje między x-ami decydują o przesunięciu obrazu, długości tzw. "scanline", fragmentach "rozbiegowych" dla wiązki w kineskopie, etc. Ze zmiennymi "y" jest tak samo - y1 to "normalna" wysokość, a każdy następny "y" jest trochę większy.
Zdolny linuksiarz-chałupnik jest w stanie napisać taki modeline przez analogię, patrząc na jakieś gotowe i wymyślając sobie cyferki. Warto też "r" zmienić na jakieś prawdopodobne w tym trybie odświeżanie. Jeśli tryb jako-tako da się uruchomić (tzn. będzie coś widać), to dalej xvidtune i po sprawie.
Hej, to może się wydać śmieszne (pisanie modeline "na głupa"), ale jest bardzo proste i zadziwiającym zbiegiem okoliczności osiągałem tym sposobem zawsze dobre wyniki. Oczywiście lepiej jest po prostu zrozumieć na czym polegają różnice między x1 a x2, x3 itp. Wystarczy poszukać jakiegoś "howto" opisującego X-owe modeline. Osoba naprawdę rozumiejąca o co biega nie potrzebuje podpierać się wynalazkami w stylu xvidtune - potrafi skorygować obraz po prostu zmieniając odpowiednie cyferki.
No dobra, to by chyba było na tyle - więcej magii w tym nie ma. Tak, wiem, poziom tego artykułu jest niski i od samego początku ustawicznie spadał, a pod koniec stuknął o dno. Ale to taki fajny temat, że nie mogłem się powstrzymać.
Końcowy tuning
Sync
Jeśli ma się już ładny, działający tryb, to warto wyłączyć w TextConfig
wyświetlanie głupich komentarzy i uruchamianie "sync".
DefaultMode
Można też nasz Nowy Ulubiony Tryb oznaczyć jako "DefaultMode", wtedy
wystarczy uruchomić samo "SVGATextMode", bez parametrów, aby ustawił się
ten tryb.
Oczyszczanie TextConfig
Tryby które nas nie interesują, karty których nie mamy, głupie
komentarze itp. można bez skrupułów usunąć z TextConfig. Zyskuje on wtedy na
przejrzystości. A, ale na wszelki wypadek lepiej zostawić sobie definicję
trybu 80x25. Nigdy nic nie wiadomo... ja mam tylko 2 tryby w TextConfig:
120x40 i właśnie ten "domyślny" 80x25.
Fonty
Domyślny rozmiar fontu to 8x16 pikseli. Ale istnieją inne fonty, np.
12x22. Generalnie to jest tak, że im większy font tym mniej tekstu się
mieści na ekranie. Ale jeśli mamy pod ręką dobry font o większych rozmiarach
(trudne jeśli jest się Polakiem - niewiele fontów w ogóle ma poprawne
pliterki) i na dodatek możemy zmusić monitor do jeszcze wyższej
rozdzielczości, to zamiast trybu 960x640 przy foncie 8x16 mogę użyć fontu
12x22 w rozdzielczości 1440x880. Dobra, to przesadzony przykład, ale chodzi
o to że podnosząc rozdzielczość i używając większego fontu nie zmienia się
rozmiar ekranu w znakach, ale tekst zaczyna wyglądać o niebo lepiej. Ja nie
mogę sobie na to pozwolić, nie na moim archaicznym monitorze. Ale widziałem
kiedyś tak "podkręconą" maszynę - niesamowite. Niby tryb tekstowy, ale od
razu widać że jakiś taki ładniejszy.
Ale to, jak mówię, dotyczy tylko ludzi którzy bez problemu mogą sobie wrzucić rozdzielczość o ileś tam procent wyższą i nawet tego nie zauważą. Albo ludzi którzy mają ekran LCD, i zmienianie rozdzielczości nie jest tak proste jak w CRT - oni mogą manipulować wielkością fontu by osiągnąć właściwy rezultat.
Temat wiązany: ładowanie fontu
STM potrafi to robić, w sumie to jedynie wywołuje inny program...
W TextConfig podaje się ścieżkę do fontów, program do ustawiania fontu,
i mapowania pomiędzy wielkością fontu (określaną w modeline trybu) a nazwą
pliku z fontem do załadowania.
STM może przełączać tryby w locie i niektóre tryby mogą wymagać dziwnych fontów. Więc STM może przy przełączeniu od razu załadować odpowiedni font, tak żeby admin nie musiał się o to troszczyć. Czasem jest to nawet konieczne, np. opcja "S3HSTEXT" wymusza takie postępowanie.
Ja mam automatyczne ładowanie ustawione, ale tylko z wygodnictwa. Po prostu uruchomienie STM przy starcie ustawia mi ekran i od razu ładuje polski font.
Uruchamianie STM
Należy to po prostu wpisać sobie gdzieś do sekwencji startowej,
najlepiej jak najwcześniej. Gdzieś w rc.sysinit lub jego odpowiedniku, tak
żeby jak najwcześniej ekran przełączył się w "lepszy" tryb pracy.
Dodatkowe drobiazgi
Można sterować położeniem kursora. Normalnie jest on podkreśleniem, ale
można kazać mu pojawiać się w połowie wysokości literki, albo nawet nad nią.
Nieprzydatne, ale jest.
Można sterować wysokością kursora. Można go uczynić nieco wyższym, można nawet zrobić z niego "block cursor". Nieprzydatne, ale tutaj muszę dodać: IMO.
Można włączyć kolorową ramkę która otoczy normalny, "tekstowy" obraz. Przydatne przy konfigurowaniu ekranu, bo wyraźnie widać wtedy co jest "ekranem", a co "marginesem".
Overclocking monitora
Można próbować podciągnąć monitor powyżej tego, co mówi instrukcja.
Taaa, stare monitory (bardzo stare) mogą tego nie przeżyć. Monitory niskiej
jakości pewnie i tak mają naciągane parametry w instrukcjach. Ale markowe
monitory często mają pewien margines możliwości powyżej swoich
"oficjalnych" umiejętności. Np. może się okazać że HorizSync może być
wyższy o 15, a VertRefresh o 10. Ale jeśli nie ma potrzeby, to nie radzę
doprowadzać monitora do pracy poza "granicami przyzwoitości". Na części
monitorów taka praca objawia się pogorszeniem jakości obrazu - po powrocie
do "niższych" parametrów obraz zyskuje czasem na ostrości itp. Czyli
- poznaj swój monitor.
Delikatna ingerencja w kernel
Można poprawić kod jądra. Plik linux/drivers/video/vgacon.c,
trzeba znaleźć linijki "#define CAN_LOAD_EGA_FONTS" oraz
"#define CAN_LOAD_PALETTE" i gdzieś w ich okolicy (np. pod nimi)
dopisać
#define VGA_CAN_DO_64KB
i zrekompilować jądro. Dzięki temu sporo zwiększy się "bufor historii"
dostępny pod Shift-PgUp/Shift-PgDn. Ten trik nie daje nic framebufferom, ale
"zwykłym" vt (a więc i STM) dodaje uroku :)