summaryrefslogtreecommitdiff
path: root/drivers/cfb_console.c
diff options
context:
space:
mode:
authorwdenk <wdenk>2002-12-03 21:28:10 +0000
committerwdenk <wdenk>2002-12-03 21:28:10 +0000
commita6c7ad2f65afaa717ba19cbf9d8d138b5f10ccf9 (patch)
tree45512cd627310dd322ea38fc9f63109560276475 /drivers/cfb_console.c
parentea909b7604306a400ee3abf57e2fa7b2dde5dde1 (diff)
downloadu-boot-imx-a6c7ad2f65afaa717ba19cbf9d8d138b5f10ccf9.zip
u-boot-imx-a6c7ad2f65afaa717ba19cbf9d8d138b5f10ccf9.tar.gz
u-boot-imx-a6c7ad2f65afaa717ba19cbf9d8d138b5f10ccf9.tar.bz2
* Fix startup problems with VFD display on TRAB
* Patch by Pierre Aubert, 20 Nov 2002 Add driver for Epson SED13806 graphic controller. Add support for BMP logos in cfb_console driver.
Diffstat (limited to 'drivers/cfb_console.c')
-rw-r--r--drivers/cfb_console.c157
1 files changed, 100 insertions, 57 deletions
diff --git a/drivers/cfb_console.c b/drivers/cfb_console.c
index ee2fa9c..d428b17 100644
--- a/drivers/cfb_console.c
+++ b/drivers/cfb_console.c
@@ -65,6 +65,7 @@
CONFIG_CONSOLE_TIME - display time/date in upper right corner,
needs CFG_CMD_DATE and CONFIG_CONSOLE_CURSOR
CONFIG_VIDEO_LOGO - display Linux Logo in upper left corner
+ CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo
CONFIG_CONSOLE_EXTRA_INFO - display additional board information strings
that normaly goes to serial port. This define
requires a board specific function:
@@ -93,6 +94,8 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the
#ifdef CONFIG_CFB_CONSOLE
+#include <malloc.h>
+
/*****************************************************************************/
/* Console device defines with SMI graphic */
/* Any other graphic must change this section */
@@ -116,6 +119,16 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the
#endif
/*****************************************************************************/
+/* Defines for the SED13806 driver */
+/*****************************************************************************/
+#ifdef CONFIG_VIDEO_SED13806
+
+#define VIDEO_FB_LITTLE_ENDIAN
+#define VIDEO_HW_RECTFILL
+#define VIDEO_HW_BITBLT
+#endif
+
+/*****************************************************************************/
/* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc */
/*****************************************************************************/
#include <video_fb.h>
@@ -217,6 +230,14 @@ void console_cursor (int state);
#endif /* CONFIG_VIDEO_HW_CURSOR */
#ifdef CONFIG_VIDEO_LOGO
+#ifdef CONFIG_VIDEO_BMP_LOGO
+#include <bmp_logo.h>
+#define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH
+#define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT
+#define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET
+#define VIDEO_LOGO_COLORS BMP_LOGO_COLORS
+
+#else /* CONFIG_VIDEO_BMP_LOGO */
#define LINUX_LOGO_WIDTH 80
#define LINUX_LOGO_HEIGHT 80
#define LINUX_LOGO_COLORS 214
@@ -225,13 +246,15 @@ void console_cursor (int state);
#include <linux_logo.h>
#define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH
#define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT
-
+#define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET
+#define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS
+#endif /* CONFIG_VIDEO_BMP_LOGO */
#define VIDEO_INFO_X (VIDEO_LOGO_WIDTH)
#define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2)
-#else
+#else /* CONFIG_VIDEO_LOGO */
#define VIDEO_LOGO_WIDTH 0
#define VIDEO_LOGO_HEIGHT 0
-#endif
+#endif /* CONFIG_VIDEO_LOGO */
#define VIDEO_COLS VIDEO_VISIBLE_COLS
#define VIDEO_ROWS VIDEO_VISIBLE_ROWS
@@ -463,11 +486,7 @@ static inline void video_drawstring(int xx, int yy, unsigned char *s)
static void video_putchar(int xx, int yy, unsigned char c)
{
-#ifdef CONFIG_VIDEO_LOGO
video_drawchars (xx, yy + VIDEO_LOGO_HEIGHT, &c, 1);
-#else
- video_drawchars (xx, yy, &c, 1);
-#endif
}
/*****************************************************************************/
@@ -676,83 +695,107 @@ void video_puts (const char *s)
#ifdef CONFIG_VIDEO_LOGO
void logo_plot (void *screen, int width, int x, int y)
{
- int skip = (width - LINUX_LOGO_WIDTH) * VIDEO_PIXEL_SIZE,
+
+ int skip = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE,
xcount, i,
- ycount = LINUX_LOGO_HEIGHT;
+ ycount = VIDEO_LOGO_HEIGHT;
unsigned char
- *source = linux_logo,
+ *source,
*dest = (unsigned char *) screen + ((y * width * VIDEO_PIXEL_SIZE) + x),
- r, g, b;
-
+ r, g, b, *logo_red, *logo_blue, *logo_green;
+
+#ifdef CONFIG_VIDEO_BMP_LOGO
+ source = bmp_logo_bitmap;
+
+ /* Allocate temporary space for computing colormap */
+ logo_red = malloc (BMP_LOGO_COLORS);
+ logo_green = malloc (BMP_LOGO_COLORS);
+ logo_blue = malloc (BMP_LOGO_COLORS);
+ /* Compute color map */
+ for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
+ logo_red [i] = (bmp_logo_palette [i] & 0x0f00) >> 4;
+ logo_green [i] = (bmp_logo_palette [i] & 0x00f0);
+ logo_blue [i] = (bmp_logo_palette [i] & 0x000f) << 4;
+ }
+#else
+ source = linux_logo;
+ logo_red = linux_logo_red;
+ logo_green = linux_logo_green;
+ logo_blue = linux_logo_blue;
+#endif
+
if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX)
{
- for (i = 0; i < LINUX_LOGO_COLORS; i++)
+ for (i = 0; i < VIDEO_LOGO_COLORS; i++)
{
- r = (unsigned char)linux_logo_red [i];
- g = (unsigned char)linux_logo_green[i];
- b = (unsigned char)linux_logo_blue [i];
- video_set_lut (LINUX_LOGO_LUT_OFFSET + i, r, g, b);
+ video_set_lut (i + VIDEO_LOGO_LUT_OFFSET,
+ logo_red [i], logo_green [i], logo_blue [i]);
}
}
while (ycount--)
{
- xcount = LINUX_LOGO_WIDTH;
- while (xcount--)
- {
- r = (unsigned char)linux_logo_red [*source - LINUX_LOGO_LUT_OFFSET];
- g = (unsigned char)linux_logo_green[*source - LINUX_LOGO_LUT_OFFSET];
- b = (unsigned char)linux_logo_blue [*source - LINUX_LOGO_LUT_OFFSET];
-
- switch (VIDEO_DATA_FORMAT)
+ xcount = VIDEO_LOGO_WIDTH;
+ while (xcount--)
{
- case GDF__8BIT_INDEX:
- *dest = *source;
- break;
- case GDF__8BIT_332RGB:
- *dest = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6);
- break;
- case GDF_15BIT_555RGB:
- *(unsigned short *)dest =
- SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3)));
- break;
- case GDF_16BIT_565RGB:
- *(unsigned short *)dest =
- SWAP16((unsigned short)(((r>>3)<<11) | ((g>>2)<<5) | (b>>3)));
- break;
- case GDF_32BIT_X888RGB:
- *(unsigned long *)dest =
- SWAP32((unsigned long)((r<<16) | (g<<8) | b));
- break;
- case GDF_24BIT_888RGB:
+ r = logo_red [*source - VIDEO_LOGO_LUT_OFFSET];
+ g = logo_green [*source - VIDEO_LOGO_LUT_OFFSET];
+ b = logo_blue [*source - VIDEO_LOGO_LUT_OFFSET];
+
+ switch (VIDEO_DATA_FORMAT)
+ {
+ case GDF__8BIT_INDEX:
+ *dest = *source;
+ break;
+ case GDF__8BIT_332RGB:
+ *dest = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6);
+ break;
+ case GDF_15BIT_555RGB:
+ *(unsigned short *)dest =
+ SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3)));
+ break;
+ case GDF_16BIT_565RGB:
+ *(unsigned short *)dest =
+ SWAP16((unsigned short)(((r>>3)<<11) | ((g>>2)<<5) | (b>>3)));
+ break;
+ case GDF_32BIT_X888RGB:
+ *(unsigned long *)dest =
+ SWAP32((unsigned long)((r<<16) | (g<<8) | b));
+ break;
+ case GDF_24BIT_888RGB:
#ifdef VIDEO_FB_LITTLE_ENDIAN
- dest[0] = b;
- dest[1] = g;
- dest[2] = r;
+ dest[0] = b;
+ dest[1] = g;
+ dest[2] = r;
#else
- dest[0] = r;
- dest[1] = g;
- dest[2] = b;
+ dest[0] = r;
+ dest[1] = g;
+ dest[2] = b;
#endif
- break;
+ break;
+ }
+ source++;
+ dest += VIDEO_PIXEL_SIZE;
}
- source++;
- dest += VIDEO_PIXEL_SIZE;
- }
- dest += skip;
+ dest += skip;
}
+#ifdef CONFIG_VIDEO_BMP_LOGO
+ free (logo_red);
+ free (logo_green);
+ free (logo_blue);
+#endif
}
-
/*****************************************************************************/
static void *video_logo (void)
{
char info[128];
+ extern char version_string;
logo_plot (video_fb_address, VIDEO_COLS, 0, 0);
- sprintf(info, " %s (%s - %s)", U_BOOT_VERSION, __DATE__, __TIME__);
+ sprintf(info, " %s", &version_string);
video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, info);
#ifdef CONFIG_CONSOLE_EXTRA_INFO