📄 nvidia.c
字号:
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 + -