转自http://blog.csdn.net/lost_qwe/article/details/43113301
关于ADF(Atomic Display Framework)是Google新推出的一个关于Display驱动的框架。
首先上一张自己画的ADF的结构图
接下来就简单说一下这些文件的作用。
Driver:即使用ADF框架的custom编写的程序
adf_fops.c:负责与user space交互的一个文件,实现了一些方法(open \ release \ read \ poll等)
adf_fobs32.c:用于兼容32位的一个文件,具体实现会在掉用到adf_fops.c这个文件。
adf_fbdev.c:fb设备对外的接口类,负责与fb设备兼容。
adf.c:这是整个ADF模块的核心文件,会提供模块内部的各种服务,主要提供了消息机制、同步机制(fence)以及整体ADF的初始化工作。
adf_client.c:主要用于调用custom编写的驱动代码以及唤醒(wake up)等。相当于整个fromwork的消息最终出口。
adf_format.c:用于描述本启动支持哪些图像格式(RBG \ YUV以及具体的格式定义)。
adf_sysfs.c:与sysfs交互的一个文件。
adf_memblock.c:与内存管理的一个文件,实现了一些DMA的ops然后注册到DMA模块中,实现对内存的操作。
整体来说ADF模块还是比较简单的,其中比较重要的内容就是关于模块的消息通讯机制。
首先来看一个关于设置消息机制整体的一个流程图。
这个流程可能画的不太好,是三个流程嵌套在一起描述的。
从左边数地一个流程其实就是使用read方法在kernel中的实现,通过这个图可以看到这里有两个个意义
1.user mode 调用read时,会sleep,直到有event才会继续执行。
2.当kernel mode内产生任意一个消息都需要通知user space。
中间的那个流程其实是ADF消息通讯的主干,或者所示消息的产生者。
右边的那个时序是post时序。关于post时序首先简单介绍一下什么是post时序。
Post时序就是将需要显示的内容由user space 传递给 kernel space,然后等待一个特殊的信号过来后,送给显示屏显示(Display Conctrler)。
等待的这个信号其实就是屏幕刷新信号(vblank、vsync……)。
这条时序大概就是说当user space希望将一个图片刷新到屏幕上,首先将这个图片传给kernel space,然后在kernel中等待屏幕刷新信号(一般由timer触发),当检测到屏幕刷新信号后,将图片送给显示设备。
以上这三个时序基本介绍了在显示的时候针对消息最重要的三个时序。基于这三个时序在简单介绍一下post时序,首先贴出一个流程图:
这个流程与上一个图中最右边的流程一起看,就能看明白了,具体的说明感觉图上已经画的挺明白了,如果不明白的在问我吧。