universal8895: Implement custom LiveDisplay HIDL
authorPaul Keith <javelinanddart@gmail.com>
Sun, 2 Jun 2019 02:41:21 +0000 (04:41 +0200)
committerJan Altensen <info@stricted.net>
Sun, 19 Jan 2020 07:53:14 +0000 (08:53 +0100)
Change-Id: I8da4954abeba47f6abbd7526502f3521257034fa

13 files changed:
device-common.mk
hidl/livedisplay/.clang-format [new file with mode: 0644]
hidl/livedisplay/AdaptiveBacklight.cpp [new file with mode: 0644]
hidl/livedisplay/AdaptiveBacklight.h [new file with mode: 0644]
hidl/livedisplay/Android.bp [new file with mode: 0644]
hidl/livedisplay/DisplayColorCalibration.cpp [new file with mode: 0644]
hidl/livedisplay/DisplayColorCalibration.h [new file with mode: 0644]
hidl/livedisplay/ReadingEnhancement.cpp [new file with mode: 0644]
hidl/livedisplay/ReadingEnhancement.h [new file with mode: 0644]
hidl/livedisplay/SunlightEnhancement.cpp [new file with mode: 0644]
hidl/livedisplay/SunlightEnhancement.h [new file with mode: 0644]
hidl/livedisplay/service.cpp [new file with mode: 0644]
hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.universal8895.rc [new file with mode: 0644]

index 52e545cb1886150e807a498a61f2cc4b60501fd0..149a19c614357b21c7b6f2ca90f43baf53a6b3ba 100644 (file)
@@ -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 (file)
index 0000000..ae4a451
--- /dev/null
@@ -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 (file)
index 0000000..265cd11
--- /dev/null
@@ -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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#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<bool> AdaptiveBacklight::isEnabled() {
+    std::string tmp;
+    int32_t contents = 0;
+
+    if (ReadFileToString(kBacklightPath, &tmp)) {
+        contents = std::stoi(Trim(tmp));
+    }
+
+    return contents > 0;
+}
+
+Return<bool> 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 (file)
index 0000000..87480b2
--- /dev/null
@@ -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 <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/IAdaptiveBacklight.h>
+
+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<bool> isEnabled() override;
+    Return<bool> 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 (file)
index 0000000..a646f24
--- /dev/null
@@ -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 (file)
index 0000000..ac5554a
--- /dev/null
@@ -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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#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<int32_t> DisplayColorCalibration::getMaxValue() {
+    return 255;
+}
+
+Return<int32_t> DisplayColorCalibration::getMinValue() {
+    return 1;
+}
+
+Return<void> DisplayColorCalibration::getCalibration(getCalibration_cb resultCb) {
+    std::vector<int32_t> rgb;
+    std::string tmp;
+
+    if (ReadFileToString(kColorPath, &tmp)) {
+        std::vector<std::string> colors = Split(Trim(tmp), " ");
+        for (const std::string& color : colors) {
+            rgb.push_back(std::stoi(color));
+        }
+    }
+
+    resultCb(rgb);
+    return Void();
+}
+
+Return<bool> DisplayColorCalibration::setCalibration(const hidl_vec<int32_t>& 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 (file)
index 0000000..cbbbbf2
--- /dev/null
@@ -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 <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/IDisplayColorCalibration.h>
+
+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<int32_t> getMaxValue() override;
+    Return<int32_t> getMinValue() override;
+    Return<void> getCalibration(getCalibration_cb resultCb) override;
+    Return<bool> setCalibration(const hidl_vec<int32_t>& 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 (file)
index 0000000..15aa3e0
--- /dev/null
@@ -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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#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<bool> ReadingEnhancement::isEnabled() {
+    std::string contents;
+
+    if (ReadFileToString(kREPath, &contents)) {
+        contents = Trim(contents);
+    }
+
+    return !contents.compare("Current accessibility : DSI0 : GRAYSCALE") || !contents.compare("4");
+}
+
+Return<bool> 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 (file)
index 0000000..deed776
--- /dev/null
@@ -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 <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/IReadingEnhancement.h>
+
+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<bool> isEnabled() override;
+    Return<bool> 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 (file)
index 0000000..0b1827a
--- /dev/null
@@ -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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#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<bool> SunlightEnhancement::isEnabled() {
+    std::string tmp;
+    int32_t contents = 0;
+
+    if (ReadFileToString(kLUXPath, &tmp)) {
+        contents = std::stoi(Trim(tmp));
+    }
+
+    return contents > 0;
+}
+
+Return<bool> 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 (file)
index 0000000..55ccf67
--- /dev/null
@@ -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 <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/ISunlightEnhancement.h>
+
+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<bool> isEnabled() override;
+    Return<bool> 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 (file)
index 0000000..15931f1
--- /dev/null
@@ -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 <android-base/logging.h>
+#include <binder/ProcessState.h>
+#include <hidl/HidlTransportSupport.h>
+
+#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<IAdaptiveBacklight> adaptiveBacklight;
+    sp<IDisplayColorCalibration> displayColorCalibration;
+    sp<IReadingEnhancement> readingEnhancement;
+    sp<ISunlightEnhancement> 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 (file)
index 0000000..4204684
--- /dev/null
@@ -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