Index: rockbox-c240v2/firmware/target/arm/lcd-c200_c200v2.c =================================================================== --- rockbox-c240v2/firmware/target/arm/lcd-c200_c200v2.c (revision 27113) +++ rockbox-c240v2/firmware/target/arm/lcd-c200_c200v2.c (working copy) @@ -27,6 +27,7 @@ #include "system.h" #ifdef SANSA_C200V2 #include "dbop-as3525.h" +#include "button-target.h" #endif /* Display status */ @@ -129,6 +130,7 @@ /* send LCD data */ void lcd_write_data(const fb_data *data, int width) { + button_prohibit_updates(1); do { DBOP_DOUT = *data << 8 | *data >> 8; data++; @@ -139,11 +141,13 @@ /* While push fifo is not empty */ while ((DBOP_STAT & (1<<10)) == 0); + button_prohibit_updates(0); } /* send LCD command */ static void lcd_send_command(unsigned char cmd, unsigned char val) { + button_prohibit_updates(1); DBOP_TIMPOL_23 = 0xa167006e; DBOP_DOUT = cmd | val << 8; @@ -151,6 +155,7 @@ while ((DBOP_STAT & (1<<10)) == 0); DBOP_TIMPOL_23 = 0xa167e06f; + button_prohibit_updates(0); } static inline void as3525_dbop_init(void) Index: rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/button-target.h =================================================================== --- rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/button-target.h (revision 27113) +++ rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/button-target.h (working copy) @@ -30,6 +30,7 @@ bool button_hold(void); void button_init_device(void); int button_read_device(void); +void button_prohibit_updates(int prohibit); /* Sandisk Sansa c200 button codes */ Index: rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c =================================================================== --- rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c (revision 27113) +++ rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c (working copy) @@ -27,6 +27,9 @@ #include "dbop-as3525.h" static unsigned short _dbop_din; +static unsigned int button_state = BUTTON_NONE; +static unsigned int button_prohibit = 0; +static unsigned int button_last_update; static bool hold_button = false; #ifndef BOOTLOADER @@ -43,10 +46,7 @@ return hold_button; } -/* - * Get button pressed from hardware - */ -int button_read_device(void) +static void button_update_state(void) { int btn = BUTTON_NONE; @@ -63,7 +63,8 @@ } #endif /* BOOTLOADER */ if (hold_button) { - return 0; + button_state = 0; + return; } /* direct GPIO connections */ @@ -88,5 +89,32 @@ if(!(_dbop_din & (1<<15))) btn |= BUTTON_REC; - return btn; + button_last_update = current_tick; + button_state = btn; } + +void button_prohibit_updates(int prohibit) +{ + if (prohibit) + button_prohibit++; + else + button_prohibit--; + + if (prohibit != 0) + return; + + if (button_last_update != current_tick) + button_update_state(); +} + + +/* + * Get button pressed from hardware + */ +int button_read_device(void) +{ + if (!button_prohibit) + button_update_state(); + + return button_state; +}