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

📄 xxxfb.c

📁 Framebuffer驱动示例程序.rar framebffer的编写示例程序说明
💻 C
📖 第 1 页 / 共 2 页
字号:
		rgbidx = RGB_8;		break;#endif#ifdef FBCON_HAS_CFB16	case 16:		display->visual = FB_VISUAL_TRUECOLOR;		display->line_length = var->xres * 2;		display->dispsw = &fbcon_cfb16;		display->dispsw_data = fbi->fb.pseudo_palette;		rgbidx = RGB_16;		break;#endif	default:		rgbidx = 0;		display->dispsw = &fbcon_dummy;		break;	}	display->screen_base = fbi->screen_cpu;	display->next_line = display->line_length;	display->type = fbi->fb.fix.type;	display->type_aux = fbi->fb.fix.type_aux;	display->ypanstep = fbi->fb.fix.ypanstep;	display->ywrapstep = fbi->fb.fix.ywrapstep;	display->can_soft_blank = 0;	display->inverse = fbi->cmap_inverse;	*dvar = *var;	dvar->activate &= ~FB_ACTIVATE_ALL;	dvar->red = fbi->rgb[rgbidx]->red;	dvar->green = fbi->rgb[rgbidx]->green;	dvar->blue = fbi->rgb[rgbidx]->blue;	dvar->transp = fbi->rgb[rgbidx]->transp;	display->var = *dvar;	if (var->activate & FB_ACTIVATE_ALL)		fbi->fb.disp->var = *dvar;	if (chgvar && info && fbi->fb.changevar)		fbi->fb.changevar (con);	if (con != fbi->currcon)		return 0;	xxxfb_hw_set_var (dvar, fbi);	return 0;}static int__do_set_cmap (struct fb_cmap *cmap, int kspc, int con, struct fb_info *info){	struct xxxfb_info *fbi = (struct xxxfb_info *) info;	struct fb_cmap *dcmap = get_con_cmap (info, con);	int err = 0;	if (con == -1)		con = fbi->currcon;	if (con >= 0)		err = fb_alloc_cmap (&fb_display[con].cmap, fbi->palette_size,				     0);	if (!err && con == fbi->currcon)		err = fb_set_cmap (cmap, kspc, xxxfb_setcolreg, info);	if (!err)		fb_copy_cmap (cmap, dcmap, kspc ? 0 : 1);	return err;}static intxxxfb_set_cmap (struct fb_cmap *cmap, int kspc, int con, struct fb_info *info){	struct display *disp = get_con_display (info, con);	if (disp->visual == FB_VISUAL_TRUECOLOR ||	    disp->visual == FB_VISUAL_STATIC_PSEUDOCOLOR)		return -EINVAL;	return __do_set_cmap (cmap, kspc, con, info);}static intxxxfb_get_fix (struct fb_fix_screeninfo *fix, int con, struct fb_info *info){	struct display *display = get_con_display (info, con);	*fix = info->fix;	fix->line_length = display->line_length;	fix->visual = display->visual;	return 0;}static intxxxfb_get_var (struct fb_var_screeninfo *var, int con, struct fb_info *info){	*var = *get_con_var (info, con);	return 0;}static intxxxfb_get_cmap (struct fb_cmap *cmap, int kspc, int con, struct fb_info *info){	struct fb_cmap *dcmap = get_con_cmap (info, con);	fb_copy_cmap (dcmap, cmap, kspc ? 0 : 2);	return 0;}static intxxxfb_ioctl (struct inode *inode, struct file *file, unsigned int cmd,	     unsigned long arg, int con, struct fb_info *info){}static struct fb_ops xxxfb_ops = {      owner:THIS_MODULE,      fb_get_fix:xxxfb_get_fix,      fb_get_var:xxxfb_get_var,      fb_set_var:xxxfb_set_var,      fb_get_cmap:xxxfb_get_cmap,      fb_set_cmap:xxxfb_set_cmap,      fb_ioctl:xxxfb_ioctl,};static intxxxfb_switch (int con, struct fb_info *info){	struct xxxfb_info *fbi = (struct xxxfb_info *) info;	struct display *disp;	struct fb_cmap *cmap;	if (con == fbi->currcon)		return 0;	if (fbi->currcon >= 0) {		disp = fb_display + fbi->currcon;		disp->var = fbi->fb.var;		if (disp->cmap.len)			fb_copy_cmap (&fbi->fb.cmap, &disp->cmap, 0);	}	fbi->currcon = con;	disp = fb_display + con;	fb_alloc_cmap (&fbi->fb.cmap, 256, 0);	if (disp->cmap.len)		cmap = &disp->cmap;	else		cmap = fb_default_cmap (1 << disp->var.bits_per_pixel);	fb_copy_cmap (cmap, &fbi->fb.cmap, 0);	fbi->fb.var = disp->var;	fbi->fb.var.activate = FB_ACTIVATE_NOW;	xxxfb_set_var (&fbi->fb.var, con, info);	return 0;}static int __initxxxfb_map_video_memory (struct xxxfb_info *fbi){	fbi->map_size = PAGE_ALIGN (fbi->fb.fix.smem_len + PAGE_SIZE);	fbi->map_cpu = consistent_alloc (GFP_KERNEL, fbi->map_size,					 &fbi->map_dma);	if (fbi->map_cpu) {		fbi->screen_cpu = fbi->map_cpu + PAGE_SIZE;		fbi->screen_dma = fbi->map_dma + PAGE_SIZE;		fbi->fb.fix.smem_start = fbi->screen_dma;		printk ("fbi->map_size:%x, fbi->map_cpu:%x\n", fbi->map_size,			fbi->map_cpu);		printk ("fbi->map_dma:%x\n", fbi->map_dma);	}	return fbi->map_cpu ? 0 : -ENOMEM;}static intxxxfb_updatevar (int con, struct fb_info *info){	return 0;}static voidxxxfb_blank (int blank, struct fb_info *info){}static struct fb_monspecs monspecs __initdata = {	30000, 70000, 50, 65, 0};static struct xxxfb_info *__initxxxfb_init_fbinfo (void){	struct xxxfb_mach_info *inf;	struct xxxfb_info *fbi;	fbi = kmalloc (sizeof (struct xxxfb_info) + sizeof (struct display) +		       sizeof (u16) * 16, GFP_KERNEL);	if (!fbi)		return NULL;	memset (fbi, 0, sizeof (struct xxxfb_info) + sizeof (struct display));	fbi->currcon = -1;	strcpy (fbi->fb.fix.id, XXX_NAME);	fbi->fb.fix.type = FB_TYPE_PACKED_PIXELS;	fbi->fb.fix.type_aux = 0;	fbi->fb.fix.xpanstep = 0;	fbi->fb.fix.ypanstep = 0;	fbi->fb.fix.ywrapstep = 0;	fbi->fb.fix.accel = FB_ACCEL_NONE;	fbi->fb.var.nonstd = 0;	fbi->fb.var.activate = FB_ACTIVATE_NOW;	fbi->fb.var.height = -1;	fbi->fb.var.width = -1;	fbi->fb.var.accel_flags = 0;	fbi->fb.var.vmode = FB_VMODE_NONINTERLACED;	strcpy (fbi->fb.modename, XXX_NAME);	strcpy (fbi->fb.fontname, "Acorn8x8");	fbi->fb.fbops = &xxxfb_ops;	fbi->fb.changevar = NULL;	fbi->fb.switch_con = xxxfb_switch;	fbi->fb.updatevar = xxxfb_updatevar;	fbi->fb.blank = xxxfb_blank;	fbi->fb.flags = FBINFO_FLAG_DEFAULT;	fbi->fb.node = -1;	fbi->fb.monspecs = monspecs;	fbi->fb.disp = (struct display *) (fbi + 1);	fbi->fb.pseudo_palette = (void *) (fbi->fb.disp + 1);	fbi->rgb[RGB_8] = &rgb_8;	fbi->rgb[RGB_16] = &def_rgb_16;	inf = xxxfb_get_machine_info (fbi);	fbi->max_xres = inf->xres;	fbi->fb.var.xres = inf->xres;	fbi->fb.var.xres_virtual = inf->xres;	fbi->max_yres = inf->yres;	fbi->fb.var.yres = inf->yres;	fbi->fb.var.yres_virtual = inf->yres;	fbi->max_bpp = inf->bpp;	fbi->fb.var.bits_per_pixel = inf->bpp;	fbi->fb.var.pixclock = inf->pixclock;	fbi->fb.var.hsync_len = inf->hsync_len;	fbi->fb.var.left_margin = inf->left_margin;	fbi->fb.var.right_margin = inf->right_margin;	fbi->fb.var.vsync_len = inf->vsync_len;	fbi->fb.var.upper_margin = inf->upper_margin;	fbi->fb.var.lower_margin = inf->lower_margin;	fbi->fb.var.sync = inf->sync;	fbi->fb.var.grayscale = inf->cmap_grayscale;	fbi->cmap_inverse = inf->cmap_inverse;	fbi->cmap_static = inf->cmap_static;	fbi->fb.fix.smem_len = fbi->max_xres * fbi->max_yres *		fbi->max_bpp / 8;	return fbi;}voidxxx_hw_init (void){	/*init hareware */	return;}int __initxxxfb_init (void){	struct xxxfb_info *fbi;	int ret;	fbi = xxxfb_init_fbinfo ();	ret = -ENOMEM;	if (!fbi)		goto failed;	ret = xxxfb_map_video_memory (fbi);	if (ret)		goto failed;	xxx_hw_init ();	xxxfb_set_var (&fbi->fb.var, -1, &fbi->fb);	ret = register_framebuffer (&fbi->fb);	if (ret < 0)		goto failed;	/* enable the LCD controller) */	printk ("Installed XXX frame buffer\n");	MOD_INC_USE_COUNT;	return 0;      failed:	if (fbi)		kfree (fbi);	return ret;}int __init xxxfb_do_x_opt(int x_val){	printk("xxxfb: xxxfb_do_x_opt, x is %d\n", x_val);	}int __initxxxfb_setup (char *options){	char *this_opt;	int i=0;	if (!options || !*options)		          return 0;	for (this_opt = strtok(options, ","); this_opt;		this_opt = strtok(NULL,      ",")) {		i++;		printk("xxxfb: option%d: %s\n", i, this_opt);		if (!strncmp(this_opt, "x:", 2)) {			xxxfb_do_x_opt(simple_strtoul(this_opt+2, NULL, 0));		}	}	return 0;}#ifdef MODULEmodule_init (xxxfb_init);#endif

⌨️ 快捷键说明

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