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

📄 pxafb.c.svn-base

📁 u-boot for S3c2443 processor
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
{#if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO)	lcd_drawchars (x, y+BMP_LOGO_HEIGHT, &c, 1);#else	lcd_drawchars (x, y, &c, 1);#endif}/************************************************************************//**  Small utility to check that you got the colours right		*//************************************************************************/#ifdef LCD_TEST_PATTERN#define	N_BLK_VERT	2#define	N_BLK_HOR	3static 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,};static void test_pattern (void){	ushort v_max  = panel_info.vl_row;	ushort h_max  = panel_info.vl_col;	ushort v_step = (v_max + N_BLK_VERT - 1) / N_BLK_VERT;	ushort h_step = (h_max + N_BLK_HOR  - 1) / N_BLK_HOR;	ushort v, h;	uchar *pix = (uchar *)lcd_base;	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) {		uchar iy = v / v_step;		for (h=0; h<h_max; ++h) {			uchar ix = N_BLK_HOR * iy + (h/h_step);			*pix++ = test_colors[ix];		}	}}#endif /* LCD_TEST_PATTERN *//************************************************************************//* ** GENERIC Initialization Routines					*//************************************************************************/int drv_lcd_init (void){	DECLARE_GLOBAL_DATA_PTR;	device_t lcddev;	int rc;	lcd_base = (void *)(gd->fb_base);	lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;	lcd_init (lcd_base);		/* LCD initialization */	/* 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 = device_register (&lcddev);	return (rc == 0) ? 1 : rc;}/*----------------------------------------------------------------------*/static int lcd_init (void *lcdbase){	/* Initialize the lcd controller */	debug ("[LCD] Initializing LCD frambuffer at %p\n", lcdbase);	lcd_ctrl_init (lcdbase);#if LCD_BPP == LCD_MONOCHROME	/* Setting the palette */	lcd_initcolregs();#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);#endif#define CFG_WHITE_ON_BLACK#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	lcd_enable ();	/* Paint the logo and retrieve LCD base address */	debug ("[LCD] Drawing the logo...\n");	lcd_console_address = lcd_logo ();	/* 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) );	/* extra page for dma descriptors and palette */	size = line_length * panel_info.vl_row + PAGE_SIZE;	/* 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);}/************************************************************************//* ----------------- chipset specific functions ----------------------- *//************************************************************************/static void lcd_ctrl_init (void *lcdbase){	pxafb_init_mem(lcdbase, &panel_info);	pxafb_init(&panel_info);	pxafb_setup_gpio(&panel_info);	pxafb_enable_controller(&panel_info);}/*----------------------------------------------------------------------*/#ifdef	NOT_USED_SO_FARstatic voidlcd_getcolreg (ushort regno, ushort *red, ushort *green, ushort *blue){}#endif	/* NOT_USED_SO_FAR *//*----------------------------------------------------------------------*/#if LCD_BPP == LCD_COLOR8static voidlcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue){	struct pxafb_info *fbi = &panel_info.pxa;	unsigned short *palette = (unsigned short *)fbi->palette;	u_int val;	if (regno < fbi->palette_size) {		val = ((red << 8) & 0xf800);		val |= ((green << 4) & 0x07e0);		val |= (blue & 0x001f);#ifdef LCD_INVERT_COLORS		palette[regno] = ~val;#else		palette[regno] = ~val;#endif	}	debug ("setcolreg: reg %2d @ %p: R=%02X G=%02X B=%02X => %04X\n",		regno, &palette[regno],		red, green, blue,		palette[regno]);}#endif	/* LCD_COLOR8 *//*----------------------------------------------------------------------*/#if LCD_BPP == LCD_MONOCHROMEstaticvoid lcd_initcolregs (void){	volatile immap_t *immr = (immap_t *) CFG_IMMR;	volatile cpm8xx_t *cp = &(immr->im_cpm);	ushort regno;	for (regno = 0; regno < 16; regno++) {		cp->lcd_cmap[regno * 2] = 0;		cp->lcd_cmap[(regno * 2) + 1] = regno & 0x0f;	}}#endif/*----------------------------------------------------------------------*/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 *//*----------------------------------------------------------------------*/#ifdef	NOT_USED_SO_FARstatic int lcd_getbgcolor (void){	return lcd_color_bg;}#endif	/* NOT_USED_SO_FAR *//*----------------------------------------------------------------------*/static void lcd_enable (void){}/*----------------------------------------------------------------------*/#ifdef	NOT_USED_SO_FARstatic void lcd_disable (void){}#endif	/* NOT_USED_SO_FAR *//************************************************************************//* ** Chipset depending Bitmap / Logo stuff...				*//************************************************************************/#ifdef CONFIG_LCD_LOGOstatic void bitmap_plot (int x, int y){	ushort *cmap;	ushort i;	uchar *bmap;	uchar *fb;	struct pxafb_info *fbi = &panel_info.pxa;	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))	);	/* Leave room for default color map */	cmap = (ushort *)fbi->palette;	/* Set color map */	for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {		ushort colreg = bmp_logo_palette[i];#ifdef	CFG_INVERT_COLORS		colreg ^= 0xFFF;#endif		*cmap++ = colreg;	}	bmap = &bmp_logo_bitmap[0];	fb   = (char *)(lcd_base + y * lcd_line_length + x);	for (i=0; i<BMP_LOGO_HEIGHT; ++i) {		memcpy (fb, bmap, BMP_LOGO_WIDTH);		bmap += BMP_LOGO_WIDTH;		fb   += panel_info.vl_col;	}}#endif /* CONFIG_LCD_LOGO *//*----------------------------------------------------------------------*/static void *lcd_logo (void){#ifdef CONFIG_LCD_LOGO	DECLARE_GLOBAL_DATA_PTR;	char info[80];	char temp[32];	bitmap_plot (0, 0);#endif /* CONFIG_LCD_LOGO */#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 */}/************************************************************************   PXA255 specific routines************************************************************************/static int pxafb_init_mem(void *lcdbase, vidinfo_t *vid){	u_long palette_mem_size;	struct pxafb_info *fbi = &vid->pxa;	int fb_size = vid->vl_row * (vid->vl_col * NBITS (vid->vl_bpix)) / 8;	fbi->screen = (u_long)lcdbase;	fbi->palette_size = NBITS(vid->vl_bpix) == 8 ? 256 : 16;	palette_mem_size = fbi->palette_size * sizeof(u16);	debug("palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size);	/* locate palette and descs at end of page following fb */	fbi->palette = (u_long)lcdbase + fb_size + 2*PAGE_SIZE - palette_mem_size;	return 0;}static void pxafb_setup_gpio(vidinfo_t *vid){	u_long lccr0;	/*	 * setup is based on type of panel supported	 */	lccr0 = vid->pxa.reg_lccr0;	/* 4 bit interface */	if ((lccr0 & LCCR0_CMS) && (lccr0 & LCCR0_SDS) && !(lccr0 & LCCR0_DPD))	{		debug("Setting GPIO for 4 bit data\n");		/* bits 58-61 */		GPDR1 |= (0xf << 26);		GAFR1_U = (GAFR1_U & ~(0xff << 20)) | (0xaa << 20);		/* bits 74-77 */		GPDR2 |= (0xf << 10);		GAFR2_L = (GAFR2_L & ~(0xff << 20)) | (0xaa << 20);	}	/* 8 bit interface */	else if (((lccr0 & LCCR0_CMS) && ((lccr0 & LCCR0_SDS) || (lccr0 & LCCR0_DPD))) ||	    (!(lccr0 & LCCR0_CMS) && !(lccr0 & LCCR0_PAS) && !(lccr0 & LCCR0_SDS)))	{		debug("Setting GPIO for 8 bit data\n");		/* bits 58-65 */		GPDR1 |= (0x3f << 26);		GPDR2 |= (0x3);		GAFR1_U = (GAFR1_U & ~(0xfff << 20)) | (0xaaa << 20);		GAFR2_L = (GAFR2_L & ~0xf) | (0xa);		/* bits 74-77 */		GPDR2 |= (0xf << 10);		GAFR2_L = (GAFR2_L & ~(0xff << 20)) | (0xaa << 20);	}	/* 16 bit interface */	else if (!(lccr0 & LCCR0_CMS) && ((lccr0 & LCCR0_SDS) || (lccr0 & LCCR0_PAS)))	{		debug("Setting GPIO for 16 bit data\n");		/* bits 58-77 */		GPDR1 |= (0x3f << 26);		GPDR2 |= 0x00003fff;		GAFR1_U = (GAFR1_U & ~(0xfff << 20)) | (0xaaa << 20);		GAFR2_L = (GAFR2_L & 0xf0000000) | 0x0aaaaaaa;	}	else	{		printf("pxafb_setup_gpio: unable to determine bits per pixel\n");	}}static void pxafb_enable_controller(vidinfo_t *vid){	debug("Enabling LCD controller\n");	/* Sequence from 11.7.10 */	LCCR3  = vid->pxa.reg_lccr3;	LCCR2  = vid->pxa.reg_lccr2;	LCCR1  = vid->pxa.reg_lccr1;	LCCR0  = vid->pxa.reg_lccr0 & ~LCCR0_ENB;	FDADR0 = vid->pxa.fdadr0;	FDADR1 = vid->pxa.fdadr1;	LCCR0 |= LCCR0_ENB;	CKEN |= CKEN16_LCD;	debug("FDADR0 = 0x%08x\n", (unsigned int)FDADR0);	debug("FDADR1 = 0x%08x\n", (unsigned int)FDADR1);	debug("LCCR0 = 0x%08x\n", (unsigned int)LCCR0);	debug("LCCR1 = 0x%08x\n", (unsigned int)LCCR1);	debug("LCCR2 = 0x%08x\n", (unsigned int)LCCR2);	debug("LCCR3 = 0x%08x\n", (unsigned int)LCCR3);}static int pxafb_init(vidinfo_t *vid){	struct pxafb_info *fbi = &vid->pxa;	debug("Configuring PXA LCD\n");	fbi->reg_lccr0 = REG_LCCR0;	fbi->reg_lccr3 = REG_LCCR3;	debug("vid: vl_col=%d hslen=%d lm=%d rm=%d\n",		vid->vl_col, vid->vl_hpw,		vid->vl_blw, vid->vl_elw);	debug("vid: vl_row=%d vslen=%d um=%d bm=%d\n",		vid->vl_row, vid->vl_vpw,		vid->vl_bfw, vid->vl_efw);	fbi->reg_lccr1 =		LCCR1_DisWdth(vid->vl_col) +		LCCR1_HorSnchWdth(vid->vl_hpw) +		LCCR1_BegLnDel(vid->vl_blw) +		LCCR1_EndLnDel(vid->vl_elw);	fbi->reg_lccr2 =		LCCR2_DisHght(vid->vl_row) +		LCCR2_VrtSnchWdth(vid->vl_vpw) +		LCCR2_BegFrmDel(vid->vl_bfw) +		LCCR2_EndFrmDel(vid->vl_efw);	fbi->reg_lccr3 = REG_LCCR3 & ~(LCCR3_HSP | LCCR3_VSP);	fbi->reg_lccr3 |=		  (vid->vl_hsp ? LCCR3_HorSnchL : LCCR3_HorSnchH)		| (vid->vl_vsp ? LCCR3_VrtSnchL : LCCR3_VrtSnchH);	/* setup dma descriptors */	fbi->dmadesc_fblow = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette - 3*16);	fbi->dmadesc_fbhigh = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette - 2*16);	fbi->dmadesc_palette = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette - 1*16);	#define BYTES_PER_PANEL	((fbi->reg_lccr0 & LCCR0_SDS) ? \		(vid->vl_col * vid->vl_row * NBITS(vid->vl_bpix) / 8 / 2) : \		(vid->vl_col * vid->vl_row * NBITS(vid->vl_bpix) / 8))	/* populate descriptors */	fbi->dmadesc_fblow->fdadr = (u_long)fbi->dmadesc_fblow;	fbi->dmadesc_fblow->fsadr = fbi->screen + BYTES_PER_PANEL;	fbi->dmadesc_fblow->fidr  = 0;	fbi->dmadesc_fblow->ldcmd = BYTES_PER_PANEL;	fbi->fdadr1 = (u_long)fbi->dmadesc_fblow; /* only used in dual-panel mode */	fbi->dmadesc_fbhigh->fsadr = fbi->screen;	fbi->dmadesc_fbhigh->fidr = 0;	fbi->dmadesc_fbhigh->ldcmd = BYTES_PER_PANEL;	fbi->dmadesc_palette->fsadr = fbi->palette;	fbi->dmadesc_palette->fidr  = 0;	fbi->dmadesc_palette->ldcmd = (fbi->palette_size * 2) | LDCMD_PAL;	if( NBITS(vid->vl_bpix) < 12)	{		/* assume any mode with <12 bpp is palette driven */		fbi->dmadesc_palette->fdadr = (u_long)fbi->dmadesc_fbhigh;		fbi->dmadesc_fbhigh->fdadr = (u_long)fbi->dmadesc_palette;		/* flips back and forth between pal and fbhigh */		fbi->fdadr0 = (u_long)fbi->dmadesc_palette;	}	else	{		/* palette shouldn't be loaded in true-color mode */		fbi->dmadesc_fbhigh->fdadr = (u_long)fbi->dmadesc_fbhigh;		fbi->fdadr0 = (u_long)fbi->dmadesc_fbhigh; /* no pal just fbhigh */	}	debug("fbi->dmadesc_fblow = 0x%lx\n", (u_long)fbi->dmadesc_fblow);	debug("fbi->dmadesc_fbhigh = 0x%lx\n", (u_long)fbi->dmadesc_fbhigh);	debug("fbi->dmadesc_palette = 0x%lx\n", (u_long)fbi->dmadesc_palette);	debug("fbi->dmadesc_fblow->fdadr = 0x%lx\n", fbi->dmadesc_fblow->fdadr);	debug("fbi->dmadesc_fbhigh->fdadr = 0x%lx\n", fbi->dmadesc_fbhigh->fdadr);	debug("fbi->dmadesc_palette->fdadr = 0x%lx\n", fbi->dmadesc_palette->fdadr);	debug("fbi->dmadesc_fblow->fsadr = 0x%lx\n", fbi->dmadesc_fblow->fsadr);	debug("fbi->dmadesc_fbhigh->fsadr = 0x%lx\n", fbi->dmadesc_fbhigh->fsadr);	debug("fbi->dmadesc_palette->fsadr = 0x%lx\n", fbi->dmadesc_palette->fsadr);	debug("fbi->dmadesc_fblow->ldcmd = 0x%lx\n", fbi->dmadesc_fblow->ldcmd);	debug("fbi->dmadesc_fbhigh->ldcmd = 0x%lx\n", fbi->dmadesc_fbhigh->ldcmd);	debug("fbi->dmadesc_palette->ldcmd = 0x%lx\n", fbi->dmadesc_palette->ldcmd);	return 0;}/************************************************************************//************************************************************************/#endif /* CONFIG_LCD */

⌨️ 快捷键说明

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