diff options
| author | Dave Chapman <dave@dchapman.com> | 2009-10-04 17:32:51 +0000 |
|---|---|---|
| committer | Dave Chapman <dave@dchapman.com> | 2009-10-04 17:32:51 +0000 |
| commit | b349d8b0eac089260a66b4bd847da859e6ba53e7 (patch) | |
| tree | 16c909d4e2db88a2f375093add503e4b276621b5 | |
| parent | 45c411e6c8b73f0b3ab4bc69eb6da15901ced59c (diff) | |
| download | rockbox-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.c | 53 |
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 */ |