Chinaunix首页 | 论坛 | 博客
  • 博客访问: 307426
  • 博文数量: 27
  • 博客积分: 1933
  • 博客等级: 上尉
  • 技术积分: 884
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-04 23:34
文章分类

全部博文(27)

文章存档

2013年(3)

2011年(24)

分类: LINUX

2011-10-18 15:18:21

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

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

  1. static struct fb_ops msm_fb_ops = {  
  2.    
  3. .owner = THIS_MODULE,  
  4.    
  5. .fb_open = msm_fb_open,  
  6.    
  7. .fb_release = msm_fb_release,  
  8.    
  9. .fb_read = NULL,  
  10.    
  11. .fb_write = NULL,  
  12.    
  13. .fb_cursor = NULL,  
  14.    
  15. .fb_check_var = msm_fb_check_var,     /* 参数检查 */  
  16.    
  17. .fb_set_par = msm_fb_set_par,       /* 设置显示相关参数 */  
  18.    
  19. .fb_setcolreg = NULL, /* set color register */  
  20.    
  21. .fb_blank = NULL,       /* blank display */  
  22.    
  23. .fb_pan_display = msm_fb_pan_display,       /* 显示 */  
  24.    
  25. .fb_fillrect = msm_fb_fillrect,     /* Draws a rectangle */  
  26.    
  27. .fb_copyarea = msm_fb_copyarea, /* Copy data from area to another */  
  28.    
  29. .fb_imageblit = msm_fb_imageblit,   /* Draws a image to the display */  
  30.    
  31. .fb_cursor = NULL,  
  32.    
  33. .fb_rotate = NULL,  
  34.    
  35. .fb_sync = NULL, /* wait for blit idle, optional */  
  36.    
  37. .fb_ioctl = msm_fb_ioctl,    /* perform fb specific ioctl (optional) */  
  38.    
  39. .fb_mmap = NULL,  
  40.    
  41. };  


B、高通msm fb的driver接口

  1. static struct platform_driver msm_fb_driver = {  
  2.    
  3. .probe = msm_fb_probe,//驱动探测函数  
  4.    
  5. .remove = msm_fb_remove,  
  6.    
  7. #ifndef CONFIG_ANDROID_POWER  
  8.    
  9. .suspend = msm_fb_suspend,  
  10.    
  11. .suspend_late = NULL,  
  12.    
  13. .resume_early = NULL,  
  14.    
  15. .resume = msm_fb_resume,  
  16.    
  17. #endif  
  18.    
  19. .shutdown = NULL,  
  20.    
  21. .driver = {  
  22.    
  23.             /* Driver name must match the device name added in platform.c. */  
  24.    
  25.             .name = "msm_fb",  
  26.    
  27.             },  
  28.    
  29. };  


C、msm_fb_init()

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

D、msm_fb_add_device

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

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

A、LCD设备相关信息

  1. static struct platform_device this_device_0 = {  
  2.    
  3. .name   = "mddi_toshiba_vga",  
  4.    
  5. .id   = TOSHIBA_VGA_PRIM,  
  6.    
  7. .dev       = {  
  8.    
  9.          .platform_data = &toshiba_panel_data0,  
  10.    
  11. }  
  12.    
  13. };  


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

B、LCD driver接口

  1. static struct platform_driver this_driver = {  
  2.    
  3. .probe = mddi_toshiba_lcd_probe,  
  4.    
  5. .driver = {  
  6.    
  7.          .name   = "mddi_toshiba_vga",  
  8.    
  9. },  
  10.    
  11. };  


其中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。

阅读(2720) | 评论(0) | 转发(4) |
给主人留下些什么吧!~~