common lcd: simplify lcd_display_bitmap
Move highly platform dependant code into its own functions to reduce the number of #ifdefs in lcd_display_bitmap To avoid breaking the mcc200 board which does not #define CONFIG_CMD_BMP, this patch also implements bmp_display() for mcc200. Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il> Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>
This commit is contained in:
parent
203c37b8c5
commit
bfdcc65e11
|
@ -21,6 +21,7 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <lcd.h>
|
#include <lcd.h>
|
||||||
#include <mpc5xxx.h>
|
#include <mpc5xxx.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
#ifdef CONFIG_LCD
|
#ifdef CONFIG_LCD
|
||||||
|
|
||||||
|
@ -210,4 +211,23 @@ void show_progress (int size, int tot)
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int bmp_display(ulong addr, int x, int y)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
bmp_image_t *bmp = (bmp_image_t *)addr;
|
||||||
|
|
||||||
|
if (!bmp) {
|
||||||
|
printf("There is no valid bmp file at the given address\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = lcd_display_bitmap((ulong)bmp, x, y);
|
||||||
|
|
||||||
|
if ((unsigned long)bmp != addr)
|
||||||
|
free(bmp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_LCD */
|
#endif /* CONFIG_LCD */
|
||||||
|
|
44
common/lcd.c
44
common/lcd.c
|
@ -636,6 +636,29 @@ static void splash_align_axis(int *axis, unsigned long panel_size,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined CONFIG_CPU_PXA || defined(CONFIG_ATMEL_LCD)
|
||||||
|
#define FB_PUT_BYTE(fb, from) *(fb)++ = *(from)++
|
||||||
|
#elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200)
|
||||||
|
#define FB_PUT_BYTE(fb, from) *(fb)++ = (255 - *(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)
|
int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_MCC200)
|
#if !defined(CONFIG_MCC200)
|
||||||
|
@ -761,11 +784,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
for (j = 0; j < width; j++) {
|
for (j = 0; j < width; j++) {
|
||||||
if (bpix != 16) {
|
if (bpix != 16) {
|
||||||
#if defined(CONFIG_CPU_PXA) || defined(CONFIG_ATMEL_LCD)
|
FB_PUT_BYTE(fb, bmap);
|
||||||
*(fb++) = *(bmap++);
|
|
||||||
#elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200)
|
|
||||||
*(fb++) = 255 - *(bmap++);
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
*(uint16_t *)fb = cmap_base[*(bmap++)];
|
*(uint16_t *)fb = cmap_base[*(bmap++)];
|
||||||
fb += sizeof(uint16_t) / sizeof(*fb);
|
fb += sizeof(uint16_t) / sizeof(*fb);
|
||||||
|
@ -780,18 +799,9 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
||||||
case 16:
|
case 16:
|
||||||
for (i = 0; i < height; ++i) {
|
for (i = 0; i < height; ++i) {
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
for (j = 0; j < width; j++) {
|
for (j = 0; j < width; j++)
|
||||||
#if defined(CONFIG_ATMEL_LCD_BGR555)
|
fb_put_word(&fb, &bmap);
|
||||||
*(fb++) = ((bmap[0] & 0x1f) << 2) |
|
|
||||||
(bmap[1] & 0x03);
|
|
||||||
*(fb++) = (bmap[0] & 0xe0) |
|
|
||||||
((bmap[1] & 0x7c) >> 2);
|
|
||||||
bmap += 2;
|
|
||||||
#else
|
|
||||||
*(fb++) = *(bmap++);
|
|
||||||
*(fb++) = *(bmap++);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
bmap += (padded_line - width) * 2;
|
bmap += (padded_line - width) * 2;
|
||||||
fb -= (width * 2 + lcd_line_length);
|
fb -= (width * 2 + lcd_line_length);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue