`
mmdev
  • 浏览: 12914964 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

FrameBuffer的原理

 
阅读更多
一、<!--[endif]-->FrameBuffer的原理
FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。

Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。

但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理. 应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都有CPU完成,因此CPU负担很重.

framebuffer的设备文件一般是 /dev/fb0、/dev/fb1 等等。

可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.

如果显示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空屏幕

用命令: #dd if=/dev/fb of=fbfile 可以将fb中的内容保存下来;

可以重新写回屏幕: #dd if=fbfile of=/dev/fb

在使用Framebuffer时,Linux是将显卡置于图形模式下的.

在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-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汉字显示原理

    详细的介绍了framebuffer的汉字显示原理。

    framebuffer的原理

    详细分析了Linux内核中framebuffer的源代码,并介绍的framebuffer的实现原理

    第九章 LCD驱动.pdf

    1. linux 平台lcd 驱动移植; 2. 简析framebuffer 原理; 3. 显示基本框架;

    Linux Framebuffer显示demo——jpeg图像显示

    Linux Framebuffer应用编程——jpeg显示在RGB888 Lcd显示屏 ...相关原理详见【正点原子文档】I.MX6U嵌入式Linux C应用编程指南V1.4 或者可以去我的博客找《Linux Framebuffer编程之lcd屏幕显示jpeg图像》

    LCD-framebuffer代码分析

    简单的代码分析,正常下载就可以了,里面是文本文件,和excel文件

    Linux下framebuffer及qvfb编程示例

    qvfb是QT virtualframebuffer的缩写,是QT在X11下的一个framebuffer仿真器,有了它我们就可以利用X11下众多便利的工具来开发基于framebuffer的应用程序了。qvfb的原理很简单,它建立了一个systemV共享内存,用户只需...

    基于linux2.6.30.4 framebuffer移植LCD驱动到FL2440开发板

    1、 LCD硬件及显示原理介绍; 2、 s3c2440 LCD控制器介绍; 3、 内核LCD驱动机制framebuffer(帧缓冲技术)概述; 4、 驱动移植相关及应用程序接口相关重要数据结构分析 5、 在linux2.6.30.4内核中添加(移植)LCD驱动...

    STM32-LCD Framebuffer应用开发

    LCD Framebuffer功能介绍,操作原理, Framebuffer API接口调用,以及编译运行

    嵌入式Linux下的LCD驱动程序设计与实现

    通过对LCD和Framebuffer原理的说明,以ARM处理器S3C2410嵌入式芯片为平台,设计了嵌入式Linux下的基于帧缓冲的LCD设备驱动程序。通过测试程序的编译运行,在LCD上显示了彩色条纹,完成了驱动设计的要求。

    Android技术内幕.系统卷(扫描版)

    5.1.1 framebuffer的工作原理 /189 5.1.2 framebuffer的构架 /190 5.1.3 framebuffer驱动的实现机制 /190 5.2 视频驱动(v4l和v4l2)/201 5.2.1 v4l2介绍 /201 5.2.2 v4l2的原理和构架 /201 5.2.3 v4l2的实现 /202 ...

    Android技术内幕.系统卷 pdf

    5.1.1 framebuffer的工作原理 /189 5.1.2 framebuffer的构架 /190 5.1.3 framebuffer驱动的实现机制 /190 5.2 视频驱动(v4l和v4l2)/201 5.2.1 v4l2介绍 /201 5.2.2 v4l2的原理和构架 /201 5.2.3 v4l2的实现 ...

    FastLED_NeoMatrix_SmartMatrix_LEDMatrix_GFX_Demos:各种Arduino 2D演示均可运行FrameBuffer支持的所有硬件后端

    以下是工作原理的摘要,但您会在此职位上找到更多详细信息: : 可以运行此演示代码的硬件后端和粘合驱动程序我使用了左侧的所有低层驱动程序,在中间编写了所有粘合驱动程序,并编写了FrameBuffer :: GFX Low Level...

    嵌入式系统Linux 下液晶显示的实现

    介绍了嵌入式微处理器PXA270的LCD控制器与SHARP公司的液晶屏LQ035Q7DH06,分析了TFT显示器基本原理,结合它们的工作时序设计了LCD的驱动电路,并在嵌入式操作系统Linux下设计了相应的驱动程序,实现了嵌入式设备的TFT...

    RGB24位色彩转RGB16位色彩

    开发单片机tft屏幕使用到16位色彩(RGB565),而常用色彩为RGB24(RGB888),于是自己写了一个转换软件,其原理参考博主:https://blog.51cto.com/970076933/1885622

    android系统原理及开发要点详解

     3.3.1 Framebuffer显示驱动 46  3.3.2 Event输入设备驱动 48  3.3.3 v4l2摄像头——视频驱动 50  3.3.4 OSS音频驱动 53  3.3.5 ALSA音频驱动 54  3.3.6 MTD驱动 56  3.3.7 蓝牙驱动 57  3.3.8 Wlan驱动 58 ...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...

    嵌入式linux截图工具移植(精华版).pdf

    嵌入式linux截图工具的基本原理就是通过读取Framebuffer,把LCD上显示的内容转换成图片格式文件(jpeg、bmp、png)。 编译截图工具,需要系统的jpeg库(libjpeg.so)的支持,一般交叉编译器中没有jpeg库,需要自己安装...

Global site tag (gtag.js) - Google Analytics