summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2022-03-21 18:54:52 -0400
committerWilliam Wilgus <wilgus.william@gmail.com>2022-03-21 23:53:48 -0400
commitcfeeb7889d5346e2abaf9b198375df62c58b098f (patch)
treef9956033372abe7d8bffa4e04bef0662dfb0da02 /firmware
parent60e5786b481a26ca7c0c810d812bf5664a58cb44 (diff)
downloadrockbox-cfeeb7889d5346e2abaf9b198375df62c58b098f.tar.gz
rockbox-cfeeb7889d5346e2abaf9b198375df62c58b098f.zip
Lcd save function pointer to frame buffer get_address_fn before loops
Calling multiple levels of indirection in a loop slows things down Really these need to be rewritten to take a start and end address like most of the rest of the codebase But this is safer without having test hardware in hand Change-Id: Idae7b92ee779d020ed7fcc9334e2d5a9c710e64d
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/lcd-color-common.c18
-rw-r--r--firmware/export/lcd.h4
-rw-r--r--firmware/target/arm/as3525/lcd-ssd1303.c3
-rw-r--r--firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c3
-rw-r--r--firmware/target/arm/imx233/creative-zen/lcd-zenmozaic.c4
-rw-r--r--firmware/target/arm/imx233/creative-zen/lcd-zenv.c3
-rw-r--r--firmware/target/arm/imx233/creative-zen/lcd-zenxfistyle.c3
-rw-r--r--firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c3
-rw-r--r--firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c3
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c3
-rw-r--r--firmware/target/arm/imx233/sony-nwz/lcd-nwze360.c3
-rw-r--r--firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c3
-rw-r--r--firmware/target/arm/ipod/lcd-gray.c9
-rw-r--r--firmware/target/arm/lcd-ssd1815.c6
-rw-r--r--firmware/target/arm/olympus/mrobe-100/lcd-mr100.c6
-rw-r--r--firmware/target/arm/rk27xx/lcdif-rk27xx.c3
-rw-r--r--firmware/target/arm/s5l8700/yps3/lcd-yps3.c11
-rw-r--r--firmware/target/arm/samsung/yh920/lcd-yh920.c3
-rw-r--r--firmware/target/coldfire/iaudio/m3/lcd-m3.c6
-rw-r--r--firmware/target/coldfire/iaudio/m5/lcd-m5.c6
-rw-r--r--firmware/target/coldfire/iriver/h100/lcd-h100.c6
-rw-r--r--firmware/target/coldfire/mpio/hd300/lcd-hd300.c3
-rw-r--r--firmware/target/mips/ingenic_jz47xx/xduoo_x3/lcd-xduoo_x3.c6
23 files changed, 78 insertions, 40 deletions
diff --git a/firmware/drivers/lcd-color-common.c b/firmware/drivers/lcd-color-common.c
index 935f4e59dd..20d8c65e21 100644
--- a/firmware/drivers/lcd-color-common.c
+++ b/firmware/drivers/lcd-color-common.c
@@ -214,6 +214,7 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
214 int d, dinc1, dinc2; 214 int d, dinc1, dinc2;
215 int x, xinc1, xinc2; 215 int x, xinc1, xinc2;
216 int y, yinc1, yinc2; 216 int y, yinc1, yinc2;
217 int x_vp, y_vp, w_vp, h_vp;
217 lcd_fastpixelfunc_type *pfunc = lcd_fastpixelfuncs[lcd_current_viewport->drawmode]; 218 lcd_fastpixelfunc_type *pfunc = lcd_fastpixelfuncs[lcd_current_viewport->drawmode];
218 219
219 deltay = abs(y2 - y1); 220 deltay = abs(y2 - y1);
@@ -268,16 +269,23 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
268 x = x1; 269 x = x1;
269 y = y1; 270 y = y1;
270 271
272 void *(*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
273 x_vp = lcd_current_viewport->x;
274 y_vp = lcd_current_viewport->y;
275 w_vp = lcd_current_viewport->width;
276 h_vp = lcd_current_viewport->height;
277
271 for (i = 0; i < numpixels; i++) 278 for (i = 0; i < numpixels; i++)
272 { 279 {
273 if ( ((unsigned)x < (unsigned)lcd_current_viewport->width) 280 if ((x >= 0 && y >= 0)
274 && ((unsigned)y < (unsigned)lcd_current_viewport->height) 281 && (x < w_vp)
282 && (y < h_vp)
275#if defined(HAVE_VIEWPORT_CLIP) 283#if defined(HAVE_VIEWPORT_CLIP)
276 && ((unsigned)x < (unsigned)LCD_WIDTH) 284 && (x < LCD_WIDTH)
277 && ((unsigned)y < (unsigned)LCD_HEIGHT) 285 && (y < LCD_HEIGHT)
278#endif 286#endif
279 ) 287 )
280 pfunc(FBADDR(x + lcd_current_viewport->x, y + lcd_current_viewport->y)); 288 pfunc(fbaddr( x + x_vp, y + y_vp));
281 289
282 if (d < 0) 290 if (d < 0)
283 { 291 {
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index ffaf1a63d2..13165129b1 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -507,7 +507,9 @@ typedef void lcd_blockfunc_type(fb_data *address, unsigned mask, unsigned bits);
507 507
508extern struct viewport* lcd_current_viewport; 508extern struct viewport* lcd_current_viewport;
509 509
510#define FBADDR(x,y) ((fb_data*) lcd_current_viewport->buffer->get_address_fn(x, y)) 510#define FB_CURRENTVP_BUFFER (lcd_current_viewport->buffer)
511#define FBADDRBUF(buffer,x,y) ((fb_data*) buffer->get_address_fn(x,y))
512#define FBADDR(x,y) (FBADDRBUF(lcd_current_viewport->buffer,x,y))
511 513
512#define FRAMEBUFFER_SIZE (sizeof(fb_data)*LCD_FBWIDTH*LCD_FBHEIGHT) 514#define FRAMEBUFFER_SIZE (sizeof(fb_data)*LCD_FBWIDTH*LCD_FBHEIGHT)
513 515
diff --git a/firmware/target/arm/as3525/lcd-ssd1303.c b/firmware/target/arm/as3525/lcd-ssd1303.c
index 2aa0b844c5..186fdcacbe 100644
--- a/firmware/target/arm/as3525/lcd-ssd1303.c
+++ b/firmware/target/arm/as3525/lcd-ssd1303.c
@@ -310,6 +310,7 @@ static void internal_update_rect(int x, int y, int width, int height)
310 const int column_high = get_column_high_byte(x); 310 const int column_high = get_column_high_byte(x);
311 const int column_low = get_column_low_byte(x); 311 const int column_low = get_column_low_byte(x);
312 312
313 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
313 /* Copy specified rectange bitmap to hardware */ 314 /* Copy specified rectange bitmap to hardware */
314 for (; y <= height; y++) 315 for (; y <= height; y++)
315 { 316 {
@@ -320,7 +321,7 @@ static void internal_update_rect(int x, int y, int width, int height)
320 (column_low) 321 (column_low)
321 ); 322 );
322 323
323 lcd_write_data (FBADDR(x,y), width); 324 lcd_write_data (fbaddr(x,y), width);
324 } 325 }
325 lcd_write_command (LCD_NOP); /* return to command mode */ 326 lcd_write_command (LCD_NOP); /* return to command mode */
326 327
diff --git a/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c b/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c
index 03ed1de5d5..48594a2ac9 100644
--- a/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c
+++ b/firmware/target/arm/as3525/sansa-clipzip/lcd-clipzip.c
@@ -440,9 +440,10 @@ void lcd_update_rect(int x, int y, int width, int height)
440 /* setup GRAM write window */ 440 /* setup GRAM write window */
441 lcd_setup_rect(x, x_end - 1, y, y_end - 1); 441 lcd_setup_rect(x, x_end - 1, y, y_end - 1);
442 442
443 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
443 /* write to GRAM */ 444 /* write to GRAM */
444 for (row = y; row < y_end; row++) { 445 for (row = y; row < y_end; row++) {
445 lcd_write_data(FBADDR(x,row), width); 446 lcd_write_data(fbaddr(x,row), width);
446 } 447 }
447} 448}
448 449
diff --git a/firmware/target/arm/imx233/creative-zen/lcd-zenmozaic.c b/firmware/target/arm/imx233/creative-zen/lcd-zenmozaic.c
index c1bc379a49..ab4466300b 100644
--- a/firmware/target/arm/imx233/creative-zen/lcd-zenmozaic.c
+++ b/firmware/target/arm/imx233/creative-zen/lcd-zenmozaic.c
@@ -149,6 +149,8 @@ void lcd_update_rect(int x, int y, int w, int h)
149 lcd_write_reg(0x17, y | (y + h - 1) << 8); 149 lcd_write_reg(0x17, y | (y + h - 1) << 8);
150 lcd_write_reg(0x21, y * LCD_WIDTH + x); 150 lcd_write_reg(0x21, y * LCD_WIDTH + x);
151 lcd_write_reg(0x22, 0); 151 lcd_write_reg(0x22, 0);
152
153 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
152 for(int yy = y; yy < y + h; yy++) 154 for(int yy = y; yy < y + h; yy++)
153 imx233_lcdif_pio_send(true, 2 * w, FBADDR(x, yy)); 155 imx233_lcdif_pio_send(true, 2 * w, fbaddr(x,yy));
154} 156}
diff --git a/firmware/target/arm/imx233/creative-zen/lcd-zenv.c b/firmware/target/arm/imx233/creative-zen/lcd-zenv.c
index 06b0f158f3..75d2775814 100644
--- a/firmware/target/arm/imx233/creative-zen/lcd-zenv.c
+++ b/firmware/target/arm/imx233/creative-zen/lcd-zenv.c
@@ -172,8 +172,9 @@ void lcd_update_rect(int x, int y, int w, int h)
172 lcd_send(false, 0x75); lcd_send(true, y); lcd_send(true, y + h - 1); 172 lcd_send(false, 0x75); lcd_send(true, y); lcd_send(true, y + h - 1);
173 lcd_send(false, 0x5c); 173 lcd_send(false, 0x5c);
174 imx233_lcdif_set_word_length(16); 174 imx233_lcdif_set_word_length(16);
175 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
175 for(int yy = y; yy < y + h; yy++) 176 for(int yy = y; yy < y + h; yy++)
176 imx233_lcdif_pio_send(true, w, FBADDR(x, yy)); 177 imx233_lcdif_pio_send(true, w, fbaddr(x,yy));
177} 178}
178 179
179#ifndef BOOTLOADER 180#ifndef BOOTLOADER
diff --git a/firmware/target/arm/imx233/creative-zen/lcd-zenxfistyle.c b/firmware/target/arm/imx233/creative-zen/lcd-zenxfistyle.c
index ce0bcc3885..825b0072a3 100644
--- a/firmware/target/arm/imx233/creative-zen/lcd-zenxfistyle.c
+++ b/firmware/target/arm/imx233/creative-zen/lcd-zenxfistyle.c
@@ -282,8 +282,9 @@ void lcd_update_rect(int x, int y, int w, int h)
282 } 282 }
283 else 283 else
284 { 284 {
285 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
285 for(int i = 0; i < h; i++) 286 for(int i = 0; i < h; i++)
286 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data)); 287 memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
287 } 288 }
288 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 289 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
289 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 290 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
diff --git a/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c b/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c
index 890ff0b586..d0084900e7 100644
--- a/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c
+++ b/firmware/target/arm/imx233/creative-zenxfi2/lcd-zenxfi2.c
@@ -241,8 +241,9 @@ void lcd_update_rect(int x, int y, int w, int h)
241 } 241 }
242 else 242 else
243 { 243 {
244 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
244 for(int i = 0; i < h; i++) 245 for(int i = 0; i < h; i++)
245 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data)); 246 memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
246 } 247 }
247 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 248 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
248 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 249 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
diff --git a/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c b/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c
index 59496f2d24..d5f25a523c 100644
--- a/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c
+++ b/firmware/target/arm/imx233/creative-zenxfi3/lcd-zenxfi3.c
@@ -188,8 +188,9 @@ void lcd_update_rect(int x, int y, int w, int h)
188 } 188 }
189 else 189 else
190 { 190 {
191 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
191 for(int i = 0; i < h; i++) 192 for(int i = 0; i < h; i++)
192 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data)); 193 memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
193 } 194 }
194 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 195 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
195 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 196 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
index 92864c9ed7..ceb7b4e090 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
@@ -637,8 +637,9 @@ void lcd_update_rect(int x, int y, int w, int h)
637 } 637 }
638 else 638 else
639 { 639 {
640 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
640 for(int i = 0; i < h; i++) 641 for(int i = 0; i < h; i++)
641 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data)); 642 memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
642 } 643 }
643 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 644 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
644 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 645 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
diff --git a/firmware/target/arm/imx233/sony-nwz/lcd-nwze360.c b/firmware/target/arm/imx233/sony-nwz/lcd-nwze360.c
index cfcf85bfc0..8f49bfa3eb 100644
--- a/firmware/target/arm/imx233/sony-nwz/lcd-nwze360.c
+++ b/firmware/target/arm/imx233/sony-nwz/lcd-nwze360.c
@@ -228,8 +228,9 @@ void lcd_update_rect(int x, int y, int w, int h)
228 } 228 }
229 else 229 else
230 { 230 {
231 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
231 for(int i = 0; i < h; i++) 232 for(int i = 0; i < h; i++)
232 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data)); 233 memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
233 } 234 }
234 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 235 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
235 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 236 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
diff --git a/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c b/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c
index 999f4ee525..862522da15 100644
--- a/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c
+++ b/firmware/target/arm/imx233/sony-nwz/lcd-nwze370.c
@@ -189,8 +189,9 @@ void lcd_update_rect(int x, int y, int w, int h)
189 } 189 }
190 else 190 else
191 { 191 {
192 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
192 for(int i = 0; i < h; i++) 193 for(int i = 0; i < h; i++)
193 memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data)); 194 memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
194 } 195 }
195 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode 196 /* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
196 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count 197 * (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
diff --git a/firmware/target/arm/ipod/lcd-gray.c b/firmware/target/arm/ipod/lcd-gray.c
index d8695cdb10..883897b997 100644
--- a/firmware/target/arm/ipod/lcd-gray.c
+++ b/firmware/target/arm/ipod/lcd-gray.c
@@ -333,17 +333,18 @@ void lcd_update_rect(int x, int y, int width, int height)
333 x >>= 3; 333 x >>= 3;
334 width = xmax - x + 1; 334 width = xmax - x + 1;
335 335
336 for (; y <= ymax; y++) 336 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
337 for (; y <= ymax; y++)
337 { 338 {
338 lcd_cmd_and_data(R_RAM_ADDR_SET, (y << 5) + addr_offset - x); 339 lcd_cmd_and_data(R_RAM_ADDR_SET, (y << 5) + addr_offset - x);
339 lcd_prepare_cmd(R_RAM_DATA); 340 lcd_prepare_cmd(R_RAM_DATA);
340 341 fb_data *data = fbaddr(2*x,y);
341#if defined(IPOD_MINI) || defined(IPOD_MINI2G) 342#if defined(IPOD_MINI) || defined(IPOD_MINI2G)
342 if (pix_offset == -2) 343 if (pix_offset == -2)
343 lcd_write_data_shifted(FBADDR(2*x, y), width); 344 lcd_write_data_shifted(data, width);
344 else 345 else
345#endif 346#endif
346 lcd_write_data(FBADDR(2*x, y), width); 347 lcd_write_data(data, width);
347 } 348 }
348} 349}
349 350
diff --git a/firmware/target/arm/lcd-ssd1815.c b/firmware/target/arm/lcd-ssd1815.c
index 028362f91c..0af20cd34f 100644
--- a/firmware/target/arm/lcd-ssd1815.c
+++ b/firmware/target/arm/lcd-ssd1815.c
@@ -221,6 +221,7 @@ void lcd_update(void)
221{ 221{
222 int y; 222 int y;
223 223
224 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
224 /* Copy display bitmap to hardware */ 225 /* Copy display bitmap to hardware */
225 for (y = 0; y < LCD_FBHEIGHT; y++) 226 for (y = 0; y < LCD_FBHEIGHT; y++)
226 { 227 {
@@ -228,7 +229,7 @@ void lcd_update(void)
228 lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf)); 229 lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf));
229 lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf)); 230 lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf));
230 231
231 lcd_write_data (FBADDR(0, y), LCD_WIDTH); 232 lcd_write_data (fbaddr(0,y), LCD_WIDTH);
232 } 233 }
233} 234}
234 235
@@ -249,6 +250,7 @@ void lcd_update_rect(int x, int y, int width, int height)
249 if(ymax >= LCD_FBHEIGHT) 250 if(ymax >= LCD_FBHEIGHT)
250 ymax = LCD_FBHEIGHT-1; 251 ymax = LCD_FBHEIGHT-1;
251 252
253 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
252 /* Copy specified rectange bitmap to hardware */ 254 /* Copy specified rectange bitmap to hardware */
253 for (; y <= ymax; y++) 255 for (; y <= ymax; y++)
254 { 256 {
@@ -256,6 +258,6 @@ void lcd_update_rect(int x, int y, int width, int height)
256 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf)); 258 lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf));
257 lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf)); 259 lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf));
258 260
259 lcd_write_data (FBADDR(x,y), width); 261 lcd_write_data (fbaddr(x,y), width);
260 } 262 }
261} 263}
diff --git a/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c b/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c
index d336ad7419..c10b4ca8f6 100644
--- a/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c
+++ b/firmware/target/arm/olympus/mrobe-100/lcd-mr100.c
@@ -232,6 +232,7 @@ void lcd_update(void)
232 cmd1 = LCD_CNTL_HIGHCOL | (((xoffset) >> 4) & 0xf); 232 cmd1 = LCD_CNTL_HIGHCOL | (((xoffset) >> 4) & 0xf);
233 cmd2 = LCD_CNTL_LOWCOL | ((xoffset) & 0xf); 233 cmd2 = LCD_CNTL_LOWCOL | ((xoffset) & 0xf);
234 234
235 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
235 /* Copy display bitmap to hardware */ 236 /* Copy display bitmap to hardware */
236 for (y = 0; y < LCD_FBHEIGHT; y++) 237 for (y = 0; y < LCD_FBHEIGHT; y++)
237 { 238 {
@@ -239,7 +240,7 @@ void lcd_update(void)
239 lcd_write_command(cmd1); 240 lcd_write_command(cmd1);
240 lcd_write_command(cmd2); 241 lcd_write_command(cmd2);
241 242
242 lcd_write_data (FBADDR(0, y), LCD_WIDTH); 243 lcd_write_data (fbaddr(0,y), LCD_WIDTH);
243 } 244 }
244} 245}
245 246
@@ -264,6 +265,7 @@ void lcd_update_rect(int x, int y, int width, int height)
264 cmd1 = LCD_CNTL_HIGHCOL | (((x + xoffset) >> 4) & 0xf); 265 cmd1 = LCD_CNTL_HIGHCOL | (((x + xoffset) >> 4) & 0xf);
265 cmd2 = LCD_CNTL_LOWCOL | ((x + xoffset) & 0xf); 266 cmd2 = LCD_CNTL_LOWCOL | ((x + xoffset) & 0xf);
266 267
268 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
267 /* Copy specified rectange bitmap to hardware */ 269 /* Copy specified rectange bitmap to hardware */
268 for (; y <= ymax; y++) 270 for (; y <= ymax; y++)
269 { 271 {
@@ -271,6 +273,6 @@ void lcd_update_rect(int x, int y, int width, int height)
271 lcd_write_command(cmd1); 273 lcd_write_command(cmd1);
272 lcd_write_command(cmd2); 274 lcd_write_command(cmd2);
273 275
274 lcd_write_data (FBADDR(x,y), width); 276 lcd_write_data (fbaddr(x,y), width);
275 } 277 }
276} 278}
diff --git a/firmware/target/arm/rk27xx/lcdif-rk27xx.c b/firmware/target/arm/rk27xx/lcdif-rk27xx.c
index e6af0d978a..618b476480 100644
--- a/firmware/target/arm/rk27xx/lcdif-rk27xx.c
+++ b/firmware/target/arm/rk27xx/lcdif-rk27xx.c
@@ -198,9 +198,10 @@ static void create_llp(int x, int y, int width, int height)
198 198
199 width = width>>1; 199 width = width>>1;
200 200
201 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
201 /* build LLPs */ 202 /* build LLPs */
202 for (i=0; i<height; i++) 203 for (i=0; i<height; i++)
203 llp_setup((void *)FBADDR(x,y+i), 204 llp_setup((void *)fbaddr(x,y+i),
204 (void*)(LCD_BUFF+((i%4)*4*width)), 205 (void*)(LCD_BUFF+((i%4)*4*width)),
205 &(scr_llp[i]), 206 &(scr_llp[i]),
206 width); 207 width);
diff --git a/firmware/target/arm/s5l8700/yps3/lcd-yps3.c b/firmware/target/arm/s5l8700/yps3/lcd-yps3.c
index a9830bca57..eec11e34b8 100644
--- a/firmware/target/arm/s5l8700/yps3/lcd-yps3.c
+++ b/firmware/target/arm/s5l8700/yps3/lcd-yps3.c
@@ -299,14 +299,15 @@ void lcd_update_rect(int x, int y, int width, int height)
299{ 299{
300 fb_data* p; 300 fb_data* p;
301 int h, w; 301 int h, w;
302 302
303 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
303 if (lcd_type == 1) { 304 if (lcd_type == 1) {
304 /* TODO implement and test */ 305 /* TODO implement and test */
305 lcd_set_window1(x, y, width, height); 306 lcd_set_window1(x, y, width, height);
306 lcd_set_position1(x, y); 307 lcd_set_position1(x, y);
307 308
308 for (h = 0; h < height; h++) { 309 for (h = 0; h < height; h++) {
309 p = FBADDR(0,y); 310 p = fbaddr(0,y);
310 for (w = 0; w < LCD_WIDTH; w++) { 311 for (w = 0; w < LCD_WIDTH; w++) {
311 while (LCD_STATUS & 0x10); 312 while (LCD_STATUS & 0x10);
312 LCD_WDATA = *p++; 313 LCD_WDATA = *p++;
@@ -317,9 +318,9 @@ void lcd_update_rect(int x, int y, int width, int height)
317 else { 318 else {
318 lcd_set_window2(x, y, width, height); 319 lcd_set_window2(x, y, width, height);
319 lcd_set_position2(x, y); 320 lcd_set_position2(x, y);
320 321
321 for (h = 0; h < height; h++) { 322 for (h = 0; h < height; h++) {
322 p = FBADDR(x,y); 323 p = fbaddr(x,y);
323 for (w = 0; w < width; w++) { 324 for (w = 0; w < width; w++) {
324 while (LCD_STATUS & 0x10); 325 while (LCD_STATUS & 0x10);
325 LCD_WDATA = *p++; 326 LCD_WDATA = *p++;
diff --git a/firmware/target/arm/samsung/yh920/lcd-yh920.c b/firmware/target/arm/samsung/yh920/lcd-yh920.c
index 06aa3d718d..6a579f382a 100644
--- a/firmware/target/arm/samsung/yh920/lcd-yh920.c
+++ b/firmware/target/arm/samsung/yh920/lcd-yh920.c
@@ -253,13 +253,14 @@ void lcd_update_rect(int x, int y, int width, int height)
253 if(ymax >= LCD_FBHEIGHT) 253 if(ymax >= LCD_FBHEIGHT)
254 ymax = LCD_FBHEIGHT-1; 254 ymax = LCD_FBHEIGHT-1;
255 255
256 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
256 /* Copy specified rectange bitmap to hardware */ 257 /* Copy specified rectange bitmap to hardware */
257 for (; y <= ymax; y++) 258 for (; y <= ymax; y++)
258 { 259 {
259 lcd_write_reg(LCD_CNTL_PAGE, y); 260 lcd_write_reg(LCD_CNTL_PAGE, y);
260 lcd_write_reg(LCD_CNTL_COLUMN, x); 261 lcd_write_reg(LCD_CNTL_COLUMN, x);
261 262
262 addr = FBADDR(x,y); 263 addr = fbaddr(x,y);
263 264
264 lcd_send_cmd(LCD_CNTL_DATA_WRITE); 265 lcd_send_cmd(LCD_CNTL_DATA_WRITE);
265 lcd_write_data(addr, width); 266 lcd_write_data(addr, width);
diff --git a/firmware/target/coldfire/iaudio/m3/lcd-m3.c b/firmware/target/coldfire/iaudio/m3/lcd-m3.c
index 3da608a0ef..5e84cbacd3 100644
--- a/firmware/target/coldfire/iaudio/m3/lcd-m3.c
+++ b/firmware/target/coldfire/iaudio/m3/lcd-m3.c
@@ -258,6 +258,7 @@ void lcd_update(void)
258 int y; 258 int y;
259 if (initialized) 259 if (initialized)
260 { 260 {
261 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
261 for(y = 0;y < LCD_FBHEIGHT;y++) 262 for(y = 0;y < LCD_FBHEIGHT;y++)
262 { 263 {
263 /* Copy display bitmap to hardware. 264 /* Copy display bitmap to hardware.
@@ -266,7 +267,7 @@ void lcd_update(void)
266 have to update one page at a time. */ 267 have to update one page at a time. */
267 lcd_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y)); 268 lcd_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y));
268 lcd_write_command_e(LCD_SET_COLUMN | 0, 0); 269 lcd_write_command_e(LCD_SET_COLUMN | 0, 0);
269 lcd_write_data(FBADDR(0, y), LCD_WIDTH); 270 lcd_write_data(fbaddr(0,y), LCD_WIDTH);
270 } 271 }
271 } 272 }
272} 273}
@@ -289,6 +290,7 @@ void lcd_update_rect(int x, int y, int width, int height)
289 if(ymax >= LCD_FBHEIGHT) 290 if(ymax >= LCD_FBHEIGHT)
290 ymax = LCD_FBHEIGHT-1; 291 ymax = LCD_FBHEIGHT-1;
291 292
293 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
292 /* Copy specified rectangle bitmap to hardware 294 /* Copy specified rectangle bitmap to hardware
293 COM48-COM63 are not connected, so we need to skip those */ 295 COM48-COM63 are not connected, so we need to skip those */
294 for (; y <= ymax; y++) 296 for (; y <= ymax; y++)
@@ -296,7 +298,7 @@ void lcd_update_rect(int x, int y, int width, int height)
296 lcd_write_command(LCD_SET_PAGE | ((y > 5 ? y + 2 : y) & 0xf)); 298 lcd_write_command(LCD_SET_PAGE | ((y > 5 ? y + 2 : y) & 0xf));
297 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf); 299 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf);
298 300
299 lcd_write_data(FBADDR(x,y), width); 301 lcd_write_data(fbaddr(x,y), width);
300 } 302 }
301 } 303 }
302} 304}
diff --git a/firmware/target/coldfire/iaudio/m5/lcd-m5.c b/firmware/target/coldfire/iaudio/m5/lcd-m5.c
index 8f022adf96..35fd173f18 100644
--- a/firmware/target/coldfire/iaudio/m5/lcd-m5.c
+++ b/firmware/target/coldfire/iaudio/m5/lcd-m5.c
@@ -200,6 +200,7 @@ void lcd_update(void)
200{ 200{
201 int y; 201 int y;
202 202
203 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
203 /* Copy display bitmap to hardware */ 204 /* Copy display bitmap to hardware */
204 for (y = 0; y < LCD_FBHEIGHT; y++) 205 for (y = 0; y < LCD_FBHEIGHT; y++)
205 { 206 {
@@ -207,7 +208,7 @@ void lcd_update(void)
207 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1); 208 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1);
208 209
209 lcd_write_command(LCD_CNTL_DATA_WRITE); 210 lcd_write_command(LCD_CNTL_DATA_WRITE);
210 lcd_write_data (FBADDR(0, y), LCD_WIDTH); 211 lcd_write_data (fbaddr(0,y), LCD_WIDTH);
211 } 212 }
212} 213}
213 214
@@ -228,6 +229,7 @@ void lcd_update_rect(int x, int y, int width, int height)
228 if(ymax >= LCD_FBHEIGHT) 229 if(ymax >= LCD_FBHEIGHT)
229 ymax = LCD_FBHEIGHT-1; 230 ymax = LCD_FBHEIGHT-1;
230 231
232 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
231 /* Copy specified rectange bitmap to hardware */ 233 /* Copy specified rectange bitmap to hardware */
232 for (; y <= ymax; y++) 234 for (; y <= ymax; y++)
233 { 235 {
@@ -235,6 +237,6 @@ void lcd_update_rect(int x, int y, int width, int height)
235 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); 237 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1);
236 238
237 lcd_write_command(LCD_CNTL_DATA_WRITE); 239 lcd_write_command(LCD_CNTL_DATA_WRITE);
238 lcd_write_data (FBADDR(x,y), width); 240 lcd_write_data (fbaddr(x,y), width);
239 } 241 }
240} 242}
diff --git a/firmware/target/coldfire/iriver/h100/lcd-h100.c b/firmware/target/coldfire/iriver/h100/lcd-h100.c
index b13751b9eb..b6eea1dfa3 100644
--- a/firmware/target/coldfire/iriver/h100/lcd-h100.c
+++ b/firmware/target/coldfire/iriver/h100/lcd-h100.c
@@ -209,6 +209,7 @@ void lcd_update(void)
209{ 209{
210 int y; 210 int y;
211 211
212 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
212 /* Copy display bitmap to hardware */ 213 /* Copy display bitmap to hardware */
213 for (y = 0; y < LCD_FBHEIGHT; y++) 214 for (y = 0; y < LCD_FBHEIGHT; y++)
214 { 215 {
@@ -216,7 +217,7 @@ void lcd_update(void)
216 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1); 217 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1);
217 218
218 lcd_write_command(LCD_CNTL_DATA_WRITE); 219 lcd_write_command(LCD_CNTL_DATA_WRITE);
219 lcd_write_data (FBADDR(0, y), LCD_WIDTH); 220 lcd_write_data (fbaddr(0,y), LCD_WIDTH);
220 } 221 }
221} 222}
222 223
@@ -237,6 +238,7 @@ void lcd_update_rect(int x, int y, int width, int height)
237 if(ymax >= LCD_FBHEIGHT) 238 if(ymax >= LCD_FBHEIGHT)
238 ymax = LCD_FBHEIGHT-1; 239 ymax = LCD_FBHEIGHT-1;
239 240
241 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
240 /* Copy specified rectange bitmap to hardware */ 242 /* Copy specified rectange bitmap to hardware */
241 for (; y <= ymax; y++) 243 for (; y <= ymax; y++)
242 { 244 {
@@ -244,6 +246,6 @@ void lcd_update_rect(int x, int y, int width, int height)
244 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); 246 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1);
245 247
246 lcd_write_command(LCD_CNTL_DATA_WRITE); 248 lcd_write_command(LCD_CNTL_DATA_WRITE);
247 lcd_write_data (FBADDR(x,y), width); 249 lcd_write_data (fbaddr(x,y), width);
248 } 250 }
249} 251}
diff --git a/firmware/target/coldfire/mpio/hd300/lcd-hd300.c b/firmware/target/coldfire/mpio/hd300/lcd-hd300.c
index 509ed4cd53..9cff9cd712 100644
--- a/firmware/target/coldfire/mpio/hd300/lcd-hd300.c
+++ b/firmware/target/coldfire/mpio/hd300/lcd-hd300.c
@@ -231,6 +231,7 @@ void lcd_update_rect(int x, int y, int width, int height)
231 if(ymax >= LCD_FBHEIGHT) 231 if(ymax >= LCD_FBHEIGHT)
232 ymax = LCD_FBHEIGHT-1; 232 ymax = LCD_FBHEIGHT-1;
233 233
234 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
234 /* Copy specified rectange bitmap to hardware */ 235 /* Copy specified rectange bitmap to hardware */
235 for (; y <= ymax; y++) 236 for (; y <= ymax; y++)
236 { 237 {
@@ -238,6 +239,6 @@ void lcd_update_rect(int x, int y, int width, int height)
238 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); 239 lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1);
239 240
240 lcd_write_command(LCD_CNTL_DATA_WRITE); 241 lcd_write_command(LCD_CNTL_DATA_WRITE);
241 lcd_write_data (FBADDR(x,y), width); 242 lcd_write_data (fbaddr(x,y), width);
242 } 243 }
243} 244}
diff --git a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/lcd-xduoo_x3.c b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/lcd-xduoo_x3.c
index 47b646be34..2c1c3a226e 100644
--- a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/lcd-xduoo_x3.c
+++ b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/lcd-xduoo_x3.c
@@ -532,6 +532,7 @@ void lcd_update(void)
532 const int column_high = get_column_high_byte(0); 532 const int column_high = get_column_high_byte(0);
533 const int column_low = get_column_low_byte(0); 533 const int column_low = get_column_low_byte(0);
534 534
535 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
535 /* Copy display bitmap to hardware */ 536 /* Copy display bitmap to hardware */
536 for (y = 0; y < LCD_FBHEIGHT; y++) 537 for (y = 0; y < LCD_FBHEIGHT; y++)
537 { 538 {
@@ -542,7 +543,7 @@ void lcd_update(void)
542 (column_low) 543 (column_low)
543 ); 544 );
544 545
545 lcd_write_data (FBADDR(0, y), LCD_WIDTH); 546 lcd_write_data (fbaddr(0,y), LCD_WIDTH);
546 } 547 }
547} 548}
548 549
@@ -586,6 +587,7 @@ void lcd_update_rect(int x, int y, int width, int height)
586 ymax = (y + height-1) >> 3; 587 ymax = (y + height-1) >> 3;
587 y >>= 3; 588 y >>= 3;
588 589
590 void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
589 /* Copy specified rectange bitmap to hardware */ 591 /* Copy specified rectange bitmap to hardware */
590 for (; y <= ymax; y++) 592 for (; y <= ymax; y++)
591 { 593 {
@@ -596,6 +598,6 @@ void lcd_update_rect(int x, int y, int width, int height)
596 (column_low) 598 (column_low)
597 ); 599 );
598 600
599 lcd_write_data (FBADDR(x,y), width); 601 lcd_write_data (fbaddr(x,y), width);
600 } 602 }
601} 603}