📄 atimode.c
字号:
pATI->LCDHorizontal, HORZ_STRETCH_BLEND); } while (0); if (!pATI->OptionPanelDisplay || (VDisplay >= pATI->LCDVertical)) { pATIHW->vert_stretching = 0; } else { pATIHW->vert_stretching = (VERT_STRETCH_USE0 | VERT_STRETCH_EN) | SetBits((VDisplay * (MaxBits(VERT_STRETCH_RATIO0) + 1)) / pATI->LCDVertical, VERT_STRETCH_RATIO0); }#ifndef AVOID_CPIO /* Copy non-shadow CRTC register values to the shadow set */ for (Index = 0; Index < NumberOf(pATIHW->shadow_vga); Index++) pATIHW->shadow_vga[Index] = pATIHW->crt[Index];#endif /* AVOID_CPIO */ pATIHW->shadow_h_total_disp = pATIHW->crtc_h_total_disp; pATIHW->shadow_h_sync_strt_wid = pATIHW->crtc_h_sync_strt_wid; pATIHW->shadow_v_total_disp = pATIHW->crtc_v_total_disp; pATIHW->shadow_v_sync_strt_wid = pATIHW->crtc_v_sync_strt_wid; } /* Fill in clock data */ if (!ATIClockCalculate(iScreen, pATI, pATIHW, pMode)) return FALSE; /* Setup ECP clock divider */ if (pATI->Chip >= ATI_CHIP_264VT) { if (pATI->Chip <= ATI_CHIP_264VT3) MaxScalerClock = 80000; else if (pATI->Chip <= ATI_CHIP_264GT2C) MaxScalerClock = 100000; else if (pATI->Chip == ATI_CHIP_264GTPRO) MaxScalerClock = 125000; else if (pATI->Chip <= ATI_CHIP_MOBILITY) MaxScalerClock = 135000; else MaxScalerClock = 80000; /* Conservative */ pATIHW->pll_vclk_cntl &= ~PLL_ECP_DIV;#ifdef TV_OUT if (!pATI->OptionTvOut) {#endif /* TV_OUT */ /* XXX Don't do this for TVOut! */ ECPClock = pMode->SynthClock; for (Index = 0; (ECPClock > MaxScalerClock) && (Index < 2); Index++) ECPClock >>= 1; pATIHW->pll_vclk_cntl |= SetBits(Index, PLL_ECP_DIV);#ifdef TV_OUT }#endif /* TV_OUT */ } else if (pATI->DAC == ATI_DAC_IBMRGB514) { ATIRGB514Calculate(pATI, pATIHW, pMode); } return TRUE;}#ifdef TV_OUTstatic voidATISetVBEMode( ScrnInfoPtr pScreenInfo, ATIPtr pATI, ATIHWPtr pATIHW){ xf86LoaderRefSymLists(vbeSymbols, NULL); if (pATIHW->crtc == ATI_CRTC_MACH64) { int vbemode, modekey; /* Find a suitable VESA VBE mode, if one exists */ modekey = (pScreenInfo->depth << 16) | (pScreenInfo->currentMode->HDisplay); switch (modekey) { case (15<<16)|(640): vbemode = 0x110; break; case (16<<16)|(640): vbemode = 0x111; break;#if 0 case (24<<16)|(640): vbemode = 0x112; break;#endif case (15<<16)|(800): vbemode = 0x113; break; case (16<<16)|(800): vbemode = 0x114; break;#if 0 case (24<<16)|(800): vbemode = 0x115; break;#endif case (15<<16)|(1024): vbemode = 0x116; break; case (16<<16)|(1024): vbemode = 0x117; break;#if 0 case (24<<16)|(1024): vbemode = 0x118; break;#endif default: xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Mode not supported for TV-Out: depth: %d HDisplay: %d\n", modekey>>16, modekey & 0xffff); return; } if (pATI->pVBE) { /* Preserve video memory contents */ vbemode |= (1<<15); if (VBESetVBEMode(pATI->pVBE, vbemode, NULL)) { xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "VBESetMode: 0x%X (width: %d, pitch: %d, depth: %d)\n", vbemode, pScreenInfo->currentMode->HDisplay, pScreenInfo->displayWidth, pScreenInfo->depth); outr(CRTC_OFF_PITCH, SetBits(pScreenInfo->displayWidth>>3, CRTC_PITCH)); } else { xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "VBESetMode failed.\n"); } } else { xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "VBE module not loaded.\n"); } } else { /* restore text mode with VBESetMode */ if (pATI->pVBE) { if (VBESetVBEMode(pATI->pVBE, pATI->vbemode, NULL)) { xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Restoring VESA mode: 0x%x\n", pATI->vbemode); } else { xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "VBESetMode failed.\n"); } } else { xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "VBE module not loaded.\n"); } } if (xf86ServerIsExiting()) { if (pATI->pVBE) vbeFree(pATI->pVBE); if (pATI->pInt10) xf86FreeInt10(pATI->pInt10); }}#endif /* TV_OUT *//* * ATIModeSet -- * * This function sets a video mode. It writes out all video state data that * has been previously calculated or saved. */voidATIModeSet( ScrnInfoPtr pScreenInfo, ATIPtr pATI, ATIHWPtr pATIHW){#ifndef AVOID_CPIO int Index; /* Get back to bank 0 */ (*pATIHW->SetBank)(pATI, 0);#endif /* AVOID_CPIO */ if (pATI->Chip >= ATI_CHIP_88800GXC) { /* Stop CRTC */ outr(CRTC_GEN_CNTL, pATIHW->crtc_gen_cntl & ~(CRTC_EXT_DISP_EN | CRTC_EN)); if (pATI->Chip >= ATI_CHIP_264CT) { ATIMach64PutPLLReg(PLL_VCLK_CNTL, pATIHW->pll_vclk_cntl); ATIMach64PutPLLReg(PLL_VCLK_POST_DIV, pATIHW->pll_vclk_post_div); ATIMach64PutPLLReg(PLL_VCLK0_FB_DIV, pATIHW->pll_vclk0_fb_div); ATIMach64PutPLLReg(PLL_VCLK1_FB_DIV, pATIHW->pll_vclk1_fb_div); ATIMach64PutPLLReg(PLL_VCLK2_FB_DIV, pATIHW->pll_vclk2_fb_div); ATIMach64PutPLLReg(PLL_VCLK3_FB_DIV, pATIHW->pll_vclk3_fb_div); ATIMach64PutPLLReg(PLL_XCLK_CNTL, pATIHW->pll_xclk_cntl); if (pATI->Chip >= ATI_CHIP_264LT) ATIMach64PutPLLReg(PLL_EXT_VPLL_CNTL, pATIHW->pll_ext_vpll_cntl); ATIMach64PutPLLReg(PLL_VCLK_CNTL, pATIHW->pll_vclk_cntl & ~PLL_VCLK_RESET); /* Load LCD registers */ if (pATI->LCDPanelID >= 0) { if (pATI->Chip == ATI_CHIP_264LT) { /* Update non-shadow registers first */ outr(LCD_GEN_CTRL, pATIHW->lcd_gen_ctrl & ~SHADOW_RW_EN); /* Temporarily disable stretching */ outr(HORZ_STRETCHING, pATIHW->horz_stretching & ~(HORZ_STRETCH_MODE | HORZ_STRETCH_EN)); outr(VERT_STRETCHING, pATIHW->vert_stretching & ~(VERT_STRETCH_RATIO1 | VERT_STRETCH_RATIO2 | VERT_STRETCH_USE0 | VERT_STRETCH_EN)); } else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) || (pATI->Chip == ATI_CHIP_264XL) || (pATI->Chip == ATI_CHIP_MOBILITY)) */ { /* Update non-shadow registers first */ ATIMach64PutLCDReg(LCD_CONFIG_PANEL, pATIHW->config_panel); ATIMach64PutLCDReg(LCD_GEN_CNTL, pATIHW->lcd_gen_ctrl & ~(CRTC_RW_SELECT | SHADOW_RW_EN)); /* Temporarily disable stretching */ ATIMach64PutLCDReg(LCD_HORZ_STRETCHING, pATIHW->horz_stretching & ~(HORZ_STRETCH_MODE | HORZ_STRETCH_EN)); ATIMach64PutLCDReg(LCD_VERT_STRETCHING, pATIHW->vert_stretching & ~(VERT_STRETCH_RATIO1 | VERT_STRETCH_RATIO2 | VERT_STRETCH_USE0 | VERT_STRETCH_EN)); } } } } switch (pATIHW->crtc) {#ifndef AVOID_CPIO case ATI_CRTC_VGA: /* Start sequencer reset */ PutReg(SEQX, 0x00U, 0x00U); /* Set pixel clock */ if ((pATIHW->FeedbackDivider > 0) && (pATI->ProgrammableClock > ATI_CLOCK_FIXED)) ATIClockSet(pATI, pATIHW); /* Set up RAMDAC */ if (pATI->DAC == ATI_DAC_IBMRGB514) ATIRGB514Set(pATI, pATIHW); /* Load VGA Wonder */ if (pATI->CPIO_VGAWonder) ATIVGAWonderSet(pATI, pATIHW); /* Load VGA device */ ATIVGASet(pATI, pATIHW); /* Load Mach64 registers */ if (pATI->Chip >= ATI_CHIP_88800GXC) { /* Load MMIO registers */ if (pATI->Block0Base) ATIMach64Set(pATI, pATIHW); outr(CRTC_GEN_CNTL, pATIHW->crtc_gen_cntl); outr(CUR_CLR0, pATIHW->cur_clr0); outr(CUR_CLR1, pATIHW->cur_clr1); outr(CUR_OFFSET, pATIHW->cur_offset); outr(CUR_HORZ_VERT_POSN, pATIHW->cur_horz_vert_posn); outr(CUR_HORZ_VERT_OFF, pATIHW->cur_horz_vert_off); outr(BUS_CNTL, pATIHW->bus_cntl); outr(MEM_VGA_WP_SEL, pATIHW->mem_vga_wp_sel); outr(MEM_VGA_RP_SEL, pATIHW->mem_vga_rp_sel); outr(DAC_CNTL, pATIHW->dac_cntl); outr(GEN_TEST_CNTL, pATIHW->gen_test_cntl | GEN_GUI_EN); outr(GEN_TEST_CNTL, pATIHW->gen_test_cntl); outr(GEN_TEST_CNTL, pATIHW->gen_test_cntl | GEN_GUI_EN); outr(CONFIG_CNTL, pATIHW->config_cntl); if (pATI->Chip >= ATI_CHIP_264CT) { outr(CRTC_H_TOTAL_DISP, pATIHW->crtc_h_total_disp); outr(CRTC_H_SYNC_STRT_WID, pATIHW->crtc_h_sync_strt_wid); outr(CRTC_V_TOTAL_DISP, pATIHW->crtc_v_total_disp); outr(CRTC_V_SYNC_STRT_WID, pATIHW->crtc_v_sync_strt_wid); outr(CRTC_OFF_PITCH, pATIHW->crtc_off_pitch); if (pATI->Chip >= ATI_CHIP_264VTB) { outr(MEM_CNTL, pATIHW->mem_cntl); outr(MPP_CONFIG, pATIHW->mpp_config); outr(MPP_STROBE_SEQ, pATIHW->mpp_strobe_seq); outr(TVO_CNTL, pATIHW->tvo_cntl); } } } break;#endif /* AVOID_CPIO */ case ATI_CRTC_MACH64: /* Load Mach64 CRTC registers */ ATIMach64Set(pATI, pATIHW);#ifndef AVOID_CPIO if (pATI->UseSmallApertures) { /* Oddly enough, these need to be set also, maybe others */ PutReg(SEQX, 0x02U, pATIHW->seq[2]); PutReg(SEQX, 0x04U, pATIHW->seq[4]); PutReg(GRAX, 0x06U, pATIHW->gra[6]); if (pATI->CPIO_VGAWonder) ATIModifyExtReg(pATI, 0xB6U, -1, 0x00U, pATIHW->b6); }#endif /* AVOID_CPIO */ break; default: break; } if (pATI->LCDPanelID >= 0) { /* Switch to shadow registers */ if (pATI->Chip == ATI_CHIP_264LT) outr(LCD_GEN_CTRL, pATIHW->lcd_gen_ctrl | SHADOW_RW_EN); else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) || (pATI->Chip == ATI_CHIP_264XL) || (pATI->Chip == ATI_CHIP_MOBILITY)) */ ATIMach64PutLCDReg(LCD_GEN_CNTL, (pATIHW->lcd_gen_ctrl & ~CRTC_RW_SELECT) | SHADOW_RW_EN); /* Restore shadow registers */ switch (pATIHW->crtc) {#ifndef AVOID_CPIO case ATI_CRTC_VGA: for (Index = 0; Index < NumberOf(pATIHW->shadow_vga); Index++) PutReg(CRTX(pATI->CPIO_VGABase), Index, pATIHW->shadow_vga[Index]); /* Fall through */#endif /* AVOID_CPIO */ case ATI_CRTC_MACH64: outr(CRTC_H_TOTAL_DISP, pATIHW->shadow_h_total_disp); outr(CRTC_H_SYNC_STRT_WID, pATIHW->shadow_h_sync_strt_wid); outr(CRTC_V_TOTAL_DISP, pATIHW->shadow_v_total_disp); outr(CRTC_V_SYNC_STRT_WID, pATIHW->shadow_v_sync_strt_wid); break; default: break; } /* Restore CRTC selection & shadow state and enable stretching */ if (pATI->Chip == ATI_CHIP_264LT) { outr(LCD_GEN_CTRL, pATIHW->lcd_gen_ctrl); outr(HORZ_STRETCHING, pATIHW->horz_stretching); outr(VERT_STRETCHING, pATIHW->vert_stretching); } else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) || (pATI->Chip == ATI_CHIP_264XL) || (pATI->Chip == ATI_CHIP_MOBILITY)) */ { ATIMach64PutLCDReg(LCD_GEN_CNTL, pATIHW->lcd_gen_ctrl); ATIMach64PutLCDReg(LCD_HORZ_STRETCHING, pATIHW->horz_stretching); ATIMach64PutLCDReg(LCD_VERT_STRETCHING, pATIHW->vert_stretching); ATIMach64PutLCDReg(LCD_EXT_VERT_STRETCH, pATIHW->ext_vert_stretch); outr(LCD_INDEX, pATIHW->lcd_index); } } /* * Set DSP registers. Note that, for some reason, sequencer resets clear * the DSP_CONFIG register on early integrated controllers. */ if (pATI->Chip >= ATI_CHIP_264VTB) ATIDSPSet(pATI, pATIHW); /* Load RAMDAC */ ATIDACSet(pATI, pATIHW); /* Reset hardware cursor caching */ pATI->CursorXOffset = pATI->CursorYOffset = (CARD16)(-1);#ifdef TV_OUT /* Set VBE mode for TV-Out */ if (pATI->OptionTvOut /* && pATI->tvActive */) ATISetVBEMode(pScreenInfo, pATI, pATIHW);#endif /* TV_OUT */#ifndef AVOID_CPIO /* Restore video memory */ ATISwap(pScreenInfo->scrnIndex, pATI, pATIHW, TRUE); if (pATI->VGAAdapter != ATI_ADAPTER_NONE) ATIVGASaveScreen(pATI, SCREEN_SAVER_OFF); /* Turn on screen */#endif /* AVOID_CPIO */ if ((xf86GetVerbosity() > 3) && (pATIHW == &pATI->NewHW)) { xf86ErrorFVerb(4, "\n After setting mode \"%s\":\n\n", pScreenInfo->currentMode->name); ATIPrintMode(pScreenInfo->currentMode); ATIPrintRegisters(pATI); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -