windows - Driver < - > OS/App Hvordan virker det? Et eksempel

Indlæg af Hanne Mølgaard Plasc

Problem



Lad os sige, at jeg vil lave en app, nogle hardware og en driver til at kommunikere med det. Lad os sige, at enheden er fastgjort til enten bundkortet eller via USB. Enheden ville være et bord med 8LED'er. Den grænseflade, jeg vil have, er


bool lock() //true if success
void unlock()
//each bit is matched up to an LED and set means the led is on. 
//Return value is <0 on error. 0 on success. >0 on noncritical error
int  set(char v)


Lad os sige ikke-kritisk fejl betyder, at du sender den sidste kommando i < 200ms, så den ignoreres, fordi enheden ikke vil tænde/slukke LED'erne så hurtigt.


Lad os sige appen, der indtager en streng tekst og bruger enheden til at blinke morse-koden til brevet/ordene. OS'et ved ikke, hvordan enheden fungerer. Hvordan kommunikerer appen til føreren? Jeg tror ikke, at en DLL/SO bruges, fordi føreren er i sin egen proces.


Hvordan taler appen til enhedsdriveren i Windows eller Linux? Jeg er ikke interesseret i, hvordan man skriver en enhedsdriver. Bare hvordan en app og kernen kommunikerer med den.

Bedste reference


Siden du bad om Windows og Linux, vil jeg svare på begge dine spørgsmål.


Linux:



I Linux-verdenen er næsten alt en fil. Alt går fra A til B ved at omdirigere output fra en binær kilde til en sink (fil eller enheden fil) eller piping output fra en binær til en anden binær.
Det enkleste eksempel er en tegn enhed, det enkleste eksempel på en tegn enhed er en seriel driver.


Følgende kommando:


echo ciao > /dev/ttyS0


er et perfekt eksempel på, hvordan man forbinder brugerrum til kerne-rum.


BEMÆRK:/dev/ttyS0 er standardnomenklaturen for en seriel port, og svarer til COM1 i Windows.


Jeg har sendt mindst 4 byte til tegnapparatet/dev/ttyS0.
Kodekørsel starter i kernel-plads, så en funktion åben () (defineret i driveren) kaldes for at initialisere den serielle port, som indtil nu var slukket.


Denne initialisering i Linux forbereder ikke kun seriel porten, men åbner en TTY-linje. TTY står for teletype, og det styrer transparent at flytte 'ciao' -strengen til hardwareenheden.


Her er trinene:



  1. Forbered serieledning (eller gpio eller hvad som helst)

  2. Opret databuffer i RAM for at indsætte data
  3. Kort hukommelsen til hardwareadresserne i kerneadgangshukommelsesområde

  4. Kopier data fra RAM-bufferen til den hukommelseskortede hardwareadresse.

  5. Hardwareenheden vil så gøre hvad den er beregnet til at gøre med dataene, dvs. modulere og transmittere RS232-data eller sætte en GPIO høj eller lav.



Vinduer:



I Windows er enheder normalt ikke repræsenteret som filer, så det skal gøres programatisk. Systemanropene er praktisk taget de samme, og normalt er brugerpladsen til kerne-rum-grænsefladen normalt leveret af funktioner af typen:
åben (), læs (), skriv () og luk ().


Begge:



Disse opkald anvendes generelt til alle typer drivere, herunder grafik og lyddrivere. I mit Linux-eksempel beskrev jeg, hvordan man ekko en streng til en tegn enhed, men jeg kunne også have ekkoet en hex-værdi, der repræsenterer en bestemt tone eller frekvens til min lydenhed, som kan findes i/dev/audio0.


I tilfælde af en GPIO ville processen være ens:
åben (tilfældig fil eller buffer), skriv (1) eller skriv (0), copyfromuserspacetohwbuffer ().


Også i tilfælde af GPIO giver linux en nem måde at få adgang til og manipulere GPIO fra userspace. Se op på proc filsystemet. Det eksporterer stier som/proc/gpio/gpio1/værdi, hvor du kan ekko 0 eller ekko 1 fra en shell eller fra et applikationsprogram meget nemt.


Jeg håber det tydeliggør din tvivl!


-Vittorio