summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
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"