diff options
| author | Tom Rini <trini@ti.com> | 2012-09-25 16:18:22 -0700 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2012-09-25 16:18:22 -0700 | 
| commit | b3873d3f4c424e6563750bb517fac03c2e833cdc (patch) | |
| tree | 3ddcf37e04ca77cfaa6ad5b7b14bf233c841e0fd /common/lcd.c | |
| parent | 5cf41dccff9d1e8c297de6eae8422d3e322eebbc (diff) | |
| parent | d23019f3d65c2746d8aecf5ab2c93591f00cb965 (diff) | |
| download | olio-uboot-2014.01-b3873d3f4c424e6563750bb517fac03c2e833cdc.tar.xz olio-uboot-2014.01-b3873d3f4c424e6563750bb517fac03c2e833cdc.zip  | |
Merge branch 'master' of git://git.denx.de/u-boot-video
Diffstat (limited to 'common/lcd.c')
| -rw-r--r-- | common/lcd.c | 153 | 
1 files changed, 83 insertions, 70 deletions
diff --git a/common/lcd.c b/common/lcd.c index 506a138cd..b6be8002d 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -498,23 +498,43 @@ static int lcd_getbgcolor(void)  /************************************************************************/  /* ** Chipset depending Bitmap / Logo stuff...                          */  /************************************************************************/ +static inline ushort *configuration_get_cmap(void) +{ +#if defined CONFIG_CPU_PXA +	struct pxafb_info *fbi = &panel_info.pxa; +	return (ushort *)fbi->palette; +#elif defined(CONFIG_MPC823) +	immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; +	cpm8xx_t *cp = &(immr->im_cpm); +	return (ushort *)&(cp->lcd_cmap[255 * sizeof(ushort)]); +#elif defined(CONFIG_ATMEL_LCD) +	return (ushort *)(panel_info.mmio + ATMEL_LCDC_LUT(0)); +#elif !defined(CONFIG_ATMEL_HLCD) && !defined(CONFIG_EXYNOS_FB) +	return panel_info.cmap; +#else +#if defined(CONFIG_LCD_LOGO) +	return bmp_logo_palette; +#else +	return NULL; +#endif +#endif +} +  #ifdef CONFIG_LCD_LOGO  void bitmap_plot(int x, int y)  {  #ifdef CONFIG_ATMEL_LCD -	uint *cmap; +	uint *cmap = (uint *)bmp_logo_palette;  #else -	ushort *cmap; +	ushort *cmap = (ushort *)bmp_logo_palette;  #endif  	ushort i, j;  	uchar *bmap;  	uchar *fb;  	ushort *fb16; -#if defined(CONFIG_CPU_PXA) -	struct pxafb_info *fbi = &panel_info.pxa; -#elif defined(CONFIG_MPC823) -	volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; -	volatile cpm8xx_t *cp = &(immr->im_cpm); +#if defined(CONFIG_MPC823) +	immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; +	cpm8xx_t *cp = &(immr->im_cpm);  #endif  	debug("Logo: width %d  height %d  colors %d  cmap %d\n", @@ -525,20 +545,17 @@ void bitmap_plot(int x, int y)  	fb   = (uchar *)(lcd_base + y * lcd_line_length + x);  	if (NBITS(panel_info.vl_bpix) < 12) { -		/* Leave room for default color map */ -#if defined(CONFIG_CPU_PXA) -		cmap = (ushort *) fbi->palette; -#elif defined(CONFIG_MPC823) +		/* Leave room for default color map +		 * default case: generic system with no cmap (most likely 16bpp) +		 * cmap was set to the source palette, so no change is done. +		 * This avoids even more ifdefs in the next stanza +		 */ +#if defined(CONFIG_MPC823)  		cmap = (ushort *) &(cp->lcd_cmap[BMP_LOGO_OFFSET * sizeof(ushort)]);  #elif defined(CONFIG_ATMEL_LCD) -		cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0)); +		cmap = (uint *)configuration_get_cmap();  #else -		/* -		 * default case: generic system with no cmap (most likely 16bpp) -		 * We set cmap to the source palette, so no change is done. -		 * This avoids even more ifdef in the next stanza -		 */ -		cmap = bmp_logo_palette; +		cmap = configuration_get_cmap();  #endif  		WATCHDOG_RESET(); @@ -607,7 +624,46 @@ static inline void bitmap_plot(int x, int y) {}  #ifdef CONFIG_SPLASH_SCREEN_ALIGN  #define BMP_ALIGN_CENTER	0x7FFF + +static void splash_align_axis(int *axis, unsigned long panel_size, +					unsigned long picture_size) +{ +	unsigned long panel_picture_delta = panel_size - picture_size; +	unsigned long axis_alignment; + +	if (*axis == BMP_ALIGN_CENTER) +		axis_alignment = panel_picture_delta / 2; +	else if (*axis < 0) +		axis_alignment = panel_picture_delta + *axis + 1; +	else +		return; + +	*axis = max(0, axis_alignment); +} +#endif + +#if defined(CONFIG_MPC823) || defined(CONFIG_MCC200) +#define FB_PUT_BYTE(fb, from) *(fb)++ = (255 - *(from)++) +#else +#define FB_PUT_BYTE(fb, from) *(fb)++ = *(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)  { @@ -623,14 +679,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  	unsigned long width, height, byte_width;  	unsigned long pwidth = panel_info.vl_col;  	unsigned colors, bpix, bmp_bpix; -#if defined(CONFIG_CPU_PXA) -	struct pxafb_info *fbi = &panel_info.pxa; -#elif defined(CONFIG_MPC823) -	volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; -	volatile cpm8xx_t *cp = &(immr->im_cpm); -#endif -	if (!((bmp->header.signature[0] == 'B') && +	if (!bmp || !((bmp->header.signature[0] == 'B') &&  		(bmp->header.signature[1] == 'M'))) {  		printf("Error: no valid bmp image at %lx\n", bmp_image); @@ -666,14 +716,7 @@ 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 (bmp_bpix == 8) { -#if defined(CONFIG_CPU_PXA) -		cmap = (ushort *)fbi->palette; -#elif defined(CONFIG_MPC823) -		cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); -#elif !defined(CONFIG_ATMEL_LCD) && !defined(CONFIG_EXYNOS_FB) -		cmap = panel_info.cmap; -#endif - +		cmap = configuration_get_cmap();  		cmap_base = cmap;  		/* Set color map */ @@ -722,15 +765,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  	padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);  #ifdef CONFIG_SPLASH_SCREEN_ALIGN -	if (x == BMP_ALIGN_CENTER) -		x = max(0, (pwidth - width) / 2); -	else if (x < 0) -		x = max(0, pwidth - width + x + 1); - -	if (y == BMP_ALIGN_CENTER) -		y = max(0, (panel_info.vl_row - height) / 2); -	else if (y < 0) -		y = max(0, panel_info.vl_row - height + y + 1); +	splash_align_axis(&x, pwidth, width); +	splash_align_axis(&y, panel_info.vl_row, height);  #endif /* CONFIG_SPLASH_SCREEN_ALIGN */  	if ((x + width) > pwidth) @@ -754,11 +790,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); @@ -773,18 +805,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);  		} @@ -842,17 +865,7 @@ static void *lcd_logo(void)  		}  #endif /* CONFIG_SPLASH_SCREEN_ALIGN */ -#ifdef CONFIG_VIDEO_BMP_GZIP -		bmp_image_t *bmp = (bmp_image_t *)addr; -		unsigned long len; - -		if (!((bmp->header.signature[0] == 'B') && -			(bmp->header.signature[1] == 'M'))) { -			addr = (ulong)gunzip_bmp(addr, &len); -		} -#endif - -		if (lcd_display_bitmap(addr, x, y) == 0) +		if (bmp_display(addr, x, y) == 0)  			return (void *)lcd_base;  	}  #endif /* CONFIG_SPLASH_SCREEN */  |