⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
📖 第 1 页 / 共 2 页
字号:
	lcd_setcolreg  (CONSOLE_COLOR_WHITE,	0xFF, 0xFF, 0xFF);#endif#ifndef CFG_WHITE_ON_BLACK	lcd_setfgcolor (CONSOLE_COLOR_BLACK);	lcd_setbgcolor (CONSOLE_COLOR_WHITE);#else	lcd_setfgcolor (CONSOLE_COLOR_WHITE);	lcd_setbgcolor (CONSOLE_COLOR_BLACK);#endif	/* CFG_WHITE_ON_BLACK */#ifdef	LCD_TEST_PATTERN	test_pattern();#else	/* set framebuffer to background color */	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");	lcd_console_address = lcd_logo ();	console_col = 0;	console_row = 0;	return (0);}U_BOOT_CMD(	cls,	1,	1,	lcd_clear,	"cls     - clear screen\n",	NULL);/*----------------------------------------------------------------------*/static int lcd_init (void *lcdbase){	/* Initialize the lcd controller */	debug ("[LCD] Initializing LCD frambuffer at %p\n", lcdbase);	lcd_ctrl_init (lcdbase);	lcd_clear (NULL, 1, 1, NULL);	/* dummy args */	lcd_enable ();	/* Initialize the console */	console_col = 0;#ifdef 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;}/************************************************************************//* ** ROM capable initialization part - needed to reserve FB memory	*//************************************************************************//* * This is called early in the system initialization to grab memory * for the LCD controller. * Returns new address for monitor, after reserving LCD buffer memory * * Note that this is running from ROM, so no write access to global data. */ulong lcd_setmem (ulong addr){	ulong size;	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) );	size = line_length * panel_info.vl_row;	/* Round up to nearest full page */	size = (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);	/* Allocate pages for the frame buffer. */	addr -= size;	debug ("Reserving %ldk for LCD Framebuffer at: %08lx\n", size>>10, addr);	return (addr);}/*----------------------------------------------------------------------*/static void lcd_setfgcolor (int color){	lcd_color_fg = color & 0x0F;}/*----------------------------------------------------------------------*/static void lcd_setbgcolor (int color){	lcd_color_bg = color & 0x0F;}/*----------------------------------------------------------------------*/#ifdef	NOT_USED_SO_FARstatic int lcd_getfgcolor (void){	return lcd_color_fg;}#endif	/* NOT_USED_SO_FAR *//*----------------------------------------------------------------------*/static int lcd_getbgcolor (void){	return lcd_color_bg;}/*----------------------------------------------------------------------*//************************************************************************//* ** Chipset depending Bitmap / Logo stuff...                          *//************************************************************************/#ifdef CONFIG_LCD_LOGOvoid bitmap_plot (int x, int y){	ushort *cmap;	ushort i, j;	uchar *bmap;	uchar *fb;	ushort *fb16;#if defined(CONFIG_PXA250)	struct pxafb_info *fbi = &panel_info.pxa;#elif defined(CONFIG_MPC823)	volatile immap_t *immr = (immap_t *) CFG_IMMR;	volatile cpm8xx_t *cp = &(immr->im_cpm);#endif	debug ("Logo: width %d  height %d  colors %d  cmap %d\n",		BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, BMP_LOGO_COLORS,		sizeof(bmp_logo_palette)/(sizeof(ushort)));	bmap = &bmp_logo_bitmap[0];	fb   = (char *)(lcd_base + y * lcd_line_length + x);	if (NBITS(panel_info.vl_bpix) < 12) {		/* Leave room for default color map */#if defined(CONFIG_PXA250)		cmap = (ushort *)fbi->palette;#elif defined(CONFIG_MPC823)		cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);#endif		WATCHDOG_RESET();		/* Set color map */		for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {			ushort colreg = bmp_logo_palette[i];#ifdef  CFG_INVERT_COLORS			*cmap++ = 0xffff - colreg;#else			*cmap++ = colreg;#endif		}		WATCHDOG_RESET();		for (i=0; i<BMP_LOGO_HEIGHT; ++i) {			memcpy (fb, bmap, BMP_LOGO_WIDTH);			bmap += BMP_LOGO_WIDTH;			fb   += panel_info.vl_col;		}	}	else { /* true color mode */		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++) {				fb16[j] = bmp_logo_palette[(bmap[j])];				}			bmap += BMP_LOGO_WIDTH;			fb16 += panel_info.vl_col;		}	}	WATCHDOG_RESET();}#endif /* CONFIG_LCD_LOGO *//*----------------------------------------------------------------------*/#if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)/* * Display the BMP file located at address bmp_image. * Only uncompressed. */int lcd_display_bitmap(ulong bmp_image, int x, int y){	ushort *cmap;	ushort i, j;	uchar *fb;	bmp_image_t *bmp=(bmp_image_t *)bmp_image;	uchar *bmap;	ushort padded_line;	unsigned long width, height;	unsigned colors,bpix;	unsigned long compression;#if defined(CONFIG_PXA250)	struct pxafb_info *fbi = &panel_info.pxa;#elif defined(CONFIG_MPC823)	volatile immap_t *immr = (immap_t *) CFG_IMMR;	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);		return 1;}	width = le32_to_cpu (bmp->header.width);	height = le32_to_cpu (bmp->header.height);	colors = 1<<le16_to_cpu (bmp->header.bit_count);	compression = le32_to_cpu (bmp->header.compression);	bpix = NBITS(panel_info.vl_bpix);	if ((bpix != 1) && (bpix != 8)) {		printf ("Error: %d bit/pixel mode not supported by U-Boot\n",			bpix);		return 1;	}	if (bpix != le16_to_cpu(bmp->header.bit_count)) {		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",		(int)width, (int)height, (int)colors);	if (bpix==8) {#if defined(CONFIG_PXA250)		cmap = (ushort *)fbi->palette;#elif defined(CONFIG_MPC823)		cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);#else# error "Don't know location of color map"#endif		/* Set color map */		for (i=0; i<colors; ++i) {			bmp_color_table_entry_t cte = bmp->color_table[i];			ushort colreg =				( ((cte.red)   << 8) & 0xf800) |				( ((cte.green) << 4) & 0x07e0) |				( (cte.blue) & 0x001f) ;#ifdef CFG_INVERT_COLORS			*cmap = 0xffff - colreg;#else			*cmap = colreg;#endif#if defined(CONFIG_PXA250)			cmap++;#elif defined(CONFIG_MPC823)			cmap--;#endif		}	}	padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);	if ((x + width)>panel_info.vl_col)		width = panel_info.vl_col - x;	if ((y + height)>panel_info.vl_row)		height = panel_info.vl_row - y;	bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset);	fb   = (uchar *) (lcd_base +		(y + height - 1) * lcd_line_length + x);	for (i = 0; i < height; ++i) {		for (j = 0; j < width ; j++)#if defined(CONFIG_PXA250)			*(fb++)=*(bmap++);#elif defined(CONFIG_MPC823)			*(fb++)=255-*(bmap++);#endif		bmap += (width - padded_line);		fb   -= (width + lcd_line_length);	}	return (0);}#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN */static void *lcd_logo (void){#ifdef LCD_INFO	DECLARE_GLOBAL_DATA_PTR;	char info[80];	char temp[32];#endif /* LCD_INFO */#ifdef CONFIG_SPLASH_SCREEN	char *s;	ulong addr;	static int do_splash = 1;	if (do_splash && (s = getenv("splashimage")) != NULL) {		addr = simple_strtoul(s, NULL, 16);		do_splash = 0;		if (lcd_display_bitmap (addr, 0, 0) == 0) {			return ((void *)lcd_base);		}	}#endif /* CONFIG_SPLASH_SCREEN */#ifdef CONFIG_LCD_LOGO	bitmap_plot (0, 0);#endif /* CONFIG_LCD_LOGO */#ifdef CONFIG_MPC823#ifdef LCD_INFO	sprintf (info, "%s (%s - %s) ", U_BOOT_VERSION, __DATE__, __TIME__);	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, info, strlen(info));	sprintf (info, "(C) 2004 DENX Software Engineering");	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT,					info, strlen(info));	sprintf (info, "    Wolfgang DENK, wd@denx.de");	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 2,					info, strlen(info));#ifdef LCD_INFO_BELOW_LOGO	sprintf (info, "MPC823 CPU at %s MHz",		strmhz(temp, gd->cpu_clk));	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 3,					info, strlen(info));	sprintf (info, "  %ld MB RAM, %ld MB Flash",		gd->ram_size >> 20,		gd->bd->bi_flashsize >> 20 );	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4,					info, strlen(info));#else	/* leave one blank line */	sprintf (info, "MPC823 CPU at %s MHz, %ld MB RAM, %ld MB Flash",		strmhz(temp, gd->cpu_clk),		gd->ram_size >> 20,		gd->bd->bi_flashsize >> 20 );	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4,					info, strlen(info));#endif /* CONFIG_MPC823 */#endif /* LCD_INFO_BELOW_LOGO */#endif /* LCD_INFO */#if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO)	return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));#else	return ((void *)lcd_base);#endif /* CONFIG_LCD_LOGO */}/************************************************************************//************************************************************************/#endif /* CONFIG_LCD */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -