Index: firmware/SOURCES =================================================================== --- firmware/SOURCES (revision 22682) +++ firmware/SOURCES (working copy) @@ -1185,6 +1185,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 @@ -1197,6 +1198,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 */ @@ -1219,6 +1221,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 22682) +++ 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 */ @@ -293,11 +251,11 @@ void lcd_set_contrast(int val) { #ifdef SANSA_C200V2 - lcd_busy = true; + dbop_lock(); #endif lcd_send_command(R_CONTRAST_CONTROL1, val); #ifdef SANSA_C200V2 - lcd_busy = false; + dbop_unlock(); #endif } @@ -314,7 +272,7 @@ return; #ifdef SANSA_C200V2 - lcd_busy = true; + dbop_lock(); #endif if ((is_lcd_enabled = yesno)) { @@ -327,7 +285,7 @@ lcd_send_command(R_STANDBY_ON, 0); } #ifdef SANSA_C200V2 - lcd_busy = false; + dbop_unlock(); #endif } #endif @@ -344,11 +302,11 @@ void lcd_set_flip(bool yesno) { #ifdef SANSA_C200V2 - lcd_busy = true; + dbop_lock(); #endif lcd_send_command(R_DRIVER_OUTPUT_MODE, yesno ? 0x02 : 0x07); #ifdef SANSA_C200V2 - lcd_busy = false; + dbop_unlock(); #endif } @@ -451,9 +409,7 @@ 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(); + dbop_lock(); #endif if (width <= 1) { @@ -478,6 +434,6 @@ } while (--height > 0); #ifdef SANSA_C200V2 - lcd_busy = false; + dbop_unlock(); #endif } Index: firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c =================================================================== --- firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c (revision 22682) +++ firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c (working copy) @@ -19,18 +19,15 @@ * ****************************************************************************/ +#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; @@ -59,7 +56,7 @@ { int btn = BUTTON_NONE; - _dbop_din = lcd_dbop_input(); + _dbop_din = dbop_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 22682) +++ firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c (working copy) @@ -32,13 +32,10 @@ #include "font.h" #include "bidi.h" #include "clock-target.h" +#include "dbop-as3525.h" static bool display_on = false; /* is the display turned on? */ static bool display_flipped = false; -/* we need to write a red pixel for correct button reads - * (see lcd_button_support()), but that must not happen while the lcd is - * updating so block lcd_button_support the during updates */ -static volatile bool lcd_busy = false; /* register defines */ #define R_START_OSC 0x00 @@ -437,7 +434,7 @@ unsigned char const * yuv_src[3]; off_t z; - lcd_busy = true; + dbop_lock(); /* Sorry, but width and height must be >= 2 or else */ width &= ~1; @@ -492,7 +489,7 @@ while (--height > 0); } - lcd_busy = false; + dbop_unlock(); } /* Update the display. @@ -502,9 +499,10 @@ if (!display_on) return; + dbop_lock(); + lcd_write_reg(R_ENTRY_MODE, r_entry_mode); - lcd_busy = true; /* Set start position and window */ lcd_window(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1); @@ -512,7 +510,7 @@ lcd_write_data((fb_data*)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT); - lcd_busy = false; + dbop_unlock(); } /* lcd_update */ @@ -544,8 +542,9 @@ if (y >= ymax) return; /* nothing left to do */ + dbop_lock(); + lcd_write_reg(R_ENTRY_MODE, r_entry_mode); - lcd_busy = true; lcd_window(x, y, xmax, ymax); lcd_write_cmd(R_WRITE_DATA_2_GRAM); @@ -558,24 +557,9 @@ } while (++y <= ymax); - lcd_busy = false; + dbop_unlock(); } /* lcd_update_rect */ -/* writes one red pixel outside the visible area, needed for correct - * dbop reads */ -bool lcd_button_support(void) -{ - fb_data data = (0xf<<12); - 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_single_data16(data); - return true; -} Index: firmware/target/arm/as3525/kernel-as3525.c =================================================================== --- firmware/target/arm/as3525/kernel-as3525.c (revision 22682) +++ firmware/target/arm/as3525/kernel-as3525.c (working copy) @@ -24,40 +24,14 @@ #include "panic.h" #include "timer.h" -#ifdef HAVE_SCROLLWHEEL -/* let the timer interrupt twice as often for the scrollwheel polling */ -#define KERNEL_TIMER_FREQ (TIMER_FREQ/2) -#else #define KERNEL_TIMER_FREQ TIMER_FREQ -#endif -#ifdef HAVE_SCROLLWHEEL -#include "button-target.h" -/* The scrollwheel is polled every 5 ms (the tick tasks only every 10) */ -static int poll_scrollwheel = 0; - void INT_TIMER2(void) { - if (!poll_scrollwheel) - call_tick_tasks(); /* Run through the list of tick tasks - * (that includes reading the scrollwheel) */ - else - { - if (!button_hold()) - button_read_dbop(); /* Read the scrollwheel */ - } - - poll_scrollwheel ^= 1; - TIMER2_INTCLR = 0; /* clear interrupt */ -} -#else -void INT_TIMER2(void) -{ call_tick_tasks(); /* Run through the list of tick tasks */ TIMER2_INTCLR = 0; /* clear interrupt */ } -#endif void tick_start(unsigned int interval_in_ms) { 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,83 @@ +/*************************************************************************** + * __________ __ ___. + * 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" + +#define DBOP_IDLE_VALUE 0xF0FF + +static int dbop_locked = 0; +static short int dbop_input_value = DBOP_IDLE_VALUE; + +/* read the DBOP data pins */ +static unsigned short dbop_read_input(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 = 0xe007e007; /* no strobe towards lcd */ + DBOP_CTRL = (1 << 16) | /* enw=1 (enable write) */ + (1 << 12); /* ow=1 (16-bit data width) */ + DBOP_DOUT = DBOP_IDLE_VALUE; /* 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 dbop_input(void) +{ + if (dbop_locked == 0) { + dbop_input_value = dbop_read_input(); + } + return dbop_input_value; +} + +/* increase dbop lock count, if not locked yet a DBOP input sample is taken */ +void dbop_lock(void) +{ + dbop_input(); + dbop_locked++; +} + +/* decrease dbop lock count */ +void dbop_unlock(void) +{ + dbop_locked--; +} + Property changes on: firmware/target/arm/as3525/dbop-as3525.c ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native 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,25 @@ +/*************************************************************************** + * __________ __ ___. + * 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_input(void); +void dbop_lock(void); +void dbop_unlock(void); + Property changes on: firmware/target/arm/as3525/dbop-as3525.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Index: firmware/target/arm/as3525/button-e200v2-fuze.c =================================================================== --- firmware/target/arm/as3525/button-e200v2-fuze.c (revision 22682) +++ 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 */ @@ -56,8 +51,6 @@ #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 +59,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; @@ -109,9 +101,6 @@ return; } - wheel_value = dbop_din & (1<<13|1<<14); - wheel_value >>= 13; - if (old_wheel_value == wheel_tbl[0][wheel_value]) btn = BUTTON_SCROLL_FWD; else if (old_wheel_value == wheel_tbl[1][wheel_value]) @@ -151,11 +140,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; @@ -167,175 +152,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 - -#if defined(HAVE_SCROLLWHEEL) && !defined(BOOTLOADER) - /* read wheel on bit 13 & 14, but sent to the button queue seperately */ - scrollwheel(_dbop_din); -#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; -} - /* * 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)) + int btn = BUTTON_NONE; + + _dbop_din = dbop_input(); + + /* 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 + +#if defined(HAVE_SCROLLWHEEL) && !defined(BOOTLOADER) + /* scroll wheel handling */ + scrollwheel((_dbop_din >> 13) & 3); #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 22682) +++ 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 */ @@ -43,10 +44,6 @@ static bool display_on = false; /* is the display turned on? */ static bool display_flipped = false; static int xoffset = 20; /* needed for flip */ -/* we need to write a red pixel for correct button reads - * (see lcd_button_support()),but that must not happen while the lcd is updating - * so block lcd_button_support the during updates */ -static bool lcd_busy = false; static inline void lcd_delay(int x) { @@ -279,7 +276,7 @@ unsigned char const * yuv_src[3]; off_t z; - lcd_busy = true; + dbop_lock(); lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_VERT); @@ -327,7 +324,7 @@ while (--height > 0); } - lcd_busy = false; + dbop_unlock(); } void lcd_init_device() @@ -349,9 +346,11 @@ { if (!display_on) return; + + dbop_lock(); + lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ); - lcd_busy = true; lcd_window_x(0, LCD_WIDTH - 1); lcd_window_y(0, LCD_HEIGHT - 1); @@ -360,7 +359,8 @@ /* Write data */ lcd_write_data((unsigned short *)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT); - lcd_busy = false; + + dbop_unlock(); } /* Update a fraction of the display. */ @@ -391,9 +391,10 @@ if (y >= ymax) return; /* nothing left to do */ + dbop_lock(); + lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ); - lcd_busy = true; lcd_window_x(x, xmax); lcd_window_y(y, ymax); @@ -408,23 +409,7 @@ ptr += LCD_WIDTH; } while (++y <= ymax); - lcd_busy = false; -} -/* writes one read pixel outside the visible area, needed for correct dbop reads */ -bool lcd_button_support(void) -{ - fb_data data = 0xf<<12; - if (lcd_busy) - return false; - lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ); - /* 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(data); - - return true; + dbop_unlock(); } +