X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=cpu%2Fmpc8xx%2Flcd.c;h=0db5348650f3f86de3b51d01fa30e08155fd092e;hb=7aa78614716b7bd7bdf68553f261ad0d5a12826a;hp=f6dda607ea5eec71becdb49ee9507320edd034be;hpb=608c91460b37fd9fe0088a0ce813a443f116a8d5;p=karo-tx-uboot.git diff --git a/cpu/mpc8xx/lcd.c b/cpu/mpc8xx/lcd.c index f6dda607ea..0db5348650 100644 --- a/cpu/mpc8xx/lcd.c +++ b/cpu/mpc8xx/lcd.c @@ -27,11 +27,15 @@ #include #include +#include #include #include #include #include #include +#if defined(CONFIG_POST) +#include +#endif #ifdef CONFIG_LCD @@ -39,12 +43,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 @@ -53,6 +55,14 @@ /* #define CFG_INVERT_COLORS */ /* Not needed - adjust vl_dp instead */ /************************************************************************/ +/************************************************************************/ +/* ** BITMAP DISPLAY SUPPORT -- should probably be moved elsewhere */ +/************************************************************************/ + +#if (CONFIG_COMMANDS & CFG_CMD_BMP) +#include +#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */ + /************************************************************************/ /* ** FONT AND LOGO DATA */ /************************************************************************/ @@ -177,6 +187,8 @@ static vidinfo_t panel_info = { /* * Sharp LQ057Q3DC02 display. Active, color, single scan. */ +#define LCD_DF 12 + static vidinfo_t panel_info = { 320, 240, 0, 0, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 15, 4, 0, 3 @@ -260,11 +272,11 @@ static vidinfo_t panel_info = { * Emerging Display Technologies 320x240. Passive, monochrome, single scan. */ #define LCD_BPP LCD_MONOCHROME -#define LCD_DF 20 +#define LCD_DF 10 static vidinfo_t panel_info = { 320, 240, 0, 0, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_LOW, - LCD_BPP, 0, 0, 0, 0, 0, 15, 0, 0 + LCD_BPP, 0, 0, 0, 0, 33, 0, 0, 0 }; #endif /*----------------------------------------------------------------------*/ @@ -974,18 +986,25 @@ static void lcd_enable (void) #if defined(CONFIG_LWMON) { uchar c = pic_read (0x60); +#if defined(CONFIG_LCD) && defined(CONFIG_LWMON) && (CONFIG_POST & CFG_POST_SYSMON) + c |= 0x04; /* Chip Enable LCD */ +#else c |= 0x07; /* Power on CCFL, Enable CCFL, Chip Enable LCD */ +#endif pic_write (0x60, c); } -#elif defined(CONFIG_R360MPI) +#endif /* CONFIG_LWMON */ + +#if defined(CONFIG_R360MPI) { - extern void r360_pwm_write (uchar reg, uchar val); + extern void r360_i2c_lcd_write (uchar data0, uchar data1); - r360_pwm_write(8, 1); - r360_pwm_write(0, 4); - r360_pwm_write(1, 6); + r360_i2c_lcd_write(0x10, 0x01); + r360_i2c_lcd_write(0x20, 0x01); + r360_i2c_lcd_write(0x3F, 0xFF); + r360_i2c_lcd_write(0x47, 0xFF); } -#endif /* CONFIG_LWMON */ +#endif /* CONFIG_R360MPI */ } /*----------------------------------------------------------------------*/ @@ -1003,10 +1022,12 @@ static void lcd_disable (void) } #elif defined(CONFIG_R360MPI) { - extern void r360_pwm_write (uchar reg, uchar val); + extern void r360_i2c_lcd_write (uchar data0, uchar data1); - r360_pwm_write(0, 0); - r360_pwm_write(1, 0); + r360_i2c_lcd_write(0x10, 0x00); + r360_i2c_lcd_write(0x20, 0x00); + r360_i2c_lcd_write(0x30, 0x00); + r360_i2c_lcd_write(0x40, 0x00); } #endif /* CONFIG_LWMON */ /* Disable the LCD panel */ @@ -1039,6 +1060,8 @@ static void bitmap_plot (int x, int y) /* Leave room for default color map */ cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]); + WATCHDOG_RESET(); + /* Set color map */ for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) { ushort colreg = bmp_logo_palette[i]; @@ -1051,14 +1074,117 @@ static void bitmap_plot (int x, int y) bmap = &bmp_logo_bitmap[0]; fb = (char *)(lcd_base + y * lcd_line_length + x); + WATCHDOG_RESET(); + for (i=0; iim_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; + + WATCHDOG_RESET(); + + 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<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; + } + + WATCHDOG_RESET(); + } + + 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) { + WATCHDOG_RESET(); + 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) @@ -1070,6 +1196,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 */ @@ -1079,7 +1218,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));