文件开始加入以下声明:
void *lcd_base; /* Start of framebuffer memory */ void *lcd_console_address; /* Start of console buffer */ uchar *osd_frame_buffer; int lcd_line_length; int lcd_color_fg; int lcd_color_bg; short console_col; short console_row;在console_scrollup函数开头加入:
#ifdef CONFIG_LCD_GZSD lcd_console_address = (void*)osd_frame_buffer; #endiflcd_putc函数开头修改为如下:
#ifdef CONFIG_LCD_GZSD
serial_putc(c);
#else
if (!lcd_is_enabled) {
serial_putc(c);
return;
}
#endiflcd_drawchars修改如下:
static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
{
uchar *dest;
ushort off, row;
#ifdef CONFIG_LCD_GZSD
dest = (uchar *)(osd_frame_buffer + y * lcd_line_length + x * (1 << LCD_BPP) / 8);
off = x * (1 << LCD_BPP) % 8;
#else
dest = (uchar *)(lcd_base + y * lcd_line_length + x * (1 << LCD_BPP) / 8);
off = x * (1 << LCD_BPP) % 8;
#endif
for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) {
uchar *s = str;
#ifdef CONFIG_LCD_GZSD
#if LCD_BPP == LCD_COLOR32
unsigned int *d = (unsigned int*)dest;
#elif LCD_BPP == LCD_COLOR16
ushort *d = (ushort *)dest;
#else
uchar *d = dest;
#endif
#else
uchar *d = dest;
#endif
int i;
#if LCD_BPP == LCD_MONOCHROME
uchar rest = *d & -(1 << (8-off));
uchar sym;
#endif
for (i=0; i
> off);
rest = sym << (8-off);
#elif LCD_BPP == LCD_COLOR8
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<16; ++c) {
*d++ = (bits & 0x80)
lcd_color_fg : lcd_color_bg;
bits <<= 1;
}
#elif LCD_BPP == LCD_COLOR32
for (c=0; c<32; ++c) {
*d++ = (bits & 0x80)
lcd_color_fg : lcd_color_bg;
bits <<= 1;
}
#endif
}
#if LCD_BPP == LCD_MONOCHROME
*d = rest | (*d & ((1 << (8-off)) - 1));
#endif
}
}
drv_lcd_init修改如下:
int drv_lcd_init (void)
{
struct stdio_dev lcddev;
int rc;
#ifdef CONFIG_LCD_GZSD
lcd_base = (void*)LCD_FRAMEBUFFER_ADDR;
osd_frame_buffer=(void*)((char*)lcd_base + calc_fbsize());
lcd_line_length = (panel_info.vl_col * panel_info.vl_bpix) / 8;
#if LCD_BPP == LCD_COLOR32
lcd_color_fg = 0xFFFFFF;
lcd_color_bg = 0x000000;
#else
lcd_color_fg = 0xFFFF;
lcd_color_bg = 0x0000;
#endif
#else
lcd_base = (void *)(gd->fb_base);
lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
#endif
lcd_init (lcd_base); /* LCD initialization */
#if 1
/* Device initialization */
memset (&lcddev, 0, sizeof (lcddev));
strcpy (lcddev.name, "lcd");
lcddev.ext = 0; /* No extensions */
lcddev.flags = DEV_FLAGS_OUTPUT; /* Output only */
lcddev.putc = lcd_putc; /* 'putc' function */
lcddev.puts = lcd_puts; /* 'puts' function */
rc = stdio_register (&lcddev);
return (rc == 0) 1 : rc;
#else
return 1;
#endif
}lcd_init修改如下:
static int lcd_init (void *lcdbase)
{
/* Initialize the lcd controller */
debug ("[LCD] Initializing LCD frambuffer at %p\n", lcdbase);
lcd_ctrl_init (lcdbase);
#if 0 //modify by hclydao
lcd_clear (NULL, 1, 1, NULL); /* dummy args */
lcd_enable ();
#endif
/* Initialize the console */
console_col = 0;
#ifdef CONFIG_LCD_INFO_BELOW_LOGO
console_row = 7 + BMP_LOGO_HEIGHT / VIDEO_FONT_HEIGHT;
#else
console_row = 1; /* leave 1 blank line below logo */
#endif
lcd_is_enabled = 1;
return 0;
}
效果如图:

其实还可以加一个背景图片的
vc/UtOa683UtYm9vdL7NsrvN+c/CxdzByyC6w8bmuda1xM/Wz/OjrNLUx7C19zY0MTAgNC4ztOe1xNCnufu63LrDILu7s8k3tOe1xLrz19bM5c/Uyr61xNKysrvKx7rcxq/BwcHLLjwvcD4KPHA+bG9nb7bBvfjIpcbkyrW63LzytaWjrNbB09qyu835z8LF3MHLINPQ0MvIpLXEv8nS1LzM0PjN+c/C0dC+vzo8L3A+CjxwPnJ1bl9jb21tYW5kKA=="fatload mmc 0 0xc3c00000 logo.bin",0);
logo.bin文件可以使用Image2Lcd软件制作得到
其中0xc3c00000是显存地址,在include/lcd.h中我们定义的:
#define LCD_FRAMEBUFFER_ADDR (TEXT_BASE - 0x200000)这个的值.