summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2012-02-22 21:18:05 +1100
committerJonathan Gordon <rockbox@jdgordon.info>2012-02-28 11:44:59 +1100
commitb37e6bc8c119289aca8740dd5e3b60d72f9d6b40 (patch)
tree7ee9d491811c950943f0fc068d2e2b460ff05c6d
parent15c69b8bafc3e89e1a825b5bbefef4a97f0001b1 (diff)
downloadrockbox-b37e6bc8c119289aca8740dd5e3b60d72f9d6b40.tar.gz
rockbox-b37e6bc8c119289aca8740dd5e3b60d72f9d6b40.zip
lcd drivers: Convert lcd_[remote_]framebuffer to a pointer
Change all lcd drivers to using a pointer to the static framebuffer instead of directly accessing the static array. This will let us later do fun things like dynamic framebuffer sizes (RaaA) or ability to use different buffers for different layers (dynamic skin backdrops!) Change-Id: I0a4d58a9d7b55e6c932131b929e5d4c9f9414b06
-rw-r--r--apps/plugin.c4
-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
65 files changed, 193 insertions, 181 deletions
diff --git a/apps/plugin.c b/apps/plugin.c
index 36de7281d2..18bb47f64d 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -159,7 +159,7 @@ static const struct plugin_api rockbox_api = {
159 lcd_icon, 159 lcd_icon,
160 lcd_double_height, 160 lcd_double_height,
161#else 161#else
162 &lcd_framebuffer[0][0], 162 &lcd_static_framebuffer[0][0],
163 lcd_update_rect, 163 lcd_update_rect,
164 lcd_set_drawmode, 164 lcd_set_drawmode,
165 lcd_get_drawmode, 165 lcd_get_drawmode,
@@ -264,7 +264,7 @@ static const struct plugin_api rockbox_api = {
264 lcd_remote_putsxy, 264 lcd_remote_putsxy,
265 lcd_remote_puts_style, 265 lcd_remote_puts_style,
266 lcd_remote_puts_scroll_style, 266 lcd_remote_puts_scroll_style,
267 &lcd_remote_framebuffer[0][0], 267 &lcd_remote_static_framebuffer[0][0],
268 lcd_remote_update, 268 lcd_remote_update,
269 lcd_remote_update_rect, 269 lcd_remote_update_rect,
270 270
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}