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

📄 r128.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -