/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "android.hardware.tv.input@1.0-service" #include #include #include #include "RkOutputManager.h" using namespace android; namespace rockchip { namespace hardware { namespace outputmanager { namespace V1_0 { namespace implementation { RkOutputManager::RkOutputManager(hw_output_device* dev){ mHwOutput = dev; } RkOutputManager::~RkOutputManager() { } Return RkOutputManager::initial() { mHwOutput->initialize(mHwOutput, NULL); return Void(); } Return RkOutputManager::setMode(Display display, const hidl_string& mode) { std::string modeStd(mode.c_str()); mHwOutput->setMode(mHwOutput, display, modeStd.c_str()); return Result::OK; } Return RkOutputManager::set3DMode(const hidl_string& mode) { std::string modeStd(mode.c_str()); mHwOutput->set3DMode(mHwOutput, modeStd.c_str()); return Result::OK; } Return RkOutputManager::setGamma(Display display, uint32_t size, const hidl_vec& r, const hidl_vec& g, const hidl_vec& b) { uint16_t red[size]; uint16_t green[size]; uint16_t blue[size]; Result res = Result::UNKNOWN; int ret = 0; for (uint32_t i=0;isetGamma(mHwOutput, display, size, red, green, blue); if (ret == 0) res = Result::OK; return res; } Return RkOutputManager::set3DLut(Display display, uint32_t size, const hidl_vec& r, const hidl_vec& g, const hidl_vec& b) { uint16_t red[size]; uint16_t green[size]; uint16_t blue[size]; Result res = Result::UNKNOWN; int ret = 0; for (uint32_t i=0;iset3DLut(mHwOutput, display, size, red, green, blue); if (ret == 0) res = Result::OK; return res; } Return RkOutputManager::setBrightness(Display display, uint32_t value) { mHwOutput->setBrightness(mHwOutput, display, value); return Result::OK; } Return RkOutputManager::setContrast(Display display, uint32_t value) { mHwOutput->setContrast(mHwOutput, display, value); return Result::OK; } Return RkOutputManager::setSaturation(Display display, uint32_t value) { mHwOutput->setSat(mHwOutput, display, value); return Result::OK; } Return RkOutputManager::setHue(Display display, uint32_t value) { mHwOutput->setHue(mHwOutput, display, value); return Result::OK; } Return RkOutputManager::setScreenScale(Display display, uint32_t direction, uint32_t value) { mHwOutput->setScreenScale(mHwOutput, display, direction, value); return Result::OK; } Return RkOutputManager::setHdrMode(Display display, uint32_t hdrmode) { mHwOutput->setHdrMode(mHwOutput, display, hdrmode); return Result::OK; } Return RkOutputManager::setColorMode(Display display, const hidl_string& mode) { std::string modeStd(mode.c_str()); mHwOutput->setColorMode(mHwOutput, display, modeStd.c_str()); return Result::OK; } Return RkOutputManager::getCurCorlorMode(Display display, getCurCorlorMode_cb hidl_cb) { hidl_string hidl_mode; char mCurMode[256]; int ret = mHwOutput->getCurColorMode(mHwOutput, display, mCurMode); Result res = Result::UNKNOWN; if (ret == 0) res = Result::OK; hidl_mode = mCurMode; hidl_cb(res, hidl_mode); return Void(); } Return RkOutputManager::getCurMode(Display display, getCurMode_cb _hidl_cb) { hidl_string hidl_mode; char mCurMode[256]; int ret = mHwOutput->getCurMode(mHwOutput, display, mCurMode); Result res = Result::UNKNOWN; if (ret == 0) res = Result::OK; hidl_mode = mCurMode; _hidl_cb(res, hidl_mode); return Void(); } Return RkOutputManager::getNumConnectors(Display display, getNumConnectors_cb _hidl_cb) { int numConnectors; int ret = mHwOutput->getNumConnectors(mHwOutput, display, &numConnectors); Result res = Result::UNKNOWN; if (ret == 0) res = Result::OK; _hidl_cb(res, numConnectors); ALOGV("%s:%d numConnectors:%d ", __FUNCTION__, __LINE__, numConnectors); return Void(); } Return RkOutputManager::getConnectState(Display display, getConnectState_cb _hidl_cb) { int state; int ret = mHwOutput->getConnectorState(mHwOutput, display, &state); Result res = Result::UNKNOWN; if (ret == 0) res = Result::OK; _hidl_cb(res, state); ALOGV("%s:%d state:%d ", __FUNCTION__, __LINE__, state); return Void(); } Return RkOutputManager::getBuiltIn(Display display, getBuiltIn_cb _hidl_cb) { int builtin; int ret = mHwOutput->getBuiltIn(mHwOutput, display, &builtin); Result res = Result::UNKNOWN; if (ret == 0) res = Result::OK; _hidl_cb(res, builtin); ALOGV("%s:%d builtin:%d ", __FUNCTION__, __LINE__, builtin); return Void(); } Return RkOutputManager::getCorlorModeConfigs(Display display, getCorlorModeConfigs_cb _hidl_cb) { int capa[2]; int ret = mHwOutput->getColorConfigs(mHwOutput, display, capa); Result res = Result::UNKNOWN; hidl_vec hidl_cfgs; if (ret == 0) { res = Result::OK; hidl_cfgs.resize(2); hidl_cfgs[0] = capa[0]; hidl_cfgs[1] = capa[1]; } _hidl_cb(res, hidl_cfgs); ALOGV("%s:%d hidl_cfgs:%d %d", __FUNCTION__, __LINE__, hidl_cfgs[0], hidl_cfgs[1]); return Void(); } Return RkOutputManager::getOverscan(Display display, getOverscan_cb _hidl_cb) { uint32_t mOverscans[4]; int ret = mHwOutput->getOverscan(mHwOutput, display, mOverscans); hidl_vec hidl_overscan; Result res = Result::UNKNOWN; if (ret == 0) { res = Result::OK; hidl_overscan.resize(4); for (int i=0;i<4;i++) hidl_overscan[i] = mOverscans[i]; } _hidl_cb(res, hidl_overscan); ALOGV("%s:%d hidl_overscan:%d %d %d %d", __FUNCTION__, __LINE__, hidl_overscan[0], hidl_overscan[1], hidl_overscan[2], hidl_overscan[3]); return Void(); } Return RkOutputManager::getBcsh(Display display, getBcsh_cb _hidl_cb) { uint32_t mBcshs[4]; int ret = mHwOutput->getBcsh(mHwOutput, display, mBcshs); hidl_vec hidl_bcsh; Result res = Result::UNKNOWN; if (ret == 0) { res = Result::OK; hidl_bcsh.resize(4); for (int i=0;i<4;i++) hidl_bcsh[i] = mBcshs[i]; } ALOGV("%s:%d bcsh:%d %d %d %d", __FUNCTION__, __LINE__, hidl_bcsh[0], hidl_bcsh[1], hidl_bcsh[2], hidl_bcsh[3]); _hidl_cb(res, hidl_bcsh); return Void(); } Return RkOutputManager::getDisplayModes(Display display, getDisplayModes_cb _hidl_cb) { drm_mode_t* mModes = NULL; uint32_t size=0; mModes = mHwOutput->getDisplayModes(mHwOutput, display, &size); Result res = Result::UNKNOWN; hidl_vec mDisplayModes; if (mModes != NULL) { res = Result::OK; mDisplayModes.resize((size_t)size); ALOGV("RkOutputManager::getDisplayModes .size = %d", (int)mDisplayModes.size()); for (uint32_t i=0;i RkOutputManager::getConnectorInfo(getConnectorInfo_cb _hidl_cb) { connector_info_t* mInfo = NULL; uint32_t size=0; mInfo = mHwOutput->getConnectorInfo(mHwOutput, &size); Result res = Result::UNKNOWN; hidl_vec mRkConnectorInfo; if (mInfo != NULL) { res = Result::OK; mRkConnectorInfo.resize((size_t)size); for (uint32_t i=0;i RkOutputManager::updateDispHeader() { Result res = Result::UNKNOWN; int ret = mHwOutput->updateDispHeader(mHwOutput); if(ret == 0){ res = Result::OK; } return res; } Return RkOutputManager::saveConfig() { mHwOutput->saveConfig(mHwOutput); return Void(); } Return RkOutputManager::hotPlug() { mHwOutput->hotplug(mHwOutput); return Void(); } Return RkOutputManager::getModeState(const hidl_string& mode, getModeState_cb _hidl_cb) { Result res = Result::UNKNOWN; hidl_string state = 0; char tmpPriority[256]; int ret = mHwOutput->getModeState(mHwOutput, mode.c_str(), tmpPriority); if (ret == 0) { res = Result::OK; } state = tmpPriority; _hidl_cb(res, state); return Void(); } Return RkOutputManager::setModeState(const hidl_string& mode, const hidl_string& state) { Result res = Result::UNKNOWN; int ret = mHwOutput->setModeState(mHwOutput, mode.c_str(), state.c_str()); if(ret == 0){ res = Result::OK; } return res; } Return RkOutputManager::getHdrResolutionSupported(Display display, const hidl_string &mode, getHdrResolutionSupported_cb _hidl_cb) { Result res = Result::UNKNOWN; uint32_t supported = 0; int ret = mHwOutput->getHdrResolutionSupported(mHwOutput, display, mode.c_str(), &supported); if (ret == 0) { res = Result::OK; } _hidl_cb(res, supported); return Void(); } IRkOutputManager *HIDL_FETCH_IRkOutputManager(const char * /* name */) { struct hw_output_device* mHwOutput; const hw_module_t* hw_module = nullptr; int ret = hw_get_module(HW_OUTPUT_HARDWARE_MODULE_ID, &hw_module); if (ret == 0) { ret = hw_output_open(hw_module, &mHwOutput); if (ret == 0) { return new RkOutputManager(mHwOutput); } else { LOG(ERROR) << "Passthrough failed to load legacy HAL."; return nullptr; } } else { LOG(ERROR) << "hw_get_module " << HWC_HARDWARE_MODULE_ID << " failed: " << ret; return nullptr; } } } // namespace implementation } // namespace V1_0 } // namespace composer } // namespace hardware } // namespace vendor