summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 2887dad8ee..6ce9707732 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)
205void lcd_update_rect(int, int, int, int) ICODE_ATTR; 205void lcd_update_rect(int, int, int, int) ICODE_ATTR;
206void lcd_update_rect(int x, int y, int width, int height) 206void lcd_update_rect(int x, int y, int width, int height)
207{ 207{
208 (void)x; 208 int xx,yy;
209 (void)y; 209 int y0, x0, y1, x1;
210 (void)width; 210 fb_data* p;
211 (void)height; 211 fb_data pixel;
212
213 x0 = x; /* start horiz */
214 y0 = y; /* start vert */
215 x1 = (x + width) - 1; /* max horiz */
216 y1 = (y + height) - 1; /* max vert */
217
218 if (lcd_type==0) {
219 s5l_lcd_write_cmd_data(R_HORIZ_ADDR_START_POS, x0);
220 s5l_lcd_write_cmd_data(R_HORIZ_ADDR_END_POS, x1);
221 s5l_lcd_write_cmd_data(R_VERT_ADDR_START_POS, y0);
222 s5l_lcd_write_cmd_data(R_VERT_ADDR_END_POS, y1);
212 223
213 /* TODO. For now, just do a full-screen update */ 224 s5l_lcd_write_cmd_data(R_HORIZ_GRAM_ADDR_SET, (x1 << 8) | x0);
214 lcd_update(); 225 s5l_lcd_write_cmd_data(R_VERT_GRAM_ADDR_SET, (y1 << 8) | y0);
226
227 s5l_lcd_write_cmd(0);
228 s5l_lcd_write_cmd(R_WRITE_DATA_TO_GRAM);
229 } else {
230 s5l_lcd_write_cmd(R_COLUMN_ADDR_SET);
231 s5l_lcd_write_data(x0); /* Start column */
232 s5l_lcd_write_data(x1); /* End column */
233
234 s5l_lcd_write_cmd(R_ROW_ADDR_SET);
235 s5l_lcd_write_data(y0); /* Start row */
236 s5l_lcd_write_data(y1); /* End row */
237
238 s5l_lcd_write_cmd(R_MEMORY_WRITE);
239 }
240
241
242 /* Copy display bitmap to hardware */
243 p = &lcd_framebuffer[y0][x0];
244 yy = height;
245 for (yy = y0; yy <= y1; yy++) {
246 for (xx = x0; xx <= x1; xx++) {
247 pixel = *(p++);
248
249 while (LCD_STATUS & 0x10);
250 LCD_WDATA = (pixel & 0xff00) >> 8;
251 while (LCD_STATUS & 0x10);
252 LCD_WDATA = pixel & 0xff;
253 }
254 p += LCD_WIDTH - width;
255 }
215} 256}
216 257
217/* Performance function to blit a YUV bitmap directly to the LCD */ 258/* Performance function to blit a YUV bitmap directly to the LCD */