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.