LCD与FrameBuffer驱动程序的研究与实现
LCD驱动的学习
LCD驱动的学习简介:LCD是基于液晶的。
LCD(liquid crystal display)按驱动⽅式分类可以分为静态驱动,简单矩阵驱动,主动矩阵驱动。
其中,简单矩阵⼜可以分为扭转向列型(TN)和超转向列型(STN),⽽主动矩阵驱动则以TFT(⽤的最多)为主。
TN型液晶驱动:是LCD中最基本的,他只能将⼊射光旋转90度,视⾓只有30度。
STN型驱动液晶:可以讲⼊射光旋转180度⾄270度,也改善了视⾓。
TFT解决了上述两种液晶屏的缺陷,属于⽐较常⽤的。
⼀块lcd屏显⽰图像不但需要lcd驱动器,还需要lcd控制器。
很多主芯⽚cpu继承了lcd控制器。
其显⽰原理为:作为帧同步信号的vsync,每发出⼀个脉冲,就意味着⼀幅图像开始传输。
作为⾏同步信号的hsync,每发出⼀个信号,代表新的⼀⾏图像资料开始发送。
图像为从左向右,从上向下显⽰。
⼀个完整的时序图如下:下⾯是lcd的技术参数:1. 可视⾯积2. 可视⾓度3. 点距4. ⾊彩度5. 对⽐值6. 亮度值7. 响应时间显存:Framebuffer(帧缓冲)从本质上讲是图形设备的硬件抽象。
对开发者⽽⾔,framebuffer是⼀块显⽰缓存,往显⽰缓存中陷⼊特定格式的数据就意味着向屏幕中输出内容。
通过不断地向framebuffer中写数据,显⽰控制器就⾃动的从framebuffer中读数据并显⽰出来。
在嵌⼊式⼀般没有专门的芯⽚做显存,⼀般是从内存中分⼀部分做显存。
Framebuffer其实就是显存。
帧缓冲设备对应的设备⽂件是/dev/fb*,如果系统中有多个显⽰卡,linux下还可⽀持多个帧缓冲设备,最多可达32个。
帧缓冲设备的主设备号为29,次设备号是0到31.下⾯是使⽤帧缓冲设备⽂件的演⽰。
帧缓冲设备编程:整个编程的系统架构如下:可以看出,我们实现帧缓冲设备主要需要完成两个任务:1. 实现⼀个fb_info结构体,这其中包括可变参数,固定参数,操作列表等。
基于Framebuffer的LCD驱动程序的实现
用 开放 源码 的优 势 , 已有 的代 码 基础 上 开 发 出 在
但 只能凭 一 己
之力 做一 些较 为简 单 的应 用 . 相反 , 如果 能 充分 利
通 过 DMA 将显 存 中的数 据传 人 显 示 板 的 D ie r r v I 显示 图形 . 3 4B X 中的 L D 控制 器可 支 c来 SC 4 O C
像 Widws中的 桌 面 图形 界 面 , rme ufr使 no Fa bf e
得 一切都 变得 那么 简单 .
1 底 层L D驱 动机制 C
1 1 硬 件 平 台 .
关 系 L. 者在 深圳 天喜 投资 有 限公 司参 与 V0I 1笔 ] P 项 目时 , 曾经接 触 过多种 I D( 包括 点 阵型 和字 符 C
须按照 u l u C i x的方 式来 写 . co n o n Mi wid ws是 一 r
从 缓 冲 区中读 出 的 , 大 小 由屏 幕 分 辨率 和 显 示 其 颜 色数 决 定. 文 中 , 者 采 用 的 是优 龙 G3I 在 笔 5 显
示 面板 , 4 ×3 0分辨 率下 提供 4级灰 度显 示. 在2 0 2
Vo . 0 No 1 13 . Fe .2 0 b 06
基 于 F a b f r的 L D驱 动 程 序 的实 现 * rme uf C e
雷 鸿 熊文 龙 杨 单
( 汉 理 工 大 学 计 算 机 科 学 与 技 术 学 院 武 汉 武 406) 30 3
基于Framebuffer的LCD驱动程序设计
一
卸载是通过 ur s cre ne t -hdv函数来实现。 e 生控 制信 号。用户只要设置一 系列 的寄存器 , 就可 以完成显示 实现 , 配置 和控制 。 配置 L D控制器最重要 的一步就是设 置显示缓 冲 三 、 j x下 的帧缓 冲设 备 C Ln u 区, 显示 的内容就是从显示缓冲区中读出来 的。 32 1 s c4 0的 L D c Ln x iu 操作 系统为 L D等显示设备提供 了帧缓 冲区。帧缓 c 控制 器支持 s N和 T 液 晶屏幕 。本文 采用 的 L H J 1x 冲区( r b 船r是 Ln x为显示设备提供的一个接 口, T 兀 R 95 5 A Fa u ) iu me 是把显 S NB 型液 晶显示屏是分辨率为 3 0 20像素 ,5 色 的 s N 存抽象化后 的一种设备。 T ,w 2}4 26 T 利用帧缓冲区编写驱动程序 的时候 , 用 彩色液晶屏幕 。 户不用关心物理显存 的位置 、 换页机制等具体细节 , 这些都 由帧
Th e i fL ed SgnO CD ie S b S d O a dV r a e n Fr me uf bf er
Chn ni Z a gW e o g agYu j hn i n e y
( p r n f mp trHu a s tt o eh o g He g a g 4 0 ) De at t me 0 Co ue, n nI tue f c n 1 y ni T o n yn 2 8 1 O
uclinux下利用Framebuffer开LCD驱动
近几年,随着Linux技术的兴起,uClinux在嵌入式领域逐渐占有了重要的地位.uClinux驱动程序的结构和标准L inux驱动程序的结构类似,不同的只是uClinux不支持内存管理单元.因此,为了充分利用uClinux的优势,驱动程序 必须按照uClinux的方式来写.Microwindows是一个著名的开放式源码的嵌入式GUI软件,目的是把图形视窗环境引入 到运行uClinux的小型设备上.而实现这一切的基础即为Framebuffer.开发者只需实现LCD的Framebuffer驱动,即可 完成像Windows中的桌面图形界面,Framebuffer使得一切都变得那么简单.
图1 内存块分布图
2 底层LCD驱动接口 2.1 Linux下设备驱动程序
在Linux中,大部分的设备驱动都写成模块的形式,但嵌入式系统是针对具体应用的,一般都不需要这一功能. 因此,uClinux的驱动程序都是直接编译到内核中.
Linux将设备分为最基本的两大类,字符设备和块设备.字符设备是以单个字节为单位进行顺序读写操作,通常 不使用缓冲技术,如鼠标等,驱动程序实现比较简单;而块设备则是以固定大小的数据块进行存储和读写,如硬 盘、软盘等.为提高理,调度,同步等问题,实现 起来比字符设备复杂得多.
S3C2410 LCD驱动学习心得-3
2.3.2 实现消息的分派fbmem.c实现了对系统全部FrameBuffer设备的统一管理。
当用户尝试使用一个特定的FrameBuffer时,fbmem.c怎么知道该调用那个特定的设备驱动呢?我们知道,Linux是通过主设备号和次设备号,对设备进行唯一标识。
不同的FrameBuffer 设备向fbmem.c注册时,程序分配给它们的主设备号是一样的,而次设备号是不一样的。
于是我们就可以通过用户指明的次设备号,来觉得具体该调用哪一个FrameBuffer驱动。
下面通过分析fbmem.c的fb_open()函数来说明。
(注:一般我们写FrameBuffer驱动不需要实现open函数,这里只是说明函数流程。
)static int fb_open(struct inode *inode, struct file *file){int fbidx = iminor(inode);struct fb_info *info;int res;/* 得到真正驱动的函数指针*/if (!(info = registered_fb[fbidx])) return -ENODEV;if (info->fbops->fb_open) {res = info->fbops->fb_open(info,1); //调用驱动的open()if (res) module_put(info->fbops->owner);}return res;}当用户打开一个FrameBuffer设备的时,将调用这里的fb_open()函数。
传进来的inode就是欲打开设备的设备号,包括主设备和次设备号。
fb_open函数首先通过iminor()函数取得次设备号,然后查全局数组registered_fb得到设备的fb_info信息,而这里面存放了设备的操作函数集fb_ops。
这样,我们就可以调用具体驱动的fb_open() 函数,实现open的操作。
LCD驱动程序帧缓冲
LCD设备驱动程序LCD是Liquid Crystal Display的简称,也就是经常所说的液晶显示器LCD能够支持彩色图像的显示和视频的播放,是一种非常重要的输出设备Framebuffer 是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行操作Framebuffer又叫帧缓冲,是Linux为操作显示设备提供的一个用户接口。
用户应用程序可以通过Framebuffer透明地访问不同类型的显示设备。
从这个方面来说,Framebuffer是硬件设备显示缓冲区的抽象。
Linux抽象出Framebuffer这个帧缓冲区可以供用户应用程序直接读写,通过更改Framebuffer中的内容,就可以立刻显示在LCD显示屏上Framebuffer是显卡硬件的抽象:Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据结构,可以通过Framebuffer的读写直接对显存进行操作。
用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。
这些操作是由抽象的,统一的。
用户不必关心物理显存的位置、换页机制等具体细节。
这些都是由Framebuffer设备驱动完成的对于Framebuffer而言,只要在帧缓冲区中与显示点对应的区域写入颜色值,对应的颜色会自动在LCD屏幕上显示出来Frambuffer 是标准的字符设备:Framebuffer 是一个标准的字符设备,主设备号是29,次设备号根据缓冲区的数目而定。
Framebuffer 对应/dev/fb%d 设备文件。
根据显卡的多少,设备文件可能是/dev/fb0、/dev/sb1等。
缓冲区设备也是一种普通的内存设备,可以直接对其进行读写。
例如:对屏幕进行抓屏,可以使用下面的命令:cp /dev/fb0 myfile.png一个系统上有多个显示设备。
基于FrameBuffer的嵌入式系统LCD图像显示的实现
第6卷第6期 智能计算机与应用V 〇1.6 N “2 〇 1 6 年 12 月INTELLIGENT COMPUTER AND APPLICATIONS2016基于FrameBuffer 的嵌入式系统LCD 图像显示的实现孙静(吉林师范大学计算机学院,吉林四平136000)摘要:本文以OMAP3530为处理器,S3C2410LCD 控制器为基础,基于嵌入式L inux2.6内核,研究了 FmmaBuffer 机制下的LCD 驱动程序,介绍了相关的数据结构,l 々amaBuffer 的加载和卸载的完整过程。
实现了在LCD 上显示字符、图形、图像的应用。
关键词:帧缓冲;LCD ;图像显示中图分类号:T P 311文献标志码:A文章编号:2095-2163(2016)06-0127-03Realization of LCD display based on FrameBuffer in embedded systemSUN Jing(School of C om puter Science and T e ch n o lo g y , J ilin Nor^mal U n iv e rs ity , S iping J ilin 136000, C h in a )Abstract : U seing O M A P 3530 processor and S 3C 2410 L C D c o n tro lle r , adopting L in u x 2.6, the paper researches LC D d iv e r based onL in u x F ram e B u ffer . A fte r th a t , the paper describes the relevant data s tru c tu re , the load and unload im ple m en tation process on Fram e B u ffer . A t la s t , the paper realizes the displa y of cha racte rs , figures and images on the L C D .Keywords : F ra m e B u ffe r ; L C D ; image d ispla yo 引言随着嵌人式技术的发展,显示模块在嵌人式产品中得到 了日趋广泛的设计应用。
LCD驱动移植
LCD驱动移植首先查看4.3寸TFT液晶显示屏的说明手册,看出来分辨率Resolution是480X3(RGB)X272 另外此块液晶屏配有触摸屏接口,这里说明下,在LINUX2.6内核下对触摸屏的支持,而且本LCD屏幕采用的是普通的4线电阻触摸屏,内核对此有很好的支持,因而对触摸屏驱动并没有做修改,但是对于TFT的LCD显示屏,内核并不支持4.3寸的,因而对于LCD 屏幕的移植其主要工作就是修改其显示参数,使其支持4.3寸的显示对LCD驱动的分析:上图是LINUX的显示设备的框架模型为了说明LINUX的显示框架,在这里说明一个概念。
Linux中利用一种叫帧缓冲的概念:帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。
对于帧缓冲设备而言,只要在显示缓冲区中与显示点对应的区域写入颜色值,对应的颜色会自动在屏幕上显示,18.2.2小节将讲解显示缓冲区与显示点的对应关系。
帧缓冲设备为标准字符设备,主设备号为29,对应于/dev/fb%d 设备文件。
帧缓冲驱动的应用非常广泛,在Linux的桌面系统中,Xwindow服务器就是利用帧缓冲进行窗口的绘制。
嵌入式系统中的Qt/Embedded等图形用户界面环境也基于帧缓冲而设计。
另外,通过帧缓冲可支持汉字点阵的显示,因此帧缓冲也成为Linux 汉化的可行方案。
其中帧缓冲(framebuffer)的驱动就是上图的fbmem.c文件,这个文件中提供了上层应用的接口,在这个文件中包含了对LCD要显示的数据的处理流程,并且向下提供了对硬件的接口,做为驱动编写,就只要关系下层硬件相关部分就可以了,这样的框架大大提高了可移植性和简化了驱动的编写,因为fbmem.c文件是通用的,所以不用修改,另外下层的硬件层次,linux系统也将其划分为两个部分,就是将其注册为平台驱动,采用设备,驱动分离的思想,驱动部分就对应于上图的xxxfb.c,对于我的开发板就是s3c2410fb.c(内核并没有提供2440的驱动,因为2410与2440基本相同,2440就是比2410多几个寄存器),而设备资源部分在BSP板文件中,对应本块开发板就是Mach-smdk2440.c,其中标明了设备的硬件资源参数,对于s3c2410fb.c,具体不再多说明了,详细如上图,很清楚的表明了这个文件的构成,要做修改的就是在Mach-smdk2440.c的LCD设备资源部分。
LCD与FrameBuffer驱动程序的研究与实现
LCD与FrameBuffer驱动程序的研究与实现作者:沈学银来源:《数字技术与应用》2017年第03期摘要:Framebuffer驱动程序在Linux显示器上面具有抽象的特点。
当前科学技术的持续性发展,使得很多MCU-LCD嵌入式的设备在支持上要应用更好的UI界面来实现其良好的视觉效果呈现。
但由于MCU-LCD常使用在早期的单片机内,若仍旧使用Framebuffer架构将会对内核产生较差的影响。
通过分析Framebuffer自身的结构能更好的比对出RGB以及MCU的不足之处,然后设计对应的linux帧缓冲设备驱动程序,满足内核中Framebuffer对MCU-LCD的支持。
关键词:LCD;FrameBuffer驱动;研究与实现中图分类号:TP311.11 文献标识码:A 文章编号:1007-9416(2017)03-0063-02嵌入式的LCD屏幕中能支持的两大硬件接口,其中一种接口是较为常见的RGB接口,另外一种是MCU接口。
MCU-LCD早期是针对单片机领域使用而得名的,所以在使用的时候就多在低端的手机中获得较大的应用,特点是整体价格低廉。
MCU——LCSD接口标准的术语是interfac80,所以在文档中就要使用I80代替MCU-LCD屏。
1 linux下FramBuffer1.1 FrameBuffer机制研究FrameBuffer可以被翻译为帧缓冲,这是一种基础类的图形设备,经常出现在linux2.2的版本内核中,它作为一种驱动型的程序接口而存在的,主要是其他程序的函数数据模式。
这类接口多显示为抽象或者帧缓冲区,作为用户使用该应用程序不需要对底层的驱动程序有着细致的了解,可以将其看成是内存的一种映像反映,无需做深入了解,更无需关注其物理显存的位置或者换页的机制等细节内容,只有将所有的映射引入到空间内,然后再开展读和写的操作,并且所有的操作细则都能在屏幕上直观的呈现出来。
1.2 FramBuffer设备驱动研究FramBuffer主要是实现不同的功能平台控制图,且在控制的时候要让两者能更好的绑定在一起。
FrameBuffer 在LCD上显示JPEG图像
FrameBuffer 在LCD上显示JPEG图像///////////////framebuffer.h#include <stdio.h>#include <fcntl.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <linux/fb.h>#include <sys/mman.h>#include <unistd.h>#include <sys/ioctl.h>#include <string.h>#include <math.h>#define closegr closegraph#define FBDEV "/dev/fb0"static char *default_framebuffer = FBDEV;struct fb_dev{int fb;void * fb_mem;int fb_width, fb_height, fb_line_len, fb_size;int fb_bpp;};static struct fb_dev fbdev;int framebuffer_open (){int fb;struct fb_var_screeninfo fb_vinfo;struct fb_fix_screeninfo fb_finfo;char * fb_dev_name = NULL;if (!(fb_dev_name = getenv("FRAMEBUFFER")))fb_dev_name = default_framebuffer;fb = open (fb_dev_name, O_RDWR);if (fb < 0 ){printf("device %s open failed.\n", fb_dev_name);return -1;}if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_vinfo)) { printf("Can't get VSCREENINFO: %s\n", strerror(errno));close(fb);return -1;}if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_finfo)) {printf("Can't get FSCREENINFO: %s\n", strerror(errno));return 1;} fbdev.fb_bpp = fb_vinfo.red.length +fb_vinfo.green.length + fb_vinfo.blue.length +fb_vinfo.transp.length;fbdev.fb_width = fb_vinfo.xres;fbdev.fb_height = fb_vinfo.yres;fbdev.fb_line_len = fb_finfo.line_length;fbdev.fb_size = fb_finfo.smem_len;printf("frame buffer : %d(%d)x%d, %dbpp, 0x%xbyte\n", fbdev.fb_width, fbdev.fb_line_len, fbdev.fb_height,fbdev.fb_bpp, fbdev.fb_size);/* if (fbdev.fb_bpp != 16) {printf ("frame buffer must be 16bpp mode. \n");exit(0);}*/fbdev.fb_mem = mmap (NULL, fbdev.fb_size,PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);if (fbdev.fb_mem == NULL || (int) fbdev.fb_mem == -1) { fbdev.fb_mem = NULL;printf("mmap failed.\n");close(fb);return -1;}fbdev.fb = fb;memset (fbdev.fb_mem, 0x0, fbdev.fb_size);return 0;}void framebuffer_close(){if (fbdev.fb_mem) {munmap (fbdev.fb_mem, fbdev.fb_size);fbdev.fb_mem = NULL;}if (fbdev.fb) {close (fbdev.fb);fbdev.fb = 0;}}/////////jpeg2LCD.c#include "framebuffer.h"#include "jpeglib.h"#include <setjmp.h>// error handler, to avoid those pesky exit(0)'sstruct my_error_mgr {struct jpeg_error_mgr pub; /* "public" fields */jmp_buf setjmp_buffer; /* for return to caller */};typedef struct my_error_mgr * my_error_ptr;//////METHODDEF(void) my_error_exit (j_common_ptr cinfo); //// to handle fatal errors.// the original JPEG code will just exit(0). can't really// do that in Windows....//METHODDEF(void) my_error_exit (j_common_ptr cinfo) {/* cinfo->err really points to a my_error_mgr struct, so coerce pointer */my_error_ptr myerr = (my_error_ptr) cinfo->err;char buffer[JMSG_LENGTH_MAX];/* Create the message */(*cinfo->err->format_message) (cinfo, buffer);/* Always display the message. *///MessageBox(NULL,buffer,"JPEG FatalError",MB_ICONSTOP);/* Return control to the setjmp point */longjmp(myerr->setjmp_buffer, 1);}int Jpeg2LCD(char * filename, int x,int y){// get our buffer set to hold dataunsigned short *p = (unsigned short *)fbdev.fb_mem;//定义framebuffer大的内存空间int width=0;int height=0;struct jpeg_decompress_struct cinfo;struct my_error_mgr jerr;FILE * infile=NULL; /* source file */JSAMPARRAY buffer; /* Output row buffer */int row_stride; /* physical row width in output buffer */if ((infile = fopen(filename, "rb")) == NULL) {printf("JPEG :\nCan't open %s\n", filename);return -1;}/* Step 1: allocate and initialize JPEG decompression object */ /* We set up the normal JPEG error routines, then override error_exit. */cinfo.err = jpeg_std_error(&jerr.pub);jerr.pub.error_exit = my_error_exit;/* Establish the setjmp return context for my_error_exit to use. */if (setjmp(jerr.setjmp_buffer)){jpeg_destroy_decompress(&cinfo);if (infile!=NULL)fclose(infile);return -1;}/* Now we can initialize the JPEG decompression object. */ jpeg_create_decompress(&cinfo);/* Step 2: specify data source (eg, a file) */jpeg_stdio_src(&cinfo, infile);/* Step 3: read file parameters with jpeg_read_header() */ (void) jpeg_read_header(&cinfo, TRUE);/* Step 4: set parameters for decompression *//* In this example, we don't need to change any of the defaults set by* jpeg_read_header(), so we do nothing here.*//* Step 5: Start decompressor */(void) jpeg_start_decompress(&cinfo);////////////////////////////////////////////////////////////// how big is this thing gonna be?width = cinfo.output_width;height = cinfo.output_height;/* JSAMPLEs per row in output buffer */row_stride = cinfo.output_width * cinfo.output_components; /* Make a one-row-high sample array that will go away when done with image */buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);/* Here we use the library's state variable cinfo.output_scanline as the* loop counter, so that we don't have to keep track ourselves.*/p+=(y)*fbdev.fb_line_len/2;//文件指针指向开始while (cinfo.output_scanline < cinfo.output_height){int count;unsigned char * buf;(void) jpeg_read_scanlines(&cinfo, buffer, 1);buf=buffer[0];if (cinfo.out_color_components==3){for (count=0;count<width;count++){//buffer[count*3]; R//buffer[count*3+1]; G//buffer[count*3+2]; Bp[x+count]=((buf[count*3]>>3)<<11)|((buf[count*3 +1]>>2)<<5)|(buf[count*3+2]>>3);}}else if (cinfo.out_color_components==1){for (count=0;count<width;count++){p[x+count]=((buf[count]>>3)<<11)|((buf[count]> >2)<<5)|(buf[count]>>3);}}p+=fbdev.fb_line_len/2;}(void) jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);fclose(infile);return 0;}int main (void){framebuffer_open(); Jpeg2LCD("image.jpg",0,0);usleep(1000*100);framebuffer_close(); return 0;}编译时需要jpeglib库支持。
LCD驱动实验报告
实验序号:6实验项目名称:LCD驱动实验
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的
1.了解LCD基本概念与原理。
2.了解Linux下LCD的Framebuffer结构原理
3.了解用总线方式驱动LCD模块。
4.熟悉用ARM内置的LCD控制器驱动LCD。
二、实验设备(环境)及要求
硬件:UP-TECHPXA270-S嵌入式开发板、PC机Pentumn500以上,硬盘10G以上。
软件:PC机操作系统REDHAT NUX 9.0+MINICOM+ARM-LINUX开发环境
三、实验内容与步骤
1打开一个命令终端,并切换到内核目录树的最顶层(linux-2.6.9)运行make menuconfigMake menuconfig->Graphics support,修改为M,即编译成模块,保存退出后,make zImage编译成内核镜像
五、实验总结
在设计过程中,通过本次实验,我了解LCD显示器的结构特点,了解S3C2410的LCD驱动模块工作原理,掌握用简单LCD驱动程序设计等,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作。课程设计是我们专业课程知识综合应用的实践训练,从事职业工作前一个必不少的过程.在这次设计过程中,体现出设计ARM驱动程序的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
2把/up-techpxa270/exp/kernel/linux-2.6.9/drivers/video目录下的几个关于lcd的文件拷贝到我们自己建立的工作目录下(/up-techpxa270/exp/drivers/lcd)
framebuffer设备原理
framebuffer设备原理Framebuffer是一种在计算机图形处理中常见的设备,它用于存储显示屏上每个像素的颜色信息。
Framebuffer设备是计算机系统中的一种虚拟设备,它提供了一种机制,使得操作系统和应用程序能够与显示硬件进行高效地交互。
本文将介绍Framebuffer设备的基本原理,并提供相关参考内容供读者进一步学习。
Framebuffer设备的基本原理是将每个显示屏上的像素映射到内存中的一块连续区域,称为帧缓冲区。
帧缓冲区是一个二维数组,每个元素表示一个像素的颜色值。
操作系统和应用程序可以直接读取和写入帧缓冲区中的数据,从而实现图形的显示和更新。
Framebuffer设备的工作流程如下:1. 操作系统初始化:在系统启动过程中,操作系统会检测并初始化Framebuffer设备。
这通常涉及分配内存空间,设置设备参数等操作。
2. 应用程序与Framebuffer设备交互:应用程序可以通过操作系统的API或系统调用与Framebuffer设备进行交互。
例如,应用程序可以请求读取或写入帧缓冲区的数据。
3. 显示控制器更新显示:当帧缓冲区中的数据发生变化时,显示控制器会将新的数据发送到显示设备上,从而更新屏幕上的图像。
Framebuffer设备的设计有以下一些关键要点:1. 缓冲区管理:Framebuffer设备需要分配一块连续的内存作为帧缓冲区,用于存储图像数据。
操作系统需要设计合理的算法来管理帧缓冲区的分配和释放,以实现高效的图像操作。
2. 像素格式:不同的显示设备支持不同的像素格式,例如RGB、RGBA等。
Framebuffer设备需要灵活支持各种不同的像素格式,并能够进行格式转换以适应不同的应用需求。
3. 双缓冲技术:为了避免图像闪烁和撕裂等问题,Framebuffer 设备通常采用双缓冲技术。
双缓冲技术使用两个帧缓冲区,一个用于显示当前的图像,另一个用于更新下一帧的图像。
这样,在切换帧缓冲区时,可以实现无闪烁的图像更新。
Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型
Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型一、Linux的帧缓冲设备帧缓冲(framebuffer)是Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
这种操作是抽象的,统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由Framebuffer 设备驱动来完成的。
帧缓冲驱动的应用广泛,在linux 的桌面系统中,Xwindow 服务器就是利用帧缓冲进行窗口的绘制。
尤其是通过帧缓冲可显示汉字点阵,成为Linux汉化的唯一可行方案。
帧缓冲设备对应的设备文件为/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 函数,可将文件的内容映射到用户空间。
对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
linux的lcd驱动详细讲解
嵌入式驱动程序Day12Top1.LCD驱动设计开发1 LCD驱动设计开发1.1 问题通过lcd驱动开发掌握linux内核framebuffer驱动开发通用方法。
1.2 方案一、帧缓冲(Framebuffer)。
帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。
Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过 Framebuffer的读写直接对显存进行操作。
用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。
这种操作是抽象的,统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由 Framebuffer设备驱动来完成的。
Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池。
CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理。
应用程序也可以直接读写这个水池的内容。
在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过mmap 系统调用进行地址映射。
FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
二、FrameBuffer在Linux中的实现和机制。
Framebuffer对应的源文件在linux/drivers/video/目录下。
总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。
1.分析Framebuffer设备驱动。
FrameBuffer设备驱动基于如下两个文件:(1)linux/include/linux/fb.h(2)linux/drivers/video/fbmem.c2.分析这两个文件。
S3C2440上LCD驱动详解
S3C2440上LCD驱动(FrameBuffer)实例开发讲解一、开发环境·主机:VMWare--Fedora 9·开发板:Mini2440--64MB Nand, Kernel:2.6.30.4·编译器:arm-linux-gcc-4.3.2二、背景知识1. LCD工作的硬件需求:要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。
在通常情况下,生产厂商把LCD驱动器会以COF/COG 的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。
通过LCD 控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。
2. S3C2440内部LCD控制器结构图:我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器:a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成;b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的;c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上;d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN 就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。
LCD驱动及Framebuffer相关
LCD驱动及Framebuffer相关内容提要:1. android display相关的名词2. 调试LCD驱动需要注意的步骤3. 关于帧缓冲区及I/O内存------------------------------------------------------------------------------------------1.名词解释GPU:Graphic Processing Unit (图形处理器)OpenGL:Open Graphic Library 定义了一个跨编程语言、跨平台的编程接口的规格,不同厂商会有不同的实现方法,它主要用于三维图象(二维的亦可)绘制。
SurfaceFlinger:Android中负责Surface之间叠加、混合操作的动态库Skia:Android中的2D图形库libagl:Android中通过软件方法实现的一套OpenGL动态库libhgl:为区别libagl,自定义的一种叫法。
特指GPU厂商提供的硬件实现的OpenGLcomposition:特指SurfaceFlinger对各个Surface之间的叠加、混合操作render:特指使用OpenGL动态库进行3D渲染copybit:Android使用2D引擎来加速图形操作(主要是Surface 之间的composition操作)的一种技术,对应着一个或几个动态库。
pmem:Android特有驱动,从linux内核中reserve物理连续内存,可以为2d、3d引擎、vpu等设备分配物理连续内存。
Android在启动后,会在运行时根据配置文件加载OpenGL (libagl & libhgl)的实现,如果有libhgl实现,默认使用libhgl实现,否则使用libagl实现。
OpenGL在Android中两个作用:1. 用于Surface的composition操作。
SurfaceFlinger会调用到OpenGL中,通过libagl或者libhgl做Surface的组合、叠加操作。
linux下LCD(framebuffer)驱动分析
struct work_struct queue; /* Framebuffer event queue */
struct fb_pixmap pixmap; /* Image hardware mapper */
struct fb_pixmap sprite; /* Cursor hardware mapper */
.resume = s3c2410fb_resume,
.driver = {
.name = "s3c2410-lcd",
.owner = THIS_MODULE,
},
};
ቤተ መጻሕፍቲ ባይዱ
当注册平台驱动成功时,最终会调用 s3c2410fb_probe 函数.而这个函数根据具体的芯片
类型,将不同参数传入 s3c24xxfb_probe 函数中,后者主要完成硬件资源的探测初始化,中断
工程师的任务是什么呢?获取平台设备的相关信息,并初始化相关的硬件设备,注册中断,开辟
帧缓冲内存,注册帧缓冲设备,这就是 s3c2440fb.c 中的主要内容了.里面有一个重要的数据
结构:
static struct fb_ops s3c2410fb_ops = {
.owner
= THIS_MODULE,
/* Backlight level curve */ struct mutex bl_curve_mutex; u8 bl_curve[FB_BACKLIGHT_LEVELS]; #endif #ifdef CONFIG_FB_DEFERRED_IO struct delayed_work deferred_work; struct fb_deferred_io *fbdefio; #endif
基于Framebuffer的DSP平台LCD驱动程序的实现与应用
基于Framebuffer的DSP平台LCD驱动程序的实现与应用封岸松;杨柳;王庆辉
【期刊名称】《计算机系统应用》
【年(卷),期】2009(18)4
【摘要】论述了在uClinux中基于Framebuffer的LCD驱动程序的实现方法.首先主要介绍Framebuffe的处理机制以及底层驱动的接口函数,并在ADSP-BF561平台上进行了具体实现;其次在Framebuffer的基础上,简要介绍了嵌入式图形用户接口MiniGUI,并在ADSP-BF561平台上进行了移植;最后通过实际效果测试,验证了工作的正确性.并将其应用于无线网络视频监控系统中的人机接口中.
【总页数】4页(P131-134)
【作者】封岸松;杨柳;王庆辉
【作者单位】沈阳化工学院,信息工程学院,辽宁,沈阳,110142;沈阳化工学院,信息工程学院,辽宁,沈阳,110142;沈阳化工学院,信息工程学院,辽宁,沈阳,110142
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于Framebuffer的LCD驱动程序的实现 [J], 雷鸿;熊文龙;杨单
2.LCD与FrameBuffer驱动程序的研究与实现 [J], 沈学银
3.基于FrameBuffer的嵌入式系统LCD图像显示的实现 [J], 孙静;
4.基于Framebuffer的LCD驱动程序设计 [J], 常赟杰;张位勇
5.LCD与FrameBuffer驱动程序的研究与实现 [J], 沈学银
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式 的 L C D 屏幕 中能支持的两大硬件接 口, 其中一种接 口是
F r a mB u  ̄ e r 主要是实现不同的功能平台控制图 , 且在控制的时
较为常见的R G B 接 口, 另外一种是MC U接 口。 MC U— _ L C D 早期是针 候要让两者能更好的绑定在_起。 F r a mB f e r 的优点是能支持不 同
支持上要 应用更好 的uI 界 面来实现 其良好 的视 觉效果呈现。 但 由于MC U— L C D常使 用在早期 的单 片机 内, 若仍 旧使 用F r a me b u f e r 架构将 会对 内核 产生较差的影响 。 通过分析F r a me b u f e r 自身的结构能更好 的比对 出RG Bv X Y  ̄MCU的不足之 处, 然后设计对应的l i n u x 帧缓 冲设备
做 深入 了解 , 更无需关注其物理显存 的位置或者换页的机制等细节 内容 , 只有将所有的映射 引入 到空 间内, 然后再开展读和写的操作 , 并且所有 的操作细则都能在屏幕上直观 的呈现出来 。
1 . 2 F r a mB u f e r 设 备 驱 动 研 究
受到现实设备 的特殊性影响 , 驱动层接 口 处保护的内容有底层 函数 、 记录设备状态数据。 1 i n u ) ( 最为缓冲 的帧设备 , 主要是在驱动层
屏。 1 l i n u x 下F r a mB u 仟 e r
F r a me BUf f e r 的驱动主要是是现在重点文件接 口处 , 要求所有
的层 次机构都要讲数据寄存在I / O 内存层 。
1 . 2. 1 文 件 层 次 接 口层
1 . 1 F r a me Bu f e r ;  ̄ 1 ] 研 究 F r a me B u f e r 可以被 翻译为 帧缓 冲 , 这是一种基础 类的图形设
2 . 1驱 动程 序 初 始化 函数 设 计
显 示控制 台
l
函数的设 计 中要先创建F r a mB u f f e r 设备的结构体然后使用函 数获取对应的L C D 屏来 匹配初始化 的数据源 , 其 中初始化 的内容 主
1 . r
要是对其 固定 的信息、 可变 的信息和显示 的模式开展初始化处理 。 然后 可以在s 3 c 2 4 1 0 f b s i n f o 结构 中映射出有关s 3 c 2 4 1 0 f b s o p s 的
的出 口处进行结构定义, 通过 定义现实当前的显示卡的具体工作情
况, 从而反应出内核的情况 。 但 由于嵌入 式系统整体操作 比较简单,
能够 涉及 到的结构成员很少 。
命 令 解 释 器
● l
l G u 泊 勺 图 形 引 擎
l i n l 】 × 内木 玄
2驱 动 程 序设 计
质中, 这样就能直接显示 出显示器 的物理地址 。
2 . 2位 图显 示AP I 设 计
B M P 主要的文件构成形式是 : 文件头、 位图信息、 颜色信息和图
l
收 稿 日期 : 2 0 1 7 — 0 2 — 2 6
底 层 硬 件 设 备
图1 F r a mB u f f e r 驱 动层次关 系
f r a m曲 u f e r 文件层 次接 口层
指针 , 并在 内核中 申 请 连续空间 , 将这部分空间看 成是缓存 的处理
I
f r a m e b u 仟 e r 马 区 动 层 次 接 口 层
f r a me b u f e r 硬 件 寄存嚣 稠 / O内存 层
阶段 , 把显示器的地址直接添] J l g J l s 3 c 2 4 1 0 f  ̄ i n l中的D f MA传输地
1 . 2 . 2 驱 动 层 次 接 口层
备, 经常出现 ̄ d i n u x 2 . 2 的版本 内核中, 它作为一种驱动型的程序接
口而存在 的 , 主要是其他程序的函数数据模式 。 这 类接 口多显示 为
抽象或者帧缓冲区 , 作为用户使用该 应用程序不需要对底层 的驱动 程序有着 细致的 了解 , 可 以将其看成是 内存 的一种映像反 映, 无需
使用帧缓冲设备的时候能实现不同的数据处理 , 处理 中设备的 不同操作流程 也有所不 同。 比如进行 内存映射 的时候 , 文件的开 关 以 及底层文件的函数都可以作为基础 内容而封存 , 这样就能满足对 文件的 内存控制 , 并能合理 的调用接触 口的读写函数 , 这些函数 的
提取能满足其 内核的使 用需 求。
对单片机领域使用而得名的, 所 以在使用的时候就多在低端 的手机 类型 的硬件 , 并能支持新设 备开发过程 中产生的巨大工 作量 。 它们 中获得较大的应用 , 特点是整体价格低廉 。 MC U ——I c s D 接 口标 的关系如 图l 示。 准的术语是i n t e f a c 8 0 , 所以在文档 中就要使用I 8 0 代替MC U — L C D
_ J 叶 “ 技 术
应用研究
L C D s F r a me B u f f e r 驱动程序的研究与实现
沈 学银
( 扬州万方 电子技术有限责任公 司, 江苏扬 州 2 2 5 0 0 6 )
摘要: F r a me b u f e r 驱动程序在L i n u x 显示器上面具有抽 象的特 点。 当前科 学技 术的持 续性发展, 使得很 多MC U- L C D嵌入式的设备在
驱动程序, 满足 内核 中F r a me b u f e r 对MCU— L C D的支持 。 关键 词: L CD ; F r a me B u f f e r 驱动 ; 研 究 与 实现 中图分类号: T P 3 1 1 . 1 1 文献标识码 : A 文章编号: 1 0 0 7 — 9 4 1 6 ( 2 0 1 7 ) 0 3 . 0 0 6 3 - 0 2