




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学毕业设计(论文)基于Linux系统的图形驱动的研究和实现学院(系): 理学院 专业班级: 电信科专业 1002班 学生姓名: 郑启涛 指导教师: 刘子龙 学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包括任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。作者签名: 年 月 日学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士论文评选机构将本学位论文的全部或部分内容编入有关数据进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。本学位论文属于1、保密囗,在 年解密后适用本授权书2、不保密囗 。(请在以上相应方框内打“”)作者签名: 年 月 日导师签名: 年 月 日摘 要随着随着通讯技术的发展和3G网络的推广,越来越多的嵌入式系统,包括PDA、机顶盒、WAP手机、以及近年来在国内外快速崛起的4K*2K电视等系统要求提供全功能的GUI设计,这包括HTML的支持、Java Script的支持、甚至包括Java的虚拟机的支持。而这一切都需要有一个高性能、高可靠的GUI支持。PDA (Personal Digital Assistant) 正是在这种背景下产生,并且发展壮大,它不仅集成了传统手机的基本功能,同时兼容了笔记本电脑的诸多功能,真正满足了用户需求。PDA市场潜力巨大,是个人终端技术的发展趋势。本文以嵌入式的PDA为研究对象,论述了基于嵌入式Linux和Qt/Embedded的图形界面终端的设计与实现,最终搭建了适用于PDA的个性化人机交互系统。在Linux嵌入式操作系统下,研究了Linux控制台下的一个通用图形接口FrameBuffer,其中,重点剖析了FrameBuffer的体系结构,详细讨论了基于FrameBuffer的设备驱动实现方式,并在此图形驱动之上引进了深圳海思半导体有限公司所研发的HiFB图形驱动,实现了Framebuffer的基本绘图功能,并使用海思公司所研发的TDE(Two Dimensional Enginel)对Framebuffer绘图进行加速处理,最后用JPEG解码显示的程序来验证所研究的图形驱动功能优于现阶段大部分其他产品。关键词:framebuffer;图形驱动;嵌入式系统;PDA;Linux系统Abstract With the promotion of the development of communication technology and the 3G network, more and more embedded systems, including PDA, set-top box, WAP mobile phone, and the rapid rise in domestic and abroad in recent years 4K*2K TV systems required to provide GUI design of full function, which include HTML support, Java Script support, including the Java virtual machine in support of. All this needs a high performance, high reliable GUI support. PDA (Personal Digital Assistant) is produced in this context, and development, it not only integrates the basic function of the traditional mobile phone, also compatible with many functional notebook computer, truly meet the needs of the customers. PDA has great potential in the market, is the trend of the personal terminal technology.In this paper, the embedded PDA as the object of study, discusses the design and implementation of embedded Linux terminal graphic interface and based on Qt/Embedded, and ultimately set up personalized human-computer interaction system suitable for PDA. The embedded operating system Linux, which studied a common graphical interface FrameBuffer, Linux console, analyzes the system structure of FrameBuffer, discussed the realization way drive device based on FrameBuffer, and on the graphics driver on the introduction of the Shenzhen-Holtek semiconductor limited company R & D HiFB graphics driver, to achieve the basic drawing the functions of Framebuffer, and use the Hisilicon company R & TDE (Two Dimensional Enginel) on the Framebuffer drawing to accelerate the processing, finally JPEG decoder display program to certificate the graphics driver function is better than most other products at the present stage.Keywords: framebuffer; graphics driver; embedded system; PDA; Linux systemII目 录第1章 绪论11.1 嵌入式图形驱动研究背景11.2 论文研究内容21.3 章节安排2第2章 嵌入式系统环境构建32.1 嵌入式Linux介绍32.2 Linux向ARM移植的特点和环境搭建42.2.1 嵌入式Linux软件构成42.2.2 交叉编译环境搭建42.3 Linux内核的移植42.3.1 内核概述42.3.2 内核结构分析5第3章 图形驱动的研究与实现73.1 Linux嵌入式系统的Frambuffer研究73.1.1 FrameBuffer驱动程序分析73.1.2 FrameBuffer驱动程序实现93.2 约定103.2.1 寄存器访问约定103.2.2 寄存器复位值约定103.2.3 数值单位约定103.2.4 数值单位约定113.3 HiFB图形驱动的设计与实现123.3.1 体系结构123.3.2 HiFB与Linux Framebuffer对比123.3.3 原理介绍143.3.4 参数设置153.3.5 配置举例163.3.6 开发流程173.3.7 实例介绍173.4 TDE的设计与实现193.4.1 工作流程193.4.2 实例介绍19第4章 JPEG解码在Frambuffer上的应用234.1 原理解释234.2 libjpeg函数库介绍234.4 JPEG解码说明26第五章 结论27参考文献28附 录29致 谢41第1章 绪论在如今这个科技技术高速发展的时代,人们对质量生活的追求越来越高,日常生活中的普清与高清已经无法满足人们的需求,一种能够提供超清像素与分辨率的感官感受用品亟待诞生!所以,在Linux嵌入式操作系统下研究与实现图形驱动将为此做出更有可能性的挑战。1.1 嵌入式图形驱动研究背景近年来,嵌入式系统获得了迅猛的发展,在消费类电子产品与工业控制智能仪表等领域获得了广泛的应用。随着嵌入式硬件性能的不断变好,使得在嵌入式设备上显示精美的图形用户界面成为可能,同时智能手持设备、智能仪表的迅猛发展也对GUI产生了极大的市场需求1。GUI在嵌入式系统或者实时系统中的地位越来越重要,比如PDA、DVD播放机、WAP手机等,都需要一个完整漂亮的图形用户界面显示图像。由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性、体积小、运行时耗用系统资源小、上层接口与硬件无关、高度可移植、高可靠性、在某些应用场合应具备实时性等特点,以适应不同的硬件平台和性能使用需求2。随着嵌入式系统的广泛应用,PDA、机顶盒、DVD/VCD播放机及WAP手机已经迅速普及3。图形用户界面(GUI)的广泛流行,是当今计算机技术的重大成就之一。另外嵌入式系统往往是一种定制设备,它们对GUI的需求也各不相同。有些系统只要求一些图形功能,而有些系统要求完备的GUl支持,因此,GUI也必须是可定制的。比较常用的有如下几种GUI系统:MiniGUI、MicroWindows及QT/Embedded等总体来讲,嵌入式GUI具备以下特点:体积小、轻型;运行时耗用系统资源小;上层接口与硬件无关,高度可移植、配置;高可靠性、高性能;在某些应用场合应具备实时性。未来嵌入式系统图形用户界面层的研究丰要将着重于可移植性、标准性、与具体硬件平台无关性、可剪裁性等方面。主要的研究内容涉及到:多线程,多进程的使用、消息驱动、完备触摸屏和显示设备相关的驱动程序、实现与X-Window标准的部分兼容、支持不同语言文字输入输出等。1.2 论文研究内容 嵌入式Linux中图形用户界面的研究主要分为三个方面:1)基于Linux的framebuffer驱动程序的研究开发,实现底层的图形驱动封装、彻底隐藏硬件信息;2)基于仔amebuffer的图形私有引擎的研究开发,完成上层图形API的实现。比如:画线、画矩形等函数;3)嵌入式图形驱动的研究与实现,用JPEG解码演示Frambuffer的实现。在开发过程需要对Linux内核运行机制,帧缓存驱动,GUI结构及原理有深刻认识,并通过对国内外Microwindows、MiniGUI、Qt/Embedded等嵌入式GUI的研究,分析其结构与原理,找到适合本课题开发系统的GUI设计方案,继而开发出适用于“多路嵌入式数字视频录像机”的图形用户界面;并从中研究出嵌入式Linux下设计图形用户界面的一般方法,使嵌入式GUI可以应用在多种硬件平台上,满足社会的需求。1.3 章节安排 本文共分为五个章节:1、第一章为绪论,介绍论文的研究背景;2、第二章主要分析嵌入式的研究现状及涉及的研究内容;3、第三章主要是关于底层图形发生引擎的研究与开发;4、第四章主要为本文作者关于图形驱动实际应用的JPEG解码显示的设计与代码实现;5、第五章为结论。第2章 嵌入式系统环境构建2.1 嵌入式Linux介绍嵌入式Linux(Embedded Linux)是标准版Linux经过定制裁剪的结果,它体积小,应用专一,适合于嵌入式产品开发的特殊要求。目前市场上的嵌入式产品,一半左右使用的是嵌入式Linux操作系统。Linux之所以能在市场上占有如此大的份额,与其自身的优点是分不开的4,这些特点是:1、广泛的硬件支持 Linux支持多种硬件平台,几乎能运行在所有常见的嵌入式微处理器上,如ARM、X86、PowerPC、MIPS等。此外,Linux的外设驱动资源也非常丰富,支持各种主流硬件设备和硬件技术。2、内核高度稳定,模块化Linux内核高效和稳定已经在各个领域内得到了大量实用产品的验证,这主要源于精巧的内核设计。Linux内核可分为进程调度、内存管理、进程通信、文件系统和网络设备五大部分,其模块化机制可以使用户随时加载或卸载内核的功能模块,便于内核裁剪的更加小巧,很适合嵌入式系统开发的应用。3、免费、开放源码,应用软件丰富Linux的源代码免费、开放,任何人都可以从其官网下载各个版本源代码,这对于开发嵌入式系统是至关重要的。参考这些源码,开发人员可以对嵌入式Linux进行二次开发,根据自己系统的特殊要求设计软件。此外,Linux下还有着众多的开源应用软件资源,用户要开发自己的软件只要找个功能相近的软件源码进行修改就可以了,大大加快了软件开发速度。4、优秀的开发工具嵌入式开发必须有一套开发调试工具,Linux带有UNIX的完善的开发工具。同时,嵌入式Linux的开发者为我们提供了完整的嵌入式开发工具链,包括GNU的编译器gcc,试工具gdb、kgdb、xgd等,这些工具为操作系统下各个级别软件的开发调试提供了方便。只要目标板串口和宿主机连接,开发工作就能进行。5、完善的网络通信和文件管理机制Linux下有着完善的网络模块,包括网络设备驱动和网络协议,很容易移植到嵌入式系统中。此外,Linux还支持多种常见的文件系统,如ext2、ext3、yaffs、jffs、nfs、cramfs等,为嵌入式开发打下了良好的基础5。2.2 Linux向ARM移植的特点和环境搭建 这部分介绍如何搭建嵌入式软件平台,包括交叉编译环境的搭建方法,引导程序vivi向ARM的移植方法及过程,Linux-2.4.18内核向ARM移植的具体步骤,以及根文件系统的制作步骤及下载安装。搭建这个嵌入式软件平台是项目开发的最基础最重要的环节之一,之后就可以在这个嵌入式平台上进行软件的进一步开发。2.2.1 嵌入式Linux软件构成 由于嵌入式软件运行于特殊的目标平台,开发的产品应用领域比较专一,所以嵌入式设备对微处理器,存储器和通信资源等的要求也比较苛刻,要求在尽量节省资源的情况下实现其功能。嵌入式开发的主要特点有:1、需要交叉编译环境。因为目标板受自身资源局限,不能用来安装开发环境,因此,嵌入式应用软件要在交叉开发环境下完成编译、连接和调试。交叉编译环境不同于普通的开发环境,它要部署在有通信连接的宿主机和目标板之间。2、宿主机是一台PC机,它通过串口、并口或网络与目标机进行通信。宿主机上安装功能强大的交叉编译工具,实现嵌入式开发中软件的编译和连接。目标机是嵌入式软件运行的实际环境,在宿主机上开发的应用软件要下载到目标机上运行测试。3、需要固化程序。普通应用软件在开发完成后就可以直接运行使用,其目标环境就是PC机,开发环境和应用环境基本相同。嵌入式开发在PC上进行,但是运行环境是嵌入式设备,软件必须存储在嵌入式设备的非易失性存储器中。所以,在开发完成之后要进行代码的固化,把固化程序移植到目标机的flash中。2.2.2 交叉编译环境搭建交叉编译环境的硬件支持为:宿主机:PC一台,安装WindowsXP/7操作系统,安装Xshell软件。PC机有串口(或是USB转串口)和并口同目标板通信。2.3 Linux内核的移植2.3.1 内核概述内核是Linux系统的核心,用来提供用户层程序和硬件之间的接口,执行发生在多任务系统中的实际任务转换,处理读写磁盘的需求,处理网络接口,以及管理内存等。Linux为进行系统移植提供了以下支持:1、分层结构Linux内核的设计吸收了层次结构和硬件抽象层(HAL)的思想,对内核进行分层,以便使硬件相关的部分和其他上层实现分离,从而增强了设备的无关性,增强了系统的可移植性。分层结构使用户不需要关心底层如何完成操作的细节,具体对设备的操作由设备驱动程序去完成。在Linux下,分层结构使得用户可以像使用普通文件一样,对字符设备或块设备进行操作。2、可加载模块机制可加载模块机制,即在系统启动后的任何时候都可以动态加载代码模块。当不需要此模块时,又可以将它从内核中卸载。这种机制很好地解决了内核功能扩展的问题,并且大大方便了Linux平台下驱动程序的开发,增强了系统的伸缩性和运行效率6。2.3.2 内核结构分析Linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信。1、进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。2、内存管理允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。3、虚拟文件系统隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。4、网络接口提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备通讯。5、进程间通讯支持进程间各种通信机制。根据这5个子系统的组成与结构,Linux内核将其源代码进行分类组织,整个代码分布如图2.1所示:BlockExt2ArmBridgekUsbVfatMipsUnixDriversFsArchNetIncludeIpcInitKernelMm图2.1 Linux 内核源代码分布/include子目录包含了建立内核代码时所需的大部分库文件,它还包含不同平台需要的库文件。/init子目录包含了内核的初始化代码。/kernel子目录包含了内核管理的核心代码。/mm子目录包含了所有内存管理代码。/ipc子目录包含了进程间通信代码。/drivers子目录包含了内核中所有的设备驱动程序。该目录占了整个内核代码的一半以上,非常庞大。/fs子目录包含了Linux支持的所有的文件系统代码,如ext2,ext3和jffs2等。/arch子目录包含了体系结构相关部分的内核代码,其中的每一个目录都代表一种硬件平台。/net子目录包含了和网络相关的代码,如atm,ipv4和ipv6等。除此之外,还有lib和scripts等几个子目录。lib子目录包含了核心的库代码。scripts子目录包含了配置内核的一些脚本文件7。第3章 图形驱动的研究与实现3.1 Linux嵌入式系统的Frambuffer研究FrameBuffer只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。其对应的源文件在linux/drivers/video目录下,总的抽象设备文件fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。3.1.1 FrameBuffer驱动程序分析FrameBuffer设备驱动基于如下两个文件:user/include/linux/fbh和drivers/video/fbmemc1、分析“fbh”FrameBuffer主要的结构几乎都是在这个文件中定义的。这些结构包括:fb_fix_screeninfofb_fix_screeninfo含有当前FrameBuffer模式的许多信息,其定义了视频板卡的某些固定的特性。这些信息与硬件密切相关,并且是不可修改的,当选定了显示控制器和显示器后,它的硬件特性也就定了下来a在这个结构体中最重要的是smem_len和line_length,前者指示显存的大小,后者提供了一个显示行的byte统计数,使显存指针很方便的移到下一显示行。fb_var_screeninfofb_var_screeninfo结构描述了显卡的特性,这些特性在程序运行期间可以由应用程序动态改变。成员变量xres和yres定义在显示屏上真实的分辨率:而xres_virtual和yresvirtual是虚拟分辨率,它们定义的是显存分辨率。xoffset表示从什么位置开始示,例如xoffset=0,表示从显存0列开始显示xres列。通过改变这些值,驱动程序将对这些值进行优化,以满足设备特性(如果设备不支持设定的值,返回EINVAL)。fb_cmapfb_smap描述与设备无关的颜色映射信息,可以通过FBIOGETCMAP和FBIOPUTCMAP对应的ioctl操作设定或者获取颜色映射信息。在FrameBuffer下对屏幕的最基本操作是写像素和读像素,依据颜色模式的不同,需要对不同的颜色深度作不同的处理。在屏幕的字符输出上,由于FrameBuffer是图形模式,所以屏幕的输出都是以写像素为基础的,写字符的方法是直接使用字体的点阵以像素的形式输出到屏幕上。在屏幕的图像输出上,它比字符输出更复杂。其中原因之一是颜色问题,首先要考虑显示图像的颜色是否多于FrameBuffer模式的颜色,如果颜色较多则必须考虑使用抖动的方法解决或者其他减色的方法解决,比如转换图像的格式或者使用ppmquant减色工具。如果显示图像的颜色数较少,也需要考虑FrameBuffer颜色表的重新映射问题,即获得FB的颜色表并按图像的颜色表改变,然后重写FB的颜色表8。fb_infofb_info结构定义了当前显卡FrameBuffer设备的独立状态,一个显卡可能有两个FrameBuffer,在这种情况下,就需要两个fb info结构,这个结构是唯一在内核空间见的。在这个结构中有一个fb_ops指针,指向驱动设备工作所需的函数集。fb_opsfb_ops这个结构就是用来支持通过ioctl()系统调用操作设备的。2、分析“fbmemc”“fbmemc”处于FrameBuffer设备驱动技术的中心位置,它为上层应用程序提供系统调用,也为下一层的特定硬件驱动提供接口。那些底层硬件驱动需要用到这里的接口来向系统内核注册。“fbmem.c”为所有支持FrameBuffer的设备提供了通用的接口,避免重复工作。这里对“fbmem.c”比较重要的几个变量、结构体和函数作一介绍。全局变量:struet fb_info *registered_fbFB_MAX;int num_registered_fb;这两个变量记录了所有fb_info结构的实例,所有设备对应的fb_info结构都保存在数组registered_fb中,当一个FrameBuffer设备驱动向系统注册自己时,其对应的fb_info结构就会添加到这个结构中,同时num_registered_fb会自动加1。结构体:如果FrameBuffer设备被静态的链接到内核,其对应的入口就会添加到这个表中;如果是动态加载的,即使用insmod/rmmod,就不需要关心这个表。fb_ops用来给应用程序提供接口。函数:register_framebuffer(struct fb_info *fb_info);unregister_framebuffer(struct fb_info *fb_info);这两个函数是提供给下层FrameBuffer设备驱动的接口,设备驱动通过这两个函数向系统注册或注销自己。底层设备驱动所要做的几乎所有事情就是通过fb_info结构向系注册或注销自己。3.1.2 FrameBuffer驱动程序实现应用程序通过内核对FrameBuffer的控制,主要有下面三种方式:读/写/dev/fb:相当于读/写屏幕缓冲区。映射(map)操作:通过映射操作,可将屏幕缓冲区的物理地址映射的用户空间一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图。IO控制;对于帧缓冲设备,设备文件的ioctl操作可读取/设置设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等,ioctl的操作是由底层的驱动程序来完成的。因此,FrameBuffer驱动要完成的工作已经很少了,只需分配显存的大小、初始化显卡控制寄存器、设置修改硬件设备相应的var信息和fix信息。图3.1反映了应用程序通过写帧缓冲设备来显示图形的全过程。应用程序打开一个帧缓冲设备调动文件层函数fb_write()调用特驱动层函数获取设备性fb_get_fix()等对帧缓冲设备对应的地址空间进行写显卡控制器将缓冲设备地址空间的数据显示在屏幕上结束图3.1 FrameBuffer程序实现框图编写帧缓冲程序需要作以下工作:编写初始化函数函数首先初始化显卡控制器,通过写寄存器设置显示模式和显示颜色数,然后分配显卡显示缓冲区,初始化最后初始化一个fb_into结构,填充其中的成员变量,并调用register_framebuffer(&fb_info),将fb_info登记入内核。编写结构fb_info中函数指针fb ops对应的成员函数对于嵌入式系统的简单实现,只需如下三个函数:int(*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info);int(*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);int(*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);这些函数都是用来设置、获取fb_info结构中的成员变量,当应用程序对设备文件进行ioctl操作的时候会调用它们。例如,fb_get_fix(),应用传入fb_fix_screeninfo结构,在函数中对其成员赋值,最终返回给应用程序;fb_set_var()传入fb_var_sereeninfo结构,函数中对xres,yres,bit_per_pixel等赋值9。3.2 约定3.2.1 寄存器访问约定表3.1 寄存器访问约定类型说明类型说明RO只读,不可写RW可读可写RC读清零WC可读,写1清0,写0不变3.2.2 寄存器复位值约定在寄存器定义表格中:如果某一个比特的复位值“Reset”(即“Reset”行)为“?”,表示复位值不确定。如果某一个或者多个比特的复位值“Reset”为“?”,则整个寄存器的复位值“Total Reset Value”为“-”,表示复位值不确定。3.2.3 数值单位约定数据容量、频率、数据速率等的表达方式说明如下:表3.2 数值单位约定(1)类别符号对应的数值数据容量(如RAM容量)1K1,0241M1,048,5761G1,073,741,824频率,数据速率等1K1,0001M1,000,0001G1,000,000,000地址、数据的表达方式说明如下:表3.3 数值单位约定(2)符号举例说明0x0xFE04、0x18用16进制表示的数据值、地址值0b0b000、0b00 00000000表示2进制的数据值以及2进制序列(寄存器描述中除外)。X00X、1XX 在数据的表达方式中,X表示0或1例如:00X表示000或001;1XX表示100、101、110或1113.2.4 数值单位约定本文档中所用的频率均遵守SDH规范。简称和对应的标称频率如下:表3. 4 其他约定频率简称对应的标称频率19M19.44MHz38M38.88MHz77M77.76MHz 622M622.08MHz 3.3 HiFB图形驱动的设计与实现Hisilicon Framebuffer(以下简称HiFB)是海思数字媒体处理平台提供的用于管理叠加图像层的模块,它不仅提供Linux Framebuffer的基本功能,还在Linux Framebuffer的基础上增加层间colorkey、层间colorkey mask、层间Alpha、原点偏移等扩展功能。3.3.1 体系结构应用程序基于Linux文件系统使用HiFB。HiFB的体系结构如图3.2所示:图3.2 HiFB的体系结构3.3.2 HiFB与Linux Framebuffer对比叠加图像层管理Linux Framebuffer是一个子设备号对应一个显卡,HiFB则是一个子设备号对应一叠加图像层,HiFB可以管理多个叠加图像层,具体个数和芯片相关。说明:海思framebuffer的设备名称与硬件图层物理图层一一对应。规定如下:/dev/fb0, /dev/fb1分别对应标清图层0和1, /dev/fb2 /dev/fb3 分别高清图层0和1, /dev/fb4对应辅助标清图层0,/dev/fb5对应光标层。对应关系以芯片默认的状态为主。某些平台可以动态将图层绑定到不同的输出上,比如:标清绑定到高清输出,但其默认的图层仍然是标清,并不是高清。目前/dev/fb1、/dev/fb3、/dev/fb4、/dev/fb5没有使用。通过模块加载参数,可以控制HiFB管理其中的一个或多个叠加图像层,并像操作普通文件一样操作叠加图像层。时序控制Linux Framebuffer提供同步时序、扫描方式、同步信号组织等控制方式(需要硬件支持),将物理显存的内容显示在不同的输出设备(如PC显示器、TV、LCD等)上。目前HiFB不支持同步时序、扫描方式、同步信号组织等控制方式。标准功能与扩展功能HiFB支持以下的Linux Framebuffer标准功能:将物理显存映射(或解除映射)到虚拟内存空间。像操作普通文件一样操作物理显存。设置硬件显示分辨率和象素格式,每个叠加图像层的支持的最大分辨率和象素格式可以通过支持能力接口获取,支持的象素格式参见表3.5、表3.6。从物理显存的任何位置进行读、写、显示等操作10。表3.5 HiFB在标清平台上支持的象素格式。符号举例说明叠加图像层0索引格式1bpp、2bpp、4bpp、8bpp 16比特格式RGB444、ARGB4444、RGB555、RGB565、ARGB1555 32比特格式RGB888、ARGB8888 叠加图像层1索引格式不支持16比特格式RGB444、ARGB4444、RGB555、RGB565、ARGB1555 32比特格式RGB888、ARGB8888 硬件鼠标层索引格式不支持16比特格式RGB444、ARGB4444、RGB555、RGB565、ARGB1555 32比特格式RGB888、ARGB8888 表3.6 HiFB在高清平台上支持的象素格式符号举例说明叠加图像层0索引格式1bpp、2bpp、4bpp、8bpp 16比特格式RGB444、ARGB4444、RGB555、RGB565、ARGB1555 32比特格式RGB888、ARGB8888 叠加图像层1索引格式1bpp、2bpp、4bpp、8bpp 16比特格式RGB444、ARGB4444、RGB555、RGB565、ARGB1555 32比特格式RGB888、ARGB8888 硬件鼠标层索引格式不支持16比特格式不支持32比特格式ARGB8888 HiFB增加以下的扩展功能:设置和获取叠加图像层的Alpha值。设置和获取叠加图像层的colorkey值。设置当前叠加图像层的起始位置(相对于屏幕原点的偏移)。设置和获取当前叠加图像层的显示状态(显示/隐藏)。 支持获取当前叠加图像层的垂直消隐区。通过模块加载参数配置HiFB的物理显存大小和管理叠加图像层的数目。HiFB不支持以下的Linux Framebuffer标准功能:设置和获取控制台对应的Linux Framebuffer。获取硬件扫描的实时信息。获取硬件相关信息。设置硬件同步时序。设置硬件同步信号机制。3.3.3 原理介绍某些Linux Framebuffer驱动(如versa)不支持在运行期间更改分辨率、颜色深度、时序等显示属性。对此,Linux系统提供一种机制,允许在内核启动或模块加载时,通过参数将相应选项传递给Linux Framebuffer。可以在内核加载器中配置内核启动参数。HiFB驱动在加载时只能设置物理显存的大小,不允许设置其它选项。加载HiFB驱动hifb.ko时必须保证内核中已经加载了标准的Framebuffer驱动fb.ko。如果没有加载,可以先用“modprobe fb”加载fb.ko,然后再加载hifb.ko。除fb.ko之外,还需要先加载2D加速驱动tde.ko。说明:Fb.ko是linux自带的标准framebuffer 驱动框架模块。可以通过内核编译选项,将其直接编译到内核中。这样,在插入hifb.ko时,不需要再手工插入fb.ko了11。3.3.4 参数设置HiFB可配置其管理的叠加图像层物理显存的大小。物理显存大小决定了HiFB可使用的最大物理显存和系统的可设置虚拟分辨率。在加载HiFB驱动时通过参数传递设置物理显存大小,物理显存大小一经设置就不会改变。配置叠加图象物理显存大小的语法如下:video=“hifb:vram0_size:xxx, vram2_size:xxx,” 说明:选项之间用逗号“,”隔开。选项和选项值之间用冒号“:”隔开。如果某个图层不配置物理显存大小,则系统按默认情况分配显存。对于高清平台如:配置两个图层高清和标清,高清:1280*720*4*2 Bytes,标清:720*576*4*2 Bytes,比如:video=”hifb:vram0_size 7200”, 没有配置vram2,则,其fb2按默认的分配。为了节省内存,可能某个图层不需要使用。应将size设置为0。可以通过cat /proc/media-mem查看图层是否分配了内存。如果用户指定size为0,则对应的图层不分配显存。其中,vramn_size:xxx表示对叠加图形层n配置xxx K字节的物理显存。标准framebuffer下,vramn_size和虚拟分辨率的关系如下:vramn_size = xres_virtual * yres_virtual * bpp其中:xres_virtual % yres_virtual是虚拟分辨率,bpp是每个像素所占字节数。扩展framebuffer下,vramn_size和display分辨率的关系如下:需要的内存大小取决于displaysize的大小,图层像素格式以及刷新模式,具体关系如下:vramn_size = displaywidth * displayHeight *bpp * BufferMode; 如:高清上1280*720 制式下,ARGB8888格式下的双buffer模式下需要的内存vram2_size = 1280*720*4*2 = 7200 K 目前大多数情况下,如果使用HIGO相关接口的则按扩展framebuffer的方式进行显存配置.vramn_size和叠加图像层对应关系如表3.7所示。表3.7 vramn_size和叠加图像层对应关系叠加图像层字符串含义叠加图像层0vram0_size叠加图像层0(标清图层)的物理显存大小,单位为K字节。叠加图像层1Vram1_size叠加图像层1 。目前该层没有使用,不要设置叠加图像层2Vram2_size叠加图像层2(高清图层)的物理显存大小,单位为K字节。用户需要从全局的角度出发配置HiFB需要管理的叠加图像层,并为每个叠加图像层分配适当的显存。显示输出是由各个平台的SDK负责管理的。因此,仅打开framebuffer设备,还不足以看到显示图形输出。Framebuffer增加了一个配置选项display。方法如下:Insmod hifb.ko display=on 则在插入hifb.ko时,自动打开显示输出。这样非常方便调试。说明:vramn_size必须是PAGE_SIZE(4K byte)的倍数,否则HiFB驱动强制将其设为PAGE_SIZE的倍数,向上取整。 3.3.5 配置举例配置HiFB管理叠加图像层的示例如下:说明:HiFB驱动的模块文件为hifb.ko。配置HiFB管理一个叠加图像层。如果只需要HiFB管理叠加图像层0(标清图层),且最大虚拟分辨率为720 %576,用到的象素格式为ARGB1555,则叠加图像层0需要的最小显存为720 %2 %576 = 829440 = 810K,配置参数如下:insmod hifb.ko video=hifb:vram0_size:810, vram2_size:0 如果采用的是double buffer的方式,则需要乘以2,即:insmod hifb.ko video=hifb:vram0_size:1620, vram2_size:0 配置HiFB管理多个叠加图像层。如果需要HiFB管理叠加图像层0和叠加图像层2两个叠加层,且最大虚拟分辨率为720 %576,用到的像素格式为ARGB1555,而图像层2虚拟分辨率为1280* 720,用到的像素格式为ARGB8888, 则配置参数如下:insmod hifb.ko video=hifb:vram0_size:810, vram2_size: 3600 如果图像层2使用的是双buffer,则配置如下:insmod hifb.ko video=hifb:vram0_size:810, vram2_size: 7200 配置HiFB display显示状态。目前在运行DirectFb时需要用户去打开VO显示,这时用户可以在插入hifb.ko时通过配置display参数来打开,如:insmod hifb.ko video=hifb:vram0_size:810, vram2_size: 3600 display=on 3.3.6 开发流程HiFB主要用于显示2D图形(以直接操作物理显存的方式)。HiFB的开发流程如图3.3所示。 HiFB的开发步骤如下:步骤1调用open函数打开指定的HiFB设备。步骤2调用ioctl函数设置HiFB的象素格式以及屏幕高宽等参数步骤3调用ioctl函数获取HiFB所分配的物理显存大小、跨度等固定信息。调用ioctl函数也可以使用HiFB提供的层间colorkey、层间colorkey mask、层间alpha、原点偏移等功能。步骤4调用mmap函数将物理显存映射到虚拟内存空间。步骤5 操作虚拟内存,完成具体的绘制任务。在此步骤可以使用HiFB提供的双缓冲页翻转等功能实现一些绘制效果。步骤6调用munmap解除显存映射。步骤7调用close函数关闭设备。 -结束说明:由于修改虚拟分辨率将改变HiFB的固定信fb_fix_screeninfo:line_length(跨度),为保证绘制程序能够正确执行,推荐先设置HiFB的可变信息fb_var_screeninfo,再获取HiFB的固定信息fb_fix_screeninfo:line_length。3.3.7 实例介绍利用PAN_DISPLAY动态显示图片实例:开始打开设备设置像素格式、屏幕宽高等参数获取物理显存大小、跨度等固定信息映射物理显存到用户虚拟内存空间操作虚拟内存完成具体任务解除映射关闭设备结束图3.3 HiFB的开发流程本实例利用PAN_DISPLAY连续显示15幅分辨率为640352的图片,以达到动态显示的效果。下面实例中的每个文件存储的都是象素格式为ARGB1555的纯数据(不包含附加信息的图像数据)。参考代码请见附录A。3.4 TDE的设计与实现2D图形加速引擎TDE(Two Dimensional Engine)利用硬件进行图形绘制,可以大大减少对CPU的占用,同时提高了内存带宽的资源利用率;也可以对光栅或宏块位图进行操作,包括:搬移、填充、画线和矩形、抗闪烁、缩放、颜色空间转换和颜色格式转换等操作。3.4.1 工作流程使用TDE模块的工作流程如图3.4所示。TDE模块的工作流程如下:步骤1调用HI_TDE2_Open打开TDE设备。步骤2调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 碳排放管理师培训
- 临床三基培训大纲
- 青蛙主题活动课件
- 主题三:红色之美 第13课《长征之歌-雪山草地铸丰碑》(教学设计)川教版四年级上册综合实践活动
- 青骄第二课堂培训学生
- 溶栓的护理及观察要点
- 电动车充电服务合同2025年
- 护工感控制培训
- 合同担保抵押承诺书范例
- 跨国人力资源公司与国内企业合作协议2025
- 《颈椎病的针灸治疗》课件
- 《木兰诗》历年中考古诗欣赏试题汇编(截至2024年)
- 2024年音乐节行业发展前景预测及投资策略研究报告
- 2024西部县域经济百强研究
- 2025-2030年中国IPTV产业行业发展趋势及前景调研分析报告
- 国企改革三年行动培训
- 医美诊所院感知识培训课件
- 上海市家庭居室装饰装修施工合同书
- 物联网技术及应用基础(第2版) -电子教案
- 新能源汽车租赁市场发展方案
- 货架回收合同范例
评论
0/150
提交评论