Code: Alles auswählen
;- Super-I/O-Chip ermitteln, 32-Bit-Windows
;- "Helle" Klaus Helbing, 22.08.2009, PB 4.40B2(x86)
Adr.w
Z.b
AU$ = "Asus "
FT$ = "FinTek "
IT$ = "ITE "
NS$ = "National Semiconductor "
SM$ = "SMSC "
VT$ = "VIA "
WB$ = "Winbond "
IO$ = "Der Chip konnte nicht identifiziert werden !"
XIncludeFile "giveio.pbi" ;enthält auch giveio.sys als Data, gibt´s hier: http://www.mdcc-fun.de/k.helbing/giveio/giveio.zip
;------------------ Programm-Anfang Portzugriff
;Messages = 1 ;für Fehlersuche oder reine Neugier, gilt für giveio.pbi
RegTest() ;ob giveio in Registry vorhanden
If hReg
Abfrage = MessageRequester("Abfrage", "Soll giveio installiert werden ?", #PB_MessageRequester_YesNo)
If Abfrage = #PB_MessageRequester_Yes
DienstInst() ;war noch nicht installiert
Else
End
EndIf
EndIf
hMgr = OpenSCManager_(#Null, #Null, #GENERIC_READ) ;Handle für Zugriff auf den Dienst-Manager
DienstStatus() ;bei Programmstart überprüfen
If SS\dwCurrentState <> 4 ;4=schon gestartet
DienstStart() ;noch nicht gestartet, also jetzt starten
EndIf
OpenDevice() ;jetzt sind Port-Zugriffe möglich
;------------------------------------------------------------------------------
For Adr = $2E To $4E Step $20
;Test, ob FinTek, VIA oder Winbond
OutB(Adr, $87) ;Einschalten des Extended Function Mode für FinTek, VIA und Winbond
OutB(Adr, $87) ;muss 2x aufgerufen werden!
OutB(Adr, $20) ;Configurations-Register $20 auslesen
InB(Adr + 1)
CR20 = WertB & $FF
If CR20 <> 0 And CR20 <> $FF
Select CR20
Case $02
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $06
IO$ = FT$ + "F81218D"
Case $08
IO$ = FT$ + "F81216D"
EndSelect
Case $03
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $41
IO$ = FT$ + "F71806FG/F71872FG"
EndSelect
Case $04
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $06
IO$ = FT$ + "F71805F/FG"
EndSelect
Case $05
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $07
IO$ = FT$ + "F71858DG"
Case $41
IO$ = FT$ + "F71882FG/F71883FG"
Case $81
IO$ = AU$ + "F8000" ;soll Asus sein!
EndSelect
Case $06
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $01
IO$ = FT$ + "F71862FG"
EndSelect
Case $3C
IO$ = VT$ + "VT1211"
Case $3E
IO$ = VT$ + "VT1212 in 100 pin TQFP package"
Case $3F
IO$ = VT$ + "VT1212 in 48 pin LQFP package"
Case $52
IO$ = WB$ + "W83627HF/F/HG/G"
Case $60
IO$ = WB$ + "W83697HF/F/HG"
Case $61
IO$ = WB$ + "W83L517D"
Case $68
IO$ = WB$ + "W83697SF/UF/UG"
Case $70
IO$ = WB$ + "W83637HF/HG"
Case $82
IO$ = WB$ + "W83627THF/THG"
Case $85
IO$ = WB$ + "W83687THF"
Case $87
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $08
IO$ = IT$ + "IT8708F" ;soll ITE sein!
EndSelect
Case $88
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $C0
Select CR21
Case $40
IO$ = WB$ + "W83627EHF/EF/EHG/EG"
EndSelect
Case $A0
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $F0
Select CR21
Case $20
IO$ = WB$ + "W83627DHG" : Res = 3 ;Res für VCORE, für 8mV z.B ist Res=3 (2^3=8)
EndSelect
EndSelect
EndIf ;Ende FinTek, VIA oder Winbond
;--------------------------------------------------------------------------------------
;Test, ob ITE
OutB(Adr, $87) ;Einschalten des Extended Function Mode für ITE
OutB(Adr, $01)
OutB(Adr, $55)
OutB(Adr, $55 + Z) ;für $2E=$55, für $4E=$AA
OutB(Adr, $20) ;Configurations-Register $20 auslesen
InB(Adr + 1)
CR20 = WertB & $FF
If CR20 <> 0 And CR20 <> $FF
Select CR20
Case $87
OutB(Adr, $21) ;Configurations-Register $21 auslesen
InB(Adr + 1)
CR21 = WertB & $FF
Select CR21
Case $02
IO$ = IT$ + "IT8702F"
Case $05
IO$ = IT$ + "IT8705F"
Case $12
IO$ = IT$ + "IT8712F"
Case $16
IO$ = IT$ + "IT8716F"
Case $18
IO$ = IT$ + "IT8718F"
Case $20
IO$ = IT$ + "IT8720"
Case $26
IO$ = IT$ + "IT8726F"
EndSelect
EndSelect
EndIf ;Ende ITE
;--------------------------------------------------------------------------------------
;Test, ob SMSC
OutB(Adr, $55) ;Einschalten des Extended Function Mode für SMSC
OutB(Adr, $20) ;Configurations-Register $20 auslesen
InB(Adr + 1)
CR20 = WertB & $FF
If CR20 <> 0 And CR20 <> $FF
Select CR20
Case $0E
IO$ = SM$ + "LPC47N252"
Case $14
IO$ = SM$ + "LPC47M172"
Case $40
IO$ = SM$ + "FDC37C672"
Case $42
IO$ = SM$ + "FDC37M707"
Case $44
IO$ = SM$ + "FDC37B78x"
Case $4C
IO$ = SM$ + "FDC37B72x"
Case $4D
IO$ = SM$ + "FDC37M81x"
Case $51
IO$ = SM$ + "LPC47B27x"
Case $52
IO$ = SM$ + "LPC47B37x"
Case $54
IO$ = SM$ + "LPC47U33x"
Case $56
IO$ = SM$ + "LPC47B34x"
Case $57
IO$ = SM$ + "LPC47S42x"
Case $59
IO$ = SM$ + "LPC47M10x/112/13x"
Case $5D
IO$ = SM$ + "LPC47B357/M967"
Case $5F
IO$ = SM$ + "LPC47M14x"
Case $60
IO$ = SM$ + "LPC47M15x/192/997"
Case $62
IO$ = SM$ + "LPC47S45x"
Case $67
IO$ = SM$ + "EMC2700LPC"
Case $6B
IO$ = SM$ + "LPC47M292"
Case $6D
IO$ = SM$ + "LPC47B367-NC"
Case $6F
IO$ = SM$ + "LPC47B397-NC"
Case $74
IO$ = SM$ + "LPC47M182"
Case $76
IO$ = SM$ + "LPC47M584-NC"
Case $77, $78
IO$ = SM$ + "DME1737"
Case $79
IO$ = SM$ + "SCH5504-NS"
Case $7C
IO$ = SM$ + "SCH3112"
Case $7D
IO$ = SM$ + "SCH3114"
Case $7F
IO$ = SM$ + "SCH3116"
Case $81
IO$ = SM$ + "SCH5307-NS"
Case $83
IO$ = SM$ + "SCH5514D-NS"
Case $85, $8C
IO$ = SM$ + "SCH5317"
Case $86
IO$ = SM$ + "SCH5127"
Case $89
IO$ = SM$ + "SCH5027D-NW"
Case $90
IO$ = SM$ + "SCH4307"
EndSelect
EndIf
;SMSC benutzt auch das Configurations-Register $0D !
OutB(Adr, $0D) ;Configurations-Register $0D auslesen
InB(Adr + 1)
CR20 = WertB & $FF
If CR20 <> 0 And CR20 <> $FF
Select CR20
Case $03
IO$ = SM$ + "FDC37C669"
Case $28
IO$ = SM$ + "FDC37N769"
Case $5A
IO$ = SM$ + "LPC47N227"
Case $65
IO$ = SM$ + "FDC37C665"
Case $66
IO$ = SM$ + "FDC37C666"
EndSelect
EndIf ;Ende SMSC
;--------------------------------------------------------------------------------------
;Test, ob National Semiconductor
OutB(Adr, $20) ;Configurations-Register $20 auslesen
InB(Adr + 1)
CR20 = WertB & $FF
If CR20 <> 0 And CR20 <> $FF
Select CR20
Case $D0
IO$ = NS$ + "PC87317"
Case $DF
IO$ = NS$ + "PC97317"
Case $E1
IO$ = NS$ + "PC87360"
Case $E2
IO$ = NS$ + "PC87351"
Case $E4
IO$ = NS$ + "PC87364"
Case $E5
IO$ = NS$ + "PC87365"
Case $E8
IO$ = NS$ + "PC87363"
Case $E9
IO$ = NS$ + "PC87366"
Case $EA
IO$ = NS$ + "PC8739x"
Case $EC
IO$ = NS$ + "PC87591"
Case $EE
IO$ = NS$ + "PC8741x"
Case $F0
IO$ = NS$ + "PC87372"
Case $F1
IO$ = NS$ + "PC8374L"
Case $F2
IO$ = NS$ + "PC87427"
Case $F3
IO$ = NS$ + "PC87373"
EndSelect
EndIf ;Ende National Semiconductor
;--------------------------------------------------------------------------------------
Z + $55 ;für Adresse ITE
Next
If Mid(IO$, 1, 1) = "W" Or Mid(IO$, 1, 1) = "S" ;für Winbond und SMSC
OutB(Adr, $AA) ;Beenden des Extended Function Mode für Winbond und SMSC
Else
OutB(Adr, $02) ;Beenden des Extended Function Mode für die anderen Chips
OutB(Adr + 1, $02)
EndIf
MessageRequester("Super - I/O - Chip - Detection", IO$)
;------------------------------------------------------------------------------
;- Ende
If SS\dwCurrentState <> 4
DienstEnd() ;war vorher nicht gestartet, also jetzt wieder beenden
EndIf
;DienstRemove() ;bei Bedarf, evtl. Rechner-Neustart
CloseServiceHandle_(hMgr) ;hier erst beenden
End
Code: Alles auswählen
XIncludeFile "giveio.pbi" ;enthält auch giveio.sys als Data, gibt´s hier: http://www.mdcc-fun.de/k.helbing/giveio/giveio.zip
;------------------ Programm-Anfang Portzugriff
RegTest() ;ob giveio in Registry vorhanden
If hReg
Abfrage = MessageRequester("Abfrage", "Soll giveio installiert werden ?", #PB_MessageRequester_YesNo)
If Abfrage = #PB_MessageRequester_Yes
DienstInst() ;war noch nicht installiert
Else
End
EndIf
EndIf
hMgr = OpenSCManager_(#Null, #Null, #GENERIC_READ) ;Handle für Zugriff auf den Dienst-Manager
DienstStatus() ;bei Programmstart überprüfen
If SS\dwCurrentState <> 4 ;4=schon gestartet
DienstStart() ;noch nicht gestartet, also jetzt starten
EndIf
OpenDevice()
;jetzt sind Port-Zugriffe möglich
;hier kennen wir also schon den Chip-Typ mit der (VCORE-)Auflösung von 8mV/Bit
;- CPU-Core-Spannung für Winbond (W83627DHG)
Res = 3 ;=8mV (2^3) aus Datenblatt bzw. IO-Chip-Detection
OutB($2E, $87) ;Einschalten des Extended Function Mode für Winbond
OutB($2E, $87) ;muss 2x aufgerufen werden!
OutB($2E, $7) ;Logical Device auswählen
OutB($2F, $B) ;$B=Hardware-Monitor
OutB($2E, $60) ;High-Byte Register Address Base
InB($2F)
Adr = WertB & $FF
Adr << 8 ;nach Word-High schieben
OutB($2E, $61) ;Low-Byte Register Address Base
InB($2F)
Adr + (WertB & $FF) ;+5=Address Port, +6=Data Port
;Index $4E, Bits 0-2=Bank setzen, %000=Bank 0 usw.
OutB(Adr + 5, $4E)
InB(Adr + 6)
WertB & %11111000 ;Bank 0 setzen
OutB(Adr + 5, $4E)
OutB(Adr + 6, WertB)
OutB(Adr + 5, $20) ;$20=CPUVCORE
InB(Adr + 6)
OutB($2E, $AA) ;Beenden des Extended Function Mode für Winbond
VC = (WertB & $FF) << Res ;Res=Auflösung, für 8mV z.B ist Res=3, 2^3=8
MessageRequester("Momentane CPU - Core - Spannung", StrF(VC / 1000, 3) + "V")
Gruß
Helle