sis_301.c
来自「讲述linux的初始化过程」· C语言 代码 · 共 2,841 行 · 第 1/5 页
C
2,841 行
tempal=*((UCHAR *)(ROMAddr+REFIndex+0x04)); // di+Ext_CRT2CRTC } tempal=tempal&0x1F; tempax=tempal*tempcl; CRT2PtrData=*((USHORT *)(ROMAddr+ADR_CRT2PtrData)); //ADR_CRT2PtrData is defined in init.def REFIndex=*((USHORT *)(ROMAddr+CRT2PtrData+tempbx*2)); REFIndex+=tempax; }}VOID UnLockCRT2(USHORT BaseAddr){ UCHAR temp3; USHORT Part1Port; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; temp3=(UCHAR)GetReg1(Part1Port,0x24); temp3=temp3|0x01; SetReg1(Part1Port,0x24,(USHORT)temp3);}VOID SetCRT2ModeRegs(USHORT BaseAddr,USHORT ModeNo){ USHORT i,j; USHORT tempah=0,temp3; SHORT tempcl; USHORT Part4Port; USHORT Part1Port; Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; for(i=0,j=4;i<3;i++,j++){ SetReg1(Part1Port,j,0); } tempcl=(USHORT)ModeType; if(ModeNo>0x13){ tempcl=tempcl-ModeVGA; if(tempcl>=0){ tempah=((0x010>>tempcl)|0x080); } }else{ tempah=0x080; } if(VBInfo&SetInSlaveMode){ tempah=(tempah^0x0A0); } if(VBInfo&CRT2DisplayFlag){ tempah=0; } SetReg1(Part1Port,0,tempah); if(IF_DEF_LVDS==0){ //301 tempah=0x01; if(!(VBInfo&SetInSlaveMode)){ tempah=(tempah|0x02); } if(!(VBInfo&SetCRT2ToRAMDAC)){ tempah=(tempah^0x05); if(!(VBInfo&SetCRT2ToLCD)){ tempah=(tempah^0x01); } } tempah=(tempah<<5)&0xFF; if(VBInfo&CRT2DisplayFlag){ tempah=0; } SetReg1(Part1Port,0x01,tempah); tempah=tempah>>5; if((ModeType==ModeVGA)&&(!(VBInfo&SetInSlaveMode))){ tempah=tempah|0x010; } if(LCDResInfo!=Panel1024x768){ tempah=tempah|0x080; } if(VBInfo&SetCRT2ToTV){ if(VBInfo&SetInSlaveMode){ tempah=tempah|0x020; } } temp3=(UCHAR)GetReg1(Part4Port,0x0D); temp3=temp3&(~0x0BF); temp3=temp3|tempah; SetReg1(Part4Port,0x0D,(USHORT)temp3); }else{ //LVDS tempah=0; if(!(VBInfo&SetInSlaveMode)){ tempah=tempah|0x02; } tempah=(tempah<<5)&0x0FF; if(VBInfo&CRT2DisplayFlag){ tempah=0; } SetReg1(Part1Port,0x01,tempah); }}VOID SetGroup1(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo, PHW_DEVICE_EXTENSION HwDeviceExtension){ if(IF_DEF_LVDS==0){ //301 SetGroup1_301(BaseAddr,ROMAddr,ModeNo,HwDeviceExtension); }else{ //LVDS SetGroup1_LVDS(BaseAddr,ROMAddr,ModeNo,HwDeviceExtension); }}VOID SetGroup1_LVDS(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo, PHW_DEVICE_EXTENSION HwDeviceExtension){ USHORT temp1,temp2,tempcl,tempch,tempbh,tempal,tempah,tempax,tempbx; USHORT tempcx,OldREFIndex,lcdhdee; USHORT Part1Port; USHORT temppush1,temppush2; unsigned long int tempeax,tempebx,tempecx,templong; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; OldREFIndex=(USHORT)REFIndex; //push di SetCRT2Offset(Part1Port,ROMAddr); SetCRT2FIFO(Part1Port,ROMAddr,ModeNo,HwDeviceExtension); SetCRT2Sync(BaseAddr,ROMAddr,ModeNo); temp1=(VGAHT-1)&0x0FF; //BTVGA2HT 0x08,0x09 SetReg1(Part1Port,0x08,temp1); temp1=(((VGAHT-1)&0xFF00)>>8)<<4; SetRegANDOR(Part1Port,0x09,~0x0F0,temp1); temp1=(VGAHDE+12)&0x0FF; //BTVGA2HDEE 0x0A,0x0C SetReg1(Part1Port,0x0A,temp1); temp1=VGAHDE+12; //bx BTVGA@HRS 0x0B,0x0C temp2=(VGAHT-VGAHDE)>>2; //cx temp1=temp1+temp2; temp2=(temp2<<1)+temp1; tempcl=temp2&0x0FF; // SetReg1(Part1Port,0x0B,(USHORT)(temp1&0x0FF)); tempah=(temp1&0xFF00)>>8; tempbh=((((VGAHDE+12)&0xFF00)>>8)<<4)&0x0FF; tempah=tempah|tempbh; SetReg1(Part1Port,0x0C,tempah); SetReg1(Part1Port,0x0D,tempcl); //BTVGA2HRE 0x0D tempcx=(VGAVT-1); tempah=tempcx&0x0FF; SetReg1(Part1Port,0x0E,tempah); //BTVGA2TV 0x0E,0x12 tempbx=VGAVDE-1; tempah=tempbx&0x0FF; SetReg1(Part1Port,0x0F,tempah); //BTVGA2VDEE 0x0F,0x12 tempah=((tempbx&0xFF00)<<3)>>8; tempah=tempah|((tempcx&0xFF00)>>8); SetReg1(Part1Port,0x12,tempah); tempbx=(VGAVT+VGAVDE)>>1; //BTVGA2VRS 0x10,0x11 tempcx=((VGAVT-VGAVDE)>>4)+tempbx+1; //BTVGA2VRE 0x11 // tempah=tempbx&0x0FF; SetReg1(Part1Port,0x10,tempah); tempbh=(tempbx&0xFF00)>>8; tempah=((tempbh<<4)&0x0FF)|(tempcx&0x0F); SetReg1(Part1Port,0x11,tempah); SetRegANDOR(Part1Port,0x13,~0x03C,tempah); tempax=LCDHDES; tempbx=HDE; tempcx=HT; tempcx=tempcx-tempbx; //HT-HDE tempax=tempax+tempbx; //lcdhdee tempbx=HT; if(tempax>=tempbx){ tempax=tempax-tempbx; } lcdhdee=tempax; tempcx=tempcx>>2; //temp tempcx=tempcx+tempax; //lcdhrs if(tempcx>=tempbx){ tempcx=tempcx-tempbx; } tempax=tempcx; tempax=tempax>>3; //BPLHRS tempah=tempax&0x0FF; SetReg1(Part1Port,0x14,tempah); //Part1_14h tempah=tempah+2; tempah=tempah+0x01F; tempcl=tempcx&0x0FF; tempcl=tempcl&0x07; tempcl=(tempcl<<5)&0xFF; //BPHLHSKEW tempah=tempah|tempcl; SetReg1(Part1Port,0x15,tempah); //Part1_15h tempbx=lcdhdee; //lcdhdee tempcx=LCDHDES; //lcdhdes tempah=(tempcx&0xFF); tempah=tempah&0x07; //BPLHDESKEW SetReg1(Part1Port,0x1A,tempah); //Part1_1Ah tempcx=tempcx>>3; //BPLHDES tempah=(tempcx&0xFF); SetReg1(Part1Port,0x16,tempah); //Part1_16h tempbx=tempbx>>3; //BPLHDEE tempah=tempbx&0xFF; SetReg1(Part1Port,0x17,tempah); //Part1_17h tempcx=VGAVT; tempbx=VGAVDE; tempcx=tempcx-tempbx; //VGAVT-VGAVDE tempbx=LCDVDES; //VGAVDES temppush1=tempbx; //push bx temppush1 if(IF_DEF_TRUMPION==0){ if(LCDResInfo==Panel800x600){ tempax=600; }else{ tempax=768; } }else{ tempax=VGAVDE; } tempbx=tempbx+tempax; tempax=VT; //VT if(tempbx>=VT){ tempbx=tempbx-tempax; } temppush2=tempbx; //push bx temppush2 tempcx=tempcx>>1; tempbx=tempbx+tempcx; tempbx++; //BPLVRS if(tempbx>=tempax){ tempbx=tempbx-tempax; } tempah=tempbx&0xFF; SetReg1(Part1Port,0x18,tempah); //Part1_18h tempcx=tempcx>>3; tempcx=tempcx+tempbx; tempcx++; //BPLVRE tempah=tempcx&0xFF; tempah=tempah&0x0F; tempah=tempah|0x030; SetRegANDOR(Part1Port,0x19,~0x03F,tempah); //Part1_19h tempbh=(tempbx&0xFF00)>>8; tempbh=tempbh&0x07; tempah=tempbh; tempah=(tempah<<3)&0xFF; //BPLDESKEW =0 tempbx=VGAVDE; if(tempbx!=VDE){ tempah=tempah|0x40; } SetRegANDOR(Part1Port,0x1A,0x07,tempah); //Part1_1Ah tempecx=VGAVT; tempebx=VDE; tempeax=VGAVDE; tempecx=tempecx-tempeax; //VGAVT-VGAVDE tempeax=tempeax*64; templong=tempeax/tempebx; if(templong*tempebx<tempeax){ templong++; } tempebx=templong; //BPLVCFACT if(SetFlag&EnableLVDSDDA){ tempebx=tempebx&0x03F; } tempah=(USHORT)(tempebx&0x0FF); SetReg1(Part1Port,0x1E,tempah); //Part1_1Eh tempbx=temppush2; //pop bx temppush2 BPLVDEE tempcx=temppush1; //pop cx temppush1 NPLVDES tempbh=(tempbx&0xFF00)>>8; tempah=tempah&0x07; tempah=tempbh; tempah=tempah<<3; tempch=(tempcx&0xFF00)>>8; tempch=tempah&0x07; tempah=tempah|tempch; SetReg1(Part1Port,0x1D,tempah); //Part1_1Dh tempah=tempbx&0xFF; SetReg1(Part1Port,0x1C,tempah); //Part1_1Ch tempah=tempcx&0xFF; SetReg1(Part1Port,0x1B,tempah); //Part1_1Bh tempecx=VGAHDE; tempebx=HDE; tempeax=tempecx; tempeax=tempeax<<6; tempeax=tempeax<<10; tempeax=tempeax/tempebx; if(tempebx==tempecx){ tempeax=65535; } tempecx=tempeax; tempeax=VGAHT; tempeax=tempeax<<6; tempeax=tempeax<<10; tempeax=tempeax/tempecx; tempecx=tempecx<<16; tempeax=tempeax-1; tempax=(USHORT)(tempeax&0x00FFFF); tempcx=tempax; tempah=tempcx&0x0FF; SetReg1(Part1Port,0x1F,tempah); //Part1_1Fh tempbx=VDE; tempbx--; //BENPLACCEND if(SetFlag&EnableLVDSDDA){ tempbx=1; } tempah=(tempbx&0xFF00)>>8; tempah=(tempah<<3)&0xFF; tempch=(tempcx&0xFF00)>>8; tempch=tempch&0x07; tempah=tempah|tempch; SetReg1(Part1Port,0x20,tempah); //Part1_20h tempah=tempbx&0xFF; SetReg1(Part1Port,0x21,tempah); //Part1_21h tempecx=tempecx>>16; //BPLHCFACT temp1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag if(temp1&HalfDCLK){ tempecx=tempecx>>1; } tempcx=(USHORT)(tempecx&0x0FFFF); tempah=(tempcx&0xFF00)>>8; SetReg1(Part1Port,0x22,tempah); //Part1_22h tempah=tempcx&0x0FF; SetReg1(Part1Port,0x23,tempah); //Part1_23h if(IF_DEF_TRUMPION==1){ tempal=(USHORT)*((UCHAR *)(ROMAddr+ModeIDOffset+0x05)); // si+St_ResInfo if(ModeNo>0x13){ SetFlag=SetFlag|ProgrammingCRT2; GetRatePtrCRT2(ROMAddr,ModeNo); tempal=*((UCHAR *)(ROMAddr+REFIndex+0x04)); // di+Ext_CRT2CRTC tempal=tempal&0x1F; } tempah=0x80; tempal=tempal*tempah; REFIndex= offset_Zurac; //offset Zurac need added in rompost.asm REFIndex=REFIndex+tempal; SetTPData(); //this function not implemented yet SetTPData(); SetTPData(); SetTPData(); SetTPData(); SetTPData(); SetTPData(); SetTPData(); SetTPData(); } REFIndex=OldREFIndex; //pop di return;}VOID SetTPData(VOID){ return;}VOID SetGroup1_301(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo, PHW_DEVICE_EXTENSION HwDeviceExtension){ USHORT temp1,temp2,tempcl,tempch,tempbl,tempbh,tempal,tempah,tempax,tempbx; USHORT tempcx,OldREFIndex; USHORT Part1Port; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; OldREFIndex=(USHORT)REFIndex; //push di SetCRT2Offset(Part1Port,ROMAddr); SetCRT2FIFO(Part1Port,ROMAddr,ModeNo,HwDeviceExtension); SetCRT2Sync(BaseAddr,ROMAddr,ModeNo); GetCRT1Ptr(ROMAddr); temp1=(VGAHT-1)&0x0FF; //BTVGA2HT 0x08,0x09 SetReg1(Part1Port,0x08,temp1); temp1=(((VGAHT-1)&0xFF00)>>8)<<4; SetRegANDOR(Part1Port,0x09,~0x0F0,temp1); temp1=(VGAHDE+12)&0x0FF; //BTVGA2HDEE 0x0A,0x0C SetReg1(Part1Port,0x0A,temp1); temp1=VGAHDE+12; //bx BTVGA@HRS 0x0B,0x0C temp2=(VGAHT-VGAHDE)>>2; //cx temp1=temp1+temp2; temp2=(temp2<<1)+temp1; tempcl=temp2&0x0FF; if(VBInfo&SetCRT2ToRAMDAC){ tempbl=*((UCHAR *)(ROMAddr+REFIndex+4)); //di+4 tempbh=*((UCHAR *)(ROMAddr+REFIndex+14)); //di+14 temp1=((tempbh>>6)<<8)|tempbl; //temp1->bx temp1=(temp1-1)<<3; tempcl=*((UCHAR *)(ROMAddr+REFIndex+5)); //di+5 tempch=*((UCHAR *)(ROMAddr+REFIndex+15)); //di+15 tempcl=tempcl&0x01F; tempch=(tempch&0x04)<<(6-2); tempcl=((tempcl|tempch)-1)<<3; } SetReg1(Part1Port,0x0B,(USHORT)(temp1&0x0FF)); tempah=(temp1&0xFF00)>>8; tempbh=((((VGAHDE+12)&0xFF00)>>8)<<4)&0x0FF; tempah=tempah|tempbh; SetReg1(Part1Port,0x0C,tempah); SetReg1(Part1Port,0x0D,tempcl); //BTVGA2HRE 0x0D tempcx=(VGAVT-1); tempah=tempcx&0x0FF; SetReg1(Part1Port,0x0E,tempah); //BTVGA2TV 0x0E,0x12 tempbx=VGAVDE-1; tempah=tempbx&0x0FF; SetReg1(Part1Port,0x0F,tempah); //BTVGA2VDEE 0x0F,0x12 tempah=((tempbx&0xFF00)<<3)>>8; tempah=tempah|((tempcx&0xFF00)>>8); SetReg1(Part1Port,0x12,tempah); tempbx=(VGAVT+VGAVDE)>>1; //BTVGA2VRS 0x10,0x11 tempcx=((VGAVT-VGAVDE)>>4)+tempbx+1; //BTVGA2VRE 0x11 if(VBInfo&SetCRT2ToRAMDAC){ tempbx=*((UCHAR *)(ROMAddr+REFIndex+8)); //di+8 temp1=*((UCHAR *)(ROMAddr+REFIndex+7)); //di+7 if(temp1&0x04){ tempbx=tempbx|0x0100; } if(temp1&0x080){ tempbx=tempbx|0x0200; } temp1=*((UCHAR *)(ROMAddr+REFIndex+13)); //di+13 if(temp1&0x08){ tempbx=tempbx|0x0400; } tempcl= *((UCHAR *)(ROMAddr+REFIndex+9)); //di+9 tempcx=(tempcx&0xFF00)|(tempcl&0x00FF); } tempah=tempbx&0x0FF; SetReg1(Part1Port,0x10,tempah); tempbh=(tempbx&0xFF00)>>8; tempah=((tempbh<<4)&0x0FF)|(tempcx&0x0F); SetReg1(Part1Port,0x11,tempah); if(HwDeviceExtension->jChipID == SIS_Glamour) { tempah=0x10; if((LCDResInfo!=Panel1024x768)&&(LCDResInfo==Panel1280x1024)){ tempah=0x20; } }else{ tempah=0x20; } if(VBInfo&SetCRT2ToTV){ tempah=0x08; } SetRegANDOR(Part1Port,0x13,~0x03C,tempah); if(!(VBInfo&SetInSlaveMode)){ REFIndex=OldREFIndex; return; } if(VBInfo&SetCRT2ToTV){ tempax=0xFFFF; }else{ tempax=GetVGAHT2(); } tempcl=0x08; //Reg 0x03 Horozontal Total temp1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag if(!(temp1&Charx8Dot)){ //temp1->St_ModeFlag tempcl=0x09; } if(tempax>=VGAHT){ tempax=VGAHT; } if(temp1&HalfDCLK){ tempax=tempax>>1; } tempax=(tempax/tempcl)-5; tempbl=tempax; tempah=0xFF; //set MAX HT SetReg1(Part1Port,0x03,tempah); tempax=VGAHDE; //0x04 Horizontal Display End if(temp1&HalfDCLK){ tempax=tempax>>1; } tempax=(tempax/tempcl)-1; tempbh=tempax; SetReg1(Part1Port,0x04,tempax); tempah=tempbh; if(VBInfo&SetCRT2ToTV){ tempah=tempah+2; } SetReg1(Part1Port,0x05,tempah); //0x05 Horizontal Display Start SetReg1(Part1Port,0x06,0x03); //0x06 Horizontal Blank end //0x07 horizontal Retrace Start tempcx=(tempbl+tempbh)>>1; tempah=(tempcx&0xFF)+2; if(VBInfo&SetCRT2ToTV){ tempah=tempah-1; if(!(temp1&HalfDCLK)){ if((temp1&Charx8Dot)){ tempah=tempah+4; if(VGAHDE>=800){ tempah=tempah-6; } } } }else{ if(!(temp1&HalfDCLK)){ tempah=tempah-4; if(VGAHDE>=800){ tempah=tempah-7; if(ModeType==ModeEGA){ if(VGAVDE==1024){ tempah=tempah+15; if(LCDResInfo!=Panel1280x1024){ tempah=tempah+7; } } } if(VGAHDE>=1280){ tempah=tempah+28; } } } } SetReg1(Part1Port,0x07,tempah);//0x07 Horizontal Retrace Start SetReg1(Part1Port,0x08,0); //0x08 Horizontal Retrace End SetReg1(Part1Port,0x18,0x03); //0x18 SR08 SetReg1(Part1Port,0x19,0); //0x19 SR0C SetReg1(Part1Port,0x09,0xFF); //0x09 Set Max VT tempcx=0x121; tempcl=0x21; tempch=0x01; tempbx=VGAVDE; //0x0E Virtical Display End if(tempbx==360) tempbx=350; if(tempbx==375) tempbx=350; if(tempbx==405) tempbx=400; tempbx--; tempah=tempbx&0x0FF; SetReg1(Part1Port,0x0E,tempah); SetReg1(Part1Port,0x10,tempah);//0x10 vertical Blank Start tempbh=(tempbx&0xFF00)>>8; if(tempbh&0x01){ tempcl=tempcl|0x0A; } tempah=0;tempal=0x0B; if(temp1&DoubleScanMode){ tempah=tempah|0x080; } if(tempbh&0x02){ tempcl=tempcl|0x040; tempah=tempah|0x020; } SetReg1(Part1Port,0x0B,tempah); if(tempbh&0x04){ tempch=tempch|0x06; } SetReg1(Part1Port,0x11,0); //0x11 Vertival Blank End tempax=VGAVT-tempbx; //0x0C Vertical Retrace Start tempax=tempax>>2; temp2=tempax; //push ax tempax=tempax<<1; tempbx=tempax+tempbx; if((SetFlag&TVSimuMode)&&(VBInfo&SetPALTV)&&(VGAHDE==800)){ tempbx=tempbx+40; } tempah=(tempbx&0x0FF); SetReg1(Part1Port,0x0C,tempah); tempbh=(tempbx&0xFF00)>>8;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?