summaryrefslogtreecommitdiff
path: root/packages/u-boot/u-boot-1.1.4/at32stk1000/lcd-add-24-bpp-support-and-atmel-lcdc-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/u-boot/u-boot-1.1.4/at32stk1000/lcd-add-24-bpp-support-and-atmel-lcdc-support.patch')
-rw-r--r--packages/u-boot/u-boot-1.1.4/at32stk1000/lcd-add-24-bpp-support-and-atmel-lcdc-support.patch670
1 files changed, 670 insertions, 0 deletions
diff --git a/packages/u-boot/u-boot-1.1.4/at32stk1000/lcd-add-24-bpp-support-and-atmel-lcdc-support.patch b/packages/u-boot/u-boot-1.1.4/at32stk1000/lcd-add-24-bpp-support-and-atmel-lcdc-support.patch
new file mode 100644
index 0000000000..126178b286
--- /dev/null
+++ b/packages/u-boot/u-boot-1.1.4/at32stk1000/lcd-add-24-bpp-support-and-atmel-lcdc-support.patch
@@ -0,0 +1,670 @@
+Index: u-boot-1.1.4/common/lcd.c
+===================================================================
+--- u-boot-1.1.4.orig/common/lcd.c 2007-01-11 15:25:03.000000000 +0100
++++ u-boot-1.1.4/common/lcd.c 2007-01-11 15:28:54.000000000 +0100
+@@ -34,6 +34,7 @@
+ #include <command.h>
+ #include <version.h>
+ #include <stdarg.h>
++#include <malloc.h>
+ #include <linux/types.h>
+ #include <devices.h>
+ #if defined(CONFIG_POST)
+@@ -81,6 +82,9 @@
+ extern void lcd_enable (void);
+ static void *lcd_logo (void);
+
++#ifdef CONFIG_VIDEO_BMP_GZIP
++extern int gunzip(void *, int, unsigned char *, unsigned long *);
++#endif
+
+ #if LCD_BPP == LCD_COLOR8
+ extern void lcd_setcolreg (ushort regno,
+@@ -112,9 +116,12 @@
+ #if 1
+ /* Copy up rows ignoring the first one */
+ memcpy (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, CONSOLE_SCROLL_SIZE);
+-
+ /* Clear the last one */
+ memset (CONSOLE_ROW_LAST, COLOR_MASK(lcd_color_bg), CONSOLE_ROW_SIZE);
++#ifdef CONFIG_AVR32
++ /* flush cache */
++ dcache_clean_range(CONSOLE_ROW_FIRST, CONSOLE_SIZE);
++#endif
+ #else
+ /*
+ * Poor attempt to optimize speed by moving "long"s.
+@@ -228,10 +235,23 @@
+ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
+ {
+ uchar *dest;
+- ushort off, row;
++ ushort off, row, bpp, bytespp;
++#ifdef CONFIG_AVR32
++ uchar *dest_start;
++#endif
+
+- dest = (uchar *)(lcd_base + y * lcd_line_length + x * (1 << LCD_BPP) / 8);
+- off = x * (1 << LCD_BPP) % 8;
++#if (LCD_BPP > LCD_COLOR32)
++ bpp = LCD_BPP;
++#else
++ bpp = 1<<LCD_BPP;
++#endif
++ bytespp = (bpp + 7) / 8;
++
++ dest = (uchar *)(lcd_base + y * lcd_line_length + x * bytespp);
++ off = x * bytespp * 8 % 8;
++#ifdef CONFIG_AVR32
++ dest_start = dest;
++#endif
+
+ for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) {
+ uchar *s = str;
+@@ -261,7 +281,17 @@
+ bits <<= 1;
+ }
+ #elif LCD_BPP == LCD_COLOR16
+- for (c=0; c<16; ++c) {
++ for (c=0; c<8; ++c) {
++ *d++ = (bits & 0x80) ?
++ lcd_color_fg : lcd_color_bg;
++ bits <<= 1;
++ }
++#elif LCD_BPP == LCD_COLOR24
++ for (c=0; c<8; ++c) {
++ *d++ = (bits & 0x80) ?
++ lcd_color_fg : lcd_color_bg;
++ *d++ = (bits & 0x80) ?
++ lcd_color_fg : lcd_color_bg;
+ *d++ = (bits & 0x80) ?
+ lcd_color_fg : lcd_color_bg;
+ bits <<= 1;
+@@ -271,6 +301,10 @@
+ #if LCD_BPP == LCD_MONOCHROME
+ *d = rest | (*d & ((1 << (8-off)) - 1));
+ #endif
++#ifdef CONFIG_AVR32
++ /* flush cache */
++ dcache_clean_range(dest_start, (int)(d - dest_start));
++#endif
+ }
+ }
+
+@@ -346,7 +380,11 @@
+
+ lcd_base = (void *)(gd->fb_base);
+
+- lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
++ if (panel_info.vl_bpix > LCD_COLOR32)
++ lcd_line_length = (panel_info.vl_col * panel_info.vl_bpix) / 8;
++ else
++ lcd_line_length = (panel_info.vl_col
++ * NBITS (panel_info.vl_bpix)) / 8;
+
+ lcd_init (lcd_base); /* LCD initialization */
+
+@@ -407,6 +445,11 @@
+ console_col = 0;
+ console_row = 0;
+
++#ifdef CONFIG_AVR32
++ /* flush cache */
++ dcache_clean_range(CONSOLE_ROW_FIRST, CONSOLE_SIZE);
++#endif
++
+ return (0);
+ }
+
+@@ -453,10 +496,17 @@
+ ulong lcd_setmem (ulong addr)
+ {
+ ulong size;
+- int line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
++ int bpp;
++ int line_length;
++ if (panel_info.vl_bpix > LCD_COLOR32)
++ bpp = panel_info.vl_bpix;
++ else
++ bpp = NBITS (panel_info.vl_bpix);
++
++ line_length = (panel_info.vl_col * bpp) / 8;
+
+ debug ("LCD panel info: %d x %d, %d bit/pix\n",
+- panel_info.vl_col, panel_info.vl_row, NBITS (panel_info.vl_bpix) );
++ panel_info.vl_col, panel_info.vl_row, bpp);
+
+ size = line_length * panel_info.vl_row;
+
+@@ -475,14 +525,22 @@
+
+ static void lcd_setfgcolor (int color)
+ {
++#if LCD_BPP <= LCD_COLOR8
+ lcd_color_fg = color & 0x0F;
++#else
++ lcd_color_fg = color;
++#endif
+ }
+
+ /*----------------------------------------------------------------------*/
+
+ static void lcd_setbgcolor (int color)
+ {
++#if LCD_BPP <= LCD_COLOR8
+ lcd_color_bg = color & 0x0F;
++#else
++ lcd_color_bg = color;
++#endif
+ }
+
+ /*----------------------------------------------------------------------*/
+@@ -509,7 +567,11 @@
+ #ifdef CONFIG_LCD_LOGO
+ void bitmap_plot (int x, int y)
+ {
++#if !defined(CONFIG_ATMEL_LCDC)
+ ushort *cmap;
++#else
++ ulong *cmap;
++#endif
+ ushort i, j;
+ uchar *bmap;
+ uchar *fb;
+@@ -519,6 +581,8 @@
+ #elif defined(CONFIG_MPC823)
+ volatile immap_t *immr = (immap_t *) CFG_IMMR;
+ volatile cpm8xx_t *cp = &(immr->im_cpm);
++#elif defined(CONFIG_ATMEL_LCDC)
++ struct lcdc_info *cinfo = panel_info.lcdc;
+ #endif
+
+ debug ("Logo: width %d height %d colors %d cmap %d\n",
+@@ -534,6 +598,8 @@
+ cmap = (ushort *)fbi->palette;
+ #elif defined(CONFIG_MPC823)
+ cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);
++#elif defined(CONFIG_ATMEL_LCDC)
++ cmap = (ulong *)(cinfo->palette) + BMP_LOGO_OFFSET;
+ #endif
+
+ WATCHDOG_RESET();
+@@ -541,10 +607,19 @@
+ /* Set color map */
+ for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {
+ ushort colreg = bmp_logo_palette[i];
++#if defined(CONFIG_ATMEL_LCDC)
++ /* convert to match palette registers */
++ uchar red = (colreg >> 8) & 0x0f;
++ uchar green = (colreg >> 4) & 0x0f;
++ uchar blue = (colreg >> 0) & 0x0f;
++ colreg = (blue << 11);
++ colreg |= (green << 6);
++ colreg |= (red << 1);
++#endif
+ #ifdef CFG_INVERT_COLORS
+- *cmap++ = 0xffff - colreg;
++ *(cmap++) = 0xffff - colreg;
+ #else
+- *cmap++ = colreg;
++ *(cmap++) = colreg;
+ #endif
+ }
+
+@@ -579,14 +654,16 @@
+ */
+ int lcd_display_bitmap(ulong bmp_image, int x, int y)
+ {
++#if !defined(CONFIG_ATMEL_LCDC)
+ ushort *cmap;
++#endif
+ 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 colors,bpix,bpp,bytespp;
+ unsigned long compression;
+ #if defined(CONFIG_PXA250)
+ struct pxafb_info *fbi = &panel_info.pxa;
+@@ -597,82 +674,126 @@
+
+ if (!((bmp->header.signature[0]=='B') &&
+ (bmp->header.signature[1]=='M'))) {
+- printf ("Error: no valid bmp image at %lx\n", bmp_image);
++ printf ("[LCD] No valid BMP image at 0x%08lx\n", bmp_image);
+ return 1;
+-}
++ }
+
+ width = le32_to_cpu (bmp->header.width);
+ height = le32_to_cpu (bmp->header.height);
++ bpp = le16_to_cpu (bmp->header.bit_count);
+ colors = 1<<le16_to_cpu (bmp->header.bit_count);
+ compression = le32_to_cpu (bmp->header.compression);
++ bytespp = (panel_info.vl_bpix + 7) / 8;
+
+- bpix = NBITS(panel_info.vl_bpix);
++ if (panel_info.vl_bpix > LCD_COLOR32)
++ bpix = panel_info.vl_bpix;
++ else
++ bpix = NBITS(panel_info.vl_bpix);
+
+- if ((bpix != 1) && (bpix != 8)) {
++ if ((bpix != 1) && (bpix != 8) && (bpix != 24)) {
+ printf ("Error: %d bit/pixel mode not supported by U-Boot\n",
+ bpix);
+ return 1;
+ }
+
+- if (bpix != le16_to_cpu(bmp->header.bit_count)) {
++ if (bpix != bpp) {
+ printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
+- bpix,
+- le16_to_cpu(bmp->header.bit_count));
++ bpix, bpp);
+ return 1;
+ }
+
+- debug ("Display-bmp: %d x %d with %d colors\n",
+- (int)width, (int)height, (int)colors);
++ debug ("Display-bmp: %d x %d with %d colors (%d bpp)\n",
++ (int)width, (int)height, (int)colors, (int)bpp);
+
+- if (bpix==8) {
++ if (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_LCDC)
++ /* no need to have a palette link, we use lcd_setcolreg */
+ #else
+ # error "Don't know location of color map"
+ #endif
+
+ /* Set color map */
+ for (i=0; i<colors; ++i) {
++#if LCP_BPP <= LCD_COLOR8 /* palette only for 8 bpp and less */
+ bmp_color_table_entry_t cte = bmp->color_table[i];
++#endif
++#if !defined(CONFIG_ATMEL_LCDC)
+ ushort colreg =
+ ( ((cte.red) << 8) & 0xf800) |
+ ( ((cte.green) << 3) & 0x07e0) |
+ ( ((cte.blue) >> 3) & 0x001f) ;
+ #ifdef CFG_INVERT_COLORS
+- *cmap = 0xffff - colreg;
+-#else
+- *cmap = colreg;
++ colreg = 0xffff - colreg;
+ #endif
+ #if defined(CONFIG_PXA250)
+- cmap++;
++ cmap[i] = colreg;
+ #elif defined(CONFIG_MPC823)
+- cmap--;
++ cmap[colors-i] = colreg;
++#endif
++#else /* CONFIG_ATMEL_LCDC */
++#if LCD_BPP <= LCD_COLOR8
++ lcd_setcolreg(i, cte.red, cte.green, cte.blue);
++#endif
+ #endif
+ }
+ }
+
+- padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);
+- if ((x + width)>panel_info.vl_col)
++ padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;
++ if ((x + width) > panel_info.vl_col)
+ width = panel_info.vl_col - x;
+- if ((y + height)>panel_info.vl_row)
++ if ((y + height) > panel_info.vl_row)
+ height = panel_info.vl_row - y;
+
+ bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset);
+- fb = (uchar *) (lcd_base +
+- (y + height - 1) * lcd_line_length + x);
+- for (i = 0; i < height; ++i) {
+- WATCHDOG_RESET();
+- for (j = 0; j < width ; j++)
++ fb = (uchar *) (lcd_base + (y + height - 1) * lcd_line_length + x);
++
++ switch (bpp) {
++ case 24:
++ for (i = 0; i < height; ++i) {
++ WATCHDOG_RESET();
++ for (j = 0; j < width; j++) {
+ #if defined(CONFIG_PXA250)
+- *(fb++)=*(bmap++);
++#error 24 bpp support not added for PXA250
++#elif defined(CONFIG_ATMEL_LCDC)
++ fb[0] = bmap[0];
++ fb[1] = bmap[1];
++ fb[2] = bmap[2];
++ fb += 3;
++ bmap += 3;
+ #elif defined(CONFIG_MPC823)
+- *(fb++)=255-*(bmap++);
++#error 24 bpp support not added for MPC823
+ #endif
+- bmap += (width - padded_line);
+- fb -= (width + lcd_line_length);
+- }
++ }
++ bmap += (width * bytespp - padded_line);
++ fb -= (width * bytespp + lcd_line_length);
++ }
++ break;
++ case 1: /* pass through */
++ case 8:
++ for (i = 0; i < height; ++i) {
++ WATCHDOG_RESET();
++ for (j = 0; j < width; j++) {
++#if defined(CONFIG_PXA250)
++ *(fb++)=*(bmap++);
++#elif defined(CONFIG_ATMEL_LCDC)
++ *(fb++)=*(bmap++);
++#elif defined(CONFIG_MPC823)
++ *(fb++)=255-*(bmap++);
++#endif
++ }
++ bmap += (width * bytespp - padded_line);
++ fb -= (width * bytespp + lcd_line_length);
++ }
++ break;
++ default:
++ break;
++ };
++
++ /* TODO: flush fb */
+
+ return (0);
+ }
+@@ -694,12 +815,68 @@
+ static int do_splash = 1;
+
+ if (do_splash && (s = getenv("splashimage")) != NULL) {
++#ifdef CONFIG_VIDEO_BMP_GZIP
++ bmp_image_t *bmp;
++ unsigned char *dst = NULL;
++ ulong len;
++#endif
+ addr = simple_strtoul(s, NULL, 16);
+ do_splash = 0;
+
++#ifdef CONFIG_VIDEO_BMP_GZIP
++ bmp = (bmp_image_t *)addr;
++
++ if (!((bmp->header.signature[0]=='B') &&
++ (bmp->header.signature[1]=='M'))) {
++ len = CFG_VIDEO_LOGO_MAX_SIZE;
++ dst = malloc(CFG_VIDEO_LOGO_MAX_SIZE);
++ if (dst == NULL) {
++ printf("[LCD] Malloc for gunzip failed!\n");
++ return ((void *)lcd_base);
++ }
++ if (gunzip(dst, CFG_VIDEO_LOGO_MAX_SIZE,
++ (uchar *)addr, &len) != 0) {
++ free(dst);
++ printf("[LCD] No valid BMP image at 0x%08lx\n",
++ addr);
++ return ((void *)lcd_base);
++ }
++ if (len == CFG_VIDEO_LOGO_MAX_SIZE) {
++ printf("[LCD] Image could be truncated (increase "
++ "CFG_VIDEO_LOGO_MAX_SIZE)!\n");
++ }
++
++ /*
++ * Set addr to decompressed image
++ */
++ bmp = (bmp_image_t *)dst;
++
++ /*
++ * Check for bmp mark 'BM'
++ */
++ if (!((bmp->header.signature[0] == 'B') &&
++ (bmp->header.signature[1] == 'M'))) {
++ printf("[LCD] No valid BMP image at 0x%08lx\n",
++ addr);
++ free(dst);
++ return ((void *)lcd_base);
++ }
++
++ addr = (ulong)dst;
++ }
++#endif
+ if (lcd_display_bitmap (addr, 0, 0) == 0) {
++#ifdef CONFIG_VIDEO_BMP_GZIP
++ if (dst)
++ free(dst);
++#endif
+ return ((void *)lcd_base);
+ }
++
++#ifdef CONFIG_VIDEO_BMP_GZIP
++ if (dst)
++ free(dst);
++#endif
+ }
+ #endif /* CONFIG_SPLASH_SCREEN */
+
+Index: u-boot-1.1.4/include/lcd.h
+===================================================================
+--- u-boot-1.1.4.orig/include/lcd.h 2007-01-11 15:25:03.000000000 +0100
++++ u-boot-1.1.4/include/lcd.h 2007-01-11 15:25:38.000000000 +0100
+@@ -148,7 +148,159 @@
+
+ extern vidinfo_t panel_info;
+
+-#endif /* CONFIG_MPC823 or CONFIG_PXA250 */
++#elif defined CONFIG_ATMEL_LCDC
++struct lcdc_bitfield {
++ u32 offset; /* beginning of bitfield */
++ u32 length; /* length of bitfield */
++ u32 msb_right; /* != 0 : Most significant bit is right */
++};
++
++struct lcdc_var_screeninfo {
++ u32 xres; /* visible resolution */
++ u32 yres;
++ u32 xres_virtual; /* virtual resolution */
++ u32 yres_virtual;
++ u32 xoffset; /* offset from virtual to visible */
++ u32 yoffset; /* resolution */
++
++ u32 bits_per_pixel; /* guess what */
++ u32 grayscale; /* != 0 Graylevels instead of colors */
++
++ struct lcdc_bitfield red; /* bitfield in fb mem if true color, */
++ struct lcdc_bitfield green; /* else only length is significant */
++ struct lcdc_bitfield blue;
++ struct lcdc_bitfield transp; /* transparency */
++
++ u32 nonstd; /* != 0 Non standard pixel format */
++
++ u32 activate; /* see FB_ACTIVATE_* */
++
++ u32 height; /* height of picture in mm */
++ u32 width; /* width of picture in mm */
++
++ u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
++
++ /* Timing: All values in pixclocks, except pixclock (of course) */
++ u32 pixclock; /* pixel clock in ps (pico seconds) */
++ u32 left_margin; /* time from sync to picture */
++ u32 right_margin; /* time from picture to sync */
++ u32 upper_margin; /* time from sync to picture */
++ u32 lower_margin;
++ u32 hsync_len; /* length of horizontal sync */
++ u32 vsync_len; /* length of vertical sync */
++ u32 sync; /* see FB_SYNC_* */
++ u32 vmode; /* see FB_VMODE_* */
++ u32 rotate; /* angle we rotate counter clockwise */
++ u32 reserved[5]; /* Reserved for future compatibility */
++};
++
++/*
++ * Atmel LCDC DMA descriptor
++ */
++struct lcdc_dma_descriptor {
++ u_long fdadr; /* Frame descriptor address register */
++ u_long fsadr; /* Frame source address register */
++ u_long fidr; /* Frame ID register */
++ u_long ldcmd; /* Command register */
++};
++
++/*
++ * Atmel LCDC info
++ */
++struct lcdc_info {
++ u_long reg_lccr3;
++ u_long reg_lccr2;
++ u_long reg_lccr1;
++ u_long reg_lccr0;
++ u_long fdadr0;
++ u_long fdadr1;
++
++ void *regs;
++
++ u_long guard_time;
++ u_long xres;
++ u_long yres;
++ u_long xres_virtual;
++ u_long yres_virtual;
++ u_long bits_per_pixel;
++ u_long smem_start;
++ u_long line_length;
++ u_long visual;
++
++ u_long pixclock;
++ u_long left_margin;
++ u_long right_margin;
++ u_long upper_margin;
++ u_long lower_margin;
++ u_long hsync_len;
++ u_long vsync_len;
++ u_long sync;
++ u_long yoffset;
++ u_long xoffset;
++
++ struct lcdc_var_screeninfo var;
++
++ /* DMA descriptors */
++ struct lcdc_dma_descriptor *dmadesc_fblow;
++ struct lcdc_dma_descriptor *dmadesc_fbhigh;
++ struct lcdc_dma_descriptor *dmadesc_palette;
++
++ u_long screen; /* physical address of frame buffer */
++ u_long palette; /* physical address of palette memory */
++ u_int palette_size;
++
++ /* Device resource */
++ const struct device *dev;
++};
++
++/*
++ * LCD controller stucture for AVR32 CPU
++ */
++typedef struct vidinfo {
++ ushort vl_col; /* Number of columns (i.e. 640) */
++ ushort vl_row; /* Number of rows (i.e. 480) */
++ ushort vl_width; /* Width of display area in millimeters */
++ ushort vl_height; /* Height of display area in millimeters */
++
++ /* LCD configuration register */
++ u_char vl_clkp; /* Clock polarity */
++ u_char vl_oep; /* Output Enable polarity */
++ u_char vl_hsp; /* Horizontal Sync polarity */
++ u_char vl_vsp; /* Vertical Sync polarity */
++ u_char vl_dp; /* Data polarity */
++ u_char vl_bpix; /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */
++ u_char vl_lbw; /* LCD Bus width, 0 = 4, 1 = 8 */
++ u_char vl_splt; /* Split display, 0 = single-scan, 1 = dual-scan */
++ u_char vl_clor; /* Color, 0 = mono, 1 = color */
++ u_char vl_tft; /* 0 = passive, 1 = TFT */
++
++ /* Horizontal control register. Timing from data sheet */
++ ushort vl_hpw; /* Horz sync pulse width */
++ u_char vl_blw; /* Wait before of line */
++ u_char vl_elw; /* Wait end of line */
++
++ /* Vertical control register. */
++ u_char vl_vpw; /* Vertical sync pulse width */
++ u_char vl_bfw; /* Wait before of frame */
++ u_char vl_efw; /* Wait end of frame */
++
++ /* Atmel LCDC controller params */
++ struct lcdc_info *lcdc;
++ u_long pixclock;
++ u_long left_margin;
++ u_long right_margin;
++ u_long upper_margin;
++ u_long lower_margin;
++ u_long hsync_len;
++ u_long vsync_len;
++ u_long sync;
++ u_long yoffset;
++ u_long xoffset;
++} vidinfo_t;
++
++extern vidinfo_t panel_info;
++
++#endif /* CONFIG_MPC823 or CONFIG_PXA250 or CONFIG_ATMEL_LCDC */
+
+ /* Video functions */
+
+@@ -184,6 +336,16 @@
+ #define LCD_COLOR4 2
+ #define LCD_COLOR8 3
+ #define LCD_COLOR16 4
++#define LCD_COLOR32 5
++#define LCD_COLOR15 15
++#define LCD_COLOR24 24
++
++#define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */
++#define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */
++#define FB_VISUAL_TRUECOLOR 2 /* True color */
++#define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */
++#define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */
++#define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */
+
+ /*----------------------------------------------------------------------*/
+ #if defined(CONFIG_LCD_INFO_BELOW_LOGO)
+@@ -235,7 +397,7 @@
+ # define CONSOLE_COLOR_GREY 14
+ # define CONSOLE_COLOR_WHITE 15 /* Must remain last / highest */
+
+-#else
++#elif LCD_BPP == LCD_COLOR16
+
+ /*
+ * 16bpp color definitions
+@@ -243,6 +405,14 @@
+ # define CONSOLE_COLOR_BLACK 0x0000
+ # define CONSOLE_COLOR_WHITE 0xffff /* Must remain last / highest */
+
++#else
++
++/*
++ * 24bpp color definitions
++ */
++# define CONSOLE_COLOR_BLACK 0x000000
++# define CONSOLE_COLOR_WHITE 0xffffff /* Must remain last / highest */
++
+ #endif /* color definitions */
+
+ /************************************************************************/
+@@ -274,6 +444,8 @@
+ (c) << 4 | (c) << 5 | (c) << 6 | (c) << 7)
+ #elif LCD_BPP == LCD_COLOR8
+ # define COLOR_MASK(c) (c)
++#elif LCD_BPP == LCD_COLOR24
++# define COLOR_MASK(c) (c)
+ #else
+ # error Unsupported LCD BPP.
+ #endif