From 2da72530137ea5859a320b40e038a9d067722904 Mon Sep 17 00:00:00 2001 From: Konsta Date: Thu, 30 Jan 2025 22:41:25 +0200 Subject: [PATCH] lights: boot: use DSI panel regulator driver * Old rpi_backlight driver is no longer used on recent kernel versions. Regulator driver is used for backlight instead. * Change the backlight path and implement scaling to support the official Raspberry Pi 7" DSI Touch Display & Touch Display 2. * The original Touch Display has max brightness of 255 while the new Touch Display 2 has 31. --- boot/config.txt | 2 +- light/Lights.cpp | 34 ++++++++++++++------- light/Lights.h | 5 ++- light/android.hardware.light-service.rpi.rc | 6 ++-- sepolicy/file_contexts | 4 +-- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/boot/config.txt b/boot/config.txt index ae32a93..983a178 100644 --- a/boot/config.txt +++ b/boot/config.txt @@ -13,7 +13,7 @@ disable_overscan=1 # Display panel #dtoverlay=vc4-kms-dsi-7inch -#dtoverlay=rpi-backlight +#dtoverlay=vc4-kms-dsi-ili9881-7inch # Graphics acceleration dtoverlay=vc4-kms-v3d diff --git a/light/Lights.cpp b/light/Lights.cpp index 987865b..f4e3d65 100644 --- a/light/Lights.cpp +++ b/light/Lights.cpp @@ -19,28 +19,39 @@ #include +using ::android::base::ReadFileToString; using ::android::base::WriteStringToFile; namespace aidl::android::hardware::light { -static const std::string backlightFiles[] = { - "/sys/class/backlight/rpi_backlight/brightness" -}; +static const uint32_t defaultMaxBrightness = 255; -const static std::vector availableLights = { +static const std::string backlightBrightnessPath = "/sys/class/backlight/11-0045/brightness"; +static const std::string backlightMaxBrightnessPath = "/sys/class/backlight/11-0045/max_brightness"; + +static const std::vector availableLights = { {.id = (int)LightType::BACKLIGHT, .type = LightType::BACKLIGHT, .ordinal = 0} }; +Lights::Lights() { + maxBrightness = defaultMaxBrightness; + + if (!access(backlightMaxBrightnessPath.c_str(), R_OK)) { + std::string maxBrightnessValue; + if (ReadFileToString(backlightMaxBrightnessPath, &maxBrightnessValue)) { + maxBrightness = std::stoi(maxBrightnessValue); + } + } +} + ndk::ScopedAStatus Lights::setLightState(int id, const HwLightState& state) { HwLight const& light = availableLights[id]; - std::string const brightness = std::to_string(rgbToBrightness(state)); + std::string const brightness = std::to_string(rgbToScaledBrightness(state, maxBrightness)); switch (light.type) { case LightType::BACKLIGHT: - for (auto &file : backlightFiles) { - if (!access(file.c_str(), W_OK)) { - WriteStringToFile(brightness, file); - } + if (!access(backlightBrightnessPath.c_str(), W_OK)) { + WriteStringToFile(brightness, backlightBrightnessPath); } break; default: @@ -58,10 +69,11 @@ ndk::ScopedAStatus Lights::getLights(std::vector* lights) { return ndk::ScopedAStatus::ok(); } -uint32_t Lights::rgbToBrightness(const HwLightState& state) { +uint32_t Lights::rgbToScaledBrightness(const HwLightState& state, uint32_t maxBrightness) { uint32_t color = state.color & 0x00ffffff; - return ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + + uint32_t brightness = ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + (29 * (color & 0xff))) >> 8; + return brightness * maxBrightness / 0xff; } } // aidl::android::hardware::light diff --git a/light/Lights.h b/light/Lights.h index 970aef2..dc44ac6 100644 --- a/light/Lights.h +++ b/light/Lights.h @@ -23,11 +23,14 @@ namespace aidl::android::hardware::light { class Lights : public BnLights { public: + Lights(); + ndk::ScopedAStatus setLightState(int id, const HwLightState& state) override; ndk::ScopedAStatus getLights(std::vector* types) override; private: - uint32_t rgbToBrightness(const HwLightState& state); + uint32_t maxBrightness; + uint32_t rgbToScaledBrightness(const HwLightState& state, uint32_t maxBrightness); }; } // aidl::android::hardware::light diff --git a/light/android.hardware.light-service.rpi.rc b/light/android.hardware.light-service.rpi.rc index 85518a7..427d0ea 100644 --- a/light/android.hardware.light-service.rpi.rc +++ b/light/android.hardware.light-service.rpi.rc @@ -1,6 +1,8 @@ on early-boot - chown system system /sys/class/backlight/rpi_backlight/brightness - chmod 660 /sys/class/backlight/rpi_backlight/brightness + chown system system /sys/class/backlight/11-0045/brightness + chown system system /sys/class/backlight/11-0045/max_brightness + chmod 660 /sys/class/backlight/11-0045/brightness + chmod 440 /sys/class/backlight/11-0045/max_brightness service vendor.light-default /vendor/bin/hw/android.hardware.light-service.rpi class hal diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts index e220a4a..68dc7fb 100644 --- a/sepolicy/file_contexts +++ b/sepolicy/file_contexts @@ -38,8 +38,8 @@ /vendor/bin/hw/android\.hardware\.health-service\.rpi u:object_r:hal_health_default_exec:s0 # 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 +/sys/class/backlight/11-0045/brightness u:object_r:sysfs_leds:s0 +/sys/class/backlight/11-0045/max_brightness u:object_r:sysfs_leds:s0 /vendor/bin/hw/android\.hardware\.light-service\.rpi u:object_r:hal_light_default_exec:s0 # Partitions