|
@@ -498,23 +498,43 @@ static int lcd_getbgcolor(void)
|
|
|
/************************************************************************/
|
|
|
/* ** Chipset depending Bitmap / Logo stuff... */
|
|
|
/************************************************************************/
|
|
|
+static inline ushort *configuration_get_cmap(void)
|
|
|
+{
|
|
|
+#if defined CONFIG_CPU_PXA
|
|
|
+ struct pxafb_info *fbi = &panel_info.pxa;
|
|
|
+ return (ushort *)fbi->palette;
|
|
|
+#elif defined(CONFIG_MPC823)
|
|
|
+ immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
|
|
|
+ cpm8xx_t *cp = &(immr->im_cpm);
|
|
|
+ return (ushort *)&(cp->lcd_cmap[255 * sizeof(ushort)]);
|
|
|
+#elif defined(CONFIG_ATMEL_LCD)
|
|
|
+ return (ushort *)(panel_info.mmio + ATMEL_LCDC_LUT(0));
|
|
|
+#elif !defined(CONFIG_ATMEL_HLCD) && !defined(CONFIG_EXYNOS_FB)
|
|
|
+ return panel_info.cmap;
|
|
|
+#else
|
|
|
+#if defined(CONFIG_LCD_LOGO)
|
|
|
+ return bmp_logo_palette;
|
|
|
+#else
|
|
|
+ return NULL;
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_LCD_LOGO
|
|
|
void bitmap_plot(int x, int y)
|
|
|
{
|
|
|
#ifdef CONFIG_ATMEL_LCD
|
|
|
- uint *cmap;
|
|
|
+ uint *cmap = (uint *)bmp_logo_palette;
|
|
|
#else
|
|
|
- ushort *cmap;
|
|
|
+ ushort *cmap = (ushort *)bmp_logo_palette;
|
|
|
#endif
|
|
|
ushort i, j;
|
|
|
uchar *bmap;
|
|
|
uchar *fb;
|
|
|
ushort *fb16;
|
|
|
-#if defined(CONFIG_CPU_PXA)
|
|
|
- struct pxafb_info *fbi = &panel_info.pxa;
|
|
|
-#elif defined(CONFIG_MPC823)
|
|
|
- volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
|
|
|
- volatile cpm8xx_t *cp = &(immr->im_cpm);
|
|
|
+#if defined(CONFIG_MPC823)
|
|
|
+ immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
|
|
|
+ cpm8xx_t *cp = &(immr->im_cpm);
|
|
|
#endif
|
|
|
|
|
|
debug("Logo: width %d height %d colors %d cmap %d\n",
|
|
@@ -525,20 +545,17 @@ void bitmap_plot(int x, int y)
|
|
|
fb = (uchar *)(lcd_base + y * lcd_line_length + x);
|
|
|
|
|
|
if (NBITS(panel_info.vl_bpix) < 12) {
|
|
|
- /* Leave room for default color map */
|
|
|
-#if defined(CONFIG_CPU_PXA)
|
|
|
- cmap = (ushort *) fbi->palette;
|
|
|
-#elif defined(CONFIG_MPC823)
|
|
|
+ /* Leave room for default color map
|
|
|
+ * default case: generic system with no cmap (most likely 16bpp)
|
|
|
+ * cmap was set to the source palette, so no change is done.
|
|
|
+ * This avoids even more ifdefs in the next stanza
|
|
|
+ */
|
|
|
+#if defined(CONFIG_MPC823)
|
|
|
cmap = (ushort *) &(cp->lcd_cmap[BMP_LOGO_OFFSET * sizeof(ushort)]);
|
|
|
#elif defined(CONFIG_ATMEL_LCD)
|
|
|
- cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));
|
|
|
+ cmap = (uint *)configuration_get_cmap();
|
|
|
#else
|
|
|
- /*
|
|
|
- * default case: generic system with no cmap (most likely 16bpp)
|
|
|
- * We set cmap to the source palette, so no change is done.
|
|
|
- * This avoids even more ifdef in the next stanza
|
|
|
- */
|
|
|
- cmap = bmp_logo_palette;
|
|
|
+ cmap = configuration_get_cmap();
|
|
|
#endif
|
|
|
|
|
|
WATCHDOG_RESET();
|
|
@@ -607,7 +624,46 @@ static inline void bitmap_plot(int x, int y) {}
|
|
|
|
|
|
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
|
|
|
#define BMP_ALIGN_CENTER 0x7FFF
|
|
|
+
|
|
|
+static void splash_align_axis(int *axis, unsigned long panel_size,
|
|
|
+ unsigned long picture_size)
|
|
|
+{
|
|
|
+ unsigned long panel_picture_delta = panel_size - picture_size;
|
|
|
+ unsigned long axis_alignment;
|
|
|
+
|
|
|
+ if (*axis == BMP_ALIGN_CENTER)
|
|
|
+ axis_alignment = panel_picture_delta / 2;
|
|
|
+ else if (*axis < 0)
|
|
|
+ axis_alignment = panel_picture_delta + *axis + 1;
|
|
|
+ else
|
|
|
+ return;
|
|
|
+
|
|
|
+ *axis = max(0, axis_alignment);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(CONFIG_MPC823) || defined(CONFIG_MCC200)
|
|
|
+#define FB_PUT_BYTE(fb, from) *(fb)++ = (255 - *(from)++)
|
|
|
+#else
|
|
|
+#define FB_PUT_BYTE(fb, from) *(fb)++ = *(from)++
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(CONFIG_BMP_16BPP)
|
|
|
+#if defined(CONFIG_ATMEL_LCD_BGR555)
|
|
|
+static inline void fb_put_word(uchar **fb, uchar **from)
|
|
|
+{
|
|
|
+ *(*fb)++ = (((*from)[0] & 0x1f) << 2) | ((*from)[1] & 0x03);
|
|
|
+ *(*fb)++ = ((*from)[0] & 0xe0) | (((*from)[1] & 0x7c) >> 2);
|
|
|
+ *from += 2;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void fb_put_word(uchar **fb, uchar **from)
|
|
|
+{
|
|
|
+ *(*fb)++ = *(*from)++;
|
|
|
+ *(*fb)++ = *(*from)++;
|
|
|
+}
|
|
|
#endif
|
|
|
+#endif /* CONFIG_BMP_16BPP */
|
|
|
|
|
|
int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
{
|
|
@@ -623,14 +679,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
unsigned long width, height, byte_width;
|
|
|
unsigned long pwidth = panel_info.vl_col;
|
|
|
unsigned colors, bpix, bmp_bpix;
|
|
|
-#if defined(CONFIG_CPU_PXA)
|
|
|
- struct pxafb_info *fbi = &panel_info.pxa;
|
|
|
-#elif defined(CONFIG_MPC823)
|
|
|
- volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
|
|
|
- volatile cpm8xx_t *cp = &(immr->im_cpm);
|
|
|
-#endif
|
|
|
|
|
|
- if (!((bmp->header.signature[0] == 'B') &&
|
|
|
+ if (!bmp || !((bmp->header.signature[0] == 'B') &&
|
|
|
(bmp->header.signature[1] == 'M'))) {
|
|
|
printf("Error: no valid bmp image at %lx\n", bmp_image);
|
|
|
|
|
@@ -666,14 +716,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
#if !defined(CONFIG_MCC200)
|
|
|
/* MCC200 LCD doesn't need CMAP, supports 1bpp b&w only */
|
|
|
if (bmp_bpix == 8) {
|
|
|
-#if defined(CONFIG_CPU_PXA)
|
|
|
- cmap = (ushort *)fbi->palette;
|
|
|
-#elif defined(CONFIG_MPC823)
|
|
|
- cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
|
|
|
-#elif !defined(CONFIG_ATMEL_LCD) && !defined(CONFIG_EXYNOS_FB)
|
|
|
- cmap = panel_info.cmap;
|
|
|
-#endif
|
|
|
-
|
|
|
+ cmap = configuration_get_cmap();
|
|
|
cmap_base = cmap;
|
|
|
|
|
|
/* Set color map */
|
|
@@ -722,15 +765,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);
|
|
|
|
|
|
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
|
|
|
- if (x == BMP_ALIGN_CENTER)
|
|
|
- x = max(0, (pwidth - width) / 2);
|
|
|
- else if (x < 0)
|
|
|
- x = max(0, pwidth - width + x + 1);
|
|
|
-
|
|
|
- if (y == BMP_ALIGN_CENTER)
|
|
|
- y = max(0, (panel_info.vl_row - height) / 2);
|
|
|
- else if (y < 0)
|
|
|
- y = max(0, panel_info.vl_row - height + y + 1);
|
|
|
+ splash_align_axis(&x, pwidth, width);
|
|
|
+ splash_align_axis(&y, panel_info.vl_row, height);
|
|
|
#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
|
|
|
|
|
|
if ((x + width) > pwidth)
|
|
@@ -754,11 +790,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
WATCHDOG_RESET();
|
|
|
for (j = 0; j < width; j++) {
|
|
|
if (bpix != 16) {
|
|
|
-#if defined(CONFIG_CPU_PXA) || defined(CONFIG_ATMEL_LCD)
|
|
|
- *(fb++) = *(bmap++);
|
|
|
-#elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200)
|
|
|
- *(fb++) = 255 - *(bmap++);
|
|
|
-#endif
|
|
|
+ FB_PUT_BYTE(fb, bmap);
|
|
|
} else {
|
|
|
*(uint16_t *)fb = cmap_base[*(bmap++)];
|
|
|
fb += sizeof(uint16_t) / sizeof(*fb);
|
|
@@ -773,18 +805,9 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
case 16:
|
|
|
for (i = 0; i < height; ++i) {
|
|
|
WATCHDOG_RESET();
|
|
|
- for (j = 0; j < width; j++) {
|
|
|
-#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
|
|
|
- }
|
|
|
+ for (j = 0; j < width; j++)
|
|
|
+ fb_put_word(&fb, &bmap);
|
|
|
+
|
|
|
bmap += (padded_line - width) * 2;
|
|
|
fb -= (width * 2 + lcd_line_length);
|
|
|
}
|
|
@@ -842,17 +865,7 @@ static void *lcd_logo(void)
|
|
|
}
|
|
|
#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
|
|
|
|
|
|
-#ifdef CONFIG_VIDEO_BMP_GZIP
|
|
|
- bmp_image_t *bmp = (bmp_image_t *)addr;
|
|
|
- unsigned long len;
|
|
|
-
|
|
|
- if (!((bmp->header.signature[0] == 'B') &&
|
|
|
- (bmp->header.signature[1] == 'M'))) {
|
|
|
- addr = (ulong)gunzip_bmp(addr, &len);
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- if (lcd_display_bitmap(addr, x, y) == 0)
|
|
|
+ if (bmp_display(addr, x, y) == 0)
|
|
|
return (void *)lcd_base;
|
|
|
}
|
|
|
#endif /* CONFIG_SPLASH_SCREEN */
|