From cb2c947b1b7fef96892f474144e61b8bbd87a615 Mon Sep 17 00:00:00 2001 From: Rafaël Carré Date: Sat, 20 Jun 2009 22:49:04 +0000 Subject: Sansa c200v1 & c200v2 LCD: higher performance when writing pixels c200v1: use a loop similar to r21320 and before to get almost the same performance (49.x fps while r21320 had 50.7 fps) c200v2: better use of the DBOP fifo (taken from r21190) : 30% more fps rename lcd_send_data to lcd_write_data now that it has the same prototype git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21427 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/lcd-c200_c200v2.c | 38 +++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'firmware/target/arm/lcd-c200_c200v2.c') diff --git a/firmware/target/arm/lcd-c200_c200v2.c b/firmware/target/arm/lcd-c200_c200v2.c index b3e8f0eb4f..619a03b61e 100644 --- a/firmware/target/arm/lcd-c200_c200v2.c +++ b/firmware/target/arm/lcd-c200_c200v2.c @@ -78,15 +78,19 @@ static inline void lcd_wait_write(void) } /* send LCD data */ -static void lcd_send_data(const fb_data *data, int width) +static void lcd_send_pixel(const fb_data data) { - while(width--) - { - lcd_wait_write(); - LCD1_DATA = *data >> 8; - lcd_wait_write(); - LCD1_DATA = *data++ & 0xff; - } + lcd_wait_write(); + LCD1_DATA = data >> 8; + lcd_wait_write(); + LCD1_DATA = data & 0xff; +} + +inline void lcd_write_data(const fb_data *data, int width) +{ + do { + lcd_send_pixel(*data++); + } while(--width); } /* send LCD command */ @@ -129,14 +133,18 @@ static inline void lcd_delay(int delay) } /* send LCD data */ -static void lcd_send_data(const fb_data *data, int width) +void lcd_write_data(const fb_data *data, int width) { - while(width--) - { + do { DBOP_DOUT = *data << 8 | *data >> 8; data++; - while ((DBOP_STAT & (1<<10)) == 0); - } + + /* Wait if push fifo is full */ + while ((DBOP_STAT & (1<<6)) != 0); + } while(--width); + + /* While push fifo is not empty */ + while ((DBOP_STAT & (1<<10)) == 0); } /* send LCD command */ @@ -184,7 +192,7 @@ bool lcd_button_support(void) lcd_send_command(R_Y_ADDR_AREA, 0); lcd_send_command(1, 0); - lcd_send_data(&data, 1); + lcd_write_data(&data, 1); return true; } @@ -445,7 +453,7 @@ void lcd_update_rect(int x, int y, int width, int height) lcd_send_command(y + height - 1 + 0x1a, 0); do { - lcd_send_data(addr, width); + lcd_write_data(addr, width); addr += LCD_WIDTH; } while (--height > 0); -- cgit v1.2.3