summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2009-10-04 17:32:51 +0000
committerDave Chapman <dave@dchapman.com>2009-10-04 17:32:51 +0000
commitb349d8b0eac089260a66b4bd847da859e6ba53e7 (patch)
tree16c909d4e2db88a2f375093add503e4b276621b5
parent45c411e6c8b73f0b3ab4bc69eb6da15901ced59c (diff)
downloadrockbox-b349d8b0eac089260a66b4bd847da859e6ba53e7.zip
rockbox-b349d8b0eac089260a66b4bd847da859e6ba53e7.tar.gz
rockbox-b349d8b0eac089260a66b4bd847da859e6ba53e7.tar.bz2
rockbox-b349d8b0eac089260a66b4bd847da859e6ba53e7.tar.xz
Implement lcd_update_rect()
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22924 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
index 2887dad..6ce9707 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
@@ -205,13 +205,54 @@ void lcd_update(void)
void lcd_update_rect(int, int, int, int) ICODE_ATTR;
void lcd_update_rect(int x, int y, int width, int height)
{
- (void)x;
- (void)y;
- (void)width;
- (void)height;
+ int xx,yy;
+ int y0, x0, y1, x1;
+ fb_data* p;
+ fb_data pixel;
+
+ x0 = x; /* start horiz */
+ y0 = y; /* start vert */
+ x1 = (x + width) - 1; /* max horiz */
+ y1 = (y + height) - 1; /* max vert */
+
+ if (lcd_type==0) {
+ s5l_lcd_write_cmd_data(R_HORIZ_ADDR_START_POS, x0);
+ s5l_lcd_write_cmd_data(R_HORIZ_ADDR_END_POS, x1);
+ s5l_lcd_write_cmd_data(R_VERT_ADDR_START_POS, y0);
+ s5l_lcd_write_cmd_data(R_VERT_ADDR_END_POS, y1);
- /* TODO. For now, just do a full-screen update */
- lcd_update();
+ s5l_lcd_write_cmd_data(R_HORIZ_GRAM_ADDR_SET, (x1 << 8) | x0);
+ s5l_lcd_write_cmd_data(R_VERT_GRAM_ADDR_SET, (y1 << 8) | y0);
+
+ s5l_lcd_write_cmd(0);
+ s5l_lcd_write_cmd(R_WRITE_DATA_TO_GRAM);
+ } else {
+ s5l_lcd_write_cmd(R_COLUMN_ADDR_SET);
+ s5l_lcd_write_data(x0); /* Start column */
+ s5l_lcd_write_data(x1); /* End column */
+
+ s5l_lcd_write_cmd(R_ROW_ADDR_SET);
+ s5l_lcd_write_data(y0); /* Start row */
+ s5l_lcd_write_data(y1); /* End row */
+
+ s5l_lcd_write_cmd(R_MEMORY_WRITE);
+ }
+
+
+ /* Copy display bitmap to hardware */
+ p = &lcd_framebuffer[y0][x0];
+ yy = height;
+ for (yy = y0; yy <= y1; yy++) {
+ for (xx = x0; xx <= x1; xx++) {
+ pixel = *(p++);
+
+ while (LCD_STATUS & 0x10);
+ LCD_WDATA = (pixel & 0xff00) >> 8;
+ while (LCD_STATUS & 0x10);
+ LCD_WDATA = pixel & 0xff;
+ }
+ p += LCD_WIDTH - width;
+ }
}
/* Performance function to blit a YUV bitmap directly to the LCD */