该仓下主要包含Display模块HDI(Hardware Driver Interface)接口定义及其实现,对上层图形服务提供显示驱动能力接口,HDI接口主要包括如下三大类:
- DisplayLayer:负责显示图层的管理, 包括图层创建、显示属性设置、图层填充及刷新等操作;
- DisplayGralloc:负责显示模块内存的管理,包括内存的申请和释放、内存映射等操作;
- DisplayGfx:提供硬件加速接口,包括硬件加速模块的初始化、位图搬移、规则图形的画线及填充等操作。
该仓下源代码目录结构如下所示
/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接口列表
该仓核心功能是提供显示驱动能力接口供上层图形系统服务调用,提供的驱动能力接口统一归属为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;
}