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

📄 hgafb.c

📁 S3C44B0X下的LCD (framebuffer)驱动资料与相关代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 *	hga_set_var - set the user defined part of the display *	@var:new video mode *	@con:unused *	@info:pointer to fb_info object containing info for current hga board *	 *	This function is called for changing video modes. Since HGA cards have *	only one fixed mode we have not much to do. After checking input  *	parameters @var is copied to @info->var and @info->changevar is called. *	A zero is returned on success and %-EINVAL for failure. *	 *	FIXME: *	This is the most mystical function (at least for me). *	What is the exact specification of xxx_set_var()? *	Should it handle xoffset, yoffset? Should it do panning? *	What does vmode mean? */int hga_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info){	CHKINFO(-EINVAL);	DPRINTK("hga_set_var: con:%d, activate:%x, info:0x%x, fb_info:%x\n", con, var->activate, (unsigned)info, (unsigned)&fb_info);		if (var->xres != 720 ||	var->yres != 348 ||	    var->xres_virtual != 720 ||	    var->yres_virtual < 348 || var->yres_virtual > 348 + 16 ||	    var->bits_per_pixel != 1 || var->grayscale != 0) {		return -EINVAL;	}	if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {		info->var = *var;		if (info->changevar) 			(*info->changevar)(con);	}	return 0;}/** *	hga_getcolreg - read color registers *	@regno:register index to read out *	@red:red value *	@green:green value *	@blue:blue value *	@transp:transparency value *	@info:unused * *	This callback function is used to read the color registers of a HGA *	board. Since we have only two fixed colors, RGB values are 0x0000  *	for register0 and 0xaaaa for register1. *	A zero is returned on success and 1 for failure. */static int hga_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,			 u_int *transp, struct fb_info *info){	if (regno == 0) {		*red = *green = *blue = 0x0000;		*transp = 0;	} else if (regno == 1) {		*red = *green = *blue = 0xaaaa;		*transp = 0;	} else		return 1;	return 0;}/** *	hga_get_cmap - get the colormap *	@cmap:struct fb_cmap to fill in *	@kspc:called from kernel space? *	@con:unused *	@info:pointer to fb_info object containing info for current hga board * *	This wrapper function passes it's input parameters to fb_get_cmap(). *	Callback function hga_getcolreg() is used to read the color registers. */int hga_get_cmap(struct fb_cmap *cmap, int kspc, int con,                 struct fb_info *info){	CHKINFO(-EINVAL);	DPRINTK("hga_get_cmap: con:%d\n", con);	return fb_get_cmap(cmap, kspc, hga_getcolreg, info);}	/** *	hga_setcolreg - set color registers *	@regno:register index to set *	@red:red value, unused *	@green:green value, unused *	@blue:blue value, unused *	@transp:transparency value, unused *	@info:unused * *	This callback function is used to set the color registers of a HGA *	board. Since we have only two fixed colors only @regno is checked. *	A zero is returned on success and 1 for failure. */static int hga_setcolreg(u_int regno, u_int red, u_int green, u_int blue,			 u_int transp, struct fb_info *info){	if (regno > 1)		return 1;	return 0;}/** *	hga_set_cmap - set the colormap *	@cmap:struct fb_cmap to set *	@kspc:called from kernel space? *	@con:unused *	@info:pointer to fb_info object containing info for current hga board * *	This wrapper function passes it's input parameters to fb_set_cmap(). *	Callback function hga_setcolreg() is used to set the color registers. */int hga_set_cmap(struct fb_cmap *cmap, int kspc, int con,                 struct fb_info *info){	CHKINFO(-EINVAL);	DPRINTK("hga_set_cmap: con:%d\n", con);	return fb_set_cmap(cmap, kspc, hga_setcolreg, info);}/** *	hga_pan_display - pan or wrap the display *	@var:contains new xoffset, yoffset and vmode values *	@con:unused *	@info:pointer to fb_info object containing info for current hga board * *	This function looks only at xoffset, yoffset and the %FB_VMODE_YWRAP *	flag in @var. If input parameters are correct it calls hga_pan() to  *	program the hardware. @info->var is updated to the new values. *	A zero is returned on success and %-EINVAL for failure. */int hga_pan_display(struct fb_var_screeninfo *var, int con,                    struct fb_info *info){	CHKINFO(-EINVAL);	DPRINTK("pan_disp: con:%d, wrap:%d, xoff:%d, yoff:%d\n", con, var->vmode & FB_VMODE_YWRAP, var->xoffset, var->yoffset);	if (var->vmode & FB_VMODE_YWRAP) {		if (var->yoffset < 0 || 		    var->yoffset >= info->var.yres_virtual ||		    var->xoffset)			return -EINVAL;	} else {		if (var->xoffset + var->xres > info->var.xres_virtual		 || var->yoffset + var->yres > info->var.yres_virtual		 || var->yoffset % 8)			return -EINVAL;	}	hga_pan(var->xoffset, var->yoffset);	info->var.xoffset = var->xoffset;	info->var.yoffset = var->yoffset;	if (var->vmode & FB_VMODE_YWRAP)		info->var.vmode |= FB_VMODE_YWRAP;	else		info->var.vmode &= ~FB_VMODE_YWRAP;	return 0;}    static struct fb_ops hgafb_ops = {	owner:		THIS_MODULE,	fb_get_fix:	hga_get_fix,	fb_get_var:	hga_get_var,	fb_set_var:	hga_set_var,	fb_get_cmap:	hga_get_cmap,	fb_set_cmap:	hga_set_cmap,	fb_pan_display:	hga_pan_display,};		/* ------------------------------------------------------------------------- * * * Functions in fb_info *  * ------------------------------------------------------------------------- *//** *	hgafbcon_switch - switch console *	@con:new console to switch to *	@info:pointer to fb_info object containing info for current hga board * *	This function should install a new colormap and change the video mode. *	Since we have fixed colors and only one video mode we have nothing to  *	do. *	Only console administration is done but it should go to fbcon.c IMHO. *	A zero is returned on success and %-EINVAL for failure. */static int hgafbcon_switch(int con, struct fb_info *info){	CHKINFO(-EINVAL);	DPRINTK("hgafbcon_switch: currcon:%d, con:%d, info:%x, fb_info:%x\n", currcon, con, (unsigned)info, (unsigned)&fb_info);	/* Save the colormap and video mode */#if 0	/* Not necessary in hgafb, we use fixed colormap */	fb_copy_cmap(&info->cmap, &fb_display[currcon].cmap, 0);#endif	if (currcon != -1) /* this check is absolute necessary! */		memcpy(&fb_display[currcon].var, &info->var,				sizeof(struct fb_var_screeninfo));	/* Install a new colormap and change the video mode. By default fbcon	 * sets all the colormaps and video modes to the default values at	 * bootup.	 */#if 0	fb_copy_cmap(&fb_display[con].cmap, &info->cmap, 0);	fb_set_cmap(&info->cmap, 1, hga_setcolreg, info);#endif	memcpy(&info->var, &fb_display[con].var,			sizeof(struct fb_var_screeninfo));	/* hga_set_var(&info->var, con, &fb_info); is it necessary? */	currcon = con;	/* Hack to work correctly with XF86_Mono */	hga_gfx_mode();	return 0;}/** *	hgafbcon_updatevar - update the user defined part of the display *	@con:console to update or -1 when no consoles defined on this fb *	@info:pointer to fb_info object containing info for current hga board * *	This function is called when @var is changed by fbcon.c without calling  *	hga_set_var(). It usually means scrolling.  hga_pan_display() is called *	to update the hardware and @info->var. *	A zero is returned on success and %-EINVAL for failure. */static int hgafbcon_updatevar(int con, struct fb_info *info){	CHKINFO(-EINVAL);	DPRINTK("hga_update_var: con:%d, info:%x, fb_info:%x\n", con, (unsigned)info, (unsigned)&fb_info);	return (con < 0) ? -EINVAL : hga_pan_display(&fb_display[con].var, con, info);}/** *	hgafbcon_blank - (un)blank the screen *	@blank_mode:blanking method to use *	@info:unused *	 *	Blank the screen if blank_mode != 0, else unblank.  *	Implements VESA suspend and powerdown modes on hardware that supports  *	disabling hsync/vsync: *		@blank_mode == 2 means suspend vsync, *		@blank_mode == 3 means suspend hsync, *		@blank_mode == 4 means powerdown. */static void hgafbcon_blank(int blank_mode, struct fb_info *info){	CHKINFO( );	DPRINTK("hga_blank: blank_mode:%d, info:%x, fb_info:%x\n", blank_mode, (unsigned)info, (unsigned)&fb_info);	hga_blank(blank_mode);}/* ------------------------------------------------------------------------- */    	/*	 *  Initialization	 */int __init hgafb_init(void){	if (! hga_card_detect()) {		printk(KERN_ERR "hgafb: HGA card not detected.\n");		return -EINVAL;	}	printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n",		hga_type_name, hga_vram_len/1024);	hga_gfx_mode();	hga_clear_screen();#ifdef MODULE	if (!nologo) hga_show_logo();#endif /* MODULE */	hga_fix.smem_start = VGA_MAP_MEM(hga_vram_base);	hga_fix.smem_len = hga_vram_len;	disp.var = hga_default_var;/*	disp.cmap = ???; */	disp.screen_base = (char*)hga_fix.smem_start;	disp.visual = hga_fix.visual;	disp.type = hga_fix.type;	disp.type_aux = hga_fix.type_aux;	disp.ypanstep = hga_fix.ypanstep;	disp.ywrapstep = hga_fix.ywrapstep;	disp.line_length = hga_fix.line_length;	disp.can_soft_blank = 1;	disp.inverse = 0;#ifdef FBCON_HAS_HGA	disp.dispsw = &fbcon_hga;#else#warning HGAFB will not work as a console!	disp.dispsw = &fbcon_dummy;#endif	disp.dispsw_data = NULL;	disp.scrollmode = SCROLL_YREDRAW;		strcpy (fb_info.modename, hga_fix.id);	fb_info.node = -1;	fb_info.flags = FBINFO_FLAG_DEFAULT;/*	fb_info.open = ??? */	fb_info.var = hga_default_var;	fb_info.fix = hga_fix;	fb_info.monspecs.hfmin = 0;	fb_info.monspecs.hfmax = 0;	fb_info.monspecs.vfmin = 10000;	fb_info.monspecs.vfmax = 10000;	fb_info.monspecs.dpms = 0;	fb_info.fbops = &hgafb_ops;	fb_info.screen_base = (char *)hga_fix.smem_start;	fb_info.disp = &disp;/*	fb_info.display_fg = ??? *//*	fb_info.fontname initialized later */	fb_info.changevar = NULL;	fb_info.switch_con = hgafbcon_switch;	fb_info.updatevar = hgafbcon_updatevar;	fb_info.blank = hgafbcon_blank;	fb_info.pseudo_palette = NULL; /* ??? */	fb_info.par = NULL;        if (register_framebuffer(&fb_info) < 0)                return -EINVAL;        printk(KERN_INFO "fb%d: %s frame buffer device\n",               GET_FB_IDX(fb_info.node), fb_info.modename);		return 0;}	/*	 *  Setup	 */#ifndef MODULEint __init hgafb_setup(char *options){	/* 	 * Parse user speficied options	 * `video=hga:font:VGA8x16' or	 * `video=hga:font:SUN8x16' recommended	 * Other supported fonts: VGA8x8, Acorn8x8, PEARL8x8	 * More different fonts can be used with the `setfont' utility.	 */	char *this_opt;	fb_info.fontname[0] = '\0';	if (!options || !*options)		return 0;	while ((this_opt = strsep(&options, ","))) {		if (!strncmp(this_opt, "font:", 5))			strcpy(fb_info.fontname, this_opt+5);	}	return 0;}#endif /* !MODULE */	/*	 * Cleanup	 */#ifdef MODULEstatic void hgafb_cleanup(struct fb_info *info){	hga_txt_mode();	hga_clear_screen();	unregister_framebuffer(info);	if (release_io_ports) release_region(0x3b0, 12);	if (release_io_port) release_region(0x3bf, 1);}#endif /* MODULE *//* ------------------------------------------------------------------------- * *  Modularization * * ------------------------------------------------------------------------- */#ifdef MODULEint init_module(void){	if (font)		strncpy(fb_info.fontname, font, sizeof(fb_info.fontname)-1);	else		fb_info.fontname[0] = '\0';	return hgafb_init();}void cleanup_module(void){	hgafb_cleanup(&fb_info);}MODULE_AUTHOR("Ferenc Bakonyi (fero@drama.obuda.kando.hu)");MODULE_DESCRIPTION("FBDev driver for Hercules Graphics Adaptor");MODULE_LICENSE("GPL");MODULE_PARM(font, "s");MODULE_PARM_DESC(font, "Specifies one of the compiled-in fonts (VGA8x8, VGA8x16, SUN8x16, Acorn8x8, PEARL8x8) (default=none)");MODULE_PARM(nologo, "i");MODULE_PARM_DESC(nologo, "Disables startup logo if != 0 (default=0)");#endif /* MODULE */

⌨️ 快捷键说明

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