summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/lcd-16bit-common.c18
-rw-r--r--firmware/drivers/lcd-16bit-vert.c15
-rw-r--r--firmware/drivers/lcd-16bit.c15
-rw-r--r--firmware/drivers/lcd-1bit-vert.c22
-rw-r--r--firmware/drivers/lcd-2bit-horz.c27
-rw-r--r--firmware/drivers/lcd-2bit-vert.c27
-rw-r--r--firmware/drivers/lcd-2bit-vi.c30
-rw-r--r--firmware/drivers/lcd-memframe.c4
-rw-r--r--firmware/drivers/lcd-remote-1bit-v.c2
-rw-r--r--firmware/drivers/lcd-remote-2bit-vi.c2
-rw-r--r--firmware/export/lcd-remote.h5
-rw-r--r--firmware/export/lcd.h9
-rw-r--r--firmware/screendump.c14
-rw-r--r--firmware/target/arm/as3525/lcd-fuze.c2
-rw-r--r--firmware/target/arm/as3525/lcd-ssd1303.c4
-rw-r--r--firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c2
-rw-r--r--firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c2
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c8
-rw-r--r--firmware/target/arm/ipod/lcd-color_nano.c2
-rw-r--r--firmware/target/arm/ipod/lcd-gray.c4
-rw-r--r--firmware/target/arm/ipod/video/lcd-video.c2
-rw-r--r--firmware/target/arm/iriver/h10/lcd-h10_20gb.c2
-rw-r--r--firmware/target/arm/iriver/h10/lcd-h10_5gb.c2
-rw-r--r--firmware/target/arm/lcd-c200_c200v2.c2
-rw-r--r--firmware/target/arm/lcd-ssd1815.c4
-rw-r--r--firmware/target/arm/olympus/mrobe-100/lcd-mr100.c4
-rw-r--r--firmware/target/arm/olympus/mrobe-100/lcd-remote-mr100.c2
-rw-r--r--firmware/target/arm/pbell/vibe500/lcd-vibe500.c2
-rw-r--r--firmware/target/arm/philips/hdd1630/lcd-hdd1630.c2
-rw-r--r--firmware/target/arm/philips/hdd6330/lcd-hdd6330.c2
-rw-r--r--firmware/target/arm/philips/sa9200/lcd-sa9200.c6
-rw-r--r--firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c4
-rw-r--r--firmware/target/arm/rk27xx/lcd-hifiman.c2
-rw-r--r--firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c2
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c2
-rw-r--r--firmware/target/arm/s5l8700/meizu-m3/lcd-m3.c2
-rw-r--r--firmware/target/arm/s5l8700/meizu-m6sp/lcd-m6sp.c4
-rw-r--r--firmware/target/arm/s5l8700/yps3/lcd-yps3.c4
-rw-r--r--firmware/target/arm/s5l8702/ipod6g/lcd-ipod6g.c2
-rw-r--r--firmware/target/arm/samsung/yh820/lcd-yh820.c2
-rw-r--r--firmware/target/arm/samsung/yh920/lcd-yh920.c2
-rw-r--r--firmware/target/arm/samsung/yh925/lcd-yh925.c2
-rw-r--r--firmware/target/arm/sandisk/sansa-view/lcd-view.c2
-rw-r--r--firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c2
-rw-r--r--firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c2
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c6
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c8
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c2
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c2
-rw-r--r--firmware/target/coldfire/iaudio/lcd-remote-iaudio.c4
-rw-r--r--firmware/target/coldfire/iaudio/m3/lcd-m3.c4
-rw-r--r--firmware/target/coldfire/iaudio/m5/lcd-m5.c4
-rw-r--r--firmware/target/coldfire/iaudio/x5/lcd-x5.c2
-rw-r--r--firmware/target/coldfire/iriver/h100/lcd-h100.c4
-rw-r--r--firmware/target/coldfire/iriver/h300/lcd-h300.c4
-rw-r--r--firmware/target/coldfire/iriver/lcd-remote-iriver.c4
-rw-r--r--firmware/target/coldfire/mpio/hd200/lcd-hd200.c4
-rw-r--r--firmware/target/coldfire/mpio/hd300/lcd-hd300.c4
-rw-r--r--firmware/target/hosted/android/lcd-android.c6
-rw-r--r--firmware/target/hosted/sdl/lcd-bitmap.c18
-rw-r--r--firmware/target/hosted/sdl/lcd-remote-bitmap.c4
-rw-r--r--firmware/target/hosted/ypr0/lcd-ypr0.c4
-rw-r--r--firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c4
-rw-r--r--firmware/target/sh/archos/lcd-archos-bitmap.c4
64 files changed, 191 insertions, 179 deletions
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c
index 1a845675ad..c9e88b2137 100644
--- a/firmware/drivers/lcd-16bit-common.c
+++ b/firmware/drivers/lcd-16bit-common.c
@@ -35,9 +35,9 @@ enum fill_opt {
35}; 35};
36 36
37/*** globals ***/ 37/*** globals ***/
38fb_data lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] 38fb_data lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH]
39 IRAM_LCDFRAMEBUFFER CACHEALIGN_AT_LEAST_ATTR(16); 39 IRAM_LCDFRAMEBUFFER CACHEALIGN_AT_LEAST_ATTR(16);
40 40fb_data *lcd_framebuffer = &lcd_static_framebuffer[0][0];
41 41
42static fb_data* lcd_backdrop = NULL; 42static fb_data* lcd_backdrop = NULL;
43static long lcd_backdrop_offset IDATA_ATTR = 0; 43static long lcd_backdrop_offset IDATA_ATTR = 0;
@@ -234,7 +234,7 @@ void lcd_set_backdrop(fb_data* backdrop)
234 lcd_backdrop = backdrop; 234 lcd_backdrop = backdrop;
235 if (backdrop) 235 if (backdrop)
236 { 236 {
237 lcd_backdrop_offset = (long)backdrop - (long)&lcd_framebuffer[0][0]; 237 lcd_backdrop_offset = (long)backdrop - (long)lcd_framebuffer;
238 lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop; 238 lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop;
239 } 239 }
240 else 240 else
@@ -271,7 +271,7 @@ void lcd_drawpixel(int x, int y)
271 && ((unsigned)y < (unsigned)LCD_HEIGHT) 271 && ((unsigned)y < (unsigned)LCD_HEIGHT)
272#endif 272#endif
273 ) 273 )
274 lcd_fastpixelfuncs[current_vp->drawmode](LCDADDR(current_vp->x+x, current_vp->y+y)); 274 lcd_fastpixelfuncs[current_vp->drawmode](FBADDR(current_vp->x+x, current_vp->y+y));
275} 275}
276 276
277/* Draw a line */ 277/* Draw a line */
@@ -346,7 +346,7 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
346 && ((unsigned)y < (unsigned)LCD_HEIGHT) 346 && ((unsigned)y < (unsigned)LCD_HEIGHT)
347#endif 347#endif
348 ) 348 )
349 pfunc(LCDADDR(x + current_vp->x, y + current_vp->y)); 349 pfunc(FBADDR(x + current_vp->x, y + current_vp->y));
350 350
351 if (d < 0) 351 if (d < 0)
352 { 352 {
@@ -459,7 +459,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
459 src += stride * (src_y >> 3) + src_x; /* move starting point */ 459 src += stride * (src_y >> 3) + src_x; /* move starting point */
460 src_y &= 7; 460 src_y &= 7;
461 src_end = src + width; 461 src_end = src + width;
462 dst_col = LCDADDR(x, y); 462 dst_col = FBADDR(x, y);
463 463
464 464
465 if (drmode & DRMODE_INVERSEVID) 465 if (drmode & DRMODE_INVERSEVID)
@@ -747,7 +747,7 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image,
747 dmask = ~dmask; 747 dmask = ~dmask;
748 } 748 }
749 749
750 dst_row = LCDADDR(x, y); 750 dst_row = FBADDR(x, y);
751 751
752 int col, row = height; 752 int col, row = height;
753 unsigned data, pixels; 753 unsigned data, pixels;
@@ -1020,10 +1020,10 @@ void lcd_blit_yuv(unsigned char * const src[3],
1020 linecounter = height >> 1; 1020 linecounter = height >> 1;
1021 1021
1022#if LCD_WIDTH >= LCD_HEIGHT 1022#if LCD_WIDTH >= LCD_HEIGHT
1023 dst = &lcd_framebuffer[y][x]; 1023 dst = FBADDR(x, y);
1024 row_end = dst + width; 1024 row_end = dst + width;
1025#else 1025#else
1026 dst = &lcd_framebuffer[x][LCD_WIDTH - y - 1]; 1026 dst = FBADDR(LCD_WIDTH - y - 1, x);
1027 row_end = dst + LCD_WIDTH * width; 1027 row_end = dst + LCD_WIDTH * width;
1028#endif 1028#endif
1029 1029
diff --git a/firmware/drivers/lcd-16bit-vert.c b/firmware/drivers/lcd-16bit-vert.c
index f020d74757..6f59af9f70 100644
--- a/firmware/drivers/lcd-16bit-vert.c
+++ b/firmware/drivers/lcd-16bit-vert.c
@@ -41,10 +41,7 @@
41#define ROW_INC 1 41#define ROW_INC 1
42#define COL_INC LCD_HEIGHT 42#define COL_INC LCD_HEIGHT
43 43
44#define LCDADDR(x, y) (&lcd_framebuffer[0][0] + LCD_HEIGHT*(x) + (y))
45
46#include "lcd-16bit-common.c" 44#include "lcd-16bit-common.c"
47
48#include "lcd-bitmap-common.c" 45#include "lcd-bitmap-common.c"
49 46
50/*** drawing functions ***/ 47/*** drawing functions ***/
@@ -54,7 +51,7 @@ void lcd_clear_viewport(void)
54{ 51{
55 fb_data *dst, *dst_end; 52 fb_data *dst, *dst_end;
56 53
57 dst = LCDADDR(current_vp->x, current_vp->y); 54 dst = FBADDR(current_vp->x, current_vp->y);
58 dst_end = dst + current_vp->width * LCD_HEIGHT; 55 dst_end = dst + current_vp->width * LCD_HEIGHT;
59 56
60 if (current_vp->drawmode & DRMODE_INVERSEVID) 57 if (current_vp->drawmode & DRMODE_INVERSEVID)
@@ -145,7 +142,7 @@ void lcd_hline(int x1, int x2, int y)
145 x2 = LCD_WIDTH-1; 142 x2 = LCD_WIDTH-1;
146#endif 143#endif
147 144
148 dst = LCDADDR(x1 , y ); 145 dst = FBADDR(x1 , y );
149 dst_end = dst + (x2 - x1) * LCD_HEIGHT; 146 dst_end = dst + (x2 - x1) * LCD_HEIGHT;
150 147
151 do 148 do
@@ -230,7 +227,7 @@ void lcd_vline(int x, int y1, int y2)
230 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT) 227 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT)
231 return; 228 return;
232 229
233 dst = LCDADDR(x, y1); 230 dst = FBADDR(x, y1);
234 231
235 switch (fillopt) 232 switch (fillopt)
236 { 233 {
@@ -333,7 +330,7 @@ void lcd_fillrect(int x, int y, int width, int height)
333 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT) 330 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT)
334 return; 331 return;
335 332
336 dst = LCDADDR(x, y); 333 dst = FBADDR(x, y);
337 dst_end = dst + width * LCD_HEIGHT; 334 dst_end = dst + width * LCD_HEIGHT;
338 335
339 do 336 do
@@ -426,7 +423,7 @@ void ICODE_ATTR lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
426#endif 423#endif
427 424
428 src += stride * src_x + src_y; /* move starting point */ 425 src += stride * src_x + src_y; /* move starting point */
429 dst = LCDADDR(x, y); 426 dst = FBADDR(x, y);
430 fb_data *dst_end = dst + width * LCD_HEIGHT; 427 fb_data *dst_end = dst + width * LCD_HEIGHT;
431 428
432 do 429 do
@@ -500,7 +497,7 @@ void ICODE_ATTR lcd_bitmap_transparent_part(const fb_data *src, int src_x,
500#endif 497#endif
501 498
502 src += stride * src_x + src_y; /* move starting point */ 499 src += stride * src_x + src_y; /* move starting point */
503 dst = LCDADDR(x, y); 500 dst = FBADDR(x, y);
504 dst_end = dst + width * LCD_HEIGHT; 501 dst_end = dst + width * LCD_HEIGHT;
505 502
506 do 503 do
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index f7d3cf22d4..71768b6744 100644
--- a/firmware/drivers/lcd-16bit.c
+++ b/firmware/drivers/lcd-16bit.c
@@ -41,10 +41,7 @@
41#define ROW_INC LCD_WIDTH 41#define ROW_INC LCD_WIDTH
42#define COL_INC 1 42#define COL_INC 1
43 43
44#define LCDADDR(x, y) (&lcd_framebuffer[(y)][(x)])
45
46#include "lcd-16bit-common.c" 44#include "lcd-16bit-common.c"
47
48#include "lcd-bitmap-common.c" 45#include "lcd-bitmap-common.c"
49 46
50/*** drawing functions ***/ 47/*** drawing functions ***/
@@ -54,7 +51,7 @@ void lcd_clear_viewport(void)
54{ 51{
55 fb_data *dst, *dst_end; 52 fb_data *dst, *dst_end;
56 53
57 dst = LCDADDR(current_vp->x, current_vp->y); 54 dst = FBADDR(current_vp->x, current_vp->y);
58 dst_end = dst + current_vp->height * LCD_WIDTH; 55 dst_end = dst + current_vp->height * LCD_WIDTH;
59 56
60 if (current_vp->drawmode & DRMODE_INVERSEVID) 57 if (current_vp->drawmode & DRMODE_INVERSEVID)
@@ -173,7 +170,7 @@ void lcd_hline(int x1, int x2, int y)
173 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT) 170 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT)
174 return; 171 return;
175 172
176 dst = LCDADDR(x1, y); 173 dst = FBADDR(x1, y);
177 174
178 switch (fillopt) 175 switch (fillopt)
179 { 176 {
@@ -241,7 +238,7 @@ void lcd_vline(int x, int y1, int y2)
241 y2 = LCD_HEIGHT-1; 238 y2 = LCD_HEIGHT-1;
242#endif 239#endif
243 240
244 dst = LCDADDR(x , y1); 241 dst = FBADDR(x , y1);
245 dst_end = dst + (y2 - y1) * LCD_WIDTH; 242 dst_end = dst + (y2 - y1) * LCD_WIDTH;
246 243
247 do 244 do
@@ -333,7 +330,7 @@ void lcd_fillrect(int x, int y, int width, int height)
333 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT) 330 if (fillopt == OPT_NONE && current_vp->drawmode != DRMODE_COMPLEMENT)
334 return; 331 return;
335 332
336 dst = LCDADDR(x, y); 333 dst = FBADDR(x, y);
337 dst_end = dst + height * LCD_WIDTH; 334 dst_end = dst + height * LCD_WIDTH;
338 335
339 do 336 do
@@ -426,7 +423,7 @@ void ICODE_ATTR lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
426#endif 423#endif
427 424
428 src += stride * src_y + src_x; /* move starting point */ 425 src += stride * src_y + src_x; /* move starting point */
429 dst = LCDADDR(x, y); 426 dst = FBADDR(x, y);
430 427
431 do 428 do
432 { 429 {
@@ -500,7 +497,7 @@ void ICODE_ATTR lcd_bitmap_transparent_part(const fb_data *src, int src_x,
500#endif 497#endif
501 498
502 src += stride * src_y + src_x; /* move starting point */ 499 src += stride * src_y + src_x; /* move starting point */
503 dst = LCDADDR(x, y); 500 dst = FBADDR(x, y);
504 501
505#ifdef CPU_ARM 502#ifdef CPU_ARM
506 { 503 {
diff --git a/firmware/drivers/lcd-1bit-vert.c b/firmware/drivers/lcd-1bit-vert.c
index fd77ba7578..3a90856819 100644
--- a/firmware/drivers/lcd-1bit-vert.c
+++ b/firmware/drivers/lcd-1bit-vert.c
@@ -37,14 +37,16 @@
37#ifndef LCDFN /* Not compiling for remote - define macros for main LCD. */ 37#ifndef LCDFN /* Not compiling for remote - define macros for main LCD. */
38#define LCDFN(fn) lcd_ ## fn 38#define LCDFN(fn) lcd_ ## fn
39#define FBFN(fn) fb_ ## fn 39#define FBFN(fn) fb_ ## fn
40#define FBSIZE FRAMEBUFFER_SIZE
40#define LCDM(ma) LCD_ ## ma 41#define LCDM(ma) LCD_ ## ma
41#define LCDNAME "lcd_" 42#define LCDNAME "lcd_"
43#define LCDFB(x,y) FBADDR(x, y)
42#define MAIN_LCD 44#define MAIN_LCD
43#endif 45#endif
44 46
45/*** globals ***/ 47/*** globals ***/
46 48FBFN(data) LCDFN(static_framebuffer)[LCDM(FBHEIGHT)][LCDM(FBWIDTH)] IRAM_LCDFRAMEBUFFER;
47FBFN(data) LCDFN(framebuffer)[LCDM(FBHEIGHT)][LCDM(FBWIDTH)] IRAM_LCDFRAMEBUFFER; 49FBFN(data) *LCDFN(framebuffer) = &LCDFN(static_framebuffer)[0][0];
48 50
49static struct viewport default_vp = 51static struct viewport default_vp =
50{ 52{
@@ -152,17 +154,17 @@ int LCDFN(getstringsize)(const unsigned char *str, int *w, int *h)
152 154
153static void setpixel(int x, int y) 155static void setpixel(int x, int y)
154{ 156{
155 LCDFN(framebuffer)[y>>3][x] |= BIT_N(y & 7); 157 *LCDFB(x,y>>3) |= BIT_N(y & 7);
156} 158}
157 159
158static void clearpixel(int x, int y) 160static void clearpixel(int x, int y)
159{ 161{
160 LCDFN(framebuffer)[y>>3][x] &= ~BIT_N(y & 7); 162 *LCDFB(x,y>>3) &= ~BIT_N(y & 7);
161} 163}
162 164
163static void flippixel(int x, int y) 165static void flippixel(int x, int y)
164{ 166{
165 LCDFN(framebuffer)[y>>3][x] ^= BIT_N(y & 7); 167 *LCDFB(x,y>>3) ^= BIT_N(y & 7);
166} 168}
167 169
168static void nopixel(int x, int y) 170static void nopixel(int x, int y)
@@ -242,7 +244,7 @@ void LCDFN(clear_display)(void)
242{ 244{
243 unsigned bits = (current_vp->drawmode & DRMODE_INVERSEVID) ? 0xFFu : 0; 245 unsigned bits = (current_vp->drawmode & DRMODE_INVERSEVID) ? 0xFFu : 0;
244 246
245 memset(LCDFN(framebuffer), bits, sizeof LCDFN(framebuffer)); 247 memset(LCDFN(framebuffer), bits, FBSIZE);
246 LCDFN(scroll_info).lines = 0; 248 LCDFN(scroll_info).lines = 0;
247} 249}
248 250
@@ -422,7 +424,7 @@ void LCDFN(hline)(int x1, int x2, int y)
422 width = x2 - x1 + 1; 424 width = x2 - x1 + 1;
423 425
424 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 426 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
425 dst = &LCDFN(framebuffer)[y>>3][x1]; 427 dst = LCDFB(x1,y>>3);
426 mask = BIT_N(y & 7); 428 mask = BIT_N(y & 7);
427 429
428 dst_end = dst + width; 430 dst_end = dst + width;
@@ -478,7 +480,7 @@ void LCDFN(vline)(int x, int y1, int y2)
478#endif 480#endif
479 481
480 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 482 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
481 dst = &LCDFN(framebuffer)[y1>>3][x]; 483 dst = LCDFB(x,y1>>3);
482 ny = y2 - (y1 & ~7); 484 ny = y2 - (y1 & ~7);
483 mask = 0xFFu << (y1 & 7); 485 mask = 0xFFu << (y1 & 7);
484 mask_bottom = 0xFFu >> (~ny & 7); 486 mask_bottom = 0xFFu >> (~ny & 7);
@@ -583,7 +585,7 @@ void LCDFN(fillrect)(int x, int y, int width, int height)
583 } 585 }
584 } 586 }
585 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 587 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
586 dst = &LCDFN(framebuffer)[y>>3][x]; 588 dst = LCDFB(x,y>>3);
587 ny = height - 1 + (y & 7); 589 ny = height - 1 + (y & 7);
588 mask = 0xFFu << (y & 7); 590 mask = 0xFFu << (y & 7);
589 mask_bottom = 0xFFu >> (~ny & 7); 591 mask_bottom = 0xFFu >> (~ny & 7);
@@ -696,7 +698,7 @@ void ICODE_ATTR LCDFN(bitmap_part)(const unsigned char *src, int src_x,
696 src += stride * (src_y >> 3) + src_x; /* move starting point */ 698 src += stride * (src_y >> 3) + src_x; /* move starting point */
697 src_y &= 7; 699 src_y &= 7;
698 y -= src_y; 700 y -= src_y;
699 dst = &LCDFN(framebuffer)[y>>3][x]; 701 dst = LCDFB(x,y>>3);
700 shift = y & 7; 702 shift = y & 7;
701 ny = height - 1 + shift + src_y; 703 ny = height - 1 + shift + src_y;
702 704
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index b4805094ff..3870bac644 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -39,7 +39,8 @@
39 39
40/*** globals ***/ 40/*** globals ***/
41 41
42unsigned char lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER; 42unsigned char lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER;
43unsigned char *lcd_framebuffer = &lcd_static_framebuffer[0][0];
43 44
44static const unsigned char pixmask[4] ICONST_ATTR = { 45static const unsigned char pixmask[4] ICONST_ATTR = {
45 0xC0, 0x30, 0x0C, 0x03 46 0xC0, 0x30, 0x0C, 0x03
@@ -193,7 +194,7 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
193static void setpixel(int x, int y) 194static void setpixel(int x, int y)
194{ 195{
195 unsigned mask = pixmask[x & 3]; 196 unsigned mask = pixmask[x & 3];
196 fb_data *address = &lcd_framebuffer[y][x>>2]; 197 fb_data *address = FBADDR(x>>2,y);
197 unsigned data = *address; 198 unsigned data = *address;
198 199
199 *address = data ^ ((data ^ fg_pattern) & mask); 200 *address = data ^ ((data ^ fg_pattern) & mask);
@@ -202,7 +203,7 @@ static void setpixel(int x, int y)
202static void clearpixel(int x, int y) 203static void clearpixel(int x, int y)
203{ 204{
204 unsigned mask = pixmask[x & 3]; 205 unsigned mask = pixmask[x & 3];
205 fb_data *address = &lcd_framebuffer[y][x>>2]; 206 fb_data *address = FBADDR(x>>2,y);
206 unsigned data = *address; 207 unsigned data = *address;
207 208
208 *address = data ^ ((data ^ bg_pattern) & mask); 209 *address = data ^ ((data ^ bg_pattern) & mask);
@@ -211,7 +212,7 @@ static void clearpixel(int x, int y)
211static void clearimgpixel(int x, int y) 212static void clearimgpixel(int x, int y)
212{ 213{
213 unsigned mask = pixmask[x & 3]; 214 unsigned mask = pixmask[x & 3];
214 fb_data *address = &lcd_framebuffer[y][x>>2]; 215 fb_data *address = FBADDR(x>>2,y);
215 unsigned data = *address; 216 unsigned data = *address;
216 217
217 *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask); 218 *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask);
@@ -220,7 +221,7 @@ static void clearimgpixel(int x, int y)
220static void flippixel(int x, int y) 221static void flippixel(int x, int y)
221{ 222{
222 unsigned mask = pixmask[x & 3]; 223 unsigned mask = pixmask[x & 3];
223 fb_data *address = &lcd_framebuffer[y][x>>2]; 224 fb_data *address = FBADDR(x>>2,y);
224 225
225 *address ^= mask; 226 *address ^= mask;
226} 227}
@@ -396,14 +397,14 @@ void lcd_clear_display(void)
396{ 397{
397 if (current_vp->drawmode & DRMODE_INVERSEVID) 398 if (current_vp->drawmode & DRMODE_INVERSEVID)
398 { 399 {
399 memset(lcd_framebuffer, fg_pattern, sizeof lcd_framebuffer); 400 memset(lcd_framebuffer, fg_pattern, FRAMEBUFFER_SIZE);
400 } 401 }
401 else 402 else
402 { 403 {
403 if (lcd_backdrop) 404 if (lcd_backdrop)
404 memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer); 405 memcpy(lcd_framebuffer, lcd_backdrop, FRAMEBUFFER_SIZE);
405 else 406 else
406 memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer); 407 memset(lcd_framebuffer, bg_pattern, FRAMEBUFFER_SIZE);
407 } 408 }
408 409
409 lcd_scroll_info.lines = 0; 410 lcd_scroll_info.lines = 0;
@@ -583,7 +584,7 @@ void lcd_hline(int x1, int x2, int y)
583#endif 584#endif
584 585
585 bfunc = lcd_blockfuncs[current_vp->drawmode]; 586 bfunc = lcd_blockfuncs[current_vp->drawmode];
586 dst = &lcd_framebuffer[y][x1>>2]; 587 dst = FBADDR(x1>>2,y);
587 nx = x2 - (x1 & ~3); 588 nx = x2 - (x1 & ~3);
588 mask = 0xFFu >> (2 * (x1 & 3)); 589 mask = 0xFFu >> (2 * (x1 & 3));
589 mask_right = 0xFFu << (2 * (~nx & 3)); 590 mask_right = 0xFFu << (2 * (~nx & 3));
@@ -644,7 +645,7 @@ void lcd_vline(int x, int y1, int y2)
644#endif 645#endif
645 646
646 bfunc = lcd_blockfuncs[current_vp->drawmode]; 647 bfunc = lcd_blockfuncs[current_vp->drawmode];
647 dst = &lcd_framebuffer[y1][x>>2]; 648 dst = FBADDR(x>>2,y1);
648 mask = pixmask[x & 3]; 649 mask = pixmask[x & 3];
649 650
650 dst_end = dst + (y2 - y1) * LCD_FBWIDTH; 651 dst_end = dst + (y2 - y1) * LCD_FBWIDTH;
@@ -729,7 +730,7 @@ void lcd_fillrect(int x, int y, int width, int height)
729#endif 730#endif
730 731
731 bfunc = lcd_blockfuncs[current_vp->drawmode]; 732 bfunc = lcd_blockfuncs[current_vp->drawmode];
732 dst = &lcd_framebuffer[y][x>>2]; 733 dst = FBADDR(x>>2,y);
733 nx = width - 1 + (x & 3); 734 nx = width - 1 + (x & 3);
734 mask = 0xFFu >> (2 * (x & 3)); 735 mask = 0xFFu >> (2 * (x & 3));
735 mask_right = 0xFFu << (2 * (~nx & 3)); 736 mask_right = 0xFFu << (2 * (~nx & 3));
@@ -836,7 +837,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
836 src_y &= 7; 837 src_y &= 7;
837 src_end = src + width; 838 src_end = src + width;
838 839
839 dst = &lcd_framebuffer[y][x >> 2]; 840 dst = FBADDR(x >> 2,y);
840 dst_end = dst + height * LCD_FBWIDTH; 841 dst_end = dst + height * LCD_FBWIDTH;
841 dst_mask = pixmask[x & 3]; 842 dst_mask = pixmask[x & 3];
842 843
@@ -1050,7 +1051,7 @@ void ICODE_ATTR lcd_bitmap_part(const unsigned char *src, int src_x,
1050 src += stride * src_y + (src_x >> 2); /* move starting point */ 1051 src += stride * src_y + (src_x >> 2); /* move starting point */
1051 src_x &= 3; 1052 src_x &= 3;
1052 x -= src_x; 1053 x -= src_x;
1053 dst = &lcd_framebuffer[y][x>>2]; 1054 dst = FBADDR(x>>2,y);
1054 shift = x & 3; 1055 shift = x & 3;
1055 nx = width - 1 + shift + src_x; 1056 nx = width - 1 + shift + src_x;
1056 1057
diff --git a/firmware/drivers/lcd-2bit-vert.c b/firmware/drivers/lcd-2bit-vert.c
index 02699099d7..89c2dc365b 100644
--- a/firmware/drivers/lcd-2bit-vert.c
+++ b/firmware/drivers/lcd-2bit-vert.c
@@ -36,7 +36,8 @@
36 36
37/*** globals ***/ 37/*** globals ***/
38 38
39fb_data lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER; 39fb_data lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH] IRAM_LCDFRAMEBUFFER;
40fb_data *lcd_framebuffer = &lcd_static_framebuffer[0][0];
40 41
41const unsigned char lcd_dibits[16] ICONST_ATTR = { 42const unsigned char lcd_dibits[16] ICONST_ATTR = {
42 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F, 43 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
@@ -196,7 +197,7 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
196static void setpixel(int x, int y) 197static void setpixel(int x, int y)
197{ 198{
198 unsigned mask = pixmask[y & 3]; 199 unsigned mask = pixmask[y & 3];
199 fb_data *address = &lcd_framebuffer[y>>2][x]; 200 fb_data *address = FBADDR(x,y>>2);
200 unsigned data = *address; 201 unsigned data = *address;
201 202
202 *address = data ^ ((data ^ fg_pattern) & mask); 203 *address = data ^ ((data ^ fg_pattern) & mask);
@@ -205,7 +206,7 @@ static void setpixel(int x, int y)
205static void clearpixel(int x, int y) 206static void clearpixel(int x, int y)
206{ 207{
207 unsigned mask = pixmask[y & 3]; 208 unsigned mask = pixmask[y & 3];
208 fb_data *address = &lcd_framebuffer[y>>2][x]; 209 fb_data *address = FBADDR(x,y>>2);
209 unsigned data = *address; 210 unsigned data = *address;
210 211
211 *address = data ^ ((data ^ bg_pattern) & mask); 212 *address = data ^ ((data ^ bg_pattern) & mask);
@@ -214,7 +215,7 @@ static void clearpixel(int x, int y)
214static void clearimgpixel(int x, int y) 215static void clearimgpixel(int x, int y)
215{ 216{
216 unsigned mask = pixmask[y & 3]; 217 unsigned mask = pixmask[y & 3];
217 fb_data *address = &lcd_framebuffer[y>>2][x]; 218 fb_data *address = FBADDR(x,y>>2);
218 unsigned data = *address; 219 unsigned data = *address;
219 220
220 *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask); 221 *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask);
@@ -223,7 +224,7 @@ static void clearimgpixel(int x, int y)
223static void flippixel(int x, int y) 224static void flippixel(int x, int y)
224{ 225{
225 unsigned mask = pixmask[y & 3]; 226 unsigned mask = pixmask[y & 3];
226 fb_data *address = &lcd_framebuffer[y>>2][x]; 227 fb_data *address = FBADDR(x,y>>2);
227 228
228 *address ^= mask; 229 *address ^= mask;
229} 230}
@@ -399,14 +400,14 @@ void lcd_clear_display(void)
399{ 400{
400 if (current_vp->drawmode & DRMODE_INVERSEVID) 401 if (current_vp->drawmode & DRMODE_INVERSEVID)
401 { 402 {
402 memset(lcd_framebuffer, fg_pattern, sizeof lcd_framebuffer); 403 memset(lcd_framebuffer, fg_pattern, FRAMEBUFFER_SIZE);
403 } 404 }
404 else 405 else
405 { 406 {
406 if (lcd_backdrop) 407 if (lcd_backdrop)
407 memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer); 408 memcpy(lcd_framebuffer, lcd_backdrop, FRAMEBUFFER_SIZE);
408 else 409 else
409 memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer); 410 memset(lcd_framebuffer, bg_pattern, FRAMEBUFFER_SIZE);
410 } 411 }
411 412
412 lcd_scroll_info.lines = 0; 413 lcd_scroll_info.lines = 0;
@@ -589,7 +590,7 @@ void lcd_hline(int x1, int x2, int y)
589 width = x2 - x1 + 1; 590 width = x2 - x1 + 1;
590 591
591 bfunc = lcd_blockfuncs[current_vp->drawmode]; 592 bfunc = lcd_blockfuncs[current_vp->drawmode];
592 dst = &lcd_framebuffer[y>>2][x1]; 593 dst = FBADDR(x1,y>>2);
593 mask = pixmask[y & 3]; 594 mask = pixmask[y & 3];
594 595
595 dst_end = dst + width; 596 dst_end = dst + width;
@@ -645,7 +646,7 @@ void lcd_vline(int x, int y1, int y2)
645#endif 646#endif
646 647
647 bfunc = lcd_blockfuncs[current_vp->drawmode]; 648 bfunc = lcd_blockfuncs[current_vp->drawmode];
648 dst = &lcd_framebuffer[y1>>2][x]; 649 dst = FBADDR(x,y1>>2);
649 ny = y2 - (y1 & ~3); 650 ny = y2 - (y1 & ~3);
650 mask = 0xFFu << (2 * (y1 & 3)); 651 mask = 0xFFu << (2 * (y1 & 3));
651 mask_bottom = 0xFFu >> (2 * (~ny & 3)); 652 mask_bottom = 0xFFu >> (2 * (~ny & 3));
@@ -751,7 +752,7 @@ void lcd_fillrect(int x, int y, int width, int height)
751 } 752 }
752 } 753 }
753 bfunc = lcd_blockfuncs[current_vp->drawmode]; 754 bfunc = lcd_blockfuncs[current_vp->drawmode];
754 dst = &lcd_framebuffer[y>>2][x]; 755 dst = FBADDR(x,y>>2);
755 ny = height - 1 + (y & 3); 756 ny = height - 1 + (y & 3);
756 mask = 0xFFu << (2 * (y & 3)); 757 mask = 0xFFu << (2 * (y & 3));
757 mask_bottom = 0xFFu >> (2 * (~ny & 3)); 758 mask_bottom = 0xFFu >> (2 * (~ny & 3));
@@ -863,7 +864,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
863 src += stride * (src_y >> 3) + src_x; /* move starting point */ 864 src += stride * (src_y >> 3) + src_x; /* move starting point */
864 src_y &= 7; 865 src_y &= 7;
865 y -= src_y; 866 y -= src_y;
866 dst = &lcd_framebuffer[y>>2][x]; 867 dst = FBADDR(x,y>>2);
867 shift = y & 3; 868 shift = y & 3;
868 ny = height - 1 + shift + src_y; 869 ny = height - 1 + shift + src_y;
869 mask = 0xFFFFu << (2 * (shift + src_y)); 870 mask = 0xFFFFu << (2 * (shift + src_y));
@@ -1060,7 +1061,7 @@ void ICODE_ATTR lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
1060 src += stride * (src_y >> 2) + src_x; /* move starting point */ 1061 src += stride * (src_y >> 2) + src_x; /* move starting point */
1061 src_y &= 3; 1062 src_y &= 3;
1062 y -= src_y; 1063 y -= src_y;
1063 dst = &lcd_framebuffer[y>>2][x]; 1064 dst = FBADDR(x,y>>2);
1064 shift = y & 3; 1065 shift = y & 3;
1065 ny = height - 1 + shift + src_y; 1066 ny = height - 1 + shift + src_y;
1066 1067
diff --git a/firmware/drivers/lcd-2bit-vi.c b/firmware/drivers/lcd-2bit-vi.c
index 697d1a7783..8dc746f521 100644
--- a/firmware/drivers/lcd-2bit-vi.c
+++ b/firmware/drivers/lcd-2bit-vi.c
@@ -40,13 +40,17 @@
40#define LCDFN(fn) lcd_ ## fn 40#define LCDFN(fn) lcd_ ## fn
41#define FBFN(fn) fb_ ## fn 41#define FBFN(fn) fb_ ## fn
42#define LCDM(ma) LCD_ ## ma 42#define LCDM(ma) LCD_ ## ma
43#define FBSIZE FRAMEBUFFER_SIZE
43#define LCDNAME "lcd_" 44#define LCDNAME "lcd_"
45#define LCDFB(x,y) FBADDR(x, y)
44#define MAIN_LCD 46#define MAIN_LCD
45#endif 47#endif
46 48
47/*** globals ***/ 49/*** globals ***/
48 50
49FBFN(data) LCDFN(framebuffer)[LCDM(FBHEIGHT)][LCDM(FBWIDTH)] IRAM_LCDFRAMEBUFFER; 51FBFN(data) LCDFN(static_framebuffer)[LCDM(FBHEIGHT)][LCDM(FBWIDTH)] IRAM_LCDFRAMEBUFFER;
52FBFN(data) *LCDFN(framebuffer) = &LCDFN(static_framebuffer)[0][0];
53
50 54
51static const FBFN(data) patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000}; 55static const FBFN(data) patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000};
52 56
@@ -214,7 +218,7 @@ int LCDFN(getstringsize)(const unsigned char *str, int *w, int *h)
214static void setpixel(int x, int y) 218static void setpixel(int x, int y)
215{ 219{
216 unsigned mask = 0x0101 << (y & 7); 220 unsigned mask = 0x0101 << (y & 7);
217 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 221 FBFN(data) *address = LCDFB(x,y>>3);
218 unsigned data = *address; 222 unsigned data = *address;
219 223
220 *address = data ^ ((data ^ fg_pattern) & mask); 224 *address = data ^ ((data ^ fg_pattern) & mask);
@@ -223,7 +227,7 @@ static void setpixel(int x, int y)
223static void clearpixel(int x, int y) 227static void clearpixel(int x, int y)
224{ 228{
225 unsigned mask = 0x0101 << (y & 7); 229 unsigned mask = 0x0101 << (y & 7);
226 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 230 FBFN(data) *address = LCDFB(x,y>>3);
227 unsigned data = *address; 231 unsigned data = *address;
228 232
229 *address = data ^ ((data ^ bg_pattern) & mask); 233 *address = data ^ ((data ^ bg_pattern) & mask);
@@ -232,7 +236,7 @@ static void clearpixel(int x, int y)
232static void clearimgpixel(int x, int y) 236static void clearimgpixel(int x, int y)
233{ 237{
234 unsigned mask = 0x0101 << (y & 7); 238 unsigned mask = 0x0101 << (y & 7);
235 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 239 FBFN(data) *address = LCDFB(x,y>>3);
236 unsigned data = *address; 240 unsigned data = *address;
237 241
238 *address = data ^ ((data ^ *(FBFN(data) *)((long)address 242 *address = data ^ ((data ^ *(FBFN(data) *)((long)address
@@ -242,7 +246,7 @@ static void clearimgpixel(int x, int y)
242static void flippixel(int x, int y) 246static void flippixel(int x, int y)
243{ 247{
244 unsigned mask = 0x0101 << (y & 7); 248 unsigned mask = 0x0101 << (y & 7);
245 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 249 FBFN(data) *address = LCDFB(x,y>>3);
246 250
247 *address ^= mask; 251 *address ^= mask;
248} 252}
@@ -420,15 +424,15 @@ void LCDFN(clear_display)(void)
420 if (default_vp.drawmode & DRMODE_INVERSEVID) 424 if (default_vp.drawmode & DRMODE_INVERSEVID)
421 { 425 {
422 memset(LCDFN(framebuffer), patterns[default_vp.fg_pattern & 3], 426 memset(LCDFN(framebuffer), patterns[default_vp.fg_pattern & 3],
423 sizeof LCDFN(framebuffer)); 427 FBSIZE);
424 } 428 }
425 else 429 else
426 { 430 {
427 if (backdrop) 431 if (backdrop)
428 memcpy(LCDFN(framebuffer), backdrop, sizeof LCDFN(framebuffer)); 432 memcpy(LCDFN(framebuffer), backdrop, FBSIZE);
429 else 433 else
430 memset(LCDFN(framebuffer), patterns[default_vp.bg_pattern & 3], 434 memset(LCDFN(framebuffer), patterns[default_vp.bg_pattern & 3],
431 sizeof LCDFN(framebuffer)); 435 FBSIZE);
432 } 436 }
433 437
434 LCDFN(scroll_info).lines = 0; 438 LCDFN(scroll_info).lines = 0;
@@ -611,7 +615,7 @@ void LCDFN(hline)(int x1, int x2, int y)
611 width = x2 - x1 + 1; 615 width = x2 - x1 + 1;
612 616
613 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 617 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
614 dst = &LCDFN(framebuffer)[y>>3][x1]; 618 dst = LCDFB(x1,y>>3);
615 mask = 0x0101 << (y & 7); 619 mask = 0x0101 << (y & 7);
616 620
617 dst_end = dst + width; 621 dst_end = dst + width;
@@ -667,7 +671,7 @@ void LCDFN(vline)(int x, int y1, int y2)
667#endif 671#endif
668 672
669 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 673 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
670 dst = &LCDFN(framebuffer)[y1>>3][x]; 674 dst = LCDFB(x,y1>>3);
671 ny = y2 - (y1 & ~7); 675 ny = y2 - (y1 & ~7);
672 mask = (0xFFu << (y1 & 7)) & 0xFFu; 676 mask = (0xFFu << (y1 & 7)) & 0xFFu;
673 mask |= mask << 8; 677 mask |= mask << 8;
@@ -776,7 +780,7 @@ void LCDFN(fillrect)(int x, int y, int width, int height)
776 } 780 }
777 } 781 }
778 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 782 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
779 dst = &LCDFN(framebuffer)[y>>3][x]; 783 dst = LCDFB(x,y>>3);
780 ny = height - 1 + (y & 7); 784 ny = height - 1 + (y & 7);
781 mask = (0xFFu << (y & 7)) & 0xFFu; 785 mask = (0xFFu << (y & 7)) & 0xFFu;
782 mask |= mask << 8; 786 mask |= mask << 8;
@@ -890,7 +894,7 @@ void ICODE_ATTR LCDFN(mono_bitmap_part)(const unsigned char *src, int src_x,
890 src += stride * (src_y >> 3) + src_x; /* move starting point */ 894 src += stride * (src_y >> 3) + src_x; /* move starting point */
891 src_y &= 7; 895 src_y &= 7;
892 y -= src_y; 896 y -= src_y;
893 dst = &LCDFN(framebuffer)[y>>3][x]; 897 dst = LCDFB(x,y>>3);
894 shift = y & 7; 898 shift = y & 7;
895 ny = height - 1 + shift + src_y; 899 ny = height - 1 + shift + src_y;
896 900
@@ -1058,7 +1062,7 @@ void ICODE_ATTR LCDFN(bitmap_part)(const FBFN(data) *src, int src_x,
1058 src += stride * (src_y >> 3) + src_x; /* move starting point */ 1062 src += stride * (src_y >> 3) + src_x; /* move starting point */
1059 src_y &= 7; 1063 src_y &= 7;
1060 y -= src_y; 1064 y -= src_y;
1061 dst = &LCDFN(framebuffer)[y>>3][x]; 1065 dst = LCDFB(x,y>>3);
1062 shift = y & 7; 1066 shift = y & 7;
1063 ny = height - 1 + shift + src_y; 1067 ny = height - 1 + shift + src_y;
1064 1068
diff --git a/firmware/drivers/lcd-memframe.c b/firmware/drivers/lcd-memframe.c
index dd878876bf..bb1682b074 100644
--- a/firmware/drivers/lcd-memframe.c
+++ b/firmware/drivers/lcd-memframe.c
@@ -66,7 +66,7 @@ void lcd_update(void)
66 return; 66 return;
67 67
68 /* Copy the Rockbox framebuffer to the second framebuffer */ 68 /* Copy the Rockbox framebuffer to the second framebuffer */
69 lcd_copy_buffer_rect(LCD_FRAMEBUF_ADDR(0, 0), &lcd_framebuffer[0][0], 69 lcd_copy_buffer_rect(LCD_FRAMEBUF_ADDR(0, 0), FBADDR(0,0),
70 LCD_WIDTH*LCD_HEIGHT, 1); 70 LCD_WIDTH*LCD_HEIGHT, 1);
71} 71}
72#endif /* LCD_OPTIMIZED_UPDATE */ 72#endif /* LCD_OPTIMIZED_UPDATE */
@@ -95,7 +95,7 @@ void lcd_update_rect(int x, int y, int width, int height)
95 return; /* nothing left to do */ 95 return; /* nothing left to do */
96 96
97 dst = LCD_FRAMEBUF_ADDR(x, y); 97 dst = LCD_FRAMEBUF_ADDR(x, y);
98 src = &lcd_framebuffer[y][x]; 98 src = FBADDR(x,y);
99 99
100 /* Copy part of the Rockbox framebuffer to the second framebuffer */ 100 /* Copy part of the Rockbox framebuffer to the second framebuffer */
101 if (width < LCD_WIDTH) 101 if (width < LCD_WIDTH)
diff --git a/firmware/drivers/lcd-remote-1bit-v.c b/firmware/drivers/lcd-remote-1bit-v.c
index f2588323e7..24b91509c7 100644
--- a/firmware/drivers/lcd-remote-1bit-v.c
+++ b/firmware/drivers/lcd-remote-1bit-v.c
@@ -24,7 +24,9 @@
24/* Compile 1 bit vertical packing LCD driver for remote LCD */ 24/* Compile 1 bit vertical packing LCD driver for remote LCD */
25#define LCDFN(fn) lcd_remote_ ## fn 25#define LCDFN(fn) lcd_remote_ ## fn
26#define FBFN(fn) fb_remote_ ## fn 26#define FBFN(fn) fb_remote_ ## fn
27#define FBSIZE FRAMEBUFFER_REMOTE_SIZE
27#define LCDM(ma) LCD_REMOTE_ ## ma 28#define LCDM(ma) LCD_REMOTE_ ## ma
29#define LCDFB(x,y) FBREMOTEADDR(x, y)
28#define LCDNAME "lcd_remote_" 30#define LCDNAME "lcd_remote_"
29 31
30#include "lcd-1bit-vert.c" 32#include "lcd-1bit-vert.c"
diff --git a/firmware/drivers/lcd-remote-2bit-vi.c b/firmware/drivers/lcd-remote-2bit-vi.c
index 34af8dde6f..fd4de6f6af 100644
--- a/firmware/drivers/lcd-remote-2bit-vi.c
+++ b/firmware/drivers/lcd-remote-2bit-vi.c
@@ -26,7 +26,9 @@
26/* Compile 2 bit vertical interleaved LCD driver for remote LCD */ 26/* Compile 2 bit vertical interleaved LCD driver for remote LCD */
27#define LCDFN(fn) lcd_remote_ ## fn 27#define LCDFN(fn) lcd_remote_ ## fn
28#define FBFN(fn) fb_remote_ ## fn 28#define FBFN(fn) fb_remote_ ## fn
29#define FBSIZE FRAMEBUFFER_REMOTE_SIZE
29#define LCDM(ma) LCD_REMOTE_ ## ma 30#define LCDM(ma) LCD_REMOTE_ ## ma
31#define LCDFB(x,y) FBREMOTEADDR(x, y)
30#define LCDNAME "lcd_remote_" 32#define LCDNAME "lcd_remote_"
31 33
32#include "lcd-2bit-vi.c" 34#include "lcd-2bit-vi.c"
diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h
index 2a48b6fc34..0f5f7ed6b7 100644
--- a/firmware/export/lcd-remote.h
+++ b/firmware/export/lcd-remote.h
@@ -96,7 +96,10 @@ extern unsigned lcd_remote_color_to_native(unsigned color);
96#endif 96#endif
97 97
98/* The actual framebuffer */ 98/* The actual framebuffer */
99extern fb_remote_data lcd_remote_framebuffer[LCD_REMOTE_FBHEIGHT][LCD_REMOTE_FBWIDTH]; 99extern fb_remote_data *lcd_remote_framebuffer;
100extern fb_remote_data lcd_remote_static_framebuffer[LCD_REMOTE_FBHEIGHT][LCD_REMOTE_FBWIDTH];
101#define FBREMOTEADDR(x, y) (lcd_remote_framebuffer + ((y) * LCD_REMOTE_FBWIDTH) + (x))
102#define FRAMEBUFFER_REMOTE_SIZE (sizeof(lcd_remote_static_framebuffer))
100 103
101#if LCD_REMOTE_DEPTH > 1 104#if LCD_REMOTE_DEPTH > 1
102extern void lcd_remote_set_foreground(unsigned foreground); 105extern void lcd_remote_set_foreground(unsigned foreground);
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 2d0123cfe3..052b368d9b 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -413,7 +413,14 @@ static inline unsigned lcd_color_to_native(unsigned color)
413#define LCD_FBHEIGHT LCD_HEIGHT 413#define LCD_FBHEIGHT LCD_HEIGHT
414#endif 414#endif
415/* The actual framebuffer */ 415/* The actual framebuffer */
416extern fb_data lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH]; 416extern fb_data *lcd_framebuffer;
417extern fb_data lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH];
418#if defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE
419#define FBADDR(x, y) (lcd_framebuffer + ((x) * LCD_FBHEIGHT) + (y))
420#else
421#define FBADDR(x, y) (lcd_framebuffer + ((y) * LCD_FBWIDTH) + (x))
422#endif
423#define FRAMEBUFFER_SIZE (sizeof(lcd_static_framebuffer))
417 424
418/** Port-specific functions. Enable in port config file. **/ 425/** Port-specific functions. Enable in port config file. **/
419#ifdef HAVE_REMOTE_LCD_AS_MAIN 426#ifdef HAVE_REMOTE_LCD_AS_MAIN
diff --git a/firmware/screendump.c b/firmware/screendump.c
index 4b431d5958..0dfe79a69f 100644
--- a/firmware/screendump.c
+++ b/firmware/screendump.c
@@ -154,7 +154,7 @@ void screen_dump(void)
154 154
155#if LCD_DEPTH == 1 155#if LCD_DEPTH == 1
156 dst_end = dst + LCD_WIDTH/2; 156 dst_end = dst + LCD_WIDTH/2;
157 src = lcd_framebuffer[y >> 3]; 157 src = FBADDR(0, y >> 3);
158 mask = BIT_N(y & 7); 158 mask = BIT_N(y & 7);
159 159
160 do 160 do
@@ -173,7 +173,7 @@ void screen_dump(void)
173 dst_end = dst + LCD_WIDTH/2; 173 dst_end = dst + LCD_WIDTH/2;
174 174
175#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 175#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
176 src = lcd_framebuffer[y]; 176 src = FBADDR(0, y);
177 177
178 do 178 do
179 { 179 {
@@ -185,7 +185,7 @@ void screen_dump(void)
185 while (dst < dst_end); 185 while (dst < dst_end);
186 186
187#elif LCD_PIXELFORMAT == VERTICAL_PACKING 187#elif LCD_PIXELFORMAT == VERTICAL_PACKING
188 src = lcd_framebuffer[y >> 2]; 188 src = FBADDR(0, y >> 2);
189 shift = 2 * (y & 3); 189 shift = 2 * (y & 3);
190 190
191 do 191 do
@@ -197,7 +197,7 @@ void screen_dump(void)
197 while (dst < dst_end); 197 while (dst < dst_end);
198 198
199#elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED 199#elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED
200 src = lcd_framebuffer[y >> 3]; 200 src = FBADDR(0, y >> 3);
201 shift = y & 7; 201 shift = y & 7;
202 202
203 do 203 do
@@ -214,7 +214,7 @@ void screen_dump(void)
214#endif 214#endif
215#elif LCD_DEPTH == 16 215#elif LCD_DEPTH == 16
216 dst_end = dst + LCD_WIDTH; 216 dst_end = dst + LCD_WIDTH;
217 src = lcd_framebuffer[y]; 217 src = FBADDR(0, y);
218 218
219 do 219 do
220 { 220 {
@@ -318,7 +318,7 @@ void remote_screen_dump(void)
318 318
319#if LCD_REMOTE_DEPTH == 1 319#if LCD_REMOTE_DEPTH == 1
320 dst_end = dst + LCD_REMOTE_WIDTH/2; 320 dst_end = dst + LCD_REMOTE_WIDTH/2;
321 src = lcd_remote_framebuffer[y >> 3]; 321 src = FBREMOTEADDR(0, y >> 3);
322 mask = BIT_N(y & 7); 322 mask = BIT_N(y & 7);
323 323
324 do 324 do
@@ -333,7 +333,7 @@ void remote_screen_dump(void)
333 dst_end = dst + LCD_REMOTE_WIDTH/2; 333 dst_end = dst + LCD_REMOTE_WIDTH/2;
334 334
335#if LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED 335#if LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED
336 src = lcd_remote_framebuffer[y >> 3]; 336 src = FBREMOTEADDR(0, (y >> 3));
337 shift = y & 7; 337 shift = y & 7;
338 338
339 do 339 do
diff --git a/firmware/target/arm/as3525/lcd-fuze.c b/firmware/target/arm/as3525/lcd-fuze.c
index 2acc7b3bf9..b2033738b6 100644
--- a/firmware/target/arm/as3525/lcd-fuze.c
+++ b/firmware/target/arm/as3525/lcd-fuze.c
@@ -332,7 +332,7 @@ void lcd_update_rect(int x, int y, int width, int height)
332 332
333 lcd_write_cmd(R_WRITE_DATA_2_GRAM); 333 lcd_write_cmd(R_WRITE_DATA_2_GRAM);
334 334
335 ptr = &lcd_framebuffer[y][x]; 335 ptr = FBADDR(x,y);
336 336
337 do 337 do
338 { 338 {
diff --git a/firmware/target/arm/as3525/lcd-ssd1303.c b/firmware/target/arm/as3525/lcd-ssd1303.c
index 213f12a424..9fcc85d243 100644
--- a/firmware/target/arm/as3525/lcd-ssd1303.c
+++ b/firmware/target/arm/as3525/lcd-ssd1303.c
@@ -273,7 +273,7 @@ void lcd_update(void)
273 lcd_write_command (LCD_CNTL_HIGHCOL | ((offset >> 4) & 0xf)); 273 lcd_write_command (LCD_CNTL_HIGHCOL | ((offset >> 4) & 0xf));
274 lcd_write_command (LCD_CNTL_LOWCOL | (offset & 0xf)); 274 lcd_write_command (LCD_CNTL_LOWCOL | (offset & 0xf));
275 275
276 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 276 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
277 } 277 }
278} 278}
279 279
@@ -304,6 +304,6 @@ void lcd_update_rect(int x, int y, int width, int height)
304 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+offset) >> 4) & 0xf)); 304 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+offset) >> 4) & 0xf));
305 lcd_write_command (LCD_CNTL_LOWCOL | ((x+offset) & 0xf)); 305 lcd_write_command (LCD_CNTL_LOWCOL | ((x+offset) & 0xf));
306 306
307 lcd_write_data (&lcd_framebuffer[y][x], width); 307 lcd_write_data (FBADDR(x,y), width);
308 } 308 }
309} 309}
diff --git a/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c b/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c
index 3952171e7e..7673b529cc 100644
--- a/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c
+++ b/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c
@@ -426,7 +426,7 @@ void lcd_update_rect(int x, int y, int width, int height)
426 426
427 /* write to GRAM */ 427 /* write to GRAM */
428 for (row = y; row < y_end; row++) { 428 for (row = y; row < y_end; row++) {
429 lcd_write_data(&lcd_framebuffer[row][x], width); 429 lcd_write_data(FBADDR(x,row), width);
430 } 430 }
431} 431}
432 432
diff --git a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
index f875b40c05..2c80f89ff7 100644
--- a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
+++ b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
@@ -488,7 +488,7 @@ void lcd_update_rect(int x, int y, int width, int height)
488 lcd_window(x, y, x+width-1, y+height-1); 488 lcd_window(x, y, x+width-1, y+height-1);
489 lcd_write_cmd(R_WRITE_DATA_2_GRAM); 489 lcd_write_cmd(R_WRITE_DATA_2_GRAM);
490 490
491 ptr = &lcd_framebuffer[y][x]; 491 ptr = FBADDR(x,y);
492 492
493 do 493 do
494 { 494 {
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
index c2e80ad1fc..b25fff8c3b 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
@@ -533,12 +533,12 @@ void lcd_update_rect(int x, int y, int w, int h)
533 */ 533 */
534 if(w == LCD_WIDTH) 534 if(w == LCD_WIDTH)
535 { 535 {
536 memcpy((void *)FRAME, &lcd_framebuffer[y][x], w * h * sizeof(fb_data)); 536 memcpy((void *)FRAME, FBADDR(x,y), w * h * sizeof(fb_data));
537 } 537 }
538 else 538 else
539 { 539 {
540 for(int i = 0; i < h; i++) 540 for(int i = 0; i < h; i++)
541 memcpy((fb_data *)FRAME + i * w, &lcd_framebuffer[y + i][x], w * sizeof(fb_data)); 541 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
542 } 542 }
543 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 543 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
544 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 544 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
@@ -599,10 +599,10 @@ void lcd_blit_yuv(unsigned char * const src[3],
599 linecounter = height >> 1; 599 linecounter = height >> 1;
600 600
601 #if LCD_WIDTH >= LCD_HEIGHT 601 #if LCD_WIDTH >= LCD_HEIGHT
602 dst = &lcd_framebuffer[y][x]; 602 dst = FBADDR(x,y);
603 row_end = dst + width; 603 row_end = dst + width;
604 #else 604 #else
605 dst = &lcd_framebuffer[x][LCD_WIDTH - y - 1]; 605 dst = FBADDR(LCD_WIDTH - y - 1,x);
606 row_end = dst + LCD_WIDTH * width; 606 row_end = dst + LCD_WIDTH * width;
607 #endif 607 #endif
608 608
diff --git a/firmware/target/arm/ipod/lcd-color_nano.c b/firmware/target/arm/ipod/lcd-color_nano.c
index 589e8654ae..c7676fa721 100644
--- a/firmware/target/arm/ipod/lcd-color_nano.c
+++ b/firmware/target/arm/ipod/lcd-color_nano.c
@@ -280,7 +280,7 @@ void lcd_update_rect(int x, int y, int width, int height)
280 280
281 lcd_setup_drawing_region(x, y, width, height); 281 lcd_setup_drawing_region(x, y, width, height);
282 282
283 addr = (unsigned long*)&lcd_framebuffer[y][x]; 283 addr = (unsigned long*)FBADDR(x, y);
284 284
285 while (height > 0) { 285 while (height > 0) {
286 int r, h, pixels_to_write; 286 int r, h, pixels_to_write;
diff --git a/firmware/target/arm/ipod/lcd-gray.c b/firmware/target/arm/ipod/lcd-gray.c
index 11d4cba2f5..d8695cdb10 100644
--- a/firmware/target/arm/ipod/lcd-gray.c
+++ b/firmware/target/arm/ipod/lcd-gray.c
@@ -340,10 +340,10 @@ void lcd_update_rect(int x, int y, int width, int height)
340 340
341#if defined(IPOD_MINI) || defined(IPOD_MINI2G) 341#if defined(IPOD_MINI) || defined(IPOD_MINI2G)
342 if (pix_offset == -2) 342 if (pix_offset == -2)
343 lcd_write_data_shifted(&lcd_framebuffer[y][2*x], width); 343 lcd_write_data_shifted(FBADDR(2*x, y), width);
344 else 344 else
345#endif 345#endif
346 lcd_write_data(&lcd_framebuffer[y][2*x], width); 346 lcd_write_data(FBADDR(2*x, y), width);
347 } 347 }
348} 348}
349 349
diff --git a/firmware/target/arm/ipod/video/lcd-video.c b/firmware/target/arm/ipod/video/lcd-video.c
index c499e9f745..27d889aafa 100644
--- a/firmware/target/arm/ipod/video/lcd-video.c
+++ b/firmware/target/arm/ipod/video/lcd-video.c
@@ -410,7 +410,7 @@ void lcd_update_rect(int x, int y, int width, int height)
410 /* Prevent the tick from triggering BCM updates while we're writing. */ 410 /* Prevent the tick from triggering BCM updates while we're writing. */
411 lcd_block_tick(); 411 lcd_block_tick();
412 412
413 addr = &lcd_framebuffer[y][x]; 413 addr = FBADDR(x, y);
414 bcmaddr = BCMA_CMDPARAM + (LCD_WIDTH*2) * y + (x << 1); 414 bcmaddr = BCMA_CMDPARAM + (LCD_WIDTH*2) * y + (x << 1);
415 415
416 if (width == LCD_WIDTH) 416 if (width == LCD_WIDTH)
diff --git a/firmware/target/arm/iriver/h10/lcd-h10_20gb.c b/firmware/target/arm/iriver/h10/lcd-h10_20gb.c
index df748a74fb..c7e339295d 100644
--- a/firmware/target/arm/iriver/h10/lcd-h10_20gb.c
+++ b/firmware/target/arm/iriver/h10/lcd-h10_20gb.c
@@ -527,7 +527,7 @@ void lcd_update_rect(int x0, int y0, int width, int height)
527 /* start drawing */ 527 /* start drawing */
528 lcd_send_cmd(R_WRITE_DATA_2_GRAM); 528 lcd_send_cmd(R_WRITE_DATA_2_GRAM);
529 529
530 addr = (unsigned short*)&lcd_framebuffer[y0][x0]; 530 addr = (unsigned short*)FBADDR(x0,y0);
531 531
532 int c, r; 532 int c, r;
533 533
diff --git a/firmware/target/arm/iriver/h10/lcd-h10_5gb.c b/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
index ce57af14d5..5e1ad9ce23 100644
--- a/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
+++ b/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
@@ -327,7 +327,7 @@ void lcd_update_rect(int x0, int y0, int width, int height)
327 /* start drawing */ 327 /* start drawing */
328 lcd_send_cmd(R_WRITE_DATA_2_GRAM); 328 lcd_send_cmd(R_WRITE_DATA_2_GRAM);
329 329
330 addr = (unsigned long*)&lcd_framebuffer[y0][x0]; 330 addr = (unsigned long*)FBADDR(x0,y0);
331 331
332 while (height > 0) { 332 while (height > 0) {
333 int c, r; 333 int c, r;
diff --git a/firmware/target/arm/lcd-c200_c200v2.c b/firmware/target/arm/lcd-c200_c200v2.c
index f82f8a809e..38877ccac9 100644
--- a/firmware/target/arm/lcd-c200_c200v2.c
+++ b/firmware/target/arm/lcd-c200_c200v2.c
@@ -395,7 +395,7 @@ void lcd_update_rect(int x, int y, int width, int height)
395 if ((width <= 0) || (height <= 0)) 395 if ((width <= 0) || (height <= 0))
396 return; /* Nothing left to do. */ 396 return; /* Nothing left to do. */
397 397
398 addr = &lcd_framebuffer[y][x]; 398 addr = FBADDR(x,y);
399 399
400 if (width <= 1) { 400 if (width <= 1) {
401 /* The X end address must be larger than the X start address, so we 401 /* The X end address must be larger than the X start address, so we
diff --git a/firmware/target/arm/lcd-ssd1815.c b/firmware/target/arm/lcd-ssd1815.c
index 35d8cf2275..891d4ef64d 100644
--- a/firmware/target/arm/lcd-ssd1815.c
+++ b/firmware/target/arm/lcd-ssd1815.c
@@ -303,7 +303,7 @@ void lcd_update(void)
303 lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf)); 303 lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf));
304 lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf)); 304 lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf));
305 305
306 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 306 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
307 } 307 }
308} 308}
309 309
@@ -331,6 +331,6 @@ void lcd_update_rect(int x, int y, int width, int height)
331 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf)); 331 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf));
332 lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf)); 332 lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf));
333 333
334 lcd_write_data (&lcd_framebuffer[y][x], width); 334 lcd_write_data (FBADDR(x,y), width);
335 } 335 }
336} 336}
diff --git a/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c b/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c
index a0ea2a6aab..d336ad7419 100644
--- a/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c
+++ b/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c
@@ -239,7 +239,7 @@ void lcd_update(void)
239 lcd_write_command(cmd1); 239 lcd_write_command(cmd1);
240 lcd_write_command(cmd2); 240 lcd_write_command(cmd2);
241 241
242 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 242 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
243 } 243 }
244} 244}
245 245
@@ -271,6 +271,6 @@ void lcd_update_rect(int x, int y, int width, int height)
271 lcd_write_command(cmd1); 271 lcd_write_command(cmd1);
272 lcd_write_command(cmd2); 272 lcd_write_command(cmd2);
273 273
274 lcd_write_data (&lcd_framebuffer[y][x], width); 274 lcd_write_data (FBADDR(x,y), width);
275 } 275 }
276} 276}
diff --git a/firmware/target/arm/olympus/mrobe-100/lcd-remote-mr100.c b/firmware/target/arm/olympus/mrobe-100/lcd-remote-mr100.c
index aa3d228952..edcdde7253 100644
--- a/firmware/target/arm/olympus/mrobe-100/lcd-remote-mr100.c
+++ b/firmware/target/arm/olympus/mrobe-100/lcd-remote-mr100.c
@@ -255,7 +255,7 @@ static void remote_update_lcd(void)
255 data[6] = (y + 1) << 3; /* y2 */ 255 data[6] = (y + 1) << 3; /* y2 */
256 256
257 for (x = 0; x < RC_WIDTH; x++) 257 for (x = 0; x < RC_WIDTH; x++)
258 data[x + 7] = lcd_remote_framebuffer[y][x]; 258 data[x + 7] = FBREMOTEADDR(x,y);
259 259
260 remote_tx(data, RC_WIDTH + 7); 260 remote_tx(data, RC_WIDTH + 7);
261 261
diff --git a/firmware/target/arm/pbell/vibe500/lcd-vibe500.c b/firmware/target/arm/pbell/vibe500/lcd-vibe500.c
index 4cb073db7b..4dd2ec1206 100644
--- a/firmware/target/arm/pbell/vibe500/lcd-vibe500.c
+++ b/firmware/target/arm/pbell/vibe500/lcd-vibe500.c
@@ -483,7 +483,7 @@ void lcd_update_rect(int x0, int y0, int width, int height)
483 /* start drawing */ 483 /* start drawing */
484 lcd_send_cmd(R_WRITE_DATA_2_GRAM); 484 lcd_send_cmd(R_WRITE_DATA_2_GRAM);
485 485
486 addr = &lcd_framebuffer[y0][x0]; 486 addr = FBADDR(x0, y0)
487 487
488 int c, r; 488 int c, r;
489 for (r = 0; r < height; r++) 489 for (r = 0; r < height; r++)
diff --git a/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c b/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c
index 500120a432..28bef09463 100644
--- a/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c
+++ b/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c
@@ -373,7 +373,7 @@ void lcd_update_rect(int x, int y, int width, int height)
373 if ((width <= 0) || (height <= 0)) 373 if ((width <= 0) || (height <= 0))
374 return; /* Nothing left to do. */ 374 return; /* Nothing left to do. */
375 375
376 addr = &lcd_framebuffer[y][x]; 376 addr = FBADDR(x,y);
377 377
378 lcd_send_cmd(CASET); 378 lcd_send_cmd(CASET);
379 lcd_send_data(x); 379 lcd_send_data(x);
diff --git a/firmware/target/arm/philips/hdd6330/lcd-hdd6330.c b/firmware/target/arm/philips/hdd6330/lcd-hdd6330.c
index 328c270b5e..cdd3064bba 100644
--- a/firmware/target/arm/philips/hdd6330/lcd-hdd6330.c
+++ b/firmware/target/arm/philips/hdd6330/lcd-hdd6330.c
@@ -285,7 +285,7 @@ void lcd_update_rect(int x, int y, int width, int height)
285 285
286 lcd_send_reg(LCD_REG_WRITE_DATA_2_GRAM); 286 lcd_send_reg(LCD_REG_WRITE_DATA_2_GRAM);
287 287
288 addr = (unsigned long*)&lcd_framebuffer[y][x]; 288 addr = (unsigned long*)FBADDR(x,y);
289 289
290 while (height > 0) 290 while (height > 0)
291 { 291 {
diff --git a/firmware/target/arm/philips/sa9200/lcd-sa9200.c b/firmware/target/arm/philips/sa9200/lcd-sa9200.c
index 3db308ed09..e30a298045 100644
--- a/firmware/target/arm/philips/sa9200/lcd-sa9200.c
+++ b/firmware/target/arm/philips/sa9200/lcd-sa9200.c
@@ -495,8 +495,8 @@ void lcd_update(void)
495 if (!display_on) 495 if (!display_on)
496 return; 496 return;
497 497
498 addr = &lcd_framebuffer[0][0]; 498 addr = FBADDR(0,0);
499 end = &lcd_framebuffer[LCD_HEIGHT - 1][LCD_WIDTH]; 499 end = FBADDR(LCD_WIDTH,LCD_HEIGHT - 1);
500 500
501 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (LCD_WIDTH - 1) << 8); 501 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (LCD_WIDTH - 1) << 8);
502 lcd_write_reg(R_VERT_RAM_ADDR_POS, (LCD_HEIGHT - 1) << 8); 502 lcd_write_reg(R_VERT_RAM_ADDR_POS, (LCD_HEIGHT - 1) << 8);
@@ -533,7 +533,7 @@ void lcd_update_rect(int x, int y, int width, int height)
533 if (height <= 0) 533 if (height <= 0)
534 return; /* Nothing left to do. */ 534 return; /* Nothing left to do. */
535 535
536 addr = &lcd_framebuffer[y][x]; 536 addr = FBADDR(x,y);
537 537
538 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((x + width - 1) << 8) | x); 538 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((x + width - 1) << 8) | x);
539 lcd_write_reg(R_VERT_RAM_ADDR_POS, ((y + height - 1) << 8) | y); 539 lcd_write_reg(R_VERT_RAM_ADDR_POS, ((y + height - 1) << 8) | y);
diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c
index c71e8fd6fb..1ad604d50c 100644
--- a/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c
+++ b/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c
@@ -191,7 +191,7 @@ void lcd_update(void)
191 lcd_write_command (LCD_CNTL_HIGHCOL); 191 lcd_write_command (LCD_CNTL_HIGHCOL);
192 lcd_write_command (LCD_CNTL_LOWCOL | 4); 192 lcd_write_command (LCD_CNTL_LOWCOL | 4);
193 193
194 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 194 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
195 } 195 }
196} 196}
197 197
@@ -219,6 +219,6 @@ void lcd_update_rect(int x, int y, int width, int height)
219 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+4) >> 4) & 0xf)); 219 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+4) >> 4) & 0xf));
220 lcd_write_command (LCD_CNTL_LOWCOL | ((x+4) & 0xf)); 220 lcd_write_command (LCD_CNTL_LOWCOL | ((x+4) & 0xf));
221 221
222 lcd_write_data (&lcd_framebuffer[y][x], width); 222 lcd_write_data (FBADDR(x,y), width);
223 } 223 }
224} 224}
diff --git a/firmware/target/arm/rk27xx/lcd-hifiman.c b/firmware/target/arm/rk27xx/lcd-hifiman.c
index 91e55894e5..21ca321d1f 100644
--- a/firmware/target/arm/rk27xx/lcd-hifiman.c
+++ b/firmware/target/arm/rk27xx/lcd-hifiman.c
@@ -162,7 +162,7 @@ void lcd_update_rect(int x, int y, int width, int height)
162 162
163 for (px=x; px<pxmax; px++) 163 for (px=x; px<pxmax; px++)
164 for (py=y; py<pymax; py++) 164 for (py=y; py<pymax; py++)
165 lcd_data(lcd_framebuffer[py][px]); 165 lcd_data(FBADDR(px, py));
166} 166}
167 167
168/* Blit a YUV bitmap directly to the LCD */ 168/* Blit a YUV bitmap directly to the LCD */
diff --git a/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c b/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
index b184630ebe..6b989a6dd7 100644
--- a/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
+++ b/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
@@ -191,7 +191,7 @@ void lcd_update_rect(int x, int y, int width, int height)
191 for (py=y; py<pymax; py++) 191 for (py=y; py<pymax; py++)
192 { 192 {
193 for (px=x; px<pxmax; px++) 193 for (px=x; px<pxmax; px++)
194 LCD_DATA = lcd_pixel_transform(lcd_framebuffer[py][px]); 194 LCD_DATA = lcd_pixel_transform(FBADDR(px,py));
195 } 195 }
196} 196}
197 197
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
index 6434469881..13e5c5c1d4 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
@@ -394,7 +394,7 @@ void lcd_update_rect(int x, int y, int width, int height)
394 lcd_setup_drawing_region(x, y, width, height); 394 lcd_setup_drawing_region(x, y, width, height);
395 395
396 /* Copy display bitmap to hardware */ 396 /* Copy display bitmap to hardware */
397 p = &lcd_framebuffer[y][x]; 397 p = FBADDR(x,y);
398 if (LCD_WIDTH == width) { 398 if (LCD_WIDTH == width) {
399 /* Write all lines at once */ 399 /* Write all lines at once */
400 lcd_write_line(p, height*LCD_WIDTH, LCD_BASE); 400 lcd_write_line(p, height*LCD_WIDTH, LCD_BASE);
diff --git a/firmware/target/arm/s5l8700/meizu-m3/lcd-m3.c b/firmware/target/arm/s5l8700/meizu-m3/lcd-m3.c
index 3420e92d62..5ed6c752b7 100644
--- a/firmware/target/arm/s5l8700/meizu-m3/lcd-m3.c
+++ b/firmware/target/arm/s5l8700/meizu-m3/lcd-m3.c
@@ -295,7 +295,7 @@ void lcd_update(void)
295 LCD_WCMD = 0; 295 LCD_WCMD = 0;
296 LCD_WCMD = 0x22; 296 LCD_WCMD = 0x22;
297 } 297 }
298 for(p=&lcd_framebuffer[0][0], i=0;i<LCD_WIDTH*LCD_FBHEIGHT;++i, ++p) { 298 for(p=FBADDR(0,0), i=0;i<LCD_WIDTH*LCD_FBHEIGHT;++i, ++p) {
299 while (LCD_STATUS & STAT_FULL); 299 while (LCD_STATUS & STAT_FULL);
300 LCD_WDATA = RGB_UNPACK_RED(*p); 300 LCD_WDATA = RGB_UNPACK_RED(*p);
301 while (LCD_STATUS & STAT_FULL); 301 while (LCD_STATUS & STAT_FULL);
diff --git a/firmware/target/arm/s5l8700/meizu-m6sp/lcd-m6sp.c b/firmware/target/arm/s5l8700/meizu-m6sp/lcd-m6sp.c
index 6ab5c08a50..5e722d5a87 100644
--- a/firmware/target/arm/s5l8700/meizu-m6sp/lcd-m6sp.c
+++ b/firmware/target/arm/s5l8700/meizu-m6sp/lcd-m6sp.c
@@ -438,8 +438,8 @@ void lcd_init_device(void)
438 lcd_controller_init(); 438 lcd_controller_init();
439 439
440 /* set framebuffer addresses */ 440 /* set framebuffer addresses */
441 fb = (uint32_t) &lcd_framebuffer[0][0]; 441 fb = (uint32_t) FBADDR(0,0);
442 fb_end = (uint32_t) &lcd_framebuffer[LCD_HEIGHT][0]; 442 fb_end = (uint32_t) FBADDR(0,LCD_HEIGHT);
443 window = 2 * LCD_WIDTH; 443 window = 2 * LCD_WIDTH;
444 444
445 LCDB1SADDR1 = fb; 445 LCDB1SADDR1 = fb;
diff --git a/firmware/target/arm/s5l8700/yps3/lcd-yps3.c b/firmware/target/arm/s5l8700/yps3/lcd-yps3.c
index 3b57a50ec0..a9830bca57 100644
--- a/firmware/target/arm/s5l8700/yps3/lcd-yps3.c
+++ b/firmware/target/arm/s5l8700/yps3/lcd-yps3.c
@@ -306,7 +306,7 @@ void lcd_update_rect(int x, int y, int width, int height)
306 lcd_set_position1(x, y); 306 lcd_set_position1(x, y);
307 307
308 for (h = 0; h < height; h++) { 308 for (h = 0; h < height; h++) {
309 p = &lcd_framebuffer[y][0]; 309 p = FBADDR(0,y);
310 for (w = 0; w < LCD_WIDTH; w++) { 310 for (w = 0; w < LCD_WIDTH; w++) {
311 while (LCD_STATUS & 0x10); 311 while (LCD_STATUS & 0x10);
312 LCD_WDATA = *p++; 312 LCD_WDATA = *p++;
@@ -319,7 +319,7 @@ void lcd_update_rect(int x, int y, int width, int height)
319 lcd_set_position2(x, y); 319 lcd_set_position2(x, y);
320 320
321 for (h = 0; h < height; h++) { 321 for (h = 0; h < height; h++) {
322 p = &lcd_framebuffer[y][x]; 322 p = FBADDR(x,y);
323 for (w = 0; w < width; w++) { 323 for (w = 0; w < width; w++) {
324 while (LCD_STATUS & 0x10); 324 while (LCD_STATUS & 0x10);
325 LCD_WDATA = *p++; 325 LCD_WDATA = *p++;
diff --git a/firmware/target/arm/s5l8702/ipod6g/lcd-ipod6g.c b/firmware/target/arm/s5l8702/ipod6g/lcd-ipod6g.c
index 84443551b9..f9dbab6180 100644
--- a/firmware/target/arm/s5l8702/ipod6g/lcd-ipod6g.c
+++ b/firmware/target/arm/s5l8702/ipod6g/lcd-ipod6g.c
@@ -428,7 +428,7 @@ void lcd_update_rect(int, int, int, int) ICODE_ATTR;
428void lcd_update_rect(int x, int y, int width, int height) 428void lcd_update_rect(int x, int y, int width, int height)
429{ 429{
430 int pixels = width * height; 430 int pixels = width * height;
431 fb_data* p = &lcd_framebuffer[y][x]; 431 fb_data* p = FBADDR(x,y);
432 uint16_t* out = lcd_dblbuf[0]; 432 uint16_t* out = lcd_dblbuf[0];
433 433
434#ifdef HAVE_LCD_SLEEP 434#ifdef HAVE_LCD_SLEEP
diff --git a/firmware/target/arm/samsung/yh820/lcd-yh820.c b/firmware/target/arm/samsung/yh820/lcd-yh820.c
index 4773e27185..10934621d7 100644
--- a/firmware/target/arm/samsung/yh820/lcd-yh820.c
+++ b/firmware/target/arm/samsung/yh820/lcd-yh820.c
@@ -347,7 +347,7 @@ void lcd_update_rect(int x, int y, int width, int height)
347 if ((width <= 0) || (height <= 0)) 347 if ((width <= 0) || (height <= 0))
348 return; /* Nothing left to do. */ 348 return; /* Nothing left to do. */
349 349
350 addr = &lcd_framebuffer[y][x]; 350 addr = FBADDR(x,y);
351 351
352 if (width <= 1) { 352 if (width <= 1) {
353 lcd_send_command(R_ENTRY_MODE); /* The X end address must be larger */ 353 lcd_send_command(R_ENTRY_MODE); /* The X end address must be larger */
diff --git a/firmware/target/arm/samsung/yh920/lcd-yh920.c b/firmware/target/arm/samsung/yh920/lcd-yh920.c
index d24396050a..5563c13f53 100644
--- a/firmware/target/arm/samsung/yh920/lcd-yh920.c
+++ b/firmware/target/arm/samsung/yh920/lcd-yh920.c
@@ -259,7 +259,7 @@ void lcd_update_rect(int x, int y, int width, int height)
259 lcd_write_reg(LCD_CNTL_PAGE, y); 259 lcd_write_reg(LCD_CNTL_PAGE, y);
260 lcd_write_reg(LCD_CNTL_COLUMN, x); 260 lcd_write_reg(LCD_CNTL_COLUMN, x);
261 261
262 addr = &lcd_framebuffer[y][x]; 262 addr = FBADDR(x,y);
263 263
264 lcd_send_cmd(LCD_CNTL_DATA_WRITE); 264 lcd_send_cmd(LCD_CNTL_DATA_WRITE);
265 lcd_write_data(addr, width); 265 lcd_write_data(addr, width);
diff --git a/firmware/target/arm/samsung/yh925/lcd-yh925.c b/firmware/target/arm/samsung/yh925/lcd-yh925.c
index ceed443654..93bfb3a5f2 100644
--- a/firmware/target/arm/samsung/yh925/lcd-yh925.c
+++ b/firmware/target/arm/samsung/yh925/lcd-yh925.c
@@ -639,7 +639,7 @@ void lcd_update_rect(int x0, int y0, int width, int height)
639 /* start drawing */ 639 /* start drawing */
640 lcd_send_cmd(R_WRITE_DATA_2_GRAM); 640 lcd_send_cmd(R_WRITE_DATA_2_GRAM);
641 641
642 addr = (unsigned short*)&lcd_framebuffer[y0][x0]; 642 addr = (unsigned short*)FBADDR(x0,y0);
643 643
644 int c, r; 644 int c, r;
645 645
diff --git a/firmware/target/arm/sandisk/sansa-view/lcd-view.c b/firmware/target/arm/sandisk/sansa-view/lcd-view.c
index 99c972704d..cc67e838f9 100644
--- a/firmware/target/arm/sandisk/sansa-view/lcd-view.c
+++ b/firmware/target/arm/sandisk/sansa-view/lcd-view.c
@@ -363,7 +363,7 @@ void lcd_update(void)
363{ 363{
364 const fb_data *addr; 364 const fb_data *addr;
365 365
366 addr = &lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH]; 366 addr = FBADDR(LCD_WIDTH,LCD_HEIGHT);
367 367
368 lcd_write_reg(0x20, 0x0); 368 lcd_write_reg(0x20, 0x0);
369 lcd_write_reg(0x21, 0x0); 369 lcd_write_reg(0x21, 0x0);
diff --git a/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c b/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c
index 4abd17741b..c53aadaf30 100644
--- a/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c
+++ b/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c
@@ -252,7 +252,7 @@ void lcd_update_rect(int x, int y, int width, int height)
252 if ((width <= 0) || (height <= 0)) 252 if ((width <= 0) || (height <= 0))
253 return; /* Nothing left to do. */ 253 return; /* Nothing left to do. */
254 254
255 addr = &lcd_framebuffer[y][x]; 255 addr = FBADDR(x,y);
256 256
257 if (width <= 1) { 257 if (width <= 1) {
258 lcd_send_command(R_ENTRY_MODE); /* The X end address must be larger */ 258 lcd_send_command(R_ENTRY_MODE); /* The X end address must be larger */
diff --git a/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c b/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c
index 5d2a2b8194..8b9a9bda83 100644
--- a/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c
+++ b/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c
@@ -211,7 +211,7 @@ void lcd_update_rect(int sx, int sy, int width, int height)
211 fb_data c; 211 fb_data c;
212 unsigned long color; 212 unsigned long color;
213 213
214 c = lcd_framebuffer[y][x]; 214 c = FBADDR(x,y);
215 color = 215 color =
216 ((c & 0x1f) << 1) | ((c & 0x7e0) << 1) | ((c & 0xf800) << 216 ((c & 0x1f) << 1) | ((c & 0x7e0) << 1) | ((c & 0xf800) <<
217 2); 217 2);
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c b/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c
index 204a99f87c..5f623dc239 100644
--- a/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c
+++ b/firmware/target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c
@@ -380,7 +380,7 @@ void lcd_update_rect(int x, int y, int width, int height)
380 380
381#if CONFIG_ORIENTATION == SCREEN_PORTRAIT 381#if CONFIG_ORIENTATION == SCREEN_PORTRAIT
382 dst = (fb_data *)FRAME + LCD_WIDTH*y + x; 382 dst = (fb_data *)FRAME + LCD_WIDTH*y + x;
383 src = &lcd_framebuffer[y][x]; 383 src = FBADDR(x,y);
384 384
385 /* Copy part of the Rockbox framebuffer to the second framebuffer */ 385 /* Copy part of the Rockbox framebuffer to the second framebuffer */
386 if (width < LCD_WIDTH) 386 if (width < LCD_WIDTH)
@@ -394,7 +394,7 @@ void lcd_update_rect(int x, int y, int width, int height)
394 lcd_copy_buffer_rect(dst, src, LCD_WIDTH*height, 1); 394 lcd_copy_buffer_rect(dst, src, LCD_WIDTH*height, 1);
395 } 395 }
396#else 396#else
397 src = &lcd_framebuffer[y][x]; 397 src = FBADDR(x,y);
398 398
399 register int xc, yc; 399 register int xc, yc;
400 register fb_data *start=FRAME + LCD_HEIGHT*(LCD_WIDTH-x-1) + y + 1; 400 register fb_data *start=FRAME + LCD_HEIGHT*(LCD_WIDTH-x-1) + y + 1;
@@ -419,7 +419,7 @@ void lcd_update(void)
419 if (!lcd_on || direct_fb_access) 419 if (!lcd_on || direct_fb_access)
420 return; 420 return;
421#if CONFIG_ORIENTATION == SCREEN_PORTRAIT 421#if CONFIG_ORIENTATION == SCREEN_PORTRAIT
422 lcd_copy_buffer_rect((fb_data *)FRAME, &lcd_framebuffer[0][0], 422 lcd_copy_buffer_rect((fb_data *)FRAME, FBADDR(0,0),
423 LCD_WIDTH*LCD_HEIGHT, 1); 423 LCD_WIDTH*LCD_HEIGHT, 1);
424#else 424#else
425 lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT); 425 lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
index 38631401f9..c3a96a3efd 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
@@ -500,12 +500,12 @@ void lcd_update_rect(int x, int y, int width, int height)
500 if (width < LCD_WIDTH) 500 if (width < LCD_WIDTH)
501 { 501 {
502 /* Not full width - do line-by-line */ 502 /* Not full width - do line-by-line */
503 lcd_copy_buffer_rect(dst, &lcd_framebuffer[y][x], width, height); 503 lcd_copy_buffer_rect(dst, FBADDR(x,y), width, height);
504 } 504 }
505 else 505 else
506 { 506 {
507 /* Full width - copy as one line */ 507 /* Full width - copy as one line */
508 lcd_copy_buffer_rect(dst, &lcd_framebuffer[y][x], LCD_WIDTH*height, 1); 508 lcd_copy_buffer_rect(dst, FBADDR(x,y), LCD_WIDTH*height, 1);
509 } 509 }
510#endif 510#endif
511 511
@@ -519,7 +519,7 @@ void lcd_update_rect(int x, int y, int width, int height)
519#else 519#else
520 fb_data *src; 520 fb_data *src;
521 fb_data *dst; 521 fb_data *dst;
522 src = &lcd_framebuffer[0][0] + (x*LCD_HEIGHT + y); 522 src = FBADDR(0,0) + (x*LCD_HEIGHT + y);
523 dst = FRAME + (LCD_HEIGHT*(LCD_WIDTH-1) - x * LCD_HEIGHT + y); 523 dst = FRAME + (LCD_HEIGHT*(LCD_WIDTH-1) - x * LCD_HEIGHT + y);
524 524
525 while(width > 0) { 525 while(width > 0) {
@@ -532,7 +532,7 @@ void lcd_update_rect(int x, int y, int width, int height)
532 532
533#else 533#else
534 register fb_data *dst, *src; 534 register fb_data *dst, *src;
535 src = &lcd_framebuffer[y][x]; 535 src = FBADDR(x,y);
536 536
537 dst=FRAME + (LCD_NATIVE_WIDTH*(LCD_NATIVE_HEIGHT-1)) 537 dst=FRAME + (LCD_NATIVE_WIDTH*(LCD_NATIVE_HEIGHT-1))
538 - LCD_NATIVE_WIDTH*x + y ; 538 - LCD_NATIVE_WIDTH*x + y ;
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c
index d8f55ee63d..5b8b2f9437 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c
@@ -246,7 +246,7 @@ static void remote_tick(void)
246 for(i=7; i<remote_payload_size; i++) 246 for(i=7; i<remote_payload_size; i++)
247 { 247 {
248 remote_payload[i]= 248 remote_payload[i]=
249 lcd_remote_framebuffer[remote_payload[4]>>3][i+remote_draw_x-7]; 249 FBREMOTEADDR(i+remote_draw_x-7, remote_payload[4]>>3);
250 } 250 }
251 } 251 }
252 252
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c
index 403ce182be..27eb0b407a 100644
--- a/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c
+++ b/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c
@@ -167,7 +167,7 @@ static void dma_lcd_copy_buffer_rect(int x, int y, int width, int height)
167 167
168 /* Set source and destination addresses */ 168 /* Set source and destination addresses */
169 dst = (char*)(FRAME + LCD_WIDTH*y + x); 169 dst = (char*)(FRAME + LCD_WIDTH*y + x);
170 src = (char*)(&lcd_framebuffer[y][x]); 170 src = (char*)(FBADDR(x,y));
171 171
172 /* Flush cache to memory */ 172 /* Flush cache to memory */
173 commit_dcache(); 173 commit_dcache();
diff --git a/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c b/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c
index 88fc6fc563..e84760e197 100644
--- a/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c
+++ b/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c
@@ -228,7 +228,7 @@ void lcd_remote_update(void)
228 have to update one page at a time. */ 228 have to update one page at a time. */
229 lcd_remote_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y)); 229 lcd_remote_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y));
230 lcd_remote_write_command_ex(LCD_SET_COLUMN | 0, 0); 230 lcd_remote_write_command_ex(LCD_SET_COLUMN | 0, 0);
231 lcd_remote_write_data(lcd_remote_framebuffer[y], LCD_REMOTE_WIDTH); 231 lcd_remote_write_data(FBREMOTEADDR(0, y), LCD_REMOTE_WIDTH);
232 } 232 }
233 } 233 }
234} 234}
@@ -260,7 +260,7 @@ void lcd_remote_update_rect(int x, int y, int width, int height)
260 lcd_remote_write_command_ex(LCD_SET_COLUMN | ((x >> 4) & 0xf), 260 lcd_remote_write_command_ex(LCD_SET_COLUMN | ((x >> 4) & 0xf),
261 x & 0xf); 261 x & 0xf);
262 262
263 lcd_remote_write_data(&lcd_remote_framebuffer[y][x], width); 263 lcd_remote_write_data(FBREMOTEADDR(x,y), width);
264 } 264 }
265 } 265 }
266} 266}
diff --git a/firmware/target/coldfire/iaudio/m3/lcd-m3.c b/firmware/target/coldfire/iaudio/m3/lcd-m3.c
index 380789e7f7..1d61daf323 100644
--- a/firmware/target/coldfire/iaudio/m3/lcd-m3.c
+++ b/firmware/target/coldfire/iaudio/m3/lcd-m3.c
@@ -265,7 +265,7 @@ void lcd_update(void)
265 have to update one page at a time. */ 265 have to update one page at a time. */
266 lcd_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y)); 266 lcd_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y));
267 lcd_write_command_e(LCD_SET_COLUMN | 0, 0); 267 lcd_write_command_e(LCD_SET_COLUMN | 0, 0);
268 lcd_write_data(lcd_framebuffer[y], LCD_WIDTH); 268 lcd_write_data(FBADDR(0, y), LCD_WIDTH);
269 } 269 }
270 } 270 }
271} 271}
@@ -295,7 +295,7 @@ void lcd_update_rect(int x, int y, int width, int height)
295 lcd_write_command(LCD_SET_PAGE | ((y > 5 ? y + 2 : y) & 0xf)); 295 lcd_write_command(LCD_SET_PAGE | ((y > 5 ? y + 2 : y) & 0xf));
296 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf); 296 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf);
297 297
298 lcd_write_data(&lcd_framebuffer[y][x], width); 298 lcd_write_data(FBADDR(x,y), width);
299 } 299 }
300 } 300 }
301} 301}
diff --git a/firmware/target/coldfire/iaudio/m5/lcd-m5.c b/firmware/target/coldfire/iaudio/m5/lcd-m5.c
index ae8f14bb25..8f022adf96 100644
--- a/firmware/target/coldfire/iaudio/m5/lcd-m5.c
+++ b/firmware/target/coldfire/iaudio/m5/lcd-m5.c
@@ -207,7 +207,7 @@ void lcd_update(void)
207 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1); 207 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1);
208 208
209 lcd_write_command(LCD_CNTL_DATA_WRITE); 209 lcd_write_command(LCD_CNTL_DATA_WRITE);
210 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 210 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
211 } 211 }
212} 212}
213 213
@@ -235,6 +235,6 @@ void lcd_update_rect(int x, int y, int width, int height)
235 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); 235 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1);
236 236
237 lcd_write_command(LCD_CNTL_DATA_WRITE); 237 lcd_write_command(LCD_CNTL_DATA_WRITE);
238 lcd_write_data (&lcd_framebuffer[y][x], width); 238 lcd_write_data (FBADDR(x,y), width);
239 } 239 }
240} 240}
diff --git a/firmware/target/coldfire/iaudio/x5/lcd-x5.c b/firmware/target/coldfire/iaudio/x5/lcd-x5.c
index 19b0725ce4..cf6e301c16 100644
--- a/firmware/target/coldfire/iaudio/x5/lcd-x5.c
+++ b/firmware/target/coldfire/iaudio/x5/lcd-x5.c
@@ -530,7 +530,7 @@ void lcd_update_rect(int x, int y, int width, int height)
530 530
531 lcd_begin_write_gram(); 531 lcd_begin_write_gram();
532 532
533 ptr = (unsigned short *)&lcd_framebuffer[y][x]; 533 ptr = (unsigned short *)FBADDR(x,y);
534 534
535 do 535 do
536 { 536 {
diff --git a/firmware/target/coldfire/iriver/h100/lcd-h100.c b/firmware/target/coldfire/iriver/h100/lcd-h100.c
index ae77affd18..b13751b9eb 100644
--- a/firmware/target/coldfire/iriver/h100/lcd-h100.c
+++ b/firmware/target/coldfire/iriver/h100/lcd-h100.c
@@ -216,7 +216,7 @@ void lcd_update(void)
216 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1); 216 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1);
217 217
218 lcd_write_command(LCD_CNTL_DATA_WRITE); 218 lcd_write_command(LCD_CNTL_DATA_WRITE);
219 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 219 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
220 } 220 }
221} 221}
222 222
@@ -244,6 +244,6 @@ void lcd_update_rect(int x, int y, int width, int height)
244 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); 244 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1);
245 245
246 lcd_write_command(LCD_CNTL_DATA_WRITE); 246 lcd_write_command(LCD_CNTL_DATA_WRITE);
247 lcd_write_data (&lcd_framebuffer[y][x], width); 247 lcd_write_data (FBADDR(x,y), width);
248 } 248 }
249} 249}
diff --git a/firmware/target/coldfire/iriver/h300/lcd-h300.c b/firmware/target/coldfire/iriver/h300/lcd-h300.c
index 6c21a7e260..191c769c97 100644
--- a/firmware/target/coldfire/iriver/h300/lcd-h300.c
+++ b/firmware/target/coldfire/iriver/h300/lcd-h300.c
@@ -447,13 +447,13 @@ void lcd_update_rect(int x, int y, int width, int height)
447 if (width == LCD_WIDTH) 447 if (width == LCD_WIDTH)
448 { 448 {
449 dma_count = 1; 449 dma_count = 1;
450 SAR3 = (unsigned long)lcd_framebuffer[y]; 450 SAR3 = (unsigned long)FBADDR(0, y);
451 BCR3 = (LCD_WIDTH*sizeof(fb_data)) * height; 451 BCR3 = (LCD_WIDTH*sizeof(fb_data)) * height;
452 } 452 }
453 else 453 else
454 { 454 {
455 dma_count = height; 455 dma_count = height;
456 SAR3 = dma_addr = (unsigned long)&lcd_framebuffer[y][x]; 456 SAR3 = dma_addr = (unsigned long)FBADDR(x,y);
457 BCR3 = dma_len = width * sizeof(fb_data); 457 BCR3 = dma_len = width * sizeof(fb_data);
458 } 458 }
459 DCR3 = DMA_INT | DMA_AA | DMA_BWC(1) 459 DCR3 = DMA_INT | DMA_AA | DMA_BWC(1)
diff --git a/firmware/target/coldfire/iriver/lcd-remote-iriver.c b/firmware/target/coldfire/iriver/lcd-remote-iriver.c
index 0ff041f033..03c0e40dbe 100644
--- a/firmware/target/coldfire/iriver/lcd-remote-iriver.c
+++ b/firmware/target/coldfire/iriver/lcd-remote-iriver.c
@@ -312,7 +312,7 @@ void lcd_remote_update(void)
312 lcd_remote_write_command(LCD_REMOTE_CNTL_SET_PAGE_ADDRESS | y); 312 lcd_remote_write_command(LCD_REMOTE_CNTL_SET_PAGE_ADDRESS | y);
313 lcd_remote_write_command(LCD_REMOTE_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf)); 313 lcd_remote_write_command(LCD_REMOTE_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf));
314 lcd_remote_write_command(LCD_REMOTE_CNTL_LOWCOL | (xoffset & 0xf)); 314 lcd_remote_write_command(LCD_REMOTE_CNTL_LOWCOL | (xoffset & 0xf));
315 lcd_remote_write_data(lcd_remote_framebuffer[y], LCD_REMOTE_WIDTH); 315 lcd_remote_write_data(FBREMOTEADDR(0, y), LCD_REMOTE_WIDTH);
316 } 316 }
317} 317}
318 318
@@ -346,6 +346,6 @@ void lcd_remote_update_rect(int x, int y, int width, int height)
346 lcd_remote_write_command(LCD_REMOTE_CNTL_SET_PAGE_ADDRESS | y); 346 lcd_remote_write_command(LCD_REMOTE_CNTL_SET_PAGE_ADDRESS | y);
347 lcd_remote_write_command(LCD_REMOTE_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf)); 347 lcd_remote_write_command(LCD_REMOTE_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf));
348 lcd_remote_write_command(LCD_REMOTE_CNTL_LOWCOL | ((x+xoffset) & 0xf)); 348 lcd_remote_write_command(LCD_REMOTE_CNTL_LOWCOL | ((x+xoffset) & 0xf));
349 lcd_remote_write_data(&lcd_remote_framebuffer[y][x], width); 349 lcd_remote_write_data(FBREMOTEADDR(x,y), width);
350 } 350 }
351} 351}
diff --git a/firmware/target/coldfire/mpio/hd200/lcd-hd200.c b/firmware/target/coldfire/mpio/hd200/lcd-hd200.c
index 879352f7b4..3c00959745 100644
--- a/firmware/target/coldfire/mpio/hd200/lcd-hd200.c
+++ b/firmware/target/coldfire/mpio/hd200/lcd-hd200.c
@@ -187,7 +187,7 @@ void DMA3(void)
187 lcd_write_command_e(LCD_SET_COLUMN | ((column >> 4) & 0xf), 187 lcd_write_command_e(LCD_SET_COLUMN | ((column >> 4) & 0xf),
188 column & 0x0f); 188 column & 0x0f);
189 189
190 SAR3 = (unsigned long)&lcd_framebuffer[page][column]; 190 SAR3 = (unsigned long)FBADDR(column,page);
191 BCR3 = dma_len; 191 BCR3 = dma_len;
192 DCR3 = DMA_INT | DMA_AA | DMA_BWC(1) 192 DCR3 = DMA_INT | DMA_AA | DMA_BWC(1)
193 | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE) 193 | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE)
@@ -261,7 +261,7 @@ void lcd_update_rect(int x, int y, int width, int height)
261 dma_count = ymax - y + 1; 261 dma_count = ymax - y + 1;
262 262
263 /* Initialize DMA transfer */ 263 /* Initialize DMA transfer */
264 SAR3 = (unsigned long)&lcd_framebuffer[page][column]; 264 SAR3 = (unsigned long)FBADDR(column,page);
265 BCR3 = dma_len; 265 BCR3 = dma_len;
266 DCR3 = DMA_INT | DMA_AA | DMA_BWC(1) 266 DCR3 = DMA_INT | DMA_AA | DMA_BWC(1)
267 | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE) 267 | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE)
diff --git a/firmware/target/coldfire/mpio/hd300/lcd-hd300.c b/firmware/target/coldfire/mpio/hd300/lcd-hd300.c
index 31087a5d43..509ed4cd53 100644
--- a/firmware/target/coldfire/mpio/hd300/lcd-hd300.c
+++ b/firmware/target/coldfire/mpio/hd300/lcd-hd300.c
@@ -211,7 +211,7 @@ void lcd_update(void)
211 lcd_write_command(LCD_CNTL_DATA_WRITE); 211 lcd_write_command(LCD_CNTL_DATA_WRITE);
212 212
213 /* Copy display bitmap to hardware */ 213 /* Copy display bitmap to hardware */
214 lcd_write_data (&lcd_framebuffer[0][0], LCD_WIDTH*LCD_FBHEIGHT); 214 lcd_write_data (FBADDR(0,0), LCD_WIDTH*LCD_FBHEIGHT);
215} 215}
216 216
217/* Update a fraction of the display. */ 217/* Update a fraction of the display. */
@@ -238,6 +238,6 @@ void lcd_update_rect(int x, int y, int width, int height)
238 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); 238 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1);
239 239
240 lcd_write_command(LCD_CNTL_DATA_WRITE); 240 lcd_write_command(LCD_CNTL_DATA_WRITE);
241 lcd_write_data (&lcd_framebuffer[y][x], width); 241 lcd_write_data (FBADDR(x,y), width);
242 } 242 }
243} 243}
diff --git a/firmware/target/hosted/android/lcd-android.c b/firmware/target/hosted/android/lcd-android.c
index abde72155d..c9a3fd6edf 100644
--- a/firmware/target/hosted/android/lcd-android.c
+++ b/firmware/target/hosted/android/lcd-android.c
@@ -75,7 +75,7 @@ void connect_with_java(JNIEnv* env, jobject fb_instance)
75 75
76 /* Create native_buffer */ 76 /* Create native_buffer */
77 jobject buffer = (*env)->NewDirectByteBuffer(env, lcd_framebuffer, 77 jobject buffer = (*env)->NewDirectByteBuffer(env, lcd_framebuffer,
78 (jlong) sizeof(lcd_framebuffer)); 78 (jlong) FRAMEBUFFER_SIZE);
79 79
80 /* we need to setup parts for the java object every time */ 80 /* we need to setup parts for the java object every time */
81 (*env)->CallVoidMethod(env, fb_instance, java_lcd_init, 81 (*env)->CallVoidMethod(env, fb_instance, java_lcd_init,
@@ -206,10 +206,10 @@ void lcd_blit_yuv(unsigned char * const src[3],
206 linecounter = height >> 1; 206 linecounter = height >> 1;
207 207
208#if LCD_WIDTH >= LCD_HEIGHT 208#if LCD_WIDTH >= LCD_HEIGHT
209 dst = &lcd_framebuffer[y][x]; 209 dst = FBADDR(x,y);
210 row_end = dst + width; 210 row_end = dst + width;
211#else 211#else
212 dst = &lcd_framebuffer[x][LCD_WIDTH - y - 1]; 212 dst = FBADDR(LCD_WIDTH - y - 1,x);
213 row_end = dst + LCD_WIDTH * width; 213 row_end = dst + LCD_WIDTH * width;
214#endif 214#endif
215 215
diff --git a/firmware/target/hosted/sdl/lcd-bitmap.c b/firmware/target/hosted/sdl/lcd-bitmap.c
index 4ee0bbef5c..7e9bc297ef 100644
--- a/firmware/target/hosted/sdl/lcd-bitmap.c
+++ b/firmware/target/hosted/sdl/lcd-bitmap.c
@@ -92,29 +92,25 @@ static unsigned long get_lcd_pixel(int x, int y)
92{ 92{
93#if LCD_DEPTH == 1 93#if LCD_DEPTH == 1
94#ifdef HAVE_NEGATIVE_LCD 94#ifdef HAVE_NEGATIVE_LCD
95 return (lcd_framebuffer[y/8][x] & (1 << (y & 7))) ? (NUM_SHADES-1) : 0; 95 return (*FBADDR(x, y/8) & (1 << (y & 7))) ? (NUM_SHADES-1) : 0;
96#else 96#else
97 return (lcd_framebuffer[y/8][x] & (1 << (y & 7))) ? 0 : (NUM_SHADES-1); 97 return (*FBADDR(x, y/8) & (1 << (y & 7))) ? 0 : (NUM_SHADES-1);
98#endif 98#endif
99#elif LCD_DEPTH == 2 99#elif LCD_DEPTH == 2
100#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 100#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
101 return colorindex[(lcd_framebuffer[y][x/4] >> (2 * (~x & 3))) & 3]; 101 return colorindex[(*FBADDR(x/4, y) >> (2 * (~x & 3))) & 3];
102#elif LCD_PIXELFORMAT == VERTICAL_PACKING 102#elif LCD_PIXELFORMAT == VERTICAL_PACKING
103 return colorindex[(lcd_framebuffer[y/4][x] >> (2 * (y & 3))) & 3]; 103 return colorindex[(*FBADDR(x, y/4) >> (2 * (y & 3))) & 3];
104#elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED 104#elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED
105 unsigned bits = (lcd_framebuffer[y/8][x] >> (y & 7)) & 0x0101; 105 unsigned bits = (*FBADDR(x, y/8) >> (y & 7)) & 0x0101;
106 return colorindex[(bits | (bits >> 7)) & 3]; 106 return colorindex[(bits | (bits >> 7)) & 3];
107#endif 107#endif
108#elif LCD_DEPTH == 16 108#elif LCD_DEPTH == 16
109#if LCD_PIXELFORMAT == RGB565SWAPPED 109#if LCD_PIXELFORMAT == RGB565SWAPPED
110 unsigned bits = lcd_framebuffer[y][x]; 110 unsigned bits = *FBADDR(x, y);
111 return (bits >> 8) | (bits << 8); 111 return (bits >> 8) | (bits << 8);
112#else 112#else
113#if defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE 113 return *FBADDR(x, y);
114 return *(&lcd_framebuffer[0][0]+LCD_HEIGHT*x+y);
115#else
116 return lcd_framebuffer[y][x];
117#endif
118#endif 114#endif
119#endif 115#endif
120} 116}
diff --git a/firmware/target/hosted/sdl/lcd-remote-bitmap.c b/firmware/target/hosted/sdl/lcd-remote-bitmap.c
index 86d45ef446..5f08b4440b 100644
--- a/firmware/target/hosted/sdl/lcd-remote-bitmap.c
+++ b/firmware/target/hosted/sdl/lcd-remote-bitmap.c
@@ -50,10 +50,10 @@ static const unsigned char colorindex[4] = {128, 85, 43, 0};
50static unsigned long get_lcd_remote_pixel(int x, int y) 50static unsigned long get_lcd_remote_pixel(int x, int y)
51{ 51{
52#if LCD_REMOTE_DEPTH == 1 52#if LCD_REMOTE_DEPTH == 1
53 return lcd_remote_framebuffer[y/8][x] & (1 << (y & 7)) ? 0 : (NUM_SHADES-1); 53 return *FBREMOTEADDR(x, y/8) & (1 << (y & 7)) ? 0 : (NUM_SHADES-1);
54#elif LCD_REMOTE_DEPTH == 2 54#elif LCD_REMOTE_DEPTH == 2
55#if LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED 55#if LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED
56 unsigned bits = (lcd_remote_framebuffer[y/8][x] >> (y & 7)) & 0x0101; 56 unsigned bits = (*FBREMOTEADDR(x, y/8) >> (y & 7)) & 0x0101;
57 return colorindex[(bits | (bits >> 7)) & 3]; 57 return colorindex[(bits | (bits >> 7)) & 3];
58#endif 58#endif
59#endif 59#endif
diff --git a/firmware/target/hosted/ypr0/lcd-ypr0.c b/firmware/target/hosted/ypr0/lcd-ypr0.c
index 083a9fbe28..40528c298a 100644
--- a/firmware/target/hosted/ypr0/lcd-ypr0.c
+++ b/firmware/target/hosted/ypr0/lcd-ypr0.c
@@ -39,7 +39,7 @@ fb_data *dev_fb = 0;
39void lcd_shutdown(void) 39void lcd_shutdown(void)
40{ 40{
41 printf("FB closed."); 41 printf("FB closed.");
42 munmap(dev_fb, sizeof(lcd_framebuffer)); 42 munmap(dev_fb, FRAMEBUFFER_SIZE);
43 close(dev_fd); 43 close(dev_fd);
44} 44}
45 45
@@ -80,7 +80,7 @@ void lcd_init_device(void)
80 80
81 /* Figure out the size of the screen in bytes */ 81 /* Figure out the size of the screen in bytes */
82 screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; 82 screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
83 if (screensize != sizeof(lcd_framebuffer)) 83 if (screensize != FRAMEBUFFER_SIZE)
84 { 84 {
85 exit(4); 85 exit(4);
86 perror("Display and framebuffer mismatch!\n"); 86 perror("Display and framebuffer mismatch!\n");
diff --git a/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c
index e74e227e47..c644b9f477 100644
--- a/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c
@@ -101,7 +101,7 @@ void lcd_update_rect(int x, int y, int width, int height)
101 dma_enable(); 101 dma_enable();
102 102
103 REG_DMAC_DCCSR(DMA_LCD_CHANNEL) = DMAC_DCCSR_NDES; 103 REG_DMAC_DCCSR(DMA_LCD_CHANNEL) = DMAC_DCCSR_NDES;
104 REG_DMAC_DSAR(DMA_LCD_CHANNEL) = PHYSADDR((unsigned long)&lcd_framebuffer[y][x]); 104 REG_DMAC_DSAR(DMA_LCD_CHANNEL) = PHYSADDR((unsigned long)FBADDR(x,y));
105 REG_DMAC_DRSR(DMA_LCD_CHANNEL) = DMAC_DRSR_RS_SLCD; 105 REG_DMAC_DRSR(DMA_LCD_CHANNEL) = DMAC_DRSR_RS_SLCD;
106 REG_DMAC_DTAR(DMA_LCD_CHANNEL) = PHYSADDR(SLCD_FIFO); 106 REG_DMAC_DTAR(DMA_LCD_CHANNEL) = PHYSADDR(SLCD_FIFO);
107 REG_DMAC_DTCR(DMA_LCD_CHANNEL) = (width * height) >> 3; 107 REG_DMAC_DTCR(DMA_LCD_CHANNEL) = (width * height) >> 3;
@@ -195,7 +195,7 @@ void lcd_blit_yuv(unsigned char * const src[3],
195 IPU_SET_Y_ADDR(PHYSADDR((unsigned long)yuv_src[0])); 195 IPU_SET_Y_ADDR(PHYSADDR((unsigned long)yuv_src[0]));
196 IPU_SET_U_ADDR(PHYSADDR((unsigned long)yuv_src[1])); 196 IPU_SET_U_ADDR(PHYSADDR((unsigned long)yuv_src[1]));
197 IPU_SET_V_ADDR(PHYSADDR((unsigned long)yuv_src[2])); 197 IPU_SET_V_ADDR(PHYSADDR((unsigned long)yuv_src[2]));
198 IPU_SET_OUT_ADDR(PHYSADDR((unsigned long)&lcd_framebuffer[x][y])); 198 IPU_SET_OUT_ADDR(PHYSADDR((unsigned long)FBADDR(y,x)));
199 199
200 IPU_SET_OUT_FM(height, width); 200 IPU_SET_OUT_FM(height, width);
201 IPU_SET_OUT_STRIDE(height); 201 IPU_SET_OUT_STRIDE(height);
diff --git a/firmware/target/sh/archos/lcd-archos-bitmap.c b/firmware/target/sh/archos/lcd-archos-bitmap.c
index 8d8a98432d..f23289053d 100644
--- a/firmware/target/sh/archos/lcd-archos-bitmap.c
+++ b/firmware/target/sh/archos/lcd-archos-bitmap.c
@@ -192,7 +192,7 @@ void lcd_update(void)
192 lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf)); 192 lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf));
193 lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf)); 193 lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf));
194 194
195 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 195 lcd_write_data (FBADDR(0, y), LCD_WIDTH);
196 } 196 }
197} 197}
198 198
@@ -219,6 +219,6 @@ void lcd_update_rect(int x, int y, int width, int height)
219 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf)); 219 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf));
220 lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf)); 220 lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf));
221 221
222 lcd_write_data (&lcd_framebuffer[y][x], width); 222 lcd_write_data (FBADDR(x,y), width);
223 } 223 }
224} 224}