From 03e63da3165fa2ea02286a4497d2e9cf0bdc6ea6 Mon Sep 17 00:00:00 2001 From: Sebastian Leonhardt Date: Sat, 25 Jun 2016 15:25:30 +0200 Subject: YH820: implement LCD sleep use sleep setting to keep transflective LCD active without backlight Change-Id: Iccd97e956d5e4a2a22abc90d15e9123782126ecb --- firmware/export/backlight.h | 4 +++ firmware/export/config/samsungyh820.h | 15 +++++--- .../target/arm/samsung/yh820/backlight-yh820.c | 5 +-- firmware/target/arm/samsung/yh820/lcd-yh820.c | 41 ++++++++++++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/firmware/export/backlight.h b/firmware/export/backlight.h index a1c65a3b4e..6d029790b3 100644 --- a/firmware/export/backlight.h +++ b/firmware/export/backlight.h @@ -60,6 +60,10 @@ void backlight_set_on_button_hold(int index); void lcd_set_sleep_after_backlight_off(int timeout_seconds); #endif +#ifdef HAVE_LCD_SLEEP +void lcd_awake(void); +#endif + #else /* !HAVE_BACKLIGHT */ #define backlight_init() #endif /* !HAVE_BACKLIGHT */ diff --git a/firmware/export/config/samsungyh820.h b/firmware/export/config/samsungyh820.h index 52ed821370..d937a3ff6c 100644 --- a/firmware/export/config/samsungyh820.h +++ b/firmware/export/config/samsungyh820.h @@ -34,6 +34,9 @@ #define LCD_DEPTH 16 /* 65536 colours */ #define LCD_PIXELFORMAT RGB565 +/* LCD stays visible without backlight - simulator hint */ +#define HAVE_TRANSFLECTIVE_LCD + #ifndef BOOTLOADER /* define this if you have a real-time clock */ @@ -42,12 +45,16 @@ //#define HAVE_RTC_ALARM /* Define this if your LCD can be enabled/disabled */ -#define HAVE_LCD_ENABLE +/* #define HAVE_LCD_ENABLE */ /* Define this if your LCD can be put to sleep. - HAVE_LCD_ENABLE should be defined as well. */ -/* todo #define HAVE_LCD_SLEEP*/ -/* todo #define HAVE_LCD_SLEEP_SETTING */ + HAVE_LCD_ENABLE should be defined as well. + Note: with a transflective display, HAVE_LCD_ENABLE shouldn't be defined. + LCD gets disabled when setting to sleep. */ +#define HAVE_LCD_SLEEP +#define HAVE_LCD_SLEEP_SETTING +/* The same code may also be used when shutting down */ +#define HAVE_LCD_SHUTDOWN #endif /* !BOOTLOADER */ /* Define this for LCD backlight available */ diff --git a/firmware/target/arm/samsung/yh820/backlight-yh820.c b/firmware/target/arm/samsung/yh820/backlight-yh820.c index b24f8128c4..c9309eebbe 100644 --- a/firmware/target/arm/samsung/yh820/backlight-yh820.c +++ b/firmware/target/arm/samsung/yh820/backlight-yh820.c @@ -28,7 +28,7 @@ void backlight_hw_on(void) { #ifdef HAVE_LCD_SLEEP - backlight_lcd_sleep_countdown(false); /* stop counter */ + lcd_awake(); /* power on lcd + visible display */ #endif #ifdef HAVE_LCD_ENABLE lcd_enable(true); /* power on lcd + visible display */ @@ -42,7 +42,4 @@ void backlight_hw_off(void) #ifdef HAVE_LCD_ENABLE lcd_enable(false); /* power off visible display */ #endif -#ifdef HAVE_LCD_SLEEP - backlight_lcd_sleep_countdown(true); /* start countdown */ -#endif } diff --git a/firmware/target/arm/samsung/yh820/lcd-yh820.c b/firmware/target/arm/samsung/yh820/lcd-yh820.c index d6bb2a196b..f4b55ab917 100644 --- a/firmware/target/arm/samsung/yh820/lcd-yh820.c +++ b/firmware/target/arm/samsung/yh820/lcd-yh820.c @@ -25,6 +25,9 @@ #include "lcd.h" #include "kernel.h" #include "system.h" +#ifdef HAVE_LCD_SHUTDOWN +#include "backlight-target.h" /* included for backlight_hw_off() prototype */ +#endif /* Display status */ static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0; @@ -235,6 +238,28 @@ void lcd_enable(bool yesno) } #endif +#ifdef HAVE_LCD_SLEEP +void lcd_sleep(void) +{ + if (is_lcd_enabled) + { + is_lcd_enabled = false; + lcd_send_command(R_STANDBY_ON); + } +} + +void lcd_awake(void) +{ + if (!is_lcd_enabled) + { + is_lcd_enabled = true; + lcd_send_command(R_STANDBY_OFF); + lcd_send_command(R_DISPLAY_ON); + send_event(LCD_EVENT_ACTIVATION, NULL); + } +} +#endif + #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) bool lcd_active(void) { @@ -242,6 +267,17 @@ bool lcd_active(void) } #endif +#if defined(HAVE_LCD_SHUTDOWN) +void lcd_shutdown(void) +{ + backlight_hw_off(); +#ifndef HAVE_LCD_ENABLE + /* already done by backlight_hw_off() */ + lcd_send_command(R_STANDBY_ON); +#endif +} +#endif + #ifdef HAVE_LCD_FLIP /* turn the display upside down (call lcd_update() afterwards) */ /* Note: since the lcd is rotated, this will flip horiz instead of vert */ @@ -338,6 +374,11 @@ void lcd_update(void) void lcd_update_rect(int x, int y, int width, int height) { const fb_data *addr; + +#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) + if (!is_lcd_enabled) + return; +#endif if (x + width >= LCD_WIDTH) width = LCD_WIDTH - x; -- cgit v1.2.3