|
|
|
@ -76,42 +76,42 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
|
|
|
|
ulong lcd_setmem (ulong addr);
|
|
|
|
|
|
|
|
|
|
static void lcd_drawchars (ushort x, ushort y, uchar *str, int count);
|
|
|
|
|
static inline void lcd_puts_xy (ushort x, ushort y, uchar *s);
|
|
|
|
|
static inline void lcd_putc_xy (ushort x, ushort y, uchar c);
|
|
|
|
|
static void lcd_drawchars(ushort x, ushort y, uchar *str, int count);
|
|
|
|
|
static inline void lcd_puts_xy(ushort x, ushort y, uchar *s);
|
|
|
|
|
static inline void lcd_putc_xy(ushort x, ushort y, uchar c);
|
|
|
|
|
|
|
|
|
|
static int lcd_init (void *lcdbase);
|
|
|
|
|
static int lcd_init(void *lcdbase);
|
|
|
|
|
|
|
|
|
|
static void *lcd_logo (void);
|
|
|
|
|
|
|
|
|
|
static int lcd_getbgcolor (void);
|
|
|
|
|
static void lcd_setfgcolor (int color);
|
|
|
|
|
static void lcd_setbgcolor (int color);
|
|
|
|
|
static int lcd_getbgcolor(void);
|
|
|
|
|
static void lcd_setfgcolor(int color);
|
|
|
|
|
static void lcd_setbgcolor(int color);
|
|
|
|
|
|
|
|
|
|
char lcd_is_enabled = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef NOT_USED_SO_FAR
|
|
|
|
|
static void lcd_getcolreg (ushort regno,
|
|
|
|
|
static void lcd_getcolreg(ushort regno,
|
|
|
|
|
ushort *red, ushort *green, ushort *blue);
|
|
|
|
|
static int lcd_getfgcolor (void);
|
|
|
|
|
static int lcd_getfgcolor(void);
|
|
|
|
|
#endif /* NOT_USED_SO_FAR */
|
|
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static void console_scrollup (void)
|
|
|
|
|
static void console_scrollup(void)
|
|
|
|
|
{
|
|
|
|
|
/* Copy up rows ignoring the first one */
|
|
|
|
|
memcpy (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, CONSOLE_SCROLL_SIZE);
|
|
|
|
|
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);
|
|
|
|
|
memset(CONSOLE_ROW_LAST, COLOR_MASK(lcd_color_bg), CONSOLE_ROW_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static inline void console_back (void)
|
|
|
|
|
static inline void console_back(void)
|
|
|
|
|
{
|
|
|
|
|
if (--console_col < 0) {
|
|
|
|
|
console_col = CONSOLE_COLS-1 ;
|
|
|
|
@ -120,14 +120,13 @@ static inline void console_back (void)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lcd_putc_xy (console_col * VIDEO_FONT_WIDTH,
|
|
|
|
|
console_row * VIDEO_FONT_HEIGHT,
|
|
|
|
|
' ');
|
|
|
|
|
lcd_putc_xy(console_col * VIDEO_FONT_WIDTH,
|
|
|
|
|
console_row * VIDEO_FONT_HEIGHT, ' ');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static inline void console_newline (void)
|
|
|
|
|
static inline void console_newline(void)
|
|
|
|
|
{
|
|
|
|
|
++console_row;
|
|
|
|
|
console_col = 0;
|
|
|
|
@ -135,61 +134,62 @@ static inline void console_newline (void)
|
|
|
|
|
/* Check if we need to scroll the terminal */
|
|
|
|
|
if (console_row >= CONSOLE_ROWS) {
|
|
|
|
|
/* Scroll everything up */
|
|
|
|
|
console_scrollup () ;
|
|
|
|
|
console_scrollup();
|
|
|
|
|
--console_row;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
void lcd_putc (const char c)
|
|
|
|
|
void lcd_putc(const char c)
|
|
|
|
|
{
|
|
|
|
|
if (!lcd_is_enabled) {
|
|
|
|
|
serial_putc(c);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (c) {
|
|
|
|
|
case '\r': console_col = 0;
|
|
|
|
|
return;
|
|
|
|
|
case '\r':
|
|
|
|
|
console_col = 0;
|
|
|
|
|
|
|
|
|
|
case '\n': console_newline();
|
|
|
|
|
return;
|
|
|
|
|
return;
|
|
|
|
|
case '\n':
|
|
|
|
|
console_newline();
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
case '\t': /* Tab (8 chars alignment) */
|
|
|
|
|
console_col += 8;
|
|
|
|
|
console_col &= ~7;
|
|
|
|
|
console_col += 8;
|
|
|
|
|
console_col &= ~7;
|
|
|
|
|
|
|
|
|
|
if (console_col >= CONSOLE_COLS) {
|
|
|
|
|
console_newline();
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
if (console_col >= CONSOLE_COLS)
|
|
|
|
|
console_newline();
|
|
|
|
|
|
|
|
|
|
case '\b': console_back();
|
|
|
|
|
return;
|
|
|
|
|
return;
|
|
|
|
|
case '\b':
|
|
|
|
|
console_back();
|
|
|
|
|
|
|
|
|
|
default: lcd_putc_xy (console_col * VIDEO_FONT_WIDTH,
|
|
|
|
|
console_row * VIDEO_FONT_HEIGHT,
|
|
|
|
|
c);
|
|
|
|
|
if (++console_col >= CONSOLE_COLS) {
|
|
|
|
|
console_newline();
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
return;
|
|
|
|
|
default:
|
|
|
|
|
lcd_putc_xy(console_col * VIDEO_FONT_WIDTH,
|
|
|
|
|
console_row * VIDEO_FONT_HEIGHT, c);
|
|
|
|
|
if (++console_col >= CONSOLE_COLS)
|
|
|
|
|
console_newline();
|
|
|
|
|
}
|
|
|
|
|
/* NOTREACHED */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
void lcd_puts (const char *s)
|
|
|
|
|
void lcd_puts(const char *s)
|
|
|
|
|
{
|
|
|
|
|
if (!lcd_is_enabled) {
|
|
|
|
|
serial_puts (s);
|
|
|
|
|
serial_puts(s);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (*s) {
|
|
|
|
|
lcd_putc (*s++);
|
|
|
|
|
lcd_putc(*s++);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -211,7 +211,7 @@ void lcd_printf(const char *fmt, ...)
|
|
|
|
|
/* ** Low-Level Graphics Routines */
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
|
|
|
|
|
static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
|
|
|
|
|
static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
|
|
|
|
|
{
|
|
|
|
|
uchar *dest;
|
|
|
|
|
ushort row;
|
|
|
|
@ -226,7 +226,7 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
|
|
|
|
|
|
|
|
|
|
dest = (uchar *)(lcd_base + y * lcd_line_length + x * (1 << LCD_BPP) / 8);
|
|
|
|
|
|
|
|
|
|
for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) {
|
|
|
|
|
for (row = 0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) {
|
|
|
|
|
uchar *s = str;
|
|
|
|
|
int i;
|
|
|
|
|
#if LCD_BPP == LCD_COLOR16
|
|
|
|
@ -239,7 +239,7 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
|
|
|
|
|
uchar rest = *d & -(1 << (8-off));
|
|
|
|
|
uchar sym;
|
|
|
|
|
#endif
|
|
|
|
|
for (i=0; i<count; ++i) {
|
|
|
|
|
for (i = 0; i < count; ++i) {
|
|
|
|
|
uchar c, bits;
|
|
|
|
|
|
|
|
|
|
c = *s++;
|
|
|
|
@ -247,18 +247,18 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
|
|
|
|
|
|
|
|
|
|
#if LCD_BPP == LCD_MONOCHROME
|
|
|
|
|
sym = (COLOR_MASK(lcd_color_fg) & bits) |
|
|
|
|
|
(COLOR_MASK(lcd_color_bg) & ~bits);
|
|
|
|
|
(COLOR_MASK(lcd_color_bg) & ~bits);
|
|
|
|
|
|
|
|
|
|
*d++ = rest | (sym >> off);
|
|
|
|
|
rest = sym << (8-off);
|
|
|
|
|
#elif LCD_BPP == LCD_COLOR8
|
|
|
|
|
for (c=0; c<8; ++c) {
|
|
|
|
|
for (c = 0; c < 8; ++c) {
|
|
|
|
|
*d++ = (bits & 0x80) ?
|
|
|
|
|
lcd_color_fg : lcd_color_bg;
|
|
|
|
|
bits <<= 1;
|
|
|
|
|
}
|
|
|
|
|
#elif LCD_BPP == LCD_COLOR16
|
|
|
|
|
for (c=0; c<8; ++c) {
|
|
|
|
|
for (c = 0; c < 8; ++c) {
|
|
|
|
|
*d++ = (bits & 0x80) ?
|
|
|
|
|
lcd_color_fg : lcd_color_bg;
|
|
|
|
|
bits <<= 1;
|
|
|
|
@ -273,14 +273,14 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static inline void lcd_puts_xy (ushort x, ushort y, uchar *s)
|
|
|
|
|
static inline void lcd_puts_xy(ushort x, ushort y, uchar *s)
|
|
|
|
|
{
|
|
|
|
|
lcd_drawchars(x, y, s, strlen((char *)s));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static inline void lcd_putc_xy (ushort x, ushort y, uchar c)
|
|
|
|
|
static inline void lcd_putc_xy(ushort x, ushort y, uchar c)
|
|
|
|
|
{
|
|
|
|
|
lcd_drawchars(x, y, &c, 1);
|
|
|
|
|
}
|
|
|
|
@ -298,7 +298,7 @@ static int test_colors[N_BLK_HOR*N_BLK_VERT] = {
|
|
|
|
|
CONSOLE_COLOR_BLUE, CONSOLE_COLOR_MAGENTA, CONSOLE_COLOR_CYAN,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void test_pattern (void)
|
|
|
|
|
static void test_pattern(void)
|
|
|
|
|
{
|
|
|
|
|
ushort v_max = panel_info.vl_row;
|
|
|
|
|
ushort h_max = panel_info.vl_col;
|
|
|
|
@ -307,13 +307,13 @@ static void test_pattern (void)
|
|
|
|
|
ushort v, h;
|
|
|
|
|
uchar *pix = (uchar *)lcd_base;
|
|
|
|
|
|
|
|
|
|
printf ("[LCD] Test Pattern: %d x %d [%d x %d]\n",
|
|
|
|
|
printf("[LCD] Test Pattern: %d x %d [%d x %d]\n",
|
|
|
|
|
h_max, v_max, h_step, v_step);
|
|
|
|
|
|
|
|
|
|
/* WARNING: Code silently assumes 8bit/pixel */
|
|
|
|
|
for (v=0; v<v_max; ++v) {
|
|
|
|
|
for (v = 0; v < v_max; ++v) {
|
|
|
|
|
uchar iy = v / v_step;
|
|
|
|
|
for (h=0; h<h_max; ++h) {
|
|
|
|
|
for (h = 0; h < h_max; ++h) {
|
|
|
|
|
uchar ix = N_BLK_HOR * iy + (h/h_step);
|
|
|
|
|
*pix++ = test_colors[ix];
|
|
|
|
|
}
|
|
|
|
@ -335,12 +335,12 @@ int drv_lcd_init (void)
|
|
|
|
|
|
|
|
|
|
lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
|
|
|
|
|
|
|
|
|
|
lcd_init (lcd_base); /* LCD initialization */
|
|
|
|
|
lcd_init(lcd_base); /* LCD initialization */
|
|
|
|
|
|
|
|
|
|
/* Device initialization */
|
|
|
|
|
memset (&lcddev, 0, sizeof (lcddev));
|
|
|
|
|
memset(&lcddev, 0, sizeof(lcddev));
|
|
|
|
|
|
|
|
|
|
strcpy (lcddev.name, "lcd");
|
|
|
|
|
strcpy(lcddev.name, "lcd");
|
|
|
|
|
lcddev.ext = 0; /* No extensions */
|
|
|
|
|
lcddev.flags = DEV_FLAGS_OUTPUT; /* Output only */
|
|
|
|
|
lcddev.putc = lcd_putc; /* 'putc' function */
|
|
|
|
@ -367,35 +367,35 @@ void lcd_clear(void)
|
|
|
|
|
|
|
|
|
|
#elif LCD_BPP == LCD_COLOR8
|
|
|
|
|
/* Setting the palette */
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_BLACK, 0, 0, 0);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_RED, 0xFF, 0, 0);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_GREEN, 0, 0xFF, 0);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_YELLOW, 0xFF, 0xFF, 0);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_BLUE, 0, 0, 0xFF);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_MAGENTA, 0xFF, 0, 0xFF);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_CYAN, 0, 0xFF, 0xFF);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_GREY, 0xAA, 0xAA, 0xAA);
|
|
|
|
|
lcd_setcolreg (CONSOLE_COLOR_WHITE, 0xFF, 0xFF, 0xFF);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_BLACK, 0, 0, 0);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_RED, 0xFF, 0, 0);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_GREEN, 0, 0xFF, 0);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_YELLOW, 0xFF, 0xFF, 0);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_BLUE, 0, 0, 0xFF);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_MAGENTA, 0xFF, 0, 0xFF);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_CYAN, 0, 0xFF, 0xFF);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_GREY, 0xAA, 0xAA, 0xAA);
|
|
|
|
|
lcd_setcolreg(CONSOLE_COLOR_WHITE, 0xFF, 0xFF, 0xFF);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef CONFIG_SYS_WHITE_ON_BLACK
|
|
|
|
|
lcd_setfgcolor (CONSOLE_COLOR_BLACK);
|
|
|
|
|
lcd_setbgcolor (CONSOLE_COLOR_WHITE);
|
|
|
|
|
lcd_setfgcolor(CONSOLE_COLOR_BLACK);
|
|
|
|
|
lcd_setbgcolor(CONSOLE_COLOR_WHITE);
|
|
|
|
|
#else
|
|
|
|
|
lcd_setfgcolor (CONSOLE_COLOR_WHITE);
|
|
|
|
|
lcd_setbgcolor (CONSOLE_COLOR_BLACK);
|
|
|
|
|
lcd_setfgcolor(CONSOLE_COLOR_WHITE);
|
|
|
|
|
lcd_setbgcolor(CONSOLE_COLOR_BLACK);
|
|
|
|
|
#endif /* CONFIG_SYS_WHITE_ON_BLACK */
|
|
|
|
|
|
|
|
|
|
#ifdef LCD_TEST_PATTERN
|
|
|
|
|
test_pattern();
|
|
|
|
|
#else
|
|
|
|
|
/* set framebuffer to background color */
|
|
|
|
|
memset ((char *)lcd_base,
|
|
|
|
|
memset((char *)lcd_base,
|
|
|
|
|
COLOR_MASK(lcd_getbgcolor()),
|
|
|
|
|
lcd_line_length*panel_info.vl_row);
|
|
|
|
|
#endif
|
|
|
|
|
/* Paint the logo and retrieve LCD base address */
|
|
|
|
|
debug ("[LCD] Drawing the logo...\n");
|
|
|
|
|
debug("[LCD] Drawing the logo...\n");
|
|
|
|
|
lcd_console_address = lcd_logo ();
|
|
|
|
|
|
|
|
|
|
console_col = 0;
|
|
|
|
@ -410,12 +410,12 @@ U_BOOT_CMD(
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static int lcd_init (void *lcdbase)
|
|
|
|
|
static int lcd_init(void *lcdbase)
|
|
|
|
|
{
|
|
|
|
|
/* Initialize the lcd controller */
|
|
|
|
|
debug ("[LCD] Initializing LCD frambuffer at %p\n", lcdbase);
|
|
|
|
|
debug("[LCD] Initializing LCD frambuffer at %p\n", lcdbase);
|
|
|
|
|
|
|
|
|
|
lcd_ctrl_init (lcdbase);
|
|
|
|
|
lcd_ctrl_init(lcdbase);
|
|
|
|
|
lcd_is_enabled = 1;
|
|
|
|
|
lcd_clear();
|
|
|
|
|
lcd_enable ();
|
|
|
|
@ -442,13 +442,13 @@ static int lcd_init (void *lcdbase)
|
|
|
|
|
*
|
|
|
|
|
* Note that this is running from ROM, so no write access to global data.
|
|
|
|
|
*/
|
|
|
|
|
ulong lcd_setmem (ulong addr)
|
|
|
|
|
ulong lcd_setmem(ulong addr)
|
|
|
|
|
{
|
|
|
|
|
ulong size;
|
|
|
|
|
int line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
|
|
|
|
|
int line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 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) );
|
|
|
|
|
debug("LCD panel info: %d x %d, %d bit/pix\n", panel_info.vl_col,
|
|
|
|
|
panel_info.vl_row, NBITS(panel_info.vl_bpix));
|
|
|
|
|
|
|
|
|
|
size = line_length * panel_info.vl_row;
|
|
|
|
|
|
|
|
|
@ -458,21 +458,21 @@ ulong lcd_setmem (ulong addr)
|
|
|
|
|
/* Allocate pages for the frame buffer. */
|
|
|
|
|
addr -= size;
|
|
|
|
|
|
|
|
|
|
debug ("Reserving %ldk for LCD Framebuffer at: %08lx\n", size>>10, addr);
|
|
|
|
|
debug("Reserving %ldk for LCD Framebuffer at: %08lx\n", size>>10, addr);
|
|
|
|
|
|
|
|
|
|
return (addr);
|
|
|
|
|
return addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static void lcd_setfgcolor (int color)
|
|
|
|
|
static void lcd_setfgcolor(int color)
|
|
|
|
|
{
|
|
|
|
|
lcd_color_fg = color;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static void lcd_setbgcolor (int color)
|
|
|
|
|
static void lcd_setbgcolor(int color)
|
|
|
|
|
{
|
|
|
|
|
lcd_color_bg = color;
|
|
|
|
|
}
|
|
|
|
@ -480,7 +480,7 @@ static void lcd_setbgcolor (int color)
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
#ifdef NOT_USED_SO_FAR
|
|
|
|
|
static int lcd_getfgcolor (void)
|
|
|
|
|
static int lcd_getfgcolor(void)
|
|
|
|
|
{
|
|
|
|
|
return lcd_color_fg;
|
|
|
|
|
}
|
|
|
|
@ -488,7 +488,7 @@ static int lcd_getfgcolor (void)
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
static int lcd_getbgcolor (void)
|
|
|
|
|
static int lcd_getbgcolor(void)
|
|
|
|
|
{
|
|
|
|
|
return lcd_color_bg;
|
|
|
|
|
}
|
|
|
|
@ -499,7 +499,7 @@ static int lcd_getbgcolor (void)
|
|
|
|
|
/* ** Chipset depending Bitmap / Logo stuff... */
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
#ifdef CONFIG_LCD_LOGO
|
|
|
|
|
void bitmap_plot (int x, int y)
|
|
|
|
|
void bitmap_plot(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
#ifdef CONFIG_ATMEL_LCD
|
|
|
|
|
uint *cmap;
|
|
|
|
@ -517,7 +517,7 @@ void bitmap_plot (int x, int y)
|
|
|
|
|
volatile cpm8xx_t *cp = &(immr->im_cpm);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
debug ("Logo: width %d height %d colors %d cmap %d\n",
|
|
|
|
|
debug("Logo: width %d height %d colors %d cmap %d\n",
|
|
|
|
|
BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, BMP_LOGO_COLORS,
|
|
|
|
|
ARRAY_SIZE(bmp_logo_palette));
|
|
|
|
|
|
|
|
|
@ -527,9 +527,9 @@ void bitmap_plot (int x, int y)
|
|
|
|
|
if (NBITS(panel_info.vl_bpix) < 12) {
|
|
|
|
|
/* Leave room for default color map */
|
|
|
|
|
#if defined(CONFIG_CPU_PXA)
|
|
|
|
|
cmap = (ushort *)fbi->palette;
|
|
|
|
|
cmap = (ushort *) fbi->palette;
|
|
|
|
|
#elif defined(CONFIG_MPC823)
|
|
|
|
|
cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);
|
|
|
|
|
cmap = (ushort *) &(cp->lcd_cmap[BMP_LOGO_OFFSET * sizeof(ushort)]);
|
|
|
|
|
#elif defined(CONFIG_ATMEL_LCD)
|
|
|
|
|
cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));
|
|
|
|
|
#else
|
|
|
|
@ -550,12 +550,12 @@ void bitmap_plot (int x, int y)
|
|
|
|
|
uint lut_entry;
|
|
|
|
|
#ifdef CONFIG_ATMEL_LCD_BGR555
|
|
|
|
|
lut_entry = ((colreg & 0x000F) << 11) |
|
|
|
|
|
((colreg & 0x00F0) << 2) |
|
|
|
|
|
((colreg & 0x0F00) >> 7);
|
|
|
|
|
((colreg & 0x00F0) << 2) |
|
|
|
|
|
((colreg & 0x0F00) >> 7);
|
|
|
|
|
#else /* CONFIG_ATMEL_LCD_RGB565 */
|
|
|
|
|
lut_entry = ((colreg & 0x000F) << 1) |
|
|
|
|
|
((colreg & 0x00F0) << 3) |
|
|
|
|
|
((colreg & 0x0F00) << 4);
|
|
|
|
|
((colreg & 0x00F0) << 3) |
|
|
|
|
|
((colreg & 0x0F00) << 4);
|
|
|
|
|
#endif
|
|
|
|
|
*(cmap + BMP_LOGO_OFFSET) = lut_entry;
|
|
|
|
|
cmap++;
|
|
|
|
@ -570,8 +570,8 @@ void bitmap_plot (int x, int y)
|
|
|
|
|
|
|
|
|
|
WATCHDOG_RESET();
|
|
|
|
|
|
|
|
|
|
for (i=0; i<BMP_LOGO_HEIGHT; ++i) {
|
|
|
|
|
memcpy (fb, bmap, BMP_LOGO_WIDTH);
|
|
|
|
|
for (i = 0; i < BMP_LOGO_HEIGHT; ++i) {
|
|
|
|
|
memcpy(fb, bmap, BMP_LOGO_WIDTH);
|
|
|
|
|
bmap += BMP_LOGO_WIDTH;
|
|
|
|
|
fb += panel_info.vl_col;
|
|
|
|
|
}
|
|
|
|
@ -579,8 +579,8 @@ void bitmap_plot (int x, int y)
|
|
|
|
|
else { /* true color mode */
|
|
|
|
|
u16 col16;
|
|
|
|
|
fb16 = (ushort *)(lcd_base + y * lcd_line_length + x);
|
|
|
|
|
for (i=0; i<BMP_LOGO_HEIGHT; ++i) {
|
|
|
|
|
for (j=0; j<BMP_LOGO_WIDTH; j++) {
|
|
|
|
|
for (i = 0; i < BMP_LOGO_HEIGHT; ++i) {
|
|
|
|
|
for (j = 0; j < BMP_LOGO_WIDTH; j++) {
|
|
|
|
|
col16 = bmp_logo_palette[(bmap[j]-16)];
|
|
|
|
|
fb16[j] =
|
|
|
|
|
((col16 & 0x000F) << 1) |
|
|
|
|
@ -630,14 +630,15 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
volatile cpm8xx_t *cp = &(immr->im_cpm);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (!((bmp->header.signature[0]=='B') &&
|
|
|
|
|
(bmp->header.signature[1]=='M'))) {
|
|
|
|
|
printf ("Error: no valid bmp image at %lx\n", bmp_image);
|
|
|
|
|
if (!((bmp->header.signature[0] == 'B') &&
|
|
|
|
|
(bmp->header.signature[1] == 'M'))) {
|
|
|
|
|
printf("Error: no valid bmp image at %lx\n", bmp_image);
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
width = le32_to_cpu (bmp->header.width);
|
|
|
|
|
height = le32_to_cpu (bmp->header.height);
|
|
|
|
|
width = le32_to_cpu(bmp->header.width);
|
|
|
|
|
height = le32_to_cpu(bmp->header.height);
|
|
|
|
|
bmp_bpix = le16_to_cpu(bmp->header.bit_count);
|
|
|
|
|
colors = 1 << bmp_bpix;
|
|
|
|
|
|
|
|
|
@ -646,6 +647,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
if ((bpix != 1) && (bpix != 8) && (bpix != 16) && (bpix != 32)) {
|
|
|
|
|
printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
|
|
|
|
|
bpix, bmp_bpix);
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -654,10 +656,11 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
|
|
|
|
|
bpix,
|
|
|
|
|
le16_to_cpu(bmp->header.bit_count));
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
debug ("Display-bmp: %d x %d with %d colors\n",
|
|
|
|
|
debug("Display-bmp: %d x %d with %d colors\n",
|
|
|
|
|
(int)width, (int)height, (int)colors);
|
|
|
|
|
|
|
|
|
|
#if !defined(CONFIG_MCC200)
|
|
|
|
@ -674,7 +677,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
cmap_base = cmap;
|
|
|
|
|
|
|
|
|
|
/* Set color map */
|
|
|
|
|
for (i=0; i<colors; ++i) {
|
|
|
|
|
for (i = 0; i < colors; ++i) {
|
|
|
|
|
bmp_color_table_entry_t cte = bmp->color_table[i];
|
|
|
|
|
#if !defined(CONFIG_ATMEL_LCD)
|
|
|
|
|
ushort colreg =
|
|
|
|
@ -709,8 +712,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
* specific.
|
|
|
|
|
*/
|
|
|
|
|
#if defined(CONFIG_MCC200)
|
|
|
|
|
if (bpix==1)
|
|
|
|
|
{
|
|
|
|
|
if (bpix == 1) {
|
|
|
|
|
width = ((width + 7) & ~7) >> 3;
|
|
|
|
|
x = ((x + 7) & ~7) >> 3;
|
|
|
|
|
pwidth= ((pwidth + 7) & ~7) >> 3;
|
|
|
|
@ -731,12 +733,12 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
y = max(0, panel_info.vl_row - height + y + 1);
|
|
|
|
|
#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
|
|
|
|
|
|
|
|
|
|
if ((x + width)>pwidth)
|
|
|
|
|
if ((x + width) > pwidth)
|
|
|
|
|
width = pwidth - 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);
|
|
|
|
|
bmap = (uchar *)bmp + le32_to_cpu(bmp->header.data_offset);
|
|
|
|
|
fb = (uchar *) (lcd_base +
|
|
|
|
|
(y + height - 1) * lcd_line_length + x * bpix / 8);
|
|
|
|
|
|
|
|
|
@ -806,11 +808,11 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
|
|
|
|
break;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static void *lcd_logo (void)
|
|
|
|
|
static void *lcd_logo(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef CONFIG_SPLASH_SCREEN
|
|
|
|
|
char *s;
|
|
|
|
@ -823,13 +825,15 @@ static void *lcd_logo (void)
|
|
|
|
|
|
|
|
|
|
addr = simple_strtoul (s, NULL, 16);
|
|
|
|
|
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
|
|
|
|
|
if ((s = getenv ("splashpos")) != NULL) {
|
|
|
|
|
s = getenv("splashpos");
|
|
|
|
|
if (s != NULL) {
|
|
|
|
|
if (s[0] == 'm')
|
|
|
|
|
x = BMP_ALIGN_CENTER;
|
|
|
|
|
else
|
|
|
|
|
x = simple_strtol (s, NULL, 0);
|
|
|
|
|
x = simple_strtol(s, NULL, 0);
|
|
|
|
|
|
|
|
|
|
if ((s = strchr (s + 1, ',')) != NULL) {
|
|
|
|
|
s = strchr(s + 1, ',');
|
|
|
|
|
if (s != NULL) {
|
|
|
|
|
if (s[1] == 'm')
|
|
|
|
|
y = BMP_ALIGN_CENTER;
|
|
|
|
|
else
|
|
|
|
@ -842,15 +846,14 @@ static void *lcd_logo (void)
|
|
|
|
|
bmp_image_t *bmp = (bmp_image_t *)addr;
|
|
|
|
|
unsigned long len;
|
|
|
|
|
|
|
|
|
|
if (!((bmp->header.signature[0]=='B') &&
|
|
|
|
|
(bmp->header.signature[1]=='M'))) {
|
|
|
|
|
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) {
|
|
|
|
|
return ((void *)lcd_base);
|
|
|
|
|
}
|
|
|
|
|
if (lcd_display_bitmap(addr, x, y) == 0)
|
|
|
|
|
return (void *)lcd_base;
|
|
|
|
|
}
|
|
|
|
|
#endif /* CONFIG_SPLASH_SCREEN */
|
|
|
|
|
|
|
|
|
@ -863,9 +866,9 @@ static void *lcd_logo (void)
|
|
|
|
|
#endif /* CONFIG_LCD_INFO */
|
|
|
|
|
|
|
|
|
|
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
|
|
|
|
|
return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));
|
|
|
|
|
return (void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length);
|
|
|
|
|
#else
|
|
|
|
|
return ((void *)lcd_base);
|
|
|
|
|
return (void *)lcd_base;
|
|
|
|
|
#endif /* CONFIG_LCD_LOGO && !CONFIG_LCD_INFO_BELOW_LOGO */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|