1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 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#include "display_adapter.h" 16094332d3Sopenharmony_ci#include <cstdarg> 17094332d3Sopenharmony_ci#include <fcntl.h> 18094332d3Sopenharmony_ci#include <sys/types.h> 19094332d3Sopenharmony_ci#include <unistd.h> 20094332d3Sopenharmony_cinamespace OHOS { 21094332d3Sopenharmony_cinamespace HDI { 22094332d3Sopenharmony_cinamespace DISPLAY { 23094332d3Sopenharmony_cistd::unique_ptr<DisplayAdapter> &DisplayAdapter::GetInstance() 24094332d3Sopenharmony_ci{ 25094332d3Sopenharmony_ci static std::unique_ptr<DisplayAdapter> instance = nullptr; 26094332d3Sopenharmony_ci static std::once_flag once; 27094332d3Sopenharmony_ci std::call_once(once, [&]() { 28094332d3Sopenharmony_ci auto adapter = std::make_unique<DisplayAdapter>(); 29094332d3Sopenharmony_ci if (adapter != nullptr) { 30094332d3Sopenharmony_ci int ret = adapter->Init(); 31094332d3Sopenharmony_ci if (ret == DISPLAY_SUCCESS) { 32094332d3Sopenharmony_ci instance = std::move(adapter); 33094332d3Sopenharmony_ci } 34094332d3Sopenharmony_ci } 35094332d3Sopenharmony_ci }); 36094332d3Sopenharmony_ci return instance; 37094332d3Sopenharmony_ci} 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_ciint32_t DisplayAdapter::Init() 40094332d3Sopenharmony_ci{ 41094332d3Sopenharmony_ci loader_ = DisplayModuleLoader::Create(LIB_NAME_ADAPTER); 42094332d3Sopenharmony_ci if (loader_ == nullptr) { 43094332d3Sopenharmony_ci DISPLAY_LOGE("can not create loader"); 44094332d3Sopenharmony_ci return DISPLAY_FAILURE; 45094332d3Sopenharmony_ci } 46094332d3Sopenharmony_ci initFunc_ = reinterpret_cast<AdapterInitFunc>(loader_->GetSymbol(INIT_FUNCTION_NAME)); 47094332d3Sopenharmony_ci if (initFunc_ == nullptr) { 48094332d3Sopenharmony_ci DISPLAY_LOGE("failed to get function %{public}s", INIT_FUNCTION_NAME); 49094332d3Sopenharmony_ci return DISPLAY_FAILURE; 50094332d3Sopenharmony_ci } 51094332d3Sopenharmony_ci deInitFunc_ = reinterpret_cast<AdapterDeInitFunc>(loader_->GetSymbol(DEINIT_FUNCTION_NAME)); 52094332d3Sopenharmony_ci if (deInitFunc_ == nullptr) { 53094332d3Sopenharmony_ci DISPLAY_LOGE("failed to get function %{public}s", DEINIT_FUNCTION_NAME); 54094332d3Sopenharmony_ci return DISPLAY_FAILURE; 55094332d3Sopenharmony_ci } 56094332d3Sopenharmony_ci int ret = initFunc_(&funcs_); 57094332d3Sopenharmony_ci if ((ret != DISPLAY_SUCCESS) || (funcs_ == nullptr)) { 58094332d3Sopenharmony_ci DISPLAY_LOGE("failed to get display adapter functions"); 59094332d3Sopenharmony_ci return DISPLAY_FAILURE; 60094332d3Sopenharmony_ci } 61094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 62094332d3Sopenharmony_ci} 63094332d3Sopenharmony_ci 64094332d3Sopenharmony_ciDisplayAdapter::~DisplayAdapter() 65094332d3Sopenharmony_ci{ 66094332d3Sopenharmony_ci if ((funcs_ != nullptr) && (deInitFunc_ != nullptr)) { 67094332d3Sopenharmony_ci deInitFunc_(funcs_); 68094332d3Sopenharmony_ci } 69094332d3Sopenharmony_ci} 70094332d3Sopenharmony_ci 71094332d3Sopenharmony_ciint32_t DisplayAdapter::OpenDevice(const std::string &pathName, int32_t flags, mode_t mode) 72094332d3Sopenharmony_ci{ 73094332d3Sopenharmony_ci if (funcs_->OpenDevice != nullptr) { 74094332d3Sopenharmony_ci DISPLAY_LOGD("use the adapter open function"); 75094332d3Sopenharmony_ci return funcs_->OpenDevice(pathName.c_str(), flags, mode); 76094332d3Sopenharmony_ci } else { 77094332d3Sopenharmony_ci return open(pathName.c_str(), flags, mode); 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci} 80094332d3Sopenharmony_ci 81094332d3Sopenharmony_ciint32_t DisplayAdapter::CloseDevice(int32_t devFd) 82094332d3Sopenharmony_ci{ 83094332d3Sopenharmony_ci if (funcs_->CloseDevice != nullptr) { 84094332d3Sopenharmony_ci DISPLAY_LOGD("use the adapter close function"); 85094332d3Sopenharmony_ci return funcs_->CloseDevice(devFd); 86094332d3Sopenharmony_ci } else { 87094332d3Sopenharmony_ci return close(devFd); 88094332d3Sopenharmony_ci } 89094332d3Sopenharmony_ci} 90094332d3Sopenharmony_ci 91094332d3Sopenharmony_ciint32_t DisplayAdapter::Ioctl(int32_t devFd, uint32_t cmd, void *args) 92094332d3Sopenharmony_ci{ 93094332d3Sopenharmony_ci int32_t ret = -1; 94094332d3Sopenharmony_ci if (funcs_->Ioctl != nullptr) { 95094332d3Sopenharmony_ci DISPLAY_LOGD("use the adapter ioctl function"); 96094332d3Sopenharmony_ci ret = funcs_->Ioctl(devFd, cmd, args); 97094332d3Sopenharmony_ci } else { 98094332d3Sopenharmony_ci ret = ioctl(devFd, cmd, args); 99094332d3Sopenharmony_ci } 100094332d3Sopenharmony_ci return ret; 101094332d3Sopenharmony_ci} 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ciint32_t DisplayAdapter::FbGetDmaBuffer(int32_t devFd) 104094332d3Sopenharmony_ci{ 105094332d3Sopenharmony_ci if (funcs_->FbGetDmaBuffer == nullptr) { 106094332d3Sopenharmony_ci DISPLAY_LOGE("has no function to get fb dmabuffer"); 107094332d3Sopenharmony_ci return -1; 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci return funcs_->FbGetDmaBuffer(devFd); 110094332d3Sopenharmony_ci} 111094332d3Sopenharmony_ci 112094332d3Sopenharmony_ciint32_t DisplayAdapter::FbFresh(int32_t devFd, DisplayFrameInfo &frame) 113094332d3Sopenharmony_ci{ 114094332d3Sopenharmony_ci if (funcs_->FbFresh == nullptr) { 115094332d3Sopenharmony_ci DISPLAY_LOGE("has no function to fresh fb"); 116094332d3Sopenharmony_ci return -1; 117094332d3Sopenharmony_ci } 118094332d3Sopenharmony_ci return funcs_->FbFresh(devFd, &frame); 119094332d3Sopenharmony_ci} 120094332d3Sopenharmony_ci} // namespace DISPLAY 121094332d3Sopenharmony_ci} // namespace HDI 122094332d3Sopenharmony_ci} // namespace OHOS