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

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

[html] view plain copy print ?
  1. staticstructfb_opsmsm_fb_ops={
  2. .owner=THIS_MODULE,
  3. .fb_open=msm_fb_open,
  4. .fb_release=msm_fb_release,
  5. .fb_read=NULL,
  6. .fb_write=NULL,
  7. .fb_cursor=NULL,
  8. .fb_check_var=msm_fb_check_var,/*参数检查*/
  9. .fb_set_par=msm_fb_set_par,/*设置显示相关参数*/
  10. .fb_setcolreg=NULL,/*setcolorregister*/
  11. .fb_blank=NULL,/*blankdisplay*/
  12. .fb_pan_display=msm_fb_pan_display,/*显示*/
  13. .fb_fillrect=msm_fb_fillrect,/*Drawsarectangle*/
  14. .fb_copyarea=msm_fb_copyarea,/*Copydatafromareatoanother*/
  15. .fb_imageblit=msm_fb_imageblit,/*Drawsaimagetothedisplay*/
  16. .fb_cursor=NULL,
  17. .fb_rotate=NULL,
  18. .fb_sync=NULL,/*waitforblitidle,optional*/
  19. .fb_ioctl=msm_fb_ioctl,/*performfbspecificioctl(optional)*/
  20. .fb_mmap=NULL,
  21. };


B、高通msm fb的driver接口

[html] view plain copy print ?
  1. staticstructplatform_drivermsm_fb_driver={
  2. .probe=msm_fb_probe,//驱动探测函数
  3. .remove=msm_fb_remove,
  4. #ifndefCONFIG_ANDROID_POWER
  5. .suspend=msm_fb_suspend,
  6. .suspend_late=NULL,
  7. .resume_early=NULL,
  8. .resume=msm_fb_resume,
  9. #endif
  10. .shutdown=NULL,
  11. .driver={
  12. /*Drivernamemustmatchthedevicenameaddedinplatform.c.*/
  13. .name="msm_fb",
  14. },
  15. };


C、msm_fb_init()

向系统注册msm fb的driver,初始化时会调用

D、msm_fb_add_device

向系统中添加新的lcd设备,在mddi_toshiba.c中会被调用
mddi_toshiba.c 函数和数据结构介绍

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

A、LCD设备相关信息

[html] view plain copy print ?
  1. staticstructplatform_devicethis_device_0={
  2. .name="mddi_toshiba_vga",
  3. .id=TOSHIBA_VGA_PRIM,
  4. .dev={
  5. .platform_data=&toshiba_panel_data0,
  6. }
  7. };


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

B、LCD driver接口

[html] view plain copy print ?
  1. staticstructplatform_driverthis_driver={
  2. .probe=mddi_toshiba_lcd_probe,
  3. .driver={
  4. .name="mddi_toshiba_vga",
  5. },
  6. };


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

C、mddi_toshiba_lcd_init

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

D、LCD相关控制函数

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->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模块初始化时会先向系统中注册驱动(在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需要一致才可以绑定;另外,如果某些设备不需要让platform的总线来管理,那么只需要注册驱动即可,而无须向系统中注册device,如msm_touch。


更多相关文章

  1. android不公开的面试题偶!!!
  2. ffmpeg入门教程之Android使用FFmpeg so(封装格式转换)
  3. SurfaceFlinger启动过程分析(一)
  4. Android(安卓)N Ethernet新IP获取机制—IpManager
  5. Android(安卓)RILD运行机制详解
  6. Android(安卓)WebView Java和JavaScript的交互(一)
  7. Android(安卓)Settings 系统设置中 PreferenceActivity点击Heade
  8. Android进阶之抢购倒计时功能
  9. android view构造函数研究

随机推荐

  1. Android分包MultiDex原理详解
  2. Android开发规范FML
  3. App开发那些事--iOS VS android
  4. Android View源码解读:浅谈DecorView与Vie
  5. 移动开发宝典:Android(安卓)Studio使用教
  6. 制作一个透明的Activity
  7. Android客户端判断服务器是否开启 HttpHo
  8. Android学习系列(1)--为App签名(为apk签
  9. Android应用程序签名过期导致项目编译失
  10. Android中(Service )服务的最佳实践——后