From 9d1b99534e0a3bf6559a4fe06420b0bc9274a688 Mon Sep 17 00:00:00 2001 From: Karl Kurbjun Date: Thu, 26 Mar 2009 22:20:46 +0000 Subject: Add support for powering down the LCD (saves 50 mA when disabled) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20547 a1c6a512-1295-4272-9138-f99709370657 --- .../arm/tms320dm320/mrobe-500/backlight-mr500.c | 10 ++++ .../target/arm/tms320dm320/mrobe-500/lcd-mr500.c | 59 +++++++++++++++++++--- 2 files changed, 63 insertions(+), 6 deletions(-) (limited to 'firmware/target/arm/tms320dm320') diff --git a/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c index 1537e76219..855f10ef35 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c @@ -30,12 +30,22 @@ void _backlight_on(void) { +#ifdef HAVE_LCD_SLEEP + backlight_lcd_sleep_countdown(false); /* stop counter */ +#endif +#ifdef HAVE_LCD_ENABLE + lcd_enable(true); /* power on lcd + visible display */ +#endif _backlight_set_brightness(DEFAULT_BRIGHTNESS_SETTING); } void _backlight_off(void) { _backlight_set_brightness(0); +#ifdef HAVE_LCD_SLEEP + /* Disable lcd after fade completes (when lcd_sleep timeout expires) */ + backlight_lcd_sleep_countdown(true); /* start countdown */ +#endif } /* Assumes that the backlight has been initialized */ diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c index cdba4c8118..1126f35149 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c @@ -38,7 +38,11 @@ extern void lcd_copy_buffer_rect(fb_data *dst, const fb_data *src, int width, int height); -static volatile bool lcd_on = true; +static bool lcd_on = true; +#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) +static bool lcd_powered = true; +#endif + volatile bool lcd_poweroff = false; /* ** These are imported from lcd-16bit.c @@ -46,10 +50,55 @@ volatile bool lcd_poweroff = false; extern unsigned fg_pattern; extern unsigned bg_pattern; +#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) bool lcd_active(void) { return lcd_on; } +#endif + +#if defined(HAVE_LCD_SLEEP) +void lcd_sleep() +{ + if (lcd_powered) + { + /* "not powered" implies "disabled" */ + if (lcd_on) + lcd_enable(false); + IO_GIO_BITCLR2=1<<4; + lcd_powered=false; + } +} +#endif + +#if defined(HAVE_LCD_ENABLE) +void lcd_enable(bool state) +{ + if (state == lcd_on) + return; + + if(state) + { + /* "enabled" implies "powered" */ + if (!lcd_powered) + { + lcd_powered=true; + IO_GIO_BITSET2=1<<4; + /* Wait long enough for a frame to be written - yes, it + * takes awhile. */ + sleep(HZ/5); + } + + lcd_on = true; + lcd_update(); + lcd_activation_call_hook(); + } + else + { + lcd_on = false; + } +} +#endif /* LCD init - based on code from ingenient-bsp/bootloader/board/dm320/splash.c * and code by Catalin Patulea from the M:Robe 500i linux port @@ -80,6 +129,9 @@ void lcd_init_device(void) IO_OSD_OSDWIN0YP=0; IO_OSD_OSDWIN0XL=480; IO_OSD_OSDWIN0YL=640; + + /* Set pin 36 to an output */ + IO_GIO_DIR2&=!(1<<4); } /* Update a fraction of the display. */ @@ -138,11 +190,6 @@ void lcd_update_rect(int x, int y, int width, int height) #endif } -void lcd_enable(bool state) -{ - (void)state; -} - /* Update the display. This must be called after all other LCD functions that change the display. */ void lcd_update(void) -- cgit v1.2.3