YH820: implement LCD sleep
use sleep setting to keep transflective LCD active without backlight
Change-Id: Iccd97e956d5e4a2a22abc90d15e9123782126ecb
diff --git a/firmware/export/backlight.h b/firmware/export/backlight.h
index a1c65a3..6d02979 100644
--- a/firmware/export/backlight.h
+++ b/firmware/export/backlight.h
@@ -60,6 +60,10 @@
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 52ed821..d937a3f 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 b24f812..c9309ee 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 @@
#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 d6bb2a1..f4b55ab 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 @@
}
#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 @@
}
#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_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;