summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugin.c4
-rw-r--r--apps/plugin.h6
-rw-r--r--apps/plugins/mpegplayer/mpeg_settings.c22
-rw-r--r--apps/plugins/mpegplayer/mpegplayer.c23
-rw-r--r--apps/plugins/mpegplayer/mpegplayer.h3
-rw-r--r--firmware/drivers/lcd-16bit.c21
-rw-r--r--firmware/export/kernel.h1
-rw-r--r--firmware/export/lcd.h4
-rw-r--r--firmware/target/arm/iriver/h10/lcd-h10_20gb.c1
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c1
-rw-r--r--firmware/target/arm/sandisk/sansa-e200/lcd-e200.c1
-rw-r--r--firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c1
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c1
-rw-r--r--firmware/target/coldfire/iaudio/x5/lcd-x5.c1
-rw-r--r--firmware/target/coldfire/iriver/h300/lcd-h300.c1
15 files changed, 90 insertions, 1 deletions
diff --git a/apps/plugin.c b/apps/plugin.c
index e7b66a1..9a435b2 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -601,6 +601,10 @@ static const struct plugin_api rockbox_api = {
simplelist_info_init,
simplelist_show_list,
+#ifdef HAVE_LCD_ENABLE
+ lcd_set_enable_hook,
+ &button_queue,
+#endif
};
int plugin_load(const char* plugin, const void* parameter)
diff --git a/apps/plugin.h b/apps/plugin.h
index c23e645..edd5498 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -124,7 +124,7 @@ void* plugin_get_buffer(size_t *buffer_size);
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 115
+#define PLUGIN_API_VERSION 116
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
@@ -752,6 +752,10 @@ struct plugin_api {
int count, void* data);
bool (*simplelist_show_list)(struct simplelist_info *info);
+#ifdef HAVE_LCD_ENABLE
+ void (*lcd_set_enable_hook)(void (*enable_hook)(void));
+ struct event_queue *button_queue;
+#endif
};
/* plugin header */
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c
index 70b41a0..17a1cbb 100644
--- a/apps/plugins/mpegplayer/mpeg_settings.c
+++ b/apps/plugins/mpegplayer/mpeg_settings.c
@@ -543,6 +543,13 @@ static uint32_t increment_time(uint32_t val, int32_t amount, uint32_t range)
return val;
}
+#ifdef HAVE_LCD_ENABLE
+static void get_start_time_lcd_enable_hook(void)
+{
+ rb->queue_post(rb->button_queue, LCD_ENABLE_EVENT_0, 0);
+}
+#endif /* HAVE_LCD_ENABLE */
+
static int get_start_time(uint32_t duration)
{
int button = 0;
@@ -556,6 +563,10 @@ static int get_start_time(uint32_t duration)
lcd_(clear_display)();
lcd_(update)();
+#ifdef HAVE_LCD_ENABLE
+ rb->lcd_set_enable_hook(get_start_time_lcd_enable_hook);
+#endif
+
draw_slider(0, 100, &rc_bound);
rc_bound.b = rc_bound.t - SLIDER_TMARGIN;
rc_bound.t = SCREEN_MARGIN;
@@ -707,6 +718,13 @@ static int get_start_time(uint32_t duration)
slider_state = state9;
break;
+#ifdef HAVE_LCD_ENABLE
+ case LCD_ENABLE_EVENT_0:
+ if (slider_state == state2)
+ display_thumb_image(&rc_vid);
+ continue;
+#endif
+
default:
rb->default_event_handler(button);
rb->yield();
@@ -736,6 +754,10 @@ static int get_start_time(uint32_t duration)
rb->yield();
}
+#ifdef HAVE_LCD_ENABLE
+ rb->lcd_set_enable_hook(NULL);
+#endif
+
#ifndef HAVE_LCD_COLOR
stream_gray_show(false);
grey_clear_display();
diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c
index 5b92ccc..42e0ddd 100644
--- a/apps/plugins/mpegplayer/mpegplayer.c
+++ b/apps/plugins/mpegplayer/mpegplayer.c
@@ -587,13 +587,27 @@ static void draw_putsxy_oriented(int x, int y, const char *str)
}
#endif /* LCD_PORTRAIT */
+#ifdef HAVE_LCD_ENABLE
+/* So we can refresh the overlay */
+static void wvs_lcd_enable_hook(void)
+{
+ rb->queue_post(rb->button_queue, LCD_ENABLE_EVENT_1, 0);
+}
+#endif
+
static void wvs_backlight_on_video_mode(bool video_on)
{
if (video_on) {
/* Turn off backlight timeout */
/* backlight control in lib/helper.c */
backlight_force_on(rb);
+#ifdef HAVE_LCD_ENABLE
+ rb->lcd_set_enable_hook(NULL);
+#endif
} else {
+#ifdef HAVE_LCD_ENABLE
+ rb->lcd_set_enable_hook(wvs_lcd_enable_hook);
+#endif
/* Revert to user's backlight settings */
backlight_use_settings(rb);
}
@@ -1441,6 +1455,15 @@ static void button_loop(void)
continue;
} /* BUTTON_NONE: */
+#ifdef HAVE_LCD_ENABLE
+ case LCD_ENABLE_EVENT_1:
+ {
+ /* Draw the current frame if prepared already */
+ stream_draw_frame(true);
+ break;
+ } /* LCD_ENABLE_EVENT_1: */
+#endif
+
case MPEG_VOLUP:
case MPEG_VOLUP|BUTTON_REPEAT:
#ifdef MPEG_VOLUP2
diff --git a/apps/plugins/mpegplayer/mpegplayer.h b/apps/plugins/mpegplayer/mpegplayer.h
index fa13a1e..571c288 100644
--- a/apps/plugins/mpegplayer/mpegplayer.h
+++ b/apps/plugins/mpegplayer/mpegplayer.h
@@ -104,4 +104,7 @@ enum mpeg_malloc_reason_t
#include "disk_buf.h"
#include "stream_mgr.h"
+#define LCD_ENABLE_EVENT_0 MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0)
+#define LCD_ENABLE_EVENT_1 MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 1)
+
#endif /* MPEGPLAYER_H */
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
{