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

📄 matroxfb_misc.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
	ve = m->VSyncEnd - 1;	vt = m->VTotal - 2;	/* G200 cannot work with (ht & 7) == 6 */	if (((ht & 0x07) == 0x06) || ((ht & 0x0F) == 0x04))		ht++;	if (text) {		hbe = ht - 1;		wd = p->var.xres_virtual / (fwidth * 2);	} else {		hbe = ht;		wd = p->var.xres_virtual * ACCESS_FBINFO(curr.final_bppShift) / 64;	}	hw->CRTCEXT[0] = 0;	hw->CRTCEXT[5] = 0;	if (m->interlaced) {		hw->CRTCEXT[0] = 0x80;		hw->CRTCEXT[5] = (hs + he - ht) >> 1;		if (!m->dblscan)			wd <<= 1;		vt &= ~1;	}	hw->CRTCEXT[0] |=  (wd & 0x300) >> 4;	hw->CRTCEXT[1] = (((ht - 4) & 0x100) >> 8) |			  ((hd      & 0x100) >> 7) | /* blanking */			  ((hs      & 0x100) >> 6) | /* sync start */			   (hbe     & 0x040);	 /* end hor. blanking */	if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_SECONDARY)		hw->CRTCEXT[1] |= 0x88;		/* enable horizontal and vertical vidrst */	hw->CRTCEXT[2] =  ((vt & 0xC00) >> 10) |			  ((vd & 0x400) >>  8) |	/* disp end */			  ((vd & 0xC00) >>  7) |	/* vblanking start */			  ((vs & 0xC00) >>  5);	if (text)		hw->CRTCEXT[3] = 0x00;	else		hw->CRTCEXT[3] = (divider - 1) | 0x80;	hw->CRTCEXT[4] = 0;	hw->CRTC[0] = ht-4;	hw->CRTC[1] = hd;	hw->CRTC[2] = hd;	hw->CRTC[3] = (hbe & 0x1F) | 0x80;	hw->CRTC[4] = hs;	hw->CRTC[5] = ((hbe & 0x20) << 2) | (he & 0x1F);	if (text)		hw->CRTC[5] |= 0x60;	/* delay sync for 3 clocks (to same picture position on MGA and VGA) */	hw->CRTC[6] = vt & 0xFF;	hw->CRTC[7] = ((vt & 0x100) >> 8) |		      ((vd & 0x100) >> 7) |		      ((vs & 0x100) >> 6) |		      ((vd & 0x100) >> 5) |		      0x10                |		      ((vt & 0x200) >> 4) |		      ((vd & 0x200) >> 3) |		      ((vs & 0x200) >> 2);	hw->CRTC[8] = 0x00;	hw->CRTC[9] = ((vd & 0x200) >> 4) | 0x40;	if (text)		hw->CRTC[9] |= fontheight(p) - 1;	if (m->dblscan && !m->interlaced)		hw->CRTC[9] |= 0x80;	for (i = 10; i < 16; i++)		hw->CRTC[i] = 0x00;	hw->CRTC[16] = vs /* & 0xFF */;	hw->CRTC[17] = (ve & 0x0F) | 0x20;	hw->CRTC[18] = vd /* & 0xFF */;	hw->CRTC[19] = wd /* & 0xFF */;	hw->CRTC[20] = 0x00;	hw->CRTC[21] = vd /* & 0xFF */;	hw->CRTC[22] = (vt + 1) /* & 0xFF */;	if (text) {		if (ACCESS_FBINFO(devflags.textmode) == 1)			hw->CRTC[23] = 0xC3;		else			hw->CRTC[23] = 0xA3;		if (ACCESS_FBINFO(devflags.textmode) == 4)			hw->CRTC[20] = 0x5F;		else			hw->CRTC[20] = 0x1F;	} else		hw->CRTC[23] = 0xC3;	hw->CRTC[24] = 0xFF;	return 0;};void matroxfb_vgaHWrestore(WPMINFO struct matrox_hw_state* hw, struct matrox_hw_state* oldhw) {	int i;	CRITFLAGS	DBG("vgaHWrestore")	dprintk(KERN_INFO "MiscOutReg: %02X\n", hw->MiscOutReg);	dprintk(KERN_INFO "SEQ regs:   ");	for (i = 0; i < 5; i++)		dprintk("%02X:", hw->SEQ[i]);	dprintk("\n");	dprintk(KERN_INFO "GDC regs:   ");	for (i = 0; i < 9; i++)		dprintk("%02X:", hw->GCTL[i]);	dprintk("\n");	dprintk(KERN_INFO "CRTC regs: ");	for (i = 0; i < 25; i++)		dprintk("%02X:", hw->CRTC[i]);	dprintk("\n");	dprintk(KERN_INFO "ATTR regs: ");	for (i = 0; i < 21; i++)		dprintk("%02X:", hw->ATTR[i]);	dprintk("\n");	CRITBEGIN	mga_inb(M_ATTR_RESET);	mga_outb(M_ATTR_INDEX, 0);	mga_outb(M_MISC_REG, hw->MiscOutReg);	for (i = 1; i < 5; i++)		mga_setr(M_SEQ_INDEX, i, hw->SEQ[i]);	mga_setr(M_CRTC_INDEX, 17, hw->CRTC[17] & 0x7F);	for (i = 0; i < 25; i++)		mga_setr(M_CRTC_INDEX, i, hw->CRTC[i]);	for (i = 0; i < 9; i++)		mga_setr(M_GRAPHICS_INDEX, i, hw->GCTL[i]);	for (i = 0; i < 21; i++) {		mga_inb(M_ATTR_RESET);		mga_outb(M_ATTR_INDEX, i);		mga_outb(M_ATTR_INDEX, hw->ATTR[i]);	}	mga_outb(M_PALETTE_MASK, 0xFF);	mga_outb(M_DAC_REG, 0x00);	for (i = 0; i < 768; i++)		mga_outb(M_DAC_VAL, hw->DACpal[i]);	mga_inb(M_ATTR_RESET);	mga_outb(M_ATTR_INDEX, 0x20);	CRITEND}void matroxfb_fastfont_init(struct matrox_fb_info* minfo){	unsigned int size;	size = ACCESS_FBINFO(fastfont.size);	ACCESS_FBINFO(fastfont.size) = 0;	if (size) {		unsigned int end = ACCESS_FBINFO(video.len_usable);		if (size < end) {			unsigned int start;			start = (end - size) & PAGE_MASK;			if (start >= 0x00100000) {				ACCESS_FBINFO(video.len_usable) = start;				ACCESS_FBINFO(fastfont.mgabase) = start * 8;				ACCESS_FBINFO(fastfont.vbase) = ACCESS_FBINFO(video.vbase);				vaddr_add(&ACCESS_FBINFO(fastfont.vbase), start);				ACCESS_FBINFO(fastfont.size) = end - start;			}		}	}}#ifndef FNTCHARCNT#define FNTCHARCNT(fd)	(((int *)(fd))[-3])#endifint matrox_text_loadfont(WPMINFO struct display* p) {	unsigned int fsize;	unsigned int width;	vaddr_t dst;	unsigned int i;	u_int8_t* font;	CRITFLAGS	if (!p || !p->fontdata)		return 0;	width = fontwidth(p);	fsize = p->userfont?FNTCHARCNT(p->fontdata):256;	dst = ACCESS_FBINFO(video.vbase);	i = 2;	font = (u_int8_t*)p->fontdata;	CRITBEGIN	mga_setr(M_SEQ_INDEX, 0x02, 0x04);	while (fsize--) {		int l;		for (l = 0; l < fontheight(p); l++) {			mga_writeb(dst, i, *font++);			if (fontwidth(p) > 8) font++;			i += ACCESS_FBINFO(devflags.vgastep);		}		i += (32 - fontheight(p)) * ACCESS_FBINFO(devflags.vgastep);	}	mga_setr(M_SEQ_INDEX, 0x02, 0x03);	CRITEND	return 1;}int matroxfb_fastfont_tryset(WPMINFO struct display* p) {	unsigned int fsize;	unsigned int width;	CRITFLAGS	if (!p || !p->fontdata)		return 0;	width = fontwidth(p);	if (width > 32)		return 0;	fsize = (p->userfont?FNTCHARCNT(p->fontdata):256) * fontheight(p);	if (((fsize * width + 31) / 32) * 4 > ACCESS_FBINFO(fastfont.size))		return 0;	CRITBEGIN	mga_outl(M_OPMODE, M_OPMODE_8BPP);	if (width <= 8) {		if (width == 8)			mga_memcpy_toio(ACCESS_FBINFO(fastfont.vbase), 0, p->fontdata, fsize);		else {			vaddr_t dst;			unsigned int i;			u_int8_t* font;			u_int32_t mask, valid, reg;			dst = ACCESS_FBINFO(fastfont.vbase);			font = (u_int8_t*)p->fontdata;			mask = ~0 << (8 - width);			valid = 0;			reg = 0;			i = 0;			while (fsize--) {				reg |= (*font++ & mask) << (8 - valid);				valid += width;				if (valid >= 8) {					mga_writeb(dst, i++, reg >> 8);					reg = reg << 8;					valid -= 8;				}			}			if (valid)				mga_writeb(dst, i, reg >> 8);		}	} else if (width <= 16) {		if (width == 16)			mga_memcpy_toio(ACCESS_FBINFO(fastfont.vbase), 0, p->fontdata, fsize*2);		else {			vaddr_t dst;			u_int16_t* font;			u_int32_t mask, valid, reg;			unsigned int i;			dst = ACCESS_FBINFO(fastfont.vbase);			font = (u_int16_t*)p->fontdata;			mask = ~0 << (16 - width);			valid = 0;			reg = 0;			i = 0;			while (fsize--) {				reg |= (ntohs(*font++) & mask) << (16 - valid);				valid += width;				if (valid >= 16) {					mga_writew(dst, i, htons(reg >> 16));					i += 2;					reg = reg << 16;					valid -= 16;				}			}			if (valid)				mga_writew(dst, i, htons(reg >> 16));		}	} else {		if (width == 32)			mga_memcpy_toio(ACCESS_FBINFO(fastfont.vbase), 0, p->fontdata, fsize*4);		else {			vaddr_t dst;			u_int32_t* font;			u_int32_t mask, valid, reg;			unsigned int i;			dst = ACCESS_FBINFO(fastfont.vbase);			font = (u_int32_t*)p->fontdata;			mask = ~0 << (32 - width);			valid = 0;			reg = 0;			i = 0;			while (fsize--) {				reg |= (ntohl(*font) & mask) >> valid;				valid += width;				if (valid >= 32) {					mga_writel(dst, i, htonl(reg));					i += 4;					valid -= 32;					if (valid)						reg = (ntohl(*font) & mask) << (width - valid);					else						reg = 0;				}				font++;			}			if (valid)				mga_writel(dst, i, htonl(reg));		}	}	mga_outl(M_OPMODE, ACCESS_FBINFO(accel.m_opmode));	CRITEND	return 1;}EXPORT_SYMBOL(matroxfb_DAC_in);EXPORT_SYMBOL(matroxfb_DAC_out);EXPORT_SYMBOL(matroxfb_var2my);EXPORT_SYMBOL(matroxfb_PLL_calcclock);#ifndef CONFIG_FB_MATROX_MULTIHEADstruct matrox_fb_info matroxfb_global_mxinfo;EXPORT_SYMBOL(matroxfb_global_mxinfo);#endifEXPORT_SYMBOL(matrox_text_loadfont);	/* for matroxfb_accel */EXPORT_SYMBOL(matroxfb_createcursorshape);	/* accel, DAC1064, Ti3026 */EXPORT_SYMBOL(matroxfb_fastfont_tryset);	/* accel */EXPORT_SYMBOL(matroxfb_fastfont_init);		/* DAC1064, Ti3026 */EXPORT_SYMBOL(matroxfb_vgaHWinit);		/* DAC1064, Ti3026 */EXPORT_SYMBOL(matroxfb_vgaHWrestore);		/* DAC1064, Ti3026 */MODULE_AUTHOR("(c) 1999-2001 Petr Vandrovec <vandrove@vc.cvut.cz>");MODULE_DESCRIPTION("Miscellaneous support for Matrox video cards");MODULE_LICENSE("GPL");

⌨️ 快捷键说明

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