什么是FrameBuffer

来源:互联网 发布:笑笑和五五开事件知乎 编辑:程序博客网 时间:2024/05/18 03:42

什么是FrameBuffer

转载自http://blog.csdn.net/ryman/archive/2006/10/25/1351005.aspx。

FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将 其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是/dev/fb0、/dev/fb1等 等。比如,假设现在的显示模式是1024×768-8位色,则可以通过如下的命令清空屏幕:

$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768

在应用程序中,一般通过将FrameBuffer设备映射到进程地址空间的方式使用,比如下面的程序就打开/dev/fb0设备,并通过mmap系统调用 进行地址映射,随后用memset 将屏幕清空(这里假设显示模式是 1024×768-8 位色模式,线性内存模式):

int fb;
unsigned char* fb_mem;
fb = open ("/dev/fb0", O_RDWR);
fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
memset (fb_mem, 0, 1024*768);

FrameBuffer设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
通过FrameBuffer设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。比如目前最新 的内核(2.4.9)中,就包含有对S3、Matrox、nVidia、3Dfx等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以 将PCI设备的内存I/O(memio)映射到进程的地址空间。这些memio一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就可以控 制特定显卡的加速功能。PCI设备可以将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存 器又被称为"memio"。一旦被映射到物理内存,Linux的普通进程就可以通过mmap将这些内存I/O映射到进程地址空间,这样就可以直接访问这些 寄存器了。当然,因为不同的显示芯片具有不同的加速能力,对memio的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速 功能。比如大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数。 说到这里,读者可能已经意识到FrameBuffer只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而 言,如果希望在FrameBuffer之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer就像一张画布,使用什么样子的画 笔,如何画画,还需要你自己动手完成。

设置

如果你需要在console下操作,如果你需要做自己的bootsplash,等等,则继续吧。
首先需要让内核支持framebuffer,以下是我在T23的内核里有关framebuffer的选项设置:

Code maturity level options —>
     [*] Prompt for development and/or incomplete code/drivers
Processor type and features —>
     [*] MTRR (Memory Type Range Register) support
Device Drivers —>
     Block devices —>
       <*> Loopback device support
       <*> RAM disk support
       (4096) Default RAM disk size
       [*] Initial RAM disk (initrd) support
     Graphics support —>
       [*] Support for frame buffer devices
       [*] VESA VGA graphics support
     Console display driver support —>
         — VGA text console
         <*> Video mode selection support
         <*> Framebuffer Console support

如果你喜欢看到小企鹅图标,则在

Device Drivers —>
     Logo configuration —>
的下面进行选择。

所有选择完毕后,进行一般的内核编译操作。完成文件的复制之后,修改bootloader的配置文件,正常添加新编译的image,并加入以下内容:

lilo:
vga=830
append="video=vesa:ywrap,mtrr"

grub:
kernel参数加上video=vesa:ywrap,mtrr vga=830

vga参数的选择:
我的LCD分辨率是1400×1050,vga选择了830,网上有人说用828,有人说用834,不过我都试了,grub都不认,如果你也有这种分辨率的LCD,自己试试吧。如果你的分辨率是其他的,参见下表:

          |640×480 800×600 1024×768 1280×1024
   —-+—————————————————————————
   256 |   0×301      0×303       0×305        0×307
   32k |   0×310      0×313       0×316        0×319
   64k |   0×311      0×314       0×317        0×31A
   16M|   0×312      0×315       0×318        0×31B

BTW:如果你觉得konsole字体不是那么完美,可以用setconsolefont fontname命令更改,这将修改/etc/rc.d/rc.font文件,确保rc.font文件有x属性。在 /usr/share/kbd/consolefonts/目录下有很多字体供选择,我觉得sd不错:)
OK了,如果用lilo的别忘了执行一次lilo命令,然后reboot看看效果吧:)

The End.

原创粉丝点击