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