乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       行者花雕 2022-06-14 發(fā)布于北京

      概述

      因?yàn)楣ぷ麝P(guān)系,最近有涉及到ADF(Atomic Display Framework)相關(guān)的內(nèi)容,部分內(nèi)容來自互聯(lián)網(wǎng)

      ADF(Atomic Display Framework)是Google新增的Display框架,用來替換Framebuffer。 ADF在Android hwcomposer HAL和內(nèi)核驅(qū)動(dòng)程序之間提供了以dma-buf為基礎(chǔ)的顯示框架原型

      ADF的結(jié)構(gòu)圖引用自:http://blog.csdn.net/Lost_qwe/article/details/43113301

      image

      接下來就簡單說一下這些文件的作用。

      接下來就簡單說一下這些文件的作用。

      Driver:即使用ADF框架的custom編寫的程序

      adf_fops.c:負(fù)責(zé)與user space交互的一個(gè)文件,實(shí)現(xiàn)了一些方法(open \ release \ read \ poll等)

      adf_fobs32.c:用于兼容32位的一個(gè)文件,具體實(shí)現(xiàn)會(huì)在掉用到adf_fops.c這個(gè)文件。

      adf_fbdev.c:fb設(shè)備對(duì)外的接口類,負(fù)責(zé)與fb設(shè)備兼容。

      adf.c:這是整個(gè)ADF模塊的核心文件,會(huì)提供模塊內(nèi)部的各種服務(wù),主要提供了消息機(jī)制、同步機(jī)制(fence)以及整體ADF的初始化工作。

      adf_client.c:主要用于調(diào)用custom編寫的驅(qū)動(dòng)代碼以及喚醒(wake up)等。相當(dāng)于整個(gè)fromwork的消息最終出口。

      adf_format.c:用于描述本啟動(dòng)支持哪些圖像格式(RBG \ YUV以及具體的格式定義)。

      adf_sysfs.c:與sysfs交互的一個(gè)文件。

      adf_memblock.c:與內(nèi)存管理的一個(gè)文件,實(shí)現(xiàn)了一些DMA的ops然后注冊(cè)到DMA模塊中,實(shí)現(xiàn)對(duì)內(nèi)存的操作。

      • 主要數(shù)據(jù)結(jié)構(gòu)
      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子系統(tǒng)主要由通用數(shù)據(jù)接口和ops,顯示設(shè)備,顯示接口以及overlay的數(shù)據(jù)結(jié)構(gòu)和ops

      ”adf_obj“是用于創(chuàng)建sysfs文件系統(tǒng)的關(guān)鍵,所以在介紹其他類型之前,我們首先看看它的數(shù)據(jù)結(jié)構(gòu)

      adf內(nèi)核文件系統(tǒng)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
      struct adf_file {
          struct list_head head;//adf內(nèi)核文件系統(tǒng)雙向鏈表
          struct adf_obj *obj;//sys文件節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu),用于創(chuàng)建adf設(shè)備節(jié)點(diǎn)
      
          DECLARE_BITMAP(event_subscriptions, ADF_EVENT_TYPE_MAX);
          u8 event_buf[4096];//adf同步信號(hào)環(huán)形緩沖隊(duì)列
          int event_head;
          int event_tail;
          wait_queue_head_t event_wait;//adf同步信號(hào)鎖
      };
      
      
      adf支持的event類型,我們用的多是就是vsync信號(hào)了
      enum adf_event_type {
          ADF_EVENT_VSYNC = 0,
          ADF_EVENT_HOTPLUG = 1,
          ADF_EVENT_DEVICE_CUSTOM = 128,
          ADF_EVENT_TYPE_MAX = 255,
      };
      
      adf設(shè)備節(jié)點(diǎn)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
      struct adf_obj {
          enum adf_obj_type type;//adf同步信號(hào)類型,主要有vsync,hotplug,custom
          char name[ADF_NAME_LEN];//adf設(shè)備名稱
          struct adf_device *parent;//上一級(jí)adf設(shè)備
      
          const struct adf_obj_ops *ops;//adf ops集合
      
          struct device dev;
      
          struct spinlock file_lock;//adf信號(hào)同步,內(nèi)核與用戶空間文件拷貝鎖
          struct list_head file_list;//adf文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu)雙向鏈表集合
      
          struct mutex event_lock;
          struct rb_root event_refcount;
      
          int id;
          int minor;
      };
      

      · 這里是整個(gè)adf和userspace交互的主要通道,主要有ADF_OBJ_DEVICE, ADF_OBJ_INTERFACE以及ADF_OBJ_OVERLAY_ENGINE三個(gè)接口

      ADF_OBJ_DEVICE---主要負(fù)責(zé)dma-buf, fence,post的配置和管理

      ADF_OBJ_INTERFACE---主要負(fù)責(zé)與dispc相關(guān)的blank,dpm等接口配置和管理

      ADF_OBJ_OVERLAY_ENGINE---overlay相關(guān)

      我們首先看下read ioctl,adf event(包括vsync)將會(huì)在這里從內(nèi)核空間拷貝到用戶空間

      在adf.c中提供了三個(gè)不同的信號(hào)接口供我們將DISPC或者Display Driver中接受到同步信號(hào)發(fā)出去,然后會(huì)在adf_file_queue_event函數(shù)中喚醒”event_wait“等待隊(duì)列

      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)將會(huì)在這里從內(nèi)核空間拷貝到用戶空間

      在adf.c中提供了三個(gè)不同的信號(hào)接口供我們將DISPC或者Display Driver中接受到同步信號(hào)發(fā)出去,然后會(huì)在adf_file_queue_event函數(shù)中喚醒”event_wait“等待隊(duì)列

      image

      ”event_wait“等待隊(duì)列被adf同步信號(hào)喚醒后,應(yīng)用層就可以通過ioctl讀取了

      image

      "adf_device_ioctl"是控制著整個(gè)adf的dma-buf,fence的配置和使用,這是整個(gè)adf的核心內(nèi)容。要理解這一塊內(nèi)容需要先了解dma-buf相關(guān)的API接口和fence的原型

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

      下圖是"adf_device_ioctl"相關(guān)的流程圖

      image

      下面是”adf_interface_ioctl“相關(guān)的流程圖

      image

      這兩個(gè)ioctl里面的內(nèi)容很多(圖可以放大看),弄明白這兩個(gè)ioctl基本上整個(gè)adf框架也就理解差不多了,在后面我會(huì)挑出來單獨(dú)試著分析下(可能會(huì)誤人子弟)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多