Linux ADF(Atomic Display Framework)浅析---概述
概述
因为工作关系,最近有涉及到ADF(Atomic Display Framework)相关的内容,部分内容来自互联网
ADF(Atomic Display Framework)是Google新增的Display框架,用来替换Framebuffer。 ADF在Android hwcomposer HAL和内核驱动程序之间提供了以dma-buf为基础的显示框架原型
ADF的结构图引用自:http://blog.csdn.net/Lost_qwe/article/details/43113301
接下来就简单说一下这些文件的作用。
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模块中,实现对内存的操作。
主要数据结构
struct adf_obj;
struct adf_obj_ops;
struct adf_device;
struct adf_device_ops;
struct adf_interface;
struct adf_interface_ops;
struct adf_overlay_engine;
struct adf_overlay_engine_ops;
如上图所示, adf子系统主要由通用数据接口和ops,显示设备,显示接口以及overlay的数据结构和ops
”adf_obj“是用于创建sysfs文件系统的关键,所以在介绍其他类型之前,我们首先看看它的数据结构
adf内核文件系统基础数据结构
struct adf_file {
struct list_head head;//adf内核文件系统双向链表
struct adf_obj *obj;//sys文件节点数据结构,用于创建adf设备节点 DECLARE_BITMAP(event_subscriptions, ADF_EVENT_TYPE_MAX);
u8 event_buf[];//adf同步信号环形缓冲队列
int event_head;
int event_tail;
wait_queue_head_t event_wait;//adf同步信号锁
};
adf支持的event类型,我们用的多是就是vsync信号了
enum adf_event_type {
ADF_EVENT_VSYNC = ,
ADF_EVENT_HOTPLUG = ,
ADF_EVENT_DEVICE_CUSTOM = ,
ADF_EVENT_TYPE_MAX = ,
};
adf设备节点基础数据结构
struct adf_obj {
enum adf_obj_type type;//adf同步信号类型,主要有vsync,hotplug,custom
char name[ADF_NAME_LEN];//adf设备名称
struct adf_device *parent;//上一级adf设备 const struct adf_obj_ops *ops;//adf ops集合 struct device dev; struct spinlock file_lock;//adf信号同步,内核与用户空间文件拷贝锁
struct list_head file_list;//adf文件系统数据结构双向链表集合 struct mutex event_lock;
struct rb_root event_refcount; int id;
int minor;
};
- 这里是整个adf和userspace交互的主要通道,主要有ADF_OBJ_DEVICE, ADF_OBJ_INTERFACE以及ADF_OBJ_OVERLAY_ENGINE三个接口
ADF_OBJ_DEVICE---主要负责dma-buf, fence,post的配置和管理
ADF_OBJ_INTERFACE---主要负责与dispc相关的blank,dpm等接口配置和管理
ADF_OBJ_OVERLAY_ENGINE---overlay相关
long adf_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct adf_file *fpriv = file->private_data;
struct adf_obj *obj = fpriv->obj;
long ret = -EINVAL; dev_dbg(&obj->dev, "%s ioctl %u\n", dev_name(&obj->dev), _IOC_NR(cmd)); switch (obj->type) {
case ADF_OBJ_OVERLAY_ENGINE:
ret = adf_overlay_engine_ioctl(adf_obj_to_overlay_engine(obj),
fpriv, cmd, arg);
break; case ADF_OBJ_INTERFACE:
ret = adf_interface_ioctl(adf_obj_to_interface(obj), fpriv, cmd,
arg);
break; case ADF_OBJ_DEVICE:
ret = adf_device_ioctl(adf_obj_to_device(obj), fpriv, cmd, arg);
break;
} return ret;
}
我们首先看下read ioctl,adf event(包括vsync)将会在这里从内核空间拷贝到用户空间
在adf.c中提供了三个不同的信号接口供我们将DISPC或者Display Driver中接受到同步信号发出去,然后会在adf_file_queue_event函数中唤醒”event_wait“等待队列

”event_wait“等待队列被adf同步信号唤醒后,应用层就可以通过ioctl读取了

"adf_device_ioctl"是控制着整个adf的dma-buf,fence的配置和使用,这是整个adf的核心内容。要理解这一块内容需要先了解dma-buf相关的API接口和fence的原型
以下引用自”http://blog.csdn.net/YKDSea/article/details/39995075“的描述:
android fence sync是android中引入的一个同步的机制,主要用在display的graphic buffer的同步管理上,可以让对buffer的操作可以并行执行以减少时间。
在BufferQueue中每个buffer都有一个对应的fence fd,他对应了一个fence object,它表明有角色在操作这块buffer,当fence object变为siganled状态的时候,表明这块buffer已经没有再被操作了。
可以简单的把fence理解为一把锁,当它active的时候表明了对buffer的控制,当它为signaled状态时候,表明不再控制buffer,每个需要使用buffer的角色,在使用前都要检查这把锁是否signaled了才能进行安全的操作,否则就要等待。
下图是"adf_device_ioctl"相关的流程图

下面是”adf_interface_ioctl“相关的流程图

这两个ioctl里面的内容很多(图可以放大看),弄明白这两个ioctl基本上整个adf框架也就理解差不多了,在后面我会挑出来单独试着分析下(可能会误人子弟)
Linux ADF(Atomic Display Framework)浅析---概述的更多相关文章
- Linux regulator framework(1) - 概述【转】
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...
- [转]一个基于完成端口的TCP Server Framework,浅析IOCP
[转]一个基于完成端口的TCP Server Framework,浅析IOCP http://www.cppblog.com/adapterofcoms/archive/2010/06/26/1187 ...
- [初级教程]用SecureCRT+Xming轻松远程实现Linux的X DISPLAY
[初级教程]用SecureCRT+Xming轻松远程实现Linux的X DISPLAY 发布者:sqqdugdu 时间:10-06 阅读数:2117 测试环境:RHEL 6.1,SecureCRT 5 ...
- Linux 2.6内核Makefile浅析
1 概述 Makefile由五个部分组成: Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件). .config:内核 ...
- Linux环境中DISPLAY环境变量的解释及设置
在Linux/Unix类操作系统上的GUI应用程序使用X Window系统(X Window System),它旨在允许多个用户使用窗口化的应用程序通过网络访问计算机. DISPLAY环境变量用来设置 ...
- android framework浅析_转
Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...
- Android framework浅析[转]
Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...
- iOS 静态库,动态库与 Framework 浅析
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- Linux入门——开机启动过程浅析
Linux开机启动过程浅析 Introduction 开机启动过程分为以下6个步骤,分别是BIOS, MBR, GRUB, Kernel, Init, RunLevel, RunDefinition ...
随机推荐
- spark 2.0.2 集群搭建
由于之前已经搭建过hadoop相关环境,现在搭建spark的预备工作只有scala环境了 一,配置scala环境 1.解压tar包后,编辑/etc/profile 2.source /etc/prof ...
- 循环不变式(loop invariant)
循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求. (1)进入循环语句时,不变式必须成立: (2)循环语 ...
- activity-alias详解及应用
activity-alias标签元素众所周知,AndroidManifest是一个xml文件,它包含很多标签元素,如application.activity.receiver等,其中有一个叫做acti ...
- win10下安装docker步骤(一)
一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 请注意电脑默认的Hyper-V虚拟机监控程序是不能进行勾选的,需要 ...
- React父子组件的一个混淆点
反正我自己是混淆了,React父子组件和组件类的继承弄混在一起了.这两个东西完全是不相关的. 父子组件可以看成两个组件标签的包含关系,在另外一个组件标签的内部就是子组件,父子组件通过这种关系通信. 组 ...
- 简单的JAVA MVC框架模式--Java-servlet-JavaBean
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- android高仿人人网
经过几个月的努力,终于基本完成了人人API拥有的所有功能,界面采用仿照人人梦想版5.13制作,其中资源文件也采用人人的APK文件资源,完成的功能及知识点如下: 1.通过三种动画仿照出人人引导页的放大切 ...
- kill the lock
$ killall -s 9 krunner_lock [ZT][From:] http://www.commandlinefu.com/commands/view/2264/unlock-your- ...
- /var/tmp/.oracle 和 oracle listener (监听)的一点理解
关于 /var/tmp/.oracle 的作用測试 ~---查看 /var/tmp 的权限 [root@lixora var]# ll total 164 ... drwxrwxrwt 3 root ...
- Opencv中K均值算法(K-Means)及其在图像分割中的应用
K均值(K-Means)算法是一种无监督的聚类学习算法,他尝试找到样本数据的自然类别,分类是K由用户自己定义,K均值在不需要任何其他先验知识的情况下,依据算法的迭代规则,把样本划分为K类.K均值是最常 ...