ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux ADF(Atomic Display Framework)浅析---概述

2020-07-17 09:33:56  阅读:426  来源: 互联网

标签:ADF adf obj struct event Display --- ioctl 浅析


概述

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

image

接下来就简单说一下这些文件的作用。

接下来就简单说一下这些文件的作用。

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[4096];//adf同步信号环形缓冲队列
    int event_head;
    int event_tail;
    wait_queue_head_t event_wait;//adf同步信号锁
};

adf支持的event类型,我们用的多是就是vsync信号了
enum adf_event_type {
    ADF_EVENT_VSYNC = 0,
    ADF_EVENT_HOTPLUG = 1,
    ADF_EVENT_DEVICE_CUSTOM = 128,
    ADF_EVENT_TYPE_MAX = 255,
};
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相关

我们首先看下read ioctl,adf event(包括vsync)将会在这里从内核空间拷贝到用户空间

在adf.c中提供了三个不同的信号接口供我们将DISPC或者Display Driver中接受到同步信号发出去,然后会在adf_file_queue_event函数中唤醒”event_wait“等待队列

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“等待队列

image

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

image

"adf_device_ioctl"是控制着整个adf的dma-buf,fence的配置和使用,这是整个adf的核心内容。要理解这一块内容需要先了解dma-buf相关的API接口和fence的原型

以下引用自”http://blog.csdn.net/YKDSea/article/details/39995075“的描述:

下图是"adf_device_ioctl"相关的流程图

image

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

image

这两个ioctl里面的内容很多(图可以放大看),弄明白这两个ioctl基本上整个adf框架也就理解差不多了,在后面我会挑出来单独试着分析下(可能会误人子弟)

标签:ADF,adf,obj,struct,event,Display,---,ioctl,浅析
来源: https://www.cnblogs.com/linhaostudy/p/13327962.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有