 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 06.09.2008, 21:47 Titel: PCI Buss absuchen |
|
|
Hi,
ich bekam vor einiger Zeit eine PCI-Karte in die Finger die 8 Input und 8 Output Optokoppler hatte und (natürlich) nur über einen firmenspezifischen Systemtreiber anzusteuern war.
Um selbst mal an die PCI-Geräte zu gelangen waren diese Seiten sehr hilfreich
http://www.waste.org/~winkles/hardware/pci.htm
http://www.stcarchiv.de/stc1998/05_pci2.php
Damit gelang es mir erstmal unter ME den PCI-Buss nach Geräten, Hersteller und Adressen zu scanen.
Unter XP war das nicht möglich, da ja I/O-Ports nicht anzusprechen sind. Der 'eingebaute' Treiber unter FB kann leider keine Ports mit 32Bit schreiben oder lesen. Erst bei WinIo wurde ich fündig. Leider mit dem Nachteil, dass man wieder einige Dateien dazu legen muss.
Hier mal das Programm zum ausprobieren: Download mit allen Dateien
Für DOS (sollte funktionieren), 9x und ME braucht man winio nicht, also auskommentieren.
Unter (Win2000??) XP, Vista(nur 32Bit?) bachten:
Winio lässt sich nur unter Admin-Rechten starten!!
Im gleichen Verzeichnis müssen noch WinIo.dll, WinIo.sys bzw. WINIO.VXD sowie die Datei PCIreport.txt sein.
Code: | 'Scanen des PCI-Buss 0 - 7 auswerten von
'Gerät, Hersteller, IRQ, Portadresse und benutzten Speicher
'Auf ME, XP(SP3) und Vista Home mit FB0.20.0b getestet - Volta 06.09.2008
'Winio lässt sich nur unter Admin-Rechten starten!!
'Im gleichen Verzeichnis müssen noch WinIo.dll, WinIo.sys bzw. WINIO.VXD
'sowie die Datei PCIreport.txt sein,
'Zum compilieren muss noch winio.bi und libwinio.dll.a vorhanden sein.
'Sehr hilfreich waren die folgenden Seiten:
'http://www.waste.org/~winkles/hardware/pci.htm
'http://www.stcarchiv.de/stc1998/05_pci2.php
'Aufbau Bus Configuration Address Register &H0CF8:
'bit 31 =1 (bit is always set for a PCI access)
'bits30:24 =0 (reserved)
'bit 23:16 =bus number (0-255) (#0)
'bits15:11 =device # (0-31)
'bits10: 8 =function # (0-7)
'bits 7: 0 =register number (0-255)
#Include "winio.bi" 'REM for DOS, Win9x and ME
Declare Function PCI_Bus (adr As UInteger) As UInteger
Declare Sub PCI_vendor (v As UInteger)
Declare Sub PCI_Adresse (v As UInteger)
Dim As Integer FN, DEV, bus
Dim As UInteger x, y
Width 100,56
Color ,1
Cls
Color 14,4
#Ifdef _winio_
If InitializeWinIo <> 1 Then
Print "Error: WinIo nicht initialisiert!"
Sleep
End
Else
Print "WinIo initialisiert!"
EndIf
#EndIf
Print "Geraete und ihre Funktionen am PCI-Bus"
Color 15,1
Print "Bus-Nr.","Device-Nr."," Funkt.-Nr.","Vendor","Device"
For bus = 0 To 7
y = &H80000000 + (bus Shl 16) 'Bit 31 setzen + Bus-Nr.
For DEV = 0 To 31 'Device-Nr.
y =(y And &H80070000) + (DEV Shl 11)
For FN = 0 To 7 'Funktions-Nr.
y = (y And &H8007F800) + (FN Shl 8)
x = Pci_Bus(y)
If x <> -1 Then
Color 15,1
Print bus,DEV, FN, Hex(LoWord(x),4), Hex(HiWord(x),4)
PCI_vendor(x)
PCI_Adresse(y)
End If
Next
Next
Next
#Ifdef _winio_
ShutdownWinIo
#EndIf
Sleep
Function PCI_Bus (v As UInteger) As UInteger
#Ifndef _winio_
Asm
mov dx, &H0CF8
mov eax, [v]
Out dx, eax
mov dx, &H0CFC
in eax,dx
mov [Function], eax
End Asm
#Else
Dim As UInteger x
SetPortVal(&H0CF8, v, 4)
GetPortVal(&H0CFC, @x, 4)
Function=x
#EndIf
End Function
Sub PCI_vendor (v As UInteger)
Dim As Integer ff=FreeFile
Dim s As String
Dim vendor As String = LCase(Hex(LoWord(v),4))
Dim device As String = LCase(Hex(HiWord(v),4))
Color 14,4
Open "PCIreport.txt" For Input As #ff
While EOF(ff) = 0
Line Input #ff,s
If s[0]<>32 Then
If Left(s,4) = vendor Then
Print Mid(s,5);
While EOF(ff) = 0
Line Input #ff,s
If s[0]<>32 Then
Print
Exit While
EndIf
If Mid(s,2,4) = device Then
Print Mid(s,7)
Exit While
EndIf
Wend
Exit While
EndIf
EndIf
Wend
Close #ff
End Sub
Sub PCI_Adresse (v As UInteger)
Dim As UInteger x, tmp= v+ &H3C 'Register-Nr. &H3C
x = Pci_Bus(tmp)
If LoWord(x) Then Print " IRQ: ";LoByte(x)
tmp = v + &H10 'Register-Nr. &H10
Do
x = Pci_Bus(tmp)
If x<>0 Then
If HiWord(x)=0 Then
Print " E/A Bereich: ";Hex(LoWord(x-1),4)
Else
Print " Speicherbereich: ";Hex(x,8)
EndIf
EndIf
tmp += 4'next Register
Loop Until x=0
End Sub |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 07.09.2008, 13:12 Titel: |
|
|
Hi Sebastian,
auf win2000 konnte ich es nicht testen, ich kann auch nicht sagen warum es dort nicht installiert wird.
Laut Beschreibung der WinIo sollte es gehen auch hier
( http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/komponenten/komponente0048.shtml ) wird dies ausgesagt.
Gerade habe ich mir die TVicPort.dll ( http://www.entechtaiwan.com/dev/port/index.shtm ) geladen, die kann unter XP & Co noch weitere Hardwarezugriffe. Sollte es laufen, schreib ich dich mal zum testen auf W2k an.  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 07.09.2008, 19:03 Titel: |
|
|
Unter AMD64 läufts ebenfalls nicht  |
|
Nach oben |
|
 |
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 21.09.2008, 21:15 Titel: |
|
|
Hi Volta,
hat es mit TVicPort.dll geklappt und kannst Du ein Beispiel dazu posten?
Gruß
Georg |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 22.09.2008, 13:31 Titel: |
|
|
Mit Einschränkungen, ja.
Bisher habe ich nur "WritePortL" + "ReadPortL" aus der DLL benutzt.
Unter ME, XP SP3 und Vista Home (32bit) lief es.
Der Quelltext oben wurde nur ein wenig auf die TVicPort-Routinen angepasst.
Download Tvic_PCI.zip mit allen Dateien. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.09.2008, 14:41 Titel: |
|
|
Läuft selbstverständlich nicht unter AMD64, da der beigelegte virtuelle Gerätetreiber (.vxd) nur für x86 kompiliert wurde. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 22.09.2008, 15:57 Titel: |
|
|
Hmm..
TVicPort Overview hat Folgendes geschrieben: | TVicPort is a toolkit for direct port I/O from Win32 applications. TVicPort includes transparent support for Windows 95/98/Me and Windows NT/2000/XP/XP 64-bit, providing programmers with standard methods for real-time direct access to port and memory mapped I/O - without requiring you to write a custom virtual device driver for Windows 9x/Me or a kernel-mode driver for NT/2000/XP/XP 64-bit. Brand new 64-bit offers intelligent support for 64-bit solutions. |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.09.2008, 16:34 Titel: |
|
|
Es läuft aber nicht!
Denn dafür musst du die x64 Version der Lib verwenden die auch den x64 Treiber lädt!! |
|
Nach oben |
|
 |
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 22.09.2008, 18:17 Titel: |
|
|
Also bei mir läuft SCAN_PCI mit WinIO und TVicPort unter Win2000. Allerdings funktioniert nach WinIO das Keyboard nicht mehr richtig - z.B. statt Page-down wird im DOS-Fenster eine 3 erzeugt. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.09.2008, 18:31 Titel: |
|
|
Hier gehts gerade aber um x86_x64...  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.09.2008, 18:33 Titel: |
|
|
wenn's nach dir ginge vielleicht. für alle anderen user geht's hier um ein programm / problem, das volta und georg gerade diskutieren... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 22.09.2008, 19:23 Titel: |
|
|
Ich finde die DLL's die Volta hier vorgestellt hat sehr interessant und bin schon zufrieden, wenn sie unter 32 bit laufen. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 24.09.2008, 14:16 Titel: |
|
|
28398 hat Folgendes geschrieben: | Unter AMD64 läufts ebenfalls nicht | du meintest damit Vista 64Bit
TVicPort läuft natürlich nicht unter x64, kann man schon am Erstellungsdatum der DLL sehen.
Treiber die hardwarenah unter Vista64 arbeiten sollen müssen eine von Winzigweich lizensierte Signatur haben, kein billiges Vergnügen!!!
Ich habe mal weitere Funktionen von TVicPort getestet: Code: | #Include "TVicPort.bi"
If OpenTVicPort <> 1 Then
Print "Error: TVicPort nicht initialisiert!"
Sleep
End
Else
Print "TVicPort initialisiert!"
EndIf
Dim linAdr As UInteger
linAdr=MapPhysToLinear(&h400, 256)
Print "Portadressen:"
Print Hex(GetMemW( linAdr,0))
Print Hex(GetMemW( linAdr,2))
Print Hex(GetMemW( linAdr,4))
Print Hex(GetMemW( linAdr,6))
Print Hex(GetMemW( linAdr,8))
Print Hex(GetMemW( linAdr,10))
Print Hex(GetMemW( linAdr,12))
UnmapMemory(&h400, 256)
Print "Anzahl LPTPorts:";GetLPTNumPorts
Print "LPTPort Nr: ";GetLPTNumber
Print "Basisadresse: ";Hex(GetLPTBasePort)
Print "Acknowl. ";GetLPTAckwl
Print "Busy ";GetLPTBusy
Print "PaperEnd ";GetLPTPaperEnd
Print "Select ";GetLPTSlct
Print "Error ";GetLPTError
'führt teilweise zum Absturz!!!
'Dim info As TypeHddInfo
'GetHDDInfo(1, 1, @info)
'With info
' ? .BufferSize
' ? .DoubleTransfer
' ? .ControllerType
' ? .ECCMode
' ? .SectorsPerInterrupt
' ? .Cylinders
' ? .Heads
' ? .SectorsPerTrack
' ? .Model
' ? .SerialNumber
' ? .Revision
'End With
CloseTVicPort
Sleep | Bis auf GetHDDInfo scheint alles zu funktionieren. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|