• 概述

  因为工作关系,最近有涉及到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)浅析---概述的更多相关文章

  1. Linux regulator framework(1) - 概述【转】

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...

  2. [转]一个基于完成端口的TCP Server Framework,浅析IOCP

    [转]一个基于完成端口的TCP Server Framework,浅析IOCP http://www.cppblog.com/adapterofcoms/archive/2010/06/26/1187 ...

  3. [初级教程]用SecureCRT+Xming轻松远程实现Linux的X DISPLAY

    [初级教程]用SecureCRT+Xming轻松远程实现Linux的X DISPLAY 发布者:sqqdugdu 时间:10-06 阅读数:2117 测试环境:RHEL 6.1,SecureCRT 5 ...

  4. Linux 2.6内核Makefile浅析

    1 概述 Makefile由五个部分组成: Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件). .config:内核 ...

  5. Linux环境中DISPLAY环境变量的解释及设置

    在Linux/Unix类操作系统上的GUI应用程序使用X Window系统(X Window System),它旨在允许多个用户使用窗口化的应用程序通过网络访问计算机. DISPLAY环境变量用来设置 ...

  6. android framework浅析_转

    Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...

  7. Android framework浅析[转]

    Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...

  8. iOS 静态库,动态库与 Framework 浅析

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  9. Linux入门——开机启动过程浅析

    Linux开机启动过程浅析 Introduction 开机启动过程分为以下6个步骤,分别是BIOS, MBR, GRUB, Kernel, Init, RunLevel, RunDefinition ...

随机推荐

  1. spark 2.0.2 集群搭建

    由于之前已经搭建过hadoop相关环境,现在搭建spark的预备工作只有scala环境了 一,配置scala环境 1.解压tar包后,编辑/etc/profile 2.source /etc/prof ...

  2. 循环不变式(loop invariant)

    循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求. (1)进入循环语句时,不变式必须成立: (2)循环语 ...

  3. activity-alias详解及应用

    activity-alias标签元素众所周知,AndroidManifest是一个xml文件,它包含很多标签元素,如application.activity.receiver等,其中有一个叫做acti ...

  4. win10下安装docker步骤(一)

    一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 请注意电脑默认的Hyper-V虚拟机监控程序是不能进行勾选的,需要 ...

  5. React父子组件的一个混淆点

    反正我自己是混淆了,React父子组件和组件类的继承弄混在一起了.这两个东西完全是不相关的. 父子组件可以看成两个组件标签的包含关系,在另外一个组件标签的内部就是子组件,父子组件通过这种关系通信. 组 ...

  6. 简单的JAVA MVC框架模式--Java-servlet-JavaBean

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...

  7. android高仿人人网

    经过几个月的努力,终于基本完成了人人API拥有的所有功能,界面采用仿照人人梦想版5.13制作,其中资源文件也采用人人的APK文件资源,完成的功能及知识点如下: 1.通过三种动画仿照出人人引导页的放大切 ...

  8. kill the lock

    $ killall -s 9 krunner_lock [ZT][From:] http://www.commandlinefu.com/commands/view/2264/unlock-your- ...

  9. /var/tmp/.oracle 和 oracle listener (监听)的一点理解

    关于 /var/tmp/.oracle 的作用測试 ~---查看 /var/tmp 的权限 [root@lixora var]# ll total 164 ... drwxrwxrwt  3 root ...

  10. Opencv中K均值算法(K-Means)及其在图像分割中的应用

    K均值(K-Means)算法是一种无监督的聚类学习算法,他尝试找到样本数据的自然类别,分类是K由用户自己定义,K均值在不需要任何其他先验知识的情况下,依据算法的迭代规则,把样本划分为K类.K均值是最常 ...