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

📄 init301.c

📁 linux下的VIDEO接口驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
  } else {    	SiS_SetGroup1_LVDS(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,	                   HwDeviceExtension,RefreshRateTableIndex);  }}voidSiS_SetGroup1_301(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,                  PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex){  USHORT  push1,push2;  USHORT  tempax,tempbx,tempcx,temp;  USHORT  resinfo,modeflag;  USHORT  CRT1Index;  if(ModeNo<=0x13) {    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;  } else {    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;    	CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;    	CRT1Index = CRT1Index &0x3F;  }  if(!(SiS_VBInfo&SetInSlaveMode))  return;  tempax=0xFFFF;  if(!(SiS_VBInfo&SetCRT2ToTV)) {    	tempax=SiS_GetVGAHT2();  }  if(modeflag&Charx8Dot) tempcx=0x08;  else tempcx=0x09;  if(tempax>=SiS_VGAHT) {    	tempax=SiS_VGAHT;  }  if(modeflag&HalfDCLK) {    	tempax=tempax>>1;  }  tempax=(tempax/tempcx)-5;  tempbx=tempax;  temp=0xFF;                                            	/* set MAX HT */  SiS_SetReg1(SiS_Part1Port,0x03,temp);  tempax=SiS_VGAHDE;                                           	/* 0x04 Horizontal Display End */  if(modeflag&HalfDCLK) tempax=tempax>>1;  tempax=(tempax/tempcx)-1;  tempbx=tempbx|((tempax&0x00FF)<<8);  temp=tempax&0x00FF;  SiS_SetReg1(SiS_Part1Port,0x04,temp);  temp=(tempbx&0xFF00)>>8;  if(SiS_VBInfo&SetCRT2ToTV){    	temp=temp+2;    	if(SiS_VBInfo&SetCRT2ToHiVisionTV) {      		if(resinfo==7) temp=temp-2;    	}  }  SiS_SetReg1(SiS_Part1Port,0x05,temp);                         /* 0x05 Horizontal Display Start */  SiS_SetReg1(SiS_Part1Port,0x06,0x03);                       	/* 0x06 Horizontal Blank end     */                                                           	/* 0x07 horizontal Retrace Start */  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {    temp=(tempbx&0x00FF)-1;    if(!(modeflag&HalfDCLK)) {      temp=temp-6;      if(SiS_SetFlag&TVSimuMode) {        temp=temp-4;        if(ModeNo>0x13) temp=temp-10;      }    }  } else {    tempcx=tempbx&0x00FF;    tempbx=(tempbx&0xFF00)>>8;    tempcx=(tempcx+tempbx)>>1;    temp=(tempcx&0x00FF)+2;    if(SiS_VBInfo&SetCRT2ToTV){       temp=temp-1;       if(!(modeflag&HalfDCLK)){          if((modeflag&Charx8Dot)){            temp=temp+4;            if(SiS_VGAHDE>=800){              temp=temp-6;            }          }        }    } else {       if(!(modeflag&HalfDCLK)){         temp=temp-4;         if(SiS_LCDResInfo!=Panel1280x960) {           if(SiS_VGAHDE>=800){             temp=temp-7;             if(SiS_ModeType==ModeEGA){               if(SiS_VGAVDE==1024){                 temp=temp+15;                 if(SiS_LCDResInfo!=Panel1280x1024){                    temp=temp+7;                 }               }             }             if(SiS_VGAHDE>=1280){               if(SiS_LCDResInfo!=Panel1280x960) {                 if(SiS_LCDInfo&LCDNonExpanding) {                   temp=temp+28;                 }               }             }           }         }       }    }  }   SiS_SetReg1(SiS_Part1Port,0x07,temp);                       	/* 0x07 Horizontal Retrace Start */  SiS_SetReg1(SiS_Part1Port,0x08,0);                            /* 0x08 Horizontal Retrace End   */    if(SiS_VBInfo&SetCRT2ToTV) {        if(SiS_SetFlag&TVSimuMode) {            if((ModeNo==0x06)||(ModeNo==0x10)||(ModeNo==0x11)||(ModeNo==0x13)||(ModeNo==0x0F)){             	SiS_SetReg1(SiS_Part1Port,0x07,0x5b);             	SiS_SetReg1(SiS_Part1Port,0x08,0x03);            }            if((ModeNo==0x00)||(ModeNo==0x01)) {             	if(SiS_VBInfo&SetNTSCTV) {             		SiS_SetReg1(SiS_Part1Port,0x07,0x2A);             		SiS_SetReg1(SiS_Part1Port,0x08,0x61);              	} else {             		SiS_SetReg1(SiS_Part1Port,0x07,0x2A);             		SiS_SetReg1(SiS_Part1Port,0x08,0x41);             		SiS_SetReg1(SiS_Part1Port,0x0C,0xF0);            	}           }           if((ModeNo==0x02)||(ModeNo==0x03)||(ModeNo==0x07)){            	if(SiS_VBInfo&SetNTSCTV) {           		SiS_SetReg1(SiS_Part1Port,0x07,0x54);           		SiS_SetReg1(SiS_Part1Port,0x08,0x00);            	} else {           		SiS_SetReg1(SiS_Part1Port,0x07,0x55);           		SiS_SetReg1(SiS_Part1Port,0x08,0x00);           		SiS_SetReg1(SiS_Part1Port,0x0C,0xF0);           	}           }           if((ModeNo==0x04)||(ModeNo==0x05)||(ModeNo==0x0D)||(ModeNo==0x50)){            	if(SiS_VBInfo&SetNTSCTV) {            		SiS_SetReg1(SiS_Part1Port,0x07,0x30);            		SiS_SetReg1(SiS_Part1Port,0x08,0x03);            	} else {           		SiS_SetReg1(SiS_Part1Port,0x07,0x2f);           		SiS_SetReg1(SiS_Part1Port,0x08,0x02);                }           }       }   }    SiS_SetReg1(SiS_Part1Port,0x18,0x03);                         	/* 0x18 SR08    */  SiS_SetRegANDOR(SiS_Part1Port,0x19,0xF0,0x00);  SiS_SetReg1(SiS_Part1Port,0x09,0xFF);                         	/* 0x09 Set Max VT    */  tempbx=SiS_VGAVT;  push1=tempbx;  tempcx=0x121;  tempbx=SiS_VGAVDE;                                        		/* 0x0E Virtical Display End */  if(tempbx==357) tempbx=350;  if(tempbx==360) tempbx=350;  if(tempbx==375) tempbx=350;  if(tempbx==405) tempbx=400;  if(tempbx==420) tempbx=400;  if(tempbx==525) tempbx=480;  push2=tempbx;  if(SiS_VBInfo&SetCRT2ToLCD) {    	if(SiS_LCDResInfo==Panel1024x768) {      		if(!(SiS_SetFlag&LCDVESATiming)) {        		if(tempbx==350) tempbx=tempbx+5;        		if(tempbx==480) tempbx=tempbx+5;      		}    	}  }  tempbx--;  temp=tempbx&0x00FF;  tempbx--;  temp=tempbx&0x00FF;  SiS_SetReg1(SiS_Part1Port,0x10,temp);                    		/* 0x10 vertical Blank Start */  tempbx=push2;  tempbx--;  temp=tempbx&0x00FF;  SiS_SetReg1(SiS_Part1Port,0x0E,temp);  if(tempbx&0x0100){    	tempcx=tempcx|0x0002;  }  tempax=0x000B;  if(modeflag&DoubleScanMode){    	tempax=tempax|0x08000;  }  if(tempbx&0x0200){    	tempcx=tempcx|0x0040;  }  temp=(tempax&0xFF00)>>8;  SiS_SetReg1(SiS_Part1Port,0x0B,temp);  if(tempbx&0x0400){    	tempcx=tempcx|0x0600;  }  SiS_SetReg1(SiS_Part1Port,0x11,0x00);                         	/* 0x11 Vertival Blank End */  tempax=push1;  tempax=tempax-tempbx;                              			/* 0x0C Vertical Retrace Start */  tempax=tempax>>2;  push1=tempax;  if(resinfo!=0x09) {    	tempax=tempax<<1;    	tempbx=tempax+tempbx;  }  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {    	tempbx=tempbx-10;  } else {    	if(SiS_SetFlag&TVSimuMode) {      		if(SiS_VBInfo&SetPALTV) {        		tempbx=tempbx+40;      		}    	}  }  tempax=push1;  tempax=tempax>>2;  tempax++;  tempax=tempax+tempbx;  push1=tempax;  if((SiS_VBInfo&SetPALTV)) {    	if(tempbx<=513)  {      		if(tempax>=513) {        		tempbx=513;      		}    	}  }  temp=(tempbx&0x00FF);  SiS_SetReg1(SiS_Part1Port,0x0C,temp);  tempbx--;  temp=tempbx&0x00FF;  SiS_SetReg1(SiS_Part1Port,0x10,temp);  if(tempbx&0x0100){    	tempcx=tempcx|0x0008;  }  if(tempbx&0x0200){    	SiS_SetRegANDOR(SiS_Part1Port,0x0B,0x0FF,0x20);  }  tempbx++;  if(tempbx&0x0100){    	tempcx=tempcx|0x0004;  }  if(tempbx&0x0200){    	tempcx=tempcx|0x0080;  }  if(tempbx&0x0400){    	tempcx=tempcx|0x0C00;  }  tempbx=push1;  temp=tempbx&0x00FF;  temp=temp&0x0F;  SiS_SetReg1(SiS_Part1Port,0x0D,temp);                    		/* 0x0D vertical Retrace End */  if(tempbx&0x0010) {    	tempcx=tempcx|0x2000;  }  temp=tempcx&0x00FF;  SiS_SetReg1(SiS_Part1Port,0x0A,temp);                    		/* 0x0A CR07 */  temp=(tempcx&0x0FF00)>>8;  SiS_SetReg1(SiS_Part1Port,0x17,temp);                    		/* 0x17 SR0A */  tempax=modeflag;  temp=(tempax&0xFF00)>>8;  temp=(temp>>1)&0x09;  SiS_SetReg1(SiS_Part1Port,0x16,temp);                    		/* 0x16 SR01 */  SiS_SetReg1(SiS_Part1Port,0x0F,0);                         		/* 0x0F CR14 */  SiS_SetReg1(SiS_Part1Port,0x12,0);                         		/* 0x12 CR17 */  if(SiS_LCDInfo&LCDRGB18Bit) temp=0x80;  else temp=0x00;  SiS_SetReg1(SiS_Part1Port,0x1A,temp);                         	/* 0x1A SR0E */  return;}/* TW: This seems to be for some of 301B/302B/301LV/302LV as well *     which confuses me. In init.c, there is code for these bridges *     which is executed ONLY if IF_DEF_LVDS is 0. The following *     is being called only if IF_DEF_LVDS is NOT 0, and it contains *     code for 301B et al as well. Is IF_DEF_LVDS now 0 or 1 on *     301B/302B/301LV/302LV? */void SiS_SetGroup1_LVDS(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,		        USHORT ModeIdIndex,                        PSIS_HW_DEVICE_INFO HwDeviceExtension,			USHORT RefreshRateTableIndex){  USHORT modeflag,resinfo;  USHORT push1,push2,tempax,tempbx,tempcx,temp,pushcx;  ULONG tempeax=0,tempebx,tempecx,tempvcfact=0;  if(ModeNo<=0x13) {    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      	/* si+St_ResInfo */    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;  } else {    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     	/* si+Ext_ResInfo */    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;  }  tempax=SiS_LCDHDES;  tempbx=SiS_HDE;  tempcx=SiS_HT;  tempcx=tempcx-tempbx;                                    		/* HT-HDE  */  if(SiS_LCDInfo&LCDNonExpanding) {    	if(SiS_LCDResInfo==Panel640x480)  tempbx=640;    	if(SiS_LCDResInfo==Panel800x600)  tempbx=800;    	if(SiS_LCDResInfo==Panel1024x768) tempbx=1024;  }  push1=tempax;  tempax=tempax+tempbx;                                    		/* lcdhdee  */  tempbx=SiS_HT;  if(tempax>=tempbx){    	tempax=tempax-tempbx;  }  push2=tempax;	                                                       	/* push ax   lcdhdee  */  tempcx=tempcx>>2;                                        		/* temp  */  tempcx=tempcx+tempax;                                    		/* lcdhrs  */  if(tempcx>=tempbx){    	tempcx=tempcx-tempbx;  }									/* v ah,cl  */  tempax=tempcx;  tempax=tempax>>3;                                        		/* BPLHRS */  temp=tempax&0x00FF;  if(SiS_LCDResInfo==Panel640x480){                         		/*adjust for panel 640x480*/      	temp=temp-4;  }  SiS_SetReg1(SiS_Part1Port,0x14,temp);		/* <------------------ */ 	/* Part1_14h  */  temp=(tempax&0x00FF)+10;  temp=temp&0x01F;  temp=temp|(((tempcx&0x00ff)&0x07)<<5);  /*fstn*/  if(SiS_IF_DEF_FSTN){      	temp=0x20;  }  SiS_SetReg1(SiS_Part1Port,0x15,temp);    	/* <------------------- */      /* Part1_15h  */  tempbx=push2;                                          			/* lcdhdee  */  tempcx=push1;                                         			/* lcdhdes  */  temp=(tempcx&0x00FF);  temp=temp&0x07;                                      				/* BPLHDESKEW  */  SiS_SetReg1(SiS_Part1Port,0x1A,temp);   	/* <------------------- */      /* Part1_1Ah  */  tempcx=tempcx>>3;                                        			/* BPLHDES */  temp=(tempcx&0x00FF);  if(ModeNo==0x5b){                            					/*fix fstn mode=5b*/      	temp--;  }  SiS_SetReg1(SiS_Part1Port,0x16,temp);    	/* <------------------- */      /* Part1_16h  */  if(tempbx&0x07) tempbx=tempbx+8;  tempbx=tempbx>>3;                                        			/* BPLHDEE  */  temp=tempbx&0x00FF;  if(ModeNo==0x5b){                            					/*fix fstn mode=5b*/      	temp--;  }  SiS_SetReg1(SiS_Part1Port,0x17,temp);   	/* <------------------- */      /* Part1_17h  */  tempcx=SiS_VGAVT;  tempbx=SiS_VGAVDE;  tempcx=tempcx-tempbx;                                    			/* GAVT-VGAVDE  */  tempbx=SiS_LCDVDES;			                    			/* VGAVDES  */  push1=tempbx;                                        				/* push bx temppush1 */  if(SiS_IF_DEF_TRUMPION==0){    	if(SiS_IF_DEF_CH7005==1) {      		if(SiS_VBInfo&SetCRT2ToTV) {        		tempax=SiS_VGAVDE;      		}    	}    	if(SiS_VBInfo&SetCRT2ToLCD) {      		if(SiS_LCDResInfo==Panel640x480)  tempax=480;      		if(SiS_LCDResInfo==Panel800x600)  tempax=600;      		if(SiS_LCDResInfo==Panel1024x768) tempax=768;      		if(SiS_LCDResInfo==Panel320x480)  tempax=480;    	}  } else tempax=SiS_VGAVDE;  tempbx=tempbx+tempax;  tempax=SiS_VT;                                               			/* VT  */  if(tempbx>=SiS_VT){    	tempbx=tempbx-tempax;  }  push2=tempbx;                                        				/* push bx  temppush2  */  tempcx=tempcx>>1;  tempbx=tempbx+tempcx;  tempbx++;                                                			/* BPLVRS  */  if(tempbx>=tempax){    	tempbx=tempbx-tempax;  }

⌨️ 快捷键说明

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