[U-Boot] [PATCH] Add 16bpp BMP support

This patch adds 16bpp BMP support to the common lcd code.
At the moment it's only been tested on the MIMC200 AVR32 board, but the hooks are in place to extend this to other platforms.
Signed-off-by: Mark Jackson mpfj@mimc.co.uk ---
common/lcd.c | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/common/lcd.c b/common/lcd.c index ae79051..93dbd3c 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -84,7 +84,7 @@ extern void lcd_enable (void); static void *lcd_logo (void);
-#if LCD_BPP == LCD_COLOR8 +#if (LCD_BPP == LCD_COLOR8) || (LCD_BPP == LCD_COLOR16) extern void lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue); #endif @@ -656,7 +656,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
bpix = NBITS(panel_info.vl_bpix);
- if ((bpix != 1) && (bpix != 8)) { + if ((bpix != 1) && (bpix != 8) && (bpix != 16)) { printf ("Error: %d bit/pixel mode not supported by U-Boot\n", bpix); return 1; @@ -738,17 +738,51 @@ int lcd_display_bitmap(ulong bmp_image, int x, int 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++) + + switch (bpix) { + case 1: /* pass through */ + case 8: + for (i = 0; i < height; ++i) { + WATCHDOG_RESET(); + for (j = 0; j < width ; j++) #if defined(CONFIG_PXA250) || defined(CONFIG_ATMEL_LCD) - *(fb++) = *(bmap++); + *(fb++) = *(bmap++); #elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200) - *(fb++)=255-*(bmap++); + *(fb++)=255-*(bmap++); #endif - bmap += (width - padded_line); - fb -= (width + lcd_line_length); - } + bmap += (width - padded_line); + fb -= (width + lcd_line_length); + } + break; + + case 16: + for (i = 0; i < height; ++i) { + WATCHDOG_RESET(); + for (j = 0; j < width; j++) { +#if defined(CONFIG_PXA250) +#error 16 bpp support not added for PXA250 +#elif defined(CONFIG_ATMEL_LCD) +#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 +#elif defined(CONFIG_MPC823) +#error 16 bpp support not added for MPC823 +#elif defined(CONFIG_MCC200) +#error 16 bpp support not added for MCC200 +#endif + } + bmap += (padded_line - width) * 2; + fb -= (width * 2 + lcd_line_length); + } + break; + default: + break; + };
return (0); }

Dear Mark Jackson,
In message 497EDF68.7050801@mimc.co.uk you wrote:
This patch adds 16bpp BMP support to the common lcd code.
At the moment it's only been tested on the MIMC200 AVR32 board, but the hooks are in place to extend this to other platforms.
Signed-off-by: Mark Jackson mpfj@mimc.co.uk
...
- case 16:
for (i = 0; i < height; ++i) {
WATCHDOG_RESET();
for (j = 0; j < width; j++) {
+#if defined(CONFIG_PXA250) +#error 16 bpp support not added for PXA250 +#elif defined(CONFIG_ATMEL_LCD) +#if defined(CONFIG_ATMEL_LCD_BGR555)
Oops. Right in the middle of a for loop? This is probably not exactly a good place for the placement of such a generic compile time check.
*(fb++) = ((bmap[0] & 0x1f) << 2) | (bmap[1] & 0x03);
*(fb++) = (bmap[0] & 0xe0) | ((bmap[1] & 0x7c) >> 2);
bmap += 2;
+#else
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
+#endif +#elif defined(CONFIG_MPC823) +#error 16 bpp support not added for MPC823 +#elif defined(CONFIG_MCC200) +#error 16 bpp support not added for MCC200 +#endif
Ditto here.
I don't like this approach. The code is too ugly. If you need dfferent versions, thatn factor out the different code into functions, or similar.
NAK.
Best regards,
Wolfgang Denk
participants (2)
-
Mark Jackson
-
Wolfgang Denk