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

📄 init301.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
      if(flag & EnableCHScart)      return TRUE;  /* = Scart = 0x04 - TW */   } else {      flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);      if(flag & SetCRT2ToTV)        return TRUE;   }   return FALSE;}#endif#ifdef SIS315Hstatic BOOLEANSiS_IsLCDOrLCDA(struct SiS_Private *SiS_Pr){   unsigned short flag;   if(SiS_Pr->ChipType >= SIS_315H) {      flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);      if(flag & SetCRT2ToLCD) return TRUE;      flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);      if(flag & SetToLCDA)    return TRUE;   } else {      flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);      if(flag & SetCRT2ToLCD) return TRUE;   }   return FALSE;}#endifstatic BOOLEANSiS_HaveBridge(struct SiS_Private *SiS_Pr){   unsigned short flag;   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {      return TRUE;   } else if(SiS_Pr->SiS_VBType & VB_SISVB) {      flag = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);      if((flag == 1) || (flag == 2)) return TRUE;   }   return FALSE;}static BOOLEANSiS_BridgeIsEnabled(struct SiS_Private *SiS_Pr){   unsigned short flag;   if(SiS_HaveBridge(SiS_Pr)) {      flag = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);      if(SiS_Pr->ChipType < SIS_315H) {	flag &= 0xa0;	if((flag == 0x80) || (flag == 0x20)) return TRUE;      } else {	flag &= 0x50;	if((flag == 0x40) || (flag == 0x10)) return TRUE;      }   }   return FALSE;}static BOOLEANSiS_BridgeInSlavemode(struct SiS_Private *SiS_Pr){   unsigned short flag1;   flag1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);   if(flag1 & (SetInSlaveMode >> 8)) return TRUE;   return FALSE;}/*********************************************//*       GET VIDEO BRIDGE CONFIG INFO        *//*********************************************//* Setup general purpose IO for Chrontel communication */#ifdef SIS300voidSiS_SetChrontelGPIO(struct SiS_Private *SiS_Pr, unsigned short myvbinfo){   unsigned int   acpibase;   unsigned short temp;   if(!(SiS_Pr->SiS_ChSW)) return;#ifdef SIS_LINUX_KERNEL   acpibase = sisfb_read_lpc_pci_dword(SiS_Pr, 0x74);#else   acpibase = pciReadLong(0x00000800, 0x74);#endif   acpibase &= 0xFFFF;   if(!acpibase) return;   temp = SiS_GetRegShort((acpibase + 0x3c));	/* ACPI register 0x3c: GP Event 1 I/O mode select */   temp &= 0xFEFF;   SiS_SetRegShort((acpibase + 0x3c), temp);   temp = SiS_GetRegShort((acpibase + 0x3c));   temp = SiS_GetRegShort((acpibase + 0x3a));	/* ACPI register 0x3a: GP Pin Level (low/high) */   temp &= 0xFEFF;   if(!(myvbinfo & SetCRT2ToTV)) temp |= 0x0100;   SiS_SetRegShort((acpibase + 0x3a), temp);   temp = SiS_GetRegShort((acpibase + 0x3a));}#endifvoidSiS_GetVBInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo,		unsigned short ModeIdIndex, int checkcrt2mode){   unsigned short tempax, tempbx, temp;   unsigned short modeflag, resinfo = 0;   SiS_Pr->SiS_SetFlag = 0;   modeflag = SiS_GetModeFlag(SiS_Pr, ModeNo, ModeIdIndex);   SiS_Pr->SiS_ModeType = modeflag & ModeTypeMask;   if((ModeNo > 0x13) && (!SiS_Pr->UseCustomMode)) {      resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;   }   tempbx = 0;   if(SiS_HaveBridge(SiS_Pr)) {	temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);	tempbx |= temp;	tempax = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) << 8;	tempax &= (DriverMode | LoadDACFlag | SetNotSimuMode | SetPALTV);	tempbx |= tempax;#ifdef SIS315H	if(SiS_Pr->ChipType >= SIS_315H) {	   if(SiS_Pr->SiS_VBType & VB_SISLCDA) {	      if(ModeNo == 0x03) {		 /* Mode 0x03 is never in driver mode */		 SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x31,0xbf);	      }	      if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8))) {		 /* Reset LCDA setting if not driver mode */		 SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);	      }	      if(IS_SIS650) {		 if(SiS_Pr->SiS_UseLCDA) {		    if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xF0) {		       if((ModeNo <= 0x13) || (!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8)))) {			  SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,(EnableDualEdge | SetToLCDA));		       }		    }		 }	      }	      temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);	      if((temp & (EnableDualEdge | SetToLCDA)) == (EnableDualEdge | SetToLCDA)) {		 tempbx |= SetCRT2ToLCDA;	      }	   }	   if(SiS_Pr->ChipType >= SIS_661) { /* New CR layout */	      tempbx &= ~(SetCRT2ToYPbPr525750 | SetCRT2ToHiVision);	      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & 0x04) {		 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35) & 0xe0;		 if(temp == 0x60) tempbx |= SetCRT2ToHiVision;		 else if(SiS_Pr->SiS_VBType & VB_SISYPBPR) {		    tempbx |= SetCRT2ToYPbPr525750;		 }	      }	   }	   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {	      temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);	      if(temp & SetToLCDA) {		 tempbx |= SetCRT2ToLCDA;	      }	      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {		 if(temp & EnableCHYPbPr) {		    tempbx |= SetCRT2ToCHYPbPr;		 }	      }	   }	}#endif  /* SIS315H */        if(!(SiS_Pr->SiS_VBType & VB_SISVGA2)) {	   tempbx &= ~(SetCRT2ToRAMDAC);	}	if(SiS_Pr->SiS_VBType & VB_SISVB) {	   temp = SetCRT2ToSVIDEO   |		  SetCRT2ToAVIDEO   |		  SetCRT2ToSCART    |		  SetCRT2ToLCDA     |		  SetCRT2ToLCD      |		  SetCRT2ToRAMDAC   |		  SetCRT2ToHiVision |		  SetCRT2ToYPbPr525750;	} else {	   if(SiS_Pr->ChipType >= SIS_315H) {	      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {		 temp = SetCRT2ToAVIDEO |		        SetCRT2ToSVIDEO |		        SetCRT2ToSCART  |		        SetCRT2ToLCDA   |		        SetCRT2ToLCD    |		        SetCRT2ToCHYPbPr;	      } else {		 temp = SetCRT2ToLCDA   |		        SetCRT2ToLCD;	      }	   } else {	      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {		 temp = SetCRT2ToTV | SetCRT2ToLCD;	      } else {		 temp = SetCRT2ToLCD;	      }	   }	}	if(!(tempbx & temp)) {	   tempax = DisableCRT2Display;	   tempbx = 0;	}	if(SiS_Pr->SiS_VBType & VB_SISVB) {	   unsigned short clearmask = ( DriverMode |				DisableCRT2Display |				LoadDACFlag 	   |				SetNotSimuMode 	   |				SetInSlaveMode 	   |				SetPALTV 	   |				SwitchCRT2	   |				SetSimuScanMode );	   if(tempbx & SetCRT2ToLCDA)        tempbx &= (clearmask | SetCRT2ToLCDA);	   if(tempbx & SetCRT2ToRAMDAC)      tempbx &= (clearmask | SetCRT2ToRAMDAC);	   if(tempbx & SetCRT2ToLCD)         tempbx &= (clearmask | SetCRT2ToLCD);	   if(tempbx & SetCRT2ToSCART)       tempbx &= (clearmask | SetCRT2ToSCART);	   if(tempbx & SetCRT2ToHiVision)    tempbx &= (clearmask | SetCRT2ToHiVision);	   if(tempbx & SetCRT2ToYPbPr525750) tempbx &= (clearmask | SetCRT2ToYPbPr525750);	} else {	   if(SiS_Pr->ChipType >= SIS_315H) {	      if(tempbx & SetCRT2ToLCDA) {		 tempbx &= (0xFF00|SwitchCRT2|SetSimuScanMode);	      }	   }	   if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {	      if(tempbx & SetCRT2ToTV) {		 tempbx &= (0xFF00|SetCRT2ToTV|SwitchCRT2|SetSimuScanMode);	      }	   }	   if(tempbx & SetCRT2ToLCD) {	      tempbx &= (0xFF00|SetCRT2ToLCD|SwitchCRT2|SetSimuScanMode);	   }	   if(SiS_Pr->ChipType >= SIS_315H) {	      if(tempbx & SetCRT2ToLCDA) {	         tempbx |= SetCRT2ToLCD;	      }	   }	}	if(tempax & DisableCRT2Display) {	   if(!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {	      tempbx = SetSimuScanMode | DisableCRT2Display;	   }	}	if(!(tempbx & DriverMode)) tempbx |= SetSimuScanMode;	/* LVDS/CHRONTEL (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */	if(SiS_Pr->SiS_ModeType <= ModeVGA) {	   if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||	       ((SiS_Pr->SiS_VBType & VB_NoLCD) && (tempbx & SetCRT2ToLCD)) ) {	      modeflag &= (~CRT2Mode);	   }	}	if(!(tempbx & SetSimuScanMode)) {	   if(tempbx & SwitchCRT2) {	      if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {		 if(resinfo != SIS_RI_1600x1200) {		    tempbx |= SetSimuScanMode;		 }              }	   } else {	      if(SiS_BridgeIsEnabled(SiS_Pr)) {		 if(!(tempbx & DriverMode)) {		    if(SiS_BridgeInSlavemode(SiS_Pr)) {		       tempbx |= SetSimuScanMode;		    }		 }	      }	   }	}	if(!(tempbx & DisableCRT2Display)) {	   if(tempbx & DriverMode) {	      if(tempbx & SetSimuScanMode) {		 if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {		    if(resinfo != SIS_RI_1600x1200) {		       tempbx |= SetInSlaveMode;		    }		 }	      }	   } else {	      tempbx |= SetInSlaveMode;	   }	}   }   SiS_Pr->SiS_VBInfo = tempbx;#ifdef SIS300   if(SiS_Pr->ChipType == SIS_630) {      SiS_SetChrontelGPIO(SiS_Pr, SiS_Pr->SiS_VBInfo);   }#endif#ifdef SIS_LINUX_KERNEL#if 0   printk(KERN_DEBUG "sisfb: (init301: VBInfo= 0x%04x, SetFlag=0x%04x)\n",      SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);#endif#endif#ifdef SIS_XORG_XF86#ifdef TWDEBUG   xf86DrvMsg(0, X_PROBED, "(init301: VBInfo=0x%04x, SetFlag=0x%04x)\n",      SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);#endif#endif}/*********************************************//*           DETERMINE YPbPr MODE            *//*********************************************/voidSiS_SetYPbPr(struct SiS_Private *SiS_Pr){   unsigned char temp;   /* Note: This variable is only used on 30xLV systems.    * CR38 has a different meaning on LVDS/CH7019 systems.    * On 661 and later, these bits moved to CR35.    *    * On 301, 301B, only HiVision 1080i is supported.    * On 30xLV, 301C, only YPbPr 1080i is supported.    */   SiS_Pr->SiS_YPbPr = 0;   if(SiS_Pr->ChipType >= SIS_661) return;   if(SiS_Pr->SiS_VBType) {      if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {	 SiS_Pr->SiS_YPbPr = YPbPrHiVision;      }   }   if(SiS_Pr->ChipType >= SIS_315H) {      if(SiS_Pr->SiS_VBType & VB_SISYPBPR) {	 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);	 if(temp & 0x08) {	    switch((temp >> 4)) {	    case 0x00: SiS_Pr->SiS_YPbPr = YPbPr525i;     break;	    case 0x01: SiS_Pr->SiS_YPbPr = YPbPr525p;     break;	    case 0x02: SiS_Pr->SiS_YPbPr = YPbPr750p;     break;	    case 0x03: SiS_Pr->SiS_YPbPr = YPbPrHiVision; break;	    }	 }      }   }}/*********************************************//*           DETERMINE TVMode flag           *//*********************************************/voidSiS_SetTVMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex){   unsigned char  *ROMAddr = SiS_Pr->VirtualRomBase;   unsigned short temp, temp1, resinfo = 0, romindex = 0;   unsigned char  OutputSelect = *SiS_Pr->pSiS_OutputSelect;   SiS_Pr->SiS_TVMode = 0;   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return;   if(SiS_Pr->UseCustomMode) return;   if(ModeNo > 0x13) {      resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;   }   if(SiS_Pr->ChipType < SIS_661) {      if(SiS_Pr->SiS_VBInfo & SetPALTV) SiS_Pr->SiS_TVMode |= TVSetPAL;      if(SiS_Pr->SiS_VBType & VB_SISVB) {	 temp = 0;	 if((SiS_Pr->ChipType == SIS_630) ||	    (SiS_Pr->ChipType == SIS_730)) {	    temp = 0x35;	    romindex = 0xfe;	 } else if(SiS_Pr->ChipType >= SIS_315H) {	    temp = 0x38;	    if(SiS_Pr->ChipType < XGI_20) {	       romindex = 0xf3;	       if(SiS_Pr->ChipType >= SIS_330) romindex = 0x11b;	    }	 }	 if(temp) {	    if(romindex && SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {	       OutputSelect = ROMAddr[romindex];	       if(!(OutputSelect & EnablePALMN)) {		  SiS_SetRegAND(SiS_Pr->SiS_P3d4,temp,0x3F);	       }	    }

⌨️ 快捷键说明

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