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

📄 init.c

📁 底层驱动开发
💻 C
📖 第 1 页 / 共 5 页
字号:
}static voidSiS_CloseCRTC(struct SiS_Private *SiS_Pr){#if 0 /* This locks some CRTC registers. We don't want that. */   unsigned short temp1 = 0, temp2 = 0;   if(IS_SIS661741660760) {      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {         temp1 = 0xa0; temp2 = 0x08;      }      SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x51,0x1f,temp1);      SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x56,0xe7,temp2);   }#endif}static voidSiS_HandleCRT1(struct SiS_Private *SiS_Pr){   /* Enable CRT1 gating */   SiS_SetRegAND(SiS_Pr->SiS_P3d4,SiS_Pr->SiS_MyCR63,0xbf);#if 0   if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x15) & 0x01)) {      if((SiS_GetReg(SiS_Pr->SiS_P3c4,0x15) & 0x0a) ||         (SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x01)) {         SiS_SetRegOR(SiS_Pr->SiS_P3d4,SiS_Pr->SiS_MyCR63,0x40);      }   }#endif}/*********************************************//*           HELPER: GetColorDepth           *//*********************************************/unsigned shortSiS_GetColorDepth(struct SiS_Private *SiS_Pr, unsigned short ModeNo,		unsigned short ModeIdIndex){   static const unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };   unsigned short modeflag;   short index;   /* Do NOT check UseCustomMode, will skrew up FIFO */   if(ModeNo == 0xfe) {      modeflag = SiS_Pr->CModeFlag;   } else if(ModeNo <= 0x13) {      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;   } else {      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;   }   index = (modeflag & ModeTypeMask) - ModeEGA;   if(index < 0) index = 0;   return ColorDepth[index];}/*********************************************//*             HELPER: GetOffset             *//*********************************************/unsigned shortSiS_GetOffset(struct SiS_Private *SiS_Pr, unsigned short ModeNo,		unsigned short ModeIdIndex, unsigned short RRTI){   unsigned short xres, temp, colordepth, infoflag;   if(SiS_Pr->UseCustomMode) {      infoflag = SiS_Pr->CInfoFlag;      xres = SiS_Pr->CHDisplay;   } else {      infoflag = SiS_Pr->SiS_RefIndex[RRTI].Ext_InfoFlag;      xres = SiS_Pr->SiS_RefIndex[RRTI].XRes;   }   colordepth = SiS_GetColorDepth(SiS_Pr, ModeNo, ModeIdIndex);   temp = xres / 16;   if(infoflag & InterlaceMode) temp <<= 1;   temp *= colordepth;   if(xres % 16) temp += (colordepth >> 1);   return temp;}/*********************************************//*                   SEQ                     *//*********************************************/static voidSiS_SetSeqRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex){   unsigned char SRdata;   int i;   SiS_SetReg(SiS_Pr->SiS_P3c4,0x00,0x03);   /* or "display off"  */   SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[0] | 0x20;   /* determine whether to force x8 dotclock */   if((SiS_Pr->SiS_VBType & VB_SISVB) || (SiS_Pr->SiS_IF_DEF_LVDS)) {      if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {         if(SiS_Pr->SiS_VBInfo & SetInSlaveMode)    SRdata |= 0x01;      } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) SRdata |= 0x01;   }   SiS_SetReg(SiS_Pr->SiS_P3c4,0x01,SRdata);   for(i = 2; i <= 4; i++) {      SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[i - 1];      SiS_SetReg(SiS_Pr->SiS_P3c4,i,SRdata);   }}/*********************************************//*                  MISC                     *//*********************************************/static voidSiS_SetMiscRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex){   unsigned char Miscdata;   Miscdata = SiS_Pr->SiS_StandTable[StandTableIndex].MISC;   if(SiS_Pr->ChipType < SIS_661) {      if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {	 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {	   Miscdata |= 0x0C;	 }      }   }   SiS_SetRegByte(SiS_Pr->SiS_P3c2,Miscdata);}/*********************************************//*                  CRTC                     *//*********************************************/static voidSiS_SetCRTCRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex){   unsigned char  CRTCdata;   unsigned short i;   /* Unlock CRTC */   SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);   for(i = 0; i <= 0x18; i++) {      CRTCdata = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[i];      SiS_SetReg(SiS_Pr->SiS_P3d4,i,CRTCdata);   }   if(SiS_Pr->ChipType >= SIS_661) {      SiS_OpenCRTC(SiS_Pr);      for(i = 0x13; i <= 0x14; i++) {	 CRTCdata = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[i];	 SiS_SetReg(SiS_Pr->SiS_P3d4,i,CRTCdata);      }   } else if( ( (SiS_Pr->ChipType == SIS_630) ||	        (SiS_Pr->ChipType == SIS_730) )  &&	      (SiS_Pr->ChipRevision >= 0x30) ) {      if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {	 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {	    SiS_SetReg(SiS_Pr->SiS_P3d4,0x18,0xFE);	 }      }   }}/*********************************************//*                   ATT                     *//*********************************************/static voidSiS_SetATTRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex){   unsigned char  ARdata;   unsigned short i;   for(i = 0; i <= 0x13; i++) {      ARdata = SiS_Pr->SiS_StandTable[StandTableIndex].ATTR[i];      if(i == 0x13) {	 /* Pixel shift. If screen on LCD or TV is shifted left or right,	  * this might be the cause.	  */	 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {	    if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ARdata = 0;	 }	 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {	    if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {	       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {		  if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata = 0;	       }	    }	 }	 if(SiS_Pr->ChipType >= SIS_661) {	    if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {	       if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata = 0;	    }	 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {	    if(SiS_Pr->ChipType >= SIS_315H) {	       if(IS_SIS550650740660) {		  /* 315, 330 don't do this */		  if(SiS_Pr->SiS_VBType & VB_SIS30xB) {		     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata = 0;		  } else {		     ARdata = 0;		  }	       }	    } else {	       if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata = 0;	    }	 }      }      SiS_GetRegByte(SiS_Pr->SiS_P3da);		/* reset 3da  */      SiS_SetRegByte(SiS_Pr->SiS_P3c0,i);	/* set index  */      SiS_SetRegByte(SiS_Pr->SiS_P3c0,ARdata);	/* set data   */   }   SiS_GetRegByte(SiS_Pr->SiS_P3da);		/* reset 3da  */   SiS_SetRegByte(SiS_Pr->SiS_P3c0,0x14);	/* set index  */   SiS_SetRegByte(SiS_Pr->SiS_P3c0,0x00);	/* set data   */   SiS_GetRegByte(SiS_Pr->SiS_P3da);   SiS_SetRegByte(SiS_Pr->SiS_P3c0,0x20);	/* Enable Attribute  */   SiS_GetRegByte(SiS_Pr->SiS_P3da);}/*********************************************//*                   GRC                     *//*********************************************/static voidSiS_SetGRCRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex){   unsigned char  GRdata;   unsigned short i;   for(i = 0; i <= 0x08; i++) {      GRdata = SiS_Pr->SiS_StandTable[StandTableIndex].GRC[i];      SiS_SetReg(SiS_Pr->SiS_P3ce,i,GRdata);   }   if(SiS_Pr->SiS_ModeType > ModeVGA) {      /* 256 color disable */      SiS_SetRegAND(SiS_Pr->SiS_P3ce,0x05,0xBF);   }}/*********************************************//*          CLEAR EXTENDED REGISTERS         *//*********************************************/static voidSiS_ClearExt1Regs(struct SiS_Private *SiS_Pr, unsigned short ModeNo){   unsigned short i;   for(i = 0x0A; i <= 0x0E; i++) {      SiS_SetReg(SiS_Pr->SiS_P3c4,i,0x00);   }   if(SiS_Pr->ChipType >= SIS_315H) {      SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x37,0xFE);      if(ModeNo <= 0x13) {	 if(ModeNo == 0x06 || ModeNo >= 0x0e) {	    SiS_SetReg(SiS_Pr->SiS_P3c4,0x0e,0x20);	 }      }   }}/*********************************************//*                 RESET VCLK                *//*********************************************/static voidSiS_ResetCRT1VCLK(struct SiS_Private *SiS_Pr){   if(SiS_Pr->ChipType >= SIS_315H) {      if(SiS_Pr->ChipType < SIS_661) {	 if(SiS_Pr->SiS_IF_DEF_LVDS == 0) return;      }   } else {      if((SiS_Pr->SiS_IF_DEF_LVDS == 0) &&	 (!(SiS_Pr->SiS_VBType & VB_SIS30xBLV)) ) {	 return;      }   }   SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x31,0xcf,0x20);   SiS_SetReg(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[1].SR2B);   SiS_SetReg(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[1].SR2C);   SiS_SetReg(SiS_Pr->SiS_P3c4,0x2D,0x80);   SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x31,0xcf,0x10);   SiS_SetReg(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[0].SR2B);   SiS_SetReg(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[0].SR2C);   SiS_SetReg(SiS_Pr->SiS_P3c4,0x2D,0x80);}/*********************************************//*                  SYNC                     *//*********************************************/static voidSiS_SetCRT1Sync(struct SiS_Private *SiS_Pr, unsigned short RRTI){   unsigned short sync;   if(SiS_Pr->UseCustomMode) {      sync = SiS_Pr->CInfoFlag >> 8;   } else {      sync = SiS_Pr->SiS_RefIndex[RRTI].Ext_InfoFlag >> 8;   }   sync &= 0xC0;   sync |= 0x2f;   SiS_SetRegByte(SiS_Pr->SiS_P3c2,sync);}/*********************************************//*                  CRTC/2                   *//*********************************************/static voidSiS_SetCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short ModeNo,		unsigned short ModeIdIndex, unsigned short RRTI){   unsigned short temp, i, j, modeflag;   unsigned char  *crt1data = NULL;   modeflag = SiS_GetModeFlag(SiS_Pr, ModeNo, ModeIdIndex);   if(SiS_Pr->UseCustomMode) {      crt1data = &SiS_Pr->CCRT1CRTC[0];   } else {      temp = SiS_GetRefCRT1CRTC(SiS_Pr, RRTI, SiS_Pr->SiS_UseWide);      /* Alternate for 1600x1200 LCDA */      if((temp == 0x20) && (SiS_Pr->Alternate1600x1200)) temp = 0x57;      crt1data = (unsigned char *)&SiS_Pr->SiS_CRT1Table[temp].CR[0];   }   /* unlock cr0-7 */   SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);   for(i = 0, j = 0; i <= 7; i++, j++) {      SiS_SetReg(SiS_Pr->SiS_P3d4,j,crt1data[i]);   }   for(j = 0x10; i <= 10; i++, j++) {      SiS_SetReg(SiS_Pr->SiS_P3d4,j,crt1data[i]);   }   for(j = 0x15; i <= 12; i++, j++) {      SiS_SetReg(SiS_Pr->SiS_P3d4,j,crt1data[i]);   }   for(j = 0x0A; i <= 15; i++, j++) {      SiS_SetReg(SiS_Pr->SiS_P3c4,j,crt1data[i]);   }   SiS_SetReg(SiS_Pr->SiS_P3c4,0x0E,crt1data[16] & 0xE0);   temp = (crt1data[16] & 0x01) << 5;   if(modeflag & DoubleScanMode) temp |= 0x80;   SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0x5F,temp);   if(SiS_Pr->SiS_ModeType > ModeVGA) {      SiS_SetReg(SiS_Pr->SiS_P3d4,0x14,0x4F);   }#ifdef SIS315H   if(SiS_Pr->ChipType == XGI_20) {      SiS_SetReg(SiS_Pr->SiS_P3d4,0x04,crt1data[4] - 1);      if(!(temp = crt1data[5] & 0x1f)) {         SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0c,0xfb);      }      SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x05,0xe0,((temp - 1) & 0x1f));      temp = (crt1data[16] >> 5) + 3;      if(temp > 7) temp -= 7;      SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0e,0x1f,(temp << 5));   }#endif}/*********************************************//*               OFFSET & PITCH              *//*********************************************//*  (partly overruled by SetPitch() in XF86) *//*********************************************/static voidSiS_SetCRT1Offset(struct SiS_Private *SiS_Pr, unsigned short ModeNo,		unsigned short ModeIdIndex, unsigned short RRTI){   unsigned short temp, DisplayUnit, infoflag;   if(SiS_Pr->UseCustomMode) {      infoflag = SiS_Pr->CInfoFlag;   } else {      infoflag = SiS_Pr->SiS_RefIndex[RRTI].Ext_InfoFlag;   }   DisplayUnit = SiS_GetOffset(SiS_Pr, ModeNo, ModeIdIndex, RRTI);   temp = (DisplayUnit >> 8) & 0x0f;   SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0xF0,temp);   SiS_SetReg(SiS_Pr->SiS_P3d4,0x13,DisplayUnit & 0xFF);   if(infoflag & InterlaceMode) DisplayUnit >>= 1;   DisplayUnit <<= 5;   temp = (DisplayUnit >> 8) + 1;   if(DisplayUnit & 0xff) temp++;   if(SiS_Pr->ChipType == XGI_20) {      if(ModeNo == 0x4a || ModeNo == 0x49) temp--;   }   SiS_SetReg(SiS_Pr->SiS_P3c4,0x10,temp);}/*********************************************//*                  VCLK                     *//*********************************************/static voidSiS_SetCRT1VCLK(struct SiS_Private *SiS_

⌨️ 快捷键说明

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