summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2008-04-04 22:13:53 +0000
committerJens Arnold <amiconn@rockbox.org>2008-04-04 22:13:53 +0000
commit32bd0f8ab1526e32011937a827b6e44476a6743e (patch)
treec0bdfebc167a0b06daba4de23beba31027b0d693 /firmware/target/arm
parent391377725ea18688aa93c542a3b470df73b88f51 (diff)
downloadrockbox-32bd0f8ab1526e32011937a827b6e44476a6743e.tar.gz
rockbox-32bd0f8ab1526e32011937a827b6e44476a6743e.zip
Greyscale library: Optionally put the greyscale ISR on COP on portalplayertargets (only use with the grey_info structure in IRAM atm\!). This speeds up doom by ~50%, and makes mpegplayer work without stuttering audio on targets using it (measured on iPod 2nd Gen and Mini 2nd Gen). It needs corelocking certain functions in the LCD driver on 1st/2nd Gen.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16973 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/ipod/lcd-gray.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/firmware/target/arm/ipod/lcd-gray.c b/firmware/target/arm/ipod/lcd-gray.c
index 131b52da96..5cc219162c 100644
--- a/firmware/target/arm/ipod/lcd-gray.c
+++ b/firmware/target/arm/ipod/lcd-gray.c
@@ -53,6 +53,10 @@
/* The backlight makes the LCD appear negative on the 1st/2nd gen */
static bool lcd_inverted = false;
static bool lcd_backlit = false;
+#if NUM_CORES > 1
+/* invert_display() and the lcd_blit_* functions need to be corelocked */
+static struct corelock cl IBSS_ATTR;
+#endif
static void invert_display(void);
#endif
@@ -112,7 +116,9 @@ static void lcd_cmd_and_data(unsigned cmd, unsigned data)
/* LCD init */
void lcd_init_device(void)
{
-
+#if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION)
+ corelock_init(&cl);
+#endif
#ifdef IPOD_MINI2G /* serial LCD hookup */
lcd_wait_write();
LCD1_CONTROL = 0x01730084; /* fastest setting */
@@ -167,7 +173,13 @@ static void invert_display(void)
if (new_invert != last_invert)
{
int oldlevel = disable_irq_save();
+#if NUM_CORES > 1
+ corelock_lock(&cl);
lcd_cmd_and_data(R_DISPLAY_CONTROL, new_invert? 0x0017 : 0x0015);
+ corelock_unlock(&cl);
+#else
+ lcd_cmd_and_data(R_DISPLAY_CONTROL, new_invert? 0x0017 : 0x0015);
+#endif
restore_irq(oldlevel);
last_invert = new_invert;
}
@@ -254,14 +266,19 @@ void lcd_mono_data(const unsigned char *data, int count);
void lcd_blit_mono(const unsigned char *data, int bx, int y, int bwidth,
int height, int stride)
{
+#if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION)
+ corelock_lock(&cl);
+#endif
while (height--)
{
lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx);
lcd_prepare_cmd(R_RAM_DATA);
-
lcd_mono_data(data, bwidth);
data += stride;
}
+#if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION)
+ corelock_unlock(&cl);
+#endif
}
/* Helper function for lcd_grey_phase_blit(). */
@@ -272,15 +289,20 @@ void lcd_grey_data(unsigned char *values, unsigned char *phases, int count);
void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases,
int bx, int y, int bwidth, int height, int stride)
{
- while (height--)
+#if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION)
+ corelock_lock(&cl);
+#endif
+ while (height--)
{
lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx);
lcd_prepare_cmd(R_RAM_DATA);
-
lcd_grey_data(values, phases, bwidth);
values += stride;
phases += stride;
}
+#if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION)
+ corelock_unlock(&cl);
+#endif
}
void lcd_update_rect(int x, int y, int width, int height)