|
|
|
@ -83,9 +83,35 @@ |
|
|
|
|
#define CONFIG_CONSOLE_SCROLL_LINES 1 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR; |
|
|
|
|
/************************************************************************/ |
|
|
|
|
/* ** CONSOLE DEFINITIONS & FUNCTIONS */ |
|
|
|
|
/************************************************************************/ |
|
|
|
|
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO) |
|
|
|
|
# define CONSOLE_ROWS ((panel_info.vl_row-BMP_LOGO_HEIGHT) \ |
|
|
|
|
/ VIDEO_FONT_HEIGHT) |
|
|
|
|
#else |
|
|
|
|
# define CONSOLE_ROWS (panel_info.vl_row / VIDEO_FONT_HEIGHT) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define CONSOLE_COLS (panel_info.vl_col / VIDEO_FONT_WIDTH) |
|
|
|
|
#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * lcd_line_length) |
|
|
|
|
#define CONSOLE_ROW_FIRST lcd_console_address |
|
|
|
|
#define CONSOLE_ROW_SECOND (lcd_console_address + CONSOLE_ROW_SIZE) |
|
|
|
|
#define CONSOLE_ROW_LAST (lcd_console_address + CONSOLE_SIZE \ |
|
|
|
|
- CONSOLE_ROW_SIZE) |
|
|
|
|
#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) |
|
|
|
|
#define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) |
|
|
|
|
|
|
|
|
|
ulong lcd_setmem (ulong addr); |
|
|
|
|
#if LCD_BPP == LCD_MONOCHROME |
|
|
|
|
# define COLOR_MASK(c) ((c) | (c) << 1 | (c) << 2 | (c) << 3 | \ |
|
|
|
|
(c) << 4 | (c) << 5 | (c) << 6 | (c) << 7) |
|
|
|
|
#elif (LCD_BPP == LCD_COLOR8) || (LCD_BPP == LCD_COLOR16) |
|
|
|
|
# define COLOR_MASK(c) (c) |
|
|
|
|
#else |
|
|
|
|
# error Unsupported LCD BPP. |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR; |
|
|
|
|
|
|
|
|
|
static void lcd_drawchars(ushort x, ushort y, uchar *str, int count); |
|
|
|
|
static inline void lcd_puts_xy(ushort x, ushort y, uchar *s); |
|
|
|
@ -93,22 +119,25 @@ static inline void lcd_putc_xy(ushort x, ushort y, uchar c); |
|
|
|
|
|
|
|
|
|
static int lcd_init(void *lcdbase); |
|
|
|
|
|
|
|
|
|
static void *lcd_logo (void); |
|
|
|
|
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_color_fg; |
|
|
|
|
static int lcd_color_bg; |
|
|
|
|
int lcd_line_length; |
|
|
|
|
|
|
|
|
|
char lcd_is_enabled = 0; |
|
|
|
|
|
|
|
|
|
static char lcd_flush_dcache; /* 1 to flush dcache after each lcd update */ |
|
|
|
|
static short console_col; |
|
|
|
|
static short console_row; |
|
|
|
|
|
|
|
|
|
static void *lcd_console_address; |
|
|
|
|
static void *lcd_base; /* Start of framebuffer memory */ |
|
|
|
|
|
|
|
|
|
#ifdef NOT_USED_SO_FAR |
|
|
|
|
static void lcd_getcolreg(ushort regno, |
|
|
|
|
ushort *red, ushort *green, ushort *blue); |
|
|
|
|
static int lcd_getfgcolor(void); |
|
|
|
|
#endif /* NOT_USED_SO_FAR */ |
|
|
|
|
static char lcd_flush_dcache; /* 1 to flush dcache after each lcd update */ |
|
|
|
|
|
|
|
|
|
/************************************************************************/ |
|
|
|
|
|
|
|
|
@ -148,7 +177,7 @@ static void console_scrollup(void) |
|
|
|
|
/* Clear the last rows */ |
|
|
|
|
memset(lcd_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows, |
|
|
|
|
COLOR_MASK(lcd_color_bg), |
|
|
|
|
CONSOLE_ROW_SIZE * rows); |
|
|
|
|
CONSOLE_ROW_SIZE * rows); |
|
|
|
|
|
|
|
|
|
lcd_sync(); |
|
|
|
|
console_row -= rows; |
|
|
|
@ -160,9 +189,8 @@ static inline void console_back(void) |
|
|
|
|
{ |
|
|
|
|
if (--console_col < 0) { |
|
|
|
|
console_col = CONSOLE_COLS-1 ; |
|
|
|
|
if (--console_row < 0) { |
|
|
|
|
if (--console_row < 0) |
|
|
|
|
console_row = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lcd_putc_xy(console_col * VIDEO_FONT_WIDTH, |
|
|
|
@ -173,16 +201,13 @@ static inline void console_back(void) |
|
|
|
|
|
|
|
|
|
static inline void console_newline(void) |
|
|
|
|
{ |
|
|
|
|
++console_row; |
|
|
|
|
console_col = 0; |
|
|
|
|
|
|
|
|
|
/* Check if we need to scroll the terminal */ |
|
|
|
|
if (console_row >= CONSOLE_ROWS) { |
|
|
|
|
/* Scroll everything up */ |
|
|
|
|
if (++console_row >= CONSOLE_ROWS) |
|
|
|
|
console_scrollup(); |
|
|
|
|
} else { |
|
|
|
|
else |
|
|
|
|
lcd_sync(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/ |
|
|
|
@ -234,9 +259,9 @@ void lcd_puts(const char *s) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (*s) { |
|
|
|
|
while (*s) |
|
|
|
|
lcd_putc(*s++); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lcd_sync(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -283,7 +308,7 @@ static void lcd_drawchars(ushort x, ushort y, uchar *str, int count) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if LCD_BPP == LCD_MONOCHROME |
|
|
|
|
uchar rest = *d & -(1 << (8-off)); |
|
|
|
|
uchar rest = *d & -(1 << (8 - off)); |
|
|
|
|
uchar sym; |
|
|
|
|
#endif |
|
|
|
|
for (i = 0; i < count; ++i) { |
|
|
|
@ -313,7 +338,7 @@ static void lcd_drawchars(ushort x, ushort y, uchar *str, int count) |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#if LCD_BPP == LCD_MONOCHROME |
|
|
|
|
*d = rest | (*d & ((1 << (8-off)) - 1)); |
|
|
|
|
*d = rest | (*d & ((1 << (8 - off)) - 1)); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -340,7 +365,7 @@ static inline void lcd_putc_xy(ushort x, ushort y, uchar c) |
|
|
|
|
#define N_BLK_VERT 2 |
|
|
|
|
#define N_BLK_HOR 3 |
|
|
|
|
|
|
|
|
|
static int test_colors[N_BLK_HOR*N_BLK_VERT] = { |
|
|
|
|
static int test_colors[N_BLK_HOR * N_BLK_VERT] = { |
|
|
|
|
CONSOLE_COLOR_RED, CONSOLE_COLOR_GREEN, CONSOLE_COLOR_YELLOW, |
|
|
|
|
CONSOLE_COLOR_BLUE, CONSOLE_COLOR_MAGENTA, CONSOLE_COLOR_CYAN, |
|
|
|
|
}; |
|
|
|
@ -361,7 +386,7 @@ static void test_pattern(void) |
|
|
|
|
for (v = 0; v < v_max; ++v) { |
|
|
|
|
uchar iy = v / v_step; |
|
|
|
|
for (h = 0; h < h_max; ++h) { |
|
|
|
|
uchar ix = N_BLK_HOR * iy + (h/h_step); |
|
|
|
|
uchar ix = N_BLK_HOR * iy + h / h_step; |
|
|
|
|
*pix++ = test_colors[ix]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -379,12 +404,12 @@ int lcd_get_size(int *line_length) |
|
|
|
|
return *line_length * panel_info.vl_row; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int drv_lcd_init (void) |
|
|
|
|
int drv_lcd_init(void) |
|
|
|
|
{ |
|
|
|
|
struct stdio_dev lcddev; |
|
|
|
|
int rc; |
|
|
|
|
|
|
|
|
|
lcd_base = (void *)(gd->fb_base); |
|
|
|
|
lcd_base = (void *) gd->fb_base; |
|
|
|
|
|
|
|
|
|
lcd_init(lcd_base); /* LCD initialization */ |
|
|
|
|
|
|
|
|
@ -397,7 +422,7 @@ int drv_lcd_init (void) |
|
|
|
|
lcddev.putc = lcd_putc; /* 'putc' function */ |
|
|
|
|
lcddev.puts = lcd_puts; /* 'puts' function */ |
|
|
|
|
|
|
|
|
|
rc = stdio_register (&lcddev); |
|
|
|
|
rc = stdio_register(&lcddev); |
|
|
|
|
|
|
|
|
|
return (rc == 0) ? 1 : rc; |
|
|
|
|
} |
|
|
|
@ -436,11 +461,11 @@ void lcd_clear(void) |
|
|
|
|
/* set framebuffer to background color */ |
|
|
|
|
memset((char *)lcd_base, |
|
|
|
|
COLOR_MASK(lcd_getbgcolor()), |
|
|
|
|
lcd_line_length*panel_info.vl_row); |
|
|
|
|
lcd_line_length * panel_info.vl_row); |
|
|
|
|
#endif |
|
|
|
|
/* Paint the logo and retrieve LCD base address */ |
|
|
|
|
debug("[LCD] Drawing the logo...\n"); |
|
|
|
|
lcd_console_address = lcd_logo (); |
|
|
|
|
lcd_console_address = lcd_logo(); |
|
|
|
|
|
|
|
|
|
console_col = 0; |
|
|
|
|
console_row = 0; |
|
|
|
@ -472,7 +497,7 @@ static int lcd_init(void *lcdbase) |
|
|
|
|
lcd_line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8; |
|
|
|
|
lcd_is_enabled = 1; |
|
|
|
|
lcd_clear(); |
|
|
|
|
lcd_enable (); |
|
|
|
|
lcd_enable(); |
|
|
|
|
|
|
|
|
|
/* Initialize the console */ |
|
|
|
|
console_col = 0; |
|
|
|
@ -513,7 +538,8 @@ 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; |
|
|
|
|
} |
|
|
|
@ -534,12 +560,10 @@ static void lcd_setbgcolor(int color) |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
#ifdef NOT_USED_SO_FAR |
|
|
|
|
static int lcd_getfgcolor(void) |
|
|
|
|
int lcd_getfgcolor(void) |
|
|
|
|
{ |
|
|
|
|
return lcd_color_fg; |
|
|
|
|
} |
|
|
|
|
#endif /* NOT_USED_SO_FAR */ |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
@ -548,8 +572,6 @@ static int lcd_getbgcolor(void) |
|
|
|
|
return lcd_color_bg; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
/************************************************************************/ |
|
|
|
|
/* ** Chipset depending Bitmap / Logo stuff... */ |
|
|
|
|
/************************************************************************/ |
|
|
|
@ -566,13 +588,11 @@ static inline ushort *configuration_get_cmap(void) |
|
|
|
|
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) |
|
|
|
|
#elif defined(CONFIG_LCD_LOGO) |
|
|
|
|
return bmp_logo_palette; |
|
|
|
|
#else |
|
|
|
|
return NULL; |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_LCD_LOGO |
|
|
|
@ -591,15 +611,16 @@ void bitmap_plot(int x, int y) |
|
|
|
|
immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; |
|
|
|
|
cpm8xx_t *cp = &(immr->im_cpm); |
|
|
|
|
#endif |
|
|
|
|
unsigned bpix = NBITS(panel_info.vl_bpix); |
|
|
|
|
|
|
|
|
|
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)); |
|
|
|
|
|
|
|
|
|
bmap = &bmp_logo_bitmap[0]; |
|
|
|
|
fb = (uchar *)(lcd_base + y * lcd_line_length + x); |
|
|
|
|
fb = (uchar *)(lcd_base + y * lcd_line_length + x * bpix / 8); |
|
|
|
|
|
|
|
|
|
if (NBITS(panel_info.vl_bpix) < 12) { |
|
|
|
|
if (bpix < 12) { |
|
|
|
|
/* 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. |
|
|
|
@ -645,12 +666,12 @@ void bitmap_plot(int x, int y) |
|
|
|
|
for (i = 0; i < BMP_LOGO_HEIGHT; ++i) { |
|
|
|
|
memcpy(fb, bmap, BMP_LOGO_WIDTH); |
|
|
|
|
bmap += BMP_LOGO_WIDTH; |
|
|
|
|
fb += panel_info.vl_col; |
|
|
|
|
fb += panel_info.vl_col; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else { /* true color mode */ |
|
|
|
|
u16 col16; |
|
|
|
|
fb16 = (ushort *)(lcd_base + y * lcd_line_length + x); |
|
|
|
|
fb16 = (ushort *)fb; |
|
|
|
|
for (i = 0; i < BMP_LOGO_HEIGHT; ++i) { |
|
|
|
|
for (j = 0; j < BMP_LOGO_WIDTH; j++) { |
|
|
|
|
col16 = bmp_logo_palette[(bmap[j]-16)]; |
|
|
|
@ -736,12 +757,11 @@ static void draw_encoded_bitmap(ushort **fbp, ushort c, int cnt) |
|
|
|
|
*fb++ = c; |
|
|
|
|
cnt--; |
|
|
|
|
} |
|
|
|
|
(*fbp) = fb; |
|
|
|
|
*fbp = fb; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Do not call this function directly, must be called from |
|
|
|
|
* lcd_display_bitmap. |
|
|
|
|
* Do not call this function directly, must be called from lcd_display_bitmap. |
|
|
|
|
*/ |
|
|
|
|
static void lcd_display_rle8_bitmap(bmp_image_t *bmp, ushort *cmap, uchar *fb, |
|
|
|
|
int x_off, int y_off) |
|
|
|
@ -868,8 +888,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
unsigned long pwidth = panel_info.vl_col; |
|
|
|
|
unsigned colors, bpix, bmp_bpix; |
|
|
|
|
|
|
|
|
|
if (!bmp || !((bmp->header.signature[0] == 'B') && |
|
|
|
|
(bmp->header.signature[1] == 'M'))) { |
|
|
|
|
if (!bmp || !(bmp->header.signature[0] == 'B' && |
|
|
|
|
bmp->header.signature[1] == 'M')) { |
|
|
|
|
printf("Error: no valid bmp image at %lx\n", bmp_image); |
|
|
|
|
|
|
|
|
|
return 1; |
|
|
|
@ -882,7 +902,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
|
|
|
|
|
bpix = NBITS(panel_info.vl_bpix); |
|
|
|
|
|
|
|
|
|
if ((bpix != 1) && (bpix != 8) && (bpix != 16) && (bpix != 32)) { |
|
|
|
|
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); |
|
|
|
|
|
|
|
|
@ -950,7 +970,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
padded_width = (width&0x3) ? ((width&~0x3)+4) : (width); |
|
|
|
|
padded_width = (width & 0x3 ? (width & ~0x3) + 4 : width); |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SPLASH_SCREEN_ALIGN |
|
|
|
|
splash_align_axis(&x, pwidth, width); |
|
|
|
@ -962,7 +982,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
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); |
|
|
|
|
|
|
|
|
@ -997,7 +1017,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
bmap += (padded_width - width); |
|
|
|
|
fb -= (byte_width + lcd_line_length); |
|
|
|
|
fb -= byte_width + lcd_line_length; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -1009,7 +1029,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
fb_put_word(&fb, &bmap); |
|
|
|
|
|
|
|
|
|
bmap += (padded_width - width) * 2; |
|
|
|
|
fb -= (width * 2 + lcd_line_length); |
|
|
|
|
fb -= width * 2 + lcd_line_length; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
#endif /* CONFIG_BMP_16BPP */ |
|
|
|
@ -1023,7 +1043,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) |
|
|
|
|
*(fb++) = *(bmap++); |
|
|
|
|
*(fb++) = *(bmap++); |
|
|
|
|
} |
|
|
|
|
fb -= (lcd_line_length + width * (bpix / 8)); |
|
|
|
|
fb -= lcd_line_length + width * (bpix / 8); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
#endif /* CONFIG_BMP_32BPP */ |
|
|
|
@ -1098,7 +1118,7 @@ static void *lcd_logo(void) |
|
|
|
|
return (void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length); |
|
|
|
|
#else |
|
|
|
|
return (void *)lcd_base; |
|
|
|
|
#endif /* CONFIG_LCD_LOGO && !CONFIG_LCD_INFO_BELOW_LOGO */ |
|
|
|
|
#endif /* CONFIG_LCD_LOGO && !defined(CONFIG_LCD_INFO_BELOW_LOGO) */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SPLASHIMAGE_GUARD |
|
|
|
@ -1150,6 +1170,3 @@ int lcd_get_screen_columns(void) |
|
|
|
|
{ |
|
|
|
|
return CONSOLE_COLS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/************************************************************************/ |
|
|
|
|
/************************************************************************/ |
|
|
|
|