ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:332.27KB ,
资源ID:8673481      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8673481.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(androidmddilcd框架分析.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

androidmddilcd框架分析.docx

1、androidmddilcd框架分析Android display架构分析(一)2010-04-16 10:41高通7系列硬件架构分析如上图,高通7系列 Display的硬件部分主要由下面几个部分组成: A、MDP高通MSM7200A内部模块,主要负责显示数据的转换和部分图像处理功能理,如YUV转RGB,放大缩小、旋转等。MDP内部的MDP DMA负责数据从DDR到MDDI Host的传输(可以完成RGB之间的转换,如RGB565转成RGB666,这个转换工能载目前的code 中没有使用)。B、MDDI一种采用差分信号的高速的串行数据传输总线,只负责数据传输,无其它功能;其中的MDDI Hos

2、at提供并行数据和串行数据之间的转换和缓冲功能。由于外面是VGA的屏幕,数据量较大,为了减少对EBI2总线的影响,传输总线使用MDDI,而非之前的EBI2。C、MDDI Bridge由于现在采用的外接LCD并不支持MDDI接口,故需要外加MDDI转换器,即MDDI bridge,来把MDDI数据转换成RGB接口数据。这里采用的EPSON MDDIBridge还有LCD Controller功能,可以完成其它一些数据处理的功能,如数据格式转换、支持TV-OUT、PIP等;并且还可以提供一定数量的GPIO。目前我们主要用它把HOST端MDDI传递过来的显示数据和控制数据(初始化配置等)转换成并行的

3、数据传递给LCD。D、LCD module主要是LCD Driver IC 和TFT Panel,负责把MDDI Bridge传来的显存中的图像示在自己的 Panel上。Android display架构分析(二)2010-04-16 10:45Android display SW架构分析下面简单介绍一下上图中的各个Layer:*蓝色部分用户空间应用程序应用程序层,其中包括Android应用程序以及框架和系统运行库,和底层相关的是系统运行库,而其中和显示相关的就是Android的Surface Manager, 它负责对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。*黑

4、色部分HAL层,在2.2.1部分会有介绍*红色部分Linux kernel层Linux kernel,其中和显示部分相关的就是Linux的FrameBuffer,它是Linux系统中的显示部分驱动程序接口。Linux工作在保护模式下,User空间的应用程序无法直接调用显卡的驱动程序来直接画屏,FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过 Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显

5、存的位置、换页机制等等具体细节。这些都是由 Framebuffer设备驱动来完成的。*绿色部分HW驱动层该部分可以看作高通显卡的驱动程序,和高通显示部分硬件相关以及外围LCD相关的驱动都被定义在这边,比如上述的显卡的一些特性都是在这边被初始化的,同样MDP和MDDI相关的驱动也都定义在这里 User Space Display功能介绍这里的User Space就是与应用程序相关的上层部分(参考上图中的蓝色部分),其中与Kernel空间交互的部分称之为HALHW Abstraction Layer。HAL其实就是用户空间的驱动程序。如果想要将 Android 在某硬件平台上执行,基本上完成这些驱

6、动程序就行了。其内定义了 Android 对各硬件装置例如显示芯片、声音、数字相机、GPS、GSM 等等的需求。HAL存在的几个原因:1、 并不是所有的硬件设备都有标准的linux kernel的接口。2、 Kernel driver涉及到GPL的版权。某些设备制造商并不原因公开硬件驱动,所以才去HAL方式绕过GPL。3、 针对某些硬件,Android有一些特殊的需求。在display部分,HAL的实现code在copybit.c中,应用程序直接操作这些接口即可,具体的接口如下: struct copybit_context_t *ctx = malloc(sizeof(struct copy

7、bit_context_t); memset(ctx, 0, sizeof(*ctx); ctx-mon.tag = HARDWARE_DEVICE_TAG; ctx-mon.version = 0; ctx-mon.module = module; ctx-mon.close = close_copybit; ctx-device.set_parameter = set_parameter_copybit;/设置参数 ctx-device.get = get; ctx-device.blit = blit_copybit;/传送显示数据 ctx-device.stretch = stretc

8、h_copybit; ctx-mAlpha = MDP_ALPHA_NOP; ctx-mFlags = 0; ctx-mFD = open(/dev/graphics/fb0, O_RDWR, 0);/打开设备 Kernel Space Display功能介绍这里的Kernel空间(与Display相关)是Linux平台下的FB设备(参考上图中的红色部分)。下面介绍一下FB设备。Fb即FrameBuffer的简称。framebuffer 是一种能够提取图形的硬件设备,是用户进入图形界面很好的接口。有了framebuffer,用户的应用程序不需要对底层驱动有深入了解就能够做出很好的图形。对于用户

9、而言,它和/dev 下面的其他设备没有什么区别,用户可以把framebuffer 看成一块内存,既可以向这块内存中写入数据,也可以从这块内存中读取数据。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似,它是一个字符设备,通常主设备号是29,次设备号定义帧缓冲的个数。在LINUX系统中,设备被当作文件来处理,所有的文件包括设备文件,Linux都提供了统一的操作函数接口。上面的结构体就是Linux为FB设

10、备提供的操作函数接口。1)、读写(read/write)接口,即读写屏幕缓冲区(应用程序不一定会调用该接口)2)、映射(map)操作(用户空间不能直接访问显存物理空间,需map成虚拟地址后才可以)由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,Linux在文件操作 file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。实际上,使用帧缓冲设备的

11、应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多 3)、I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成Note:上述部分请参考文件fbmem.c。Android display架构分析(三)2010-04-16 10:53Kernel Space Display架构介绍如上图所示,除了上层的图形应用程序外,和Kernel空间有关的包括Linux FB设备层以及和具体HW相关的驱动层,对应的源文件分别是fb_m

12、em.c、msm_fb.c、mddi_toshiba.c。下面会一一介绍。fb_mem.c 函数和数据结构介绍这个文件包含了Linux Fb设备的所有接口,主要函数接口和数据结构如下:A、Fb设备的文件操作接口B、3个重要的数据结构 FrameBuffer中有3个重要的结构体,fb.h中定义,如下:1) 、frame_var_screeninfo该结构体定义了显卡的一些可变的特性,这些特性在程序运行期间可以由应用程序动态改变,比较典型的如xrex和yres表示在显示屏上显示的真实分辨率、显示的bit数等,该结构体user space可以访问。2) 、frame_fix_screeninfo该结

13、构体定义了显卡的一些固定的特性,这些特性在硬件初始化时就被定义了以后不可以更改。其中最重要的成员就是smem_len和smem_start,前者指示显存的大小(目前程序中定义的显存大小为整屏数据RGB565大小的2倍),后者给出了显存的物理地址。该结构体user space可以访问。Note:smem_start是显存的物理地址,应用程序是不可以直接访问的,必须通过fb_ops中的mmp函数映射成虚拟地址后,应用程序方可访问。3) 、fb_infoFrameBuffer中最重要的结构体,它只能在内核空间内访问。内部定义了fb_ops结构体(包含一系列FrameBuffer的操作函数,Open/

14、read/write、地址映射等).C、其他 1)、一个重要的全局变量struct fb_info *registered_fbFB_MAX;这变量记录了所有fb_info 结构的实例,fb_info 结构描述显卡的当前状态,所有设备对应的fb_info 结构都保存在这个数组中,当一个FrameBuffer设备驱动向系统注册自己时,其对应的fb_info 结构就会添加到这个结构中,同时num_registered_fb 为自动加1。2)、注册framebuffer函数register_framebuffer(struct fb_info *fb_info);unregister_framebu

15、ffer(struct fb_info *fb_info);这两个是提供给下层FrameBuffer设备驱动的接口,设备驱动通过这两函数向系统注册或注销自己。几乎底层设备驱动所要做的所有事情就是填充fb_info结构然后向系统注册或注销它Android display架构分析(四)2010-04-16 10:56msm_fb.c 函数和数据结构介绍该文件为高通显卡的驱动文件,比较重要的函数接口和数据结构如下:A、高通msm fb设备的文件操作函数接口static struct fb_ops msm_fb_ops = .owner = THIS_MODULE,.fb_open = msm_fb_

16、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, /* set color register */.fb_blank = NULL, /* blank display */.fb_pan_display = msm_fb_pan_display, /* 显示

17、*/.fb_fillrect = msm_fb_fillrect, /* Draws a rectangle */.fb_copyarea = msm_fb_copyarea, /* Copy data from area to another */.fb_imageblit = msm_fb_imageblit, /* Draws a image to the display */.fb_cursor = NULL,.fb_rotate = NULL,.fb_sync = NULL, /* wait for blit idle, optional */.fb_ioctl = msm_fb_i

18、octl, /* perform fb specific ioctl (optional) */.fb_mmap = NULL,;B、高通msm fb的driver接口static struct platform_driver msm_fb_driver = .probe = msm_fb_probe,/驱动探测函数.remove = msm_fb_remove,#ifndef CONFIG_ANDROID_POWER.suspend = msm_fb_suspend,.suspend_late = NULL,.resume_early = NULL,.resume = msm_fb_resu

19、me,#endif.shutdown = NULL,.driver = /* Driver name must match the device name added in platform.c. */ .name = msm_fb, ,;C、msm_fb_init()向系统注册msm fb的driver,初始化时会调用D、msm_fb_add_device 向系统中添加新的lcd设备,在mddi_toshiba.c中会被调用mddi_toshiba.c 函数和数据结构介绍 该文件包含了所有和具体LCD(Toshiba)相关的信息和驱动,重点的数据结构和函数结构如下:A、LCD设备相关信息st

20、atic struct platform_device this_device_0 = .name = mddi_toshiba_vga,.id = TOSHIBA_VGA_PRIM,.dev = .platform_data = &toshiba_panel_data0,; 其中toshiba_panel_data0包含了硬件LCD的控制函数,如开关、初始化等等B、LCD driver接口static struct platform_driver this_driver = .probe = mddi_toshiba_lcd_probe,.driver = .name = mddi_tosh

21、iba_vga,; 其中mddi_toshiba_lcd_probe中会调用msm_fb_add_device接口把具体LCD添加到系统中去。C、mddi_toshiba_lcd_init 注册LCD设备及driver到系统中去,同时也把LCD的固有信息(大小、格式、位率等)一并注册到系统中去。D、LCD相关控制函数toshiba_common_initial_setup():初始化MDDI bridgetoshiba_prim_start():初始化LCD Display Kernel数据流分析本部分来看一下应用层以下,显示数据的流程是怎样的。先来分析一下传统的Linux平台下FB设备是如果

22、调用的,如下图所示:上层调用FB API(主要是fb_ioctl()),fb_ioctl()会调用具体显卡的驱动,这里是高通的显卡驱动,其实就是MDP DMA的驱动,通过MDP DMA把显示数据经MDDI接口送到外围LCD组件。Note:这里的MDP DMA并不对数据进行任何处理(可以完成简单的格式转换,如RGB565-RGB666)。接下来再分析一下Android平台下显示数据是如何处理的,如下图所示:同样上层也是调用FB API,不过这里其实把FB bypass了,相当于直接调用的是高通MDP PPP的驱动,然后数据经PPP处理后再经MDDI接口送出到外围LCD组件。Note:这里的MDP

23、 PPP可以完成很多显示数据处理功能,如YUV-RGB、Scale、Rotate、Blending等。Display Kernel初始化过程分析 Kernel部分display的初始化包含下面几个步骤:1)、在linux fb设备初始化时会向系统中注册msm_fb_driver。Name为msm_fb。msm_fb_init msm_fb_register_driver- platform_driver_register(&msm_fb_driver)其中的probe函数会对msm fb进行初始化,分配显存等(见msm_fb_probe函数)。2)、在LCD模块初始化时会先向系统中注册驱动(在

24、mddi_toshiba_lcd_init函数中)platform_driver_register(&this_driver);名字为mddi_toshiba_vga;this_driver的probe函数为mddi_toshiba_lcd_probe,其内部会调用msm_fb_add_device向系统中添加MSM fb设备。3)、调用platform_device_register(&this_device_0)向系统中注册设备,名字为mddi_toshiba_vga,其中this_device_0包含了一些操作LCD的接口,如on/off。Note:设备和driver的name需要一致才

25、可以绑定;另外,如果某些设备不需要让platform的总线来管理,那么只需要注册驱动即可,而无须向系统中注册device,如msm_touch。Android display架构分析(五)2010-04-16 11:01Display接口介绍1、User Space display接口 在Android平台下,应用程序面对的显示部分的接口就是HAL,参考copybit.c,具体接口如下介绍:open_copybit 初始化相关变量,并调用open(/dev/graphics/fb0, O_RDWR, 0);打开fb设备。set_parameter_copybit 设置各种操作参数,如rotat

26、e、alpha、dither等。stretch_copybit Copy一块数据(Rectangle)到显存,然后并命令msm_fb进行显示。close_copybit 调用close(ctx-mFD);关闭fb设备。Note:另外,应用程序在使用上面接口之前,需要调用mapFrameBuffer接口(EGLDisplaySurface.cpp),其功能如下:1、 初始化显示相关参数,并设置到底层。2、 映射出显存的虚拟地址。2、Kernel display接口 Kernel部分显示的接口全部都在fbmem.c中,这里详细介绍一下:fb_open 打开Linux下fb设备。fb_read/fb

27、_write 读写显存中的数据fb_ioctl 对显示设备的命令操作。如get或set一些显示参数、通知底层进行刷屏等。在典型应用中,画屏的一般步骤如下: 1 打开/dev/fb设备文件。 2 用ioctrl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。 3 将屏幕缓冲区映射到用户空间。 4 映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。 典型程序段如下: #include int main() int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo

28、 finfo; long int screensize = 0; /*打开设备文件*/ fbfd = open(/dev/fb0, O_RDWR); /*取得屏幕相关参数*/ ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo); /*计算屏幕缓冲区大小*/ screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; /*映射屏幕缓冲区到用户地址空间*/ fbp=(char*)mmap(0,screensize,P

29、ROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0); /*下面可通过fbp指针读写缓冲区*/.3典型应用flow分析在不同应用程序中,上层的调用会有所不同,比如Andriod下会选择应用程序跳过Linux fb操作层,直接操作显卡驱动层,称之为BLT accelerator。下面看一下Android平台下画屏的操作流程。1、 通过mapFrameBuffer直接把用户空间的数据映射到显存中。2、 调用HAL中的stretch函数直接命令MSM设备提取显存数据然后送入MDP PPP进行处理并经MDDI接口送到外围LCD组件。具体的函数调用流程如下:copybit_o

30、pen();/打开BlitEngine,同时也打开fb设备mapFrameBuffer();/设置显示参数,同时得到显存虚拟地址copybit-stretch(copybit, &dst, &src, &sdrect, &sdrect, &it);/通知底层去刷屏接下的流程是:Android display架构分析(六)2010-04-16 11:05Surface manager介绍Note:本部分介绍的完全是用户空间显示部分的架构,与kernel并没有直接的联系,主要是JNI以下到HAL以上的部分。1、Surface manager(surface flinger)简介Surface ma

31、nager是用户空间中framework下libraries中负责显示相关的一个模块。如下: 当系统同时执行多个应用程序时,Surface Manager会负责管理显示与存取操作间的互动,另外也负责将2D绘图与3D绘图进行显示上的合成。 surface manager 可以准备一块 surface(可以看作一个layer),把 surface 的 fd (一块内存) 传给一个 app,让 app 可以在上面作画。 典型应用如下:2、Surface manager架构分析Android中的图形系统采用Client/Server架构,如下:Client端:应用程序相关部分。代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c+写成的底层实现。Serve

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1