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模块中,实现对内存的操作。

adf_fops.c是整个ADF和userspace交互的入口,我们重点关注下adf_file数据结构和ioctl接口:

  • ”event_buf“用于缓冲adf event信号,而其中的”ADF_EVENT_VSYNC“信号是显示画面同步的关键
struct adf_file {
    struct list_head head;
    struct adf_obj *obj;//sys文件节点数据结构,用于创建adf设备节点

    DECLARE_BITMAP(event_subscriptions, ADF_EVENT_TYPE_MAX);
    u8 event_buf[4096];//adf同步信号环形缓冲队列
    int event_head;
    int event_tail;
    wait_queue_head_t event_wait;//adf同步信号锁
};
enum adf_event_type {
    ADF_EVENT_VSYNC = 0,
    ADF_EVENT_HOTPLUG = 1,
    ADF_EVENT_DEVICE_CUSTOM = 128,
    ADF_EVENT_TYPE_MAX = 255,
};
  • 这里是整个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框架也就理解差不多了,在后面我会挑出来单独试着分析下(可能会误人子弟)

时间: 2024-10-09 03:13:41

Linux ADF(Atomic Display Framework)浅析---概述的相关文章

Linux操作系统的管理(虚拟机的概述)三

在我们了解linux操作系统之前我们首先要先知道虚拟机的运行架构,我们在初学linux的时候,如果在我们的真实PC上做操作你就会发现,你很多时候都是在重装系统的状态下,当然你也可以在linux操作系统上去装一个KVM虚拟机,不过你确定你要放弃windows操作系统吗?  所以为了让我们做实验的时候能够方便了解我们就把我们的linux操作系统乖乖的装在虚拟机上吧. 在使用虚拟机之前我们得先知道虚拟机是个什么工具,首先在我们当前这些X86平台上每个平台上只能运行一个,现在的服务器也是这种架构的多,在

zz`linux块设备IO栈浅析

http://www.sysnote.org/2015/08/06/linux-io-stack/ 块存储,简单来说就是使用块设备为系统提供存储服务.块存储分多种类型,有单机块存储,网络存储(如NAS,SAN等),分布式块存储(目前主流的如AWS的EBS,青云的云硬盘,阿里云的云磁盘,网易云硬盘等).通常块存储的表现形式就是一块设备,用户看到的就是类似于sda,sdb这样的逻辑设备.本文主要介绍Linux块设备,对Linux的块设备I/O栈进行分析. 1.块设备基本概念 块设备将信息存储在固定大

在linux下搭建Robot Framework

在linux下搭建自动化测试框架Robot Framework,可以实现多用户同时登录并进行自动化脚本编写,相互之间没有影响. linux系统:fedora 21 步奏 描述 动作 note 1 Install Python yum install python yum list python  /* can view which python version will be installed */ 2 Install easy_install sudo yum install python-

(转帖)linux内核SMP负载均衡浅析

需求在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态(可执行状态),则它会被加入到其中一个run_queue(且同一时刻仅会被加入到一个run_queue),以便让调度程序安排它在这个run_queue对应的CPU上面运行.一个CPU对应一个run_queue这样的设计,其好处是:1.一个持续处于TASK_RUNNING状态的进程总是趋于在同一个CPU上面运行(其间,这个进程

Linux 2.6内核Makefile浅析【转】

转自:http://blog.csdn.net/tommy_wxie/article/details/7280463 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 概述 kbuild文件 1 obj-y和obj-m 11 obj-y生成built-ino 12 目标由多个源文件编译得到 13 调用子目录Makefile 2 lib-y和lib-m 3 编译选项变量 31 ccflags-yasflags-yldflags-y 32 subdir-ccflags-ysub

android framework浅析_转

Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的. 2)Linux 内核是硬件和软件层之间的抽象层. 3)系统总是需要操作系统的支持的,比如内存管理.进程管理.网络协议栈等 2. 中间件(即android 的C/C++框架) 1)中间件包括两部分:核心库

Linux 2.6内核Makefile浅析

1 概述 Makefile由五个部分组成: Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件). .config:内核配置文件(一般由make menuconfig生成). arch/$(ARCH)/Makefile:目标处理器的Makefile. scripts/Makefile.*:所有kbuild Makefile的规则,它们包含了定义/规则等. kbuild Makefiles:每个子目录都有kbuild

Android framework浅析[转]

Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的. 2)Linux 内核是硬件和软件层之间的抽象层. 3)系统总是需要操作系统的支持的,比如内存管理.进程管理.网络协议栈等 2. 中间件(即android 的C/C++框架) 1)中间件包括两部分:核心库

linux内存管理源码分析 - 概述

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 最近在学习内核模块的框架,这里做个总结,知识太多了. 分段和分页 先看一幅图 也就是我们实际中编码时遇到的内存地址并不是对应于实际内存上的地址,我们编码中使用的地址是一个逻辑地址,会通过分段和分页这两个机制把它转为物理地址.而由于linux使用的分段机制有限,可以认为,linux下的逻辑地址=线性地址.也就是,我们编码使用的是线性地址,之后只需要经过一个分页机制就可以把这个地址转为物理地址了.所以我们更重要的