📄 r128.c
字号:
static Bool R128Init(ModeTiming *mode, ModeInfo *info, R128SavePtr save){ double dot_clock = mode->pixelClock/1000.0; R128InitCommonRegisters(save); if (!R128InitCrtcRegisters(save, mode, info)) return 0;#if 0 if (HasPanelRegs) R128InitFPRegisters(&info->SavedReg, save, mode, info);#endif R128InitPLLRegisters(save, &pll, dot_clock); if (!R128InitDDARegisters(save, &pll, info)) return 0;// if (!info->PaletteSavedOnVT) R128InitPalette(save); return 1;}static int r128_init(int, int, int);static void r128_unlock(void);static void r128_lock(void);void __svgalib_skaccel_init(AccelSpecs * accelspecs, int bpp, int width_in_pixels);static int r128_memory, r128_chiptype;static int r128_is_linear, r128_linear_base, r128_mmio_base;static CardSpecs *cardspecs;static void r128_setpage(int page){ page*=2; OUTREG(R128_MEM_VGA_WP_SEL, page | ((page+1)<<16)); OUTREG(R128_MEM_VGA_RP_SEL, page | ((page+1)<<16));}static int __svgalib_r128_inlinearmode(void){return r128_is_linear;}/* Fill in chipset specific mode information */static void r128_getmodeinfo(int mode, vga_modeinfo *modeinfo){ if(modeinfo->colors==16)return; modeinfo->maxpixels = r128_memory*1024/modeinfo->bytesperpixel; modeinfo->maxlogicalwidth = 4088; modeinfo->startaddressrange = r128_memory * 1024 - 1; modeinfo->haveblit = 0; modeinfo->flags &= ~HAVE_RWPAGE; if (modeinfo->bytesperpixel >= 1) { if(r128_linear_base)modeinfo->flags |= CAPABLE_LINEAR; if (__svgalib_r128_inlinearmode()) modeinfo->flags |= IS_LINEAR; }}/* Read and save chipset-specific registers */static int r128_saveregs(unsigned char regs[]){ int i; r128_unlock(); R128SaveMode((R128SavePtr)(regs+VGA_TOTAL_REGS)); return R128_TOTAL_REGS - VGA_TOTAL_REGS;}/* Set chipset-specific registers */static void r128_setregs(const unsigned char regs[], int mode){ r128_unlock(); R128RestoreMode((R128SavePtr)(regs+VGA_TOTAL_REGS)); R128Unblank();}/* Return nonzero if mode is available */static int r128_modeavailable(int mode){ struct info *info; ModeTiming *modetiming; ModeInfo *modeinfo; modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode); if (IS_IN_STANDARD_VGA_DRIVER(mode)) return __svgalib_vga_driverspecs.modeavailable(mode); info = &__svgalib_infotable[mode]; if (r128_memory * 1024 < info->ydim * info->xbytes) return 0; modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode); modetiming = malloc(sizeof(ModeTiming)); if (__svgalib_getmodetiming(modetiming, modeinfo, cardspecs)) { free(modetiming); free(modeinfo); return 0; } free(modetiming); free(modeinfo); return SVGADRV;}/* Local, called by r128_setmode(). */static void r128_initializemode(unsigned char *moderegs, ModeTiming * modetiming, ModeInfo * modeinfo, int mode){ /* long k; */ __svgalib_setup_VGA_registers(moderegs, modetiming, modeinfo); R128Init(modetiming, modeinfo, (R128SavePtr)(moderegs+VGA_TOTAL_REGS)); return ;}static int r128_setmode(int mode, int prv_mode){ unsigned char *moderegs; ModeTiming *modetiming; ModeInfo *modeinfo; if (IS_IN_STANDARD_VGA_DRIVER(mode)) { return __svgalib_vga_driverspecs.setmode(mode, prv_mode); } if (!r128_modeavailable(mode)) return 1; modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode); modetiming = malloc(sizeof(ModeTiming)); if (__svgalib_getmodetiming(modetiming, modeinfo, cardspecs)) { free(modetiming); free(modeinfo); return 1; } moderegs = malloc(R128_TOTAL_REGS); r128_initializemode(moderegs, modetiming, modeinfo, mode); free(modetiming); __svgalib_setregs(moderegs); /* Set standard regs. */ r128_setregs(moderegs, mode); /* Set extended regs. */ free(moderegs); __svgalib_InitializeAcceleratorInterface(modeinfo); free(modeinfo); return 0;}/* Unlock chipset-specific registers */static void r128_unlock(void){ int vgaIOBase, temp; vgaIOBase = (inb(0x3CC) & 0x01) ? 0x3D0 : 0x3B0; outb(vgaIOBase + 4, 0x11); temp = inb(vgaIOBase + 5); outb(vgaIOBase + 5, temp & 0x7F); }static void r128_lock(void){ int vgaIOBase, temp; vgaIOBase = (inb(0x3CC) & 0x01) ? 0x3D0 : 0x3B0; outb(vgaIOBase + 4, 0x11); temp = inb(vgaIOBase + 5); outb(vgaIOBase + 5, temp & 0x7F); }#define VENDOR_ID 0x1002/* Indentify chipset, initialize and return non-zero if detected */static int r128_test(void){ int found, id; unsigned long buf[64]; found=__svgalib_pci_find_vendor_vga(VENDOR_ID,buf,0); if(found) return 0; id=(buf[0]>>16)&0xffff; if((id>=0x5350) || (id<=0x4fff)) return 0; r128_init(0,0,0); return 1;}/* Set display start address (not for 16 color modes) *//* Cirrus supports any address in video memory (up to 2Mb) */static void r128_setdisplaystart(int address){ int naddress=address >> 2; __svgalib_outcrtc(0x0c,(naddress>>8)&0xff); __svgalib_outcrtc(0x0d,(naddress)&0xff); OUTREG(R128_CRTC_OFFSET, address);}/* Set logical scanline length (usually multiple of 8) *//* Cirrus supports multiples of 8, up to 4088 */static void r128_setlogicalwidth(int width){ int offset = width >> 3; if(CI.bytesperpixel>1) { offset = offset/CI.bytesperpixel; } __svgalib_outcrtc(0x13,offset&0xff); OUTREG(R128_CRTC_PITCH, offset);}static int r128_linear(int op, int param){ if (op==LINEAR_ENABLE){r128_is_linear=1; return 0;}; if (op==LINEAR_DISABLE){r128_is_linear=0; return 0;}; if (op==LINEAR_QUERY_BASE) return r128_linear_base; if (op == LINEAR_QUERY_RANGE || op == LINEAR_QUERY_GRANULARITY) return 0; /* No granularity or range. */ else return -1; /* Unknown function. */}static int r128_match_programmable_clock(int clock){return clock ;}static int r128_map_clock(int bpp, int clock){return clock ;}static int r128_map_horizontal_crtc(int bpp, int pixelclock, int htiming){return htiming;}/* Function table (exported) */DriverSpecs __svgalib_r128_driverspecs ={ r128_saveregs, r128_setregs, r128_unlock, r128_lock, r128_test, r128_init, r128_setpage, NULL, NULL, r128_setmode, r128_modeavailable, r128_setdisplaystart, r128_setlogicalwidth, r128_getmodeinfo, 0, /* old blit funcs */ 0, 0, 0, 0, 0, /* ext_set */ 0, /* accel */ r128_linear, 0, /* accelspecs, filled in during init. */ NULL, /* Emulation */};/* Initialize chipset (called after detection) */static int r128_init(int force, int par1, int par2){ unsigned long buf[64]; int found=0; unsigned char *BIOS_POINTER; r128_unlock(); if (force) { r128_memory = par1; r128_chiptype = par2; } else { }; found=__svgalib_pci_find_vendor_vga(VENDOR_ID,buf,0); if(found) return 0; r128_chiptype=(buf[0]>>16)&0xffff; if((r128_chiptype>=0x5350) || (r128_chiptype<=0x4fff)) return 0; r128_linear_base=buf[4]&0xffffff00; r128_mmio_base=buf[6]&0xffffff00; MMIO_POINTER = mmap(0, 16*1024, PROT_READ | PROT_WRITE, MAP_SHARED, __svgalib_mem_fd, r128_mmio_base); BIOS_POINTER = mmap(0, 64*1024, PROT_READ | PROT_WRITE, MAP_SHARED, __svgalib_mem_fd, 0xc0000); r128_memory = INREG(R128_CONFIG_MEMSIZE) / 1024; BusCntl = INREG(R128_BUS_CNTL); HasPanelRegs = 0; CRTOnly = 1; r128_ramtype = 1;#if 0 pll.reference_freq = 2700; pll.min_pll_freq = 12500; pll.max_pll_freq = 40000; pll.reference_div = INPLL(R128_PPLL_REF_DIV) & R128_PPLL_REF_DIV_MASK; pll.xclk = 14000;#else#define R128_BIOS16(x) (*(unsigned short *)(BIOS_POINTER + x))#define R128_BIOS32(x) (*(unsigned int *)(BIOS_POINTER + x)) { CARD16 bios_header = R128_BIOS16(0x48); CARD16 pll_info_block = R128_BIOS16(bios_header + 0x30); pll.reference_freq = R128_BIOS16(pll_info_block + 0x0e); pll.reference_div = R128_BIOS16(pll_info_block + 0x10); pll.min_pll_freq = R128_BIOS32(pll_info_block + 0x12); pll.max_pll_freq = R128_BIOS32(pll_info_block + 0x16); pll.xclk = R128_BIOS16(pll_info_block + 0x08);#if 0printf("pll: %i %i %i %i %i\n",pll.reference_freq,pll.reference_div, pll.min_pll_freq, pll.max_pll_freq, pll.xclk);#endif }#endif munmap(MMIO_POINTER, 16*1024); munmap(BIOS_POINTER, 64*1024); if (__svgalib_driver_report) { printf("Using Rage 128 driver, %iKB.\n",r128_memory); }; cardspecs = malloc(sizeof(CardSpecs)); cardspecs->videoMemory = r128_memory; cardspecs->maxPixelClock4bpp = 75000; cardspecs->maxPixelClock8bpp = 160000; cardspecs->maxPixelClock16bpp = 160000; cardspecs->maxPixelClock24bpp = 160000; cardspecs->maxPixelClock32bpp = 160000; cardspecs->flags = INTERLACE_DIVIDE_VERT | CLOCK_PROGRAMMABLE; cardspecs->maxHorizontalCrtc = 2040; cardspecs->maxPixelClock4bpp = 0; cardspecs->nClocks =0; cardspecs->mapClock = r128_map_clock; cardspecs->mapHorizontalCrtc = r128_map_horizontal_crtc; cardspecs->matchProgrammableClock=r128_match_programmable_clock; __svgalib_driverspecs = &__svgalib_r128_driverspecs; __svgalib_banked_mem_base=0xa0000; __svgalib_banked_mem_size=0x10000; __svgalib_linear_mem_base=r128_linear_base; __svgalib_linear_mem_size=r128_memory*0x400; __svgalib_mmio_base=r128_mmio_base; __svgalib_mmio_size=16*1024; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -