Laiteajurissa rutiineja laitteen luku/kirjoitus ovat toteutetaan mm. (Haikala, laitteen Järvinen) ohjauksessa : tarvittavat rutiinit ja tietorakenteet. Tällaisia LAITEAJURIT ohjausrutiini alustus (esim. WINDOWS päätteen ominaisuuksien CE:SSÄ asetus) Ajuri laitteeseen liittyvät keskeytykset käsittelevä rutiini (huom: windowsissa sanomajono joka etusijalla laitteistokeskeytyksen kutsua ei tehdä suoraan) Windows ladataan on Windows isäntäsovelluksen CE:ssä yksinkertaisesti prosessiavaruuteen. DLL (dynamic link library = dynaaminen kirjasto), CE (versio 3) tukee neljää ajurityyppiä: native, stream interface, USB ja NDIS. CE:ssä asennettavat Alustassa on jo kahdenlaisia valmiina laitteet. olevat laitteita, käsittävät joihin voidaan näytön, tehdä kosketuspaneelin, ajureita: alustassa äänen, jo sarjaportin, valmiina olevat ja tai Asennettavat tulostimen, flash:ssa. näppäimistön, laitteet ovat CE-laitteesta LED:n, akun ja erillisiä PC kortti käyttäjän socket:n. asennettavia Nuo driverit laitteita, sijaitsevat joita ROM:ssa voi Natiivit käyttää ajurit esim. kaapelin kautta (esim. USB). käyttäjä CE muut tekoon ajurit natiiviajurit ajurit vaaditaan paitsi toteutetaan Windows LED- ja akkuajurit CE:ssä joko staattisina Platform (.lib) on (.lib Builder, toteutettu ) tai joka dynaamisina.dll-kirjastoina. on maksullinen kirjastoina Natiivien ohjelmisto. (.dll). ajurien Kaikki mukana. ovat yleensä ns. pysyviä ajureita eli niitä ei muunnella liikkuvat laitteiston Natiivit Suodatinajurit Nämä ajurit jakavat (stream yhteisen interface rajapinnan. drivers) sarjaporttiajurin haluttaisiin liittää skanneri tai joku muu erikseen Tätä mallia asennettava käytetään laite. kun Tätä esim. käytetään laitteeseen Näihin ajureihin pääsee tapauksessa. monesti kiinni jonkin sovelluksen kautta: esim. jos kytkettäisiin myös GPSlaite, Ajureiden voitaisiin lukeminen/kirjoittaminen avata automaattisesti (Boling, GPS:n sovellus. esim. Ajureihin päästään käsiksi I/O funktioilla: CreateFile, 2001) Tällä CreateFile metodilla voidaan aukaista laite. Funktio vaatii parametrikseen ReadFile, WriteFile kolmekirjaimisen CloseHandle. lyhenteen, COM ACM esim.: sarjaporttiajuri laitteen WAV CON = audio Konsoliajuri Audio kompressori aalto ajuri hallinta 1
kielletty Ajureita voidaan kirjoitus/luku aukaista -oikeuksilla. erilaisilla pääsyehdoilla: vain luku, vain kirjoitus, kirjoitus/luku tai WriteFile ReadFile Kun laite on avattu, voidaan lähettää dataa siihen WriteFile funktiolla. Stream Kun Device.exe laite interface-typpisen on lataa avattu, tämän voidaan tyyppisen ajurin lukea tekeminen ajurin dataa (lataa siitä (Boling, ReadFile tosin 2001) myös funktiolla. Funktioita XXX_Init stream-ajurissa (tässä XXX = esim. COM = sarjaportti): muun tyyppisiäkin ajureita). XXX_Deinit XXX_Open XXX_Close = kun ladataan muistiin. XXX_Read pois muistista. XXX_Write avataan CreateFile-funktiolla. XXX_Seek ajuri suljetaan sovelluksesta CloseHandle-funktiolla. XXX_IOControl ReadFile-funktiolla XXX_PowerDown WriteFile-funktiolla ajuria. XXX_PowerUp = kutsutaan, = kutsutaan, = kun kun sovellus kun kun järjestelmä sovellus kutsuu kutsuu ajetaan SetFilePointer-funktiolla ajetaan DeviceIoControl-funktiolla ylös. alas. ajuria. ajuria. DWORD Kun ajuri XXX_Init(DWORD ladataan ensimmäistä dwcontext) kertaa, suoritetaan Parametrissa rekisterissä muunkin aktiivinen arvon, (jos dwcontext kuten sovelluksessa esim. voi olla 0. käytetään Jos osoitin dwcontext merkkijonoon, RegisterDevice-funktiota, ei osoita joka mihinkään, on ajurin dwcontext se aktiivinen silloin ole voi avain luvun. Jos avain). ajuri epäonnistuu Ajurin pitää alustamisessa, vastata Init-kutsuun sen pitäisi siten asettaa että Init oikea palauttaa virhekoodi 0:sta SetLastErrorfunktiolla useimmiten 0:n, peruuttaa ja device.exe) Init voi funktio myös ajurin palauttaa yrittäessa latauksen minkä silloin ja ladata ottaa 0:n. tahansa ajuria ajurin Jos muistiin, laitteistohallinta 0:sta aktiivisen poikkeavan huomaa avaimen (device että arvon pois Init takaisin manager rekisteristä. funktio palauttaa ainakaan poikkeavan saada Laitteistoajuri toteutettava viedä ajureissa, laitteistohallintaan. laitteistoa joilla olio-kohtaisesti. voi edustavan olla Tyypillisesti monta struktuurin ilmentymää voidaan osoite, laitteiston (ladattu joka sisältää useamman kahvan (device tietoa kerran), laitteiston context ajurin handle) tilasta. tilankäsittely avulla Niissä on Kun DWORD ajuri XXX_Deinit(DWORD ladataan pois muistista, hdevicecontext) suoritetaan parametrin Parametri hdevicecontext avulla voidaan laitteistokontekstin päätellä, mikä instanssi arvo, ajurista joka palautetaan ladataan pois XXX_Init muistista. funktiossa. Ajurin Ko. XXX_Init XXX_Deinit 2
laitteen pitäisi tämän alas. funktion jälkeen toimia niin, että se vapauttaa varaamansa muistin ja ajaa Kun XXX_Open. DWORD sovellus XXX_Open(DWORD tai toinen ajuri kutsuu hdevicecontext, funktiota CreateFile DWORD AccessCode, avatakseen DWORD ajuria, suoritetaan Ensimmäinen parametrit saavat on Init-funktiosta arvokseen suoraan palautunut CreateFile laitteistokonteksti. kutsun dwdesiredaccess AccessCode ShareMode) ja FILE_SHARE_WRITE). (luku/kirjoitus dwsharemode parametrien tai vain Laitteistoajuri luku) arvot. ja ShareMode:lla Parametri voi kieltäytyä AccessCode:lla laitteiston aukaisemasta jakoa ilmaistaan (FILE_SHARE_READ laitetta pääsy palauttamalla laitteeseen tai ja ajuri Palautettava hyväksyy funktion avauksen, arvo palauttaa on osoitin XXX_Open avoimeen 0:sta laitteistokontekstin poikkeavan arvon. struktuuriin. Jos ajuri 0:n. Jos voidaan ladata vain kerran mustiin, ko. arvo on sama kuin ensimmäinen parametri. suoritetaan DWORD Kun sovellus XXX_Close(DWORD XXX_Close. tai toinen ajuri (joka hopencontext) avannut ajurin) kutsuu funktiota CloseHandle, palautetaan laitteistokontekstin Parametri hopencontext kutsussa. datan varaaman) on Ajurin osoitin pitäisi avoimeen ja ajaa vapauttaa laite laitteistokontekstin alas. varaamansa kaiken struktuuriin, muistin joka (tai DWORD Kun sovellus XXX_Read(DWORD tai toinen ajuri hopencontext, kutsuu funktiota LPVOID ReadFile, pbuffer, suoritetaan Parametri hopencontext on osoitin avoimeen laitteistokontekstin DWORD struktuuriin, Count) pitäisi Open on kopioitu. kutsussa. Kolmas Toinen parametri Count osoitin on em. kutsuvan puskurin laitteiston koko tavuissa. puskuriin, Jos tapahtuu minne joka luettu virhe, palautetaan palautuu asettaa oikea virhekoodi käyttämälllä SetLastError funktiota ja palauttaa -1. Jos data Osoittimen 0, oikeellisuutta ajuri ei lue dataa. voidaan testata funktioilla ajurin BOOL Parametrit IsBadWritePtr(LPVOID IsBadCodePtr(FARPROC IsBadReadPtr(const ovat osoitin, jota testataan lp, lpfn) *lp,, UINT UINT ucb) ja luku/kirjoitus ucb) except funktiossa osoittimen poikkeuskäsittelyrakenteeseen. testataan, käytön, joten että aina osoitin kun on osoitinta validi. Koodi Kuitenkin (pbuffer) voisi olla käytetään, pääsyoikeus testeissä silloin malliltaan kannattaa puskurin voi muuttua koko. esim. koodi kesken Jokaisessa laittaa try em. seuraavanlaista: XXX_Open XXX_Close XXX_Read 3
{ DWORD XXX_Read(DWORD dwbytesread; hopencontext, LPVOID pbuffer, DWORD Count) //testataan if(isbadreadptr(pbuffer, SetLastError(ERROR_INVALID_PARAMETER); osoitinta dwcount)) return -1; //asetetaan virheilmoitus try except(exception_execute_handler) { dwbytesread = InternalRead(pBuffer, dwcount); SetLastError(ERROR_INVALID_PARAMETER); } } return return dwbytesread; -1; Kun DWORD sovellus XXX_Write(DWORD kutsuu funktiota hopencontext, WriteFile, suoritetaan Parametrit laitteeseen ovat kirjoitetun samoja datan kuin tavujen edellä olevassa määrän LPVOID XXX_Open tai -1 virheen pbuffer, funktiossa. sattuessa. DWORD Funktio Count) palauttaa Kun suoritetaan DWORD sovellus XXX_Seek(DWORD tai ajuri kutsuu hopencontext, funktiota SetFilePointer long Amount, käsitellessään WORD Type) laitteiston kahvaa, Open Parametri (Type) paikasta), kutsussa. on hopencontext FILE_BEGIN FILE_END Amount (etsii (etsitään on laitteen sama osoitin laitteen kuin lopusta). avoimeen SetFilePointer alusta laitteistokontekstin käsin), parametrissa FILE_CURRENT struktuuriin, välitetty (etsii koko. sen joka hetkisestä Tyyppi palautetaan tallennetaan, DWORD Kun systeemi XXX_PowerDown(DWORD jotta keskeyttää, se voidaan kutsutaan palauttaa. hdevicecontext) XXX_PowerDown:ia. Ajuri ajetaan alas ja sen tila XXX_Write XXX_Seek XXX_PowerDown 4
Parametri aikana SetInterruptEvent, Prototyyppi: ei voida hdevicecontext tehdä joka Win32 kertoo on API Init-funktiosta kernelille, kutsuja. Windows että palautunut ajurin CE keskeytyspalvelusäie sallii laitteistokonteksti. vain yhden funktion, odottaa. Tämän funktion BOOL Parametri SetInterruptEvent(DWORD idint on poikkeuksen numero. idint) uudestaan DWORD Kun systeemi XXX_PowerUp(DWORD ylös jatkaa, sen kutsutaan tila asetetaan hdevicecontext) XXX_PowerUp:ia. samaksi kuin ylösajoa Kun tämä ennen. funktio suoritetaan ajuri ajetaan Parametri XXX_PowerDown:ssa, hdevicecontext funktion Init-funktiosta aikana ei voida palautunut tehdä Win32 laitteistokonteksti. API kutsuja. Kuten voidaan kun Koska laite monet käyttää tai sovellus laitteistoajurit kutsuu -funktiota eivät DeviceIOControl käytä käsiteltäessä luku (Read), funktiota. ajuria. kirjoitus Prototyyppi: Funktiota (Write) XXX_IOControl tai etsi (Seek) kutsutaan, toimintoja, dwlenin, DWORD XXX_IOControl(DWORD PBYTE hopencontext pbufout, osoitin hopencontext, dwlenout, avoimeen laitteistokontekstin PDWORD pdwactualout) dwcode, struktuuriin, PBYTE pbufin, joka DWORD Open Parametri dwcode on laitteistokohtainen arvo, ilmoittaa miksi kutsu palautetaan tarvitse suoritettiin. Parametrissa dwlenin pbufin määritelty osoittaa em. puskuriin datan pituus. jossa on Parametrissa data joka välitetään pbufout laitteelle. kutsutaan puskuriin. dwlenout on määritelty em. datan pituus. Puskuriparametreissä on osoitin vietyyn koodeja). välttämättä DeviceIOControl-funktiota olla validia puskurin (riippuu osoitetta ajurista, vaan onko niissä siihen voidaan määritelty käyttää ns. 0:ia IOCTL- kun ei pituus Parametrissa osoite DWORD-tyyppiseen arvoon, josta saadaan kirjoitetun datan kutsussa. onnistui käyttämällä vietyyn ja FALSE funktiota puskuriin muussa SetLastError. (output tapauksessa. buffer). Jos Ajurin virhe pitäisi sattuu, palauttaa ajurin pitäisi TRUE jos palauttaa funktion virhekoodi suoritus käyttää avulla ohjelmisto Struktuuri voidaan OEM:stä ja sisältää I/O lähettää joka kontrolli tietoja tarvitsee komentoja (IOCTL IOCTL:stä yksilöivän = suoraan structure ja miten laitetunnisteen. laitteelle. and sitä voi I/O Platform käyttää. Control IOCTL code) Jos Builder, koodi sinulla on on joka koodi bittimaski, tiedossa jota maksullinen voidaan jonka parametrin taas IOCTL pystyt koodeja, dwcode kohdistamaan voit avulla käsitellä laitteeseesi ko. laitteen niinä XXX_IOControl IOCTL eri I/O koodin -kontrollikäskyjä. funktion (=I/O-kontrollikäskyn). aikana, Funktiolla jossa DeviceIOControl voit lukea laitteesi XXX_PowerUp XXX_IOControl IOCTL 5
1443-1 LÄHTEET Käyttöjärjestelmät, Programming Microsoft Ilkka Windows Haikala, CE, Hannu-Matti second edition, Järvinen, 2001, 1994 Douglas Boling, ISBN 0-7356- 6