The wow gold fastest,safest but cheapest gold wow gold fast wow cheap! We are the Leading Services Company, we assure the gold wow highest quality of service to our gold wow loyal clients.Place an order for wow gold on our website is the best world of warcraft gold and securest way to world of warcraft gold buy wow gold you to your desired high level fast.With outstanding gold wow fast cheap buy world of warcraft gold experience, buy world of warcraft gold we had done a great number of orders for gold wow cheap fast and have hundreds of orders cheap world of warcraft gold everyday. We cheap world of warcraft gold are sure that you are impossible to get such an excellent service as the same as we do. Ambition wow money is wow money a poor excuse for not having sense enough to be cheapest wow gold lazy. cheapest wow gold An executive will always return to work from lunch early wow buy gold if wow buy gold no one takes him. An error in the premise will appear wow gold in the conclusion. wow gold An object at rest will always be in the wow gold sale wrong wow gold sale place. AnAbout 85% of women are responsible for cooking gold for wow the gold for wow family dinner, and 84% wish they didn't have to. Linux的帧缓冲设备(Framebuffer)简介--(转) - 嵌入式系统 ARM应用 - Linux中国论坛 - Powered by Discuz!

返回列表 发帖

Linux的帧缓冲设备(Framebuffer)简介--(转)

[/td]
       帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。
帧缓冲驱动的应用广泛,在linux的桌面系统中,Xwindow服务器就是利用帧缓冲进行窗口的绘制。尤其是通过帧缓冲可显示汉字点阵,成为Linux汉化的唯一可行方案。  
    Linux FrameBuffer 本质上只是提供了对图形设备的硬件抽象,在开发者看来,FrameBuffer 是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。所以说FrameBuffer就是一块白板。例如对于初始化为16 位色的FrameBuffer 来说, FrameBuffer中的两个字节代表屏幕上一个点,从上到下,从左至右,屏幕位置与内存地址是顺序的线性关系。
    帧缓存可以在系统存储器(内存)的任意位置,视频控制器通过访问帧缓存来刷新屏幕。 帧缓存也叫刷新缓存 Frame buffer 或 refresh buffer, 这里的帧(frame)是指整个屏幕范围。  
    帧缓存有个地址,是在内存里。我们通过不停的向frame buffer中写入数据, 显示控制器就自动的从frame buffer中取数据并显示出来。全部的图形都共享内存中同一个帧缓存。
    CPU指定显示控制器工作,则显示控制器根据CPU的控制到指定的地方去取数据 和 指令, 目前的数据一般是从显存里取, 如果显存里存不下,则从内存里取, 内存也放不下,则从硬盘里取,当然也不是内存放不下,而是为了节省内存的话,可以放在硬盘里,然后通过 指令控制显示控制器去取。帧缓存 Frame Buffer,里面存储的东西是一帧一帧的, 显卡会不停的刷新Frame Buffer, 这每一帧如果不捕获的话, 则会被丢弃,也就是说是实时的。这每一帧不管是保存在内存还是显存里, 都是一个显性的信息, 这每一帧假设是800x600的分辨率, 则保存的是800x600个像素点,和颜色值。
    显示器可以显示无限种颜色,目前普通电脑的显卡可以显示32位真彩、24位真彩、16位增强色、256色。除256色外,大家可以根据自己的需要在显卡的允许范围之内随意选择。很多用户有一种错误概念,认为256色是最高级的选项,而实际上正好相反。256色是最低级的选项,它已不能满足彩色图像的显示需要。16位不是16种颜色,而是2的16次平方(256×256)种颜色,但256色就是256(2的8次平方)种颜色。所以16位色要比256色丰富得多。

    帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32 个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0。当然在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。通过/dev/fb,应用程序的操作主要有这几种:  

1. 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。例如用 cp /dev/fb0 tmp命令可将当前屏幕的内容拷贝到一个文件中,而命令cp tmp > /dev/fb0 则将图形文件tmp显示在屏幕上。


2.映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此, Linux在文件操作 file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多。


3. I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成的。  

在应用程序中,操作/dev/fb的一般步骤如下:  

1. 打开/dev/fb设备文件。  
2. 用ioctrl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。  
3. 将屏幕缓冲区映射到用户空间。  
4. 映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。  

典型程序段如下:  

#include <linux/fb.h>  
int main()  
{  
int fbfd = 0;  
struct fb_var_screeninfo vinfo;  
struct fb_fix_screeninfo finfo;  
long int screensize = 0;  
/*打开设备文件*/  
fbfd = open("/dev/fb0", O_RDWR);  
/*取得屏幕相关参数*/  
ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo);  
ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);  
/*计算屏幕缓冲区大小*/  
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;  
/*映射屏幕缓冲区到用户地址空间*/  
fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0);  
/*下面可通过fbp指针读写缓冲区*/


返回列表