当前位置: 代码迷 >> Android >> Android display架构分析(4)
  详细解决方案

Android display架构分析(4)

热度:21   发布时间:2016-05-01 18:30:15.0
Android display架构分析(四)

转 http://hi.baidu.com/leowenj/blog/item/37e1a8521e35522842a75b99.html

?

Android display架构分析(四)

?

该文件为高通显卡的驱动文件,比较重要的函数接口和数据结构如下:

A、高通msm fb设备的文件操作函数接口

static struct fb_ops msm_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, /* set color register */

.fb_blank = NULL,?????? /* blank display */

.fb_pan_display = msm_fb_pan_display,?????? /* 显示 */

.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_ioctl,??? /* perform fb specific ioctl (optional) */

.fb_mmap = NULL,

};

B、高通msm fbdriver接口

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_resume,

#endif

.shutdown = NULL,

.driver = {

???????? ?? /* Driver name must match the device name added in platform.c. */

???????? ?? .name = "msm_fb",

???????? ?? },

};

C、msm_fb_init()

向系统注册msm fbdriver,初始化时会调用

Dmsm_fb_add_device

???? 向系统中添加新的lcd设备,在mddi_toshiba.c中会被调用

mddi_toshiba.c 函数和数据结构介绍

??? 该文件包含了所有和具体LCDToshiba)相关的信息和驱动,重点的数据结构和函数结构如下:

ALCD设备相关信息

static struct platform_device this_device_0 = {

.name?? = "mddi_toshiba_vga",

.id?? = TOSHIBA_VGA_PRIM,

.dev?????? = {

???????? .platform_data = &toshiba_panel_data0,

}

};

??????? 其中toshiba_panel_data0包含了硬件LCD的控制函数,如开关、初始化等等

BLCD driver接口

static struct platform_driver this_driver = {

.probe = mddi_toshiba_lcd_probe,

.driver = {

???????? .name?? = "mddi_toshiba_vga",

},

};

?????? 其中mddi_toshiba_lcd_probe中会调用msm_fb_add_device接口把具体LCD添加到系统中去。

Cmddi_toshiba_lcd_init

????? 注册LCD设备及driver到系统中去,同时也把LCD的固有信息(大小、格式、位率等)一并注册到系统中去。

DLCD相关控制函数

toshiba_common_initial_setup():初始化MDDI bridge

toshiba_prim_start():初始化LCD

?? Display Kernel数据流分析

本部分来看一下应用层以下,显示数据的流程是怎样的。

先来分析一下传统的Linux平台下FB设备是如果调用的,如下图所示:

上层调用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 PPP可以完成很多显示数据处理功能,如YUV->RGBScaleRotateBlending等。

Display Kernel初始化过程分析

???Kernel部分display的初始化包含下面几个步骤:

1)、在linux fb设备初始化时会向系统中注册msm_fb_driverNamemsm_fb

msm_fb_init> msm_fb_register_driver-> platform_driver_register(&msm_fb_driver)

其中的probe函数会对msm fb进行初始化分配显存等msm_fb_probe函数)。

2、在LCD模块初始化时会先向系统中注册驱动mddi_toshiba_lcd_init函数中

platform_driver_register(&this_driver);名字为mddi_toshiba_vga

this_driverprobe函数为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:设备和drivername需要一致才可以绑定另外如果某些设备不需要让platform的总线来管理那么只需要注册驱动即可而无须向系统中注册devicemsm_touch

  相关解决方案