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

📄 attdacs.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
字号:
/* * attdacs.c: *  * RAMDAC definition for industry-standard AT&T20C490/498 DACs and  * compatibles. */#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 industry-standard AT&T20C490 DAC with 8-bit pixel * port, and compatibles. * These RAMDACs can do 32K and 64K color mode (16bpp) with doubled VCLK * and 16M (8-8-8) truecolor with tripled VCLK. * 0xA0 is written to the Hidden DAC register for 32K, 0xC0 for 64K and * 0xE0 for 16M. */#ifdef INCLUDE_ATT20C490_DAC_TESTstatic int att20c490_probe(void){    unsigned char oldcomm, notcomm, oldpel, v;    int flag = 0;    _ramdac_dactocomm();    oldcomm = inb(PEL_MSK);    _ramdac_dactopel();    oldpel = inb(PEL_MSK);    notcomm = ~oldcomm;    outb(PEL_MSK, notcomm);    _ramdac_dactocomm();    v = inb(PEL_MSK);    if (v != notcomm) {	if ((_ramdac_setcomm(0xe0) & 0xe0) == 0xe0) {	    if ((_ramdac_setcomm(0x60) & 0xe0) == 0) {		if ((_ramdac_setcomm(2) & 2) > 0)		    flag = 1;	/* 20c490 */		else		    flag = 1;	/* 20c493 */	    } else {		_ramdac_setcomm(oldcomm);		if (inb(PEL_MSK) == notcomm)		    if (_ramdac_setcomm(0xFF) == 0xFF)			flag = 1;	/* 20c491/20c492 */	    }	}    }    _ramdac_dactocomm();    outb(PEL_MSK, oldcomm);    _ramdac_dactopel();    outb(PEL_MSK, oldpel);    return flag;}#else#define att20c490_probe 0#endif#ifdef INCLUDE_ATT20C490_DACstatic void att20c490_init(void){    if (__svgalib_driver_report)	printf("svgalib: Using AT&T20C490-compatible truecolor DAC.\n");#if 0    dactocomm();    inb(PEL_MSK);			/* Skip command register. */    printf("svgalib: DAC Manufacturer ID = 0x%02X, ", inb(PEL_MSK));    printf("Device ID = 0x%02X.\n", inb(PEL_MSK));#endif}int __svgalib_att20c490_map_clock(int bpp, int pixelclock){    if (bpp == 16)	return pixelclock * 2;    if (bpp == 24)	return pixelclock * 3;    return pixelclock;}int __svgalib_att20c490_map_horizontal_crtc(int bpp, int pixelclock, int htiming){    if (bpp == 16)	return htiming * 2;    if (bpp == 24)	return htiming * 3;    return htiming;}static void att20c490_initializestate(unsigned char *regs, int bpp, int colormode,				      int pixelclock){    regs[0] = 0;    if (colormode == RGB16_555)	regs[0] = 0xA0;    if (colormode == RGB16_565)	regs[0] = 0xC0;    if (colormode == RGB24_888_B)	regs[0] = 0xE0;}static void att20c490_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed){    dacspeed = __svgalib_setDacSpeed(dacspeed, 80000);    cardspecs->maxPixelClock4bpp = dacspeed;    cardspecs->maxPixelClock8bpp = dacspeed;    cardspecs->maxPixelClock16bpp = dacspeed / 2;    cardspecs->maxPixelClock24bpp = dacspeed / 3;    cardspecs->maxPixelClock32bpp = 0;    cardspecs->mapClock = __svgalib_att20c490_map_clock;    cardspecs->mapHorizontalCrtc = __svgalib_att20c490_map_horizontal_crtc;}DacMethods __svgalib_ATT20C490_methods ={    ATT20C490,    "AT&T-compatible truecolor DAC, 80 MHz rated",    0,    att20c490_probe,    att20c490_init,    att20c490_qualify_cardspecs,    __svgalib_Sierra_32K_savestate,    __svgalib_Sierra_32K_restorestate,    att20c490_initializestate,    1				/* State size. */};#endif/* * RAMDAC definition for industry-standard AT&T20C498 DAC with 16-bit * pixel port, and compatibles. * Differently rated versions exist, such as 80, 110, 135 and 170 MHz. * This code assumes the DAC is actually connected with a 16-bit path. * (an example of a 498-compatible DAC being used with a 8-bit path * is the Hercules Stingray Pro/V with the IC Works ZoomDAC). */#ifdef INCLUDE_ATT20C498_DAC_TESTstatic int att20c498_probe(void){    return 0;}#else#define att20c498_probe 0#endif#ifdef INCLUDE_ATT20C498_DACstatic void att20c498_init(void){    if (__svgalib_driver_report)	printf("svgalib: Using AT&T20C498-compatible DAC, 80 MHz rated.\n");}static int att20c498_map_clock(int bpp, int pixelclock){    if (bpp == 8 && pixelclock > 80000)	/* Use 16-bit path, clock doubling at RAMDAC. */	return pixelclock / 2;    if (bpp == 16)	return pixelclock;    if (bpp == 32)	return pixelclock * 2;    return pixelclock;}static int att20c498_map_horizontal_crtc(int bpp, int pixelclock, int htiming){    /* Not sure. */    if (bpp == 8 && pixelclock > 80000)	/* Use 16-bit path, clock doubling at RAMDAC. */	return htiming / 2;    if (bpp == 32)	return htiming * 2;    return htiming;}static void att20c498_initializestate(unsigned char *regs, int bpp, int colormode,				      int pixelclock){    regs[0] = 0;    if (colormode == CLUT8_8)	regs[0] = 0x02;    if (colormode == RGB16_555)	regs[0] = 0x10;    if (colormode == RGB16_565)	regs[0] = 0x30;    if (colormode == RGB32_888_B)	regs[0] = 0x50;}static void att20c498_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed){    dacspeed = __svgalib_setDacSpeed(dacspeed, 110000);    cardspecs->maxPixelClock4bpp = 0;    cardspecs->maxPixelClock8bpp = dacspeed;    cardspecs->maxPixelClock16bpp = dacspeed;    cardspecs->maxPixelClock24bpp = 0;    cardspecs->maxPixelClock32bpp = dacspeed / 2;    cardspecs->mapClock = att20c498_map_clock;    cardspecs->mapHorizontalCrtc = att20c498_map_horizontal_crtc;}DacMethods __svgalib_ATT20C498_methods ={    ATT20C498,    "AT&T20C498 DAC",    0,    att20c498_probe,    att20c498_init,    att20c498_qualify_cardspecs,    __svgalib_Sierra_32K_savestate,    __svgalib_Sierra_32K_restorestate,    att20c498_initializestate,    1				/* State size. */};#endif

⌨️ 快捷键说明

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