framebuffer应用程序测试 (一)
- 格式:doc
- 大小:63.50 KB
- 文档页数:4
framebuffer帧缓冲framebuffer简介帧缓冲〔framebuffer〕是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进展读写操作。
framebuffer是LCD对应的一中HAL〔硬件抽象层〕,提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。
这些都是由Framebuffer 设备驱动来完成的。
帧缓冲设备对应的设备文件为/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:相当于读/写屏幕缓冲区。
2.映射〔map〕操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接物理缓冲区地址的。
而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址屏幕缓冲区,在屏幕上绘图了。
3.I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。
ioctl的操作是由底层的驱动程序来完成的。
在应用程序中,操作/dev/fb的一般步骤如下:1.翻开/dev/fb设备文件。
2.用ioctl操作取得当前显示屏幕的参数,根据屏幕参数可计算屏幕缓冲区的大小。
3.将屏幕缓冲区映射到用户空间。
4.映射后即可直接读写屏幕缓冲区,进展绘图和图片显示。
图二用户空间帧缓冲设备流程framebuffer相关数据构造介绍1. fb_info构造体:帧缓冲设备中最重要的数据构造体,包括了帧缓冲设备属性和操作的完整性属性。
图形用户接口一、实验目的(1)了解嵌入式系统图形界面的基本编程方法(2)学习图形库的制作二、实验原理(一)Frame Buffer显示屏的整个显示区域,在系统内会有一段存储空间与之对应。
通过改变该存储空间的内容达到改变显示信息的目的。
该存储空间被称为Frame Buffer,或显存。
显示屏上的每一点都与Frame Buffer里的某一位置对应。
所以,解决显示屏的显示问题,首先要解决的是Frame Buffer的大小以及屏上的每一像素与Frame Buffer的映射关系。
影响空间大小的因素:由于Frame Buffer空间的计算大小是以屏幕的大小和显示模式决定的,所以显示模式(单色或彩色)、显示屏的性能、显示的需要均会影响Frame Buffer空间的大小。
另外显示屏还有单屏幕、双屏幕两种工作模式:单屏幕模式代表屏幕的显示范围是整个屏幕,只需一个Frame Buffer和一个通道;双屏幕模式则将整个屏幕划分为两个部分,这两个部分各自有Frame Buffer,且他们的地址无需连续,并同时具有两个各自独立的通道将Frame Buffer的数据传送到显示屏。
显示操作及映射连续性:由于Frame Buffer通常就是从内存空间分配所得,并且他是有连续的字节空间组成,屏幕的显示操作通常是从左到右逐点像素扫描,从上到下逐行扫描,直到扫描到右下角,然后再折返到左上角。
又由于Frame Buffer里的数据是按地址递增的顺序被提取,所以屏幕上相邻的两像素被映射到Frame Buffer里是连续的,并且屏幕最左上角的像素对应Frame Buffer的第一空间单元,屏幕最右下角则对应最后一个单元空间。
(二)Frame Buffer 与色彩计算机反映自然界的颜色是通过RGB(Red-Green-Blue)值来表示的。
如果要在屏幕某点显示某种颜色,则必须给出相应的RBG值。
Frame Buffer是由所有像素的RGB值或RGB值的部分位所组成,本系统使用的16位/像素的模式下,Frame Buffer里的每个单元16位,每个单元代表一个像素的RGB值,如下图D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 R R R R R G G G G G G B B B B B有了以上的分析,就可以用下面的计算公式FrameBufferSize=Width * Height * Bitperpixel/8计算Frame Buffer的大小(以字节为单位)。
一、概述Framebuffer(帧缓冲)是计算机图形学中的重要概念,它指的是将图形数据存储在内存中的一块缓冲区,用于在显示设备上显示图像。
而FPGA(Field Programmable Gate Array)则是一种灵活可编程的逻辑芯片,能够根据需求进行重构,可用于实现各种硬件系统。
本文将探讨如何利用FPGA实现framebuffer的原理。
二、framebuffer原理1. 存储结构在FPGA中实现framebuffer需要考虑如何存储图像数据。
通常情况下,可以使用双缓冲区来存储图像数据,这样可以在显示图像的同时对后台进行图像数据的更新。
每个像素点的颜色数据通常以RGB格式进行存储,而在FPGA中可以使用BRAM(Block RAM)来实现图像数据的存储。
2. 显示控制FPGA需要实现显示控制器来控制图像数据的输出。
显示控制器需要对时序进行精确的控制,将图像数据按照固定的频率输出到显示设备上。
需要考虑显示设备的分辨率和刷新率,确保输出的图像在显示设备上能够正确显示。
3. 数据传输当图像数据需要从主机系统传输到FPGA中时,需要考虑数据传输的速率和稳定性。
可以使用串行通信接口如MIPI或者并行接口如LVDS等方式来进行数据传输。
三、FPGA实现framebuffer的优势1. 灵活性FPGA是一种可编程的逻辑芯片,能够根据需求进行灵活的重构。
利用FPGA实现framebuffer可以根据具体的应用需求进行定制化设计,以满足不同的图像处理需求。
2. 高性能FPGA拥有并行处理能力强的优势,能够快速处理大规模的图像数据。
通过合理的设计,能够在FPGA上实现高性能的图像处理和显示。
3. 低功耗和传统的图像处理芯片相比,FPGA在处理同等任务时具有较低的功耗。
利用FPGA实现framebuffer可以在保证性能的同时降低能耗。
四、FPGA实现framebuffer的应用1. 嵌入式图像处理利用FPGA实现framebuffer可以用于嵌入式图像处理系统中,如医疗影像设备、工业检测设备等,能够实现实时的图像采集、处理和显示。
flutter linux framebuffer -回复Flutter是一个开源的UI框架,它可以帮助开发者快速构建漂亮且高性能的跨平台应用程序。
而Linux framebuffer是一种基于内存的显示设备,它可以直接访问和操作显存,将图形信息显示在屏幕上。
本文将详细介绍Flutter在Linux framebuffer上的应用,包括如何配置和启动以及遇到的一些常见问题和解决方案。
何为Linux framebuffer?首先,我们需要理解什么是Linux framebuffer。
Framebuffer是一种显示设备的编程接口,它提供了对显存的底层访问和操作。
以前,大多数操作系统都使用字符设备驱动或者X Window System来显示图形界面,而Linux framebuffer则是在这些方式之上的一层软件接口。
它允许开发者直接操作显存,快速地将图形信息显示在屏幕上。
Linux framebuffer不仅适用于嵌入式设备,也可以在普通的Linux系统上使用。
Flutter在Linux framebuffer上的使用Flutter最初是为移动设备开发的,但随着时间的推移和社区的发展,Flutter已经支持了更多的平台,包括桌面和嵌入式系统。
使用Flutter在Linux framebuffer上进行开发,可以让我们在Linux环境中快速构建漂亮且高性能的应用程序。
# 配置Linux framebuffer在开始使用Flutter在Linux framebuffer上进行开发之前,我们需要先配置Linux framebuffer。
首先,确保操作系统已经安装了Linux framebuffer的驱动程序。
然后,通过修改系统的启动参数来启用Linux framebuffer。
具体的步骤会因不同的Linux发行版而有所不同,可以参考相关的文档和教程来进行配置。
# 启动Flutter应用一旦Linux framebuffer配置完成,我们就可以开始启动Flutter应用了。
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==linuxframebuffer范例篇一:FrameBuffer实例开发一、开发环境二、背景知识帧缓冲(FrameBuffer):帧缓冲是Linux为显示设备提供的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过 FrameBuffer定义好的接口访问这些图形设备,从而不用去关心具体的硬件细节。
对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。
下面来看一下在不同色位模式下缓冲区与显示点的对应关系:三、帧缓冲(FrameBuffer)设备驱动结构:帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数,最大允许有32个FrameBuffer,定义在/include/linux/fb.h中的FB_MAX,对应于文件系统下/dev /fb%d设备文件。
1. 帧缓冲设备驱动在Linux子系统中的结构如下:我们从上面这幅图看,帧缓冲设备在Linux中也可以看做是一个完整的子系统,大体由fbmem.c和xxxfb.c组成。
向上给应用程序提供完善的设备文件操作接口(即对FrameBuffer设备进行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中实现;向下提供了硬件操作的接口,只是这些接口Linux并没有提供实现,因为这要根据具体的LCD控制器硬件进行设置,所以这就是我们要做的事情了(即xxxfb.c 部分的实现)。
2. 帧缓冲相关的重要数据结构:从帧缓冲设备驱动程序结构看,该驱动主要跟fb_info结构体有关,该结构体记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及对底层硬件操作的函数指针。
FrameBuffer对象被用来存放渲染的结果,FrameBuffer可以使你对颜色,模型,色深等的创建精确。
下面是创建FrameBuffer的方法:1:创建framebuffer对象。
2:创建一个或多个对象 (renderbuffers or textures),对他们进行存储分配,将它们付着到framebuffer的付着点上去。
3:测试framebuffer的完整性。
下面是Sample Code生成一个OfferScreenFramebuffer对象1:生成并绑定framebuffer2:生成colorRenderbuffer,分配内存,付着到framebuffer上。
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
4,检查framebuffer的完整性,在需要在frame属性被编辑后调用:用framebuffer进行纹理渲染:1:创建一个framebuffer对象。
2:创建目的纹理,并将其付着到framebuffer上。
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
(同上)4:检查framebuffer的完整性。
(同上)渲染Core Animation Layer:在iOS里面都是由Core Animation Layer来作显示效果的,但是OpenGL ES没有直接使用CAEAGL Layer而是定义一个UIView的子类,UIView可以被CAEAGLLayer支持。
下面是生成OpenGL ES的View步骤:1:生成一个UIView的子类用来做OpenGL ES的View;2:重写(override)layerClass方法,使得你的View使用CAEAGLLayer作为它的底层。
layerCla ss返回一个CAEAGLLayer。
3:在View 的初始化过程中,读取view的layer属性,代码如下:myEAGLLayer = (CAEAGLLayer*)yer;4:设置layer的属性。
framebuffer 编程(原创实用版)目录1.framebuffer 概述2.framebuffer 编程的基本原理3.framebuffer 编程的步骤4.framebuffer 编程的实例5.framebuffer 编程的优缺点正文【1.framebuffer 概述】Framebuffer(帧缓冲区),也被称为显存,是计算机图形学中的一种存储设备,主要用于暂时存储显卡生成的图像。
Framebuffer 是一个高分辨率的缓冲区,可以存储屏幕上的所有像素。
它主要用于将计算机生成的二维图像转换为显示器可以识别的信号,以便在屏幕上显示。
【2.framebuffer 编程的基本原理】Framebuffer 编程的基本原理是通过编程控制显卡的帧缓冲区,从而实现对图像的控制。
它主要包括以下几个步骤:1.配置 framebuffer:设置 framebuffer 的属性,如宽度、高度、颜色深度等。
2.将图像数据写入 framebuffer:通过显卡的命令将图像数据写入framebuffer。
3.提交 framebuffer:将 framebuffer 中的数据提交给显卡,开始渲染。
【3.framebuffer 编程的步骤】Framebuffer 编程的基本步骤如下:1.初始化 framebuffer:首先,需要初始化 framebuffer,包括分配内存、设置属性等。
2.绑定 framebuffer:将 framebuffer 绑定到特定的渲染管线。
3.写入图像数据:通过显卡的命令将图像数据写入 framebuffer。
4.提交 framebuffer:将 framebuffer 中的数据提交给显卡,开始渲染。
5.释放 framebuffer:渲染完成后,需要释放 framebuffer。
【4.framebuffer 编程的实例】以下是一个简单的 framebuffer 编程实例:```c#include <GL/glut.h>void display() {glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区glLoadIdentity(); // 重置变换矩阵glOrtho(0, glutGet(GL_WIDTH), glutGet(GL_HEIGHT), 0, -1, 1); // 设置透视投影矩阵glBegin(GL_QUADS); // 开始绘制四边形glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色glVertex2f(-0.5, -0.5); // 绘制左下角glVertex2f(0.5, -0.5); // 绘制右上角glVertex2f(0.5, 0.5); // 绘制右上角glVertex2f(-0.5, 0.5); // 绘制左上角glEnd(); // 结束绘制glFlush(); // 提交绘制结果}int main(int argc, char** argv) {glutInit(&argc, argv);glutCreateWindow("Framebuffer Programming");glutDisplayFunc(display);glutMainLoop();return 0;}```【5.framebuffer 编程的优缺点】Framebuffer 编程的优点:1.灵活性:framebuffer 编程可以实现对图像的精确控制,包括颜色、亮度、对比度等。
Framebuffer使用测试这两天拾起以前做过的Framebuffer,不相同的是以前在嵌入式上做的,现在在自己电脑上Debian上进行测试,不过都类似罢了,嵌入式里要初始化很多东西。
下面具体列一下步骤。
至于Framebuffer的原理,就我的理解是比较简单的,无非往mmap好的fb上填写显示数据罢了,不对这些数据进行处理,FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备,它需要真正的显卡驱动的支持。
在这次测试中,我用了默认就安装的vesafb,好像又被称为万能Fb驱动。
1、首先在系统Grub启动时按e进入命令启动行的编辑模式,改为:kernel/boot/vmlinuz-2.6.18-5-686 root=/dev/sda6 ro vga=791(vga=791表示fb用1024 * 768 * 16bpp,其他模式的参数可以上网查查);2、进入系统的命令行模式,编译fb测试例子:gcc fb_test.c;3、允许测试例子:sudo ./a.out >> fb.txt(必须要用超级用户权限,>>将屏幕打印写到fb.txt中),效果如下:打印如下:Fixed screen info:id: VESA VGAsmem_start: 0xf0000000smem_len: 3145728type: 0type_aux: 0visual: 2xpanstep: 0ypanstep: 0ywrapstep: 0line_length: 2048mmio_start: 0x0mmio_len: 0accel: 0Variable screen info:xres: 1024yres: 768xres_virtual: 1024yres_virtual: 768yoffset: 0xoffset: 0bits_per_pixel: 16grayscale: 0red: offset: 11,length: 5, msb_right: 0 green: offset: 5,length: 6, msb_right: 0 blue: offset: 0,length: 5, msb_right: 0 transp: offset: 0,length: 0, msb_right: 0nonstd: 0activate: 0height:-1width:-1accel_flags: 0x0pixclock: 12714left_margin: 128right_margin: 32upper_margin: 16lower_margin: 4hsync_len: 128vsync_len: 4sync: 0vmode: 0Frame Buffer Performance test...Average: 2508 usecsBandwidth: 1196.172 MByte/SecMax. FPS: 398.724 fps4、还可以通过fb在命令行模式下看视频,如:sudo mplayer –vo fbdev ./air_nessesity.mpg。
framebuffer-con0-alldata 类型-回复什么是framebuffer?framebuffer(帧缓冲区)是计算机图形学中的一个概念,用于存储计算机图形的像素数据。
它是一个内存区域,用于存储屏幕上每个像素的颜色值。
通过对framebuffer进行读取和写入操作,计算机可以将图像显示在屏幕上。
framebuffer的大小取决于显示设备的分辨率和每个像素的颜色深度。
framebuffer在图形渲染过程中起到了重要的作用。
它可以被视为一个图像缓冲区,位于图像渲染管线的最后阶段。
当计算机生成图像时,渲染器会将像素数据写入framebuffer,并且显示设备会按照framebuffer中的数据来显示图像。
此外,framebuffer还可以用作图像处理的中间存储区,以便进行后续的处理或者分析。
framebuffer通常包含几个关键的成分:1. 像素数组:framebuffer中最重要的成分就是像素数组。
像素数组是一个二维数组,每个元素表示一个像素的颜色值。
根据显示设备的颜色深度,每个像素的颜色值可能占用1个字节、2个字节或者更多。
2. 颜色缓冲区:颜色缓冲区是framebuffer中用于存储像素颜色值的内存区域。
渲染器会将渲染的像素数据写入颜色缓冲区,然后显示设备会按照颜色缓冲区中的数据来显示图像。
3. 深度缓冲区:深度缓冲区是framebuffer中用于存储像素深度值的内存区域。
深度值是指从观察点到像素的距离,它决定了哪些像素应该被覆盖。
当进行3D图形渲染时,渲染器会计算每个像素的深度值,并将其写入深度缓冲区。
4. 模板缓冲区:模板缓冲区是framebuffer中用于存储模板值的内存区域。
模板值可以用于进行图像处理的特定操作,例如镜像、投影等。
渲染器可以根据需要将模板值写入模板缓冲区。
通过对framebuffer中的像素数据进行读取和写入操作,计算机可以实现图像的生成、渲染和显示。
framebuffer还可以通过特定的接口提供给应用程序使用,以便进行图形处理、图像编辑和效果生成等操作。
Framebuffer的配置及应用*一、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*76;FrameBuffer 设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析分类:Android2012-07-2301:251529人阅读评论(16)收藏举报前面在介绍Android系统的开机画面时提到,Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面的。
Android系统在硬件抽象层中提供了一个Gralloc模块,封装了对帧缓冲区的所有访问操作。
本文将详细分析Gralloc模块的实现,为后续分析SurfaceFlinger服务的实现打下基础。
在前面Android系统的开机画面显示过程分析一文中提到,Linux内核在启动的过程中会创建一个类别和名称分别为“graphics”和“fb0”的设备,用来描述系统中的第一个帧缓冲区,即第一个显示屏,其中,数字0表示从设备号。
注意,系统中至少要存在一个显示屏,因此,名称为“fb0”的设备是肯定会存在的,否则的话,就是出错了。
Android系统和Linux内核本身的设计都是支持多个显示屏的,不过,在Android目前的实现中,只支持一个显示屏。
在前面Android系统的开机画面显示过程分析一文中还提到,init进程在启动的过程中,会启动另外一个进程ueventd来管理系统的设备文件。
当ueventd进程启动起来之后,会通过netlink接口来Linux内核通信,以便可以获得内核中的硬件设备变化通知。
而当ueventd进程发现内核中创建了一个类型和名称分别为“graphics”和“fb0”的设备的时候,就会这个设备创建一个/dev/graphics/fb0设备文件。
这样,用户空间的应用程序就可以通过设备文件/dev/graphics/fb0来访问内核中的帧缓冲区,即在设备的显示屏中绘制指定的画面。
注意,用户空间的应用程序一般是通过内存映射的方式来访问设备文件/dev/graphics/fb0的。
显示器framebuffer工作原理显示器的framebuffer(帧缓冲)在整个显示系统中扮演着极为关键的角色,那它到底是怎么工作的呢?这可真是个有趣又充满技术魅力的话题呢!首先呢,我们得知道framebuffer本质上是一块内存区域。
想象一下,它就像是一个巨大的画布,用来存放即将要显示在屏幕上的图像信息。
这块内存区域被划分成了一个个小的存储单元,就像画布上的一个个小格子。
每个小格子都对应着屏幕上的一个像素点。
嘿,这是不是很神奇?比如说,一个常见的1920×1080分辨率的屏幕,那就意味着framebuffer里得有1920×1080个这样的小存储单元来对应屏幕上的每一个像素呢。
当计算机系统想要在显示器上显示图像的时候,图形处理单元(GPU)就开始大展身手啦。
GPU会根据要显示的内容,计算出每个像素点应该显示的颜色值等信息。
然后呢,把这些信息一个一个地填充到framebuffer对应的存储单元中。
这就好比画家拿着颜料,一笔一笔地在画布上涂抹色彩一样。
那这些颜色值是怎么表示的呢?通常是用一些特定的编码方式。
比如说RGB 编码,通过红(Red)、绿(Green)、蓝(Blue)三种颜色分量的不同组合来表示各种各样的颜色。
每个颜色分量可能会用8位或者更多的位数来表示,这样就能表示出非常丰富的色彩啦。
像24位的RGB编码,就可以表示出16777216种不同的颜色呢,简直是色彩的海洋!一旦framebuffer中的数据被填充好了,显示器的控制器就开始工作了。
它会按照一定的顺序,从framebuffer中读取这些数据,然后把数据转换为可以驱动显示器显示的信号。
这个顺序可是很重要的哦,就像读书得按照页码顺序一样。
通常是按照从左到右、从上到下的顺序来读取每个像素点的数据。
这里面还有一个刷新率的概念呢。
刷新率就是显示器每秒更新画面的次数。
比如说60Hz的刷新率,那就意味着显示器每秒会从framebuffer中读取数据并更新画面60次。
framebuffer基本知识注:本文是Console programming HOWTO,WiebeZoon;*******************的一部分,原文为英文版,本文由highbar翻译。
如转载,请注明原作者及译者。
7.1. framebuffer设备介绍这是一个关于如何编程的文档,因此,请在你编译或执行例子之前,正确配置你的framebuffer设备。
用framebuffer设备,你可以把你的计算机屏幕当成一个真正的图形设备。
你可以修改分辨率,刷新率,色彩深度等。
最好的一点是,你可以把像素点绘在任何你想要的地方。
framebuffer设备不是一个图形库,而更确切的是一个低级的通用设备。
这样创造了巨大的灵活性,但同时也有它的缺点。
想使用framebuffer设备,你应该做以下事情:***断定出你使用的设备***打开设备***取回或改变屏幕设置***映射(Map)屏幕内存通常要打开的设备是/dev/fb0,但是如果用户有多个视频卡和监视器的话,设备也可能不同。
大多数应用通过读取环境变量FRAMEBUFFER (用getenv();)来决定该使用哪个设备。
如果该环境变量不存在,那么就用/dev/fb0。
通过open()调用打开设备,读设备意味着读取屏幕内存(可称之为显存)。
用$cat /dev/fb0 >screenshot将屏幕内存导入一个文件,恢复刚才的屏幕截图则可使用:$cat screenshot >/dev/fb0。
7.2设备的基本用法显然,用上述方法使用屏幕内存并不经济方便。
在读或写之前持续的寻址(见man lseek)将会导致很多的开销。
这就是为什么你要映射你的屏幕内存。
当你将屏幕内存映射到你的应用程序时,你将得到一个直接指向屏幕内存的指针。
在我们可以映射屏幕内存之前,我们需要知道我们能够映射多少,以及我们需要映射多少。
第一件要做的事情就是从我们新得到的framebuffer设备取回信息。
framebuffer应用程序测试(一)
本文的copyright归yuweixian4230@ 所有,使用GPL发布,可以自由拷贝,转载。
但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:yuweixian4230@
博客:
程序源代码是:Enabling the Linux Framebuffer 实例访问framebuffer 中提到的代码
首先对这个程序进行测试,看看效果,然后对它进行分析。
再次贴出代码如下;
Testing: Here's a short program that opens the frame buffer and draws
a gradient-filled red square.
画一个红色的矩形框
1.#include <unistd.h>
2. #include <stdio.h>
3. #include <fcntl.h>
4. #include <linux/fb.h>
5. #include <sys/mman.h>
6.
7.int main()
8.{
9.int fbfd = 0;
10. struct fb_var_screeninfo vinfo;
11. struct fb_fix_screeninfo finfo;
12. long int screensize = 0;
13. char *fbp = 0;
14.int x = 0, y = 0;
15. long int location= 0;
16.
17.// Open the file for reading and writing
18. fbfd = open("/dev/fb0", O_RDWR);
19.if(!fbfd){
20. printf("Error: cannot open framebuffer device.\n");
21.exit(1);
22.}
23. printf("The framebuffer device was opened
successfully.\n");
24.
25.//Get fixed screen information
26.if(ioctl(fbfd, FBIOGET_FSCREENINFO,&finfo)){
27. printf("Error reading fixed information.\n");
28.exit(2);
29.}
30.
31.//Get variable screen information
32.if(ioctl(fbfd, FBIOGET_VSCREENINFO,&vinfo)){
33. printf("Error reading variable information.\n");
34.exit(3);
35.}
36.
37. printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres,
vinfo.bits_per_pixel );
38.
39.// Figure out the size of the screen in bytes
40. screensize = vinfo.xres * vinfo.yres *
vinfo.bits_per_pixel / 8;
41.
42.// Map the device to memory
43. fbp =(char *)mmap(0,screensize,PROT_READ |PROT_WRITE,
MAP_SHARED,
44. fbfd, 0);
45.if((int)fbp ==-1){
46. printf("Error: failed to map framebuffer device to
memory.\n");
47.exit(4);
48.}
49. printf("The framebuffer device was mapped to memory
successfully.\n");
50.
51. x = 100; y = 100;// Where we are going to put the pixel
52.
53.// Figure out where in memory to put the pixel
54.for( y = 100; y < 300; y++)
55.for( x = 100; x < 300; x++){
56.
57.location=(x+vinfo.xoffset)*
(vinfo.bits_per_pixel/8)+
58.(y+vinfo.yoffset)*
finfo.line_length;
59.
60.if( vinfo.bits_per_pixel == 32 ){
61.*(fbp +location)= 100;// Some blue
62.*(fbp +location+ 1)= 15+(x-100)/2;// A
little green
63.*(fbp +location+2)=200-(y-100)/5;//A lot
of red
64.*(fbp +location+ 3)= 0;// No transparency
65.}else{//assume 16bpp
66.int b = 10;
67.int g =(x-100)/6;// A little green
68.int r = 31-(y-100)/16;// A lot of red
69. unsigned short int t = r<<11 | g << 5 | b;
70.*((unsigned short int*)(fbp +location))=t;
71.}
72.
73.}
74. munmap(fbp, screensize);
75. close(fbfd);
76. return 0;
77.}
然后通过 gsnap截图工具,gsnap framer.jpg /dev/fb0 获取图片信息操作过程如下:
1.[root@yuweixian yu]# ls
2.0.jpg beijing.avi framebuff test-mmap.jpg usb_camera
3.axu capture mmap.jpg ts_test
4.[root@yuweixian yu]#./framebuff
5.The framebuffer device was opened successfully.
6.320x240, 16bpp
7.The framebuffer device was mapped to memory successfully.
8.Segmentation fault
9.[root@yuweixian yu]#gsnap frammer.jpg /dev/fb0
10.---------------framebuffer---------------
11./dev/fb0:
12. width : 320
13. height: 240
14. bpp : 2
15. r(11, 5)R G B 565LCD 使用的模式
16. g( 5, 6)
17. b( 0, 5)
18.-----------------------------------------
19.[root@yuweixian yu]# sz frammer.jpg
20.rz
21.Starting zmodem transfer. Press Ctrl+C to cancel.
22.Transferring frammer.jpg...
23. 100% 19 KB 9 KB/s 00:00:02 0 Errors
24.
25.奜Osz 3.48 01-27-98 finished.
26.[root@yuweixian yu]#
背景“hello测试程序” 是qt程序,开机时就开启了。
然后执行测试测试程序,就在覆盖了 hello 测试程序,在其上面显示了红色矩形框。