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;