欢迎来到天天文库
浏览记录
ID:40128519
大小:201.49 KB
页数:15页
时间:2019-07-22
《借助相关驱动在Linux上控制Frame_Buffer》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、借助相关驱动在Linux上控制FrameBuffer南京大学李超凡0911800662011-12-13摘要本文介绍在Linux上利用相关驱动控制FrameBuffer,进而控制显示的方法,编写了画点,矩形的代码,实现了用Bresenham算法画斜线及画圆的代码。并介绍了其详细的实现过程,最后,以实现的这些函数为例介绍了构建Linux上的共享库(sharedlibrary)的方法。1FramBuffer介绍Frame意为“帧”,Buffer意为“缓冲”,故FrameBuffer大致意思即为帧缓冲,即大小足以容纳一帧完整视频数据
2、的缓冲空间。因此,FrameBuffer中的数据一般由各个像素的颜色信息构成,根据色深(colordepth)的不同,每像素所占的空间也不同,一般有1bit,4bit,8bit,16bit,24bit,32bit等几种。1由于像素在屏幕上显示的位置与该像素的颜色信息的内存地址是对应的,所以不需要FrameBuffer中存放像素的位置信息。FrameBuffer的设备驱动一般可以在内核模块中找到,在配置内核时将相应的模块编入内核或者模块化即可,如果不清楚该用哪一个模块,全部模块化亦可。对于PC来说,一般的发行版有相应的程序自动创
3、建与模块对应的设备文件,所以,如果设备驱动没有问题,则在/dev目录下会有一个字符设备文件/dev/fb0,主设备号29,次设备号0;对于嵌入式系统,一般需要手动创建该设备文件于/dev/目录下。2实验环境介绍PC机相关的环境说明:1.主机型号为LenovoThinkpadSL41028425AC。2.PC机使用debian-6.0.3系统,内核版本号3.0.8。3.LCD屏幕分辨率大小1366x768。4.所用FrameBuffer设备驱动为开源的ATI显卡驱动radeon.ko,并借助drm_kms_helper.ko实现
4、radeondrmfb设备。并已在/dev/目录下生成相应的/dev/fb0设备文件。11bit为黑白画面,16bit一般被称作高彩色(highcolor),24bit和32bit一般都被称作(truecolor),32bit比24bit多了8位的半透明度信息,但有时这些信息被直接忽略。1开发板相关的环境说明:1.开发板使用深圳市武耀博德信息技术有限公司生产的基于PXA270处理器的多功能嵌入式开发平台EELIOD。2.LCD显示屏分辨率640x480。3.用于开发板上的Linux内核源代码为linux-2.6.9-eelio
5、d。4.所用交叉编译环境为arm-linux,版本号3.3.2,安装路径为/usr/local/arm-linux。5.在/dev/目录下已创建/dev/fb0文件,所用的设备驱动为pxafb.ko。6.在根目录/下已创建/lib/目录用于放置共享库。3初始化与结束3.1初始化工作由于最终要将各个绘图函数制作成一个共享库,供其他应用程序调用,所以,打开设备文件/dev/fb0,读取屏幕以及FrameBuffer的相关信息和映射(mmap)设备文件的相关代码将被放在一个初始化函数中,在调用具体的绘图函数之前,首先调用这个初始化函
6、数。3.1.1打开设备文件本实验中的初始化函数的原型为:intgstart(constchar*path);其中,path为FrameBuffer设备文件的路径,如果该值为NULL,则path为默认值/dev/fb0。相关代码如下:if(path==NULL){path="/dev/fb0";}if((fd=open(path,O_RDWR))==-1){perror("Errorwhileopenfile");exit(1);}3.1.2读取相关信息由于Linux操作系统已经为FrameBuffer的操作构建了统一的软件
7、架构,所以即使使用的显示器不同,显卡不同,设备驱动也不同,在Linux上读取FrameBuffer信息的方法都是一样的。具体可详细阅读内核源代码目录下include/linux/fb.h文件2,该文件是包含Linux下的FrameBuffer函数的头文件,另2一般在PC上亦可查阅/usr/include/linux/fb.h2外,在内核源代码目录中Documentation/fb/目录下有关于各个FrameBuffer驱动的介绍,其中就有pxafb.txt文件介绍关于驱动pxafb.ko。本实验中只需要读取fb_var_scr
8、eeninfo和fb_fix_screeninfo两个结构体的信息,其中第一个是可变的屏幕信息,本实验并不涉及更改这一结构体的信息,第二个是固定的屏幕信息,存储一些固定的参数:if(ioctl(fd,FBIOGET_VSCREENINFO,&vinfo)==-1){perro
此文档下载收益归作者所有