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

📄 nvidia.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
		nmin = 5;		nv->vpllB = 0x80000401;	} else {		vga->p[1] = 4;		if (nv->crystalfreq == 13500000)			vga->m[1] = 13;		else			vga->m[1] = 14;		vga->f[1] = 350000000;		crystalfreq = nv->crystalfreq;		fmin = 128000000;		mmin = 7;		nmin = 0;	}	for (p=0; p <= vga->p[1]; p++){		f = vga->f[0] << p;		if ((f >= fmin) && (f <= vga->f[1])) {			for (m=mmin; m <= vga->m[1]; m++){				trouble = (double) crystalfreq / (double) (m << p);				n = (vga->f[0] / trouble)+0.5;				f = n*trouble + 0.5;				d = vga->f[0] - f;				if (d < 0)					d = -d;				if ((n & ~0xFF) && (n >= nmin))					d = vga->d[0] + 1;				if (d <= vga->d[0]){					vga->n[0] = n;					vga->m[0] = m;					vga->p[0] = p;					vga->d[0] = d;				}			}		}	}	if (vga->d[0] > vga->f[0])		error("%s: vclk %lud out of range\n", ctlr->name, vga->f[0]);}static voidinit(Vga* vga, Ctlr* ctlr){	Mode *mode;	Nvidia *nv;	char *p, *val;	int tmp, pixeldepth;	ulong cursorstart;	mode = vga->mode;	if(mode->z == 24)		error("%s: 24-bit colour not supported, use 32-bit\n", ctlr->name);	nv = vga->private;	if(vga->linear && (ctlr->flag & Hlinear))		ctlr->flag |= Ulinear;	clock(vga, ctlr);	if(val = dbattr(vga->mode->attr, "lcd")){		 if((nv->islcd = strtol(val, &p, 0)) == 0 && p == val)			error("%s: invalid 'lcd' attr\n", ctlr->name);	}	if(nv->arch == 4) {		nv->cursor0 = 0x00;		nv->cursor1 = 0xBC;		nv->cursor2 = 0;		nv->config = 0x00001114;	} else if(nv->arch >= 10) {		cursorstart = vga->vmz - 96 * 1024;		nv->cursor0 = 0x80 | (cursorstart >> 17);		nv->cursor1 = (cursorstart >> 11) << 2;		nv->cursor2 = cursorstart >> 24;		nv->config = nv->pfb[0x200/4];	}	nv->vpll = (vga->p[0] << 16) | (vga->n[0] << 8) | vga->m[0];	nv->pllsel = 0x10000700;	if (mode->z == 16)		nv->general = 0x00001100;	else		nv->general = 0x00000100;	//if (mode->z != 8)	//	nv->general |= 0x00000030;	if (mode->x < 1280)		nv->repaint1 = 0x04;	else		nv->repaint1 = 0;	vga->attribute[0x10] &= ~0x40;	vga->attribute[0x11] = Pblack;	vga->crt[0x14] = 0x00;	/* set vert blanking to cover full overscan */	tmp = vga->crt[0x12];	vga->crt[0x15] = tmp;	if(tmp & 0x100)		vga->crt[0x07] |= 0x08;	else		vga->crt[0x07] &= ~0x08;	if(tmp & 0x200)		vga->crt[0x09] |= 0x20;	else		vga->crt[0x09] &= ~0x20;	vga->crt[0x16] = vga->crt[0x06] + 1;	/* set horiz blanking to cover full overscan */	vga->crt[0x02] = vga->crt[0x01];	tmp = vga->crt[0x00] + 4;	vga->crt[0x03] = 0x80 | (tmp & 0x1F);	if (tmp & 0x20)		vga->crt[0x05] |= 0x80;	else		vga->crt[0x05] &= ~0x80;	if (tmp & 0x40)		nv->screen = 0x10;	else		nv->screen = 0x00;	/* overflow bits */	if (nv->islcd){		tmp = vga->crt[0x06] - 3;		vga->crt[0x10] = tmp;		if(tmp & 0x100)			vga->crt[0x07] |= 0x04;		else			vga->crt[0x07] &= ~0x04;		if(tmp & 0x200)			vga->crt[0x07] |= 0x80;		else			vga->crt[0x07] &= ~0x80;		vga->crt[0x11] = 0x20 | ((vga->crt[0x06] - 2) & 0x0F);		tmp = vga->crt[0x10];		vga->crt[0x15] = tmp;		if(tmp & 0x100)			vga->crt[0x07] |= 0x08;		else			vga->crt[0x07] &= ~0x08;		if(tmp & 0x200)			vga->crt[0x09] |= 0x20;		else			vga->crt[0x09] &= ~0x20;		vga->crt[0x04] = vga->crt[0x00] - 5;		vga->crt[0x05] &= ~0x1F;		vga->crt[0x05] |= (0x1F & (vga->crt[0x00] - 2));	}	nv->repaint0 = (vga->crt[0x13] & 0x0700) >> 3;	pixeldepth = (mode->z +1)/8;	if (pixeldepth > 3)		nv->pixel = 3;	else		nv->pixel = pixeldepth;	nv->scale &= 0xFFF000FF;	if(nv->islcd){		nv->pixel |= 0x80;		nv->scale |= 0x100;	}	if (vga->crt[0x06] & 0x400)		nv->screen |= 0x01;	if (vga->crt[0x12] & 0x400)		nv->screen |= 0x02;	if (vga->crt[0x10] & 0x400)		nv->screen |= 0x04;	if (vga->crt[0x15] & 0x400)		nv->screen |= 0x08;	if (vga->crt[0x13] & 0x800)		nv->screen |= 0x20;	nv->horiz = 0x00;	if (vga->crt[0x00] & 0x100)		nv->horiz = 0x01;	if(vga->crt[0x01] & 0x100)		nv->horiz |= 0x02;	if(vga->crt[0x02] & 0x100)		nv->horiz |= 0x04;	if(vga->crt[0x04] & 0x100)		nv->horiz |= 0x08;	nv->extra = 0x00;	if (vga->crt[0x06] & 0x800)		nv->extra |= 0x01;	if (vga->crt[0x12] & 0x800)		nv->extra |= 0x04;	if (vga->crt[0x10] & 0x800)		nv->extra |= 0x10;	if (vga->crt[0x15] & 0x800)		nv->extra |= 0x40;	nv->interlace = 0xFF;	if (nv->twoheads) {		nv->head |= 0x00001000;		nv->head2 |= ~0x00001000;		nv->crtcowner = 0;		if((nv->did & 0x0ff0) == 0x0110)			nv->dither &= ~0x00010000;		else			nv->dither &= ~1;	}	nv->cursorconfig = 0x00000100 | 0x02000000;	nv->timingH = 0;	nv->timingV = 0;	nv->displayV = vga->crt[0x12] + 1;	ctlr->flag |= Finit;}static voidload(Vga* vga, Ctlr* ctlr){	Nvidia *nv;	int i, regions;	ulong tmp;	nv = vga->private;	/*	 * Unlock	 */	vgaxo(Crtx, 0x1F, 0x57); 	nv->pmc[0x0140/4] = 0x00000000; 	nv->pmc[0x0200/4] = 0xFFFF00FF; 	nv->pmc[0x0200/4] = 0xFFFFFFFF; 	nv->ptimer[0x0200] = 0x00000008; 	nv->ptimer[0x0210] = 0x00000003; 	nv->ptimer[0x0140] = 0x00000000; 	nv->ptimer[0x0100] = 0xFFFFFFFF;	if (nv->arch == 4)		nv->pfb[0x00000200/4] = nv->config;	else if((nv->arch < 40) || ((nv->did & 0xfff0) == 0x0040)){		for(i = 0; i < 8; i++){			nv->pfb[(0x0240 + (i * 0x10))/4] = 0;			nv->pfb[(0x0244 + (i * 0x10))/4] = vga->vmz - 1;;		}	}	else{		if(((nv->did & 0xfff0) == 0x0090)		|| ((nv->did & 0xfff0) == 0x01D0)		|| ((nv->did & 0xfff0) == 0x0290)		|| ((nv->did & 0xfff0) == 0x0390))			regions = 15;		else			regions = 12;		for(i = 0; i < regions; i++){			nv->pfb[(0x0600 + (i * 0x10))/4] = 0;			nv->pfb[(0x0604 + (i * 0x10))/4] = vga->vmz - 1;		}	}	if (nv->arch >= 40) {		nv->pramin[0x0000] = 0x80000010;		nv->pramin[0x0001] = 0x00101202;		nv->pramin[0x0002] = 0x80000011;		nv->pramin[0x0003] = 0x00101204;		nv->pramin[0x0004] = 0x80000012;		nv->pramin[0x0005] = 0x00101206;		nv->pramin[0x0006] = 0x80000013;		nv->pramin[0x0007] = 0x00101208;		nv->pramin[0x0008] = 0x80000014;		nv->pramin[0x0009] = 0x0010120A;		nv->pramin[0x000A] = 0x80000015;		nv->pramin[0x000B] = 0x0010120C;		nv->pramin[0x000C] = 0x80000016;		nv->pramin[0x000D] = 0x0010120E;		nv->pramin[0x000E] = 0x80000017;		nv->pramin[0x000F] = 0x00101210;		nv->pramin[0x0800] = 0x00003000;		nv->pramin[0x0801] = vga->vmz - 1;		nv->pramin[0x0802] = 0x00000002;		nv->pramin[0x0808] = 0x02080062;		nv->pramin[0x0809] = 0x00000000;		nv->pramin[0x080A] = 0x00001200;		nv->pramin[0x080B] = 0x00001200;		nv->pramin[0x080C] = 0x00000000;		nv->pramin[0x080D] = 0x00000000;		nv->pramin[0x0810] = 0x02080043;		nv->pramin[0x0811] = 0x00000000;		nv->pramin[0x0812] = 0x00000000;		nv->pramin[0x0813] = 0x00000000;		nv->pramin[0x0814] = 0x00000000;		nv->pramin[0x0815] = 0x00000000;		nv->pramin[0x0818] = 0x02080044;		nv->pramin[0x0819] = 0x02000000;		nv->pramin[0x081A] = 0x00000000;		nv->pramin[0x081B] = 0x00000000;		nv->pramin[0x081C] = 0x00000000;		nv->pramin[0x081D] = 0x00000000;		nv->pramin[0x0820] = 0x02080019;		nv->pramin[0x0821] = 0x00000000;		nv->pramin[0x0822] = 0x00000000;		nv->pramin[0x0823] = 0x00000000;		nv->pramin[0x0824] = 0x00000000;		nv->pramin[0x0825] = 0x00000000;		nv->pramin[0x0828] = 0x020A005C;		nv->pramin[0x0829] = 0x00000000;		nv->pramin[0x082A] = 0x00000000;		nv->pramin[0x082B] = 0x00000000;		nv->pramin[0x082C] = 0x00000000;		nv->pramin[0x082D] = 0x00000000;		nv->pramin[0x0830] = 0x0208009F;		nv->pramin[0x0831] = 0x00000000;		nv->pramin[0x0832] = 0x00001200;		nv->pramin[0x0833] = 0x00001200;		nv->pramin[0x0834] = 0x00000000;		nv->pramin[0x0835] = 0x00000000;		nv->pramin[0x0838] = 0x0208004A;		nv->pramin[0x0839] = 0x02000000;		nv->pramin[0x083A] = 0x00000000;		nv->pramin[0x083B] = 0x00000000;		nv->pramin[0x083C] = 0x00000000;		nv->pramin[0x083D] = 0x00000000;		nv->pramin[0x0840] = 0x02080077;		nv->pramin[0x0841] = 0x00000000;		nv->pramin[0x0842] = 0x00001200;		nv->pramin[0x0843] = 0x00001200;		nv->pramin[0x0844] = 0x00000000;		nv->pramin[0x0845] = 0x00000000;		nv->pramin[0x084C] = 0x00003002;		nv->pramin[0x084D] = 0x00007FFF;		nv->pramin[0x084E] = (vga->vmz - 128 * 1024) | 0x00000002;	} else {		nv->pramin[0x0000] = 0x80000010;		nv->pramin[0x0001] = 0x80011201;		nv->pramin[0x0002] = 0x80000011;		nv->pramin[0x0003] = 0x80011202;		nv->pramin[0x0004] = 0x80000012;		nv->pramin[0x0005] = 0x80011203;		nv->pramin[0x0006] = 0x80000013;		nv->pramin[0x0007] = 0x80011204;		nv->pramin[0x0008] = 0x80000014;		nv->pramin[0x0009] = 0x80011205;		nv->pramin[0x000A] = 0x80000015;		nv->pramin[0x000B] = 0x80011206;		nv->pramin[0x000C] = 0x80000016;		nv->pramin[0x000D] = 0x80011207;		nv->pramin[0x000E] = 0x80000017;		nv->pramin[0x000F] = 0x80011208;		nv->pramin[0x0800] = 0x00003000;		nv->pramin[0x0801] = vga->vmz - 1;		nv->pramin[0x0802] = 0x00000002;		nv->pramin[0x0803] = 0x00000002;		if (nv->arch >= 10)			nv->pramin[0x0804] = 0x01008062;		else			nv->pramin[0x0804] = 0x01008042;		nv->pramin[0x0805] = 0x00000000;		nv->pramin[0x0806] = 0x12001200;		nv->pramin[0x0807] = 0x00000000;		nv->pramin[0x0808] = 0x01008043;		nv->pramin[0x0809] = 0x00000000;		nv->pramin[0x080A] = 0x00000000;		nv->pramin[0x080B] = 0x00000000;		nv->pramin[0x080C] = 0x01008044;		nv->pramin[0x080D] = 0x00000002;		nv->pramin[0x080E] = 0x00000000;		nv->pramin[0x080F] = 0x00000000;		nv->pramin[0x0810] = 0x01008019;		nv->pramin[0x0811] = 0x00000000;		nv->pramin[0x0812] = 0x00000000;		nv->pramin[0x0813] = 0x00000000;		nv->pramin[0x0814] = 0x0100A05C;		nv->pramin[0x0815] = 0x00000000;		nv->pramin[0x0816] = 0x00000000;		nv->pramin[0x0817] = 0x00000000;		nv->pramin[0x0818] = 0x0100805F;		nv->pramin[0x0819] = 0x00000000;		nv->pramin[0x081A] = 0x12001200;		nv->pramin[0x081B] = 0x00000000;		nv->pramin[0x081C] = 0x0100804A;		nv->pramin[0x081D] = 0x00000002;		nv->pramin[0x081E] = 0x00000000;		nv->pramin[0x081F] = 0x00000000;		nv->pramin[0x0820] = 0x01018077;		nv->pramin[0x0821] = 0x00000000;		nv->pramin[0x0822] = 0x01201200;		nv->pramin[0x0823] = 0x00000000;		nv->pramin[0x0824] = 0x00003002;		nv->pramin[0x0825] = 0x00007FFF;		nv->pramin[0x0826] = (vga->vmz - 128 * 1024) | 0x00000002;		nv->pramin[0x0827] = 0x00000002;	}	if (nv->arch < 10) {		if((nv->did & 0x0fff) == 0x0020) {			nv->pramin[0x0824] |= 0x00020000;			nv->pramin[0x0826] += nv->pci->mem[1].bar;		}		nv->pgraph[0x0080/4] = 0x000001FF;		nv->pgraph[0x0080/4] = 0x1230C000;		nv->pgraph[0x0084/4] = 0x72111101;		nv->pgraph[0x0088/4] = 0x11D5F071;		nv->pgraph[0x008C/4] = 0x0004FF31;		nv->pgraph[0x008C/4] = 0x4004FF31;		nv->pgraph[0x0140/4] = 0x00000000;		nv->pgraph[0x0100/4] = 0xFFFFFFFF;

⌨️ 快捷键说明

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