Chinaunix首页 | 论坛 | 博客
  • 博客访问: 472273
  • 博文数量: 88
  • 博客积分: 1677
  • 博客等级: 上尉
  • 技术积分: 667
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-03 22:17
文章分类

全部博文(88)

文章存档

2013年(1)

2012年(18)

2011年(69)

分类:

2011-11-03 22:43:35

1、User Space 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. 映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。

典型程序段如下:

  1. #include <linux/fb.h>  
  2.    
  3. int main()  
  4.    
  5. {  
  6.    
  7. int fbfd = 0;  
  8.    
  9. struct fb_var_screeninfo vinfo;  
  10.    
  11. struct fb_fix_screeninfo finfo;  
  12.    
  13. long int screensize = 0;  
  14.    
  15. /*打开设备文件*/  
  16.    
  17. fbfd = open("/dev/fb0", O_RDWR);  
  18.    
  19. /*取得屏幕相关参数*/  
  20.    
  21. ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);  
  22.    
  23. /*计算屏幕缓冲区大小*/  
  24.    
  25. screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;  
  26.    
  27. /*映射屏幕缓冲区到用户地址空间*/  
  28.    
  29. fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0);  
  30.    
  31. /*下面可通过fbp指针读写缓冲区*/  
  32.    
  33. ...  
  34.    
  35. }  


3典型应用flow分析

在不同应用程序中,上层的调用会有所不同,比如Andriod下会选择应用程序跳过Linux fb操作层,直接操作显卡驱动层,称之为BLT accelerator。

下面看一下Android平台下画屏的操作流程。

1、 通过mapFrameBuffer直接把用户空间的数据映射到显存中。

2、 调用HAL中的stretch函数直接命令MSM设备提取显存数据然后送入MDP PPP进行处理并经MDDI接口送到外围LCD组件。

具体的函数调用流程如下:

  1. copybit_open();//打开BlitEngine,同时也打开fb设备  
  2.    
  3. mapFrameBuffer();//设置显示参数,同时得到显存虚拟地址  
  4.    
  5. copybit->stretch(copybit, &dst, &src, &sdrect, &sdrect, &it);//通知底层去刷屏  


接下的流程是:

  1. 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 
阅读(1242) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~