1. 程式人生 > >Linux ADF(Atomic Display Framework)淺析---概述

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

atomic from google release sig 等待 inter .com alt

因為工作關系,最近有涉及到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_DEVICEADF_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)淺析---概述