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

📄 init.c

📁 底层驱动开发
💻 C
📖 第 1 页 / 共 5 页
字号:
}/*********************************************//*          HELPER: SetReg, GetReg           *//*********************************************/voidSiS_SetReg(SISIOADDRESS port, unsigned short index, unsigned short data){   OutPortByte(port, index);   OutPortByte(port + 1, data);}voidSiS_SetRegByte(SISIOADDRESS port, unsigned short data){   OutPortByte(port, data);}voidSiS_SetRegShort(SISIOADDRESS port, unsigned short data){   OutPortWord(port, data);}voidSiS_SetRegLong(SISIOADDRESS port, unsigned int data){   OutPortLong(port, data);}unsigned charSiS_GetReg(SISIOADDRESS port, unsigned short index){   OutPortByte(port, index);   return(InPortByte(port + 1));}unsigned charSiS_GetRegByte(SISIOADDRESS port){   return(InPortByte(port));}unsigned shortSiS_GetRegShort(SISIOADDRESS port){   return(InPortWord(port));}unsigned intSiS_GetRegLong(SISIOADDRESS port){   return(InPortLong(port));}voidSiS_SetRegANDOR(SISIOADDRESS Port, unsigned short Index, unsigned short DataAND, unsigned short DataOR){   unsigned short temp;   temp = SiS_GetReg(Port, Index);   temp = (temp & (DataAND)) | DataOR;   SiS_SetReg(Port, Index, temp);}voidSiS_SetRegAND(SISIOADDRESS Port, unsigned short Index, unsigned short DataAND){   unsigned short temp;   temp = SiS_GetReg(Port, Index);   temp &= DataAND;   SiS_SetReg(Port, Index, temp);}voidSiS_SetRegOR(SISIOADDRESS Port, unsigned short Index, unsigned short DataOR){   unsigned short temp;   temp = SiS_GetReg(Port, Index);   temp |= DataOR;   SiS_SetReg(Port, Index, temp);}/*********************************************//*      HELPER: DisplayOn, DisplayOff        *//*********************************************/voidSiS_DisplayOn(struct SiS_Private *SiS_Pr){   SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x01,0xDF);}voidSiS_DisplayOff(struct SiS_Private *SiS_Pr){   SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x01,0x20);}/*********************************************//*        HELPER: Init Port Addresses        *//*********************************************/voidSiSRegInit(struct SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr){   SiS_Pr->SiS_P3c4 = BaseAddr + 0x14;   SiS_Pr->SiS_P3d4 = BaseAddr + 0x24;   SiS_Pr->SiS_P3c0 = BaseAddr + 0x10;   SiS_Pr->SiS_P3ce = BaseAddr + 0x1e;   SiS_Pr->SiS_P3c2 = BaseAddr + 0x12;   SiS_Pr->SiS_P3ca = BaseAddr + 0x1a;   SiS_Pr->SiS_P3c6 = BaseAddr + 0x16;   SiS_Pr->SiS_P3c7 = BaseAddr + 0x17;   SiS_Pr->SiS_P3c8 = BaseAddr + 0x18;   SiS_Pr->SiS_P3c9 = BaseAddr + 0x19;   SiS_Pr->SiS_P3cb = BaseAddr + 0x1b;   SiS_Pr->SiS_P3cc = BaseAddr + 0x1c;   SiS_Pr->SiS_P3cd = BaseAddr + 0x1d;   SiS_Pr->SiS_P3da = BaseAddr + 0x2a;   SiS_Pr->SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;   SiS_Pr->SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;   SiS_Pr->SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;   SiS_Pr->SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;   SiS_Pr->SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14 + 2;   SiS_Pr->SiS_DDC_Port  = BaseAddr + 0x14;   SiS_Pr->SiS_VidCapt   = BaseAddr + SIS_VIDEO_CAPTURE;   SiS_Pr->SiS_VidPlay   = BaseAddr + SIS_VIDEO_PLAYBACK;}/*********************************************//*             HELPER: GetSysFlags           *//*********************************************/static voidSiS_GetSysFlags(struct SiS_Private *SiS_Pr){   unsigned char cr5f, temp1, temp2;   /* 661 and newer: NEVER write non-zero to SR11[7:4] */   /* (SR11 is used for DDC and in enable/disablebridge) */   SiS_Pr->SiS_SensibleSR11 = FALSE;   SiS_Pr->SiS_MyCR63 = 0x63;   if(SiS_Pr->ChipType >= SIS_330) {      SiS_Pr->SiS_MyCR63 = 0x53;      if(SiS_Pr->ChipType >= SIS_661) {         SiS_Pr->SiS_SensibleSR11 = TRUE;      }   }   /* You should use the macros, not these flags directly */   SiS_Pr->SiS_SysFlags = 0;   if(SiS_Pr->ChipType == SIS_650) {      cr5f = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x5c,0x07);      temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;      SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x5c,0xf8);      temp2 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;      if((!temp1) || (temp2)) {	 switch(cr5f) {	    case 0x80:	    case 0x90:	    case 0xc0:	       SiS_Pr->SiS_SysFlags |= SF_IsM650;	       break;	    case 0xa0:	    case 0xb0:	    case 0xe0:	       SiS_Pr->SiS_SysFlags |= SF_Is651;	       break;	 }      } else {	 switch(cr5f) {	    case 0x90:	       temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;	       switch(temp1) {		  case 0x00: SiS_Pr->SiS_SysFlags |= SF_IsM652; break;		  case 0x40: SiS_Pr->SiS_SysFlags |= SF_IsM653; break;		  default:   SiS_Pr->SiS_SysFlags |= SF_IsM650; break;	       }	       break;	    case 0xb0:	       SiS_Pr->SiS_SysFlags |= SF_Is652;	       break;	    default:	       SiS_Pr->SiS_SysFlags |= SF_IsM650;	       break;	 }      }   }   if(SiS_Pr->ChipType >= SIS_760 && SiS_Pr->ChipType <= SIS_761) {      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x78) & 0x30) {         SiS_Pr->SiS_SysFlags |= SF_760LFB;      }      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x79) & 0xf0) {         SiS_Pr->SiS_SysFlags |= SF_760UMA;      }   }}/*********************************************//*         HELPER: Init PCI & Engines        *//*********************************************/static voidSiSInitPCIetc(struct SiS_Private *SiS_Pr){   switch(SiS_Pr->ChipType) {#ifdef SIS300   case SIS_300:   case SIS_540:   case SIS_630:   case SIS_730:      /* Set - PCI LINEAR ADDRESSING ENABLE (0x80)       *     - RELOCATED VGA IO ENABLED (0x20)       *     - MMIO ENABLED (0x01)       * Leave other bits untouched.       */      SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x20,0xa1);      /*  - Enable 2D (0x40)       *  - Enable 3D (0x02)       *  - Enable 3D Vertex command fetch (0x10) ?       *  - Enable 3D command parser (0x08) ?       */      SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x5A);      break;#endif#ifdef SIS315H   case SIS_315H:   case SIS_315:   case SIS_315PRO:   case SIS_650:   case SIS_740:   case SIS_330:   case SIS_661:   case SIS_741:   case SIS_660:   case SIS_760:   case SIS_761:   case SIS_340:   case XGI_40:      /* See above */      SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x20,0xa1);      /*  - Enable 3D G/L transformation engine (0x80)       *  - Enable 2D (0x40)       *  - Enable 3D vertex command fetch (0x10)       *  - Enable 3D command parser (0x08)       *  - Enable 3D (0x02)       */      SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0xDA);      break;   case XGI_20:   case SIS_550:      /* See above */      SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x20,0xa1);      /* No 3D engine ! */      /*  - Enable 2D (0x40)       *  - disable 3D       */      SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0x60,0x40);      break;#endif   default:      break;   }}/*********************************************//*             HELPER: SetLVDSetc            *//*********************************************/#ifdef SIS_LINUX_KERNELstatic#endifvoidSiSSetLVDSetc(struct SiS_Private *SiS_Pr){   unsigned short temp;   SiS_Pr->SiS_IF_DEF_LVDS = 0;   SiS_Pr->SiS_IF_DEF_TRUMPION = 0;   SiS_Pr->SiS_IF_DEF_CH70xx = 0;   SiS_Pr->SiS_IF_DEF_CONEX = 0;   SiS_Pr->SiS_ChrontelInit = 0;   if(SiS_Pr->ChipType == XGI_20) return;   /* Check for SiS30x first */   temp = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);   if((temp == 1) || (temp == 2)) return;   switch(SiS_Pr->ChipType) {#ifdef SIS300   case SIS_540:   case SIS_630:   case SIS_730:	temp = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x37) & 0x0e) >> 1;	if((temp >= 2) && (temp <= 5))	SiS_Pr->SiS_IF_DEF_LVDS = 1;	if(temp == 3)			SiS_Pr->SiS_IF_DEF_TRUMPION = 1;	if((temp == 4) || (temp == 5)) {		/* Save power status (and error check) - UNUSED */		SiS_Pr->SiS_Backup70xx = SiS_GetCH700x(SiS_Pr, 0x0e);		SiS_Pr->SiS_IF_DEF_CH70xx = 1;	}	break;#endif#ifdef SIS315H   case SIS_550:   case SIS_650:   case SIS_740:   case SIS_330:	temp = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x37) & 0x0e) >> 1;	if((temp >= 2) && (temp <= 3))	SiS_Pr->SiS_IF_DEF_LVDS = 1;	if(temp == 3)			SiS_Pr->SiS_IF_DEF_CH70xx = 2;	break;   case SIS_661:   case SIS_741:   case SIS_660:   case SIS_760:   case SIS_761:   case SIS_340:   case XGI_20:   case XGI_40:	temp = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & 0xe0) >> 5;	if((temp >= 2) && (temp <= 3)) 	SiS_Pr->SiS_IF_DEF_LVDS = 1;	if(temp == 3)			SiS_Pr->SiS_IF_DEF_CH70xx = 2;	if(temp == 4)			SiS_Pr->SiS_IF_DEF_CONEX = 1;  /* Not yet supported */	break;#endif   default:	break;   }}/*********************************************//*          HELPER: Enable DSTN/FSTN         *//*********************************************/voidSiS_SetEnableDstn(struct SiS_Private *SiS_Pr, int enable){   SiS_Pr->SiS_IF_DEF_DSTN = enable ? 1 : 0;}voidSiS_SetEnableFstn(struct SiS_Private *SiS_Pr, int enable){   SiS_Pr->SiS_IF_DEF_FSTN = enable ? 1 : 0;}/*********************************************//*            HELPER: Get modeflag           *//*********************************************/unsigned shortSiS_GetModeFlag(struct SiS_Private *SiS_Pr, unsigned short ModeNo,		unsigned short ModeIdIndex){   if(SiS_Pr->UseCustomMode) {      return SiS_Pr->CModeFlag;   } else if(ModeNo <= 0x13) {      return SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;   } else {      return SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;   }}/*********************************************//*        HELPER: Determine ROM usage        *//*********************************************/BOOLEANSiSDetermineROMLayout661(struct SiS_Private *SiS_Pr){   unsigned char  *ROMAddr  = SiS_Pr->VirtualRomBase;   unsigned short romversoffs, romvmaj = 1, romvmin = 0;   if(SiS_Pr->ChipType >= XGI_20) {      /* XGI ROMs don't qualify */      return FALSE;   } else if(SiS_Pr->ChipType >= SIS_761) {      /* I very much assume 761, 340 and newer will use new layout */      return TRUE;   } else if(SiS_Pr->ChipType >= SIS_661) {      if((ROMAddr[0x1a] == 'N') &&	 (ROMAddr[0x1b] == 'e') &&	 (ROMAddr[0x1c] == 'w') &&	 (ROMAddr[0x1d] == 'V')) {	 return TRUE;      }      romversoffs = ROMAddr[0x16] | (ROMAddr[0x17] << 8);      if(romversoffs) {	 if((ROMAddr[romversoffs+1] == '.') || (ROMAddr[romversoffs+4] == '.')) {	    romvmaj = ROMAddr[romversoffs] - '0';	    romvmin = ((ROMAddr[romversoffs+2] -'0') * 10) + (ROMAddr[romversoffs+3] - '0');	 }      }      if((romvmaj != 0) || (romvmin >= 92)) {	 return TRUE;      }   } else if(IS_SIS650740) {      if((ROMAddr[0x1a] == 'N') &&	 (ROMAddr[0x1b] == 'e') &&	 (ROMAddr[0x1c] == 'w') &&	 (ROMAddr[0x1d] == 'V')) {	 return TRUE;      }   }   return FALSE;}static voidSiSDetermineROMUsage(struct SiS_Private *SiS_Pr){   unsigned char  *ROMAddr  = SiS_Pr->VirtualRomBase;   unsigned short romptr = 0;   SiS_Pr->SiS_UseROM = FALSE;   SiS_Pr->SiS_ROMNew = FALSE;   SiS_Pr->SiS_PWDOffset = 0;   if(SiS_Pr->ChipType >= XGI_20) return;   if((ROMAddr) && (SiS_Pr->UseROM)) {      if(SiS_Pr->ChipType == SIS_300) {	 /* 300: We check if the code starts below 0x220 by	  * checking the jmp instruction at the beginning	  * of the BIOS image.	  */	 if((ROMAddr[3] == 0xe9) && ((ROMAddr[5] << 8) | ROMAddr[4]) > 0x21a)

⌨️ 快捷键说明

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