FrameBuffer

Słowo Wstępu
Jądro Linux oferuje użytkownikowi wiele różnych sposobów na zwiększenie parametrów wyświetlanego obrazu. Jednym z tych sposobów jest użycie framebuffera. W niniejszym tekście opisałem jak go uruchomić, jak zwiększyć jego wydajność, jak poradzić sobie z problemami, oraz jak wyświetlić kolekcję zdjęć czy wreszcie jak obejrzeć film.

Co to jest
Framebuffer, czyli bufor ramki, jest chyba najprostszym w konfiguracji, a przy tym dającym niezłe efekty, sposobem wyświetlania grafiki w terminalu tekstowym (można go również użyć do uruchomienia serwera X, opis znajdzie się w jednej z kolejnych części). Jest obsługiwany przez dużą ilość kart graficznych, jednakże jego wydajność, w porównaniu do innych sposobów wyświetlania grafiki w terminalu, jest mała, niemniej jednak czasami wystarczająca.

Technikalia
Framebuffer jest abstraktem sprzętu obsługującego grafikę. Reprezentuje on sprzętowy bufor ramki, oraz umożliwia aplikacjom dostęp do niego poprzez dobrze zdefiniowany interfejs, tak aby program nie musiał komunikować się z układem graficznym za pomocą niskopoziomowych funkcji. [ za Geertem Uyterhoenem z framebuffer.txt ze żródeł kernela ]

Włączenie obsługi

[ UWAGA!: FrameBuffer (vesafb) na platformę i386 dostępny jest począwszy od kernela w wersji 2.1.107 ]

Żeby móc zacząć używać bufora ramki, należy najpierw wkompilować w jądro jego obsługę. W tym celu należy zaznaczyć w config (menuconfig, lub xconfig) opcje:

code maturity level options --> prompt for development and/or incomplete code/drivers'' (przypuszczalnie w przyszłych stabilnych gałęziach jądra nie będzie trzeba zaznaczać tej opcji)
,,console drivers --> Video mode selection support, Support for frame buffer devices, VESA VGA graphics console i opcjonalnie w zależności od sprzętu inne''.

Po wkompilowaniu w jądro obsługi framebuffera powinno się przekazać kernelowi opcję vga=xxx, gdzie xxx jest liczbą określającą tryb graficzny, w którym chcemy uruchamiać system, jeśli natomiast używa się lilo, to zamiast pisać append="vga=XXX", można użyć opcji vga=YYY bezpośrednio w lilo. Oto tabele, które powinny ułatwić nieco to zadanie. (Właściwie są one tylko przydatne kiedy używa się vesafb) Parametry VGA jądra:

   Głębia   640x400 640x480 800x600 1024x768 1152x864 1280x1024 1600x1200
  --------+--------------------------------------------------------------
   4 bits |    ?       ?     0x302      ?        ?        ?         ?
   8 bits |  0x300   0x301   0x303    0x305    0x161    0x307     0x31C
  15 bits |    ?     0x310   0x313    0x316    0x162    0x319     0x31D
  16 bits |    ?     0x311   0x314    0x317    0x163    0x31A     0x31E
  24 bits |    ?     0x312   0x315    0x318      ?      0x31B     0x31F
  32 bits |    ?       ?       ?        ?      0x164      ?
Ustawienia VGA w lilo.conf:
   Głębia   640x480 800x600 1024x768 1280x1024
  --------+-----------------------------------
   8 bits |   768     771      773      775
  15 bits |   784     787      790      793
  16 bits |   785     788      791      794
  24 bits |   786     789      792      795

Po przeładowaniu komputera, system powinien się uruchomić w nowejwej rozdzielczości a w lewym, górnym rogu powinno się pojawić logo, które sobie ustawiliśmy. Ustawianie logo opisane jest niżej.

Dostrajanie
Framebuffer vesafb, czyli domyślny jakiego używa jądro zaraz po włączeniu obsługi, ma bardzo małe możliwości. Jest bardzo powolny, ale przede wszystkim, nie można zmienić wartości odświerzania ekranu. Można poprawić te osiągi, ale w tym celu należy użyć framebuffera, który jest dostosowany do posiadanej karty:
-> matroxfb (karty mystque, millenium, G100/G200, od 2.1.127)
-> pm2fb (permedia 2, od 2.2.0-final)
-> atyfb (różne karty ati, od 2.1.91)
-> radeonfb (różne radeony od 2.4.2-ac7)
-> rivafb (różne karty nVidii, w tym GeForce, tylko dla jąder powyżej 2.3.25)
-> tdfxfb (karty 3dfx, od 2.3.21)
i kilka innych. Najlepiej spradzić jakie są dostępne podczas kompilacji własnego kernela. Po wkompilowaniu w jądro odpowiedniego bufora ramki, należy przekazać jądru aby go użyło. Robi się to podając przy bootowaniu argument "video=". Można to zrobić odpowiednio modyfikując plik /etc/lilo.conf.
Np. video=rivafb odpowiada wpisowi w lilo.conf append = "video=rivafb"
Zmiana rozdzielczości, oraz odświerzania ekranu, jest o wiele prostsza i mniej wymagająca. Do tego celu należy użyć programu fbset.

FbSet
FbSet jest programem do sterowania urządzeniem /dev/fbX (gdzie X jest liczbą naturalną) odpowiedzialnym za działanie bufora ramki. Można za jego pomocą zmienić właściwości wyświetlanego obrazu, takie jak odświerzanie, czy rozdzielczość. Program FbSet potrafi dokonywać zmian w ,,locie'' bez konieczności przeładowywania systemu.
Użycie tego programu nie powinno nastręczać żadnych problemów. W pliku /etc/fb.modes mamy predefiniowane ustawienia rozdzielczości i odświerzania ekranu. Warto sobie przejrzeć ten plik i wybrać z niego odpowiadający nam tryb. Nazwy trybów umieszczone są w cudzysłowiach.
Przykład:
Wybieramy ustawienie "1024x768@100" czyli rozdzielczość 1024x768 z poziomym odświerzaniem obrazu o częstotliwości 100MHz.
# fbset -n -v "1024x768@100" Monitor powinien się natychmiast przełączyć w nowy tryb. Inna przydatna opcja tego programu to # fbset -s , która pokazuje tryb, w którym działa obecnie terminal. Należy pamiętać, że fbset w połączeniu z vesafb może nie dać (i zapewne nie da) żadnych efektów. vesafb jest buforem ramki, który ma obsługiwać jak największą ilość kart w standarcie VESA 2.0, dlatego też jest mało wydajny.

A co jeśli nie mam /etc/fb.modes?
Wtedy pozostaje użycie programu FbModes, (albo przeczytanie Framebuffer HOWTO) który generuje linie do pliku fb.modes, do TextConfig (dla STM), oraz do XF86Config (dla X). Na wskazanej stronie jest również prostsza w obsłudze wersja tego programu nazywająca się modetest. Np. ustawmy rozdielczość 1024x768 przy taktowaniu 100MHz:
# modetest -x1024 -y768 -r100 powinno zmienić parametry obrau na rządane przez nas. Jest to najprostsze możliwe użycie tego programu, może dać niezadowalające efekty, dlatego też należy zapoznać się z dokumentacją. (zasadniczo można ustalić jeszcze wycentrowanie obrazu, oraz odpowiednią ,,grubość'' brzegu). Można skorzystać z ,,online-demo'' aby wygenerować rządane modeline, pozostaje utworzenie pliku fb.modes (man fb.modes)

Mam już ModeLine, co dalej?
Po dopasowaniu rozdzielczości i odświerzania ekranu do swoich potrzeb, należy poinformować jądro, o chęci korzystania z niego. w tym celu należy przekazać parametr video=atyfb:1024x768@100. Nie na każdym framebufferze może coś takiego działać, jeśli jednak wszystko jest w porządku, można dopisać do /etc/lilo.conf append="video=atyfb:1024x768@100". Jeśli taki wybieg nie zadziałał i jądro nie chce zmienić trybu już przy samym starcie, to można dopisać odpowiednią linijkę wywołującą fbset, do któregoś ze skryptów startowych. Moim zdaniem powinno się to znajdować zaraz po zamontowaniu systemu plików, na którym znajduje się fbset.

Zmiana Logo
Zmiana Logo wiąże się z przekompilowaniem jądra, jednakże nie trzeba zmieniać nic w konfigu (dlatego najlepiej wczytać po prostu .config), a jedynie zmodyfikować plik /usr/src/linux/linux_logo.h. Można go zmodyfikować ręcznie, ale nie ma takiej potrzeby gdyż wystarczu użyć Plugin do Gimpa, który utworzy odpowiedni plik automagicznie. Jedynie potrzebny jest obrazek 80x80, w nie więcej niż 224 kolorach (format pnm). Plugin wykreuje odpowiedni plik, którym trzeba zastąpić oryginał, potem już tylko rekompilacja jądra i przy następnym uruchamianiu systemu w lewym górnym rogu pojawi się nowe logo. Jeśli nie ma możliwości użycia Gimpa, pozostaje skorzystać z tego programu, który skonwertuje logo z formatu PNM do źródeł w języku C, gotowych do włączenia w źródła kernela. Na tej stronie, jak i na stronie projektu FbSet, znajduje się kolekcja gotowych logo.

Zmiana kursora
FrameBuffer ma możliwość zmiany wyglądu i częstotliwości migania kursora, który pojawia się po znaku zachęty. Wygląd kursora opisuje sekwencja:
<\ESC>[?1;2;3c
Gdzie 1,2 i 3 to parametry opisane poniżej. Jeśli pominięty zostanie, którykolwiek z nich, zostanie mu przypisane domyślnie zero.

Parametr pierwszy opisuje rozmiar kursora (0=domyślny, 1=niewidzialny, 2=podkreślenie, ... , 8=pełny blok) do tego należy dodać: 16 - jeśli chce się korzystać z kursora programowego, 32 - jeśli zawsze chce się zmieniać kolor tła albo 64 - jeśli nie chce się takiego samego koloru tła i tekstu.

Drugi parametr określa bity atrybutów znaku, które chce się zmienić. Na standartowej karcie VGA cztery starsze bity określają tło, a cztery młodsze tekst. W obu przypadkach młodsze trzy bity określają kolor (normalne konsolowe kody), a najstarszy określa podświetlenie (lub migotanie na niektórych kartach VGA).

Trzeci z atrybutów, określa bity atrybutów znaku, które chce się ustawić. Ustawianie bitów ma miejsce, przed zmianą bitów, więc możesz po prostu wyczyścić bit, włączając go w zarówno masce ustawień, jak i zmian.

Przykłady:
$ echo -e '\033[?2c' Określa standartowe migające podkreślenie
$ echo -e '\033[?6c' Daje migający kursor blokowy
$ echo -e '\033[?17;0;64c' Daje niemigający czerwony kursor blokowy.
[ Wzięte z Framebuffer-HOWTO i przetłumaczone przeze mnie ]

Jak obejrzeć zdjęcia korzystając z fb?
FbI jest programem umożliwiającym oglądanie obrazków w formatach PhotoCD, jpeg, ppm, gif, tiff, xwd, bmp i png. Inne formaty są obsługiwane korzystając z zewnętrznych konwerterów (np. convert z pakietu ImageMagick).
Obsługa fbi jest banalnie prosta, np. aby obejrzeć pięcio sekundowy slideshow składający się z obrazków w katalogu ./images należy wywołać fbi tak: $ fbi -t 5 ./images/*

Jak zrobić screenshot'a?
FbGrab jest programem, który służy do odczytu urządzenia /dev/fbX i zapisu jego zawartości do pliku wyjściowego w formacie png. Programu tego można używać zarówno do robienia zrzutów ekranu pod konsolą, jak i pod X. Przykłady użycia:
$ fbgrab obrazek.png zrzuca ekran do pliku obrazek.png
$ cp /dev/fb0 fb.dump robi plik z zawartością fb0
$ fbgrab -w 1024 -h 768 -b 16 -f fb.dump fb.png robi z fb.dump obrazek o wymiarach 1024x768 i głębi kolorów 16bpp o nazwie fb.png

Jak obejrzeć film korzystając z fb?
Filmy pod konsolą można oglądać na wiele sposobów korzystając z niezawodnego MPlayer'a. Aby tego dokonać należy najpierw skompilować MPlayer'a z obsługą fb. W tym celu należy uruchomić skrypt configure z opcją --enable-fbdev (lub --enable-tdfxfb jeśli używa się tdfxfb) --enable-tdfxfb jeśli używa się tdfxfb), po czym należy wykonać pozostałą część instalacji zgodnie z instrukcją. Po zainstalowaniu odpowiednio spreparowanego odtwarzacza, film uruchamiamy z opcją -vo fbdev (framebuffer musi być uruchomiony w większej niż 8bpp głębi kolorów).

Jak oglądać strony WWW w trybie graficznym, mając fb?
Przeglądarki WWW, nie są niestety mocną stroną wirtualnych terminali. Istnieje wiele przeglądarek tekstowych, do których można ,,podpiąć'' programy do wyświetlania grafiki, ale to nie to samo, co ,,żywa'' grafika. Jest kilka świetnych przeglądarek, ale nie są doskonałe np. brak obsługi JavaScriptu. Dlatego też, najlepiej wyposażyć się w dwie przeglądarki, jedną niech będzie wspaniały elinks, który świetnie sobie radzi ze stronami tekstowymi, drugą zaś, niech będzie links2, który ma możliwość uruchamiania w trybie graficznym, z wyświetlaniem grafiki ,,w locie''. Links2 jak się domyślasz ma możliwość wykorzystania mocy bufora ramki. Aby uruchomić tryb graficzny można zrobić:
$ links2 -g -driver fb -mode 1024x768x16M32 www.tldp.org
albo
$ glinks -driver fb -mode 1024x768x16M32 www.google.com/linux
I możemy już oglądać nasze ulubione strony w pełenej grafice.


Łukasz Jarochowski (c)