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

📄 sierra.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
字号:
/* * sierra.c: *  * RAMDAC definition for basic Sierra, SC15025 and SC1148x. */#include <stdlib.h>#include <stdio.h>#include "libvga.h"#include "timing.h"#include "vgaregs.h"#include "driver.h"		/* for __svgalib_driver_report */#include "ramdac.h"/* * RAMDAC definition for basic Sierra-type DAC * that can do 32K (5-5-5) color mode (16bpp) with doubled VCLK. * A value of 0x80 is written to the Hidden DAC register for this mode. */#ifdef INCLUDE_SIERRA_DAC_TESTstatic int Sierra_32K_probe(void){    /* Should return 1 for any Sierra-type DAC. */    return 0;}#else#define Sierra_32K_probe 0#endif#ifdef INCLUDE_SIERRA_DACstatic void Sierra_32K_init(void){    /* Should probe the exact DAC type. */    if (__svgalib_driver_report)	printf("svgalib: Using Sierra 32K DAC.\n");}static int Sierra_32K_map_clock(int bpp, int pixelclock){    if (bpp == 16)	return pixelclock * 2;    return pixelclock;}static int Sierra_32K_map_horizontal_crtc(int bpp, int pixelclock, int htiming){    if (bpp == 16)	return htiming * 2;    return htiming;}#endif#if defined(INCLUDE_SIERRA_DAC) || defined(INCLUDE_ICW_DAC) || \    defined(INCLUDE_ATT20C490_DAC) || defined(INCLUDE_ATT20C498_DAC)void __svgalib_Sierra_32K_savestate(unsigned char *regs){    _ramdac_dactocomm();    regs[0] = inb(PEL_MSK);}void __svgalib_Sierra_32K_restorestate(const unsigned char *regs){    _ramdac_dactocomm();    outb(PEL_MSK, regs[0]);}#endif#ifdef INCLUDE_SIERRA_DACstatic void Sierra_32K_initializestate(unsigned char *regs, int bpp, int colormode,				       int pixelclock){    regs[0] = 0;    if (colormode == RGB16_555)	regs[0] = 0x80;}static void Sierra_32K_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed){    dacspeed = __svgalib_setDacSpeed(dacspeed, 80000);    cardspecs->maxPixelClock4bpp = dacspeed;    cardspecs->maxPixelClock8bpp = dacspeed;    cardspecs->maxPixelClock16bpp = dacspeed / 2;    cardspecs->maxPixelClock24bpp = 0;    cardspecs->maxPixelClock32bpp = 0;    cardspecs->mapClock = Sierra_32K_map_clock;    cardspecs->mapHorizontalCrtc = Sierra_32K_map_horizontal_crtc;    cardspecs->flags |= NO_RGB16_565;}DacMethods __svgalib_Sierra_32K_methods ={    SIERRA_32K,    "Sierra 32K colors VGA DAC",    0,    Sierra_32K_probe,    Sierra_32K_init,    Sierra_32K_qualify_cardspecs,    __svgalib_Sierra_32K_savestate,    __svgalib_Sierra_32K_restorestate,    Sierra_32K_initializestate,    1				/* State size. */};#endif/* * RAMDAC definition for Sierra 15025/26 */#ifdef INCLUDE_SC15025_DAC_TESTstatic unsigned char SC15025_Rev;static int SC15025_probe(void){    unsigned char c, id[4];    int i, flag = 0;    _ramdac_dactocomm();    c = inb(PEL_MSK);    _ramdac_setcomm(c | 0x10);    for (i = 0; i < 4; i++) {	outb(PEL_IR, 0x9 + i);	id[i] = inb(PEL_IW);    }    _ramdac_setcomm(c);    _ramdac_dactopel();    if (id[0] == 'S' &&		/* Sierra */	((id[1] << 8) | id[2]) == 15025) {	/* unique for the SC 15025/26 */	flag = 1;	SC15025_Rev = id[3];    }    return flag;}#else#define SC15025_probe 0#define SC15025_Rev ' '#endif#ifdef INCLUDE_SC15025_DACstatic void SC15025_init(void){    if (__svgalib_driver_report)	printf("svgalib: Using Sierra 15025/26%c truecolor DAC.\n", SC15025_Rev);}static void SC15025_initializestate(unsigned char *regs, int bpp, int colormode,				    int pixelclock){    regs[0] = 0;    regs[1] = 0;    regs[2] = 0;    if (colormode == RGB16_555) {	regs[0] = 0x80;	regs[1] = 1;    } else if (colormode == RGB16_565) {	regs[0] = 0xC0;	regs[1] = 1;    } else if (colormode == RGB32_888_B) {	regs[0] = 0x40;	regs[1] = 1;	regs[2] = 1;    }    /* ARI: FIXME: regs[1] should be 1 for CLUT8_8 */    /*      also: OR 8 to regs[0] to enable gamma correction */}static void SC15025_savestate(unsigned char *regs){    _ramdac_dactocomm();    regs[0] = inb(PEL_MSK);    _ramdac_setcomm(regs[0] | 0x10);    _ramdac_dactocomm();    outb(PEL_IR, 8);    regs[1] = inb(PEL_IW);	/* Aux control */    outb(PEL_IR, 16);    regs[2] = inb(PEL_IW);	/* Pixel Repack */    _ramdac_setcomm(regs[0]);}static void SC15025_restorestate(const unsigned char *regs){    unsigned char c;    _ramdac_dactocomm();    c = inb(PEL_MSK);    _ramdac_setcomm(c | 0x10);    _ramdac_dactocomm();    outb(PEL_IR, 8);    outb(PEL_IW, regs[1]);	/* Aux control */    outb(PEL_IR, 16);    outb(PEL_IW, regs[2]);	/* Pixel Repack */    _ramdac_setcomm(c);    _ramdac_setcomm(regs[0]);}static int SC15025_map_clock(int bpp, int pixelclock){    if (bpp == 32)	return pixelclock * 2;    return pixelclock;}static int SC15025_map_horizontal_crtc(int bpp, int pixelclock, int htiming){    if (bpp == 16)	return htiming * 2;    if (bpp == 32)	return htiming * 4;    return htiming;}static void SC15025_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed){    dacspeed = __svgalib_setDacSpeed(dacspeed, 110000);    cardspecs->maxPixelClock4bpp = dacspeed;    cardspecs->maxPixelClock8bpp = dacspeed;    cardspecs->maxPixelClock16bpp = dacspeed / 2;    cardspecs->maxPixelClock24bpp = 0;    cardspecs->maxPixelClock32bpp = dacspeed / 3;    cardspecs->mapClock = SC15025_map_clock;    cardspecs->mapHorizontalCrtc = SC15025_map_horizontal_crtc;}DacMethods __svgalib_SC15025_methods ={    SIERRA_15025,    "Sierra SC15025/6 DAC",    0,    SC15025_probe,    SC15025_init,    SC15025_qualify_cardspecs,    SC15025_savestate,    SC15025_restorestate,    SC15025_initializestate,    3				/* State size. */};#endif/* * RAMDAC definition for Sierra 1148x Series. * 11482, 83, and 84 (Mark 2) can do 32K (5-5-5) color mode (16bpp). * 11485, 87, and 89 (Mark 3) additionally can do 64K (5-6-5) color mode, * but are not autodetected since they cannot be distinguished from Mark 2. * 11486 really is a Sierra 32K dac, and should have been set by user. *  * Note that these dacs are different from 'Sierra 32K', since they can be * detected as such, while there are clones that work compatible to the * Sierra dacs, but cannot be autodetected. To avoid such dacs to fail * the type 'Sierra 32K' still refers to them, while this new type  * 'SC1148x Series' refers to original Sierra dacs. * * ATTENTION: THIS TEST MUST BE LAST IN CHAIN, SINCE MANY BETTER DACS * IMPLEMENT 32K MODES COMPATIBLE TO THIS ONE AND WOULD BE DETECTED AS * SIERRA! * */#ifdef INCLUDE_SC1148X_DAC_TESTstatic int SC1148X_probe(void){    unsigned char oc, op, tmp, tmp2;    int flag = 0;    _ramdac_dactopel();    tmp = inb(PEL_MSK);    do {	tmp2 = tmp;	tmp = inb(PEL_MSK);    } while (tmp2 != tmp);    inb(PEL_IW);    inb(PEL_MSK);    inb(PEL_MSK);    inb(PEL_MSK);    for (tmp2 = 9; tmp != 0x8E && tmp2 > 0; tmp2--)	tmp = inb(PEL_MSK);    if (tmp != 0x8E) {        _ramdac_dactocomm();        oc = inb(PEL_MSK);        _ramdac_dactopel();        op = inb(PEL_MSK);        tmp = oc ^ 0xFF;        outb(PEL_MSK, tmp);        _ramdac_dactocomm();        tmp2 = inb(PEL_MSK);        if (tmp2 != tmp) {            tmp = _ramdac_setcomm(tmp = oc ^ 0x60);            if ((tmp & 0xe0) == (tmp2 & 0xe0)) {                tmp = inb(PEL_MSK);                _ramdac_dactopel();                if (tmp != inb(PEL_MSK))		    flag = 1; /* Sierra Mark 2 or 3 */	    } else {		/* We have a Sierra SC11486 */#ifdef INCLUDE_SIERRA_DAC		flag = 1;		/* We do some ugly trickery here to patch SC1148X Series		    descriptor with values from Sierra 32K descriptor, since		    this is what whe really have detected! */		__svgalib_SC1148X_methods.id = SIERRA_32K;		__svgalib_SC1148X_methods.name = __svgalib_Sierra_32K_methods.name;		__svgalib_SC1148X_methods.initialize = __svgalib_Sierra_32K_methods.initialize;		__svgalib_SC1148X_methods.qualifyCardSpecs = __svgalib_Sierra_32K_methods.qualifyCardSpecs ;		__svgalib_SC1148X_methods.initializeState = __svgalib_Sierra_32K_methods.initializeState ;#endif	    }	    _ramdac_dactocomm();	    outb(PEL_MSK, oc);	}	_ramdac_dactopel();	outb(PEL_MSK, op);    } else {	_ramdac_dactopel();	/* Diamond SS2410 */    }    return flag;}#else#define SC1148x_probe 0#endif#ifdef INCLUDE_SC1148X_DACstatic void SC1148X_init(void){    if (__svgalib_driver_report)	printf("svgalib: Using Sierra 1148x series 32K DAC.\n");}static void SC1148X_initializestate(unsigned char *regs, int bpp, int colormode,				       int pixelclock){    regs[0] = 0;    if (colormode == RGB16_555)	regs[0] = 0xA0;    /* Mark 3 (not autodetected) */    else if (colormode == RGB16_565)	regs[0] = 0xE0;}static void SC1148X_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed){    dacspeed = __svgalib_setDacSpeed(dacspeed, 110000);    cardspecs->maxPixelClock4bpp = dacspeed;    cardspecs->maxPixelClock8bpp = dacspeed;    cardspecs->maxPixelClock16bpp = dacspeed / 2;    cardspecs->maxPixelClock24bpp = 0;    cardspecs->maxPixelClock32bpp = 0;    cardspecs->mapClock = Sierra_32K_map_clock;    cardspecs->mapHorizontalCrtc = Sierra_32K_map_horizontal_crtc;    cardspecs->flags |= NO_RGB16_565;	/* Mark 3 (11485,87, and higher) can */}DacMethods __svgalib_SC1148X_methods ={    SIERRA_1148X,    "Sierra SC1148x series 32K colors VGA DAC",    0,    SC1148X_probe,    SC1148X_init,    SC1148X_qualify_cardspecs,    __svgalib_Sierra_32K_savestate,    __svgalib_Sierra_32K_restorestate,    SC1148X_initializestate,    1				/* State size. */};#endif

⌨️ 快捷键说明

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