Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

PCI Buss absuchen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 06.09.2008, 21:47    Titel: PCI Buss absuchen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 06.09.2008, 22:01    Titel: Antworten mit Zitat

Hi Volta,

ich habe das Programm ausprobiert und bekomme als Administrator unter W2k SP4 nur die folgende Fehlermeldung:
Zitat:
Error: WinIo nicht initialisiert!

Das ZIP-Archiv wurde komplett in ein Verzeichnis extrahiert. Auch das Selbst-Neucompilieren hat nicht geholfen.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 07.09.2008, 13:12    Titel: Antworten mit Zitat

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. lächeln
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 07.09.2008, 19:03    Titel: Antworten mit Zitat

Unter AMD64 läufts ebenfalls nicht zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Georgp24



Anmeldungsdatum: 30.06.2006
Beiträge: 81
Wohnort: Ahlen

BeitragVerfasst am: 21.09.2008, 21:15    Titel: Antworten mit Zitat

Hi Volta,

hat es mit TVicPort.dll geklappt und kannst Du ein Beispiel dazu posten?

Gruß

Georg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 22.09.2008, 13:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.09.2008, 14:41    Titel: Antworten mit Zitat

Läuft selbstverständlich nicht unter AMD64, da der beigelegte virtuelle Gerätetreiber (.vxd) nur für x86 kompiliert wurde.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 22.09.2008, 15:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.09.2008, 16:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Georgp24



Anmeldungsdatum: 30.06.2006
Beiträge: 81
Wohnort: Ahlen

BeitragVerfasst am: 22.09.2008, 18:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.09.2008, 18:31    Titel: Antworten mit Zitat

Hier gehts gerade aber um x86_x64... zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.09.2008, 18:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Georgp24



Anmeldungsdatum: 30.06.2006
Beiträge: 81
Wohnort: Ahlen

BeitragVerfasst am: 22.09.2008, 19:23    Titel: Antworten mit Zitat

Ich finde die DLL's die Volta hier vorgestellt hat sehr interessant und bin schon zufrieden, wenn sie unter 32 bit laufen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 24.09.2008, 14:16    Titel: Antworten mit Zitat

28398 hat Folgendes geschrieben:
Unter AMD64 läufts ebenfalls nicht
du meintest damit Vista 64Bit missbilligen
TVicPort läuft natürlich nicht unter x64, kann man schon am Erstellungsdatum der DLL sehen. durchgeknallt
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz