From 2696bf821fffbb1bd8effadce80e178ee8bfd4b7 Mon Sep 17 00:00:00 2001 From: Rahix <rahix@rahix.de> Date: Thu, 16 Sep 2021 22:56:29 +0200 Subject: [PATCH] feat(display): Sleep display if backlight is off Adapted from previous implementation in !476. To quote: > This saves about 1 mA when the display is off. --- epicardium/drivers/display/api.c | 5 +++++ epicardium/drivers/display/lcd.c | 11 +++++++++++ epicardium/drivers/display/lcd.h | 1 + 3 files changed, 17 insertions(+) diff --git a/epicardium/drivers/display/api.c b/epicardium/drivers/display/api.c index f0a145292..25a6ebae3 100644 --- a/epicardium/drivers/display/api.c +++ b/epicardium/drivers/display/api.c @@ -339,6 +339,11 @@ int epic_disp_framebuffer(union disp_framebuffer *fb) int epic_disp_backlight(uint16_t brightness) { /* TODO: lock? */ + if (brightness == 0) { + lcd_set_sleep(true); + } else { + lcd_set_sleep(false); + } LCD_SetBacklight(brightness); return 0; } diff --git a/epicardium/drivers/display/lcd.c b/epicardium/drivers/display/lcd.c index ae0eac9c6..ac0e6c30c 100644 --- a/epicardium/drivers/display/lcd.c +++ b/epicardium/drivers/display/lcd.c @@ -86,6 +86,8 @@ static void lcd_delay(size_t millis) /* HAL Interfaces }}} */ enum lcd_commands { + /** Sleep In */ + LCD_SLPIN = 0x10, /** Sleep Out */ LCD_SLPOUT = 0x11, /** Display Inversion On */ @@ -157,6 +159,15 @@ static void lcd_hard_reset(void) lcd_delay(20); } +void lcd_set_sleep(bool sleep) +{ + if (sleep) { + lcd_send_command(LCD_SLPIN, NULL, 0); + } else { + lcd_send_command(LCD_SLPOUT, NULL, 0); + } +} + /** * Perform a minimal initialization under the assumption that the bootloader has * already turned on the display. This is faster and prevents visible diff --git a/epicardium/drivers/display/lcd.h b/epicardium/drivers/display/lcd.h index 3b8a507d6..104f8e6b0 100644 --- a/epicardium/drivers/display/lcd.h +++ b/epicardium/drivers/display/lcd.h @@ -3,6 +3,7 @@ #include <stdbool.h> #include <stdint.h> +void lcd_set_sleep(bool sleep); void lcd_reconfigure(void); void lcd_initialize(void); void lcd_write_fb_partial( -- GitLab