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

📄 init.c

📁 linux下的VIDEO接口驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
       }     }   }}/* TW: Is this a 315E? */intIs315E(void){   USHORT  data;  	   data=SiS_GetReg1(SiS_P3d4,0x5F);   if (data&0x10) return 1;   else return 0;}/* TW: For 315 only */voidSiS_SetDRAMSize_310(PSIS_HW_DEVICE_INFO HwDeviceExtension){   ULONG   ROMAddr  = (ULONG)HwDeviceExtension->pjVirtualRomBase;   ULONG   FBAddr   = (ULONG)HwDeviceExtension->pjVideoMemoryAddress;   /*USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;*/   USHORT  data;#ifdef SIS301	/* TW: SIS301 ??? */   /*SiS_SetReg1(SiS_P3d4,0x30,0x40);   */#endif#ifdef SIS302   /* TW: SIS302 ??? */   SiS_SetReg1(SiS_P3d4,0x30,0x4D);  /* alan,should change value */   SiS_SetReg1(SiS_P3d4,0x31,0xc0);  /* alan,should change value */   SiS_SetReg1(SiS_P3d4,0x34,0x3F);  /* alan,should change value */#endif   SiSSetMode(HwDeviceExtension,0x2e);   data=SiS_GetReg1(SiS_P3c4,0x21);   SiS_SetReg1(SiS_P3c4,0x21,(USHORT) (data&0xDF));      /* disable read cache */   data=SiS_GetReg1(SiS_P3c4,0x1);   data=data|0x20;   SiS_SetReg1(SiS_P3c4,0x01,data);                    /* Turn OFF Display */   data=SiS_GetReg1(SiS_P3c4,0x16);   SiS_SetReg1(SiS_P3c4,0x16,(USHORT) (data|0x0F));      /* assume lowest speed DRAM */   SiS_SetDRAMModeRegister(ROMAddr);   SiS_DisableRefresh();   SiS_CheckBusWidth_310(ROMAddr,FBAddr);   SiS_VerifyMclk(FBAddr); /* alan 2000/7/3 */   if (SiS_Get310DRAMType(ROMAddr)<2) {     SiS_SDRSizing(FBAddr);   } else {     SiS_DDRSizing(FBAddr);   }      if (Is315E()) {     data=SiS_GetReg1(SiS_P3c4,0x14);     if ((data&0x0C)==0x0C) /* dual channel */     {     	if ((data&0xF0)>0x40)     	  data = (data & 0x0F) | 0x40;     } else { /* single channel */     	if ((data&0xF0)>0x50)     	  data = (data & 0x0F) | 0x50;     }   }      SiS_SetReg1(SiS_P3c4,0x16,SiS_SR15[1][SiS_RAMType]);  /* restore SR16 */   SiS_EnableRefresh(ROMAddr);   data=SiS_GetReg1(SiS_P3c4,0x21);   SiS_SetReg1(SiS_P3c4,0x21,(USHORT) (data|0x20));      /* enable read cache */}#endifvoidSiS_SetMemoryClock(ULONG ROMAddr){   SiS_SetReg1(SiS_P3c4,0x28,SiS_MCLKData[SiS_RAMType].SR28);   SiS_SetReg1(SiS_P3c4,0x29,SiS_MCLKData[SiS_RAMType].SR29);   SiS_SetReg1(SiS_P3c4,0x2A,SiS_MCLKData[SiS_RAMType].SR2A);   SiS_SetReg1(SiS_P3c4,0x2E,SiS_ECLKData[SiS_RAMType].SR2E);   SiS_SetReg1(SiS_P3c4,0x2F,SiS_ECLKData[SiS_RAMType].SR2F);   SiS_SetReg1(SiS_P3c4,0x30,SiS_ECLKData[SiS_RAMType].SR30);#ifdef SIS315H   if (Is315E()) {     SiS_SetReg1(SiS_P3c4,0x28,0x3B); /* 143 */     SiS_SetReg1(SiS_P3c4,0x29,0x22);     SiS_SetReg1(SiS_P3c4,0x2E,0x3B); /* 143 */     SiS_SetReg1(SiS_P3c4,0x2F,0x22);   }#endif}#endif /* ifndef LINUX_XF86 */#ifdef SIS315HUCHARSiS_Get310DRAMType(ULONG   ROMAddr){   UCHAR   data;   /*   index=SiS_GetReg1(SiS_P3c4,0x1A);   index=index&07;   */   if (*pSiS_SoftSetting&SoftDRAMType)     data = *pSiS_SoftSetting & 0x03;   else     data=SiS_GetReg1(SiS_P3c4,0x3a) & 0x03;   return data;}#endif/* SiSInit END *//* ----------------------------------------- */void SiSRegInit(USHORT BaseAddr){   SiS_P3c4=BaseAddr+0x14;   SiS_P3d4=BaseAddr+0x24;   SiS_P3c0=BaseAddr+0x10;   SiS_P3ce=BaseAddr+0x1e;   SiS_P3c2=BaseAddr+0x12;   SiS_P3ca=BaseAddr+0x1a;   SiS_P3c6=BaseAddr+0x16;   SiS_P3c7=BaseAddr+0x17;   SiS_P3c8=BaseAddr+0x18;   SiS_P3c9=BaseAddr+0x19;   SiS_P3da=BaseAddr+0x2A;   SiS_Part1Port=BaseAddr+SIS_CRT2_PORT_04;   SiS_Part2Port=BaseAddr+SIS_CRT2_PORT_10;   SiS_Part3Port=BaseAddr+SIS_CRT2_PORT_12;   SiS_Part4Port=BaseAddr+SIS_CRT2_PORT_14;   SiS_Part5Port=BaseAddr+SIS_CRT2_PORT_14+2;   SiS_DDC_Port=BaseAddr+0x14;  /* 0x3c4; */}voidSiSInitPCIetc(PSIS_HW_DEVICE_INFO HwDeviceExtension){#ifdef LINUX_XF86   if ((HwDeviceExtension->jChipType == SIS_540)||       (HwDeviceExtension->jChipType == SIS_630)||       (HwDeviceExtension->jChipType == SIS_730)||       (HwDeviceExtension->jChipType == SIS_300)) {       /* TW: Set - PCI LINEAR ADDRESSING ENABLE (0x80)		  - PCI IO ENABLE  (0x20)		  - MMIO ENABLE (0x1)  	*/       SiS_SetReg1(SiS_P3c4,0x20,0xa1);       /* TW: Enable 2D (0x42) & 3D accelerator (0x18) */       SiS_SetReg1(SiS_P3c4,0x1E,0x5A);   }   if((HwDeviceExtension->jChipType == SIS_315H)||      (HwDeviceExtension->jChipType == SIS_315PRO)||      (HwDeviceExtension->jChipType == SIS_550)||      (HwDeviceExtension->jChipType == SIS_640)||      (HwDeviceExtension->jChipType == SIS_740)||      (HwDeviceExtension->jChipType == SIS_650)) {      /* TW: This seems to be done the same way on these chipsets */      SiS_SetReg1(SiS_P3c4,0x20,0xa1);      SiS_SetReg1(SiS_P3c4,0x1E,0x5A);   }#endif}voidSiSSetLVDSetc(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo){   ULONG   temp;   SiS_IF_DEF_LVDS=0;   SiS_IF_DEF_CH7005=0;   SiS_IF_DEF_HiVision=0;   SiS_IF_DEF_DSTN=0;   SiS_IF_DEF_FSTN=0;   if((ModeNo==0x5a)||(ModeNo==0x5b)) {   	SiS_IF_DEF_DSTN=1;   /* for 550 dstn */   	SiS_IF_DEF_FSTN=1;   /* for fstn */   }   if((HwDeviceExtension->jChipType == SIS_540)||      (HwDeviceExtension->jChipType == SIS_630)||      (HwDeviceExtension->jChipType == SIS_730)||      (HwDeviceExtension->jChipType == SIS_550)||      (HwDeviceExtension->jChipType == SIS_640)||   /* 08/20/01 chiawen for 640/740 */      (HwDeviceExtension->jChipType == SIS_740)||   /* 09/03/01 chiawen for 640/740 */      (HwDeviceExtension->jChipType == SIS_650))    /* 09/03/01 chiawen for 650 */    {      	if (SiS_IF_DEF_FSTN) {                               /*fstn setCR37=0x04;*/        	SiS_SetReg1(SiS_P3d4,0x37,0x04);      	}      	temp=SiS_GetReg1(SiS_P3d4,0x37);      	temp=(temp&0x0E)>>1;      	if((temp==0)||(temp==1)) {   /* for 301 */        	SiS_IF_DEF_LVDS=0;        	SiS_IF_DEF_CH7005=0;        	SiS_IF_DEF_TRUMPION=0;      	}      	if((temp>=2)&&(temp<=5)) SiS_IF_DEF_LVDS=1;      	if(temp==3) SiS_IF_DEF_TRUMPION=1;      	if((temp==4)||(temp==5)) {		/* TW: Save power status */		SiS_Backup7005 = SiS_GetCH7005(0x0e);		SiS_IF_DEF_CH7005=1;        }   }}voidSiSInitPtr(PSIS_HW_DEVICE_INFO HwDeviceExtension){#ifdef SIS315H   if((HwDeviceExtension->jChipType == SIS_315H)||  /* 05/02/01 ynlai for sis550 */      (HwDeviceExtension->jChipType == SIS_315PRO)||      (HwDeviceExtension->jChipType == SIS_550)||      (HwDeviceExtension->jChipType == SIS_640)||   /* 08/20/01 chiawen for 640/740 */      (HwDeviceExtension->jChipType == SIS_740)||   /* 09/03/01 chiawen for 640/740 */      (HwDeviceExtension->jChipType == SIS_650))    /* 09/03/01 chiawen for 650 */     InitTo310Pointer();#endif#ifdef SIS300   if ((HwDeviceExtension->jChipType == SIS_540)||       (HwDeviceExtension->jChipType == SIS_630)||       (HwDeviceExtension->jChipType == SIS_730)||       (HwDeviceExtension->jChipType == SIS_300))     InitTo300Pointer();#endif}/* 	========================================= 	======== SiS SetMode Function  ========== 	=========================================*/#ifdef LINUX_XF86/* TW: This is used for non-Dual-Head mode from X */BOOLEANSiSBIOSSetMode(PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,               DisplayModePtr mode){   UShort  ModeNo=0;   ModeNo = SiS_CalcModeIndex(pScrn, mode);   if (!ModeNo) return FALSE;   xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Setting mode 0x%x\n", ModeNo);   return(SiSSetMode(HwDeviceExtension, pScrn, ModeNo));}#ifdef SISDUALHEAD/* TW: Set CRT1 mode (used for dual head) */BOOLEANSiSBIOSSetModeCRT1(PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,               DisplayModePtr mode){   ULONG   temp;   USHORT  ModeIdIndex,KeepLockReg;   ULONG   ROMAddr  = (ULONG)HwDeviceExtension->pjVirtualRomBase;   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;   SISPtr  pSiS = SISPTR(pScrn);   SISEntPtr pSiSEnt = pSiS->entityPrivate;   UShort  ModeNo=0;   ModeNo = SiS_CalcModeIndex(pScrn, mode);   if (!ModeNo) return FALSE;   xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Setting mode 0x%x on CRT1\n", ModeNo);   SiSInitPtr(HwDeviceExtension);   SiSRegInit(BaseAddr);   SiSInitPCIetc(HwDeviceExtension);   SiSSetLVDSetc(HwDeviceExtension, ModeNo);   /* TW: We don't clear the buffer under X */   flag_clearbuffer=0;   /* SiS_PresetScratchregister(SiS_P3d4,HwDeviceExtension);  */      		/* add for CRT2  */   KeepLockReg = SiS_GetReg1(SiS_P3c4,0x05);   SiS_SetReg1(SiS_P3c4,0x05,0x86);                             		/* 1.Openkey */   temp = SiS_SearchModeID(ROMAddr,ModeNo,&ModeIdIndex);        		/* 2.Get ModeID Table  */   if(temp==0)  return(0);   /* TW: Determine VBType (301,301B,301LV,302B,302LV) */   SiS_GetVBType(BaseAddr);   SiS_GetVBInfo301(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);   	/*add for CRT2 */   SiS_GetLCDResInfo301(ROMAddr,SiS_P3d4,ModeNo,ModeIdIndex);   		/*add for CRT2 */   SiS_SetCRT1Group(ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex);   pSiSEnt->CRT1ModeNo = ModeNo;   pSiSEnt->CRT1DMode = mode;   /* TW: SetPitch: Adapt to virtual size & position */   SiS_SetPitchCRT1(pScrn, BaseAddr);   /* We have to reset CRT2 if changing mode on CRT1 */   if (pSiSEnt->CRT2ModeNo != -1) {        xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "(Re-)Setting mode 0x%x on CRT2\n",				pSiSEnt->CRT2ModeNo);	SiSBIOSSetModeCRT2(HwDeviceExtension, pSiSEnt->pScrn_1,				pSiSEnt->CRT2DMode);   }   /* Backup/Set ModeNo in MMIO */   /* SiS_GetSetModeID(pScrn,ModeNo); */   if(KeepLockReg==0xA1) SiS_SetReg1(SiS_P3c4,0x05,0x86); /* 05/02/01 ynlai */   else SiS_SetReg1(SiS_P3c4,0x05,0x00);   return TRUE;}/* TW: Set CRT2 mode (used for dual head) */BOOLEANSiSBIOSSetModeCRT2(PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,               DisplayModePtr mode){   ULONG   temp;   USHORT  ModeIdIndex,KeepLockReg;   ULONG   ROMAddr  = (ULONG)HwDeviceExtension->pjVirtualRomBase;   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;   UShort  ModeNo=0;   SISPtr  pSiS = SISPTR(pScrn);   SISEntPtr pSiSEnt = pSiS->entityPrivate;   ModeNo = SiS_CalcModeIndex(pScrn, mode);   if (!ModeNo) return FALSE;   SiSInitPtr(HwDeviceExtension);   SiSRegInit(BaseAddr);   SiSInitPCIetc(HwDeviceExtension);   SiSSetLVDSetc(HwDeviceExtension, ModeNo);   /* TW: We don't clear the buffer under X */   flag_clearbuffer=0;   /* TW: Save ModeNo so we can set it from within SetMode for CRT1 */   pSiSEnt->CRT2ModeNo = ModeNo;   pSiSEnt->CRT2DMode = mode;   /* TW: We can't set CRT2 mode before CRT1 mode is set */   if (pSiSEnt->CRT1ModeNo == -1) {   	xf86DrvMsg(pScrn->scrnIndex, X_PROBED,		"Setting CRT2 mode delayed until after setting CRT1 mode\n");   	return TRUE;   }   xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Setting mode 0x%x on CRT2\n", ModeNo);   /* SiS_PresetScratchregister(SiS_P3d4,HwDeviceExtension);      */  		/* add for CRT2  */   KeepLockReg = SiS_GetReg1(SiS_P3c4,0x05);   SiS_SetReg1(SiS_P3c4,0x05,0x86);                             		/* 1.Openkey */   temp = SiS_SearchModeID(ROMAddr,ModeNo,&ModeIdIndex);        		/* 2.Get ModeID Table  */   if(temp==0)  return(0);   /* TW: Determine VBType (301,301B,301LV,302B,302LV) */   SiS_GetVBType(BaseAddr);   SiS_GetVBInfo301(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);   	/*add for CRT2 */   SiS_GetLCDResInfo301(ROMAddr,SiS_P3d4,ModeNo,ModeIdIndex);   		/*add for CRT2 */   switch (HwDeviceExtension->ujVBChipID) {     case VB_CHIP_301:     case VB_CHIP_301B:    /*for Linux & WinCE to open*/        SiS_SetCRT2Group301(BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);         /*add for CRT2 */        break;     case VB_CHIP_302:        SiS_SetCRT2Group301(BaseAddr,ROMAddr,ModeNo,HwDeviceExtensi

⌨️ 快捷键说明

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