Inhalt
Inhaltsverzeichnis
Was ist ein Framebuffer ?
Der Framebuffer ist eine Methode, unter Linux die Grafikkarte (genauer gesagt: den Grafikspeicher) anzusprechen.
Das Besondere an dieser Methode ist, dass dazu nicht ein spezieller, an die Grafikkarte angepasster X11-Treiber verwendet wird, sondern dass der Grafikspeicher über Dateioperationen zugänglich wird und der Videospeicher mit open(), read() und write() wie eine Datei behandelt werden kann.
Dazu muss im LinuxKernel der Framebuffer-Treiber aktiviert sein, so dass die Funktionalität über das Device /dev/fb0 zur Verfügung steht.
Für die meisten neueren Grafikkarten (mit VESA-BIOS >=2.0) kann dazu der VESA-Framebuffer-Treiber verwendet werden, falls nicht ein spezieller zur Verfügung steht.
Ist der Framebuffer-Treiber in den Kernel einkompiliert und wird eine entsprechende Kernel-Option angegeben, so startet der Kernel von Anfang an in einem Framebuffer-Modus. D.h. die normale Textkonsole beim Hochfahren des Systems hat eine höhere Auflösung. Hierdurch wird die Übersichtlichkeit auf der Konsole (bei einem entsprechend großen Bildschirm) stark verbessert. Erkennbar ist dieser Modus am Pinguin-Bild (übrigens pro Prozessor ein Tux ), das zu Beginn des Boot-Vorgangs oben links erscheint. Eine solche Grafik ist im "echten" Textmodus natürlich nicht möglich. Diese grafischen "Textmodi" sind zwar etwas langsamer als ein richtiger Textmodus, aber meist noch deutlich schneller als ein "richtiger" Grafikmodus.
Der Wechsel in den Framebuffer-Modus zu einem späteren Zeitpunkt ist oft nur schwer möglich. Der am allermeisten genutzte VESA-Framebuffer-Treiber erlaubt dieses auf jeden Fall nicht, da die Umschaltung der VESA-Modi nur im Real-Mode, d.h. vor dem Starten des Kernels, möglich ist. Andere Framebuffer-Treiber erlauben evtl. auch eine Umschaltung zwischen Textmodus und Framebuffer.
Nicht zuletzt hat der Framebuffer auch dem Einsatz von Linux in sogenannten EmbeddedSystems den Weg geebnet.
XFree86 kann auch auf ein Framebuffer-Device zugreifen, falls kein passenderer Treiber zur Verfügung steht. Auch Programme, welche auf der Bibliothek SDL basieren, können auf Framebuffer-Devices ausgeführt werden.
Der Framebuffer ist oft auch die einzige Möglichkeit, eine grafische Ausgabe auf Nicht-x86-Systemen zu produzieren. In vielen Fällen ist es sogar die einzige Möglichkeit, überhaupt eine Ausgabe auf den Bildschirm zu bekommen, da solche Hardware gar keinen VGA-Modus kennt.
Der Multimedia-Player MPlayer kann übrigens direkt auf den Framebuffer zugreifen.
DirectFB
Mit DirectFB steht eine Bibliothek zur Verfügung, mit der Anwendungen sehr einfach auf den Framebuffer zugreifen können. Die GTK-Bibliothek wurde bereits auf diese Schnittstelle portiert. Mit XDirectFB existiert ein X-Server, der es erlaubt, normale X-Anwendungen neben echten DirectFB-Anwendungen darzustellen. OpenGL mit Software-Rendering über Mesa ist auch möglich.
Linux Framebuffer-Treiber
Der Linux-Kernel24 unterstützt u.a. folgende Chipsätze/Grafikkarten:
alle Karten mit VESA-Bios-Extension (VBE) >= 2.0
- NVidia-Karten
matroxfb: Matrox Millenium I/II und alle Gxxx, auch als DualHeadGrafikKarte und mit Tv-Ausgang (je nach Modell)
- ATI Rage128, Mach64, Radeon Serie (7000,7500,8500...)
- radeonfb
- diverse SIS
- 3Dlabs Permedia 2/3
- diverse Amiga
- Acorn VIDC und ARM
- Cybervision64/3D
- Netwinder Grafik
- diverse Cirrus Logic
- S3 Trio
- 3Dfx Voodoo, Voodoo 3/Banshee
- Trident Blade
- DECstation
- Hercules Monochrome (MDA)
Für genauere Informationen, sollte man sich unbedingt die Informationen bei der Kernel-Konfiguration und die Texte in Documentation/fb/ durchlesen.
Aktivierung & Konfiguration
Leider sind die Parameter für die Video-Modi für den Framebuffer-Treiber nicht einheitlich. Siehe auch TextModus.
VESA-Treiber
Dieser Treiber ist sehr stabil und dürfte am meisten verwendet werden. Man kann ihn allerdings nur während des Bootens einrichten. Nachträgliche Änderungen der Auflösung etc. sind nicht möglich. (Das liegt nicht an Linux, sondern am VESA-Bios.)
Dem Kernel muss man den Parameter vga=<modus> angeben. Wie das geht, hängt vom eingesetzten BootLoader ab.
<modus> ist
Farben\Auflösung |
640x480 |
800x600 |
1024x768 |
1280x1024 |
256 |
0x301 |
0x303 |
0x305 |
0x307 |
32k |
0x310 |
0x313 |
0x316 |
0x319 |
64k |
0x311 |
0x314 |
0x317 |
0x31A |
16M |
0x312 |
0x315 |
0x318 |
0x31B |
Der Wert kann/muss je nach BootLoader hexadezimal oder dezimal angegeben werden. Weitere Einstellungmöglichkeiten sind in Documentation/fb/vesafb.txt beschrieben.
Links
ToDo: Text hier unten in verständliches Deutsch übersetzen und oben mit einpflegen
Vesa Framebuffer
Mit dem vesafb-Modul kann man TV gucken in der Console (Text-Modus).
VESA ist eine Norm für Grafikmodi, allerdings werden nur die neuen Vesa2.0 kompatiblen Grafikkarten unterstützt, die Vesa1.2 Karten nicht mehr. Wenn ab Kernel 2.2.x vesa läuft, kann man dem XFree86 das als vesafb-Karte angeben, dann läuft die grafische Oberfläche X auch damit und man muss den Typ seiner Grafikkarte gar nicht genau wissen. Vesa ist aber immer nur 60Hz. /etc/X11/XF86Config[-4] kann man auch von Hand bearbeiten, falls man vesafb für X nehmen will, damit laufen fast alle Notebooks.
Es gibt auch noch "echte" FrameBuffer, die auf einen bestimmten Grafikchip angepasst sind, dann wird vesafb nicht benötigt. Der Vorteil dieser Framebuffer ist, dass sie den ganzen Speicher der Grafikkarte benutzen, wohl etwas schneller sind und man die Auflösung im Betrieb mit fbset verändern kann - die möglichen Angaben stehen dann unter /etc/fb.modes. z.B. fbset 800x600-75 ist 800x600 mit 75Hz. Ich empfehle aber, "man fbset" einmal zu lesen.
Server: Auf einem Server sollte man aber kein Vesa oder Framebuffer benutzen. Einige machen das, nur damit sie 80x50 Textmodus haben - diesen Leuten empfehle ich aber, nur die Console-Fonts zu ändern, das ist für 80x50 besser und schneller. Mit Framebuffer sind auch schon einige Hänger des Systems festgestellt worden, beim Umschalten von X nach Console mit ALT+CTRL+F1 bis F3 - darum ist es nichts für den Server. Ich empfehle sogar, zu kontollieren, ob im Kernel "Experimental Framebuffer" eingeschaltet ist, und jenes gegebenfalls zu deaktivieren! Letzteres ist *zwingend für Server*.
Kernel-Optionen für Vesa
Für die Einrichtung des Vesa-Modus muss man selber die Kernelquellen installiert haben, diese sind üblicherweise in /usr/src/linux installiert. /usr/src/linux ist meistens ein Link zu der aktuell installierten Kernelquelle. Wie man Kernel baut, liest man am besten unter den HOWTOs und FAQs von seiner Distribution nach.
Kommandos, um an die Konfiguration zu kommen: cd /usr/src/linux dann make xconfig
Damit man mit vesa auch den Kernelboot sehen kann, muss alles fix in den Kernel einkompiliert werden, keine Module!
Menu: Code maturity level options
[y] Prompt for development and/or incomplete code/drivers
Menu: Console Driver
[y] VGA text console
[y] Video mode selection support
[y] Support for frame buffer devices
[y] VESA VGA graphics console
[y] VGA 16-color graphics console
[y] Advanced low level driver options
wer will [y] 2 bpp packed pixels support
wer will [y] 4 bpp packed pixels support
[y] 8 bpp packed pixels support
[y] 16 bpp packed pixels support
[y] 24 bpp packed pixels support
[y] 32 bpp packed pixels support
[y] Select compiled-in fonts
[y] VGA 8x8 font
[y] VGA 8x16 font
Diverses & TIPS
Bei Debian ist vesafb fest in den Kernel kompiliert. Wird also nicht als Modul nachgeladen. Wird automatisch geladen mit Bootparametern wie vga=791. Aber die grafikkarten-spezifischen Framebuffer sind als Module vorhanden. Wer das für lilo vga= will, muss es aber fix einkompiliert haben und nicht als Modul. Die neue 2.4.20 Kernel-Images kommen auch mit vesafb daher, für server würd ich's ausschalten. ("Experimental Framebuffer" auf "no" setzen im Kernel)
Es gibt Programme, mit denen man natürlich dann auf Console TV und divx gucken kann z.B.: fbtv und mplayer
Einen Screenshot der Konsole kann man z.B. mit "cp /dev/fb0 file" erstellen.
Dann gibt es auch noch die Möglichkeit, große Anwendungen in der Console laufen zu lassen wie Mozilla/Netscape etc. - ohne grafische X11-Oberfläche. http://www.directfb.org/
Das Gegenteil von Framebuffer ist, alles nur unter X zu machen, wer da kein Consolen-Umschalten machen will und trotzdem so eine Voll-Console will, ist mit blackbox gut bedient. Da werden auf ALT+CTRL+F1 bis F3 Shells als Vollbild angezeigt im X.
Die Angabe des Modus in /etc/lilo.conf sollte ohne das "x" vorgenommen werden.
Wer eine Nicht-Standard-Auflösung haben möchte und SuSE verwendet, der kann über hwinfo die verfügbaren vga=-Parameter herausfinden.
* daß VESA immer nur 60 Hz ist, kann ich nicht bestätigen:
- fbset
mode "1280x1024-77"
- # D: 131.096 MHz, H: 80.328 kHz, V: 76.649 Hz geometry 1280 1024 1280 1638 16 timings 7628 160 32 16 4 160 4 rgba 5/11,6/5,5/0,0/0
endmode
(auf einer s3 trio 3d/2x grafikkarte)