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

来源:https://www.cnblogs.com/linhaostudy/archive/2020/07/17/13327962.html
-Advertisement-
Play Games

概述 因為工作關係,最近有涉及到ADF(Atomic Display Framework)相關的內容,部分內容來自互聯網 ADF(Atomic Display Framework)是Google新增的Display框架,用來替換Framebuffer。 ADF在Android hwcomposer ...


概述

因為工作關係,最近有涉及到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框架也就理解差不多了,在後面我會挑出來單獨試著分析下(可能會誤人子弟)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • TiDB 是 PingCAP 公司自主設計、研發的開源分散式關係型資料庫,是一款同時支持線上事務處理與線上分析處理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分散式資料庫產品,具備水平擴容或者縮容、金融級高可用、實時 HTAP... ...
  • 首先參照https://www.cnblogs.com/wdw984/p/13330074.html,來進行如何安裝Centos和離線下載rpm包。 離線下載jemalloc,上傳到CentOS的/data/rpm/jemalloc目錄 因為redis6.0.5推薦使用jemalloc管理記憶體,所以 ...
  • 一 負載均衡概述 1.1 負載均衡介紹 負載均衡是將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度,帶給用戶更好的體驗。對於Web應用,通過負載均衡,可以將一臺伺服器的工作擴展到多台伺服器中執行,提高整個網站的負載能力。其本質採用一個調度者,保證所有後端伺服器都將性能充分發揮,從而保持 ...
  • win10 訪問遠程文件夾 此共用需要過時的SMB1協議 你不能訪問此共用文件夾 step1 開放協議 在windows功能中勾選SMB1.0並重啟電腦 step2 修改本地策略 將“啟動不安全的來賓登錄”雙擊開啟並確定 PS windows訪問遠程(區域網)使用\\,其實就是,\為本地路徑,\\為 ...
  • 一 盜鏈 1.1 盜鏈概述 盜鏈指的是在自己的界面展示非本伺服器上的內容,通過技術手段獲得其他伺服器的資源。繞過他人資源展示頁面,在自己頁面向用戶提供此內容,從而減輕自己伺服器的負擔,因為真實的空間和流量來自其他伺服器。 因此,通常為了避免被盜鏈,通常Web伺服器建議配置防盜鏈,其主要防盜鏈思路是能 ...
  • 有時候CentOS工作在無互聯網的環境下,需要在離線環境下安裝一些組件,這次實現的是模擬在離線環境下安裝gcc4.8。 第一步: 先去http://mirrors.aliyun.com/centos/7/isos/x86_64/下載CentOS7的安裝鏡像。 第二步: 用虛擬機安裝CentOS7 1 ...
  • 近日,KubeSphere 社區子項目面向物理機環境的負載均衡器 Porter 正式進入 CNCF Landscape。CNCF Landscape 在雲原生實踐過程中的每個環節幫助用戶瞭解有哪些具體的軟體和產品選擇,Porter 進入 CNCF Landscape,意味著 Porter 正式成為了 ...
  • 在Docker中部署LNMP環境可以分為以下幾個步驟: 安裝Docker 創建鏡像 創建Dockerfile build Docerfile 複製/修改配置文件 運行鏡像,並映射埠 為了方便分散式部署,Nginx、PHP、MySQL和Web目錄會分別放在4個不同的容器中,最後我們會打包成4個鏡像。 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...