diff options
author | wdenk <wdenk> | 2003-04-20 14:04:18 +0000 |
---|---|---|
committer | wdenk <wdenk> | 2003-04-20 14:04:18 +0000 |
commit | d791b1dc3e64a6a6317293245d884589bc5c6277 (patch) | |
tree | 32f7bfaa5f3112cae01cf78252b1f3c66fcc4354 /cpu/mpc8xx/lcd.c | |
parent | 4a6fd34b267dbf4a72080ab9a085bb45c63660fb (diff) | |
download | u-boot-imx-d791b1dc3e64a6a6317293245d884589bc5c6277.zip u-boot-imx-d791b1dc3e64a6a6317293245d884589bc5c6277.tar.gz u-boot-imx-d791b1dc3e64a6a6317293245d884589bc5c6277.tar.bz2 |
* Make sure Block Lock Bits get cleared in R360MPI flash driver
* MPC823 LCD driver: Fill color map backwards, to allow for steady
display when Linux takes over
* Patch by Erwin Rol, 27 Feb 2003:
Add support for RTEMS (this time for real).
* Add support for "bmp info" and "bmp display" commands to load
bitmap images; this can be used (for example in a "preboot"
command) to display a splash screen very quickly after poweron.
* Add support for 133 MHz clock on INCA-IP board
Diffstat (limited to 'cpu/mpc8xx/lcd.c')
-rw-r--r-- | cpu/mpc8xx/lcd.c | 217 |
1 files changed, 213 insertions, 4 deletions
diff --git a/cpu/mpc8xx/lcd.c b/cpu/mpc8xx/lcd.c index 4ef1513..1c3fb23 100644 --- a/cpu/mpc8xx/lcd.c +++ b/cpu/mpc8xx/lcd.c @@ -39,12 +39,10 @@ /************************************************************************/ /* ** CONFIG STUFF -- should be moved to board config file */ /************************************************************************/ -#ifndef CONFIG_EDT32F10 #define CONFIG_LCD_LOGO #define LCD_INFO /* Display Logo, (C) and system info */ -#endif -#ifdef CONFIG_V37 +#if defined(CONFIG_V37) || defined(CONFIG_EDT32F10) #undef CONFIG_LCD_LOGO #undef LCD_INFO #endif @@ -54,6 +52,14 @@ /************************************************************************/ /************************************************************************/ +/* ** BITMAP DISPLAY SUPPORT -- should probably be moved elsewhere */ +/************************************************************************/ + +#if (CONFIG_COMMANDS & CFG_CMD_BMP) +#include <bmp_layout.h> +#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */ + +/************************************************************************/ /* ** FONT AND LOGO DATA */ /************************************************************************/ @@ -995,6 +1001,102 @@ static void lcd_enable (void) /*----------------------------------------------------------------------*/ +#if (CONFIG_COMMANDS & CFG_CMD_BMP) +/* + Display the BMP file located at address bmp_image. + Only uncompressed +*/ +int lcd_display_bitmap(ulong bmp_image) +{ + volatile immap_t *immr = (immap_t *) CFG_IMMR; + volatile cpm8xx_t *cp = &(immr->im_cpm); + ushort *cmap; + ushort i, j; + uchar *fb; + bmp_image_t *bmp=(bmp_image_t *)bmp_image; + uchar *bmap; + ushort padded_line; + unsigned long width, height; + unsigned colors,bpix; + unsigned long compression; + + if (!((bmp->header.signature[0]=='B') && + (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); + compression = le32_to_cpu (bmp->header.compression); + + bpix = NBITS(panel_info.vl_bpix); + + if ((bpix != 1) && (bpix != 8)) { + printf ("Error: %d bit/pixel mode not supported by U-Boot\n", + bpix); + return 1; + } + + if (bpix != le16_to_cpu(bmp->header.bit_count)) { + printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", + bpix, + le16_to_cpu(bmp->header.bit_count)); + return 1; + } + + if (compression!=BMP_BI_RGB) { + printf ("Error: compression type %ld not supported\n", + compression); + return 1; + } + + debug ("Display-bmp: %d x %d with %d colors\n", + width, height, colors); + + if (bpix==8) { + /* Fill the entire color map */ + cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); + + /* Set color map */ + for (i = 0; i < colors; ++i) { + bmp_color_table_entry_t cte = bmp->color_table[i]; + ushort colreg = + ((cte.red>>4) << 8) | + ((cte.green>>4) << 4) | + (cte.blue>>4) ; +#ifdef CFG_INVERT_COLORS + colreg ^= 0xFFF; +#endif + *cmap-- = colreg; + } + } + + padded_line = (width&0x3) ? ((width&~0x3)+4) : (width); + if (width>panel_info.vl_col) + width = panel_info.vl_col; + if (height>panel_info.vl_row) + height = panel_info.vl_row; + + bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset); + fb = (uchar *) + (lcd_base + + (((height>=panel_info.vl_row) ? panel_info.vl_row : height)-1) + * lcd_line_length); + for (i = 0; i < height; ++i) { + for (j = 0; j < width ; j++) + *(fb++)=255-*(bmap++); + bmap += (width - padded_line); + fb -= (width + lcd_line_length); + } + + return (0); +} +#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */ + +/*----------------------------------------------------------------------*/ + #ifdef NOT_USED_SO_FAR static void lcd_disable (void) { @@ -1066,6 +1168,100 @@ static void bitmap_plot (int x, int y) } #endif /* CONFIG_LCD_LOGO */ +#if (CONFIG_COMMANDS & CFG_CMD_BMP) +/* + Display the BMP file located at address bmp_image. + Only uncompressed +*/ +int lcd_display_bitmap(ulong bmp_image) +{ + volatile immap_t *immr = (immap_t *) CFG_IMMR; + volatile cpm8xx_t *cp = &(immr->im_cpm); + ushort *cmap; + ushort i, j; + uchar *fb; + bmp_image_t *bmp=(bmp_image_t *)bmp_image; + uchar *bmap; + ushort padded_line; + unsigned long width, height; + unsigned colors,bpix; + unsigned long compression; + + if (!((bmp->header.signature[0]=='B') && + (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); + compression = le32_to_cpu (bmp->header.compression); + + bpix = NBITS(panel_info.vl_bpix); + + if ((bpix != 1) && (bpix != 8)) { + printf ("Error: %d bit/pixel mode not supported by U-Boot\n", + bpix); + return 1; + } + + if (bpix != le16_to_cpu(bmp->header.bit_count)) { + printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", + bpix, + le16_to_cpu(bmp->header.bit_count)); + return 1; + } + + if (compression!=BMP_BI_RGB) { + printf ("Error: compression type %ld not supported\n", + compression); + return 1; + } + + debug ("Display-bmp: %d x %d with %d colors\n", + width, height, colors); + + if (bpix==8) { + /* Fill the entire color map */ + cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); + + /* Set color map */ + for (i = 0; i < colors; ++i) { + bmp_color_table_entry_t cte = bmp->color_table[i]; + ushort colreg = + ((cte.red>>4) << 8) | + ((cte.green>>4) << 4) | + (cte.blue>>4) ; +#ifdef CFG_INVERT_COLORS + colreg ^= 0xFFF; +#endif + *cmap-- = colreg; + } + } + + padded_line = (width&0x3) ? ((width&~0x3)+4) : (width); + if (width>panel_info.vl_col) + width = panel_info.vl_col; + if (height>panel_info.vl_row) + height = panel_info.vl_row; + + bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset); + fb = (uchar *) + (lcd_base + + (((height>=panel_info.vl_row) ? panel_info.vl_row : height)-1) + * lcd_line_length); + for (i = 0; i < height; ++i) { + for (j = 0; j < width ; j++) + *(fb++)=255-*(bmap++); + bmap += (width - padded_line); + fb -= (width + lcd_line_length); + } + + return (0); +} +#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */ + /*----------------------------------------------------------------------*/ static void *lcd_logo (void) @@ -1077,6 +1273,19 @@ static void *lcd_logo (void) char temp[32]; #endif /* LCD_INFO */ +#ifdef CONFIG_SPLASH_SCREEN + char *s; + ulong addr; + + if ((s = getenv("splashimage")) != NULL) { + addr = simple_strtoul(s, NULL, 16); + + if (lcd_display_bitmap (addr) == 0) { + return ((void *)lcd_base); + } + } +#endif /* CONFIG_SPLASH_SCREEN */ + #ifdef CONFIG_LCD_LOGO bitmap_plot (0, 0); #endif /* CONFIG_LCD_LOGO */ @@ -1086,7 +1295,7 @@ static void *lcd_logo (void) sprintf (info, "%s (%s - %s) ", U_BOOT_VERSION, __DATE__, __TIME__); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, info, strlen(info)); - sprintf (info, "(C) 2002 DENX Software Engineering"); + sprintf (info, "(C) 2003 DENX Software Engineering"); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT, info, strlen(info)); |