关于android的pan_display

下面文章很有参考意义:

参考:

对fb.h  fbmen.c board文件和panel驱动的详细代码分析:

基于S3C2440的嵌入式Linux驱动——Framebuffer子系统解读     

linux LCD驱动(1-4)--硬件分析      

高通和android下的代码分析:

Android display Path analysis  

android framebuffer driver 小结[msm7627为例]

 

 

数据流分析:

使用过Linux framebuffer的人都知道,我们需要在屏幕上显示一幅图像时,只需要将framebuffer mmap到用户空间,然后直接写这块内存即可,操作的结果会立即反映在display上。作为分析Android display path的基础知识,我先来讲讲Linux这部分的原理,如下图所示:

    

    MDP会以一个固定的刷新率取得framebuffer中的数据送往panel,只要我们更新了framebuffer, 更新的内容会在一个刷新周期内反映在panel上。同时,Linux display path还支持可选的pan_display操作,减少刷屏的抖动问题。原理是当前显示的framebuffer并不是用户操作的framebuffer,待用户更新完back framebuffer后,调用pan_display,使得front framebuffer和back framebuffer调换,并强制刷新。

   接着我们来分析一下Android中的display path,Android 区别于Linux,它强制定义了两倍于屏幕大小的framebuffer用于display(也就是双buffer,一个用于接收数据,一个用于传输数据到panel,二者轮流调换角色)。每次需要更新panel的数据时,都会调用ioctl()函数重新设置DMA的寄存器,指定当前的framebuffer偏移地址。另外,整个display path也做了很大的变动,如图所示:

     Framebuffer API不再是对MDP DMA hal驱动的简单包装,进一步封装了MDP PPP hal驱动,buffer中的数据首先经过MDP PPP,完成图像的缩放/de-interlace/csc等操作后放入framebuffer,之后由MDP DMA写入lcd. 

      

 

android  framebuffer及panel注册过程:

    首先,在board.c文件里会注册panel/lcdc/mdp/framebuffer四个devices, 然后从panel的驱动初始化函数开始,做init,然后注册panel的驱动,如果驱动的name和device的name match上,则调用panel的probe函数,在该函数里会重新注册一个LCDC 设备。

    接着,在LCDC的驱动初始化函数中,会注册LCDC的驱动,如果驱动的name和device的name match上,则调用LCDC的probe函数,在该函数里会重新注册一个MDP设备。

    在MDP的驱动初始化函数中,会注册MDP的驱动,如果驱动的name和device的name match上,则调用framebuffer的probe函数,在该函数里会完成整个framebuffer的设置。

    基本的framebuffer驱动注册过程就是这样,参数从panel开始,一步一步的传递到framebuffer.当用户调用framebuffer驱动时,函数调用一步一步的传递下去。


你可能感兴趣的:(转发)