rockbox/firmware/target/hosted/backlight-unix.c
Roman Artiukhin 7bc856046b hiby: backlight: use framebuffer blanking instead of PWM on hosted targets
This enables deeper sleep. On touchscreen devices (HiBy R1) it shuts down both screen and touch (touchscreen needs few seconds before it's actually disabled)

Change-Id: I5e8a7dae840227ddf4433daa461cc7124db7676a
2026-01-19 14:23:07 -05:00

126 lines
3.5 KiB
C

/***************************************************************************
* __________ __ ___
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2017 Marcin Bukat
* Copyright (C) 2019 by Roman Stolyarov
* Copyright (C) 2025 by Melissa Autumn
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include "config.h"
#include "backlight-target.h"
#include "sysfs.h"
#include "panic.h"
#include "lcd.h"
#if defined(BACKLIGHT_RG_NANO)
static const char * const sysfs_bl_brightness =
"/sys/class/backlight/backlight/brightness";
static const char * const sysfs_bl_power =
"/sys/class/backlight/backlight/bl_power";
#elif defined(BACKLIGHT_HIBY)
static const char * const sysfs_bl_brightness =
"/sys/class/backlight/backlight_pwm0/brightness";
static const char * const sysfs_bl_power =
/* Framebuffer powers off both touch (if available) and screen */
"/sys/class/graphics/fb0/blank";
#else
static const char * const sysfs_bl_brightness =
"/sys/class/backlight/pwm-backlight.0/brightness";
static const char * const sysfs_bl_power =
"/sys/class/backlight/pwm-backlight.0/bl_power";
#endif
bool backlight_hw_init(void)
{
backlight_hw_on();
backlight_hw_brightness(DEFAULT_BRIGHTNESS_SETTING);
#ifdef HAVE_BUTTON_LIGHT
buttonlight_hw_on();
#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
buttonlight_hw_brightness(DEFAULT_BRIGHTNESS_SETTING);
#endif
#endif
return true;
}
static int last_bl = -1;
/* Ref: https://www.kernel.org/doc/html/latest/gpu/backlight.html#c.backlight_properties */
#define BACKLIGHT_POWER_ON 0
#define BACKLIGHT_POWER_REDUCED 1
#define BACKLIGHT_POWER_OFF 4
void backlight_hw_on(void)
{
if (last_bl != BACKLIGHT_POWER_ON) {
#ifdef HAVE_LCD_ENABLE
lcd_enable(true);
#endif
last_bl = BACKLIGHT_POWER_ON;
sysfs_set_int(sysfs_bl_power, last_bl);
}
}
void backlight_hw_off(void)
{
if (last_bl != BACKLIGHT_POWER_REDUCED) {
last_bl = BACKLIGHT_POWER_REDUCED;
sysfs_set_int(sysfs_bl_power, last_bl);
#ifdef HAVE_LCD_ENABLE
lcd_enable(false);
#endif
}
}
void backlight_hw_brightness(int brightness)
{
/* cap range, just in case */
if (brightness > MAX_BRIGHTNESS_SETTING)
brightness = MAX_BRIGHTNESS_SETTING;
if (brightness < MIN_BRIGHTNESS_SETTING)
brightness = MIN_BRIGHTNESS_SETTING;
sysfs_set_int(sysfs_bl_brightness, brightness);
}
#ifdef HAVE_LCD_SLEEP
void lcd_awake(void)
{
/* Nothing to do */
}
void lcd_sleep(void)
{
if (last_bl != BACKLIGHT_POWER_OFF) {
last_bl = BACKLIGHT_POWER_OFF;
sysfs_set_int(sysfs_bl_power, last_bl);
#ifdef HAVE_LCD_ENABLE
lcd_enable(false);
#endif
}
}
#endif