diff options
| -rw-r--r-- | board/mcc200/lcd.c | 20 | ||||
| -rw-r--r-- | common/lcd.c | 44 | 
2 files changed, 47 insertions, 17 deletions
| diff --git a/board/mcc200/lcd.c b/board/mcc200/lcd.c index d8f754c4a..893f4b7cb 100644 --- a/board/mcc200/lcd.c +++ b/board/mcc200/lcd.c @@ -21,6 +21,7 @@  #include <common.h>  #include <lcd.h>  #include <mpc5xxx.h> +#include <malloc.h>  #ifdef CONFIG_LCD @@ -210,4 +211,23 @@ void show_progress (int size, int tot)  }  #endif + +int bmp_display(ulong addr, int x, int y) +{ +	int ret; +	bmp_image_t *bmp = (bmp_image_t *)addr; + +	if (!bmp) { +		printf("There is no valid bmp file at the given address\n"); +		return 1; +	} + +	ret = lcd_display_bitmap((ulong)bmp, x, y); + +	if ((unsigned long)bmp != addr) +		free(bmp); + +	return ret; +} +  #endif /* CONFIG_LCD */ diff --git a/common/lcd.c b/common/lcd.c index 0f93eae9d..88dfa51d7 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -636,6 +636,29 @@ static void splash_align_axis(int *axis, unsigned long panel_size,  }  #endif +#if defined CONFIG_CPU_PXA || defined(CONFIG_ATMEL_LCD) +#define FB_PUT_BYTE(fb, from) *(fb)++ = *(from)++ +#elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200) +#define FB_PUT_BYTE(fb, from) *(fb)++ = (255 - *(from)++) +#endif + +#if defined(CONFIG_BMP_16BPP) +#if defined(CONFIG_ATMEL_LCD_BGR555) +static inline void fb_put_word(uchar **fb, uchar **from) +{ +	*(*fb)++ = (((*from)[0] & 0x1f) << 2) | ((*from)[1] & 0x03); +	*(*fb)++ = ((*from)[0] & 0xe0) | (((*from)[1] & 0x7c) >> 2); +	*from += 2; +} +#else +static inline void fb_put_word(uchar **fb, uchar **from) +{ +	*(*fb)++ = *(*from)++; +	*(*fb)++ = *(*from)++; +} +#endif +#endif /* CONFIG_BMP_16BPP */ +  int lcd_display_bitmap(ulong bmp_image, int x, int y)  {  #if !defined(CONFIG_MCC200) @@ -761,11 +784,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  			WATCHDOG_RESET();  			for (j = 0; j < width; j++) {  				if (bpix != 16) { -#if defined(CONFIG_CPU_PXA) || defined(CONFIG_ATMEL_LCD) -					*(fb++) = *(bmap++); -#elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200) -					*(fb++) = 255 - *(bmap++); -#endif +					FB_PUT_BYTE(fb, bmap);  				} else {  					*(uint16_t *)fb = cmap_base[*(bmap++)];  					fb += sizeof(uint16_t) / sizeof(*fb); @@ -780,18 +799,9 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  	case 16:  		for (i = 0; i < height; ++i) {  			WATCHDOG_RESET(); -			for (j = 0; j < width; j++) { -#if defined(CONFIG_ATMEL_LCD_BGR555) -				*(fb++) = ((bmap[0] & 0x1f) << 2) | -					(bmap[1] & 0x03); -				*(fb++) = (bmap[0] & 0xe0) | -					((bmap[1] & 0x7c) >> 2); -				bmap += 2; -#else -				*(fb++) = *(bmap++); -				*(fb++) = *(bmap++); -#endif -			} +			for (j = 0; j < width; j++) +				fb_put_word(&fb, &bmap); +  			bmap += (padded_line - width) * 2;  			fb   -= (width * 2 + lcd_line_length);  		} |