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

📄 rage.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
📖 第 1 页 / 共 4 页
字号:
       outl(ATIIOPortDSP_ON_OFF, restore->dsp_on_off);       outl(ATIIOPortDSP_CONFIG, restore->dsp_config);    };        outl(ATIIOPortMEM_INFO, restore->mem_info);    outl(ATIIOPortCRTC_INT_CNTL,restore->crtc_int_cntl);    outl(ATIIOPortCRTC_GEN_CNTL,restore->crtc_gen_cntl);    outl(ATIIOPortGEN_TEST_CNTL,restore->gen_test_cntl);    switch(rage_clock){       case 0: /* internal clock */          i=ATIGetMach64PLLReg(PLL_VCLK_CNTL) | PLL_VCLK_RESET;          ATIPutMach64PLLReg(PLL_VCLK_CNTL,i);              ATIPutMach64PLLReg(PLL_VCLK_POST_DIV, restore->PLL[PLL_VCLK_POST_DIV]);          ATIPutMach64PLLReg(PLL_XCLK_CNTL, restore->PLL[PLL_XCLK_CNTL]);          ATIPutMach64PLLReg(PLL_VCLK0_FB_DIV+ATIClockToProgram, restore->PLL[PLL_VCLK0_FB_DIV+ATIClockToProgram]);              i&= ~PLL_VCLK_RESET;          ATIPutMach64PLLReg(PLL_VCLK_CNTL,i);       break;    };    /* make sure the dac is in 8 bit or 6 bit mode, as needed */    outl(ATIIOPortDAC_CNTL, restore->dac_cntl);     outb(ATIIOPortDAC_MASK, 0xFFU);    outb(ATIIOPortDAC_WRITE, 0x00U);    for (Index = 0;  Index < DAC_SIZE;  Index++)      outb(ATIIOPortDAC_DATA, restore->DAC[Index]);    switch(rage_dac){       case 5:          i=inl(ATIIOPortDAC_CNTL);          outl(ATIIOPortDAC_CNTL,(i&0xfffffffc)|2);          outb(ATIIOPortDAC_WRITE,restore->extdac[8]);          outb(ATIIOPortDAC_MASK,restore->extdac[10]);          outb(ATIIOPortDAC_READ,restore->extdac[11]);          outl(ATIIOPortDAC_CNTL,(i&0xfffffffc)|3);          outb(ATIIOPortDAC_WRITE,(inb(ATIIOPortDAC_WRITE)&0x80)|restore->extdac[12]);       break;    };    outb(ATIIOPortDAC_READ, restore->dac_read);    outb(ATIIOPortDAC_WRITE, restore->dac_write);    outl(ATIIOPortDAC_CNTL, restore->dac_cntl);};/* Return nonzero if mode is available */static int rage_modeavailable(int mode){    struct info *info;    ModeTiming *modetiming;    ModeInfo *modeinfo;    if ((mode < G640x480x256 )	|| mode == G720x348x2)	return __svgalib_vga_driverspecs.modeavailable(mode);    info = &__svgalib_infotable[mode];    if (rage_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;}static unsignedcomp_lmn(unsigned clock, int *n, int *mp, int *lp);/* Local, called by rage_setmode(). */static void rage_initializemode(unsigned char *moderegs,			    ModeTiming * modetiming, ModeInfo * modeinfo, int mode){     int m,n,l,i;    ATIHWPtr ATINewHWPtr;    int ATIDisplayFIFODepth = 32 ;    int ReferenceDivider = M ;        ATINewHWPtr=(ATIHWPtr)(moderegs+VGA_TOTAL_REGS);     moderegs[GRA+0]=0;    moderegs[GRA+1]=0;    moderegs[GRA+2]=0;    moderegs[GRA+3]=0;    moderegs[GRA+4]=0;    moderegs[GRA+5]=0x10;    moderegs[GRA+6]=1;    moderegs[GRA+7]=0;    moderegs[GRA+8]=0xff;    moderegs[SEQ+0]=0x3;    moderegs[SEQ+1]=0x0;    moderegs[SEQ+2]=0x0F;    moderegs[SEQ+3]=0x0;    moderegs[SEQ+4]=0x0A;    moderegs[ATT+0x10]=0x0c;    moderegs[ATT+0x11]=0x11;    moderegs[ATT+0x12]=0xf;    moderegs[ATT+0x13]=0x13;    moderegs[ATT+0x14]=0;    moderegs[VGA_MISCOUTPUT]=0x27;    ATINewHWPtr->clock_cntl=ATIClockToProgram;    ATINewHWPtr->crtc_int_cntl=(inl(ATIIOPortCRTC_INT_CNTL) & ~CRTC_INT_ENS)        				| CRTC_INT_ACKS /*0x80000074 */;    ATINewHWPtr->shared_cntl=0;    ATINewHWPtr->gen_test_cntl=0;        ATINewHWPtr->mem_info=inl(ATIIOPortMEM_INFO);        if(ATIChip<ATI_CHIP_264CT)      ATINewHWPtr->mem_info &= ~(CTL_MEM_BNDRY | CTL_MEM_BNDRY_EN) ;    ATINewHWPtr->PLL[PLL_VCLK_POST_DIV]=ATIGetMach64PLLReg(PLL_VCLK_POST_DIV);    ATINewHWPtr->PLL[PLL_XCLK_CNTL]=ATIGetMach64PLLReg(PLL_XCLK_CNTL);    for(i=0;i<256;i++)ATINewHWPtr->DAC[i*3]=ATINewHWPtr->DAC[i*3+1]=                      ATINewHWPtr->DAC[i*3+2]=i;    ATINewHWPtr->crtc_off_pitch=SetBits(modeinfo->width >> 3, CRTC_PITCH);      ATINewHWPtr->bus_cntl = (inl(ATIIOPortBUS_CNTL) &        ~BUS_HOST_ERR_INT_EN) | BUS_HOST_ERR_INT;    if (ATIChip < ATI_CHIP_264VTB)        ATINewHWPtr->bus_cntl = (ATINewHWPtr->bus_cntl &            ~(BUS_FIFO_ERR_INT_EN | BUS_ROM_DIS)) |            (SetBits(15, BUS_FIFO_WS) | BUS_FIFO_ERR_INT);    else        ATINewHWPtr->bus_cntl |= BUS_APER_REG_DIS;    ATINewHWPtr->dac_cntl=inl(ATIIOPortDAC_CNTL);    if (modeinfo->bitsPerPixel>8)            ATINewHWPtr->dac_cntl |= DAC_8BIT_EN;      else            ATINewHWPtr->dac_cntl &= ~DAC_8BIT_EN;    ATINewHWPtr->config_cntl= inl(ATIIOPortCONFIG_CNTL) | CFG_MEM_VGA_AP_EN;    ATINewHWPtr->ovr_clr=0;    modetiming->CrtcVDisplay--;    modetiming->CrtcVSyncStart--;    modetiming->CrtcVSyncEnd--;    modetiming->CrtcVTotal--;    modetiming->CrtcHDisplay = (modetiming->CrtcHDisplay >> 3) - 1;    modetiming->CrtcHTotal = (modetiming->CrtcHTotal >> 3) - 1;    modetiming->CrtcHSyncStart  = (modetiming->CrtcHSyncStart >> 3) -1;    modetiming->CrtcHSyncEnd = (modetiming->CrtcHSyncEnd >> 3) -1;    comp_lmn(modetiming->pixelClock,&n,&m,&l);        switch(rage_clock) {       case 1:             ATINewHWPtr->ics2595=n|(l<<9);         break;       default:            ATINewHWPtr->PLL[PLL_VCLK0_FB_DIV+ATIClockToProgram]=n;            ATINewHWPtr->PLL[PLL_VCLK_POST_DIV]&=0xfc<<(ATIClockToProgram<<1);            ATINewHWPtr->PLL[PLL_VCLK_POST_DIV]|=(l&3)<<(ATIClockToProgram<<1);            ATINewHWPtr->PLL[PLL_XCLK_CNTL]&=~(0x10<<ATIClockToProgram);            ATINewHWPtr->PLL[PLL_XCLK_CNTL]|=((l>>2)<<4)<<ATIClockToProgram;    };    ATINewHWPtr->crtc_h_total_disp =          SetBits(modetiming->CrtcHTotal, CRTC_H_TOTAL) |          SetBits(modetiming->CrtcHDisplay, CRTC_H_DISP);    ATINewHWPtr->crtc_h_sync_strt_wid =          SetBits(modetiming->CrtcHSyncStart, CRTC_H_SYNC_STRT) |          SetBits(0, CRTC_H_SYNC_DLY) |               SetBits(GetBits(modetiming->CrtcHSyncStart, 0x0100U),CRTC_H_SYNC_STRT_HI) |          SetBits(modetiming->CrtcHSyncEnd - modetiming->CrtcHSyncStart,CRTC_H_SYNC_WID);    if (modetiming->flags & NHSYNC)          ATINewHWPtr->crtc_h_sync_strt_wid |= CRTC_H_SYNC_POL;    ATINewHWPtr->crtc_v_total_disp =          SetBits(modetiming->CrtcVTotal, CRTC_V_TOTAL) |          SetBits(modetiming->CrtcVDisplay, CRTC_V_DISP);    ATINewHWPtr->crtc_v_sync_strt_wid =          SetBits(modetiming->CrtcVSyncStart, CRTC_V_SYNC_STRT) |          SetBits(modetiming->CrtcVSyncEnd - modetiming->CrtcVSyncStart,CRTC_V_SYNC_WID);    if (modetiming->flags & NVSYNC)          ATINewHWPtr->crtc_v_sync_strt_wid |= CRTC_V_SYNC_POL;    ATINewHWPtr->crtc_gen_cntl = inl(ATIIOPortCRTC_GEN_CNTL) &            ~(CRTC_DBL_SCAN_EN | CRTC_INTERLACE_EN |              CRTC_HSYNC_DIS | CRTC_VSYNC_DIS | CRTC_CSYNC_EN |              CRTC_PIX_BY_2_EN | CRTC_DISPLAY_DIS | CRTC_VGA_XOVERSCAN |              CRTC_PIX_WIDTH | CRTC_BYTE_PIX_ORDER | CRTC_FIFO_LWM |              CRTC_VGA_128KAP_PAGING | CRTC_VFC_SYNC_TRISTATE |              CRTC_LOCK_REGS |                        CRTC_SYNC_TRISTATE | CRTC_DISP_REQ_EN |              CRTC_VGA_TEXT_132 | CRTC_CUR_B_TEST);    ATINewHWPtr->crtc_gen_cntl |= CRTC_EXT_DISP_EN | CRTC_EN |          CRTC_VGA_LINEAR | CRTC_CNT_EN | CRTC_BYTE_PIX_ORDER;    switch (modeinfo->bitsPerPixel)        {            case 1:                ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_1BPP;                break;            case 4:                ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_4BPP;                break;            case 8:                ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_8BPP;                break;            case 16:               	switch(modeinfo->colorBits)                   {	                        case 15:                           ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_15BPP;                           break;                        case 16:                           ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_16BPP;                           break;                   };                break;            case 24:                ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_24BPP;                break;            case 32:                ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_32BPP;                break;            default:                break;        }    if (modetiming->flags & DOUBLESCAN)            ATINewHWPtr->crtc_gen_cntl |= CRTC_DBL_SCAN_EN;    if (modetiming->flags & INTERLACED)            ATINewHWPtr->crtc_gen_cntl |= CRTC_INTERLACE_EN;    switch(rage_dac){       case 5: /* 68860/68880 */          ATINewHWPtr->extdac[8]=2;          ATINewHWPtr->extdac[10]=0x1d;          switch(modeinfo->bitsPerPixel) {             case 8: ATINewHWPtr->extdac[11]=0x83; break;             case 15: ATINewHWPtr->extdac[11]=0xa0; break;             case 16: ATINewHWPtr->extdac[11]=0xa1; break;             case 24: ATINewHWPtr->extdac[11]=0xc0; break;             case 32: ATINewHWPtr->extdac[11]=0xe3; break;          };          ATINewHWPtr->extdac[12]=0x60;          if(modeinfo->bitsPerPixel==8)ATINewHWPtr->extdac[12]=0x61;          if(rage_memory<1024)ATINewHWPtr->extdac[12]|=0x04;          if(rage_memory==1024)ATINewHWPtr->extdac[12]|=0x08;          if(rage_memory>1024)ATINewHWPtr->extdac[12]|=0x0c;       break;           };    rage_bpp = modeinfo->bytesPerPixel; if((ATIChip>=ATI_CHIP_264VTB)&&(ATIIODecoding==BLOCK_IO)){    int Multiplier, Divider;    int dsp_precision, dsp_on, dsp_off, dsp_xclks;    int tmp, vshift, xshift;    int ATIXCLKFeedbackDivider,        ATIXCLKReferenceDivider,        ATIXCLKPostDivider;    int ATIXCLKMaxRASDelay,        ATIXCLKPageFaultDelay,        ATIDisplayLoopLatency;    int IO_Value;    IO_Value = ATIGetMach64PLLReg(PLL_XCLK_CNTL);    ATIXCLKPostDivider = GetBits(IO_Value, PLL_XCLK_SRC_SEL);    ATIXCLKReferenceDivider = M ;    switch (ATIXCLKPostDivider)    {        case 0: case 1: case 2: case 3:            break;        case 4:            ATIXCLKReferenceDivider *= 3;            ATIXCLKPostDivider = 0;            break;        default:            return;    }    ATIXCLKPostDivider -= GetBits(IO_Value, PLL_MFB_TIMES_4_2B);    ATIXCLKFeedbackDivider = ATIGetMach64PLLReg(PLL_MCLK_FB_DIV);    IO_Value = inl(ATIIOPortMEM_INFO);    tmp = GetBits(IO_Value, CTL_MEM_TRP);    ATIXCLKPageFaultDelay = GetBits(IO_Value, CTL_MEM_TRCD) +        GetBits(IO_Value, CTL_MEM_TCRD) + tmp + 2;    ATIXCLKMaxRASDelay = GetBits(IO_Value, CTL_MEM_TRAS) + tmp + 2;    ATIDisplayFIFODepth = 32;    if ( ATIChip < ATI_CHIP_264VT4 )    {        ATIXCLKPageFaultDelay += 2;        ATIXCLKMaxRASDelay += 3;        ATIDisplayFIFODepth = 24;    }            switch (ATIMemoryType)    {        case MEM_264_DRAM:            if (rage_memory <= 1024)                ATIDisplayLoopLatency = 10;            else            {                ATIDisplayLoopLatency = 8;                ATIXCLKPageFaultDelay += 2;            }            break;        case MEM_264_EDO:        case MEM_264_PSEUDO_EDO:            if (rage_memory <= 1024)                ATIDisplayLoopLatency = 9;            else            {                ATIDisplayLoopLatency = 8;                ATIXCLKPageFaultDelay++;            }            break;        case MEM_264_SDRAM:            if (rage_memory <= 1024)                ATIDisplayLoopLatency = 11;            else            {                ATIDisplayLoopLatency = 10;                ATIXCLKPageFaultDelay++;            }            break;        case MEM_264_SGRAM:            ATIDisplayLoopLatency = 8;            ATIXCLKPageFaultDelay += 3;            break;        default:                            ATIDisplayLoopLatency = 11;            ATIXCLKPageFaultDelay += 3;            break;    }    if (ATIXCLKMaxRASDelay <= ATIXCLKPageFaultDelay)        ATIXCLKMaxRASDelay = ATIXCLKPageFaultDelay + 1;#   define Maximum_DSP_PRECISION ((int)GetBits(DSP_PRECISION, DSP_PRECISION))    Multiplier = ReferenceDivider * ATIXCLKFeedbackDivider *       postdiv[l];    Divider = n * ATIXCLKReferenceDivider;/*    if (!ATIUsingPlanarModes) */        Divider *= modeinfo->bitsPerPixel >> 2;    vshift = (5 - 2) - ATIXCLKPostDivider;    vshift++;                 tmp = ATIDivide(Multiplier * ATIDisplayFIFODepth, Divider, vshift, 1);    for (dsp_precision = -5;  tmp;  dsp_precision++)        tmp >>= 1;    if (dsp_precision < 0)        dsp_precision = 0;    else if (dsp_precision > Maximum_DSP_PRECISION)        dsp_precision = Maximum_DSP_PRECISION;    xshift = 6 - dsp_precision;    vshift += xshift;    dsp_off = ATIDivide(Multiplier * (ATIDisplayFIFODepth - 1), Divider,        vshift, 1);    {        dsp_on = ATIDivide(Multiplier, Divider, vshift, -1);        tmp = ATIDivide(ATIXCLKMaxRASDelay, 1, xshift, 1);        if (dsp_on < tmp)            dsp_on = tmp;        dsp_on += tmp + ATIDivide(ATIXCLKPageFaultDelay, 1, xshift, 1);    }    dsp_xclks = ATIDivide(Multiplier, Divider, vshift + 5, 1);    ATINewHWPtr->dsp_on_off = SetBits(dsp_on, DSP_ON) |        SetBits(dsp_off, DSP_OFF);    ATINewHWPtr->dsp_config = SetBits(dsp_precision, DSP_PRECISION) |        SetBits(dsp_xclks, DSP_XCLKS_PER_QW) |        SetBits(ATIDisplayLoopLatency, DSP_LOOP_LATENCY);}    if (ATIChip < ATI_CHIP_264VTB)        ATINewHWPtr->crtc_gen_cntl |= CRTC_FIFO_LWM;return ;}static int rage_setmode(int mode, int prv_mode){    unsigned char *moderegs;    ModeTiming *modetiming;    ModeInfo *modeinfo;    ATIHWPtr ATINewHWPtr;    if ((mode < G640x480x256 /*&& mode != G320x200x256*/)	|| mode == G720x348x2) {

⌨️ 快捷键说明

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