diff options
author | William Wilgus <me.theuser@yahoo.com> | 2017-11-30 20:59:16 +0100 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2018-05-25 22:48:01 +0200 |
commit | 1f63604e2ce522f531ae717b9f587cd58791b85f (patch) | |
tree | 4305934558afc4da5def59cd3506e16362583707 | |
parent | 038a10220e122807a23887fd4363fc2588e98712 (diff) | |
download | rockbox-1f63604e2ce522f531ae717b9f587cd58791b85f.tar.gz rockbox-1f63604e2ce522f531ae717b9f587cd58791b85f.zip |
Fuze PLUS Fix lcd_update_rect()
Lcd_update rect was hanging during horizontal screen update x = 238 and width = 2
which was within the bounds of the screen, this seems to be a weird corner case
but more testing needs done.
Update_rect now properly bounded between 0 - screen w/h
--Cleaned up code
Pixels in x are now multiples of 4.
Datasheet states:
-------------------------------------------------------------------------------------------
WORD_LENGTH=0 implies the input frame buffer is RGB 16 bits per pixel.
DATA_FORMAT_16_BIT field indicates if the pixels are in RGB 555 or RGB 565 format.
Limitations:
— BYTE_PACKING_FORMAT [3:0] should be 0x3 or 0xC if there is only one pixel per word.
— If there are two pixels per word, BYTE_PACKING_FORMAT [3:0] should be 0xF and
H_COUNT will be restricted to be a multiple of 2 pixels.
and
WORD_LENGTH=3 indicates that the input frame-buffer is RGB 24 bits per pixel (RGB 888). If
BYTE_PACKING_FORMAT [3:0] is 0x7, it indicates that there is only one pixel per 32-bit word
and there is no restriction on H_COUNT.
Limitations:
— If BYTE_PACKING_FORMAT [3:0] is 0xF, it indicates that the pixels are packed, i.e. there
are 4 pixels in 3 words or 12 bytes. In that case, H_COUNT must be a multiple of 4 pixels.
-------------------------------------------------------------------------------------------
We are using 16 bits per pixel and byte_packing = 0xF but device crashes with multiple of 2 pixels
Behaviour can be verified with plugin - oscilloscope, Horizontal mode device hangs as indicator
reaches right of screen
Change-Id: I1445f5334f4e7fe59304c65c76b47d0daa0614b2
-rw-r--r-- | firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c index d8ad5a8df3..224ff3d0fc 100644 --- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c +++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c | |||
@@ -566,11 +566,26 @@ void lcd_update_rect(int x, int y, int w, int h) | |||
566 | if(!lcd_on) | 566 | if(!lcd_on) |
567 | return; | 567 | return; |
568 | #endif | 568 | #endif |
569 | /* make sure the rectangle is included in the screen */ | 569 | /* make sure the rectangle is bounded in the screen */ |
570 | x = MIN(x, LCD_WIDTH); | 570 | if (w > LCD_WIDTH - x)/* Clip right */ |
571 | y = MIN(y, LCD_HEIGHT); | 571 | w = LCD_WIDTH - x; |
572 | w = MIN(w, LCD_WIDTH - x); | 572 | if (x < 0)/* Clip left */ |
573 | h = MIN(h, LCD_HEIGHT - y); | 573 | { |
574 | w += x; | ||
575 | x = 0; | ||
576 | } | ||
577 | if (w <= 0) | ||
578 | return; /* nothing left to do */ | ||
579 | |||
580 | if (h > LCD_HEIGHT - y) /* Clip bottom */ | ||
581 | h = LCD_HEIGHT - y; | ||
582 | if (y < 0) /* Clip top */ | ||
583 | { | ||
584 | h += y; | ||
585 | y = 0; | ||
586 | } | ||
587 | if (h <= 0) | ||
588 | return; /* nothing left to do */ | ||
574 | 589 | ||
575 | imx233_lcdif_wait_ready(); | 590 | imx233_lcdif_wait_ready(); |
576 | lcd_write_reg(0x50, x); | 591 | lcd_write_reg(0x50, x); |
@@ -612,7 +627,7 @@ void lcd_update_rect(int x, int y, int w, int h) | |||
612 | * of w or h is odd, we will send a copy of the first pixels as dummy writes. We will | 627 | * of w or h is odd, we will send a copy of the first pixels as dummy writes. We will |
613 | * send at most 3 bytes. We then send (w * h + 3) / 4 x 4 bytes. | 628 | * send at most 3 bytes. We then send (w * h + 3) / 4 x 4 bytes. |
614 | */ | 629 | */ |
615 | if(w % 2 == 1 || h % 2 == 1) | 630 | if(w % 4 || (h & 1) == 1) |
616 | { | 631 | { |
617 | /* copy three pixel after the last one */ | 632 | /* copy three pixel after the last one */ |
618 | for(int i = 0; i < 3; i++) | 633 | for(int i = 0; i < 3; i++) |