2012-12-03 8 views
5

Pracuję z kartą PCIe, która wymaga 256-bajtowego rozmiaru bloku danych TLP. Mam procesor obsługujący to (Core i7-3930K) i płytę główną Intel, DX79SR, która nie oferuje ustawienia rozmiaru ładunku TLP w BIOS-ie. Domyślnie jest to maksymalny ładunek TLP o długości 128 bajtów i muszę go zmienić na 256 bajtów, bez systemu BIOS. Znalazłem oprogramowanie PCIUtils, które wyświetla tę wartość w systemie Windows, ale jest uniwersalnym przenośnym oprogramowaniem i jest zbyt skomplikowane, aby znaleźć to, czego potrzebuję.Łatwy dostęp do rejestrów WE/WY procesora Intel w systemie Windows

Dokumenty Intela describe what values Muszę ustawić w rejestrach WE/WY procesora i jest another document mówiąc, że lokalizacje We/Wy są C8Fh i CFCh.

To jest, gdzie utknąłem, nie wiem od czego zacząć, jeśli chcę ustawić te rejestry. Jestem doświadczonym programistą Windows S/W, ale nigdy nie zajmowałem się sterownikami. Mam kod źródłowy dla sterowników tej płyty PCIe, którą mogę zmodyfikować, zbudować i uruchomić, ale nie mam pojęcia, jak zapisać dane do rejestrów I/O procesora Intel. Zauważyłem, że funkcje _outp() nie działają jednak w trybie użytkownika.

Proszę wskazać gdzie zacząć, albo z pliku wykonywalnego (łatwiejszy) lub sterownika. Myślę, że wszystko, czego potrzebuję, to odczytywać/zapisywać z portów I/O C8Fh i CFCh, jeśli się nie mylę. Teraz jest 32-bitowy Windows XP, Win7 x64 będzie później, Visual Studio 2010 C++ lub WDK.

Odpowiedz

2

Zasadniczo należy użyć instrukcji asm out lub in x86. Chodzi o to, że w trybie chronionym te dwie instrukcje są zablokowane, więc nie można ich używać w trybie użytkownika.

Najlepszym miejscem na rozpoczęcie jest zakup WDK (zestaw sterowników dla systemu Windows) i zapoznanie się z ich przykładami (wystarczy do tego sterownik oprogramowania). Jeśli sterownik dla karty PCI jest sterownikiem trybu jądra, możesz dodać połączenia w funkcji DriverEntry i z tym skończyć.

Jeśli to nie jest opcja, musisz zbudować sterownik trybu jądra oprogramowania - here to prosty przykładowy kod z instrukcją jak go zbudować i zainstalować. Rzeczywisty kod powinien być trywialny, ponieważ chcesz wykonywać tylko niektóre instrukcje w trybie jądra.

+0

Dzięki. Mam WDK i mogę skompilować sterownik tej płyty, która następnie działa. Z pewnością widzę wpis kierowcy, ale nie mogę stwierdzić, czy sterownik działa w trybie jądra lub trybie użytkownika. Jestem nieznajoma kierowców. Mówisz więc, że w głównej funkcji sterownika, która jest wywoływana podczas ładowania sterownika, mogę spróbować _inp(), ustawić moje bity, a następnie _outp (0xC8F. Mydata), gdzie 0xC8F jest lokalizacją z dokumentu Intela, prawda? – user1871691

+0

@ user1871691 Całkiem tak. Jeśli twój kod ma metodę 'DriverEntry' używa on KMDF, metoda ta jest inaczej nazywana dla sterowników trybu użytkownika afaik (nigdy ich nie używasz). Powinny być całkiem proste, aby zaktualizować kod. – Voo

+0

Wielkie dzięki. To się udało. Umieściłem 4 takie linie w DriverEntry: _outpd (0xCF8, 0x80000098); Jedyną sztuczką było to, że musiałem ustawić rejestry dla dwóch urządzeń. Mój slot PCIe ma adres Bus: 0 Device: 1 Function: 0, ale musiałem również ustawić rozmiar TLP dla Bus: 0 Device: 0 Function: 0 (niektóre ogólne urządzenie, tak sądzę) – user1871691

Powiązane problemy