• 概述

  因为工作关系,最近有涉及到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. log4erl API

    https://github.com/ahmednawras/log4erl/blob/master/API.txt NOTE:=====Please be informed that the API ...

  2. python 爬取bilibili 视频弹幕

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/09 下午 4:50 # 爬取弹幕 import requests import j ...

  3. shell配置java环境变量和批处理配置环境变量

    linux配置java环境只需在/etc/profile中添加以下 前提是把jdk解压到/usr/local路径,当然路径可以随便改 export JAVA_HOME=/usr/local/jdk1. ...

  4. 【hdu2825】ac自动机 + 状压dp

    传送门 题目大意: 给你一些密码片段字符串,让你求长度为n,且至少包含k个不同密码片段串的字符串的数量. 题解: 因为密码串不多,可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到 ...

  5. 【BZOJ 1032】 [JSOI2007]祖码Zuma

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...

  6. Android studio 无法启动安卓模拟器

    1.通过Android SDK Manager在extra中,找到并选中了那个Intel x86 Emulator Accelerator (HAXM) 2.手动启动HAXM    去对应的sdk\e ...

  7. exec 与 open 打开进程

    1 exec ?-keepnewline ?-ignorestderr  args(?号后面表示可以跟的参数) 这个东西一旦执行 , 没有执行完毕父进程会处于等待中 使用一个或多个子进程运行 由arg ...

  8. Distributed Symmetric Multiprocessing Computing Architecture

    Example embodiments of the present invention includes systems and methods for implementing a scalabl ...

  9. Android客户端后台发送邮件(JMail)

    今天在做项目的时候要处理用户注册问题,里面有个邮箱验证,网上找了一下果然有人做过,但是我拿过来都运行不起来,或者是发送不了邮件.后来我对这个浅浅的研究了一下,贴出来和大家共享. Activity pa ...

  10. python 快速排序 完整

    两头开始 以第一个为基准,从有往左,找第一个比基准数 大的,然后交换 从左往右,找第一个比基准数晓得,然后交换 遍历剩下的 基准数  左边的数们  以及  基准数 右边的数们 def quick_so ...