From cc4df7383982509e83a18cce6cbe0420ecad83f5 Mon Sep 17 00:00:00 2001 From: Konsta Date: Fri, 28 Jul 2023 16:33:53 +0300 Subject: [PATCH] light: convert to aidl hal * hardware/interfaces/light/aidl/default --- device.mk | 2 +- light/Android.bp | 23 ++--- light/Light.cpp | 93 ------------------- light/Light.h | 56 ----------- light/Lights.cpp | 67 +++++++++++++ light/Lights.h | 33 +++++++ ... => android.hardware.light-service.rpi.rc} | 6 +- light/android.hardware.light-service.rpi.xml | 7 ++ ...android.hardware.light@2.0-service.rpi.xml | 11 --- light/main.cpp | 35 +++++++ light/service.cpp | 63 ------------- sepolicy/file_contexts | 2 +- 12 files changed, 156 insertions(+), 242 deletions(-) delete mode 100644 light/Light.cpp delete mode 100644 light/Light.h create mode 100644 light/Lights.cpp create mode 100644 light/Lights.h rename light/{android.hardware.light@2.0-service.rpi.rc => android.hardware.light-service.rpi.rc} (50%) create mode 100644 light/android.hardware.light-service.rpi.xml delete mode 100644 light/android.hardware.light@2.0-service.rpi.xml create mode 100644 light/main.cpp delete mode 100644 light/service.cpp diff --git a/device.mk b/device.mk index e2c8f2a..41afbb9 100644 --- a/device.mk +++ b/device.mk @@ -202,7 +202,7 @@ PRODUCT_PACKAGES += \ # Lights PRODUCT_PACKAGES += \ - android.hardware.light@2.0-service.rpi + android.hardware.light-service.rpi # Media PRODUCT_COPY_FILES += \ diff --git a/light/Android.bp b/light/Android.bp index 1d2a870..ef7087c 100644 --- a/light/Android.bp +++ b/light/Android.bp @@ -1,24 +1,21 @@ -// Copyright (C) 2018 The LineageOS Project -// Copyright (C) 2021-2022 KonstaKANG +// Copyright (C) 2020 The Android Open Source Project +// Copyright (C) 2023 KonstaKANG // // SPDX-License-Identifier: Apache-2.0 cc_binary { - name: "android.hardware.light@2.0-service.rpi", - init_rc: ["android.hardware.light@2.0-service.rpi.rc"], - vintf_fragments: ["android.hardware.light@2.0-service.rpi.xml"], - proprietary: true, + name: "android.hardware.light-service.rpi", relative_install_path: "hw", + vendor: true, + init_rc: ["android.hardware.light-service.rpi.rc"], + vintf_fragments: ["android.hardware.light-service.rpi.xml"], srcs: [ - "Light.cpp", - "service.cpp", + "Lights.cpp", + "main.cpp", ], shared_libs: [ "libbase", - "libcutils", - "libhardware", - "libhidlbase", - "libutils", - "android.hardware.light@2.0", + "libbinder_ndk", + "android.hardware.light-V2-ndk", ], } diff --git a/light/Light.cpp b/light/Light.cpp deleted file mode 100644 index 07a0906..0000000 --- a/light/Light.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2018 The LineageOS Project - * Copyright (C) 2021-2022 KonstaKANG - * - * 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 "LightService" - -#include "Light.h" - -#include - -namespace { -using android::hardware::light::V2_0::LightState; - -static constexpr int DEFAULT_MAX_BRIGHTNESS = 255; - -static uint32_t rgbToBrightness(const LightState& state) { - uint32_t color = state.color & 0x00ffffff; - return ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + - (29 * (color & 0xff))) >> 8; -} -} // anonymous namespace - -namespace android { -namespace hardware { -namespace light { -namespace V2_0 { -namespace implementation { - -Light::Light(std::pair&& lcd_backlight) - : mLcdBacklight(std::move(lcd_backlight)) { - auto backlightFn(std::bind(&Light::setLcdBacklight, this, std::placeholders::_1)); - mLights.emplace(std::make_pair(Type::BACKLIGHT, backlightFn)); -} - -// Methods from ::android::hardware::light::V2_0::ILight follow. -Return Light::setLight(Type type, const LightState& state) { - auto it = mLights.find(type); - - if (it == mLights.end()) { - return Status::LIGHT_NOT_SUPPORTED; - } - - it->second(state); - - return Status::SUCCESS; -} - -Return Light::getSupportedTypes(getSupportedTypes_cb _hidl_cb) { - std::vector types; - - for (auto const& light : mLights) { - types.push_back(light.first); - } - - _hidl_cb(types); - - return Void(); -} - -void Light::setLcdBacklight(const LightState& state) { - std::lock_guard lock(mLock); - - uint32_t brightness = rgbToBrightness(state); - - // If max panel brightness is not the default (255), - // apply linear scaling across the accepted range. - if (mLcdBacklight.second != DEFAULT_MAX_BRIGHTNESS) { - int old_brightness = brightness; - brightness = brightness * mLcdBacklight.second / DEFAULT_MAX_BRIGHTNESS; - LOG(VERBOSE) << "scaling brightness " << old_brightness << " => " << brightness; - } - - mLcdBacklight.first << brightness << std::endl; -} - -} // namespace implementation -} // namespace V2_0 -} // namespace light -} // namespace hardware -} // namespace android diff --git a/light/Light.h b/light/Light.h deleted file mode 100644 index 601a072..0000000 --- a/light/Light.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2018 The LineageOS Project - * Copyright (C) 2021-2022 KonstaKANG - * - * 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 ANDROID_HARDWARE_LIGHT_V2_0_LIGHT_H -#define ANDROID_HARDWARE_LIGHT_V2_0_LIGHT_H - -#include -#include - -#include -#include -#include - -namespace android { -namespace hardware { -namespace light { -namespace V2_0 { -namespace implementation { - -struct Light : public ILight { - Light(std::pair&& lcd_backlight); - - // Methods from ::android::hardware::light::V2_0::ILight follow. - Return setLight(Type type, const LightState& state) override; - Return getSupportedTypes(getSupportedTypes_cb _hidl_cb) override; - - private: - void setLcdBacklight(const LightState& state); - - std::pair mLcdBacklight; - - std::unordered_map> mLights; - std::mutex mLock; -}; - -} // namespace implementation -} // namespace V2_0 -} // namespace light -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_LIGHT_V2_0_LIGHT_H diff --git a/light/Lights.cpp b/light/Lights.cpp new file mode 100644 index 0000000..987865b --- /dev/null +++ b/light/Lights.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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 "Lights.h" + +#include + +using ::android::base::WriteStringToFile; + +namespace aidl::android::hardware::light { + +static const std::string backlightFiles[] = { + "/sys/class/backlight/rpi_backlight/brightness" +}; + +const static std::vector availableLights = { + {.id = (int)LightType::BACKLIGHT, .type = LightType::BACKLIGHT, .ordinal = 0} +}; + +ndk::ScopedAStatus Lights::setLightState(int id, const HwLightState& state) { + HwLight const& light = availableLights[id]; + std::string const brightness = std::to_string(rgbToBrightness(state)); + + switch (light.type) { + case LightType::BACKLIGHT: + for (auto &file : backlightFiles) { + if (!access(file.c_str(), W_OK)) { + WriteStringToFile(brightness, file); + } + } + break; + default: + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } + + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Lights::getLights(std::vector* lights) { + for (auto i = availableLights.begin(); i != availableLights.end(); i++) { + lights->push_back(*i); + } + + return ndk::ScopedAStatus::ok(); +} + +uint32_t Lights::rgbToBrightness(const HwLightState& state) { + uint32_t color = state.color & 0x00ffffff; + return ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + + (29 * (color & 0xff))) >> 8; +} + +} // aidl::android::hardware::light diff --git a/light/Lights.h b/light/Lights.h new file mode 100644 index 0000000..970aef2 --- /dev/null +++ b/light/Lights.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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. + */ + +#pragma once + +#include + +namespace aidl::android::hardware::light { + +class Lights : public BnLights { +public: + ndk::ScopedAStatus setLightState(int id, const HwLightState& state) override; + ndk::ScopedAStatus getLights(std::vector* types) override; + +private: + uint32_t rgbToBrightness(const HwLightState& state); +}; + +} // aidl::android::hardware::light diff --git a/light/android.hardware.light@2.0-service.rpi.rc b/light/android.hardware.light-service.rpi.rc similarity index 50% rename from light/android.hardware.light@2.0-service.rpi.rc rename to light/android.hardware.light-service.rpi.rc index 42eecc2..85518a7 100644 --- a/light/android.hardware.light@2.0-service.rpi.rc +++ b/light/android.hardware.light-service.rpi.rc @@ -1,11 +1,9 @@ -on init +on early-boot chown system system /sys/class/backlight/rpi_backlight/brightness chmod 660 /sys/class/backlight/rpi_backlight/brightness -service vendor.light-hal-2-0 /vendor/bin/hw/android.hardware.light@2.0-service.rpi - interface android.hardware.light@2.0::ILight default +service vendor.light-default /vendor/bin/hw/android.hardware.light-service.rpi class hal user system group system - # shutting off lights while powering-off shutdown critical diff --git a/light/android.hardware.light-service.rpi.xml b/light/android.hardware.light-service.rpi.xml new file mode 100644 index 0000000..abdd74e --- /dev/null +++ b/light/android.hardware.light-service.rpi.xml @@ -0,0 +1,7 @@ + + + android.hardware.light + 2 + ILights/default + + diff --git a/light/android.hardware.light@2.0-service.rpi.xml b/light/android.hardware.light@2.0-service.rpi.xml deleted file mode 100644 index 6bf62e9..0000000 --- a/light/android.hardware.light@2.0-service.rpi.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - android.hardware.light - hwbinder - 2.0 - - ILight - default - - - diff --git a/light/main.cpp b/light/main.cpp new file mode 100644 index 0000000..a860bf4 --- /dev/null +++ b/light/main.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2020 The Android Open Source 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 "Lights.h" + +#include +#include +#include + +using ::aidl::android::hardware::light::Lights; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr lights = ndk::SharedRefBase::make(); + + const std::string instance = std::string() + Lights::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(lights->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reached +} diff --git a/light/service.cpp b/light/service.cpp deleted file mode 100644 index fa6daa4..0000000 --- a/light/service.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2018 The LineageOS Project - * Copyright (C) 2021-2022 KonstaKANG - * - * 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 "android.hardware.light@2.0-service.rpi" - -#include -#include -#include - -#include "Light.h" - -// libhwbinder: -using android::hardware::configureRpcThreadpool; -using android::hardware::joinRpcThreadpool; - -// Generated HIDL files -using android::hardware::light::V2_0::ILight; -using android::hardware::light::V2_0::implementation::Light; - -const static std::string kLcdBacklightPath = "/sys/class/backlight/rpi_backlight/brightness"; - -int main() { - uint32_t lcdMaxBrightness = 255; - - std::ofstream lcdBacklight(kLcdBacklightPath); - if (!lcdBacklight) { - LOG(ERROR) << "Failed to open " << kLcdBacklightPath << ", error=" << errno - << " (" << strerror(errno) << ")"; - //return -errno; - } - - android::sp service = new Light( - {std::move(lcdBacklight), lcdMaxBrightness}); - - configureRpcThreadpool(1, true); - - android::status_t status = service->registerAsService(); - - if (status != android::OK) { - LOG(ERROR) << "Cannot register Light HAL service"; - //return 1; - } - - LOG(INFO) << "Light HAL Ready."; - joinRpcThreadpool(); - // Under normal cases, execution will not reach this line. - LOG(ERROR) << "Light HAL failed to join thread pool."; - return 1; -} diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts index b11f556..7933e00 100644 --- a/sepolicy/file_contexts +++ b/sepolicy/file_contexts @@ -36,7 +36,7 @@ # Lights /sys/class/backlight/rpi_backlight/brightness u:object_r:sysfs_leds:s0 /sys/devices/platform/rpi_backlight/backlight/rpi_backlight/brightness u:object_r:sysfs_leds:s0 -/vendor/bin/hw/android\.hardware\.light@2\.0-service.rpi u:object_r:hal_light_default_exec:s0 +/vendor/bin/hw/android\.hardware\.light-service\.rpi u:object_r:hal_light_default_exec:s0 # Partitions /dev/block/mmcblk0p1 u:object_r:boot_block_device:s0