Display接口介绍
在Android平台下,应用程序面对的显示部分的接口就是HAL,参考copybit.c,具体接口如下介绍:
open_copybit
初始化相关变量,并调用open("/dev/graphics/fb0", O_RDWR,
0);打开fb设备。
set_parameter_copybit
设置各种操作参数,如rotate、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_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 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,PROT_READ|PROT_WRITE,MAP_SHARED,
fbfd, 0);
...
}
在不同应用程序中,上层的调用会有所不同,比如Andriod下会选择应用程序跳过Linux
fb操作层,直接操作显卡驱动层,称之为BLT accelerator。
下面看一下Android平台下画屏的操作流程。
1、通过mapFrameBuffer直接把用户空间的数据映射到显存中。
2、调用HAL中的stretch函数直接命令MSM设备提取显存数据然后送入MDP
PPP进行处理并经MDDI接口送到外围LCD组件。
具体的函数调用流程如下:
copybit_open();//打开BlitEngine,同时也打开fb设备
mapFrameBuffer();//设置显示参数,同时得到显存虚拟地址
copybit->stretch(copybit,
&dst, &src,
&sdrect, &sdrect,
&it);//通知底层去刷屏
接下的流程是:
stretch_copybit->
msm_copybit->
fb_ioctl()->msm_fb_ioctl(MSMFB_BLIT)->
msmfb_blit->
mdp_blit->
mdp_ppp_blit->
mdp_start_ppp->MDP&MDDI HW
operation
Note:
本部分介绍的完全是用户空间显示部分的架构,与kernel并没有直接的联系,主要是JNI以下到HAL以上的部分。
1、Surface
manager(surface
flinger)简介
Surface
manager是用户空间中framework下libraries中负责显示相关的一个模块。如下: