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

📄 pm3fb.c

📁 S3C44B0X下的LCD (framebuffer)驱动资料与相关代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	}		l_fb_info->fb_size = memsize;		if (ptr == pm3fb_timing_retry)	{		printk(KERN_WARNING "pm3fb: retrying memory timings check");		if (pm3fb_try_memory_timings(l_fb_info) == pm3fb_timing_problem)			return(0);	}		return (memsize);}static void pm3fb_clear_memory(struct pm3fb_info *l_fb_info, u32 cc){	int i;	DTRACE;	for (i = 0; i < (l_fb_info->fb_size / sizeof(u32)) ; i++) /* clear entire FB memory to black */	{#ifdef KERNEL_2_2#ifdef MUST_BYTESWAP		writel(__swab32(cc), (l_fb_info->v_fb + (i * sizeof(u32))));#else		writel(cc, (l_fb_info->v_fb + (i * sizeof(u32))));#endif#endif#if (defined KERNEL_2_4) || (defined KERNEL_2_5)		fb_writel(cc, (l_fb_info->v_fb + (i * sizeof(u32))));#endif	}}static void pm3fb_clear_colormap(struct pm3fb_info *l_fb_info, unsigned char r, unsigned char g, unsigned char b){	int i;	DTRACE;	for (i = 0; i < 256 ; i++) /* fill color map with white */		pm3fb_set_color(l_fb_info, i, r, g, b);}/* common initialisation */static void pm3fb_common_init(struct pm3fb_info *l_fb_info){	DTRACE;	DPRINTK(2, "Initializing board #%ld @ %lx\n", l_fb_info->board_num,		(unsigned long) l_fb_info);	strcpy(l_fb_info->gen.info.modename, permedia3_name);	disp[l_fb_info->board_num].scrollmode = 0;	/* SCROLL_YNOMOVE; *//* 0 means "let fbcon choose" */	l_fb_info->gen.parsize = sizeof(struct pm3fb_par);	l_fb_info->gen.info.changevar = NULL;	l_fb_info->gen.info.node = B_FREE;	l_fb_info->gen.info.fbops = &pm3fb_ops;	l_fb_info->gen.info.disp = &(disp[l_fb_info->board_num]);	if (fontn[l_fb_info->board_num][0])		strcpy(l_fb_info->gen.info.fontname,		       fontn[l_fb_info->board_num]);	l_fb_info->gen.info.switch_con = &fbgen_switch;	l_fb_info->gen.info.updatevar = &fbgen_update_var;	/* */	l_fb_info->gen.info.blank = &fbgen_blank;	/* */	l_fb_info->gen.info.flags = FBINFO_FLAG_DEFAULT;	pm3fb_mapIO(l_fb_info);	pm3fb_clear_memory(l_fb_info, 0);	pm3fb_clear_colormap(l_fb_info, 0, 0, 0);	(void) fbgen_get_var(&(disp[l_fb_info->board_num]).var, -1,			     &l_fb_info->gen.info);	if (depth[l_fb_info->board_num]) /* override mode-defined depth */	{		pm3fb_encode_depth(&(disp[l_fb_info->board_num]).var, depth[l_fb_info->board_num]);		(disp[l_fb_info->board_num]).var.bits_per_pixel = depth2bpp(depth[l_fb_info->board_num]);	}	(void) fbgen_do_set_var(&(disp[l_fb_info->board_num]).var, 1,				&l_fb_info->gen);	fbgen_set_disp(-1, &l_fb_info->gen);	fbgen_install_cmap(0, &l_fb_info->gen);	if (register_framebuffer(&l_fb_info->gen.info) < 0) {		DPRINTK(1, "Couldn't register framebuffer\n");		return;	}	PM3_WRITE_DAC_REG(PM3RD_CursorMode,			  PM3RD_CursorMode_CURSOR_DISABLE);		PM3_SHOW_CUR_MODE;		pm3fb_write_mode(l_fb_info);		printk("fb%d: %s, using %uK of video memory (%s)\n",	       GET_FB_IDX(l_fb_info->gen.info.node),	       permedia3_name, (u32) (l_fb_info->fb_size >> 10),	       cardbase[l_fb_info->board_type].cardname);}/* **************************************************** *//* ***** accelerated permedia3-specific functions ***** *//* **************************************************** */#ifdef PM3FB_USE_ACCELstatic void pm3fb_wait_pm3(struct pm3fb_info *l_fb_info){	DTRACE;	PM3_SLOW_WRITE_REG(PM3FilterMode, PM3FilterModeSync);	PM3_SLOW_WRITE_REG(PM3Sync, 0);	mb();	do {		while ((PM3_READ_REG(PM3OutFIFOWords)) == 0);		rmb();	} while ((PM3_READ_REG(PM3OutputFifo)) != PM3Sync_Tag);}static void pm3fb_init_engine(struct pm3fb_info *l_fb_info){	PM3_SLOW_WRITE_REG(PM3FilterMode, PM3FilterModeSync);	PM3_SLOW_WRITE_REG(PM3StatisticMode, 0x0);	PM3_SLOW_WRITE_REG(PM3DeltaMode, 0x0);	PM3_SLOW_WRITE_REG(PM3RasterizerMode, 0x0);	PM3_SLOW_WRITE_REG(PM3ScissorMode, 0x0);	PM3_SLOW_WRITE_REG(PM3LineStippleMode, 0x0);	PM3_SLOW_WRITE_REG(PM3AreaStippleMode, 0x0);	PM3_SLOW_WRITE_REG(PM3GIDMode, 0x0);	PM3_SLOW_WRITE_REG(PM3DepthMode, 0x0);	PM3_SLOW_WRITE_REG(PM3StencilMode, 0x0);	PM3_SLOW_WRITE_REG(PM3StencilData, 0x0);	PM3_SLOW_WRITE_REG(PM3ColorDDAMode, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureCoordMode, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureIndexMode0, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureIndexMode1, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureReadMode, 0x0);	PM3_SLOW_WRITE_REG(PM3LUTMode, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureFilterMode, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureCompositeMode, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureApplicationMode, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureCompositeColorMode1, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureCompositeAlphaMode1, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureCompositeColorMode0, 0x0);	PM3_SLOW_WRITE_REG(PM3TextureCompositeAlphaMode0, 0x0);	PM3_SLOW_WRITE_REG(PM3FogMode, 0x0);	PM3_SLOW_WRITE_REG(PM3ChromaTestMode, 0x0);	PM3_SLOW_WRITE_REG(PM3AlphaTestMode, 0x0);	PM3_SLOW_WRITE_REG(PM3AntialiasMode, 0x0);	PM3_SLOW_WRITE_REG(PM3YUVMode, 0x0);	PM3_SLOW_WRITE_REG(PM3AlphaBlendColorMode, 0x0);	PM3_SLOW_WRITE_REG(PM3AlphaBlendAlphaMode, 0x0);	PM3_SLOW_WRITE_REG(PM3DitherMode, 0x0);	PM3_SLOW_WRITE_REG(PM3LogicalOpMode, 0x0);	PM3_SLOW_WRITE_REG(PM3RouterMode, 0x0);	PM3_SLOW_WRITE_REG(PM3Window, 0x0);	PM3_SLOW_WRITE_REG(PM3Config2D, 0x0);	PM3_SLOW_WRITE_REG(PM3SpanColorMask, 0xffffffff);	PM3_SLOW_WRITE_REG(PM3XBias, 0x0);	PM3_SLOW_WRITE_REG(PM3YBias, 0x0);	PM3_SLOW_WRITE_REG(PM3DeltaControl, 0x0);	PM3_SLOW_WRITE_REG(PM3BitMaskPattern, 0xffffffff);	PM3_SLOW_WRITE_REG(PM3FBDestReadEnables,			   PM3FBDestReadEnables_E(0xff) |			   PM3FBDestReadEnables_R(0xff) |			   PM3FBDestReadEnables_ReferenceAlpha(0xff));	PM3_SLOW_WRITE_REG(PM3FBDestReadBufferAddr0, 0x0);	PM3_SLOW_WRITE_REG(PM3FBDestReadBufferOffset0, 0x0);	PM3_SLOW_WRITE_REG(PM3FBDestReadBufferWidth0,			   PM3FBDestReadBufferWidth_Width(l_fb_info->							  current_par->							  width));	PM3_SLOW_WRITE_REG(PM3FBDestReadMode,			   PM3FBDestReadMode_ReadEnable |			   PM3FBDestReadMode_Enable0);	PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferAddr, 0x0);	PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferOffset, 0x0);	PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferWidth,			   PM3FBSourceReadBufferWidth_Width(l_fb_info->							    current_par->							    width));	PM3_SLOW_WRITE_REG(PM3FBSourceReadMode,			   PM3FBSourceReadMode_Blocking |			   PM3FBSourceReadMode_ReadEnable);	{		unsigned long rm = 1;		switch (l_fb_info->current_par->depth) {		case 8:			PM3_SLOW_WRITE_REG(PM3PixelSize,					   PM3PixelSize_GLOBAL_8BIT);			break;		case 12:		case 15:		case 16:			PM3_SLOW_WRITE_REG(PM3PixelSize,					   PM3PixelSize_GLOBAL_16BIT);			break;		case 32:			PM3_SLOW_WRITE_REG(PM3PixelSize,					   PM3PixelSize_GLOBAL_32BIT);			break;		default:			DPRINTK(1, "Unsupported depth %d\n",				l_fb_info->current_par->depth);			break;		}		PM3_SLOW_WRITE_REG(PM3RasterizerMode, rm);	}	PM3_SLOW_WRITE_REG(PM3FBSoftwareWriteMask, 0xffffffff);	PM3_SLOW_WRITE_REG(PM3FBHardwareWriteMask, 0xffffffff);	PM3_SLOW_WRITE_REG(PM3FBWriteMode,			   PM3FBWriteMode_WriteEnable |			   PM3FBWriteMode_OpaqueSpan |			   PM3FBWriteMode_Enable0);	PM3_SLOW_WRITE_REG(PM3FBWriteBufferAddr0, 0x0);	PM3_SLOW_WRITE_REG(PM3FBWriteBufferOffset0, 0x0);	PM3_SLOW_WRITE_REG(PM3FBWriteBufferWidth0,			   PM3FBWriteBufferWidth_Width(l_fb_info->						       current_par->						       width));	PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, 0x0);	{		unsigned long sofb = (8UL * l_fb_info->fb_size) /			((depth2bpp(l_fb_info->current_par->depth))			 * l_fb_info->current_par->width);	/* size in lines of FB */		if (sofb > 4095)			PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, 4095);		else			PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, sofb);				switch (l_fb_info->current_par->depth) {		case 8:			PM3_SLOW_WRITE_REG(PM3DitherMode,					   (1 << 10) | (2 << 3));			break;		case 12:		case 15:		case 16:			PM3_SLOW_WRITE_REG(PM3DitherMode,					   (1 << 10) | (1 << 3));			break;		case 32:			PM3_SLOW_WRITE_REG(PM3DitherMode,					   (1 << 10) | (0 << 3));			break;		default:			DPRINTK(1, "Unsupported depth %d\n",				l_fb_info->current_par->depth);			break;		}	}	PM3_SLOW_WRITE_REG(PM3dXDom, 0x0);	PM3_SLOW_WRITE_REG(PM3dXSub, 0x0);	PM3_SLOW_WRITE_REG(PM3dY, (1 << 16));	PM3_SLOW_WRITE_REG(PM3StartXDom, 0x0);	PM3_SLOW_WRITE_REG(PM3StartXSub, 0x0);	PM3_SLOW_WRITE_REG(PM3StartY, 0x0);	PM3_SLOW_WRITE_REG(PM3Count, 0x0);	/* Disable LocalBuffer. better safe than sorry */	PM3_SLOW_WRITE_REG(PM3LBDestReadMode, 0x0);	PM3_SLOW_WRITE_REG(PM3LBDestReadEnables, 0x0);	PM3_SLOW_WRITE_REG(PM3LBSourceReadMode, 0x0);	PM3_SLOW_WRITE_REG(PM3LBWriteMode, 0x0);		pm3fb_wait_pm3(l_fb_info);}#ifdef FBCON_HAS_CFB32static void pm3fb_cfb32_clear(struct vc_data *conp,			      struct display *p,			      int sy, int sx, int height, int width){	struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info;	u32 c;	DTRACE;	sx = sx * fontwidth(p);	width = width * fontwidth(p);	sy = sy * fontheight(p);	height = height * fontheight(p);	c = ((u32 *) p->dispsw_data)[attr_bgcol_ec(p, conp)];	/* block fills in 32bpp are hard, but in low res (width <= 1600 :-)	   we can use 16bpp operations, but not if NoWriteMask is on (SDRAM)  */	if ((l_fb_info->current_par->width > 1600) ||	    (l_fb_info->memt.caps & PM3LocalMemCaps_NoWriteMask)) {		PM3_WAIT(4);		PM3_WRITE_REG(PM3Config2D,					  PM3Config2D_UseConstantSource |					  PM3Config2D_ForegroundROPEnable |					  (PM3Config2D_ForegroundROP(0x3)) |	/* Ox3 is GXcopy */					  PM3Config2D_FBWriteEnable);		PM3_WRITE_REG(PM3ForegroundColor, c);		PM3_WRITE_REG(PM3RectanglePosition,			      (PM3RectanglePosition_XOffset(sx)) |			      (PM3RectanglePosition_YOffset(sy)));		PM3_WRITE_REG(PM3Render2D,			      PM3Render2D_XPositive |			      PM3Render2D_YPositive |			      PM3Render2D_Operation_Normal |			      PM3Render2D_SpanOperation |			      (PM3Render2D_Width(width)) |			      (PM3Render2D_Height(height)));	} else {		PM3_WAIT(8);		PM3_WRITE_REG(PM3FBBlockColor, c);		PM3_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_16BIT);		PM3_WRITE_REG(PM3FBWriteBufferWidth0,			      PM3FBWriteBufferWidth_Width(l_fb_info->							  current_par->							  width << 1));		PM3_WRITE_REG(PM3Config2D,					  PM3Config2D_UseConstantSource |					  PM3Config2D_ForegroundROPEnable |					  (PM3Config2D_ForegroundROP(0x3)) |	/* Ox3 is GXcopy */					  PM3Config2D_FBWriteEnable);		PM3_WRITE_REG(PM3RectanglePosition,			      (PM3RectanglePosition_XOffset(sx << 1)) |			      (PM3RectanglePosition_YOffset(sy)));		PM3_WRITE_REG(PM3Render2D,			      PM3Render2D_XPositive |			      PM3Render2D_YPositive |			      PM3Render2D_Operation_Normal |			      (PM3Render2D_Width(width << 1)) |			      (PM3Render2D_Height(height)));		PM3_WRITE_REG(PM3FBWriteBufferWidth0,			      PM3FBWriteBufferWidth_Width(l_fb_info->							  current_par->							  width));		PM3_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_32BIT);	}	pm3fb_wait_pm3(l_fb_info);}static void pm3fb_cfb32_clear_margins(struct vc_data *conp,				      struct display *p, int bottom_only){	struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info;	int sx, sy;	u32 c;	DTRACE;	sx = conp->vc_cols * fontwidth(p);	/* right margin */	sy = conp->vc_rows * fontheight(p);	/* bottom margin */	c = ((u32 *) p->dispsw_data)[attr_bgcol_ec(p, conp)];	if (!bottom_only) {	/* right margin top->bottom */		PM3_WAIT(4);		PM3_WRITE_REG(PM3Config2D,					  PM3Config2D_UseConstantSource |					  PM3Config2D_Foregrou

⌨️ 快捷键说明

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