Eșantionul SpbTestTool are două scopuri. În primul rând, demonstrează cum se deschide un mâner către controlerul SPB, se folosește interfața SPB de la un driver KMDF și se utilizează întreruperi la nivel pasiv GPIO. În al doilea rând, implementează un set de comenzi pentru comunicarea cu un dispozitiv periferic pentru a ajuta la depanare.

github

Acest eșantion este incomplet ca driver și demonstrează doar utilizarea interfeței de solicitare I/O SPB și a întreruperilor GPIO. Nu este destinat utilizării într-un mediu de producție.

Pentru a instala driverul periferic SpbTestTool, urmați acești pași:

Asigurați-vă că driverul construiește fără erori.

Copiați fișierele SYS și INF într-un folder separat.

Rulați Devcon.exe. Puteți găsi acest program în folderul tools \ devcon unde ați instalat WDK. Tastați următoarea comandă în fereastra de comandă:

actualizare devcon.exe SpbTestTool.inf ACPI \

Pentru a lansa aplicația SpbTestTool, urmați acești pași:

Navigați la directorul care conține SpbTestTool.exe.

Tastați următoarea comandă în fereastra de comandă:

În mod implicit, aplicația SpbTestTool folosește driverul eșantion SpbTestTool. Cu toate acestea, în schimb poate fi utilizat un driver de periferic alternativ. Pentru a specifica un driver alternativ, utilizați următorul format pentru linia de comandă:

Un script de intrare poate fi utilizat în locul unui prompt interactiv. Formatul scriptului necesită o comandă pe linie. Pentru a rula scriptul, utilizați următorul format pentru linia de comandă din fereastra de comandă:

Aplicația SpbTestTool se bucură la nesfârșit așteptând una dintre următoarele comenzi. Comenzile sunt traduse în cererea de I/O SPB corespunzătoare fără urmărirea stării în driver. Starea transferului, conținutul bufferului și codurile de eroare sunt returnate după cum este necesar. Tastați ajutor în orice moment pentru a afișa această listă de comenzi. Apăsați Ctrl-C în orice moment pentru a anula comanda curentă și a ieși din aplicație.

Descrierea comenzii
deschis Deschideți mânerul către controlerul SPB.
închide Închideți mânerul controlerului SPB.
Lacăt Blocați autobuzul pentru acces exclusiv.
debloca Deblocați autobuzul.
lockconn Blocați conexiunea partajată pentru acces exclusiv. Această comandă este utilizată pentru a sincroniza transferurile de autobuz de către driverul de eșantion cu accesele în regiunea op prin firmware-ul ACPI.
unlockconn Deblocați conexiunea partajată.
scrie <> Scrieți o matrice de octeți pe dispozitivul periferic. Exemplu:> scrie
citit Citiți de pe dispozitivul periferic. Exemplu:> citiți 5
writeread <> Scrieți atomic o matrice de octeți pe dispozitivul periferic și citiți înapoi. Exemplu:> writeread 5
semnal Informați driverul SpbTestTool că întreruperea a fost gestionată.
Ajutor Afișați lista de comenzi acceptate.
Ctrl-C Apăsați Ctrl-C în orice moment pentru a anula comanda restantă și a ieși din aplicație.

Următoarele sunt funcțiile relevante din driverul periferic SpbTestTool pentru utilizarea interfeței SPB de la un driver KMDF.

Următoarele sunt funcțiile relevante din driverul periferic SpbTestTool pentru gestionarea întreruperilor la nivel pasiv GPIO de la un driver KMDF.

Descrierea funcției
OnPrepareHardware Trece peste resursele de pornire ale șoferului. Dacă „ConnectInterrupt” este setat la 1 în registru, driverul conectează prima resursă de întrerupere găsită și înregistrează o rutină de servicii de întrerupere.
OnInterruptIsr Rutina de servicii de întrerupere, care a fost configurată pentru a rula la nivel pasiv. Acest lucru permite șoferului să recunoască sau să oprească întreruperea utilizând interfața SPB, care nu poate fi apelată la DIRQL. De obicei, un driver va șterge întreruperea hardware și va salva orice informație volatilă în ISR-ul său, iar apoi va pune la coadă un element de lucru pentru a continua procesarea. Driverul eșantionului nostru notifică în schimb aplicația SpbTestTool că a avut loc o întrerupere și îl cheamă pe KeWaitForSingleObject să aștepte până când este întreruptă înainte de a reveni. Un șofer „adevărat” nu ar trebui să se oprească niciodată în ISR astfel.
SpbPeripheralWaitOnInterrupt Apelat pentru a suspenda o cerere WaitOnInterrupt în driver, care va fi finalizată la următoarea întrerupere.
SpbPeripheralInterruptNotify Finalizează o solicitare WaitOnInterrupt remarcabilă pentru a informa aplicația SpbTestTool că a avut loc o întrerupere.
SpbPeripheralSignalInterrupt Notifică rutina serviciului de întrerupere că întreruperea a fost gestionată și ISR ​​ar trebui să revină.

Următoarele fișiere sursă se află în folderul \ SpbTestTool \ sys și sunt utilizate pentru a construi fișierele SpbTestTool.sys și SpbTestTool.inf.

descrierea fisierului
driver.h, driver.cpp Evenimente pe obiectul dispozitivului și citirea, scrierea și IOCTL-urile din aplicația SpbTestTool. Implementează rutina de service a întreruperii șoferului.
intern.h Comune include și tipuri
makefile Redirecționează către fișierul de make real care este partajat de toate componentele WDK.
periferic.h, periferic.cpp Reflectarea IOCTL-urilor SpbTestTool către API-ul SPB, inclusiv deschiderea controlerului prin hub-ul de resurse și utilizarea blocării, deblocării, citirii, scrierii și secvenței.
resursă.rc Fișier descriptor de resurse utilizat pentru versionare
surse Listează fișierele sursă și opțiunile de construire.
surse.dep Definește dependențe de construire.
spbtesttool.asl Exemplu de fișier ASL pentru un nod de dispozitiv periferic. Declară resursele de întrerupere I2C și GPIO. Rețineți că fiecare macrocomandă specifică o cale ACPI pentru a descrie dependențele directe.
spbtesttool.h IOCTL-uri private SpbTestTool pentru utilizare între aplicație și driverul periferic și numele căilor driverului.
spbtesttool.inx Descrie instalarea driverului. Procesul de construire îl transformă într-un INF.
urmă.h Configurează urmărirea WPP.

Următoarele fișiere sursă se află în folderul \ SpbTestTool \ exe și sunt utilizate pentru a construi fișierul SpbTestTool.exe.

descrierea fisierului
command.h, command.cpp Clase care reprezintă fiecare dintre comenzile SpbTestTool. Pentru lista de comenzi, consultați Executarea comenzilor.
intern.h Definiții comune includ și funcții
main.cpp Punctul de intrare al aplicației, analiza de intrare și bucla principală de execuție. De asemenea, conține firul de notificare de întrerupere.
makefile Redirecționează către fișierul de make real care este partajat de toate componentele WDK.
surse Listează fișierele sursă și opțiunile de construire.
util.cpp Funcții de ajutor