您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Android display架构分析
Androiddisplay架构分析2010-08-1209:233117人阅读评论(2)收藏举报Androiddisplay架构分析(一)高通7系列硬件架构分析如上图,高通7系列Display的硬件部分主要由下面几个部分组成:A、MDP高通MSM7200A内部模块,主要负责显示数据的转换和部分图像处理功能理,如YUV转RGB,放大缩小、旋转等。MDP内部的MDPDMA负责数据从DDR到MDDIHost的传输(可以完成RGB之间的转换,如RGB565转成RGB666,这个转换工能载目前的code中没有使用)。B、MDDI一种采用差分信号的高速的串行数据传输总线,只负责数据传输,无其它功能;其中的MDDIHosat提供并行数据和串行数据之间的转换和缓冲功能。由于外面是VGA的屏幕,数据量较大,为了减少对EBI2总线的影响,传输总线使用MDDI,而非之前的EBI2。C、MDDIBridge由于现在采用的外接LCD并不支持MDDI接口,故需要外加MDDI转换器,即MDDIbridge,来把MDDI数据转换成RGB接口数据。这里采用的EPSONMDDIBridge还有LCDController功能,可以完成其它一些数据处理的功能,如数据格式转换、支持TV-OUT、PIP等;并且还可以提供一定数量的GPIO。目前我们主要用它把HOST端MDDI传递过来的显示数据和控制数据(初始化配置等)转换成并行的数据传递给LCD。D、LCDmodule主要是LCDDriverIC和TFTPanel,负责把MDDIBridge传来的显存中的图像示在自己的Panel上。Androiddisplay架构分析(二)架构分析下面简单介绍一下上图中的各个Layer:*蓝色部分-用户空间应用程序应用程序层,其中包括Android应用程序以及框架和系统运行库,和底层相关的是系统运行库,而其中和显示相关的就是Android的SurfaceManager,它负责对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。*黑色部分-HAL层,在2.2.1部分会有介绍*红色部分-Linuxkernel层Linuxkernel,其中和显示部分相关的就是Linux的FrameBuffer,它是Linux系统中的显示部分驱动程序接口。Linux工作在保护模式下,User空间的应用程序无法直接调用显卡的驱动程序来直接画屏,FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。*绿色部分-HW驱动层该部分可以看作高通显卡的驱动程序,和高通显示部分硬件相关以及外围LCD相关的驱动都被定义在这边,比如上述的显卡的一些特性都是在这边被初始化的,同样MDP和MDDI相关的驱动也都定义在这里UserSpaceDisplay功能介绍这里的UserSpace就是与应用程序相关的上层部分(参考上图中的蓝色部分),其中与Kernel空间交互的部分称之为HAL-HWAbstractionLayer。HAL其实就是用户空间的驱动程序。如果想要将Android在某硬件平台上执行,基本上完成这些驱动程序就行了。其内定义了Android对各硬件装置例如显示芯片、声音、数字相机、GPS、GSM等等的需求。HAL存在的几个原因:1、并不是所有的硬件设备都有标准的linuxkernel的接口。2、Kerneldriver涉及到GPL的版权。某些设备制造商并不原因公开硬件驱动,所以才去HAL方式绕过GPL。3、针对某些硬件,Android有一些特殊的需求。在display部分,HAL的实现code在copybit.c中,应用程序直接操作这些接口即可,具体的接口如下:structcopybit_context_t*ctx=malloc(sizeof(structcopybit_context_t));memset(ctx,0,sizeof(*ctx));ctx-device.common.tag=HARDWARE_DEVICE_TAG;ctx-device.common.version=0;ctx-device.common.module=module;ctx-device.common.close=close_copybit;ctx-device.set_parameter=set_parameter_copybit;//设置参数ctx-device.get=get;ctx-device.blit=blit_copybit;//传送显示数据ctx-device.stretch=stretch_copybit;ctx-mAlpha=MDP_ALPHA_NOP;ctx-mFlags=0;ctx-mFD=open(/dev/graphics/fb0,O_RDWR,0);//打开设备KernelSpaceDisplay功能介绍这里的Kernel空间(与Display相关)是Linux平台下的FB设备(参考上图中的红色部分)。下面介绍一下FB设备。Fb即FrameBuffer的简称。framebuffer是一种能够提取图形的硬件设备,是用户进入图形界面很好的接口。有了framebuffer,用户的应用程序不需要对底层驱动有深入了解就能够做出很好的图形。对于用户而言,它和/dev下面的其他设备没有什么区别,用户可以把framebuffer看成一块内存,既可以向这块内存中写入数据,也可以从这块内存中读取数据。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似,它是一个字符设备,通常主设备号是29,次设备号定义帧缓冲的个数。在LINUX系统中,设备被当作文件来处理,所有的文件包括设备文件,Linux都提供了统一的操作函数接口。上面的结构体就是Linux为FB设备提供的操作函数接口。1)、读写(read/write)接口,即读写屏幕缓冲区(应用程序不一定会调用该接口)2)、映射(map)操作(用户空间不能直接访问显存物理空间,需map成虚拟地址后才可以)由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,Linux在文件操作file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多3)、I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成Note:上述部分请参考文件fbmem.c。Androiddisplay架构分析(三)架构介绍如上图所示,除了上层的图形应用程序外,和Kernel空间有关的包括LinuxFB设备层以及和具体HW相关的驱动层,对应的源文件分别是fb_mem.c、msm_fb.c、mddi_toshiba.c。下面会一一介绍。函数和数据结构介绍这个文件包含了LinuxFb设备的所有接口,主要函数接口和数据结构如下:A、Fb设备的文件操作接口B、3个重要的数据结构FrameBuffer中有3个重要的结构体,fb.h中定义,如下:1)、frame_var_screeninfo该结构体定义了显卡的一些可变的特性,这些特性在程序运行期间可以由应用程序动态改变,比较典型的如xrex和yres表示在显示屏上显示的真实分辨率、显示的bit数等,该结构体userspace可以访问。2)、frame_fix_screeninfo该结构体定义了显卡的一些固定的特性,这些特性在硬件初始化时就被定义了以后不可以更改。其中最重要的成员就是smem_len和smem_start,前者指示显存的大小(目前程序中定义的显存大小为整屏数据RGB565大小的2倍),后者给出了显存的物理地址。该结构体userspace可以访问。Note:smem_start是显存的物理地址,应用程序是不可以直接访问的,必须通过fb_ops中的mmp函数映射成虚拟地址后,应用程序方可访问。3)、fb_infoFrameBuffer中最重要的结构体,它只能在内核空间内访问。内部定义了fb_ops结构体(包含一系列FrameBuffer的操作函数,Open/read/write、地址映射等).C、其他1)、一个重要的全局变量structfb_info*registered_fb[FB_MAX];这变量记录了所有fb_info结构的实例,fb_info结构描述显卡的当前状态,所有设备对应的fb_info结构都保存在这个数组中,当一个FrameBuffer设备驱动向系统注册自己时,其对应的fb_info结构就会添加到这个结构中,同时num_registered_fb为自动加1。2)、注册framebuffer函数register_framebuffer(structfb_info*fb_info);unregister_framebuffer(structfb_info*fb_info);这两个是提供给下层FrameBuffer设备驱动的接口,设备驱动通过这两函数向系统注册或注销自己。几乎底层设备驱动所要做的所有事情就是填充fb_info结构然后向系统注册或注销它Androiddisplay架构分析(四)函数和数据结构介绍该文件为高通显卡的驱动文件,比较重要的函数接口和数据结构如下:A、高通msmfb设备的文件操作函数接口staticstructfb_opsmsm_fb_ops={.owner=THIS_MODULE,.fb_open=msm_fb_open,.fb_release=msm_fb_release,.fb_read=NULL,.fb_write=NULL,.fb_cursor=NULL,.fb_check_var=msm_fb_check_var,/*参数检查*/.fb_set_par=msm_fb_set_par,/*设置显示相关参数*/.fb_setcolreg=NULL,/*setcolorregister*/.fb_blank=NULL,/*blankdisplay*/.fb_pan_display=msm_fb_pan_display,/*显示*/.fb_fillrect=msm_fb_fillrect,/*Drawsarectangle*/.fb_copyarea=msm_fb_copyarea,/*Copy
本文标题:Android display架构分析
链接地址:https://www.777doc.com/doc-5448616 .html