From adf2e4c9a012fda200431c92cb2c1707dbe2f0a3 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Wed, 28 May 2008 10:17:16 +0000 Subject: Targets with HAVE_LCD_ENABLE: Provide a means to receive notifications when the lcd is enabled and the image is refreshed so overlayed drawing can also be refreshed. Chiefly mpegplayer needs this so it can redraw the YUV data after the backlight is turned on while paused or when using 'Set Start Time'. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17640 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-16bit.c | 21 +++++++++++++++++++++ firmware/export/kernel.h | 1 + firmware/export/lcd.h | 4 ++++ firmware/target/arm/iriver/h10/lcd-h10_20gb.c | 1 + .../target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c | 1 + firmware/target/arm/sandisk/sansa-e200/lcd-e200.c | 1 + firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c | 1 + .../arm/tms320dm320/creative-zvm/lcd-creativezvm.c | 1 + firmware/target/coldfire/iaudio/x5/lcd-x5.c | 1 + firmware/target/coldfire/iriver/h300/lcd-h300.c | 1 + 10 files changed, 33 insertions(+) (limited to 'firmware') diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c index c91d222..020d6bf 100644 --- a/firmware/drivers/lcd-16bit.c +++ b/firmware/drivers/lcd-16bit.c @@ -49,6 +49,10 @@ fb_data lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] static fb_data* lcd_backdrop = NULL; static long lcd_backdrop_offset IDATA_ATTR = 0; +#ifdef HAVE_LCD_ENABLE +static void (*lcd_enable_hook)(void) = NULL; +#endif + static struct viewport default_vp = { .x = 0, @@ -84,6 +88,23 @@ void lcd_init(void) scroll_init(); } +/*** Helpers - consolidate optional code ***/ +#ifdef HAVE_LCD_ENABLE +void lcd_set_enable_hook(void (*enable_hook)(void)) +{ + lcd_enable_hook = enable_hook; +} + +/* To be called by target driver after enabling display and refreshing it */ +void lcd_call_enable_hook(void) +{ + void (*enable_hook)(void) = lcd_enable_hook; + + if (enable_hook != NULL) + enable_hook(); +} +#endif + /*** Viewports ***/ void lcd_set_viewport(struct viewport* vp) diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h index 60c37bd..88f3b80 100644 --- a/firmware/export/kernel.h +++ b/firmware/export/kernel.h @@ -45,6 +45,7 @@ #define SYS_EVENT_CLS_FILESYS 3 #define SYS_EVENT_CLS_PLUG 4 #define SYS_EVENT_CLS_MISC 5 +#define SYS_EVENT_CLS_PRIVATE 7 /* For use inside plugins */ /* make sure SYS_EVENT_CLS_BITS has enough range */ /* Bit 31->|S|c...c|i...i| */ diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index 3e0ec78..45a6850 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h @@ -341,6 +341,10 @@ void lcd_poweroff(void); /* Enable/disable the main display. */ extern void lcd_enable(bool on); extern bool lcd_enabled(void); +/* Register a hook that is called when the lcd is powered and after the + * framebuffer data is synchronized */ +void lcd_set_enable_hook(void (*enable_hook)(void)); +void lcd_call_enable_hook(void); #endif /* HAVE_LCD_ENABLE */ #ifdef HAVE_LCD_SLEEP diff --git a/firmware/target/arm/iriver/h10/lcd-h10_20gb.c b/firmware/target/arm/iriver/h10/lcd-h10_20gb.c index 1ee43c3..7d94266 100644 --- a/firmware/target/arm/iriver/h10/lcd-h10_20gb.c +++ b/firmware/target/arm/iriver/h10/lcd-h10_20gb.c @@ -361,6 +361,7 @@ void lcd_enable(bool on) /* Probably out of sync and we don't wanna pepper the code with lcd_update() calls for this. */ lcd_update(); + lcd_call_enable_hook(); } else { diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c index 7484cae..1833639 100644 --- a/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c +++ b/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c @@ -287,6 +287,7 @@ void lcd_enable(bool state) lcd_on = true; lcd_update(); + lcd_call_enable_hook(); } else { diff --git a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c index acdb2c9..9f8f580 100644 --- a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c @@ -436,6 +436,7 @@ void lcd_enable(bool on) DEV_EN |= DEV_LCD; /* Enable LCD controller */ lcd_display_on(); /* Turn on display */ lcd_update(); /* Resync display */ + lcd_call_enable_hook(); LCD_REG_6 |= 1; /* Restart DMA */ sleep(HZ/50); /* Wait for a frame to be written */ } diff --git a/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c b/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c index 8a268db..062b178 100644 --- a/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c +++ b/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c @@ -212,6 +212,7 @@ void lcd_enable(bool on) lcd_display_on(); LCDC_CTRL |= 1; /* controller enable */ lcd_update(); /* Resync display */ + lcd_call_enable_hook(); } else { diff --git a/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c b/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c index a2634f0..b4b76d4 100644 --- a/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c +++ b/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c @@ -235,6 +235,7 @@ return; { lcd_display_on(false); /* Turn on display */ lcd_update(); /* Resync display */ + lcd_call_enable_hook(); } else { diff --git a/firmware/target/coldfire/iaudio/x5/lcd-x5.c b/firmware/target/coldfire/iaudio/x5/lcd-x5.c index 19faf04..5aecb36 100644 --- a/firmware/target/coldfire/iaudio/x5/lcd-x5.c +++ b/firmware/target/coldfire/iaudio/x5/lcd-x5.c @@ -383,6 +383,7 @@ void lcd_enable(bool on) /* Probably out of sync and we don't wanna pepper the code with lcd_update() calls for this. */ lcd_update(); + lcd_call_enable_hook(); } else { diff --git a/firmware/target/coldfire/iriver/h300/lcd-h300.c b/firmware/target/coldfire/iriver/h300/lcd-h300.c index 5081366..61d0a6c 100644 --- a/firmware/target/coldfire/iriver/h300/lcd-h300.c +++ b/firmware/target/coldfire/iriver/h300/lcd-h300.c @@ -261,6 +261,7 @@ void lcd_enable(bool on) if(on) { _display_on(); + lcd_call_enable_hook(); } else { -- cgit v1.1