1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #ifndef EXYNOS_DISPLAY_MODULE_H 17 #define EXYNOS_DISPLAY_MODULE_H 18 19 #include "ColorManager.h" 20 #include "DisplaySceneInfo.h" 21 #include "ExynosDeviceModule.h" 22 #include "ExynosDisplay.h" 23 #include "ExynosLayer.h" 24 #include "ExynosPrimaryDisplay.h" 25 26 constexpr char kAtcJsonRaw[] = 27 "{\"version\":\"0.0\",\"modes\":[{\"name\":\"normal\",\"lux_map\":[0,5000,10000," 28 "50000,70000],\"ambient_light_map\":[0,0,12,32,63],\"strength_map\":[0,0,128,128,200]," 29 "\"st_up_step\":2, \"st_down_step\":2," 30 "\"sub_setting\":{\"local_tone_gain\":128,\"noise_suppression_gain\":128,\"dither\":0," 31 "\"plain_weight_1\":10,\"plain_weight_2\":14,\"color_transform_mode\":2,\"preprocessing_" 32 "enable\":1,\"upgrade_on\":0,\"TDR_max\":900,\"TDR_min\":256,\"backlight\":255,\"dimming_" 33 "step\":4,\"scale_mode\":1,\"threshold_1\":1,\"threshold_2\":1,\"threshold_3\":1,\"gain_" 34 "limit\":511,\"lt_calc_ab_shift\":1}}]}"; 35 36 constexpr char kAtcProfilePath[] = "vendor/etc/atc_profile.json"; 37 constexpr char kAtcProfileVersionStr[] = "version"; 38 constexpr char kAtcProfileModesStr[] = "modes"; 39 constexpr char kAtcProfileModeNameStr[] = "name"; 40 constexpr char kAtcProfileLuxMapStr[] = "lux_map"; 41 constexpr char kAtcProfileAlMapStr[] = "ambient_light_map"; 42 constexpr char kAtcProfileStMapStr[] = "strength_map"; 43 constexpr char kAtcProfileSubSettingStr[] = "sub_setting"; 44 constexpr char kAtcProfileStUpStepStr[] = "st_up_step"; 45 constexpr char kAtcProfileStDownStepStr[] = "st_down_step"; 46 constexpr uint32_t kAtcStStep = 2; 47 48 constexpr char kAtcModeNormalStr[] = "normal"; 49 constexpr char kAtcModeHbmStr[] = "hbm"; 50 constexpr char kAtcModePowerSaveStr[] = "power_save"; 51 constexpr char kAtcModeHdrStr[] = "hdr"; 52 53 #define ATC_AMBIENT_LIGHT_FILE_NAME "/sys/class/dqe%d/atc/ambient_light" 54 #define ATC_ST_FILE_NAME "/sys/class/dqe%d/atc/st" 55 #define ATC_ENABLE_FILE_NAME "/sys/class/dqe%d/atc/en" 56 #define ATC_LT_FILE_NAME "/sys/class/dqe%d/atc/lt" 57 #define ATC_NS_FILE_NAME "/sys/class/dqe%d/atc/ns" 58 #define ATC_DITHER_FILE_NAME "/sys/class/dqe%d/atc/dither" 59 #define ATC_PL_W1_FILE_NAME "/sys/class/dqe%d/atc/pl_w1" 60 #define ATC_PL_W2_FILE_NAME "/sys/class/dqe%d/atc/pl_w2" 61 #define ATC_CTMODE_FILE_NAME "/sys/class/dqe%d/atc/ctmode" 62 #define ATC_PP_EN_FILE_NAME "/sys/class/dqe%d/atc/pp_en" 63 #define ATC_UPGRADE_ON_FILE_NAME "/sys/class/dqe%d/atc/upgrade_on" 64 #define ATC_TDR_MAX_FILE_NAME "/sys/class/dqe%d/atc/tdr_max" 65 #define ATC_TDR_MIN_FILE_NAME "/sys/class/dqe%d/atc/tdr_min" 66 #define ATC_BACKLIGHT_FILE_NAME "/sys/class/dqe%d/atc/back_light" 67 #define ATC_DSTEP_FILE_NAME "/sys/class/dqe%d/atc/dstep" 68 #define ATC_SCALE_MODE_FILE_NAME "/sys/class/dqe%d/atc/scale_mode" 69 #define ATC_THRESHOLD_1_FILE_NAME "/sys/class/dqe%d/atc/threshold_1" 70 #define ATC_THRESHOLD_2_FILE_NAME "/sys/class/dqe%d/atc/threshold_2" 71 #define ATC_THRESHOLD_3_FILE_NAME "/sys/class/dqe%d/atc/threshold_3" 72 #define ATC_GAIN_LIMIT_FILE_NAME "/sys/class/dqe%d/atc/gain_limit" 73 #define ATC_LT_CALC_AB_SHIFT_FILE_NAME "/sys/class/dqe%d/atc/lt_calc_ab_shift" 74 75 const std::unordered_map<std::string, std::string> kAtcSubSetting = 76 {{"local_tone_gain", ATC_LT_FILE_NAME}, 77 {"noise_suppression_gain", ATC_NS_FILE_NAME}, 78 {"dither", ATC_DITHER_FILE_NAME}, 79 {"plain_weight_1", ATC_PL_W1_FILE_NAME}, 80 {"plain_weight_2", ATC_PL_W2_FILE_NAME}, 81 {"color_transform_mode", ATC_CTMODE_FILE_NAME}, 82 {"preprocessing_enable", ATC_PP_EN_FILE_NAME}, 83 {"upgrade_on", ATC_UPGRADE_ON_FILE_NAME}, 84 {"TDR_max", ATC_TDR_MAX_FILE_NAME}, 85 {"TDR_min", ATC_TDR_MIN_FILE_NAME}, 86 {"backlight", ATC_BACKLIGHT_FILE_NAME}, 87 {"dimming_step", ATC_DSTEP_FILE_NAME}, 88 {"scale_mode", ATC_SCALE_MODE_FILE_NAME}, 89 {"threshold_1", ATC_THRESHOLD_1_FILE_NAME}, 90 {"threshold_2", ATC_THRESHOLD_2_FILE_NAME}, 91 {"threshold_3", ATC_THRESHOLD_3_FILE_NAME}, 92 {"gain_limit", ATC_GAIN_LIMIT_FILE_NAME}, 93 {"lt_calc_ab_shift", ATC_LT_CALC_AB_SHIFT_FILE_NAME}}; 94 95 namespace gs101 { 96 97 using namespace displaycolor; 98 99 class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { 100 using GsInterfaceType = gs::ColorDrmBlobFactory::GsInterfaceType; 101 public: 102 ExynosPrimaryDisplayModule(uint32_t index, ExynosDevice* device, 103 const std::string& displayName); 104 ~ExynosPrimaryDisplayModule(); 105 void usePreDefinedWindow(bool use); 106 virtual int32_t validateWinConfigData(); 107 void doPreProcessing(); 108 virtual int32_t getColorModes(uint32_t* outNumModes, int32_t* outModes) override; 109 virtual int32_t setColorMode(int32_t mode) override; 110 virtual int32_t getRenderIntents(int32_t mode, uint32_t* outNumIntents, 111 int32_t* outIntents) override; 112 virtual int32_t setColorModeWithRenderIntent(int32_t mode, int32_t intent) override; 113 virtual int32_t setColorTransform(const float* matrix, int32_t hint) override; 114 virtual int32_t getClientTargetProperty( 115 hwc_client_target_property_t* outClientTargetProperty, 116 HwcDimmingStage *outDimmingStage = nullptr) override; 117 virtual int deliverWinConfigData(); 118 virtual int32_t updateColorConversionInfo() override; 119 virtual int32_t resetColorMappingInfo(ExynosMPPSource* mppSrc) override; 120 virtual int32_t updatePresentColorConversionInfo(); checkRrCompensationEnabled()121 virtual bool checkRrCompensationEnabled() { 122 const DisplayType display = getDcDisplayType(); 123 GsInterfaceType* displayColorInterface = getDisplayColorInterface(); 124 return displayColorInterface 125 ? displayColorInterface->IsRrCompensationEnabled(display) 126 : false; 127 } 128 129 virtual int32_t getColorAdjustedDbv(uint32_t &dbv_adj); 130 131 virtual void initLbe(); 132 virtual bool isLbeSupported(); 133 virtual void setLbeState(LbeState state); 134 virtual void setLbeAmbientLight(int value); 135 virtual LbeState getLbeState(); 136 setForceColorUpdate(bool force)137 void setForceColorUpdate(bool force) override { mForceColorUpdate = force; } 138 139 virtual PanelCalibrationStatus getPanelCalibrationStatus(); 140 hasDisplayColor()141 bool hasDisplayColor() { 142 GsInterfaceType* displayColorInterface = getDisplayColorInterface(); 143 return displayColorInterface != nullptr; 144 } 145 146 int32_t updateBrightnessTable(); 147 getColorManager()148 ColorManager* getColorManager() { return mColorManager.get(); } 149 150 private: 151 std::unique_ptr<ColorManager> mColorManager; 152 getDisplaySceneInfo()153 DisplaySceneInfo& getDisplaySceneInfo() { return mColorManager->getDisplaySceneInfo(); } 154 155 struct atc_lux_map { 156 uint32_t lux; 157 uint32_t al; 158 uint32_t st; 159 }; 160 161 struct atc_mode { 162 std::vector<atc_lux_map> lux_map; 163 std::unordered_map<std::string, int32_t> sub_setting; 164 uint32_t st_up_step; 165 uint32_t st_down_step; 166 }; 167 struct atc_sysfs { 168 String8 node; 169 CtrlValue<int32_t> value; 170 }; 171 172 bool parseAtcProfile(); 173 int32_t setAtcMode(std::string mode_name); 174 uint32_t getAtcLuxMapIndex(std::vector<atc_lux_map>, uint32_t lux); 175 int32_t setAtcAmbientLight(uint32_t ambient_light); 176 int32_t setAtcStrength(uint32_t strenght); 177 int32_t setAtcStDimming(uint32_t target); 178 int32_t setAtcEnable(bool enable); 179 void checkAtcAnimation(); 180 void checkAtcHdrMode(); isInAtcAnimation()181 bool isInAtcAnimation() { 182 if (mAtcStStepCount > 0) 183 return true; 184 else 185 return false; 186 }; 187 getDisplayColorInterface()188 GsInterfaceType* getDisplayColorInterface() { 189 ExynosDeviceModule* device = (ExynosDeviceModule*)mDevice; 190 return device->getDisplayColorInterface(); 191 } 192 isForceColorUpdate()193 bool isForceColorUpdate() const { return mForceColorUpdate; } 194 bool isDisplaySwitched(int32_t mode, int32_t prevMode); 195 196 std::map<std::string, atc_mode> mAtcModeSetting; 197 bool mAtcInit; 198 LbeState mCurrentLbeState = LbeState::OFF; 199 std::string mCurrentAtcModeName; 200 uint32_t mCurrentLux = 0; 201 uint32_t mAtcLuxMapIndex = 0; 202 struct atc_sysfs mAtcAmbientLight; 203 struct atc_sysfs mAtcStrength; 204 struct atc_sysfs mAtcEnable; 205 std::unordered_map<std::string, struct atc_sysfs> mAtcSubSetting; 206 uint32_t mAtcStStepCount = 0; 207 uint32_t mAtcStTarget = 0; 208 uint32_t mAtcStUpStep; 209 uint32_t mAtcStDownStep; 210 Mutex mAtcStMutex; 211 bool mPendingAtcOff; 212 bool mForceColorUpdate = false; 213 bool mLbeSupported = false; 214 bool isFullScreenHdrLayer(); 215 216 protected: 217 virtual int32_t setPowerMode(int32_t mode) override; 218 }; 219 220 } // namespace gs101 221 222 #endif 223