Android(安卓)display架构分析四-msm_fb.c 函数和数据结构介绍
该文件为高通显卡的驱动文件,比较重要的函数接口和数据结构如下:
A、高通msm fb设备的文件操作函数接口
[html] view plain copy print ?- 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,/*Copydatafromareatoanother*/
- .fb_imageblit=msm_fb_imageblit,/*Drawsaimagetothedisplay*/
- .fb_cursor=NULL,
- .fb_rotate=NULL,
- .fb_sync=NULL,/*waitforblitidle,optional*/
- .fb_ioctl=msm_fb_ioctl,/*performfbspecificioctl(optional)*/
- .fb_mmap=NULL,
- };
B、高通msm fb的driver接口
[html] view plain copy print ?- staticstructplatform_drivermsm_fb_driver={
- .probe=msm_fb_probe,//驱动探测函数
- .remove=msm_fb_remove,
- #ifndefCONFIG_ANDROID_POWER
- .suspend=msm_fb_suspend,
- .suspend_late=NULL,
- .resume_early=NULL,
- .resume=msm_fb_resume,
- #endif
- .shutdown=NULL,
- .driver={
- /*Drivernamemustmatchthedevicenameaddedinplatform.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设备相关信息
[html] view plain copy print ?- staticstructplatform_devicethis_device_0={
- .name="mddi_toshiba_vga",
- .id=TOSHIBA_VGA_PRIM,
- .dev={
- .platform_data=&toshiba_panel_data0,
- }
- };
其中toshiba_panel_data0包含了硬件LCD的控制函数,如开关、初始化等等
B、LCD driver接口
[html] view plain copy print ?- staticstructplatform_driverthis_driver={
- .probe=mddi_toshiba_lcd_probe,
- .driver={
- .name="mddi_toshiba_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 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。
更多相关文章
- android不公开的面试题偶!!!
- ffmpeg入门教程之Android使用FFmpeg so(封装格式转换)
- SurfaceFlinger启动过程分析(一)
- Android(安卓)N Ethernet新IP获取机制—IpManager
- Android(安卓)RILD运行机制详解
- Android(安卓)WebView Java和JavaScript的交互(一)
- Android(安卓)Settings 系统设置中 PreferenceActivity点击Heade
- Android进阶之抢购倒计时功能
- android view构造函数研究