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

📄 anakinfb.c

📁 linux下的VIDEO接口驱动程序
💻 C
字号:
/* *  linux/drivers/video/anakinfb.c * *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * *  Changelog: *   23-Apr-2001 TTC	Created */#include <linux/types.h>#include <linux/fb.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/init.h>#include <linux/module.h>#include <asm/io.h>#include <video/fbcon.h>#include <video/fbcon-cfb16.h>static u16 colreg[16];static int currcon = 0;static struct fb_info fb_info;static struct display display;static intanakinfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,			u_int *transp, struct fb_info *info){	if (regno > 15)		return 1;	*red = colreg[regno] & 0xf800;	*green = colreg[regno] & 0x7e0 << 5;	*blue = colreg[regno] & 0x1f << 11;	*transp = 0;	return 0;}static intanakinfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,			u_int transp, struct fb_info *info){	if (regno > 15)		return 1;	colreg[regno] = (red & 0xf800) | (green & 0xfc00 >> 5) |			(blue & 0xf800 >> 11);	return 0;}static intanakinfb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info){	memset(fix, 0, sizeof(struct fb_fix_screeninfo));	strcpy(fix->id, "AnakinFB");	fix->smem_start = VGA_START;	fix->smem_len = VGA_SIZE;	fix->type = FB_TYPE_PACKED_PIXELS;	fix->type_aux = 0;	fix->visual = FB_VISUAL_TRUECOLOR;	fix->xpanstep = 0;	fix->ypanstep = 0;	fix->ywrapstep = 0;        fix->line_length = 400 * 2;	fix->accel = FB_ACCEL_NONE;	return 0;}        static intanakinfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info){	memset(var, 0, sizeof(struct fb_var_screeninfo));	var->xres = 400;	var->yres = 234;	var->xres_virtual = 400;	var->yres_virtual = 234;	var->xoffset = 0;	var->yoffset = 0;	var->bits_per_pixel = 16;	var->grayscale = 0;	var->red.offset = 11;	var->red.length = 5;	var->green.offset = 5;	var->green.length = 6;	var->blue.offset = 0;	var->blue.length = 5;	var->transp.offset = 0;	var->transp.length = 0;	var->nonstd = 0;	var->activate = FB_ACTIVATE_NOW;	var->height = -1;	var->width = -1;	var->pixclock = 0;	var->left_margin = 0;	var->right_margin = 0;	var->upper_margin = 0;	var->lower_margin = 0;	var->hsync_len = 0;	var->vsync_len = 0;	var->sync = 0;	var->vmode = FB_VMODE_NONINTERLACED;	return 0;}static intanakinfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info){	return -EINVAL;}static intanakinfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,			struct fb_info *info){	if (con == currcon)		return fb_get_cmap(cmap, kspc, anakinfb_getcolreg, info);	else if (fb_display[con].cmap.len)		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);	else		fb_copy_cmap(fb_default_cmap(16), cmap, kspc ? 0 : 2);	return 0;}static intanakinfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,			struct fb_info *info){	int err;	if (!fb_display[con].cmap.len) {		if ((err = fb_alloc_cmap(&fb_display[con].cmap, 16, 0)))			return err;	}	if (con == currcon)		return fb_set_cmap(cmap, kspc, anakinfb_setcolreg, info);	else		fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);	return 0;}static intanakinfb_switch_con(int con, struct fb_info *info){ 	currcon = con;	return 0;}static intanakinfb_updatevar(int con, struct fb_info *info){	return 0;}static voidanakinfb_blank(int blank, struct fb_info *info){	/*	 * TODO: use I2C to blank/unblank the screen	 */}static struct fb_ops anakinfb_ops = {	owner:		THIS_MODULE,	fb_get_fix:	anakinfb_get_fix,	fb_get_var:	anakinfb_get_var,	fb_set_var:	anakinfb_set_var,	fb_get_cmap:	anakinfb_get_cmap,	fb_set_cmap:	anakinfb_set_cmap,};int __initanakinfb_init(void){	memset(&fb_info, 0, sizeof(struct fb_info));	strcpy(fb_info.modename, "AnakinFB");	fb_info.node = -1;	fb_info.flags = FBINFO_FLAG_DEFAULT;	fb_info.fbops = &anakinfb_ops;	fb_info.disp = &display;	strcpy(fb_info.fontname, "VGA8x16");	fb_info.changevar = NULL;	fb_info.switch_con = &anakinfb_switch_con;	fb_info.updatevar = &anakinfb_updatevar;	fb_info.blank = &anakinfb_blank;	memset(&display, 0, sizeof(struct display));	anakinfb_get_var(&display.var, 0, &fb_info);	display.screen_base = ioremap(VGA_START, VGA_SIZE);	display.visual = FB_VISUAL_TRUECOLOR;	display.type = FB_TYPE_PACKED_PIXELS;	display.type_aux = 0;	display.ypanstep = 0;	display.ywrapstep = 0;	display.line_length = 400 * 2;	display.can_soft_blank = 1;	display.inverse = 0;#ifdef FBCON_HAS_CFB16	display.dispsw = &fbcon_cfb16;	display.dispsw_data = colreg;#else	display.dispsw = &fbcon_dummy;#endif	if (register_framebuffer(&fb_info) < 0)		return -EINVAL;	MOD_INC_USE_COUNT;	return 0;}MODULE_AUTHOR("Tak-Shing Chan <chan@aleph1.co.uk>");MODULE_DESCRIPTION("Anakin framebuffer driver");MODULE_SUPPORTED_DEVICE("fb");

⌨️ 快捷键说明

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