diff --git a/agnos-kernel-sdm845 b/agnos-kernel-sdm845 index b75f6c2..00fee24 160000 --- a/agnos-kernel-sdm845 +++ b/agnos-kernel-sdm845 @@ -1 +1 @@ -Subproject commit b75f6c29a465df469e2d464defef4e896f1c4bf1 +Subproject commit 00fee24ee252416d0ad6216c735dd51438e0886f diff --git a/userspace/files/94-backlight.rules b/userspace/files/94-backlight.rules index 2007810..7ec5bcd 100644 --- a/userspace/files/94-backlight.rules +++ b/userspace/files/94-backlight.rules @@ -2,3 +2,5 @@ ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="panel0-backlight", RUN+="/bin/ch ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="panel0-backlight", RUN+="/bin/chmod g+w /sys/class/backlight/%k/brightness" ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="panel0-backlight", RUN+="/bin/chgrp video /sys/class/backlight/%k/bl_power" ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="panel0-backlight", RUN+="/bin/chmod g+w /sys/class/backlight/%k/bl_power" +ACTION=="add", SUBSYSTEM=="platform", KERNEL=="soc:qcom,dsi-display@0", RUN+="/bin/chgrp video /sys/devices/platform/soc/%k/max_brightness_percent" +ACTION=="add", SUBSYSTEM=="platform", KERNEL=="soc:qcom,dsi-display@0", RUN+="/bin/chmod g+w /sys/devices/platform/soc/%k/max_brightness_percent" diff --git a/userspace/files/brightnessd.service b/userspace/files/brightnessd.service new file mode 100644 index 0000000..a749c26 --- /dev/null +++ b/userspace/files/brightnessd.service @@ -0,0 +1,9 @@ +[Unit] +Description=Limit display brightness with uptime + +[Service] +Restart=always +ExecStart=/usr/local/pyenv/shims/python -u /usr/comma/brightnessd.py + +[Install] +WantedBy=multi-user.target diff --git a/userspace/services.sh b/userspace/services.sh index a33a1e5..9778c58 100755 --- a/userspace/services.sh +++ b/userspace/services.sh @@ -17,6 +17,7 @@ systemctl enable weston.service systemctl enable wifi.service systemctl enable init-qcom.service systemctl enable power_drop_monitor.service +systemctl enable brightnessd.service systemctl enable ssh-param-watcher.path systemctl enable ssh-param-watcher.service systemctl enable home.mount diff --git a/userspace/usr/comma/brightnessd.py b/userspace/usr/comma/brightnessd.py new file mode 100755 index 0000000..1b7c72c --- /dev/null +++ b/userspace/usr/comma/brightnessd.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +import time + +# limit display brightness with display uptime to prevent burn in + +BL_OFF = 4 +BL_POWER_PATH = "/sys/class/backlight/panel0-backlight/bl_power" +BRIGHTNESS_PATH = "/sys/class/backlight/panel0-backlight/brightness" +MAX_BRIGHTNESS_PATH= "/sys/devices/platform/soc/soc:qcom,dsi-display@0/max_brightness_percent" + +MAX_PERCENT = 90 +MIN_PERCENT = 30 +HOURLY_PERC_DECREASE = 5 + +def read(path: str) -> int: + try: + with open(path) as f: + return int(f.read()) + except Exception: + return 0 + + +if __name__ == "__main__": + + last_perc = None + last_off_ts = time.monotonic() + + while True: + try: + # sample brightness and backlight power + bl_power = read(BL_POWER_PATH) + brightness = read(BRIGHTNESS_PATH) + if bl_power == BL_OFF or brightness == 0: + last_off_ts = time.monotonic() + + # calculate new max + uptime_hours = (time.monotonic() - last_off_ts) / 60*60 + clipped_perc = MAX_PERCENT - (HOURLY_PERC_DECREASE*uptime_hours) + clipped_perc = int(max(min(clipped_perc, MAX_PERCENT), MIN_PERCENT)) + + if clipped_perc != last_perc: + with open(MAX_BRIGHTNESS_PATH, 'w') as f: + f.write(f"{int(clipped_perc)}\n") + last_perc = clipped_perc + except Exception: + pass + + time.sleep(5)