From 0a3d074ead84b8044aa28e55571aaa45ee12fb77 Mon Sep 17 00:00:00 2001 From: Paul Keith Date: Sun, 2 Jun 2019 04:41:21 +0200 Subject: [PATCH] universal8895: Implement custom LiveDisplay HIDL Change-Id: I8da4954abeba47f6abbd7526502f3521257034fa --- device-common.mk | 4 + hidl/livedisplay/.clang-format | 11 ++ hidl/livedisplay/AdaptiveBacklight.cpp | 55 ++++++++ hidl/livedisplay/AdaptiveBacklight.h | 50 ++++++++ hidl/livedisplay/Android.bp | 37 ++++++ hidl/livedisplay/DisplayColorCalibration.cpp | 72 +++++++++++ hidl/livedisplay/DisplayColorCalibration.h | 52 ++++++++ hidl/livedisplay/ReadingEnhancement.cpp | 54 ++++++++ hidl/livedisplay/ReadingEnhancement.h | 50 ++++++++ hidl/livedisplay/SunlightEnhancement.cpp | 56 +++++++++ hidl/livedisplay/SunlightEnhancement.h | 50 ++++++++ hidl/livedisplay/service.cpp | 119 ++++++++++++++++++ ...e.livedisplay@2.0-service.universal8895.rc | 7 ++ 13 files changed, 617 insertions(+) create mode 100644 hidl/livedisplay/.clang-format create mode 100644 hidl/livedisplay/AdaptiveBacklight.cpp create mode 100644 hidl/livedisplay/AdaptiveBacklight.h create mode 100644 hidl/livedisplay/Android.bp create mode 100644 hidl/livedisplay/DisplayColorCalibration.cpp create mode 100644 hidl/livedisplay/DisplayColorCalibration.h create mode 100644 hidl/livedisplay/ReadingEnhancement.cpp create mode 100644 hidl/livedisplay/ReadingEnhancement.h create mode 100644 hidl/livedisplay/SunlightEnhancement.cpp create mode 100644 hidl/livedisplay/SunlightEnhancement.h create mode 100644 hidl/livedisplay/service.cpp create mode 100644 hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.universal8895.rc diff --git a/device-common.mk b/device-common.mk index 52e545c..149a19c 100644 --- a/device-common.mk +++ b/device-common.mk @@ -127,6 +127,10 @@ PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \ android.hardware.light@2.0-service.samsung +# Livedisplay +PRODUCT_PACKAGES += \ + vendor.lineage.livedisplay@2.0-service.universal8895 + # Media PRODUCT_COPY_FILES += \ frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \ diff --git a/hidl/livedisplay/.clang-format b/hidl/livedisplay/.clang-format new file mode 100644 index 0000000..ae4a451 --- /dev/null +++ b/hidl/livedisplay/.clang-format @@ -0,0 +1,11 @@ +BasedOnStyle: Google +AccessModifierOffset: -2 +AllowShortFunctionsOnASingleLine: Inline +ColumnLimit: 100 +CommentPragmas: NOLINT:.* +DerivePointerAlignment: false +IndentWidth: 4 +PointerAlignment: Left +TabWidth: 4 +UseTab: Never +PenaltyExcessCharacter: 32 diff --git a/hidl/livedisplay/AdaptiveBacklight.cpp b/hidl/livedisplay/AdaptiveBacklight.cpp new file mode 100644 index 0000000..265cd11 --- /dev/null +++ b/hidl/livedisplay/AdaptiveBacklight.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2019 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. + */ + +#include +#include + +#include + +#include "AdaptiveBacklight.h" + +using android::base::ReadFileToString; +using android::base::Trim; +using android::base::WriteStringToFile; + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +static constexpr const char* kBacklightPath = "/sys/class/lcd/panel/power_reduce"; + +Return AdaptiveBacklight::isEnabled() { + std::string tmp; + int32_t contents = 0; + + if (ReadFileToString(kBacklightPath, &tmp)) { + contents = std::stoi(Trim(tmp)); + } + + return contents > 0; +} + +Return AdaptiveBacklight::setEnabled(bool enabled) { + return WriteStringToFile(enabled ? "1" : "0", kBacklightPath, true); +} + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/hidl/livedisplay/AdaptiveBacklight.h b/hidl/livedisplay/AdaptiveBacklight.h new file mode 100644 index 0000000..87480b2 --- /dev/null +++ b/hidl/livedisplay/AdaptiveBacklight.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2019 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H + +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class AdaptiveBacklight : public IAdaptiveBacklight { + public: + Return isEnabled() override; + Return setEnabled(bool enabled) override; +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H diff --git a/hidl/livedisplay/Android.bp b/hidl/livedisplay/Android.bp new file mode 100644 index 0000000..a646f24 --- /dev/null +++ b/hidl/livedisplay/Android.bp @@ -0,0 +1,37 @@ +// Copyright (C) 2019 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. + +cc_binary { + name: "vendor.lineage.livedisplay@2.0-service.universal8895", + init_rc: ["vendor.lineage.livedisplay@2.0-service.universal8895.rc"], + defaults: ["hidl_defaults"], + relative_install_path: "hw", + vendor: true, + srcs: [ + "AdaptiveBacklight.cpp", + "DisplayColorCalibration.cpp", + "ReadingEnhancement.cpp", + "SunlightEnhancement.cpp", + "service.cpp", + ], + shared_libs: [ + "libbase", + "libbinder", + "libdl", + "libhidlbase", + "libhidltransport", + "libutils", + "vendor.lineage.livedisplay@2.0", + ], +} diff --git a/hidl/livedisplay/DisplayColorCalibration.cpp b/hidl/livedisplay/DisplayColorCalibration.cpp new file mode 100644 index 0000000..ac5554a --- /dev/null +++ b/hidl/livedisplay/DisplayColorCalibration.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2019 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. + */ + +#include +#include + +#include + +#include "DisplayColorCalibration.h" + +using android::base::ReadFileToString; +using android::base::Split; +using android::base::Trim; +using android::base::WriteStringToFile; + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +static constexpr const char* kColorPath = "/sys/class/mdnie/mdnie/sensorRGB"; + +Return DisplayColorCalibration::getMaxValue() { + return 255; +} + +Return DisplayColorCalibration::getMinValue() { + return 1; +} + +Return DisplayColorCalibration::getCalibration(getCalibration_cb resultCb) { + std::vector rgb; + std::string tmp; + + if (ReadFileToString(kColorPath, &tmp)) { + std::vector colors = Split(Trim(tmp), " "); + for (const std::string& color : colors) { + rgb.push_back(std::stoi(color)); + } + } + + resultCb(rgb); + return Void(); +} + +Return DisplayColorCalibration::setCalibration(const hidl_vec& rgb) { + std::string contents; + for (const int32_t& color : rgb) { + contents += std::to_string(color) + " "; + } + return WriteStringToFile(Trim(contents), kColorPath, true); +} + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/hidl/livedisplay/DisplayColorCalibration.h b/hidl/livedisplay/DisplayColorCalibration.h new file mode 100644 index 0000000..cbbbbf2 --- /dev/null +++ b/hidl/livedisplay/DisplayColorCalibration.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H + +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class DisplayColorCalibration : public IDisplayColorCalibration { + public: + Return getMaxValue() override; + Return getMinValue() override; + Return getCalibration(getCalibration_cb resultCb) override; + Return setCalibration(const hidl_vec& rgb) override; +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H diff --git a/hidl/livedisplay/ReadingEnhancement.cpp b/hidl/livedisplay/ReadingEnhancement.cpp new file mode 100644 index 0000000..15aa3e0 --- /dev/null +++ b/hidl/livedisplay/ReadingEnhancement.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2019 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. + */ + +#include +#include + +#include + +#include "ReadingEnhancement.h" + +using android::base::ReadFileToString; +using android::base::Trim; +using android::base::WriteStringToFile; + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +static constexpr const char* kREPath = "/sys/class/mdnie/mdnie/accessibility"; + +Return ReadingEnhancement::isEnabled() { + std::string contents; + + if (ReadFileToString(kREPath, &contents)) { + contents = Trim(contents); + } + + return !contents.compare("Current accessibility : DSI0 : GRAYSCALE") || !contents.compare("4"); +} + +Return ReadingEnhancement::setEnabled(bool enabled) { + return WriteStringToFile(enabled ? "4" : "0", kREPath, true); +} + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/hidl/livedisplay/ReadingEnhancement.h b/hidl/livedisplay/ReadingEnhancement.h new file mode 100644 index 0000000..deed776 --- /dev/null +++ b/hidl/livedisplay/ReadingEnhancement.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2019 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H + +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class ReadingEnhancement : public IReadingEnhancement { + public: + Return isEnabled() override; + Return setEnabled(bool) override; +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H diff --git a/hidl/livedisplay/SunlightEnhancement.cpp b/hidl/livedisplay/SunlightEnhancement.cpp new file mode 100644 index 0000000..0b1827a --- /dev/null +++ b/hidl/livedisplay/SunlightEnhancement.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2019 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. + */ + +#include +#include + +#include + +#include "SunlightEnhancement.h" + +using android::base::ReadFileToString; +using android::base::Trim; +using android::base::WriteStringToFile; + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +static constexpr const char* kLUXPath = "/sys/class/mdnie/mdnie/lux"; + +Return SunlightEnhancement::isEnabled() { + std::string tmp; + int32_t contents = 0; + + if (ReadFileToString(kLUXPath, &tmp)) { + contents = std::stoi(Trim(tmp)); + } + + return contents > 0; +} + +Return SunlightEnhancement::setEnabled(bool enabled) { + /* see drivers/video/fbdev/exynos/decon_7880/panels/mdnie_lite_table*, get_hbm_index */ + return WriteStringToFile(enabled ? "40000" : "0", kLUXPath, true); +} + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/hidl/livedisplay/SunlightEnhancement.h b/hidl/livedisplay/SunlightEnhancement.h new file mode 100644 index 0000000..55ccf67 --- /dev/null +++ b/hidl/livedisplay/SunlightEnhancement.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2019 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H + +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class SunlightEnhancement : public ISunlightEnhancement { + public: + Return isEnabled() override; + Return setEnabled(bool enabled) override; +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H diff --git a/hidl/livedisplay/service.cpp b/hidl/livedisplay/service.cpp new file mode 100644 index 0000000..15931f1 --- /dev/null +++ b/hidl/livedisplay/service.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2019 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. + */ + +#define LOG_TAG "vendor.lineage.livedisplay@2.0-service.universal8895" + +#include +#include +#include + +#include "AdaptiveBacklight.h" +#include "DisplayColorCalibration.h" +#include "ReadingEnhancement.h" +#include "SunlightEnhancement.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; +using android::OK; +using android::sp; +using android::status_t; + +using vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight; +using vendor::lineage::livedisplay::V2_0::IDisplayColorCalibration; +using vendor::lineage::livedisplay::V2_0::implementation::AdaptiveBacklight; +using vendor::lineage::livedisplay::V2_0::implementation::DisplayColorCalibration; +using vendor::lineage::livedisplay::V2_0::implementation::ReadingEnhancement; +using vendor::lineage::livedisplay::V2_0::implementation::SunlightEnhancement; +using vendor::lineage::livedisplay::V2_0::IReadingEnhancement; +using vendor::lineage::livedisplay::V2_0::ISunlightEnhancement; + +int main() { + sp adaptiveBacklight; + sp displayColorCalibration; + sp readingEnhancement; + sp sunlightEnhancement; + status_t status; + + LOG(INFO) << "LiveDisplay HAL service is starting."; + + adaptiveBacklight = new AdaptiveBacklight(); + if (adaptiveBacklight == nullptr) { + LOG(ERROR) + << "Can not create an instance of LiveDisplay HAL AdaptiveBacklight Iface, exiting."; + goto shutdown; + } + + displayColorCalibration = new DisplayColorCalibration(); + if (displayColorCalibration == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayColorCalibration " + "Iface, exiting."; + goto shutdown; + } + + readingEnhancement = new ReadingEnhancement(); + if (readingEnhancement == nullptr) { + LOG(ERROR) + << "Can not create an instance of LiveDisplay HAL ReadingEnhancement Iface, exiting."; + goto shutdown; + } + + sunlightEnhancement = new SunlightEnhancement(); + if (sunlightEnhancement == nullptr) { + LOG(ERROR) + << "Can not create an instance of LiveDisplay HAL SunlightEnhancement Iface, exiting."; + goto shutdown; + } + + configureRpcThreadpool(1, true /*callerWillJoin*/); + + status = adaptiveBacklight->registerAsService(); + if (status != OK) { + LOG(ERROR) << "Could not register service for LiveDisplay HAL AdaptiveBacklight Iface (" + << status << ")"; + goto shutdown; + } + + status = displayColorCalibration->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL DisplayColorCalibration Iface (" + << status << ")"; + goto shutdown; + } + + status = readingEnhancement->registerAsService(); + if (status != OK) { + LOG(ERROR) << "Could not register service for LiveDisplay HAL ReadingEnhancement Iface (" + << status << ")"; + goto shutdown; + } + + status = sunlightEnhancement->registerAsService(); + if (status != OK) { + LOG(ERROR) << "Could not register service for LiveDisplay HAL SunlightEnhancement Iface (" + << status << ")"; + goto shutdown; + } + + LOG(INFO) << "LiveDisplay HAL service is ready."; + joinRpcThreadpool(); + // Should not pass this line + +shutdown: + // In normal operation, we don't expect the thread pool to shutdown + LOG(ERROR) << "LiveDisplay HAL service is shutting down."; + return 1; +} diff --git a/hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.universal8895.rc b/hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.universal8895.rc new file mode 100644 index 0000000..4204684 --- /dev/null +++ b/hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.universal8895.rc @@ -0,0 +1,7 @@ +on post-fs-data + mkdir /data/vendor/display 0770 system system + +service vendor.livedisplay-hal-2-0-universal8895 /vendor/bin/hw/vendor.lineage.livedisplay@2.0-service.universal8895 + class hal + user system + group system \ No newline at end of file -- 2.20.1