“Java” -ul driverelor de dispozitive (partea a II-a)

by donpedro

Tipic, o aplicaţie cu acces la dispozitivul hardware bazată pe WinDriver are următoarea arhitectură:

Cum funcţionează WinDriver-ul?
• WinDriver asigură API-ul WinDriver, prin care dispozitivul hardware poate fi accesat direct din cadrul aplicaţiilor, fără a mai fi nevoie să se scrie un driver de dispozitiv în kernel;
• Wizard-ul pentru WinDriver asigură un al doilea nivel, care este un API specific pentru echipamentul concret căruia îi scrieţi un driver;
• Componenta WinDriver Kernel PlugIn vă permite să rulaţi codul de User Mode în modul de lucru Kernel, atingând astfel performanţele optime.

API-ul “Hardware Specific”
Stratul API care este specific unui anumit echipament foloseşte API-ul generic WinDriver pentru a implementa un API care să fie specific pentru hardware-ul dvs. De exemplu, dacă echipamentul sau dispozitivul dvs. are un registru de stare denumit “StatusRegister” care este amplasat în domeniul de adrese Bar0 al cartelei respective, atunci nivelul “Hardware Specific” ar putea să implementeze următoarea funcţie:

DWORD YourHardware_ReadStatusRegister(…)
{

return WD_Transfer(…, Bar0, Offset0, READ, …);

}

Pentru exemplificare, să urmărim crearea unui driver de imprimantă. Prezentăm în continuare o mostră de cod ce foloseşte un API generat de către Wizard-ul WinDriver, pentru a trimite un şir de caractere către o gamă de adrese de I/O (primul port paralel – LPT1). API-ul “LPT” a fost generat de către Wizard-ul WinDriver pentru echipamentul LPT (vezi figura de mai jos).

API-ul WinDriver
Wizard-ul pentru driver
Se recomandă să folosiţi Wizard-ul de driver (inclus în pachetul soft WinDriver) pentru a crea în mod automat API-ul specific echipamentului pentru care lucraţi. Wizard-ul va detecta automat toate resursele plug and play ale plăcii dvs. Dacă placa în cauză nu este plug-and-play, trebuie să-i definiţi Wizard-ului resursele plăcii (întreruperile, gama de adrese de I/O, DMA-urile, adresele de memorie). După acest stadiu, Wizard vă va permite să citiţi şi să scrieţi date de la / către placă, şi să vedeţi întreruperile generate de respectivul echipament. Aceasta este o etapă importantă, ce garantează că echipamentul funcţionează corect, necesară înainte de a putea lansa procesul de punere la punct a driverului. După ce v-aţi convins că hardware-ul lucrează corespunzător, puteţi să-i “spuneţi” Wizard-ului să genereze automat codul pentru driverul dvs.
Wizard-ul va genera un nivel de funcţii “Hardware Specific” (de exemplu, de forma My_Hardware_XXX() API), precum şi codul-sursă pentru un utilitar simplu de diagnostic. Utilitarul accesează toate elementele echipamentului dvs. prin intermediul noului API specific pentru hardware-ul, ce a fost generat. Puteţi folosi această aplicaţie ca pe un eşafodaj în jurul căruia se clădeşte aplicaţia finală. Wizard-ul mai generează şi fişierele Makefiles pentru majoritatea mediilor de programare cele mai răspândite (Microsoft Visual Studio, Borland Builder, Linux gmake şi altele). Puteţi compila şi rula direct codul generat, fără alte modificări.

API-ul specific pentru un anumit hardware
Performanţele driverelor
Arhitectura WinDriver-ului, în forma descrisă anterior, poate genera unele scăderi ale performanţelor, deoarece memoria şi întreruperile sunt tratate în nivelul de aplicaţie. Deci driverul funcţionează corect, dar nu foarte rapid. Această problemă potenţială poate fi depăşită folosind arhitectura “Kernel PlugIn” a WinDriver-ului.
Acest modul soft plug-in vă permite să-i spuneţi lui WinDriver să ruleze codul dumneavoastră de user-mode în modul Kernel, şi prin urmare permite codului generat să ruleze la performanţele de nivel Kernel Level Performance. FOLOSIND CARACTERISTICA DE PLUG-IN KERNEL, WINDRIVER VĂ PERMITE SĂ RULAŢI DRIVERUL REALIZAT CU PERFOMANŢE OPTIME ABSOLUTE!1.

Wizard-ul pentru WinDriver va detecta automat resursele echipamentului dvs. Puteţi defini şi registre suplimentare

Folosiţi Wizard-ul pentru a diagnostica echipamentul. Înainte de a începe scrierea codului, verificaţi că echipamentul funcţionează corect

În final, alegeţi sistemul de operare (OS) cu care lucraţi – Wizard-ul WinDriver va genera automat API şi mostra de cod de aplicaţie pentru accesarea echipamentului respectiv, din interiorul sistemului de operare pe care l-aţi ales

În majoritatea cazurilor, Plug-In-ul Kernel nu va fi folosit, deoarece comenzile de transfer de memorie ale lui WinDriver se execută oricum în nivelul nucleu. Singurele cazuri în care considerentele de creştere a performanţelor vor solicita folosirea lui Kernel PlugIn sunt atunci când echipamentul dvs. necesită o rată a întreruperilor foarte ridicată, sau când memoria dispozitivului hardware folosit nu este mapată în memorie (de exemplu, este mapată ca I/O). În cazul dispozitivelor PCI, o modificare hardware simplă vă poate transforma echipamentul ce era mapat ca I/O într-unul cu mapare în memorie. Iar pentru plăcile care sunt mapate în memorie, WinDriver oferă un pointer de mod user ce poate fi folosit pentru a transfera date către placă, precum şi pentru a citi datele de la placă.

API-uri pentru cipseturi specifice
Adaptarea API-ului la un anumit cipset concret se face prin intermediul “punţii PCI”. Despre ce este vorba? Echipamentele pe magistrala PCI trebuie să aibă un dispozitiv care să asigure funcţionalitatea PCI a hardware-ului respectiv. Acest dispozitiv este denumit o punte PCI, “PCI bridge”, şi este responsabil de comunicarea cu controlerul PCI şi cu translatarea datelor bazate pe magistrala PCI în formatul de date al magistralei locale de pe placa hardware propriu-zisă. Punţile PCI pot fi cumpărate ca dispozitive separate, sau ca nuclee IP, ce sunt încărcate într-un cip FPGA pe echipamentul dvs. Unele din punţile PCI oferă funcţionalitate DMA (Master şi/ sau sclav de DMA), funcţionalitate care poate fi folosită prin programarea registrelor dispozitivului.
WinDriver şi KernelDriver asigură suport pentru componentele de la principalii producători de punţi PCI – firme precum PLX, AMCC, V3, Galileo şi PLDA. Suportul include definirea tuturor registrelor şi gamelor de memorie ale punţii PCI şi funcţionalitatea DMA pre-programată ce permite proiectantului de soft să realizeze accese rapide la memorie către şi de la echipament, fără a fi nevoit să înveţe detaliile punţii PCI particulare ce se foloseşte.
Transportarea driverului pe alte sisteme de operare
Cum am mai menţionat, un avantaj major al uneltelor soft Jungo îl reprezintă portabilitatea driverelor generate. WinDriver oferă proiectantului de soft pentru drivere un API în nivelul de aplicaţii, pentru a accesa hardware-ul. Acest API apelează modulul de nucleu al WinDriver, care realizează propriu-zis accesul real la hardware, prin intermediul API-urilor de nucleu specifice sistemului de operare respectiv. WinDriver oferă module kernel pentru majoritatea sistemelor de operare cele mai răspândite fiind Windows 95, 98, NT, 2000, CE, Linux, Solaris, VxWorks, OS/2 şi desigur MS-DOS. Aceste module kernel vă permit să rulaţi driverul dvs.
Bazat pe WinDriver sub oricare din sistemele de operare suportate – pur şi simplu îl recompilaţi, după care poate rula!

Modelul driverului “KernelDriver”
În majoritatea cazurilor, puteţi folosi modelul de driver WinDriver. Se recomandă să folosiţi modelul de driver WinDriver peste tot unde este posibil, deoarece oferă cea mai uşoară soluţie, şi reprezintă şi o soluţie ce poate trece de la o platformă de calcul la alta. Există totuşi anumite cazuri în care modelul de driver WinDriver NU poate fi utilizat, şi trebuie scris un driver de dispozitiv complet în modul kernel.
Se poate dovedi necesar să elaboraţi un driver de dispozitiv complet în modul kernel dacă scrieţi un driver de dispozitiv care:
1. este un driver standard, ce trebuie să comunice cu driverele standard ale sistemului de operare. Sub sistemele de operare Windows de la Microsoft, driverul de dispozitiv standard include driverele de dispozitive de comunicaţii (cum ar fi NDIS).
2. este un driver care va filtra datele ce trec printr-un alt driver de dispozitiv (“filter driver”). Un exemplu de astfel de driver-filtru este un driver ce interceptează toate comunicaţiile cu harddiskul sistemului, şi le criptează.
Driverele de dispozitive în mod Kernel trebuie să fie scrise în modul nucleu al sistemului de operare respectiv, folosind kitul de dezvoltare a driverelor specific acelui sistem de operare (de exemplu DDK pentru Windows 9x). Ulterior, aceste drivere trebuie depanate folosind un debugger de mod kernel, şi necesită o cunoaştere aprofundată a sistemului de operare sub care vor rula. Aici nu se mai aplică portabilitatea, trebuie să scrieţi câte un driver de dispozitiv separat pentru fiecare din sistemele de operare sub care va fi folosit driverul echipamentului.
KernelDriver-ul firmei Jungo oferă clase pentru limbajul C++, clase care îmbracă nucleele sistemelor de operare din familia Windows NT/2000/98, şi asigură o interfaţă uşor de folosit pentru scrierea driverelor de dispozitive.
Scrierea unui driver cu KernelDriver
Folosirea lui KernelDriver începe cu DriverWizard. Puteţi utiliza “vrăjitorul” DriverWizard pentru a defini şi a diagnostica hardware-ul pentru care scrieţi un driver. O dată ce aţi verificat că echipamentul funcţionează corect, puteţi folosi pe DriverWizard pentru a genera codul driverului. Când apare meniul cu opţiuni, alegeţi “KernelDriver”, astfel ca pentru hardware-ul dvs. să fie generat un driver de dispozitiv de mod nucleu. DriverWizard generează un driver de dispozitiv complet în modul kernel, împreună cu o aplicaţie de diagnoză de mod utilizator. Aplicaţia de diagnosticare foloseşte driverul de mod nucleu proaspăt generat pentru a accesa echipamentul. Puteţi folosi acest schelet robust ca bază pentru driverele şi aplicaţiile dvs.
KernelDriver oferă clase pentru accesarea echipamentului dvs. specific, împreună cu alte clase ce simplifică şi organizează procesul de punere la punct a driverelor de dispozitive.

Drivere WDM
O dată cu lansarea generaţiilor recente de sisteme de operare pe 32 de biţi, respectiv Windows 98 şi Windows 2000, firma Microsoft a introdus conceptul “Windows Driver Model” (WDM), care definea un model de drivere de dispozitiv ce era compatibil atât cu Windows 2000, cât şi cu Windows 98. Un driver WDM foloseşte doar un subset al DDK-ului standard. Acest sub-set de funcţii este suportat atât în Windows 98 cât şi sub Windows 2000, şi în consecinţă asigură compatibilitatea reciprocă 98/2000. Ambele soluţii de la firma Jungo ţin cont de WDM.
Sistemul WinDriver elimină nevoia de drivere WDM, deoarece creează drivere care suportă atât Windows 98 cât şi Windows 2000, împreună cu toate celelalte sisteme de operare pe care WinDriver le suportă. Astfel, pe de o parte se elimină restricţiile impuse de WDM, iar pe de alta, se obţine o compatibilitate mai largă, pentru diferite platforme de calcul.

S-ar putea să vă placă și

Adaugă un comentariu