diff --git a/epicardium/drivers/display/api.c b/epicardium/drivers/display/api.c index f0a145292521dbb3c383129fae893653ec8cd3f3..25a6ebae3e69508ad912c7768de3d8adcf0b7804 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 ae0eac9c6ce5fad9afb62cf407b684a38b7cc06c..ac0e6c30cc62ad4deb800d2347c3a6aecdfe8c35 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 3b8a507d654a06cccae7fb23b0a959fc55e3cffd..104f8e6b0e4a9f7ca8985f6761a20b109e74e271 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(