diff options
| -rw-r--r-- | common/lcd.c | 59 | ||||
| -rw-r--r-- | include/lcd.h | 21 | 
2 files changed, 47 insertions, 33 deletions
| diff --git a/common/lcd.c b/common/lcd.c index f459a7498..d238fdde8 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -622,19 +622,15 @@ void bitmap_plot (int x, int y)   */  int lcd_display_bitmap(ulong bmp_image, int x, int y)  { -#ifdef CONFIG_ATMEL_LCD -	uint *cmap; -#elif !defined(CONFIG_MCC200) -	ushort *cmap; -#endif +	ushort *cmap = NULL, *cmap_base = NULL;  	ushort i, j;  	uchar *fb;  	bmp_image_t *bmp=(bmp_image_t *)bmp_image;  	uchar *bmap;  	ushort padded_line; -	unsigned long width, height; +	unsigned long width, height, byte_width;  	unsigned long pwidth = panel_info.vl_col; -	unsigned colors,bpix; +	unsigned colors, bpix, bmp_bpix;  	unsigned long compression;  #if defined(CONFIG_PXA250)  	struct pxafb_info *fbi = &panel_info.pxa; @@ -647,22 +643,24 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  		(bmp->header.signature[1]=='M'))) {  		printf ("Error: no valid bmp image at %lx\n", bmp_image);  		return 1; -} +	}  	width = le32_to_cpu (bmp->header.width);  	height = le32_to_cpu (bmp->header.height); -	colors = 1<<le16_to_cpu (bmp->header.bit_count); +	bmp_bpix = le16_to_cpu(bmp->header.bit_count); +	colors = 1 << bmp_bpix;  	compression = le32_to_cpu (bmp->header.compression);  	bpix = NBITS(panel_info.vl_bpix);  	if ((bpix != 1) && (bpix != 8) && (bpix != 16)) { -		printf ("Error: %d bit/pixel mode not supported by U-Boot\n", -			bpix); +		printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", +			bpix, bmp_bpix);  		return 1;  	} -	if (bpix != le16_to_cpu(bmp->header.bit_count)) { +	/* We support displaying 8bpp BMPs on 16bpp LCDs */ +	if (bpix != bmp_bpix && (bmp_bpix != 8 || bpix != 16)) {  		printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",  			bpix,  			le16_to_cpu(bmp->header.bit_count)); @@ -674,17 +672,17 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  #if !defined(CONFIG_MCC200)  	/* MCC200 LCD doesn't need CMAP, supports 1bpp b&w only */ -	if (bpix==8) { +	if (bmp_bpix == 8) {  #if defined(CONFIG_PXA250)  		cmap = (ushort *)fbi->palette;  #elif defined(CONFIG_MPC823)  		cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); -#elif defined(CONFIG_ATMEL_LCD) -		cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0)); -#else -# error "Don't know location of color map" +#elif !defined(CONFIG_ATMEL_LCD) +		cmap = panel_info.cmap;  #endif +		cmap_base = cmap; +  		/* Set color map */  		for (i=0; i<colors; ++i) {  			bmp_color_table_entry_t cte = bmp->color_table[i]; @@ -698,10 +696,10 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  #else  			*cmap = colreg;  #endif -#if defined(CONFIG_PXA250) -			cmap++; -#elif defined(CONFIG_MPC823) +#if defined(CONFIG_MPC823)  			cmap--; +#else +			cmap++;  #endif  #else /* CONFIG_ATMEL_LCD */  			lcd_setcolreg(i, cte.red, cte.green, cte.blue); @@ -739,19 +737,30 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  	fb   = (uchar *) (lcd_base +  		(y + height - 1) * lcd_line_length + x); -	switch (bpix) { +	switch (bmp_bpix) {  	case 1: /* pass through */  	case 8: +		if (bpix != 16) +			byte_width = width; +		else +			byte_width = width * 2; +  		for (i = 0; i < height; ++i) {  			WATCHDOG_RESET(); -			for (j = 0; j < width ; j++) +			for (j = 0; j < width; j++) { +				if (bpix != 16) {  #if defined(CONFIG_PXA250) || defined(CONFIG_ATMEL_LCD) -				*(fb++) = *(bmap++); +					*(fb++) = *(bmap++);  #elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200) -				*(fb++)=255-*(bmap++); +					*(fb++) = 255 - *(bmap++);  #endif +				} else { +					*(uint16_t *)fb = cmap_base[*(bmap++)]; +					fb += sizeof(uint16_t) / sizeof(*fb); +				} +			}  			bmap += (width - padded_line); -			fb   -= (width + lcd_line_length); +			fb   -= (byte_width + lcd_line_length);  		}  		break; diff --git a/include/lcd.h b/include/lcd.h index 512221e9c..f054cac05 100644 --- a/include/lcd.h +++ b/include/lcd.h @@ -148,14 +148,6 @@ typedef struct vidinfo {  extern vidinfo_t panel_info; -#elif defined(CONFIG_MCC200) -typedef struct vidinfo { -	ushort	vl_col;		/* Number of columns (i.e. 160) */ -	ushort	vl_row;		/* Number of rows (i.e. 100) */ - -	u_char	vl_bpix;	/* Bits per pixel, 0 = 1 */ -} vidinfo_t; -  #elif defined(CONFIG_ATMEL_LCD)  typedef struct vidinfo { @@ -183,6 +175,19 @@ typedef struct vidinfo {  extern vidinfo_t panel_info; +#else + +typedef struct vidinfo { +	ushort	vl_col;		/* Number of columns (i.e. 160) */ +	ushort	vl_row;		/* Number of rows (i.e. 100) */ + +	u_char	vl_bpix;	/* Bits per pixel, 0 = 1 */ + +	ushort	*cmap;		/* Pointer to the colormap */ + +	void	*priv;		/* Pointer to driver-specific data */ +} vidinfo_t; +  #endif /* CONFIG_MPC823, CONFIG_PXA250 or CONFIG_MCC200 or CONFIG_ATMEL_LCD */  /* Video functions */ |