From b1511738f7dac0e3e39aef98b0d03b0e710676e5 Mon Sep 17 00:00:00 2001 From: nift4 Date: Tue, 21 Oct 2025 19:39:11 +0200 Subject: [PATCH] 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 --- firmware/export/config/sonynwze360.h | 4 ++-- firmware/export/config/sonynwze370.h | 16 ++++++++------ firmware/rolo.c | 4 ++-- .../arm/imx233/sony-nwz/backlight-nwz.c | 16 ++++++++++---- .../target/arm/imx233/sony-nwz/lcd-nwze370.c | 22 +++++++++++++++++++ 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/firmware/export/config/sonynwze360.h b/firmware/export/config/sonynwze360.h index 2c2cb79baa..548486ae5b 100644 --- a/firmware/export/config/sonynwze360.h +++ b/firmware/export/config/sonynwze360.h @@ -108,8 +108,8 @@ /* Main LCD backlight brightness range and defaults */ #define MIN_BRIGHTNESS_SETTING 0 -#define MAX_BRIGHTNESS_SETTING 100 -#define DEFAULT_BRIGHTNESS_SETTING 50 +#define MAX_BRIGHTNESS_SETTING 88 +#define DEFAULT_BRIGHTNESS_SETTING 44 /* Which backlight fading type? */ #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING diff --git a/firmware/export/config/sonynwze370.h b/firmware/export/config/sonynwze370.h index dc3167a658..8561541222 100644 --- a/firmware/export/config/sonynwze370.h +++ b/firmware/export/config/sonynwze370.h @@ -22,6 +22,12 @@ /* define this if you have a colour LCD */ #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 #define HAVE_ALBUMART @@ -42,9 +48,6 @@ /* define this if you would like tagcache to build on this target */ #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 should be defined as well. #define HAVE_LCD_SLEEP @@ -55,9 +58,8 @@ #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 this if you have a real-time clock */ #define CONFIG_RTC RTC_IMX233 @@ -108,8 +110,8 @@ /* Main LCD backlight brightness range and defaults */ #define MIN_BRIGHTNESS_SETTING 0 -#define MAX_BRIGHTNESS_SETTING 100 -#define DEFAULT_BRIGHTNESS_SETTING 50 +#define MAX_BRIGHTNESS_SETTING 88 +#define DEFAULT_BRIGHTNESS_SETTING 44 /* Which backlight fading type? */ #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING diff --git a/firmware/rolo.c b/firmware/rolo.c index a8e8f3938b..3cc358331b 100644 --- a/firmware/rolo.c +++ b/firmware/rolo.c @@ -64,7 +64,7 @@ #include "ascodec.h" #endif -#if defined(FIIO_M3K) +#if defined(FIIO_M3K) || defined(SONY_NWZE370) #include "backlight-target.h" #endif @@ -318,7 +318,7 @@ int rolo_load(const char* filename) lcd_remote_update(); #endif -#if defined(FIIO_M3K) +#if defined(FIIO_M3K) || defined(SONY_NWZE370) /* Avoids the LCD backlight ramping down & up weirdly */ backlight_hw_off(); #endif diff --git a/firmware/target/arm/imx233/sony-nwz/backlight-nwz.c b/firmware/target/arm/imx233/sony-nwz/backlight-nwz.c index fecbeda15b..848d130a28 100644 --- a/firmware/target/arm/imx233/sony-nwz/backlight-nwz.c +++ b/firmware/target/arm/imx233/sony-nwz/backlight-nwz.c @@ -26,12 +26,20 @@ #include "backlight-target.h" #include "pwm-imx233.h" #include "pinctrl-imx233.h" +#include "kernel.h" + +static int last_brightness; void backlight_hw_brightness(int brightness) { 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); + if (last_brightness == 0 && en) + sleep(HZ / 25); /* make sure PWM settings are applied */ + last_brightness = brightness; 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_set_function(0, 10, PINCTRL_FUNCTION_GPIO); imx233_pinctrl_enable_gpio(0, 10, true); - imx233_pinctrl_set_gpio(0, 10, true); - backlight_hw_brightness(DEFAULT_BRIGHTNESS_SETTING); - return true; + backlight_hw_brightness(0); + return false; } void backlight_hw_on(void) @@ -50,6 +57,7 @@ void backlight_hw_on(void) #ifdef HAVE_LCD_ENABLE lcd_enable(true); /* power on lcd + visible display */ #endif + sleep(HZ / 10); /* make sure screen is not white anymore */ /* don't do anything special, the core will set the brightness */ } diff --git a/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c b/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c index 862522da15..e7f7e1e8a0 100644 --- a/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c +++ b/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c @@ -31,6 +31,9 @@ #ifdef HAVE_LCD_ENABLE static bool lcd_on; +#ifdef HAVE_LCD_INVERT +static bool lcd_inverted; +#endif #endif 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) { lcd_write_reg(0x11, NULL, 0); +#ifdef HAVE_LCD_INVERT + lcd_set_invert_display(lcd_inverted); +#endif lcd_write_reg(0x29, NULL, 0); } else @@ -146,6 +152,22 @@ void lcd_enable(bool enable) } #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) { lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);