2 Star 0 Fork 972

zhao_haipeng / drivers_peripheral

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README_zh.md 18.83 KB
一键复制 编辑 原始数据 按行查看 历史
NickYang 提交于 2022-03-09 14:44 . inner source review issues fix

Display

简介

该仓下主要包含Display模块HDI(Hardware Driver Interface)接口定义及其实现,对上层图形服务提供显示驱动能力接口,HDI接口主要包括如下三大类:

  • DisplayLayer:负责显示图层的管理, 包括图层创建、显示属性设置、图层填充及刷新等操作;
  • DisplayGralloc:负责显示模块内存的管理,包括内存的申请和释放、内存映射等操作;
  • DisplayGfx:提供硬件加速接口,包括硬件加速模块的初始化、位图搬移、规则图形的画线及填充等操作。

图 1 DISPLAY模块HDI接口层框架图

目录

该仓下源代码目录结构如下所示

/drivers/peripheral/display
├── hal                # display模块的hal层代码
│   └── default       # display模块hdi的默认实现
├── interfaces         # display模块对上层服务提供的驱动能力接口
│   └── include       # display模块对外提供的接口定义
├── test               # display模块的测试代码
│   └── unittest      # display模块的单元测试代码

接口说明

Display驱动提供给系统服务WMS可直接调用的驱动能力接口,按照功能分类三大类:显示图层子模块、显示内存子模块、硬件加速子模块,可以提供图层的创建和销毁、图层属性的设置,内存的申请和释放、映射和缓冲,矩形填充和位图搬移等能力。

提供的部分接口说明如表1 Display HDI接口列表所示:

表 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;
}

相关仓

驱动子系统

drivers_framework

drivers_adapter

drivers_adapter_khdf_linux

drivers_peripheral

1
https://gitee.com/zhao_haipeng/drivers_peripheral.git
git@gitee.com:zhao_haipeng/drivers_peripheral.git
zhao_haipeng
drivers_peripheral
drivers_peripheral
master

搜索帮助