# Display - [简介](#section11660541593) - [目录](#section161941989596) - [接口说明](#section1551164914237) - [使用说明](#section129654513264) - [相关仓](#section1371113476307) ## 简介 该仓下主要包含Display模块HDI(Hardware Driver Interface)接口定义及其实现,对上层图形服务提供显示驱动能力接口,HDI接口主要包括如下三大类: - DisplayLayer:负责显示图层的管理, 包括图层创建、显示属性设置、图层填充及刷新等操作; - DisplayGralloc:负责显示模块内存的管理,包括内存的申请和释放、内存映射等操作; - DisplayGfx:提供硬件加速接口,包括硬件加速模块的初始化、位图搬移、规则图形的画线及填充等操作。 **图 1** DISPLAY模块HDI接口层框架图 ![](figures/hdi-architecture-of-the-display-module.png "hdi-architecture-of-the-display-module") ## 目录 该仓下源代码目录结构如下所示 ``` /drivers/peripheral/display ├── hal # display模块的hal层代码 │ └── default # display模块hdi的默认实现 ├── interfaces # display模块对上层服务提供的驱动能力接口 │ └── include # display模块对外提供的接口定义 ├── test # display模块的测试代码 │ └── unittest # display模块的单元测试代码 ``` ### 接口说明 Display驱动提供给系统服务WMS可直接调用的驱动能力接口,按照功能分类三大类:显示图层子模块、显示内存子模块、硬件加速子模块,可以提供图层的创建和销毁、图层属性的设置,内存的申请和释放、映射和缓冲,矩形填充和位图搬移等能力。 提供的部分接口说明如[表1 Display HDI接口列表](#table1513255710559)所示: **表 1** Display HDI接口列表

头文件

接口名称

功能描述

display_layer.h

int32_t (*InitDisplay)(uint32_t devId);

显示屏初始化

int32_t (*DeinitDisplay)(uint32_t devId);

显示屏反初始化

int32_t (*GetDisplayInfo)(uint32_t devId, DisplayInfo *dispInfo);

获取显示信息

int32_t (*OpenLayer)(uint32_t devId, const LayerInfo *layerInfo, uint32_t *layerId);

创建layer图层

int32_t (*CloseLayer)(uint32_t devId, uint32_t layerId);

销毁layer图层

int32_t (*SetLayerVisible)(uint32_t devId, uint32_t layerId, bool visible);

设置layer是否可见

int32_t (*SetLayerDirtyRegion)(uint32_t devId, uint32_t layerId, IRect *region);

设置layer刷新区域

int32_t (*Flush)(uint32_t devId, uint32_t layerId, LayerBuffer *buffer);

刷新图层

int32_t (*GetLayerBuffer)(uint32_t devId, uint32_t layerId, LayerBuffer *buffer);

获取图层buffer

display_gralloc.h

int32_t AllocMem(GrallocBuffer *buffer);

显示内存分配

void FreeMem(GrallocBuffer *buffer);

显示内存释放

void *Mmap(GrallocBuffer *buffer);

内存映射

void *MmapCache(GrallocBuffer *buffer);

内存映射为cache

int32_t Unmap(GrallocBuffer *buffer);

取消内存映射

int32_t FlushCache(GrallocBuffer *buffer);

刷新cache里的内容到内存并且使cache里的内容无效

int32_t FlushMCache(GrallocBuffer *buffer);

刷新Mmap映射的cache里的内容到内存并且使cache里的内容无效

display_gfx.h

int32_t InitGfx(void);

初始化硬件加速

int32_t DeinitGfx(void);

反初始化硬件加速

int32_t Blit(ISurface *srcSurface, IRect *srcRect, ISurface *dstSurface, IRect *dstRect);

位图搬移

int32_t FillRect(ISurface *surface, IRect *rect, uint32_t color, GfxOpt *opt);

绘制矩形框

### 使用说明 该仓核心功能是提供显示驱动能力接口供上层图形系统服务调用,提供的驱动能力接口统一归属为HDI接口层。 通过如下简要示例代码说明Display HDI接口的使用: ``` #include "display_gfx.h" #include "display_gralloc.h" #include "display_layer.h" #include "display_type.h" #define DEVID 0 DisplayTest g_displayTest; static GrallocBuffer g_buffer; static int32_t GetDisplayInterfaces(void) { int32_t ret; ret = LayerInitialize(&g_displayTest.layerFuncs); if (ret != DISPLAY_SUCCESS || g_displayTest.layerFuncs == NULL) { HDF_LOGE("initialize layer failed"); return DISPLAY_FAILURE; } ret = GrallocInitialize(&g_displayTest.grallocFuncs); if (ret != DISPLAY_SUCCESS || g_displayTest.layerFuncs == NULL) { HDF_LOGE("initialize gralloc failed"); return DISPLAY_FAILURE; } ret = GfxInitialize(&g_displayTest.gfxFuncs); if (ret != DISPLAY_SUCCESS || g_displayTest.gfxFuncs == NULL) { HDF_LOGE("initialize gralloc failed"); return DISPLAY_FAILURE; } return DISPLAY_SUCCESS; } static int32_t DisplayUninit(void) { LayerUninitialize(g_displayTest.layerFuncs); GrallocUninitialize(g_displayTest.grallocFuncs); GfxUninitialize(g_displayTest.gfxFuncs); return DISPLAY_SUCCESS; } static void GetLayerInfo(LayerInfo *layInfo) { layInfo->width = g_displayTest.displayInfo.width; layInfo->height = g_displayTest.displayInfo.height; layInfo->bpp = LAYER_BPP; layInfo->pixFormat = PIXEL_FMT_RGBA_5551; layInfo->type = LAYER_TYPE_GRAPHIC; } static void WriteDataToBuf(int32_t width, int32_t height, uint16_t *pBuf) { int32_t x; int32_t y; for (y = ((height / LINE_WIDTH) - LINE_WIDTH); y < ((height / LINE_WIDTH) + LINE_WIDTH); y++) { for (x = 0; x < width; x++) { *((uint16_t*)pBuf + y * width + x) = HIFB_RED_1555; } } for (y = 0; y < height; y++) { for (x = ((width / LINE_WIDTH) - LINE_WIDTH); x < ((width / LINE_WIDTH) + LINE_WIDTH); x++) { *((uint16_t*)pBuf + y * width + x) = HIFB_RED_1555; } } } int DisplayServiceSample(void) { int32_t ret; g_displayTest.devId = DEVID; /* 获取display驱动接口 */ ret = GetDisplayInterfaces(); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("get display interfaces ops failed"); return ret; } /* 初始化显示设备 */ if (g_displayTest.layerFuncs->InitDisplay != NULL) { ret = g_displayTest.layerFuncs->InitDisplay(g_displayTest.devId); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("initialize display failed"); return DISPLAY_FAILURE; } } /* 获取显示设备的信息 */ if (g_displayTest.layerFuncs->GetDisplayInfo != NULL) { ret = g_displayTest.layerFuncs->GetDisplayInfo(g_displayTest.devId, &g_displayTest.displayInfo); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("get disp info failed"); return DISPLAY_FAILURE; } } /* 打开显示设备的特定图层 */ if (g_displayTest.layerFuncs->OpenLayer != NULL) { LayerInfo layInfo; GetLayerInfo(&layInfo); ret = g_displayTest.layerFuncs->OpenLayer(g_displayTest.devId, &layInfo, &g_displayTest.layerId); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("open layer failed"); return DISPLAY_FAILURE; } } /* 获取图层buffer并填充buffer */ if (g_displayTest.layerFuncs->GetLayerBuffer != NULL) { ret = g_displayTest.layerFuncs->GetLayerBuffer(g_displayTest.devId, g_displayTest.layerId, &g_displayTest.buffer); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("get layer buffer failed"); return DISPLAY_FAILURE; } uint16_t *pBuf = (uint16_t *)g_displayTest.buffer.data.virAddr; WriteDataToBuf(g_displayTest.displayInfo.width, g_displayTest.displayInfo.height, pBuf); } /* 刷新图层数据进行显示 */ if (g_displayTest.layerFuncs->Flush != NULL) { ret = g_displayTest.layerFuncs->Flush(g_displayTest.devId, g_displayTest.layerId, &g_displayTest.buffer); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("flush layer failed"); return DISPLAY_FAILURE; } } /* 关闭显示设备的特定图层 */ if (g_displayTest.layerFuncs->CloseLayer != NULL) { ret = g_displayTest.layerFuncs->CloseLayer(g_displayTest.devId, g_displayTest.layerId); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("close layer failed"); return DISPLAY_FAILURE; } } /* 关闭显示设备 */ if (g_displayTest.layerFuncs->DeinitDisplay != NULL) { ret = g_displayTest.layerFuncs->DeinitDisplay(g_displayTest.devId); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("deinit display failed"); return DISPLAY_FAILURE; } } /* 注销显示驱动接口 */ ret = DisplayUninit(); if (ret != DISPLAY_SUCCESS) { HDF_LOGE("DisplayUninit fail"); return ret; } return 0; } ``` ## 相关仓 [驱动子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E9%A9%B1%E5%8A%A8%E5%AD%90%E7%B3%BB%E7%BB%9F.md) [drivers\_framework](https://gitee.com/openharmony/drivers_framework/blob/master/README_zh.md) [drivers\_adapter](https://gitee.com/openharmony/drivers_adapter/blob/master/README_zh.md) [drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_khdf_linux/blob/master/README_zh.md) [drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral)