1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "display_layer.h" 17094332d3Sopenharmony_ci#include <cerrno> 18094332d3Sopenharmony_ci#include <pthread.h> 19094332d3Sopenharmony_ci#include <stdio.h> 20094332d3Sopenharmony_ci#include <unistd.h> 21094332d3Sopenharmony_ci#include <sys/mman.h> 22094332d3Sopenharmony_ci#include <securec.h> 23094332d3Sopenharmony_ci#include "display_type.h" 24094332d3Sopenharmony_ci#include "hdf_log.h" 25094332d3Sopenharmony_ci#include "hdf_io_service_if.h" 26094332d3Sopenharmony_ci#include "hdf_sbuf.h" 27094332d3Sopenharmony_ci#include "osal_mem.h" 28094332d3Sopenharmony_ci 29094332d3Sopenharmony_ci#define DEV_ID 0 30094332d3Sopenharmony_ci#define LAYER_ID 0 31094332d3Sopenharmony_ci#define FB_PATH "/dev/fb0" 32094332d3Sopenharmony_ci#define DISP_WIDTH 800 33094332d3Sopenharmony_ci#define DISP_HEIGHT 480 34094332d3Sopenharmony_ci#define BITS_PER_PIXEL 32 35094332d3Sopenharmony_ci#define BITS_TO_BYTE 8 36094332d3Sopenharmony_ci#define DISP_SERVICE_NAME "hdf_disp" 37094332d3Sopenharmony_ci#define DISP_CMD_GET_PANELINFO 1 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_ci#undef HDF_LOG_TAG 40094332d3Sopenharmony_ci#define HDF_LOG_TAG display_layer_c 41094332d3Sopenharmony_ci 42094332d3Sopenharmony_ci/* output timing */ 43094332d3Sopenharmony_cienum IntfSync { 44094332d3Sopenharmony_ci OUTPUT_USER = 0, /* User timing */ 45094332d3Sopenharmony_ci OUTPUT_PAL, /* PAL standard */ 46094332d3Sopenharmony_ci OUTPUT_NTSC, /* NTSC standard */ 47094332d3Sopenharmony_ci OUTPUT_1080P24, /* 1920 x 1080 at 24 Hz. */ 48094332d3Sopenharmony_ci OUTPUT_1080P25, /* 1920 x 1080 at 25 Hz. */ 49094332d3Sopenharmony_ci OUTPUT_1080P30, /* 1920 x 1080 at 30 Hz. */ 50094332d3Sopenharmony_ci OUTPUT_720P50, /* 1280 x 720 at 50 Hz. */ 51094332d3Sopenharmony_ci OUTPUT_720P60, /* 1280 x 720 at 60 Hz. */ 52094332d3Sopenharmony_ci OUTPUT_1080I50, /* 1920 x 1080 at 50 Hz, interlace. */ 53094332d3Sopenharmony_ci OUTPUT_1080I60, /* 1920 x 1080 at 60 Hz, interlace. */ 54094332d3Sopenharmony_ci OUTPUT_1080P50, /* 1920 x 1080 at 50 Hz. */ 55094332d3Sopenharmony_ci OUTPUT_1080P60, /* 1920 x 1080 at 60 Hz. */ 56094332d3Sopenharmony_ci OUTPUT_576P50, /* 720 x 576 at 50 Hz. */ 57094332d3Sopenharmony_ci OUTPUT_480P60, /* 720 x 480 at 60 Hz. */ 58094332d3Sopenharmony_ci OUTPUT_800X600_60, /* VESA 800 x 600 at 60 Hz (non-interlaced) */ 59094332d3Sopenharmony_ci OUTPUT_1024X768_60, /* VESA 1024 x 768 at 60 Hz (non-interlaced) */ 60094332d3Sopenharmony_ci OUTPUT_1280X1024_60, /* VESA 1280 x 1024 at 60 Hz (non-interlaced) */ 61094332d3Sopenharmony_ci OUTPUT_1366X768_60, /* VESA 1366 x 768 at 60 Hz (non-interlaced) */ 62094332d3Sopenharmony_ci OUTPUT_1440X900_60, /* VESA 1440 x 900 at 60 Hz (non-interlaced) CVT Compliant */ 63094332d3Sopenharmony_ci OUTPUT_1280X800_60, /* 1280*800@60Hz VGA@60Hz */ 64094332d3Sopenharmony_ci OUTPUT_1600X1200_60, /* VESA 1600 x 1200 at 60 Hz (non-interlaced) */ 65094332d3Sopenharmony_ci OUTPUT_1680X1050_60, /* VESA 1680 x 1050 at 60 Hz (non-interlaced) */ 66094332d3Sopenharmony_ci OUTPUT_1920X1200_60, /* VESA 1920 x 1600 at 60 Hz (non-interlaced) CVT (Reduced Blanking) */ 67094332d3Sopenharmony_ci OUTPUT_640X480_60, /* VESA 640 x 480 at 60 Hz (non-interlaced) CVT */ 68094332d3Sopenharmony_ci OUTPUT_960H_PAL, /* ITU-R BT.1302 960 x 576 at 50 Hz (interlaced) */ 69094332d3Sopenharmony_ci OUTPUT_960H_NTSC, /* ITU-R BT.1302 960 x 480 at 60 Hz (interlaced) */ 70094332d3Sopenharmony_ci OUTPUT_1920X2160_30, /* 1920x2160_30 */ 71094332d3Sopenharmony_ci OUTPUT_2560X1440_30, /* 2560x1440_30 */ 72094332d3Sopenharmony_ci OUTPUT_2560X1440_60, /* 2560x1440_60 */ 73094332d3Sopenharmony_ci OUTPUT_2560X1600_60, /* 2560x1600_60 */ 74094332d3Sopenharmony_ci OUTPUT_3840X2160_24, /* 3840x2160_24 */ 75094332d3Sopenharmony_ci OUTPUT_3840X2160_25, /* 3840x2160_25 */ 76094332d3Sopenharmony_ci OUTPUT_3840X2160_30, /* 3840x2160_30 */ 77094332d3Sopenharmony_ci OUTPUT_3840X2160_50, /* 3840x2160_50 */ 78094332d3Sopenharmony_ci OUTPUT_3840X2160_60, /* 3840x2160_60 */ 79094332d3Sopenharmony_ci OUTPUT_4096X2160_24, /* 4096x2160_24 */ 80094332d3Sopenharmony_ci OUTPUT_4096X2160_25, /* 4096x2160_25 */ 81094332d3Sopenharmony_ci OUTPUT_4096X2160_30, /* 4096x2160_30 */ 82094332d3Sopenharmony_ci OUTPUT_4096X2160_50, /* 4096x2160_50 */ 83094332d3Sopenharmony_ci OUTPUT_4096X2160_60, /* 4096x2160_60 */ 84094332d3Sopenharmony_ci OUTPUT_320X240_60, /* For ota5182 at 60 Hz (8bit) */ 85094332d3Sopenharmony_ci OUTPUT_320X240_50, /* For ili9342 at 50 Hz (6bit) */ 86094332d3Sopenharmony_ci OUTPUT_240X320_50, /* Hi3559AV100: For ili9341 at 50 Hz (6bit) */ 87094332d3Sopenharmony_ci OUTPUT_240X320_60, /* For ili9341 at 60 Hz (16bit) */ 88094332d3Sopenharmony_ci OUTPUT_800X600_50, /* For LCD at 50 Hz (24bit) */ 89094332d3Sopenharmony_ci OUTPUT_720X1280_60, /* For MIPI DSI Tx 720 x1280 at 60 Hz */ 90094332d3Sopenharmony_ci OUTPUT_1080X1920_60, /* For MIPI DSI Tx 1080x1920 at 60 Hz */ 91094332d3Sopenharmony_ci OUTPUT_7680X4320_30, /* For HDMI2.1 at 30 Hz */ 92094332d3Sopenharmony_ci}; 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_cistruct DispInfo { 95094332d3Sopenharmony_ci uint32_t width; 96094332d3Sopenharmony_ci uint32_t hbp; 97094332d3Sopenharmony_ci uint32_t hfp; 98094332d3Sopenharmony_ci uint32_t hsw; 99094332d3Sopenharmony_ci uint32_t height; 100094332d3Sopenharmony_ci uint32_t vbp; 101094332d3Sopenharmony_ci uint32_t vfp; 102094332d3Sopenharmony_ci uint32_t vsw; 103094332d3Sopenharmony_ci uint32_t frameRate; 104094332d3Sopenharmony_ci uint32_t intfType; 105094332d3Sopenharmony_ci enum IntfSync intfSync; 106094332d3Sopenharmony_ci uint32_t minLevel; 107094332d3Sopenharmony_ci uint32_t maxLevel; 108094332d3Sopenharmony_ci uint32_t defLevel; 109094332d3Sopenharmony_ci}; 110094332d3Sopenharmony_ci 111094332d3Sopenharmony_cistruct LayerPrivate { 112094332d3Sopenharmony_ci int32_t fd; 113094332d3Sopenharmony_ci uint32_t width; 114094332d3Sopenharmony_ci uint32_t height; 115094332d3Sopenharmony_ci int32_t pitch; 116094332d3Sopenharmony_ci void *fbAddr; 117094332d3Sopenharmony_ci uint32_t fbSize; 118094332d3Sopenharmony_ci void *layerAddr; 119094332d3Sopenharmony_ci PixelFormat pixFmt; 120094332d3Sopenharmony_ci}; 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_cistruct LayerManager { 123094332d3Sopenharmony_ci pthread_mutex_t mutex; 124094332d3Sopenharmony_ci pthread_mutexattr_t mutexattr; 125094332d3Sopenharmony_ci int32_t count; 126094332d3Sopenharmony_ci}; 127094332d3Sopenharmony_ci 128094332d3Sopenharmony_cistatic struct LayerManager g_layerManager; 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_cistatic void GetLayerMgr(void) 131094332d3Sopenharmony_ci{ 132094332d3Sopenharmony_ci g_layerManager.count++; 133094332d3Sopenharmony_ci} 134094332d3Sopenharmony_ci 135094332d3Sopenharmony_cistatic int32_t PutLayerMgr(void) 136094332d3Sopenharmony_ci{ 137094332d3Sopenharmony_ci g_layerManager.count--; 138094332d3Sopenharmony_ci return g_layerManager.count; 139094332d3Sopenharmony_ci} 140094332d3Sopenharmony_ci 141094332d3Sopenharmony_cistatic void LockLayerMgr(void) 142094332d3Sopenharmony_ci{ 143094332d3Sopenharmony_ci pthread_mutex_lock(&g_layerManager.mutex); 144094332d3Sopenharmony_ci} 145094332d3Sopenharmony_ci 146094332d3Sopenharmony_cistatic void UnlockLayerMgr(void) 147094332d3Sopenharmony_ci{ 148094332d3Sopenharmony_ci pthread_mutex_unlock(&g_layerManager.mutex); 149094332d3Sopenharmony_ci} 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_cistatic int32_t DispCmdSend(const uint32_t cmd, struct HdfSBuf *reqData, struct HdfSBuf *respData) 152094332d3Sopenharmony_ci{ 153094332d3Sopenharmony_ci struct HdfIoService *dispService = NULL; 154094332d3Sopenharmony_ci 155094332d3Sopenharmony_ci dispService = HdfIoServiceBind(DISP_SERVICE_NAME); 156094332d3Sopenharmony_ci if ((dispService == NULL) || (dispService->dispatcher == NULL) || (dispService->dispatcher->Dispatch == NULL)) { 157094332d3Sopenharmony_ci HDF_LOGE("%s:bad remote service found", __func__); 158094332d3Sopenharmony_ci return DISPLAY_FAILURE; 159094332d3Sopenharmony_ci } 160094332d3Sopenharmony_ci int32_t ret = dispService->dispatcher->Dispatch(&dispService->object, cmd, reqData, respData); 161094332d3Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 162094332d3Sopenharmony_ci HDF_LOGE("%s: cmd=%u, ret=%d", __func__, cmd, ret); 163094332d3Sopenharmony_ci HdfIoServiceRecycle(dispService); 164094332d3Sopenharmony_ci return DISPLAY_FAILURE; 165094332d3Sopenharmony_ci } 166094332d3Sopenharmony_ci HdfIoServiceRecycle(dispService); 167094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 168094332d3Sopenharmony_ci} 169094332d3Sopenharmony_ci 170094332d3Sopenharmony_cistatic int32_t GetInfo(uint32_t devId, struct DispInfo *info) 171094332d3Sopenharmony_ci{ 172094332d3Sopenharmony_ci struct DispInfo *tmpInfo = NULL; 173094332d3Sopenharmony_ci struct HdfSBuf *data = NULL; 174094332d3Sopenharmony_ci struct HdfSBuf *reply = NULL; 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_ci if (info == NULL) { 177094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 178094332d3Sopenharmony_ci return DISPLAY_FAILURE; 179094332d3Sopenharmony_ci } 180094332d3Sopenharmony_ci data = HdfSbufObtainDefaultSize(); 181094332d3Sopenharmony_ci if (data == NULL) { 182094332d3Sopenharmony_ci HDF_LOGE("%s: obtain data sbuf fail", __func__); 183094332d3Sopenharmony_ci return DISPLAY_FAILURE; 184094332d3Sopenharmony_ci } 185094332d3Sopenharmony_ci reply = HdfSbufObtainDefaultSize(); 186094332d3Sopenharmony_ci if (reply == NULL) { 187094332d3Sopenharmony_ci HDF_LOGE("%s: obtain reply sbuf fail", __func__); 188094332d3Sopenharmony_ci HdfSbufRecycle(data); 189094332d3Sopenharmony_ci return DISPLAY_FAILURE; 190094332d3Sopenharmony_ci } 191094332d3Sopenharmony_ci if (!HdfSbufWriteUint32(data, devId)) { 192094332d3Sopenharmony_ci HDF_LOGE("HdfSbufWriteUint32 failure"); 193094332d3Sopenharmony_ci goto ERR; 194094332d3Sopenharmony_ci } 195094332d3Sopenharmony_ci if (DispCmdSend(DISP_CMD_GET_PANELINFO, data, reply) != DISPLAY_SUCCESS) { 196094332d3Sopenharmony_ci HDF_LOGE("cmd:DISP_CMD_GET_PANEL_INFO failure"); 197094332d3Sopenharmony_ci goto ERR; 198094332d3Sopenharmony_ci } 199094332d3Sopenharmony_ci uint32_t dataSize = 0; 200094332d3Sopenharmony_ci if (!HdfSbufReadBuffer(reply, (const void **)(&tmpInfo), &dataSize) || dataSize != sizeof(struct DispInfo)) { 201094332d3Sopenharmony_ci HDF_LOGE("HdfSbufReadBuffer failure"); 202094332d3Sopenharmony_ci goto ERR; 203094332d3Sopenharmony_ci } 204094332d3Sopenharmony_ci if (memcpy_s(info, sizeof(struct DispInfo), tmpInfo, dataSize) != EOK) { 205094332d3Sopenharmony_ci HDF_LOGE("memcpy_s failure"); 206094332d3Sopenharmony_ci goto ERR; 207094332d3Sopenharmony_ci } 208094332d3Sopenharmony_ci HdfSbufRecycle(data); 209094332d3Sopenharmony_ci HdfSbufRecycle(reply); 210094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 211094332d3Sopenharmony_ci 212094332d3Sopenharmony_ciERR: 213094332d3Sopenharmony_ci HdfSbufRecycle(data); 214094332d3Sopenharmony_ci HdfSbufRecycle(reply); 215094332d3Sopenharmony_ci return DISPLAY_FAILURE; 216094332d3Sopenharmony_ci} 217094332d3Sopenharmony_ci 218094332d3Sopenharmony_cistatic struct LayerPrivate *GetLayerInstance(void) 219094332d3Sopenharmony_ci{ 220094332d3Sopenharmony_ci static int32_t count; 221094332d3Sopenharmony_ci static struct DispInfo info; 222094332d3Sopenharmony_ci static struct LayerPrivate layerPriv = { 223094332d3Sopenharmony_ci .fd = -1, 224094332d3Sopenharmony_ci .width = DISP_WIDTH, 225094332d3Sopenharmony_ci .height = DISP_HEIGHT, 226094332d3Sopenharmony_ci .pixFmt = PIXEL_FMT_RGBA_8888, 227094332d3Sopenharmony_ci }; 228094332d3Sopenharmony_ci 229094332d3Sopenharmony_ci if (count == 0) { 230094332d3Sopenharmony_ci count = 1; 231094332d3Sopenharmony_ci if (GetInfo(DEV_ID, &info) == DISPLAY_SUCCESS) { 232094332d3Sopenharmony_ci layerPriv.width = info.width; 233094332d3Sopenharmony_ci layerPriv.height = info.height; 234094332d3Sopenharmony_ci } else { 235094332d3Sopenharmony_ci HDF_LOGI("%s: GetInfo failed, use default setting", __func__); 236094332d3Sopenharmony_ci } 237094332d3Sopenharmony_ci } 238094332d3Sopenharmony_ci return &layerPriv; 239094332d3Sopenharmony_ci} 240094332d3Sopenharmony_ci 241094332d3Sopenharmony_cistatic int32_t InitDisplay(uint32_t devId) 242094332d3Sopenharmony_ci{ 243094332d3Sopenharmony_ci if (devId != DEV_ID) { 244094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 245094332d3Sopenharmony_ci return DISPLAY_FAILURE; 246094332d3Sopenharmony_ci } 247094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 248094332d3Sopenharmony_ci} 249094332d3Sopenharmony_ci 250094332d3Sopenharmony_cistatic int32_t DeinitDisplay(uint32_t devId) 251094332d3Sopenharmony_ci{ 252094332d3Sopenharmony_ci if (devId != DEV_ID) { 253094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 254094332d3Sopenharmony_ci return DISPLAY_FAILURE; 255094332d3Sopenharmony_ci } 256094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 257094332d3Sopenharmony_ci} 258094332d3Sopenharmony_ci 259094332d3Sopenharmony_cistatic void SetBackground(void) 260094332d3Sopenharmony_ci{ 261094332d3Sopenharmony_ci struct LayerPrivate *priv = GetLayerInstance(); 262094332d3Sopenharmony_ci uint32_t i; 263094332d3Sopenharmony_ci uint32_t j; 264094332d3Sopenharmony_ci uint32_t *framebuffer = (uint32_t *)priv->fbAddr; 265094332d3Sopenharmony_ci for (j = 0; j < priv->height; j++) { 266094332d3Sopenharmony_ci for (i = 0; i < priv->width; i++) { 267094332d3Sopenharmony_ci framebuffer[i + j * priv->width] = 0xFF; // Blue background 268094332d3Sopenharmony_ci } 269094332d3Sopenharmony_ci } 270094332d3Sopenharmony_ci} 271094332d3Sopenharmony_ci 272094332d3Sopenharmony_cistatic int32_t CreateLayer(uint32_t devId, const LayerInfo *layerInfo, uint32_t *layerId) 273094332d3Sopenharmony_ci{ 274094332d3Sopenharmony_ci if (layerInfo == NULL || layerId == NULL) { 275094332d3Sopenharmony_ci HDF_LOGE("%s: pointer is null", __func__); 276094332d3Sopenharmony_ci return DISPLAY_NULL_PTR; 277094332d3Sopenharmony_ci } 278094332d3Sopenharmony_ci if (devId != DEV_ID) { 279094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 280094332d3Sopenharmony_ci return DISPLAY_FAILURE; 281094332d3Sopenharmony_ci } 282094332d3Sopenharmony_ci LockLayerMgr(); 283094332d3Sopenharmony_ci struct LayerPrivate *priv = GetLayerInstance(); 284094332d3Sopenharmony_ci priv->fd = open(FB_PATH, O_RDWR, 0); 285094332d3Sopenharmony_ci if (priv->fd < 0) { 286094332d3Sopenharmony_ci HDF_LOGE("%s: open fb dev failed", __func__); 287094332d3Sopenharmony_ci UnlockLayerMgr(); 288094332d3Sopenharmony_ci return DISPLAY_FD_ERR; 289094332d3Sopenharmony_ci } 290094332d3Sopenharmony_ci priv->pitch = layerInfo->width * BITS_PER_PIXEL / BITS_TO_BYTE; 291094332d3Sopenharmony_ci priv->fbSize = ((priv->pitch * priv->height) + 0xfff) & (~0xfff); 292094332d3Sopenharmony_ci priv->fbAddr = (void *)mmap(NULL, priv->fbSize, PROT_READ | PROT_WRITE, MAP_SHARED, priv->fd, 0); 293094332d3Sopenharmony_ci if (priv->fbAddr == NULL) { 294094332d3Sopenharmony_ci HDF_LOGE("%s: mmap fb address failure, errno: %d", __func__, errno); 295094332d3Sopenharmony_ci close(priv->fd); 296094332d3Sopenharmony_ci priv->fd = -1; 297094332d3Sopenharmony_ci priv->pitch = 0; 298094332d3Sopenharmony_ci priv->fbSize = 0; 299094332d3Sopenharmony_ci UnlockLayerMgr(); 300094332d3Sopenharmony_ci return DISPLAY_FAILURE; 301094332d3Sopenharmony_ci } 302094332d3Sopenharmony_ci SetBackground(); 303094332d3Sopenharmony_ci *layerId = LAYER_ID; 304094332d3Sopenharmony_ci HDF_LOGI("%s: open layer success", __func__); 305094332d3Sopenharmony_ci UnlockLayerMgr(); 306094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 307094332d3Sopenharmony_ci} 308094332d3Sopenharmony_ci 309094332d3Sopenharmony_cistatic int32_t CloseLayer(uint32_t devId, uint32_t layerId) 310094332d3Sopenharmony_ci{ 311094332d3Sopenharmony_ci if (devId != DEV_ID) { 312094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 313094332d3Sopenharmony_ci return DISPLAY_FAILURE; 314094332d3Sopenharmony_ci } 315094332d3Sopenharmony_ci if (layerId != LAYER_ID) { 316094332d3Sopenharmony_ci HDF_LOGE("%s: layerId invalid", __func__); 317094332d3Sopenharmony_ci return DISPLAY_FAILURE; 318094332d3Sopenharmony_ci } 319094332d3Sopenharmony_ci LockLayerMgr(); 320094332d3Sopenharmony_ci struct LayerPrivate *priv = GetLayerInstance(); 321094332d3Sopenharmony_ci if (priv->fd >= 0) { 322094332d3Sopenharmony_ci close(priv->fd); 323094332d3Sopenharmony_ci } 324094332d3Sopenharmony_ci if (priv->layerAddr != NULL) { 325094332d3Sopenharmony_ci free(priv->layerAddr); 326094332d3Sopenharmony_ci priv->layerAddr = NULL; 327094332d3Sopenharmony_ci } 328094332d3Sopenharmony_ci if (priv->fbAddr != NULL) { 329094332d3Sopenharmony_ci munmap(priv->fbAddr, priv->fbSize); 330094332d3Sopenharmony_ci } 331094332d3Sopenharmony_ci priv->fd = -1; 332094332d3Sopenharmony_ci UnlockLayerMgr(); 333094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 334094332d3Sopenharmony_ci} 335094332d3Sopenharmony_ci 336094332d3Sopenharmony_cistatic int32_t GetDisplayInfo(uint32_t devId, DisplayInfo *dispInfo) 337094332d3Sopenharmony_ci{ 338094332d3Sopenharmony_ci if (dispInfo == NULL) { 339094332d3Sopenharmony_ci HDF_LOGE("%s: dispInfo is null", __func__); 340094332d3Sopenharmony_ci return DISPLAY_NULL_PTR; 341094332d3Sopenharmony_ci } 342094332d3Sopenharmony_ci if (devId != DEV_ID) { 343094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 344094332d3Sopenharmony_ci return DISPLAY_FAILURE; 345094332d3Sopenharmony_ci } 346094332d3Sopenharmony_ci LockLayerMgr(); 347094332d3Sopenharmony_ci struct LayerPrivate *priv = GetLayerInstance(); 348094332d3Sopenharmony_ci dispInfo->width = priv->width; 349094332d3Sopenharmony_ci dispInfo->height = priv->height; 350094332d3Sopenharmony_ci dispInfo->rotAngle = ROTATE_NONE; 351094332d3Sopenharmony_ci HDF_LOGD("%s: width = %u, height = %u, rotAngle = %u", __func__, dispInfo->width, 352094332d3Sopenharmony_ci dispInfo->height, dispInfo->rotAngle); 353094332d3Sopenharmony_ci UnlockLayerMgr(); 354094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 355094332d3Sopenharmony_ci} 356094332d3Sopenharmony_ci 357094332d3Sopenharmony_cistatic int32_t Flush(uint32_t devId, uint32_t layerId, LayerBuffer *buffer) 358094332d3Sopenharmony_ci{ 359094332d3Sopenharmony_ci int32_t ret; 360094332d3Sopenharmony_ci 361094332d3Sopenharmony_ci if (devId != DEV_ID) { 362094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 363094332d3Sopenharmony_ci return DISPLAY_FAILURE; 364094332d3Sopenharmony_ci } 365094332d3Sopenharmony_ci if (layerId != LAYER_ID) { 366094332d3Sopenharmony_ci HDF_LOGE("%s: layerId invalid", __func__); 367094332d3Sopenharmony_ci return DISPLAY_FAILURE; 368094332d3Sopenharmony_ci } 369094332d3Sopenharmony_ci if (buffer == NULL) { 370094332d3Sopenharmony_ci HDF_LOGE("%s: buffer is null", __func__); 371094332d3Sopenharmony_ci return DISPLAY_FAILURE; 372094332d3Sopenharmony_ci } 373094332d3Sopenharmony_ci 374094332d3Sopenharmony_ci HDF_LOGD("%s: width = %d, height = %d, pixFormat = %d, pitch = %d", __func__, buffer->width, 375094332d3Sopenharmony_ci buffer->height, buffer->pixFormat, buffer->pitch); 376094332d3Sopenharmony_ci LockLayerMgr(); 377094332d3Sopenharmony_ci struct LayerPrivate *priv = GetLayerInstance(); 378094332d3Sopenharmony_ci ret = memcpy_s(priv->fbAddr, priv->fbSize, buffer->data.virAddr, priv->fbSize); 379094332d3Sopenharmony_ci if (ret != EOK) { 380094332d3Sopenharmony_ci HDF_LOGE("%s: memcpy_s fail, ret %d", __func__, ret); 381094332d3Sopenharmony_ci UnlockLayerMgr(); 382094332d3Sopenharmony_ci return ret; 383094332d3Sopenharmony_ci } 384094332d3Sopenharmony_ci UnlockLayerMgr(); 385094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 386094332d3Sopenharmony_ci} 387094332d3Sopenharmony_ci 388094332d3Sopenharmony_cistatic int32_t GetLayerBuffer(uint32_t devId, uint32_t layerId, LayerBuffer *buffer) 389094332d3Sopenharmony_ci{ 390094332d3Sopenharmony_ci if (buffer == NULL) { 391094332d3Sopenharmony_ci HDF_LOGE("%s: buffer is null", __func__); 392094332d3Sopenharmony_ci return DISPLAY_NULL_PTR; 393094332d3Sopenharmony_ci } 394094332d3Sopenharmony_ci if (devId != DEV_ID) { 395094332d3Sopenharmony_ci HDF_LOGE("%s: devId invalid", __func__); 396094332d3Sopenharmony_ci return DISPLAY_FAILURE; 397094332d3Sopenharmony_ci } 398094332d3Sopenharmony_ci if (layerId != LAYER_ID) { 399094332d3Sopenharmony_ci HDF_LOGE("%s: layerId invalid", __func__); 400094332d3Sopenharmony_ci return DISPLAY_FAILURE; 401094332d3Sopenharmony_ci } 402094332d3Sopenharmony_ci LockLayerMgr(); 403094332d3Sopenharmony_ci struct LayerPrivate *priv = GetLayerInstance(); 404094332d3Sopenharmony_ci if (priv->fd < 0) { 405094332d3Sopenharmony_ci HDF_LOGE("%s: fd invalid", __func__); 406094332d3Sopenharmony_ci UnlockLayerMgr(); 407094332d3Sopenharmony_ci return DISPLAY_FAILURE; 408094332d3Sopenharmony_ci } 409094332d3Sopenharmony_ci buffer->fenceId = 0; 410094332d3Sopenharmony_ci buffer->width = priv->width; 411094332d3Sopenharmony_ci buffer->height = priv->height; 412094332d3Sopenharmony_ci buffer->pixFormat = priv->pixFmt; 413094332d3Sopenharmony_ci buffer->pitch = priv->pitch; 414094332d3Sopenharmony_ci buffer->data.virAddr = malloc(priv->fbSize); 415094332d3Sopenharmony_ci if (buffer->data.virAddr == NULL) { 416094332d3Sopenharmony_ci HDF_LOGE("%s: malloc failure", __func__); 417094332d3Sopenharmony_ci UnlockLayerMgr(); 418094332d3Sopenharmony_ci return DISPLAY_FAILURE; 419094332d3Sopenharmony_ci } 420094332d3Sopenharmony_ci priv->layerAddr = buffer->data.virAddr; 421094332d3Sopenharmony_ci (void)memset_s(buffer->data.virAddr, priv->fbSize, 0x00, priv->fbSize); 422094332d3Sopenharmony_ci HDF_LOGD("%s: fenceId = %d, width = %d, height = %d, pixFormat = %d, pitch = %d", __func__, buffer->fenceId, 423094332d3Sopenharmony_ci buffer->width, buffer->height, buffer->pixFormat, buffer->pitch); 424094332d3Sopenharmony_ci UnlockLayerMgr(); 425094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 426094332d3Sopenharmony_ci} 427094332d3Sopenharmony_ci 428094332d3Sopenharmony_ciint32_t LayerInitialize(LayerFuncs **funcs) 429094332d3Sopenharmony_ci{ 430094332d3Sopenharmony_ci static LayerFuncs *lFuncs = NULL; 431094332d3Sopenharmony_ci 432094332d3Sopenharmony_ci if (funcs == NULL) { 433094332d3Sopenharmony_ci HDF_LOGE("%s: funcs is null", __func__); 434094332d3Sopenharmony_ci return DISPLAY_NULL_PTR; 435094332d3Sopenharmony_ci } 436094332d3Sopenharmony_ci if (lFuncs == NULL) { 437094332d3Sopenharmony_ci lFuncs = (LayerFuncs *)OsalMemCalloc(sizeof(LayerFuncs)); 438094332d3Sopenharmony_ci if (lFuncs == NULL) { 439094332d3Sopenharmony_ci HDF_LOGE("%s: lFuncs is null", __func__); 440094332d3Sopenharmony_ci return DISPLAY_NULL_PTR; 441094332d3Sopenharmony_ci } 442094332d3Sopenharmony_ci pthread_mutexattr_init(&g_layerManager.mutexattr); 443094332d3Sopenharmony_ci pthread_mutexattr_setpshared(&g_layerManager.mutexattr, PTHREAD_PROCESS_SHARED); 444094332d3Sopenharmony_ci pthread_mutex_init(&g_layerManager.mutex, &g_layerManager.mutexattr); 445094332d3Sopenharmony_ci lFuncs->InitDisplay = InitDisplay; 446094332d3Sopenharmony_ci lFuncs->DeinitDisplay = DeinitDisplay; 447094332d3Sopenharmony_ci lFuncs->GetDisplayInfo = GetDisplayInfo; 448094332d3Sopenharmony_ci lFuncs->CreateLayer = CreateLayer; 449094332d3Sopenharmony_ci lFuncs->CloseLayer = CloseLayer; 450094332d3Sopenharmony_ci lFuncs->Flush = Flush; 451094332d3Sopenharmony_ci lFuncs->GetLayerBuffer = GetLayerBuffer; 452094332d3Sopenharmony_ci } 453094332d3Sopenharmony_ci *funcs = lFuncs; 454094332d3Sopenharmony_ci GetLayerMgr(); 455094332d3Sopenharmony_ci HDF_LOGI("%s: success", __func__); 456094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 457094332d3Sopenharmony_ci} 458094332d3Sopenharmony_ci 459094332d3Sopenharmony_ciint32_t LayerUninitialize(LayerFuncs *funcs) 460094332d3Sopenharmony_ci{ 461094332d3Sopenharmony_ci if (funcs == NULL) { 462094332d3Sopenharmony_ci HDF_LOGE("%s: funcs is null", __func__); 463094332d3Sopenharmony_ci return DISPLAY_NULL_PTR; 464094332d3Sopenharmony_ci } 465094332d3Sopenharmony_ci if (PutLayerMgr() == 0) { 466094332d3Sopenharmony_ci pthread_mutexattr_destroy(&g_layerManager.mutexattr); 467094332d3Sopenharmony_ci pthread_mutex_destroy(&g_layerManager.mutex); 468094332d3Sopenharmony_ci OsalMemFree(funcs); 469094332d3Sopenharmony_ci } 470094332d3Sopenharmony_ci HDF_LOGI("%s: layer uninitialize success", __func__); 471094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 472094332d3Sopenharmony_ci} 473