summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-01-06 23:41:36 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-01-06 23:41:36 +0000
commit57667c51cf09de052222484ce94fbd6da113a55c (patch)
treeb85872be9b6c204e7d66a9203a64d78c524a38a5 /firmware
parent8e8e2627b27b28a855881db09f2c16bfb2193050 (diff)
downloadrockbox-57667c51cf09de052222484ce94fbd6da113a55c.tar.gz
rockbox-57667c51cf09de052222484ce94fbd6da113a55c.tar.bz2
rockbox-57667c51cf09de052222484ce94fbd6da113a55c.zip
Sansa AMS: refactor DBOP button reading (e200v2/Fuze/c200v2)
This gets rid of LCD glitches on Sansa Fuze, and now LCD transfers can get interrupted by button reading Flyspray: FS #10603 Author: Bertrik Sikken git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24192 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/SOURCES3
-rw-r--r--firmware/target/arm/as3525/button-e200v2-fuze.c210
-rw-r--r--firmware/target/arm/as3525/dbop-as3525.c77
-rw-r--r--firmware/target/arm/as3525/dbop-as3525.h23
-rw-r--r--firmware/target/arm/as3525/debug-as3525.c4
-rw-r--r--firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c21
-rw-r--r--firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c34
-rw-r--r--firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c34
-rw-r--r--firmware/target/arm/lcd-c200_c200v2.c74
9 files changed, 161 insertions, 319 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 4b174d0d62..064c8fe650 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -1235,6 +1235,7 @@ target/arm/as3525/sansa-e200v2/lcd-e200v2.c
target/arm/as3525/lcd-as-e200v2-fuze.S
target/arm/as3525/button-e200v2-fuze.c
target/arm/as3525/backlight-e200v2-fuze.c
+target/arm/as3525/dbop-as3525.c
#ifndef BOOTLOADER
target/arm/powermgmt-ascodec.c
target/arm/as3525/sansa-e200v2/powermgmt-e200v2.c
@@ -1247,6 +1248,7 @@ target/arm/as3525/sansa-e200v2/powermgmt-e200v2.c
target/arm/lcd-c200_c200v2.c
target/arm/as3525/sansa-c200v2/button-c200v2.c
target/arm/as3525/sansa-c200v2/backlight-c200v2.c
+target/arm/as3525/dbop-as3525.c
#ifndef BOOTLOADER
target/arm/as3525/powermgmt-as3525.c
#endif /* !BOOTLOADER */
@@ -1269,6 +1271,7 @@ target/arm/as3525/button-e200v2-fuze.c
target/arm/as3525/sansa-fuze/lcd-fuze.c
target/arm/as3525/lcd-as-e200v2-fuze.S
target/arm/as3525/backlight-e200v2-fuze.c
+target/arm/as3525/dbop-as3525.c
#ifndef BOOTLOADER
target/arm/powermgmt-ascodec.c
target/arm/as3525/sansa-fuze/powermgmt-fuze.c
diff --git a/firmware/target/arm/as3525/button-e200v2-fuze.c b/firmware/target/arm/as3525/button-e200v2-fuze.c
index 157cdd02a3..98c660dd45 100644
--- a/firmware/target/arm/as3525/button-e200v2-fuze.c
+++ b/firmware/target/arm/as3525/button-e200v2-fuze.c
@@ -20,10 +20,12 @@
*
****************************************************************************/
+#include "config.h"
#include "system.h"
#include "button.h"
#include "button-target.h"
#include "backlight.h"
+#include "dbop-as3525.h"
#ifdef SANSA_FUZE
@@ -32,7 +34,6 @@
#define WHEEL_COUNTER_DIV 4
#define ACCEL_INCREMENT 2
#define ACCEL_SHIFT 2
-#define BUTTON_DELAY 60
#endif
#ifdef SANSA_E200V2
@@ -41,12 +42,6 @@
#define WHEEL_COUNTER_DIV 2
#define ACCEL_INCREMENT 3
#define ACCEL_SHIFT 1
-#define BUTTON_DELAY 20
-
-/* read_missed is true if buttons could not
- * be read (see lcd_button_support) */
-static bool read_missed = false;
-
#endif
/* Buttons */
@@ -54,10 +49,6 @@ static bool hold_button = false;
#ifndef BOOTLOADER
static bool hold_button_old = false;
#endif
-static unsigned short _dbop_din = BUTTON_NONE;
-
-/* in the lcd driver */
-extern bool lcd_button_support(void);
void button_init_device(void)
{
@@ -66,10 +57,9 @@ void button_init_device(void)
}
#if !defined(BOOTLOADER) && defined(HAVE_SCROLLWHEEL)
-static void scrollwheel(unsigned short dbop_din)
+static void scrollwheel(unsigned int wheel_value)
{
/* current wheel values, parsed from dbop and the resulting button */
- unsigned wheel_value = 0;
unsigned btn = BUTTON_NONE;
/* old wheel values */
static unsigned old_wheel_value = 0;
@@ -112,8 +102,6 @@ static void scrollwheel(unsigned short dbop_din)
return;
}
- wheel_value = (dbop_din >> 13) & (1<<1|1<<0);
-
if (old_wheel_value == wheel_tbl[0][wheel_value])
btn = BUTTON_SCROLL_FWD;
else if (old_wheel_value == wheel_tbl[1][wheel_value])
@@ -158,11 +146,7 @@ static void scrollwheel(unsigned short dbop_din)
last_wheel_post = current_tick;
}
}
- if (accel > 0
-#ifdef SANSA_E200V2
- && !read_missed /* decrement only if reading buttons was successful */
-#endif
- )
+ if (accel > 0)
accel--;
old_wheel_value = wheel_value;
@@ -174,123 +158,14 @@ bool button_hold(void)
return hold_button;
}
-static void button_delay(void)
-{
- int i = BUTTON_DELAY;
- while(i--) asm volatile ("nop\n");
-}
-
unsigned short button_read_dbop(void)
{
-#ifdef SANSA_FUZE
- /* skip home and power reading if lcd_button_support was blocked,
- * since the dbop bit 15 is invalid then, and use the old value instead
- * -20 (arbitary value) indicates valid home&power button read
- * (fuze only) */
- int old_home_power = -20;
-#endif
- if(!lcd_button_support())
- {
-#if defined(SANSA_FUZE)
- old_home_power = (_dbop_din & (1<<15|1<<8));
-#elif defined(SANSA_E200V2)
- read_missed = true;
-#endif
- }
-
-#ifdef SANSA_E200V2
- if (!read_missed) /* read buttons only if lcd_button_support was not blocked */
-#endif
- {
- /* Set up dbop for input */
- DBOP_CTRL |= (1<<19); /* Tri-state DBOP on read cycle */
- DBOP_CTRL &= ~(1<<16); /* disable output (1:write enabled) */
- DBOP_TIMPOL_01 = 0xe167e167; /* Set Timing & Polarity regs 0 & 1 */
- DBOP_TIMPOL_23 = 0xe167006e; /* Set Timing & Polarity regs 2 & 3 */
-
- button_delay();
- DBOP_CTRL |= (1<<15); /* start read */
- while (!(DBOP_STAT & (1<<16))); /* wait for valid data */
-
- _dbop_din = DBOP_DIN; /* Read dbop data*/
-
- /* Reset dbop for output */
- DBOP_TIMPOL_01 = 0x6e167; /* Set Timing & Polarity regs 0 & 1 */
- DBOP_TIMPOL_23 = 0xa167e06f; /* Set Timing & Polarity regs 2 & 3 */
- DBOP_CTRL |= (1<<16); /* Enable output (0:write disable) */
- DBOP_CTRL &= ~(1<<19); /* Tri-state when no active write */
- }
-
-#ifdef SANSA_FUZE
- /* write back old values if blocked */
- if (old_home_power != -20)
- {
- _dbop_din |= old_home_power & 1<<15;
- _dbop_din &= 0xfeff|(old_home_power & 1<<8);
- }
-#endif
-
+ unsigned dbop_din = dbop_read_input();
#if defined(HAVE_SCROLLWHEEL) && !defined(BOOTLOADER)
- /* read wheel on bit 13 & 14, but sent to the button queue seperately */
- scrollwheel(_dbop_din);
+ /* scroll wheel handling */
+ scrollwheel((dbop_din >> 13) & (1<<1|1<<0));
#endif
-
-#ifdef SANSA_E200V2
- read_missed = false;
-#endif
-
- return _dbop_din;
-}
-
-/* for the debug menu */
-unsigned short button_dbop_data(void)
-{
- return _dbop_din;
-}
-
-static int button_gpio(void)
-{
- int btn = BUTTON_NONE;
- if(hold_button)
- return btn;
-
- /* disable DBOP output while changing GPIO pins that share lines with it */
- DBOP_CTRL &= ~(1<<16);
- button_delay();
-
- /* set afsel, so that we can read our buttons */
- GPIOC_AFSEL &= ~(1<<2|1<<3|1<<4|1<<5|1<<6);
- /* set dir so we can read our buttons (but reset the C pins first) */
- GPIOB_DIR &= ~(1<<4);
- GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6);
- GPIOC_PIN(2) = (1<<2);
- GPIOC_PIN(3) = (1<<3);
- GPIOC_PIN(4) = (1<<4);
- GPIOC_PIN(5) = (1<<5);
- GPIOC_PIN(6) = (1<<6);
-
- GPIOC_DIR &= ~(1<<2|1<<3|1<<4|1<<5|1<<6);
-
- /* small delay needed to read buttons correctly */
- button_delay();
-
- /* direct GPIO connections */
- if (!GPIOC_PIN(3))
- btn |= BUTTON_LEFT;
- if (!GPIOC_PIN(2))
- btn |= BUTTON_UP;
- if (!GPIOC_PIN(6))
- btn |= BUTTON_DOWN;
- if (!GPIOC_PIN(5))
- btn |= BUTTON_RIGHT;
- if (!GPIOC_PIN(4))
- btn |= BUTTON_SELECT;
- /* return to settings needed for lcd */
- GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6);
- GPIOC_AFSEL |= (1<<2|1<<3|1<<4|1<<5|1<<6);
-
- DBOP_CTRL |= (1<<16); /* enable output again */
- return btn;
+ return dbop_din;
}
/*
@@ -298,51 +173,58 @@ static int button_gpio(void)
*/
int button_read_device(void)
{
- int btn = BUTTON_NONE;
- unsigned short dbop = button_read_dbop();
#ifdef SANSA_FUZE
static unsigned power_counter = 0;
#endif
- /* hold button */
- if(dbop & (1<<12))
+ unsigned short dbop_din;
+ int btn = BUTTON_NONE;
+
+ dbop_din = button_read_dbop();
+
+ /* hold button handling */
+ hold_button = ((dbop_din & (1<<12)) != 0);
+#ifndef BOOTLOADER
+ /* light handling */
+ if (hold_button != hold_button_old)
{
+ hold_button_old = hold_button;
+ backlight_hold_changed(hold_button);
+ }
+#endif /* BOOTLOADER */
+ if (hold_button) {
#ifdef SANSA_FUZE
power_counter = HZ;
#endif
- hold_button = true;
+ return 0;
}
- else
- {
- hold_button = false;
+
+ /* push button handling */
+ if ((dbop_din & (1 << 2)) == 0)
+ btn |= BUTTON_UP;
+ if ((dbop_din & (1 << 3)) == 0)
+ btn |= BUTTON_LEFT;
+ if ((dbop_din & (1 << 4)) == 0)
+ btn |= BUTTON_SELECT;
+ if ((dbop_din & (1 << 5)) == 0)
+ btn |= BUTTON_RIGHT;
+ if ((dbop_din & (1 << 6)) == 0)
+ btn |= BUTTON_DOWN;
+ if ((dbop_din & (1 << 8)) != 0)
+ btn |= BUTTON_POWER;
+ if ((dbop_din & (1 << 15)) == 0)
+ btn |= DBOP_BIT15_BUTTON;
+
#ifdef SANSA_FUZE
/* read power on bit 8, but not if hold button was just released, since
* you basically always hit power due to the slider mechanism after releasing
* (fuze only)
- * hold (wait 1 sec) */
- if (power_counter)
+ */
+ if (power_counter > 0) {
power_counter--;
-#endif
- if (dbop & (1<<8)
-#ifdef SANSA_FUZE
- && !power_counter
-#endif
- )
- btn |= BUTTON_POWER;
- /* read home on bit 15 */
- if (!(dbop & (1<<15)))
- btn |= DBOP_BIT15_BUTTON;
-
- btn |= button_gpio();
+ btn &= ~BUTTON_POWER;
}
-
-#ifndef BOOTLOADER
- /* light handling */
- if (hold_button != hold_button_old)
- {
- hold_button_old = hold_button;
- backlight_hold_changed(hold_button);
- }
-#endif /* BOOTLOADER */
+#endif
return btn;
}
+
diff --git a/firmware/target/arm/as3525/dbop-as3525.c b/firmware/target/arm/as3525/dbop-as3525.c
new file mode 100644
index 0000000000..938eee2fb1
--- /dev/null
+++ b/firmware/target/arm/as3525/dbop-as3525.c
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2009 by Bertrik Sikken
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "config.h"
+#include "as3525.h"
+#include "dbop-as3525.h"
+
+#if defined(SANSA_FUZE)
+#define DBOP_PRECHARGE 0x80FF
+#elif defined(SANSA_E200V2) || defined(SANSA_C200V2)
+#define DBOP_PRECHARGE 0xF0FF
+#endif
+
+static short int dbop_input_value = 0;
+
+/* read the DBOP data pins */
+unsigned short dbop_read_input(void)
+{
+ unsigned int dbop_ctrl_old = DBOP_CTRL;
+ unsigned int dbop_timpol23_old = DBOP_TIMPOL_23;
+
+ /* make sure that the DBOP FIFO is empty */
+ while ((DBOP_STAT & (1<<10)) == 0);
+
+ /* write DBOP_DOUT to pre-charge DBOP data lines with a defined level */
+ DBOP_TIMPOL_23 = 0xe007e007; /* no strobe towards lcd */
+ int delay = 10;
+ while (delay--) asm volatile ("nop\n");
+ DBOP_CTRL = (1 << 19) | /* tri-state output */
+ (1 << 16) | /* enw=1 (enable write) */
+ (1 << 12); /* ow=1 (16-bit data width) */
+ DBOP_DOUT = DBOP_PRECHARGE;
+ while ((DBOP_STAT & (1<<10)) == 0);
+
+#if defined(SANSA_FUZE) || defined(SANSA_E200V2)
+ delay = 50;
+ while (delay--) asm volatile ("nop\n");
+#endif
+
+ /* perform a DBOP read */
+ DBOP_CTRL = (1 << 19) | /* tri-state output */
+ (1 << 15) | /* strd=1 (start read) */
+ (1 << 12) | /* ow=1 (16-bit data width) */
+ (31 << 0); /* rs_t=31 (read DBOP at end of cycle) */
+ while ((DBOP_STAT & (1<<16)) == 0);
+ dbop_input_value = DBOP_DIN;
+
+ /* restore previous values */
+ DBOP_TIMPOL_23 = dbop_timpol23_old;
+ DBOP_CTRL = dbop_ctrl_old;
+
+ return dbop_input_value;
+}
+
+/* for the debug menu */
+unsigned short dbop_debug(void)
+{
+ return dbop_input_value;
+}
diff --git a/firmware/target/arm/as3525/dbop-as3525.h b/firmware/target/arm/as3525/dbop-as3525.h
new file mode 100644
index 0000000000..63156031c4
--- /dev/null
+++ b/firmware/target/arm/as3525/dbop-as3525.h
@@ -0,0 +1,23 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2009 by Bertrik Sikken
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+unsigned short int dbop_read_input(void);
+unsigned short dbop_debug(void);
diff --git a/firmware/target/arm/as3525/debug-as3525.c b/firmware/target/arm/as3525/debug-as3525.c
index be78bca0e0..6ec065b03c 100644
--- a/firmware/target/arm/as3525/debug-as3525.c
+++ b/firmware/target/arm/as3525/debug-as3525.c
@@ -68,7 +68,7 @@ extern bool sd_enabled;
* if I put the below into a sansa-fuze/debug-target.h, it doesn't work*/
#if defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_C200V2)
#define DEBUG_DBOP
-unsigned short button_dbop_data(void);
+#include "dbop-as3525.h"
#endif
static inline unsigned read_cp15 (void)
@@ -392,7 +392,7 @@ bool __dbg_ports(void)
#ifdef DEBUG_DBOP
line++;
lcd_puts(0, line++, "[DBOP_DIN]");
- lcd_putsf(0, line++, "DBOP_DIN: %4x", button_dbop_data());
+ lcd_putsf(0, line++, "DBOP_DIN: %4x", dbop_debug());
#endif
line++;
lcd_puts(0, line++, "[CP15]");
diff --git a/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c b/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c
index b7ce7330c0..8a95c2d661 100644
--- a/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c
+++ b/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c
@@ -5,9 +5,9 @@
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
- * $Id: button-e200v2.c 19035 2008-11-07 05:31:05Z jdgordon $
+ * $Id: button-c200v2.c 19035 2008-11-07 05:31:05Z jdgordon $
*
- * Copyright (C) 2006 by Barry Wardell
+ * Copyright (C) 2006 by Barry Wardell, (C) 2009 by Bertrik Sikken
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -19,29 +19,20 @@
*
****************************************************************************/
+#include "config.h"
#include "system.h"
#include "button-target.h"
#include "button.h"
#include "backlight.h"
-#include "powermgmt.h"
+#include "dbop-as3525.h"
-
-static unsigned short _dbop_din = 0xFFFF;
-
-/* in the lcd driver */
-extern unsigned short int lcd_dbop_input(void);
+static unsigned short _dbop_din;
static bool hold_button = false;
#ifndef BOOTLOADER
static bool hold_button_old = false;
#endif
-/* for the debug menu */
-unsigned short button_dbop_data(void)
-{
- return _dbop_din;
-}
-
void button_init_device(void)
{
GPIOA_DIR &= ~(1<<3);
@@ -59,7 +50,7 @@ int button_read_device(void)
{
int btn = BUTTON_NONE;
- _dbop_din = lcd_dbop_input();
+ _dbop_din = dbop_read_input();
/* hold button handling */
hold_button = ((_dbop_din & (1<<12)) == 0);
diff --git a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
index 79914e2e44..0d990dc538 100644
--- a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
+++ b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
@@ -26,6 +26,7 @@
#include "debug.h"
#include "system.h"
#include "clock-target.h"
+#include "dbop-as3525.h"
/* The controller is unknown, but some registers appear to be the same as the
HD66789R */
@@ -89,8 +90,6 @@ static unsigned short r_entry_mode = R_ENTRY_MODE_HORZ_NORMAL;
#define R_DISP_CONTROL_REV 0x0000
static unsigned short r_disp_control_rev = R_DISP_CONTROL_NORMAL;
-static volatile bool lcd_busy = false;
-
static inline void lcd_delay(int x)
{
do {
@@ -435,8 +434,6 @@ void lcd_blit_yuv(unsigned char * const src[3],
yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1);
yuv_src[2] = src[2] + (yuv_src[1] - src[1]);
- lcd_busy = true;
-
lcd_write_reg(R_ENTRY_MODE,
display_flipped ? R_ENTRY_MODE_VIDEO_FLIPPED : R_ENTRY_MODE_VIDEO_NORMAL
);
@@ -473,8 +470,6 @@ void lcd_blit_yuv(unsigned char * const src[3],
}
while (--height > 0);
}
-
- lcd_busy = false;
}
/* Update the display.
@@ -484,8 +479,6 @@ void lcd_update(void)
if (!display_on)
return;
- lcd_busy = true;
-
lcd_write_reg(R_ENTRY_MODE, r_entry_mode);
/* Set start position and window */
@@ -494,8 +487,6 @@ void lcd_update(void)
lcd_write_cmd(R_WRITE_DATA_2_GRAM);
lcd_write_data((fb_data*)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT);
-
- lcd_busy = false;
}
/* Update a fraction of the display. */
@@ -525,8 +516,6 @@ void lcd_update_rect(int x, int y, int width, int height)
if (y >= ymax)
return; /* nothing left to do */
- lcd_busy = true;
-
lcd_write_reg(R_ENTRY_MODE, r_entry_mode);
lcd_window(x, y, xmax, ymax);
@@ -541,25 +530,4 @@ void lcd_update_rect(int x, int y, int width, int height)
ptr += LCD_WIDTH;
}
while (--height >= 0);
-
- lcd_busy = false;
-}
-
-/* writes one red pixel outside the visible area, needed for correct
- * dbop reads */
-bool lcd_button_support(void)
-{
- if (lcd_busy)
- return false;
-
- lcd_write_reg(R_ENTRY_MODE, r_entry_mode);
-
- /* Set start position and window */
- lcd_window(LCD_WIDTH+1, LCD_HEIGHT+1, LCD_WIDTH+2, LCD_HEIGHT+2);
-
- lcd_write_cmd(R_WRITE_DATA_2_GRAM);
-
- lcd_write_value16(0xf<<12);
-
- return true;
}
diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
index d10396cfd4..f9d5e5ace1 100644
--- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
+++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
@@ -28,6 +28,7 @@
#include "debug.h"
#include "system.h"
#include "clock-target.h"
+#include "dbop-as3525.h"
/* The controller is unknown, but some registers appear to be the same as the
HD66789R */
@@ -92,7 +93,6 @@ static unsigned short r_entry_mode = R_ENTRY_MODE_HORZ_NORMAL;
static unsigned short r_disp_control_rev = R_DISP_CONTROL_NORMAL;
static const int xoffset = 20;
-static volatile bool lcd_busy = false;
static inline void lcd_delay(int x)
{
@@ -379,8 +379,6 @@ void lcd_blit_yuv(unsigned char * const src[3],
yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1);
yuv_src[2] = src[2] + (yuv_src[1] - src[1]);
- lcd_busy = true;
-
#ifdef HAVE_LCD_FLIP
lcd_write_reg(R_ENTRY_MODE,
display_flipped ? R_ENTRY_MODE_VIDEO_FLIPPED : R_ENTRY_MODE_VIDEO_NORMAL
@@ -423,8 +421,6 @@ void lcd_blit_yuv(unsigned char * const src[3],
}
while (--height > 0);
}
-
- lcd_busy = false;
}
/* Update the display.
@@ -434,8 +430,6 @@ void lcd_update(void)
if (!display_on)
return;
- lcd_busy = true;
-
lcd_write_reg(R_ENTRY_MODE, r_entry_mode);
lcd_window_x(0, LCD_WIDTH - 1);
@@ -444,8 +438,6 @@ void lcd_update(void)
lcd_write_cmd(R_WRITE_DATA_2_GRAM);
lcd_write_data((fb_data*)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT);
-
- lcd_busy = false;
}
/* Update a fraction of the display. */
@@ -475,8 +467,6 @@ void lcd_update_rect(int x, int y, int width, int height)
if (y >= ymax)
return; /* nothing left to do */
- lcd_busy = true;
-
lcd_write_reg(R_ENTRY_MODE, r_entry_mode);
lcd_window_x(x, xmax);
@@ -493,26 +483,4 @@ void lcd_update_rect(int x, int y, int width, int height)
ptr += LCD_WIDTH;
}
while (--height >= 0);
-
- lcd_busy = false;
-}
-
-/* writes one red pixel outside the visible area, needed for correct
- * dbop reads */
-bool lcd_button_support(void)
-{
- if (lcd_busy)
- return false;
-
- lcd_write_reg(R_ENTRY_MODE, r_entry_mode);
-
- /* Set start position and window */
- lcd_window_x(-1, 0);
- lcd_window_y(-1, 0);
-
- lcd_write_cmd(R_WRITE_DATA_2_GRAM);
-
- lcd_write_value16(0xf<<12);
-
- return true;
}
diff --git a/firmware/target/arm/lcd-c200_c200v2.c b/firmware/target/arm/lcd-c200_c200v2.c
index 62f1dc20f6..45a37d9d7b 100644
--- a/firmware/target/arm/lcd-c200_c200v2.c
+++ b/firmware/target/arm/lcd-c200_c200v2.c
@@ -25,11 +25,8 @@
#include "lcd.h"
#include "kernel.h"
#include "system.h"
-
#ifdef SANSA_C200V2
-/* button driver needs to know if a lcd operation is in progress */
-static bool lcd_busy = false;
-static unsigned short dbop_input = 0xFFFF;
+#include "dbop-as3525.h"
#endif
/* Display status */
@@ -183,45 +180,6 @@ static inline void as3525_dbop_init(void)
lcd_delay(20);
}
-static unsigned short lcd_dbop_read(void)
-{
- unsigned int dbop_ctrl_old = DBOP_CTRL;
- unsigned int dbop_timpol23_old = DBOP_TIMPOL_23;
- unsigned int value;
-
- /* make sure that the DBOP FIFO is empty */
- while ((DBOP_STAT & (1<<10)) == 0);
-
- /* write DBOP_DOUT to pre-charge DBOP data lines with a high level */
- DBOP_TIMPOL_23 = 0xe167e167; /* no strobe towards lcd */
- DBOP_CTRL = (1 << 16) | /* enw=1 (enable write) */
- (1 << 12); /* ow=1 (16-bit data width) */
- DBOP_DOUT = 0xFFFF; /* all pins high */
- while ((DBOP_STAT & (1<<10)) == 0);
-
- /* perform a DBOP read */
- DBOP_CTRL = (1 << 15) | /* strd=1 (start read) */
- (1 << 12) | /* ow=1 (16-bit data width) */
- (31 << 0); /* rs_t=31 (read DBOP at end of cycle) */
- while ((DBOP_STAT & (1<<16)) == 0);
- value = DBOP_DIN;
-
- /* restore previous values */
- DBOP_TIMPOL_23 = dbop_timpol23_old;
- DBOP_CTRL = dbop_ctrl_old;
-
- return value;
-}
-
-/* get the DBOP input value, either directly or cached if DBOP is busy */
-unsigned short int lcd_dbop_input(void)
-{
- if (!lcd_busy) {
- dbop_input = lcd_dbop_read();
- }
- return dbop_input;
-}
-
#endif
/* LCD init */
@@ -292,13 +250,7 @@ int lcd_default_contrast(void)
void lcd_set_contrast(int val)
{
-#ifdef SANSA_C200V2
- lcd_busy = true;
-#endif
lcd_send_command(R_CONTRAST_CONTROL1, val);
-#ifdef SANSA_C200V2
- lcd_busy = false;
-#endif
}
void lcd_set_invert_display(bool yesno)
@@ -313,9 +265,6 @@ void lcd_enable(bool yesno)
if (yesno == is_lcd_enabled)
return;
-#ifdef SANSA_C200V2
- lcd_busy = true;
-#endif
if ((is_lcd_enabled = yesno))
{
lcd_send_command(R_STANDBY_OFF, 0);
@@ -326,9 +275,6 @@ void lcd_enable(bool yesno)
{
lcd_send_command(R_STANDBY_ON, 0);
}
-#ifdef SANSA_C200V2
- lcd_busy = false;
-#endif
}
#endif
@@ -343,18 +289,12 @@ bool lcd_active(void)
/* turn the display upside down (call lcd_update() afterwards) */
void lcd_set_flip(bool yesno)
{
-#ifdef SANSA_C200V2
- lcd_busy = true;
-#endif
lcd_send_command(R_DRIVER_OUTPUT_MODE, yesno ? 0x02 : 0x07);
-#ifdef SANSA_C200V2
- lcd_busy = false;
-#endif
}
/*** update functions ***/
-#if MEMORYSIZE > 2
+#if MEMORYSIZE > 2 /* not for C200V2 */
void lcd_yuv_set_options(unsigned options)
{
lcd_yuv_options = options;
@@ -450,12 +390,6 @@ void lcd_update_rect(int x, int y, int width, int height)
addr = &lcd_framebuffer[y][x];
-#ifdef SANSA_C200V2
- lcd_busy = true;
- /* perform a dbop read before doing a potentially lengthy lcd update */
- dbop_input = lcd_dbop_read();
-#endif
-
if (width <= 1) {
/* The X end address must be larger than the X start address, so we
* switch to vertical mode for single column updates and set the
@@ -476,8 +410,4 @@ void lcd_update_rect(int x, int y, int width, int height)
lcd_write_data(addr, width);
addr += LCD_WIDTH;
} while (--height > 0);
-
-#ifdef SANSA_C200V2
- lcd_busy = false;
-#endif
}