s3c2416 u-boot增加LCD驱动(二)

2014-11-24 03:31:56 · 作者: · 浏览: 1
hort vl_col; ushort vl_row; ushort vl_width; ushort vl_height; u_char vl_bpix; } vidinfo_t; #define LCD_FRAMEBUFFER (TEXT_BASE - 0x300000) #define LCD_FRAMEBUFFER_ADDR (TEXT_BASE - 0x200000) #define LCD_MONOCHROME 0 #define LCD_COLOR2 1 #define LCD_COLOR4 2 #define LCD_COLOR8 3 #define LCD_COLOR16 4 #define LCD_COLOR32 5 extern uchar *osd_frame_buffer; extern void lcd_backlight(int enable);common/lcd.c修改

文件开始加入以下声明:

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;
#endif
lcd_putc函数开头修改为如下:
#ifdef CONFIG_LCD_GZSD
	serial_putc(c);
#else
	if (!lcd_is_enabled) {
		serial_putc(c);
		return;
	}
#endif
lcd_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)
这个的值.