From 84b8328a011f359a111fb3a2fb6c6562cad79ea1 Mon Sep 17 00:00:00 2001 From: roynatech2544 Date: Fri, 19 Nov 2021 11:32:20 +0900 Subject: [PATCH] universal7885: import light HAL from hardware/samsung * Added .clang-format symlink * Undefine non-existent nodes in header file Signed-off-by: roynatech2544 --- universal7885-common/.clang-format | 1 + universal7885-common/light/Android.bp | 20 ++ universal7885-common/light/Light.cpp | 212 ++++++++++++++++++ universal7885-common/light/Light.h | 76 +++++++ ...droid.hardware.light@2.0-service.eureka.rc | 7 + ...roid.hardware.light@2.0-service.eureka.xml | 11 + universal7885-common/light/samsung_lights.h | 54 +++++ universal7885-common/light/service.cpp | 54 +++++ .../sepolicy/vendor/file_contexts | 2 +- .../sepolicy/vendor/genfs_contexts | 1 + universal7885-common/vintf/manifest.xml | 9 - 11 files changed, 437 insertions(+), 10 deletions(-) create mode 120000 universal7885-common/.clang-format create mode 100644 universal7885-common/light/Android.bp create mode 100644 universal7885-common/light/Light.cpp create mode 100644 universal7885-common/light/Light.h create mode 100644 universal7885-common/light/android.hardware.light@2.0-service.eureka.rc create mode 100644 universal7885-common/light/android.hardware.light@2.0-service.eureka.xml create mode 100644 universal7885-common/light/samsung_lights.h create mode 100644 universal7885-common/light/service.cpp diff --git a/universal7885-common/.clang-format b/universal7885-common/.clang-format new file mode 120000 index 0000000..973b2fa --- /dev/null +++ b/universal7885-common/.clang-format @@ -0,0 +1 @@ +../../../build/soong/scripts/system-clang-format \ No newline at end of file diff --git a/universal7885-common/light/Android.bp b/universal7885-common/light/Android.bp new file mode 100644 index 0000000..361d06f --- /dev/null +++ b/universal7885-common/light/Android.bp @@ -0,0 +1,20 @@ +cc_binary { + name: "android.hardware.light@2.0-service.eureka", + relative_install_path: "hw", + init_rc: ["android.hardware.light@2.0-service.eureka.rc"], + vintf_fragments: ["android.hardware.light@2.0-service.eureka.xml"], + vendor: true, + shared_libs: [ + "libbase", + "libhardware", + "libhidlbase", + "libutils", + "liblog", + "android.hardware.light@2.0", + ], + srcs: [ + "Light.cpp", + "service.cpp", + ], +} + diff --git a/universal7885-common/light/Light.cpp b/universal7885-common/light/Light.cpp new file mode 100644 index 0000000..139a449 --- /dev/null +++ b/universal7885-common/light/Light.cpp @@ -0,0 +1,212 @@ +/* + * 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 "android.hardware.light@2.0-service.eureka" + +#include +#include +#include +#include + +#include "Light.h" + +#define COLOR_MASK 0x00ffffff +#define MAX_INPUT_BRIGHTNESS 255 + +using android::hardware::light::V2_0::LightState; +using android::hardware::light::V2_0::Status; +using android::hardware::light::V2_0::Type; + +namespace android { +namespace hardware { +namespace light { +namespace V2_0 { +namespace implementation { + +/* + * Write value to path and close file. + */ +template +static void set(const std::string& path, const T& value) { + std::ofstream file(path); + file << value << std::endl; +} + +template +static T get(const std::string& path, const T& def) { + std::ifstream file(path); + T result; + + file >> result; + return file.fail() ? def : result; +} + +template +static T exist(const std::string& path) { + struct stat buffer; + return (stat (name.c_str(), &buffer) == 0); +} + +Light::Light() { + mLights.emplace(Type::BACKLIGHT, + std::bind(&Light::handleBacklight, this, std::placeholders::_1)); +#ifdef BUTTON_BRIGHTNESS_NODE + mLights.emplace(Type::BUTTONS, std::bind(&Light::handleButtons, this, std::placeholders::_1)); +#endif /* BUTTON_BRIGHTNESS_NODE */ +#ifdef LED_BLINK_NODE + mLights.emplace(Type::BATTERY, std::bind(&Light::handleBattery, this, std::placeholders::_1)); + mLights.emplace(Type::NOTIFICATIONS, + std::bind(&Light::handleNotifications, this, std::placeholders::_1)); + mLights.emplace(Type::ATTENTION, + std::bind(&Light::handleAttention, this, std::placeholders::_1)); +#endif /* LED_BLINK_NODE */ +} + +Return Light::setLight(Type type, const LightState& state) { + auto it = mLights.find(type); + + if (it == mLights.end()) { + return Status::LIGHT_NOT_SUPPORTED; + } + + /* + * Lock global mutex until light state is updated. + */ + std::lock_guard lock(mLock); + + it->second(state); + + return Status::SUCCESS; +} + +void Light::handleBacklight(const LightState& state) { + uint32_t max_brightness = get(PANEL_MAX_BRIGHTNESS_NODE, MAX_INPUT_BRIGHTNESS); + uint32_t brightness = rgbToBrightness(state); + + if (max_brightness != MAX_INPUT_BRIGHTNESS) { + brightness = brightness * max_brightness / MAX_INPUT_BRIGHTNESS; + } + set(PANEL_BRIGHTNESS_NODE, brightness); +} + +#ifdef BUTTON_BRIGHTNESS_NODE +void Light::handleButtons(const LightState& state) { +#ifdef VAR_BUTTON_BRIGHTNESS + uint32_t brightness = rgbToBrightness(state); +#else + uint32_t brightness = (state.color & COLOR_MASK) ? 1 : 0; +#endif + + set(BUTTON_BRIGHTNESS_NODE, brightness); +} +#endif + +#ifdef LED_BLINK_NODE +void Light::handleBattery(const LightState& state) { + mBatteryState = state; + setNotificationLED(); +} + +void Light::handleNotifications(const LightState& state) { + mNotificationState = state; + setNotificationLED(); +} + +void Light::handleAttention(const LightState& state) { + mAttentionState = state; + setNotificationLED(); +} + +void Light::setNotificationLED() { + int32_t adjusted_brightness = MAX_INPUT_BRIGHTNESS; + LightState state; +#ifdef LED_BLN_NODE + bool bln = false; +#endif /* LED_BLN_NODE */ + + if (mNotificationState.color & COLOR_MASK) { + adjusted_brightness = LED_BRIGHTNESS_NOTIFICATION; + state = mNotificationState; +#ifdef LED_BLN_NODE + bln = true; +#endif /* LED_BLN_NODE */ + } else if (mAttentionState.color & COLOR_MASK) { + adjusted_brightness = LED_BRIGHTNESS_ATTENTION; + state = mAttentionState; + if (state.flashMode == Flash::HARDWARE) { + if (state.flashOnMs > 0 && state.flashOffMs == 0) state.flashMode = Flash::NONE; + state.color = 0x000000ff; + } + if (state.flashMode == Flash::NONE) { + state.color = 0; + } + } else if (mBatteryState.color & COLOR_MASK) { + adjusted_brightness = LED_BRIGHTNESS_BATTERY; + state = mBatteryState; + } else { + set(LED_BLINK_NODE, "0x00000000 0 0"); + return; + } + + if (state.flashMode == Flash::NONE) { + state.flashOnMs = 0; + state.flashOffMs = 0; + } + + state.color = calibrateColor(state.color & COLOR_MASK, adjusted_brightness); + set(LED_BLINK_NODE, android::base::StringPrintf("0x%08x %d %d", state.color, state.flashOnMs, + state.flashOffMs)); + +#ifdef LED_BLN_NODE + if (bln) { + set(LED_BLN_NODE, (state.color & COLOR_MASK) ? 1 : 0); + } +#endif /* LED_BLN_NODE */ +} + +uint32_t Light::calibrateColor(uint32_t color, int32_t brightness) { + uint32_t red = ((color >> 16) & 0xFF) * LED_ADJUSTMENT_R; + uint32_t green = ((color >> 8) & 0xFF) * LED_ADJUSTMENT_G; + uint32_t blue = (color & 0xFF) * LED_ADJUSTMENT_B; + + return (((red * brightness) / 255) << 16) + (((green * brightness) / 255) << 8) + + ((blue * brightness) / 255); +} +#endif /* LED_BLINK_NODE */ + +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(); +} + +uint32_t Light::rgbToBrightness(const LightState& state) { + uint32_t color = state.color & COLOR_MASK; + + return ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + (29 * (color & 0xff))) >> + 8; +} + +} // namespace implementation +} // namespace V2_0 +} // namespace light +} // namespace hardware +} // namespace android diff --git a/universal7885-common/light/Light.h b/universal7885-common/light/Light.h new file mode 100644 index 0000000..a318e15 --- /dev/null +++ b/universal7885-common/light/Light.h @@ -0,0 +1,76 @@ +/* + * 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 ANDROID_HARDWARE_LIGHT_V2_0_LIGHT_H +#define ANDROID_HARDWARE_LIGHT_V2_0_LIGHT_H + +#include +#include +#include +#include +#include +#include "samsung_lights.h" + +namespace android { +namespace hardware { +namespace light { +namespace V2_0 { +namespace implementation { + +using ::android::sp; +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; + +struct Light : public ILight { + Light(); + + Return setLight(Type type, const LightState& state) override; + Return getSupportedTypes(getSupportedTypes_cb _hidl_cb) override; + + private: + void handleBacklight(const LightState& state); +#ifdef BUTTON_BRIGHTNESS_NODE + void handleButtons(const LightState& state); +#endif /* BUTTON_BRIGHTNESS_NODE */ +#ifdef LED_BLINK_NODE + void handleBattery(const LightState& state); + void handleNotifications(const LightState& state); + void handleAttention(const LightState& state); + void setNotificationLED(); + uint32_t calibrateColor(uint32_t color, int32_t brightness); + + LightState mAttentionState; + LightState mBatteryState; + LightState mNotificationState; +#endif /* LED_BLINK_NODE */ + + uint32_t rgbToBrightness(const LightState& state); + + std::mutex mLock; + std::unordered_map> mLights; +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace light +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_LIGHT_V2_0_LIGHT_H diff --git a/universal7885-common/light/android.hardware.light@2.0-service.eureka.rc b/universal7885-common/light/android.hardware.light@2.0-service.eureka.rc new file mode 100644 index 0000000..b6cc756 --- /dev/null +++ b/universal7885-common/light/android.hardware.light@2.0-service.eureka.rc @@ -0,0 +1,7 @@ +service vendor.light-hal-2-0 /vendor/bin/hw/android.hardware.light@2.0-service.eureka + interface android.hardware.light@2.0::ILight default + class hal + user system + group system + # shutting off lights while powering-off + shutdown critical diff --git a/universal7885-common/light/android.hardware.light@2.0-service.eureka.xml b/universal7885-common/light/android.hardware.light@2.0-service.eureka.xml new file mode 100644 index 0000000..6bf62e9 --- /dev/null +++ b/universal7885-common/light/android.hardware.light@2.0-service.eureka.xml @@ -0,0 +1,11 @@ + + + android.hardware.light + hwbinder + 2.0 + + ILight + default + + + diff --git a/universal7885-common/light/samsung_lights.h b/universal7885-common/light/samsung_lights.h new file mode 100644 index 0000000..d20c7ae --- /dev/null +++ b/universal7885-common/light/samsung_lights.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * Copyright (C) 2017 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 SAMSUNG_LIGHTS_H +#define SAMSUNG_LIGHTS_H + +/* + * Board specific nodes + * + * If your kernel exposes these controls in another place, you can either + * symlink to the locations given here, or override this header in your + * device tree. + */ +#define PANEL_BRIGHTNESS_NODE "/sys/class/backlight/panel/brightness" +#define PANEL_MAX_BRIGHTNESS_NODE "/sys/class/backlight/panel/max_brightness" +// Uncomment to enable variable button brightness +//#define VAR_BUTTON_BRIGHTNESS 1 + +/* + * Brightness adjustment factors + * + * If one of your device's LEDs is more powerful than the others, use these + * values to equalise them. This value is in the range 0.0-1.0. + */ +#define LED_ADJUSTMENT_R 1.0 +#define LED_ADJUSTMENT_G 1.0 +#define LED_ADJUSTMENT_B 1.0 + +/* + * Light brightness factors + * + * It might make sense for all colours to be scaled down (for example, if your + * LED is too bright). Use these values to adjust the brightness of each + * light. This value is within the range 0-255. + */ +#define LED_BRIGHTNESS_BATTERY 255 +#define LED_BRIGHTNESS_NOTIFICATION 255 +#define LED_BRIGHTNESS_ATTENTION 255 + +#endif // SAMSUNG_LIGHTS_H diff --git a/universal7885-common/light/service.cpp b/universal7885-common/light/service.cpp new file mode 100644 index 0000000..5cc0855 --- /dev/null +++ b/universal7885-common/light/service.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. + */ + +#define LOG_TAG "android.hardware.light@2.0-service.samsung" + +#include +#include +#include + +#include "Light.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; + +using android::hardware::light::V2_0::ILight; +using android::hardware::light::V2_0::implementation::Light; + +using android::OK; +using android::sp; +using android::status_t; + +int main() { + sp light = new Light(); + + configureRpcThreadpool(1, true); + + status_t status = light->registerAsService(); + + if (status != OK) { + LOG(ERROR) << "Could not register service for Light HAL"; + goto shutdown; + } + + LOG(INFO) << "Light HAL service is Ready."; + joinRpcThreadpool(); + +shutdown: + // In normal operation, we don't expect the thread pool to shutdown + LOG(ERROR) << "Light HAL failed to join thread pool."; + return 1; +} diff --git a/universal7885-common/sepolicy/vendor/file_contexts b/universal7885-common/sepolicy/vendor/file_contexts index 970119b..1069acb 100644 --- a/universal7885-common/sepolicy/vendor/file_contexts +++ b/universal7885-common/sepolicy/vendor/file_contexts @@ -136,7 +136,7 @@ /(vendor|system/vendor)/bin/secril_config_svc u:object_r:secril_config_svc_exec:s0 /(vendor|system/vendor)/bin/hw/android\.hardware\.biometrics\.fingerprint@[0-9].[0-9]-service\.samsung u:object_r:hal_fingerprint_default_exec:s0 -/(vendor|system/vendor)/bin/hw/android\.hardware\.light@[0-9].[0-9]-service\.samsung u:object_r:hal_light_default_exec:s0 +/(vendor|system/vendor)/bin/hw/android\.hardware\.light@[0-9].[0-9]-service\.eureka u:object_r:hal_light_default_exec:s0 /(vendor|system/vendor)/bin/hw/android\.hardware\.thermal@[0-9].[0-9]-service\.samsung u:object_r:hal_thermal_default_exec:s0 #################################### diff --git a/universal7885-common/sepolicy/vendor/genfs_contexts b/universal7885-common/sepolicy/vendor/genfs_contexts index fcd678c..732ab15 100644 --- a/universal7885-common/sepolicy/vendor/genfs_contexts +++ b/universal7885-common/sepolicy/vendor/genfs_contexts @@ -167,3 +167,4 @@ genfscon sysfs /firmware/devicetree/base/model_info-system_rev genfscon sysfs /kernel/gpu/ u:object_r:sysfs_gpu:s0 genfscon sysfs /kernel/gpu/gpu_max_clock u:object_r:sysfs_gpu_writable:s0 genfscon sysfs /kernel/gpu/gpu_min_clock u:object_r:sysfs_gpu_writable:s0 + diff --git a/universal7885-common/vintf/manifest.xml b/universal7885-common/vintf/manifest.xml index b005aba..a4fbe63 100644 --- a/universal7885-common/vintf/manifest.xml +++ b/universal7885-common/vintf/manifest.xml @@ -124,15 +124,6 @@ default - - android.hardware.light - hwbinder - 2.0 - - ILight - default - - android.hardware.media.omx hwbinder