nwze370: improve lcd & backlight

Added lcd inversion
Fix issue where backlight would turn on before first frame rendered
Fix issue where backlight would shortly appear at 100% before PWM is
ready during fade in
Turn off backlight before booting/RoLo/shutdown to avoid it being
enabled on next boot
Fix issue where fade in isn't smooth because brightness levels below 13 were
basically equalivent to off, by removing these brightness levels

Change-Id: I868eae2cbeea52c6af7d09c886958ff46167fe26
This commit is contained in:
nift4 2025-10-21 19:39:11 +02:00 committed by William Wilgus
parent 9722cad478
commit b1511738f7
5 changed files with 47 additions and 15 deletions

View file

@ -108,8 +108,8 @@
/* Main LCD backlight brightness range and defaults */ /* Main LCD backlight brightness range and defaults */
#define MIN_BRIGHTNESS_SETTING 0 #define MIN_BRIGHTNESS_SETTING 0
#define MAX_BRIGHTNESS_SETTING 100 #define MAX_BRIGHTNESS_SETTING 88
#define DEFAULT_BRIGHTNESS_SETTING 50 #define DEFAULT_BRIGHTNESS_SETTING 44
/* Which backlight fading type? */ /* Which backlight fading type? */
#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING

View file

@ -22,6 +22,12 @@
/* define this if you have a colour LCD */ /* define this if you have a colour LCD */
#define HAVE_LCD_COLOR #define HAVE_LCD_COLOR
/* define this if you have LCD enable function */
#define HAVE_LCD_ENABLE
/* Define this if the LCD can shut down */
#define HAVE_LCD_SHUTDOWN
#ifndef BOOTLOADER #ifndef BOOTLOADER
#define HAVE_ALBUMART #define HAVE_ALBUMART
@ -42,9 +48,6 @@
/* define this if you would like tagcache to build on this target */ /* define this if you would like tagcache to build on this target */
#define HAVE_TAGCACHE #define HAVE_TAGCACHE
/* define this if you have LCD enable function */
#define HAVE_LCD_ENABLE
/* Define this if your LCD can be put to sleep. HAVE_LCD_ENABLE /* Define this if your LCD can be put to sleep. HAVE_LCD_ENABLE
should be defined as well. should be defined as well.
#define HAVE_LCD_SLEEP #define HAVE_LCD_SLEEP
@ -55,9 +58,8 @@
#define HAVE_LCD_FLIP #define HAVE_LCD_FLIP
*/ */
/* define this if you can invert the colours on your LCD /* define this if you can invert the colours on your LCD */
#define HAVE_LCD_INVERT #define HAVE_LCD_INVERT
*/
/* define this if you have a real-time clock */ /* define this if you have a real-time clock */
#define CONFIG_RTC RTC_IMX233 #define CONFIG_RTC RTC_IMX233
@ -108,8 +110,8 @@
/* Main LCD backlight brightness range and defaults */ /* Main LCD backlight brightness range and defaults */
#define MIN_BRIGHTNESS_SETTING 0 #define MIN_BRIGHTNESS_SETTING 0
#define MAX_BRIGHTNESS_SETTING 100 #define MAX_BRIGHTNESS_SETTING 88
#define DEFAULT_BRIGHTNESS_SETTING 50 #define DEFAULT_BRIGHTNESS_SETTING 44
/* Which backlight fading type? */ /* Which backlight fading type? */
#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING

View file

@ -64,7 +64,7 @@
#include "ascodec.h" #include "ascodec.h"
#endif #endif
#if defined(FIIO_M3K) #if defined(FIIO_M3K) || defined(SONY_NWZE370)
#include "backlight-target.h" #include "backlight-target.h"
#endif #endif
@ -318,7 +318,7 @@ int rolo_load(const char* filename)
lcd_remote_update(); lcd_remote_update();
#endif #endif
#if defined(FIIO_M3K) #if defined(FIIO_M3K) || defined(SONY_NWZE370)
/* Avoids the LCD backlight ramping down & up weirdly */ /* Avoids the LCD backlight ramping down & up weirdly */
backlight_hw_off(); backlight_hw_off();
#endif #endif

View file

@ -26,12 +26,20 @@
#include "backlight-target.h" #include "backlight-target.h"
#include "pwm-imx233.h" #include "pwm-imx233.h"
#include "pinctrl-imx233.h" #include "pinctrl-imx233.h"
#include "kernel.h"
static int last_brightness;
void backlight_hw_brightness(int brightness) void backlight_hw_brightness(int brightness)
{ {
bool en = brightness > 0; bool en = brightness > 0;
imx233_pwm_setup_simple(2, 24000, 100 - brightness); /* brightness has extreme dip above 88% duty cycle, limit range to [87%, 0%] */
if (en)
imx233_pwm_setup_simple(2, 24000, 88 - brightness);
imx233_pwm_enable(2, en); imx233_pwm_enable(2, en);
if (last_brightness == 0 && en)
sleep(HZ / 25); /* make sure PWM settings are applied */
last_brightness = brightness;
imx233_pinctrl_set_gpio(0, 10, en); imx233_pinctrl_set_gpio(0, 10, en);
} }
@ -40,9 +48,8 @@ bool backlight_hw_init(void)
imx233_pinctrl_acquire(0, 10, "backlight_enable"); imx233_pinctrl_acquire(0, 10, "backlight_enable");
imx233_pinctrl_set_function(0, 10, PINCTRL_FUNCTION_GPIO); imx233_pinctrl_set_function(0, 10, PINCTRL_FUNCTION_GPIO);
imx233_pinctrl_enable_gpio(0, 10, true); imx233_pinctrl_enable_gpio(0, 10, true);
imx233_pinctrl_set_gpio(0, 10, true); backlight_hw_brightness(0);
backlight_hw_brightness(DEFAULT_BRIGHTNESS_SETTING); return false;
return true;
} }
void backlight_hw_on(void) void backlight_hw_on(void)
@ -50,6 +57,7 @@ void backlight_hw_on(void)
#ifdef HAVE_LCD_ENABLE #ifdef HAVE_LCD_ENABLE
lcd_enable(true); /* power on lcd + visible display */ lcd_enable(true); /* power on lcd + visible display */
#endif #endif
sleep(HZ / 10); /* make sure screen is not white anymore */
/* don't do anything special, the core will set the brightness */ /* don't do anything special, the core will set the brightness */
} }

View file

@ -31,6 +31,9 @@
#ifdef HAVE_LCD_ENABLE #ifdef HAVE_LCD_ENABLE
static bool lcd_on; static bool lcd_on;
#ifdef HAVE_LCD_INVERT
static bool lcd_inverted;
#endif
#endif #endif
static void lcd_write_reg(uint8_t reg, void *data, int data_len) static void lcd_write_reg(uint8_t reg, void *data, int data_len)
@ -120,6 +123,9 @@ static void lcd_enable_seq(bool enable)
if(enable) if(enable)
{ {
lcd_write_reg(0x11, NULL, 0); lcd_write_reg(0x11, NULL, 0);
#ifdef HAVE_LCD_INVERT
lcd_set_invert_display(lcd_inverted);
#endif
lcd_write_reg(0x29, NULL, 0); lcd_write_reg(0x29, NULL, 0);
} }
else else
@ -146,6 +152,22 @@ void lcd_enable(bool enable)
} }
#endif #endif
#ifdef HAVE_LCD_SHUTDOWN
void lcd_shutdown(void) {
backlight_hw_off();
}
#endif
#ifdef HAVE_LCD_INVERT
void lcd_set_invert_display(bool yesno)
{
lcd_write_reg(yesno ? 0x21 : 0x20, NULL, 0);
#ifdef HAVE_LCD_ENABLE
lcd_inverted = yesno;
#endif
}
#endif
void lcd_update(void) void lcd_update(void)
{ {
lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT); lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);