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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...