1bafb9395Sopenharmony_ci/* 2bafb9395Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 3bafb9395Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4bafb9395Sopenharmony_ci * you may not use this file except in compliance with the License. 5bafb9395Sopenharmony_ci * You may obtain a copy of the License at 6bafb9395Sopenharmony_ci * 7bafb9395Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8bafb9395Sopenharmony_ci * 9bafb9395Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10bafb9395Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11bafb9395Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bafb9395Sopenharmony_ci * See the License for the specific language governing permissions and 13bafb9395Sopenharmony_ci * limitations under the License. 14bafb9395Sopenharmony_ci */ 15bafb9395Sopenharmony_ci 16bafb9395Sopenharmony_ci#include "hals/hi_fbdev.h" 17bafb9395Sopenharmony_ci 18bafb9395Sopenharmony_ci#include "display_layer.h" 19bafb9395Sopenharmony_ci#include "display_type.h" 20bafb9395Sopenharmony_ci#include "gfx_utils/color.h" 21bafb9395Sopenharmony_ci#include "gfx_utils/graphic_log.h" 22bafb9395Sopenharmony_ci#include "graphic_config.h" 23bafb9395Sopenharmony_ci 24bafb9395Sopenharmony_cinamespace OHOS { 25bafb9395Sopenharmony_cistruct DisplayDesc { 26bafb9395Sopenharmony_ci LayerFuncs* layerFuncs; 27bafb9395Sopenharmony_ci uint32_t devId; 28bafb9395Sopenharmony_ci uint32_t layerId; 29bafb9395Sopenharmony_ci LayerBuffer buffer; 30bafb9395Sopenharmony_ci LayerRotateType rotateType; 31bafb9395Sopenharmony_ci}; 32bafb9395Sopenharmony_ci 33bafb9395Sopenharmony_cistatic LayerInfo g_layerInfo = {}; 34bafb9395Sopenharmony_cistatic DisplayDesc g_display = {}; 35bafb9395Sopenharmony_ciconstexpr const uint8_t DISPALY_DEV_ID = 0; 36bafb9395Sopenharmony_ci#ifdef LAYER_PF_ARGB1555 37bafb9395Sopenharmony_ciconstexpr const uint8_t LAYER_BPP = 16; 38bafb9395Sopenharmony_ciconstexpr const PixelFormat HDI_LAYER_PIXEL_FORMAT = PIXEL_FMT_RGBA_5551; 39bafb9395Sopenharmony_ciconstexpr const ImagePixelFormat LAYER_PIXEL_FORMAT = IMAGE_PIXEL_FORMAT_ARGB1555; 40bafb9395Sopenharmony_ci#elif defined LAYER_PF_ARGB8888 41bafb9395Sopenharmony_ciconstexpr const uint8_t LAYER_BPP = 32; 42bafb9395Sopenharmony_ciconstexpr const PixelFormat HDI_LAYER_PIXEL_FORMAT = PIXEL_FMT_RGBA_8888; 43bafb9395Sopenharmony_ciconstexpr const ImagePixelFormat LAYER_PIXEL_FORMAT = IMAGE_PIXEL_FORMAT_ARGB8888; 44bafb9395Sopenharmony_ci#endif 45bafb9395Sopenharmony_ciconstexpr const uint8_t BITS_PER_BYTE = 8; 46bafb9395Sopenharmony_cistatic LiteSurfaceData g_devSurfaceData = {}; 47bafb9395Sopenharmony_ci 48bafb9395Sopenharmony_civoid LcdFlush() 49bafb9395Sopenharmony_ci{ 50bafb9395Sopenharmony_ci if (g_display.layerFuncs->Flush != nullptr) { 51bafb9395Sopenharmony_ci int32_t ret = 52bafb9395Sopenharmony_ci g_display.layerFuncs->Flush(g_display.devId, g_display.layerId, &g_display.buffer); 53bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 54bafb9395Sopenharmony_ci GRAPHIC_LOGE("flush fail"); 55bafb9395Sopenharmony_ci return; 56bafb9395Sopenharmony_ci } 57bafb9395Sopenharmony_ci } 58bafb9395Sopenharmony_ci} 59bafb9395Sopenharmony_ci 60bafb9395Sopenharmony_ciLayerRotateType GetLayerRotateType() 61bafb9395Sopenharmony_ci{ 62bafb9395Sopenharmony_ci return g_display.rotateType; 63bafb9395Sopenharmony_ci} 64bafb9395Sopenharmony_ci 65bafb9395Sopenharmony_ciLiteSurfaceData* GetDevSurfaceData() 66bafb9395Sopenharmony_ci{ 67bafb9395Sopenharmony_ci return &g_devSurfaceData; 68bafb9395Sopenharmony_ci} 69bafb9395Sopenharmony_ci 70bafb9395Sopenharmony_cistatic void DisplayInit(void) 71bafb9395Sopenharmony_ci{ 72bafb9395Sopenharmony_ci int32_t ret = LayerInitialize(&g_display.layerFuncs); 73bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS || g_display.layerFuncs == nullptr) { 74bafb9395Sopenharmony_ci GRAPHIC_LOGE("layer initialize failed"); 75bafb9395Sopenharmony_ci return; 76bafb9395Sopenharmony_ci } 77bafb9395Sopenharmony_ci if (g_display.layerFuncs->InitDisplay != nullptr) { 78bafb9395Sopenharmony_ci ret = g_display.layerFuncs->InitDisplay(DISPALY_DEV_ID); 79bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 80bafb9395Sopenharmony_ci GRAPHIC_LOGE("InitDisplay fail"); 81bafb9395Sopenharmony_ci return; 82bafb9395Sopenharmony_ci } 83bafb9395Sopenharmony_ci } 84bafb9395Sopenharmony_ci} 85bafb9395Sopenharmony_ci 86bafb9395Sopenharmony_cistatic void OpenLayer(void) 87bafb9395Sopenharmony_ci{ 88bafb9395Sopenharmony_ci if (g_display.layerFuncs->GetDisplayInfo == nullptr) { 89bafb9395Sopenharmony_ci return; 90bafb9395Sopenharmony_ci } 91bafb9395Sopenharmony_ci g_display.devId = DISPALY_DEV_ID; 92bafb9395Sopenharmony_ci DisplayInfo displayInfo = {}; 93bafb9395Sopenharmony_ci int32_t ret = g_display.layerFuncs->GetDisplayInfo(g_display.devId, &displayInfo); 94bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 95bafb9395Sopenharmony_ci GRAPHIC_LOGE("GetDisplayInfo fail"); 96bafb9395Sopenharmony_ci return; 97bafb9395Sopenharmony_ci } 98bafb9395Sopenharmony_ci g_display.rotateType = static_cast<LayerRotateType>(displayInfo.rotAngle); 99bafb9395Sopenharmony_ci g_layerInfo.width = displayInfo.width; 100bafb9395Sopenharmony_ci g_layerInfo.height = displayInfo.height; 101bafb9395Sopenharmony_ci g_layerInfo.bpp = LAYER_BPP; 102bafb9395Sopenharmony_ci g_layerInfo.pixFormat = HDI_LAYER_PIXEL_FORMAT; 103bafb9395Sopenharmony_ci g_layerInfo.type = LAYER_TYPE_GRAPHIC; 104bafb9395Sopenharmony_ci if (g_display.layerFuncs->CreateLayer != nullptr) { 105bafb9395Sopenharmony_ci ret = g_display.layerFuncs->CreateLayer(g_display.devId, &g_layerInfo, &g_display.layerId); 106bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 107bafb9395Sopenharmony_ci GRAPHIC_LOGE("CreateLayer fail"); 108bafb9395Sopenharmony_ci return; 109bafb9395Sopenharmony_ci } 110bafb9395Sopenharmony_ci } 111bafb9395Sopenharmony_ci} 112bafb9395Sopenharmony_ci 113bafb9395Sopenharmony_cistatic void SetLayerVisible(bool visibled) 114bafb9395Sopenharmony_ci{ 115bafb9395Sopenharmony_ci if (g_display.layerFuncs->SetLayerVisible != nullptr) { 116bafb9395Sopenharmony_ci int32_t ret = g_display.layerFuncs->SetLayerVisible(g_display.devId, g_display.layerId, visibled); 117bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 118bafb9395Sopenharmony_ci GRAPHIC_LOGE("setLayerVisible fail"); 119bafb9395Sopenharmony_ci return; 120bafb9395Sopenharmony_ci } 121bafb9395Sopenharmony_ci } 122bafb9395Sopenharmony_ci} 123bafb9395Sopenharmony_ci 124bafb9395Sopenharmony_cistatic void SetLayerDirtyRegion(void) 125bafb9395Sopenharmony_ci{ 126bafb9395Sopenharmony_ci IRect rect = {0, 0, g_layerInfo.width, g_layerInfo.height}; 127bafb9395Sopenharmony_ci if (g_display.layerFuncs->SetLayerDirtyRegion != nullptr) { 128bafb9395Sopenharmony_ci int32_t ret = g_display.layerFuncs->SetLayerDirtyRegion(g_display.devId, g_display.layerId, &rect); 129bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 130bafb9395Sopenharmony_ci GRAPHIC_LOGE("setLayerDirtyRegion fail"); 131bafb9395Sopenharmony_ci return; 132bafb9395Sopenharmony_ci } 133bafb9395Sopenharmony_ci } 134bafb9395Sopenharmony_ci} 135bafb9395Sopenharmony_ci 136bafb9395Sopenharmony_cistatic void AllocDisplayBuffer(void) 137bafb9395Sopenharmony_ci{ 138bafb9395Sopenharmony_ci if (g_display.layerFuncs->GetLayerBuffer != nullptr) { 139bafb9395Sopenharmony_ci int32_t ret = 140bafb9395Sopenharmony_ci g_display.layerFuncs->GetLayerBuffer(g_display.devId, g_display.layerId, &g_display.buffer); 141bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 142bafb9395Sopenharmony_ci GRAPHIC_LOGE("getLayerBuffer fail"); 143bafb9395Sopenharmony_ci return; 144bafb9395Sopenharmony_ci } 145bafb9395Sopenharmony_ci } 146bafb9395Sopenharmony_ci} 147bafb9395Sopenharmony_ci 148bafb9395Sopenharmony_civoid HiFbdevInit() 149bafb9395Sopenharmony_ci{ 150bafb9395Sopenharmony_ci DisplayInit(); 151bafb9395Sopenharmony_ci OpenLayer(); 152bafb9395Sopenharmony_ci SetLayerVisible(true); 153bafb9395Sopenharmony_ci SetLayerDirtyRegion(); 154bafb9395Sopenharmony_ci AllocDisplayBuffer(); 155bafb9395Sopenharmony_ci uintptr_t phyAddr = g_display.buffer.data.phyAddr; 156bafb9395Sopenharmony_ci g_devSurfaceData.phyAddr = reinterpret_cast<uint8_t*>(phyAddr); 157bafb9395Sopenharmony_ci g_devSurfaceData.pixelFormat = LAYER_PIXEL_FORMAT; 158bafb9395Sopenharmony_ci g_devSurfaceData.width = g_layerInfo.width; 159bafb9395Sopenharmony_ci g_devSurfaceData.height = g_layerInfo.height; 160bafb9395Sopenharmony_ci g_devSurfaceData.stride = g_display.buffer.pitch; 161bafb9395Sopenharmony_ci g_devSurfaceData.virAddr = static_cast<uint8_t*>(g_display.buffer.data.virAddr); 162bafb9395Sopenharmony_ci g_devSurfaceData.bytePerPixel = g_layerInfo.bpp / BITS_PER_BYTE; 163bafb9395Sopenharmony_ci} 164bafb9395Sopenharmony_ci 165bafb9395Sopenharmony_civoid HiFbdevClose() 166bafb9395Sopenharmony_ci{ 167bafb9395Sopenharmony_ci if (g_display.layerFuncs->CloseLayer == nullptr) { 168bafb9395Sopenharmony_ci return; 169bafb9395Sopenharmony_ci } 170bafb9395Sopenharmony_ci if (g_display.layerFuncs->DeinitDisplay == nullptr) { 171bafb9395Sopenharmony_ci return; 172bafb9395Sopenharmony_ci } 173bafb9395Sopenharmony_ci int32_t ret = g_display.layerFuncs->CloseLayer(g_display.devId, g_display.layerId); 174bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 175bafb9395Sopenharmony_ci GRAPHIC_LOGE("CloseLayer fail"); 176bafb9395Sopenharmony_ci return; 177bafb9395Sopenharmony_ci } 178bafb9395Sopenharmony_ci ret = g_display.layerFuncs->DeinitDisplay(g_display.devId); 179bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 180bafb9395Sopenharmony_ci GRAPHIC_LOGE("DeinitDisplay fail"); 181bafb9395Sopenharmony_ci return; 182bafb9395Sopenharmony_ci } 183bafb9395Sopenharmony_ci ret = LayerUninitialize(g_display.layerFuncs); 184bafb9395Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 185bafb9395Sopenharmony_ci GRAPHIC_LOGE("LayerUninitialize fail"); 186bafb9395Sopenharmony_ci } 187bafb9395Sopenharmony_ci} 188bafb9395Sopenharmony_ci} // namespace OHOS 189