diff options
author | linpeter <linpeter@google.com> | 2021-01-08 16:15:42 +0800 |
---|---|---|
committer | linpeter <linpeter@google.com> | 2021-01-13 19:17:56 +0800 |
commit | f00448f7efc9240caeae2acb52ef966a41d7083c (patch) | |
tree | 8c607c6759d6b64f53042fe66ce43bad8038a919 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 638de7cc9fb05dd0687eb080fa01b39a8d2738b3 (diff) |
libhwc2.1: configure brightness through sysfs or drm path
Write brightness to sysfs. If it required frame sync, do
atomic commit for brightness.
Bug: 143292983
Bug: 143293693
test: check atomic commit for brightness
Change-Id: I350bae962983713c97b768c0ba431f2278bb3aec
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index a974e34..2dc78f6 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -54,6 +54,22 @@ using namespace vendor::graphics; extern struct exynos_hwc_control exynosHWCControl; static const int32_t kUmPerInch = 25400; + +void writeFileNode(FILE *fd, int value) { + constexpr uint32_t kMaxWriteFileLen = 16; + char val[kMaxWriteFileLen] = {0}; + if (int32_t ret = snprintf(val, kMaxWriteFileLen, "%d", value) <= 0) { + ALOGE("Fail to write file node, ret =%d", ret); + } else { + fwrite(val, sizeof(val), 1, fd); + if (ferror(fd)) { + ALOGE("write failed: %s", strerror(errno)); + clearerr(fd); + } + rewind(fd); + } +} + ExynosDisplayDrmInterface::ExynosDisplayDrmInterface(ExynosDisplay *exynosDisplay) { mType = INTERFACE_TYPE_DRM; @@ -1230,7 +1246,16 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() if (isBrightnessStateChange()) { setupBrightnessConfig(); - // TODO:setup drm property + if ((ret = drmReq.atomicAddProperty(mDrmConnector->id(), mDrmConnector->brightness_level(), + mBrightnessLevel)) < 0) { + HWC_LOGE(mExynosDisplay, "%s: Fail to set brightness_level property", __func__); + } + + if ((ret = drmReq.atomicAddProperty(mDrmConnector->id(), mDrmConnector->hbm_on(), + mBrightnessHbmOn)) < 0) { + HWC_LOGE(mExynosDisplay, "%s: Fail to set hbm_on property", __func__); + } + // TODO: add dimming_on property } uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK; @@ -1791,6 +1816,10 @@ void ExynosDisplayDrmInterface::getBrightnessInterfaceSupport() { mBrightnessState.reset(); mBrightnessHbmOn = false; mBrightnessDimmingOn = true; + + mHbmOnFd = fopen(kHbmOnFileNode, "w+"); + if (mHbmOnFd == NULL) ALOGE("%s open failed! %s", kHbmOnFileNode, strerror(errno)); + return; } @@ -1798,7 +1827,13 @@ int32_t ExynosDisplayDrmInterface::updateBrightness() { if (!mBrightntessIntfSupported) return HWC2_ERROR_UNSUPPORTED; setupBrightnessConfig(); - // TODO: write sysfs + + if (mExynosDisplay->mBrightnessFd) + writeFileNode(mExynosDisplay->mBrightnessFd, mBrightnessLevel); + + if (mHbmOnFd) writeFileNode(mHbmOnFd, mBrightnessHbmOn); + + // TODO: dimming_on file node return HWC2_ERROR_NONE; } @@ -1817,13 +1852,16 @@ void ExynosDisplayDrmInterface::setupBrightnessConfig() { mBrightnessDimmingOn = (!mBrightnessState.instant_hbm && !brightness_state.instant_hbm); + // TODO: keep in normal brightness range before DisplayManager HBM impl ready + float brightness = mExynosDisplay->getBrightnessValue() * + mBrightnessTable[BrightnessRange::NORMAL].mBriEnd; + if (brightness_state.peak_hbm) { mScaledBrightness = mBrightnessHbmMax; } else if (brightness_state.boost_brightness) { - mScaledBrightness = - min(mBrightnessHdrRatio * mExynosDisplay->getBrightnessValue(), mBrightnessHbmMax); + mScaledBrightness = min(mBrightnessHdrRatio * brightness, mBrightnessHbmMax); } else { - mScaledBrightness = mExynosDisplay->getBrightnessValue(); + mScaledBrightness = brightness; } uint32_t range; @@ -1850,7 +1888,5 @@ void ExynosDisplayDrmInterface::setupBrightnessConfig() { mBrightnessState = brightness_state; - // TODO:mapping and setup mBrightnessLevel and mBrightnessHbmOn - return; } |