From c162e21253a0a400ef0fe4bc0d64c5030cfea97f Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Thu, 19 Jul 2018 16:02:18 +0200 Subject: [PATCH] sdm845-common: Add support for display modes and HBM Change-Id: Ic93612e6ffeb0103778bd05bfd1c2921e433cd9f --- .../hardware/DisplayModeControl.java | 110 ++++++++++++++++++ .../hardware/SunlightEnhancement.java | 86 ++++++++++++++ rootdir/etc/init.qcom.rc | 5 + 3 files changed, 201 insertions(+) create mode 100644 lineagehw/org/lineageos/hardware/DisplayModeControl.java create mode 100644 lineagehw/org/lineageos/hardware/SunlightEnhancement.java diff --git a/lineagehw/org/lineageos/hardware/DisplayModeControl.java b/lineagehw/org/lineageos/hardware/DisplayModeControl.java new file mode 100644 index 0000000..8caa452 --- /dev/null +++ b/lineagehw/org/lineageos/hardware/DisplayModeControl.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * Copyright (C) 2018 The LineageOS 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. + */ + +package org.lineageos.hardware; + +import android.util.Log; + +import lineageos.hardware.DisplayMode; +import org.lineageos.internal.util.FileUtils; + +import java.util.HashMap; + +/* + * Display Modes API + * + * A device may implement a list of preset display modes for different + * viewing intents, such as movies, photos, or extra vibrance. These + * modes may have multiple components such as gamma correction, white + * point adjustment, etc, but are activated by a single control point. + * + * This API provides support for enumerating and selecting the + * modes supported by the hardware. + */ + +public class DisplayModeControl { + private static final String MODE_PATH = + "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode"; + private static final String DEFAULT_PATH = "/data/system/default_display_mode"; + + private static final HashMap MODE_MAP = new HashMap<>(); + static { + MODE_MAP.put("default", new DisplayMode(0, "Standard")); + MODE_MAP.put("srgb", new DisplayMode(1, "sRGB")); + MODE_MAP.put("dci-p3", new DisplayMode(2, "DCI P3")); + MODE_MAP.put("adaption", new DisplayMode(3, "Adaptive")); + + String storedDefaultMode = FileUtils.readOneLine(DEFAULT_PATH); + if (storedDefaultMode != null) { + FileUtils.writeLine(MODE_PATH, storedDefaultMode); + } + } + + /* + * All HAF classes should export this boolean. + * Real implementations must, of course, return true + */ + public static boolean isSupported() { + return FileUtils.isFileWritable(MODE_PATH); + } + + /* + * Get the list of available modes. A mode has an integer + * identifier and a string name. + * + * It is the responsibility of the upper layers to + * map the name to a human-readable format or perform translation. + */ + public static DisplayMode[] getAvailableModes() { + return MODE_MAP.values().toArray(new DisplayMode[MODE_MAP.size()]); + } + + /* + * Get the name of the currently selected mode. This can return + * null if no mode is selected. + */ + public static DisplayMode getCurrentMode() { + return MODE_MAP.get(FileUtils.readOneLine(MODE_PATH)); + } + + /* + * Selects a mode from the list of available modes by it's + * string identifier. Returns true on success, false for + * failure. It is up to the implementation to determine + * if this mode is valid. + */ + public static boolean setMode(DisplayMode mode, boolean makeDefault) { + for (HashMap.Entry entry : MODE_MAP.entrySet()) { + if (entry.getValue().id == mode.id) { + if (FileUtils.writeLine(MODE_PATH, entry.getKey()) && makeDefault) { + FileUtils.writeLine(DEFAULT_PATH, entry.getKey()); + return true; + } + } + } + return false; + } + + /* + * Gets the preferred default mode for this device by it's + * string identifier. Can return null if there is no default. + */ + public static DisplayMode getDefaultMode() { + String storedDefaultMode = FileUtils.readOneLine(DEFAULT_PATH); + return MODE_MAP.get(storedDefaultMode != null ? storedDefaultMode : "default"); + } +} diff --git a/lineagehw/org/lineageos/hardware/SunlightEnhancement.java b/lineagehw/org/lineageos/hardware/SunlightEnhancement.java new file mode 100644 index 0000000..24027aa --- /dev/null +++ b/lineagehw/org/lineageos/hardware/SunlightEnhancement.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * Copyright (C) 2018 The LineageOS 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. + */ + +package org.lineageos.hardware; + +import android.util.Log; + +import org.lineageos.internal.util.FileUtils; + +public class SunlightEnhancement { + private static final String TAG = "SunlightEnhancement"; + + private static final String HBM_PATH = + "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm"; + + /** + * Whether device supports sunlight enhancement + * + * @return boolean Supported devices must return always true + */ + public static boolean isSupported() { + return FileUtils.isFileWritable(HBM_PATH); + } + + /** + * This method return the current activation status of sunlight enhancement + * + * @return boolean Must be false when sunlight enhancement is not supported or not activated, + * or the operation failed while reading the status; true in any other case. + */ + public static boolean isEnabled() { + try { + return Integer.parseInt(FileUtils.readOneLine(HBM_PATH)) > 0; + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); + } + return false; + } + + /** + * This method allows to setup sunlight enhancement + * + * @param status The new sunlight enhancement status + * @return boolean Must be false if sunlight enhancement is not supported or the operation + * failed; true in any other case. + */ + public static boolean setEnabled(boolean status) { + return FileUtils.writeLine(HBM_PATH, status ? "3" : "0"); + } + + /** + * Whether adaptive backlight (CABL / CABC) is required to be enabled + * + * @return boolean False if adaptive backlight is not a dependency + */ + public static boolean isAdaptiveBacklightRequired() { + return false; + } + + /** + * Set this to true if the implementation is self-managed and does + * it's own ambient sensing. In this case, setEnabled is assumed + * to toggle the feature on or off, but not activate it. If set + * to false, LiveDisplay will call setEnabled when the ambient lux + * threshold is crossed. + * + * @return true if this enhancement is self-managed + */ + public static boolean isSelfManaged() { + return false; + } +} diff --git a/rootdir/etc/init.qcom.rc b/rootdir/etc/init.qcom.rc index b75e843..83f10fc 100644 --- a/rootdir/etc/init.qcom.rc +++ b/rootdir/etc/init.qcom.rc @@ -32,6 +32,11 @@ on boot chown system system /proc/touchpanel/up_arrow_enable chown system system /proc/touchpanel/up_swipe_enable + chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode + chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm + chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode + chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm + service dashd /sbin/dashd class core critical