2012-12-03 7 views
5

Ich arbeite mit einer PCIe-Karte, die 256 Byte TLP-Nutzlastgröße erfordert. Ich habe eine CPU, die das unterstützt (Core i7-3930K) und Intel-Motherboard, DX79SR, die TLP-Payload-Größeneinstellung im BIOS nicht bietet. Standardmäßig gibt es maximal 128 Byte TLP-Payload und ich muss es auf 256 Byte ändern, ohne BIOS. Ich fand PCIUtils Software, die diesen Wert in Windows anzeigt, aber es ist eine vielseitige tragbare Software und es ist zu kompliziert, um zu finden, was ich brauche.Einfacher Zugriff auf Intel-CPU-E/A-Register in Windows

Intel-Dokumente describe what values Ich muss in CPU-E/A-Register setzen und es gibt another document sagen, dass E/A-Speicherorte C8Fh und CFCh sind.

Hier stecke ich fest, ich weiß nicht, wo ich anfangen soll, wenn ich diese Register setzen möchte. Ich bin ein erfahrener Windows S/W Entwickler, aber ich habe noch nie mit Treibern zu tun gehabt. Ich habe Quellcode für die Treiber dieser PCIe-Platine, die ich ändern, bauen und ausführen kann, aber ich habe keine Ahnung, wie man Daten in I/O-Register von Intel-CPU schreibt. Ich habe festgestellt, dass _outp() Funktionen nicht im Benutzermodus funktionieren.

Bitte zeigen Sie mir, wo ich anfangen soll, entweder von ausführbaren (einfacher) oder Treiber. Ich denke, alles, was ich brauche, ist, von den I/O-Ports C8Fh und CFCh zu lesen/schreiben, wenn ich mich nicht irre. Es ist Windows XP 32 Bit jetzt, Win7 X 64 wird später, Visual Studio 2010 C++ oder WDK.

Antwort

2

Grundsätzlich müssen Sie die out bzw. in x86 asm Anweisungen verwenden. Die Sache ist, dass im geschützten Modus diese beiden Anweisungen gesperrt sind, so dass Sie sie nicht im Userland-Modus verwenden können.

Der beste Startpunkt ist, das WDK (Windows-Treiber-Kit) zu bekommen und ihre Beispiele zu sehen (Sie brauchen nur einen Softwaretreiber dafür). Wenn der Treiber für die PCI-Karte ein Kernel-Modus-Treiber ist, könnten Sie einfach die Aufrufe in der DriverEntry-Funktion hinzufügen und damit fertig sein.

Wenn das nicht eine Option, müssen Sie Ihre eigenen Software-Kernel-Mode-Treiber bauen - here ist einiger einfaches Beispiel-Code mit Anweisungen, wie man erstellen und bereitzustellen. Der eigentliche Code sollte trivial sein, da Sie nur einige Anweisungen im Kernel-Modus ausführen wollen.

+0

Danke. Ich habe WDK und ich kann den Treiber für diese Platine kompilieren, die dann funktioniert. Ich kann sicherlich Treibereingabe sehen, aber ich kann nicht sagen, ob der Treiber im Kernel-Modus oder Benutzermodus arbeitet. Ich bin mit Fahrern nicht so vertraut. Also, Sie sagen, dass in der Hauptfunktion des Treibers, lädt Treiber aufgerufen wird, kann ich _inp() versuchen, setzen Sie meine Bits und dann nur _outp (0xC8F. Mydata) wo 0xC8F ist die Position von Intels Dokument, richtig? – user1871691

+0

@ user1871691 Ziemlich viel ja. Wenn Ihr Code eine "DriverEntry" -Methode hat, die KMDF verwendet, wird die Methode für die Benutzermodus-Treiber afaik anders genannt (diese wurden jedoch nie verwendet). Sollte ziemlich einfach sein, um den Code zu aktualisieren. – Voo

+0

Vielen Dank. Das hat funktioniert. Ich habe 4 Zeilen wie folgt in DriverEntry: _outpd (0xCF8, 0x80000098); Der einzige Trick war, dass ich Register für zwei Geräte einrichten musste. Mein PCIe-Steckplatz hat Adresse Bus: 0 Gerät: 1 Funktion: 0, aber ich musste auch TLP-Größe für Bus: 0 Gerät: 0 Funktion: 0 (einige generische Gerät, denke ich) – user1871691

Verwandte Themen