YH820: implement LCD sleep

use sleep setting to keep transflective LCD active without backlight

Change-Id: Iccd97e956d5e4a2a22abc90d15e9123782126ecb
This commit is contained in:
Sebastian Leonhardt 2016-06-25 15:25:30 +02:00
parent 60f60d9a12
commit 03e63da316
4 changed files with 57 additions and 8 deletions

View file

@ -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 */

View file

@ -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 */

View file

@ -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
}

View file

@ -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 */
@ -339,6 +375,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;
if (y + height >= LCD_HEIGHT)