Index: firmware/export/config/sansafuze.h
===================================================================
--- firmware/export/config/sansafuze.h (revision 24186)
+++ firmware/export/config/sansafuze.h (working copy)
@@ -204,3 +204,4 @@

#define INCLUDE_TIMEOUT_API

+#define DBOP_PRECHARGE 0x80FF
Index: firmware/export/config/sansac200v2.h
===================================================================
--- firmware/export/config/sansac200v2.h (revision 24186)
+++ firmware/export/config/sansac200v2.h (working copy)
@@ -197,3 +197,5 @@
#define DEFAULT_REC_MIC_GAIN 23
#define DEFAULT_REC_LEFT_GAIN 23
#define DEFAULT_REC_RIGHT_GAIN 23
+
+#define DBOP_PRECHARGE 0xF0FF
Index: firmware/export/config/sansae200v2.h
===================================================================
--- firmware/export/config/sansae200v2.h (revision 24186)
+++ firmware/export/config/sansae200v2.h (working copy)
@@ -210,3 +210,5 @@
#define DEFAULT_REC_MIC_GAIN 23
#define DEFAULT_REC_LEFT_GAIN 23
#define DEFAULT_REC_RIGHT_GAIN 23
+
+#define DBOP_PRECHARGE 0xF0FF
Index: firmware/SOURCES
===================================================================
--- firmware/SOURCES (revision 24186)
+++ firmware/SOURCES (working copy)
@@ -1235,6 +1235,7 @@
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/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/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
Index: firmware/target/arm/lcd-c200_c200v2.c
===================================================================
--- firmware/target/arm/lcd-c200_c200v2.c (revision 24186)
+++ firmware/target/arm/lcd-c200_c200v2.c (working copy)
@@ -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 @@
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 @@

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 @@
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 @@
{
lcd_send_command(R_STANDBY_ON, 0);
}
-#ifdef SANSA_C200V2
- lcd_busy = false;
-#endif
}
#endif

@@ -343,18 +289,12 @@
/* 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 @@

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 @@
lcd_write_data(addr, width);
addr += LCD_WIDTH;
} while (--height > 0);
-
-#ifdef SANSA_C200V2
- lcd_busy = false;
-#endif
}
Index: firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c
===================================================================
--- firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c (revision 24186)
+++ firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c (working copy)
@@ -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;

-static unsigned short _dbop_din = 0xFFFF;
-
-/* in the lcd driver */
-extern unsigned short int lcd_dbop_input(void);
-
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 btn = BUTTON_NONE;

- _dbop_din = lcd_dbop_input();
+ _dbop_din = dbop_read_input();

/* hold button handling */
hold_button = ((_dbop_din & (1<<12)) == 0);
Index: firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
===================================================================
--- firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c (revision 24186)
+++ firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c (working copy)
@@ -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 @@
#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 @@
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 @@
}
while (--height > 0);
}
-
- lcd_busy = false;
}

/* Update the display.
@@ -484,8 +479,6 @@
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 @@
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 @@
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 @@
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;
-}
Index: firmware/target/arm/as3525/dbop-as3525.c
===================================================================
--- firmware/target/arm/as3525/dbop-as3525.c (revision 0)
+++ firmware/target/arm/as3525/dbop-as3525.c (revision 0)
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * __________ __ ___.
+ * 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"
+
+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;
+}
Index: firmware/target/arm/as3525/debug-as3525.c
===================================================================
--- firmware/target/arm/as3525/debug-as3525.c (revision 24186)
+++ firmware/target/arm/as3525/debug-as3525.c (working copy)
@@ -68,7 +68,7 @@
* 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 @@
#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]");
Index: firmware/target/arm/as3525/dbop-as3525.h
===================================================================
--- firmware/target/arm/as3525/dbop-as3525.h (revision 0)
+++ firmware/target/arm/as3525/dbop-as3525.h (revision 0)
@@ -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);
Index: firmware/target/arm/as3525/button-e200v2-fuze.c
===================================================================
--- firmware/target/arm/as3525/button-e200v2-fuze.c (revision 24186)
+++ firmware/target/arm/as3525/button-e200v2-fuze.c (working copy)
@@ -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,11 +49,7 @@
#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)
{
GPIOA_DIR |= (1<<1);
@@ -66,10 +57,9 @@
}

#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 @@
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 @@
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,175 +158,73 @@
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;
+ 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;
-}
-
/*
* Get button pressed from hardware
*/
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--;
+ btn &= ~BUTTON_POWER;
+ }
#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();
- }
-
-#ifndef BOOTLOADER
- /* light handling */
- if (hold_button != hold_button_old)
- {
- hold_button_old = hold_button;
- backlight_hold_changed(hold_button);
- }
-#endif /* BOOTLOADER */
-
return btn;
}
+
Index: firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
===================================================================
--- firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c (revision 24186)
+++ firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c (working copy)
@@ -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_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 @@
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 @@
}
while (--height > 0);
}
-
- lcd_busy = false;
}

/* Update the display.
@@ -434,8 +430,6 @@
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 @@
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 @@
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 @@
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;
-}