summaryrefslogtreecommitdiff
path: root/firmware/drivers
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 /firmware/drivers
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
Diffstat (limited to 'firmware/drivers')
-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
10 files changed, 84 insertions, 78 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"