由於工做關係,最近有涉及到ADF(Atomic Display Framework)相關的內容,部份內容來自互聯網數據結構
ADF(Atomic Display Framework)是Google新增的Display框架,用來替換Framebuffer。 ADF在Android hwcomposer HAL和內核驅動程序之間提供了以dma-buf爲基礎的顯示框架原型composer
ADF的結構圖引用自:http://blog.csdn.net/Lost_qwe/article/details/43113301框架
接下來就簡單說一下這些文件的做用。函數
接下來就簡單說一下這些文件的做用。post
Driver:即便用ADF框架的custom編寫的程序spa
adf_fops.c:負責與user space交互的一個文件,實現了一些方法(open \ release \ read \ poll等).net
adf_fobs32.c:用於兼容32位的一個文件,具體實現會在掉用到adf_fops.c這個文件。3d
adf_fbdev.c:fb設備對外的接口類,負責與fb設備兼容。code
adf.c:這是整個ADF模塊的核心文件,會提供模塊內部的各類服務,主要提供了消息機制、同步機制(fence)以及總體ADF的初始化工做。orm
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「等待隊列
」event_wait「等待隊列被adf同步信號喚醒後,應用層就能夠經過ioctl讀取了
"adf_device_ioctl"是控制着整個adf的dma-buf,fence的配置和使用,這是整個adf的核心內容。要理解這一塊內容須要先了解dma-buf相關的API接口和fence的原型
如下引用自」http://blog.csdn.net/YKDSea/article/details/39995075「的描述:
下圖是"adf_device_ioctl"相關的流程圖
下面是」adf_interface_ioctl「相關的流程圖
這兩個ioctl裏面的內容不少(圖能夠放大看),弄明白這兩個ioctl基本上整個adf框架也就理解差很少了,在後面我會挑出來單獨試着分析下(可能會誤人子弟)