Het schrijven van een device driver

advertisement
Het schrijven van een device driver
voor Windows 2000
Algemeen
Over deze presentatie



Tijdsduur is ongeveer één uur
Het leren begrijpen van een device driver
is erg lastig 
let goed op en maak tijdens relevante
onderwerpen veel aantekeningen
Vragen kunnen gesteld worden na elk
deelonderwerp en aan het einde
Algemeen
Inhoud






Introductie
Algemene toelichting op device drivers
Hulpmiddelen voor schrijven driver
Toelichting op “PPort” voorbeelddriver
Toelichting op Cypress EZ-USB oplossing
Slot
(±5 min.)
(±25 min.)
(±10 min.)
(±15 min.)
(±5 min.)
Introductie
Introductie
Introductie




Wie ben ik
Waarom deze stage
Voorkennis
Werkzaamheden
Introductie
Wie ben ik



Tommy Sools
Student in derde jaar informatica (blok 11)
Stagiair bij technische informatica

Begeleid door Ruud Ermers
Introductie
Waarom deze stage





Hobby elektronica
Diverse computerinterface projecten die
natuurlijk een device driver vereisen
Op zoek naar USB microcontroller
oplossing
Poging tot zelfstandig leren device drivers
Tenslotte de vraag of er binnen Fontys een
module bestaat over device drivers
Introductie
Voorkennis

C++ binnen informaticamodulen (Visual Studio):






Programmeren in C
Low Level Programming
Interprocescommunicatie
Events & Exceptions
Geheugentechnieken en –beheer
Gedurende twee kwartalen begeleiden practica C
Programmeren (Borland C++ Builder)
Introductie
Voorkennis (2)

Veel hobbyprojecten met Borland Delphi



www.sools.com
Programmeren aan administratiepakket
Order-Direct tijdens eerste stage
Hobbyprojecten met 8051 en AVR
microcontrollers, vooral in assembler taal
Introductie
Werkzaamheden




Tweede stage, twintig weken,
momenteel zesde week
Onderzoek doen naar de werking van
device drivers
Ter oefening een aantal drivers schrijven
Practicumhandleiding schrijven over
device drivers voor Windows 2000
Introductie
Einde introductie




Interesse vanuit hobby
Ruim voldoende voorkennis en ervaring
Stage duurt 20 weken
Doel is practicumhandleiding schrijven
over Windows 2000 driverontwikkeling
Vragen
Er kunnen nu vragen over de introductie
gesteld worden.
Hulpmiddelen
Hulpmiddelen
Hulpmiddelen
•
•
•
•
•
•
Computersystemen
Microsoft Visual Studio 6.0
Microsoft Windows 2000 DDK (SP1)
DebugView
LoadDrv
Talloze andere optionele hulpprogramma’s
Hulpmiddelen
Computersystemen
• PC voor ontwikkeling
• PC voor testen
Hulpmiddelen
Ontwikkelsysteem
• Besturingssysteem is niet relevant,
bijv. Windows 2000 of XP
• Driver nooit testen op ontwikkelsysteem
Hulpmiddelen
Testsysteem
• Windows 2000 Professional,
met alle service packs en updates
• Zorgen voor een herstelmogelijkheid,
bijv. Norton Ghost
Hulpmiddelen
Microsoft Visual Studio 6.0
• Sjabloon “DDAppWiz.awx” installeren
• Als projectinstellingen goed zijn 
compileren via ToolsBuild
• Resultaat is .sys bestand
• Checked Build tegenover Free Build
– Aan te passen via DBG define
– Ook van toepassing op Windows zelf
Hulpmiddelen
Microsoft Visual Studio 6.0 (2)
Hulpmiddelen
DebugView
• Toont berichten die Checked Build van
driver genereert met DbgPrint
• DebugView geeft geen informatie weer
gegenereerd vanuit ISR’s
Hulpmiddelen
DebugView (2)
• Werkt ook na bugcheck schermen:
– “Startup & Recovery” instellingen goedzetten
– Zorgen dat DebugView draait tijdens crash
– Binnen DebugView kiezen voor
FileProcess Crash Dump en
“memory.dmp” in Windows map selecteren
Hulpmiddelen
DebugView (3)
Hulpmiddelen
LoadDrv
• Installatie, starten, stoppen van een driver
Hulpmiddelen
Einde hulpmiddelen
• Twee computersystemen
• Verschillende software benodigd
Vragen
Er kunnen nu vragen over hulpmiddelen bij
het schrijven van device drivers gesteld
worden.
Device drivers
Device drivers
Device Drivers
•
•
•
•
•
Waarom een device driver
Aanroepen van een driver
Opbouw van een driver
Interrupt Request Levels (IRQL’s)
Interrupt Service Routines (ISR’s) en
Deferred Procedure Calls (DPC’s)
Device drivers
Waarom een device driver
• Vereist door ontwerp van Windows voor
– stabiliteit
– beveiliging
• Applicatie hoeft minder intelligent te zijn;
er is minder dubbele code
• Apparaat kan gedeeld worden met
meerdere applicaties
Device drivers
Aanroepen van een driver
• Keuze voor Borland C++ Builder
• De meeste drivers kunnen benaderd
worden alsof het bestanden zijn, dus met
de volgende Win32 API functies:
– CreateFile
– WriteFile
– ReadFile
– CloseFile
Device drivers
Aanroepen van een driver (2)
• Daarnaast kan met sommige drivers de
volgende functie gebruikt worden:
DeviceIoControl
• Invoer aan de functie is:
– IOCTL code die het soort verzoek aangeeft
• Gegenereerd door CTL_CODE macro uit winioctl.h
– Invoer- en uitvoerbuffer
Device drivers
Aanroepen van een driver (3)
• Vanwege ingewikkeldheid van aanroepen
worden deze in een aparte unit of vaak in
een DLL geplaatst
Device drivers
Opbouw van een driver
•
•
•
•
•
•
Plaats binnen Windows
DriverEntry routine
DriverUnload routine
I/O Request Packet (IRP)
Dispatch routines
Voorbeelden IRP’s
Device drivers
Plaats binnen Windows
Hardware
IoXxx functieaanroepen
Applicatie
Win32 API
API functie
aanroep
I/O Manager
ongemerkt
HAL
macro’s
Device Driver
dispatch
routine
Device drivers
DriverEntry routine
• Ontvangt pointer naar Driver Object
• Wordt aangeroepen wanneer de driver
door Windows geladen wordt
• Initialiseert pointers naar andere routines,
zoals DriverUnload, AddDevice en StartIo
• Initialiseert MajorFunction array die
pointers bevat naar elke dispatch functie
Device drivers
DriverEntry (2)
• Creëert Device Object voor elk apparaat
– Device Object heeft gebruikergedefinieerde
Device Extensie voor opslag van variabelen in
niet-gepagineerd geheugen
• Creëert voor elk device eventueel een
symbolic link:
– de naam die een applicatie kan gebruiken met
CreateFile
Device drivers
DriverUnload routine
• Wordt alleen aangeroepen als de driver uit het
geheugen wordt geladen voordat het afsluiten
van Windows in gang is gezet
• Als deze routine ontbreekt blijft de driver in het
geheugen totdat Windows wordt afgesloten
• Als er iets speciaals moet gebeuren als
Windows wordt afgesloten moet
IRP_MJ_SHUTDOWN worden afgehandeld
Device drivers
I/O Request Packet (IRP)
• Meestal aangemaakt door I/O Manager als
gevolg van Win32 API aanroep
• Verplaatst zich vanaf de I/O Manager door
de driver
Device drivers
Dispatch routines
• Worden aangeroepen door de I/O
manager door de MajorCode uit de IRP
als index te gebruiken voor de
MajorFunction array van de driver
• Handelen codes zoals IRP_MJ_CREATE,
IRP_MJ_WRITE en dergelijke af, die vaak
samenhangen met een bepaalde Win32
API aanroep
Device drivers
Dispatch routines (2)
• Completeren IRP door aanroep van
IoCompleteRequest of IRP in StartIo
wachtrij zetten door aanroep van
IoMarkIrpPending
Device drivers
Voorbeelden IRP’s
IRP_MJ_CREATE:
• Wordt verzonden als CreateFile wordt
aangeroepen
IRP_MJ_CLOSE:
• Wordt verzonden als CloseFile wordt
aangeroepen
Device drivers
Voorbeelden IRP’s (2)
IRP_MJ_WRITE:
• Wordt verzonden als een applicatie
WriteFile aanroept
• Kopieert of gebruikt buffer van gebruiker
Device drivers
Voorbeelden IRP’s (3)
IRP_MJ_READ:
• Wordt verzonden als een applicatie
ReadFile aanroept
• Kopieert naar of schrijft in buffer van
gebruiker
Device drivers
Voorbeelden IRP’s (4)
IRP_MJ_DEVICE_CONTROL:
• Wordt verzonden als een applicatie
DeviceIoControl aanroept
• Bevat meestal één groot case statement
die de verschillende IOCTL codes
afhandelt
Device drivers
Einde opbouw van een driver
• Driver bevindt zich tussen I/O Manager en
hardware
• DriverEntry routine is beginpunt
• DriverUnload routine is optioneel
• I/O Request Packets (IRP’s) verplaatsen
zich door de driver
• Dispatch routines worden gebruikt om
IRP’s af te handelen
• Verschillende soorten IRP’s
Device drivers
Interrupt Request Levels (IRQL)
• Delen van een driver worden vanuit
verschillende contexten aangeroepen
• Afhankelijk van deze context verschilt het
IRQL nummer
• Hoe hoger het IRQL, hoe beperkter een
driver is in zijn aanroepen
• Code binnen een hoger IRQL kan niet
onderbroken worden door code met een
lager of gelijk IRQL
Device drivers
IRQL (2)
• Voorbeelden van IRQL’s (hoog naar laag):
– DIRQL: hardware IRQL’s
• Van toepassing binnen een ISR voor hardware
• Niet alloceren van niet-gepagineerd geheugen
– DISPATCH_IRQL
• Van toepassing binnen een DPC routine
• Alleen alloceren van niet-gepagineerd geheugen
– APC_IRQL
– PASSIVE_IRQL
• Van toepassing binnen dispatch routines
• Alloceren van gepagineerd geheugen
ISR’s en DPC’s
Device drivers
• Interrupt Service Routine (ISR) wordt
aangeroepen wanneer er een hardware
interrupt optreedt
• IRQL = een DIRQL
• ISR plant Deferred Procedure Call (DPC)
• Windows voert DPC’s uit zodra het IRQL
daalt tot DISPATCH_LEVEL
• DPC regelt tijdsintensieve zaken of zaken
die alleen op een lager IRQL mogelijk zijn
Device drivers
Einde device drivers
•
•
•
•
•
Nut device driver
Aanroepen van een driver
Opbouw driver
IRQL’s
ISR’s en DPC’s
Vragen
Er kunnen nu vragen over device drivers
gesteld worden.
PPort voorbeelddriver
PPort driver
Pport driver
•
•
•
•
•
StartIo principe
Terugloopplug
Werking
Probleem
Oplossingen
PPort driver
StartIo principe
StartIo principe:
• Dispatch routine roept IomarkIrpPending aan om
IRP in wachtrij te plaatsen
• IoStartPacket haalt IRP uit wachtrij en roept de
StartIo routine aan, die verwerking uitvoert
afhankelijk van de MajorCode
• StartIo routine roept IoStartNextPacket aan
zodat volgende IRP uit wachtrij verwerkt kan
worden
PPort driver
StartIo principe (2)
• StartIo routine zorgt voor serialisatie
• StartIo routine verzorgt de eigenlijke I/O
met de hardware
• Hoeft niet verplicht gebruikt te worden
PPort driver
Terugloopplug
• Als hardware wordt er een terugloopplug
op de parallelle poort gebruikt
• Genereren van interrupt mogelijk via
Reset uitgang (gekoppeld aan Ack ingang)
PPort driver
Werking
•
•
•
•
•
StartIo ontvangt IRP
StartIo roept TransmitByte aan
TransmitByte genereert interrupt
ISR roept TransmitByte aan
Als bytes op zijn dan plant de ISR een
DPC in, die de IRP completeert
• DPC completeert IRP
PPort driver
Probleem
• Bugcheck scherm:
MULTIPLE_IRP_COMPLETE_REQUEST
• Oorzaak:
DPC wordt dubbel uitgevoerd,
dus ook de ISR wordt dubbel uitgevoerd
PPort driver
Oplossingen
Oplossing 1:
• Binnen ISR regel verwijderen:
WriteControl(pDevExt, CTL_DEFAULT)
• Zorgt ervoor dat het Interrupt Enabled bit
wordt uitgeschakeld
• Veroorzaakt bugcheck scherm bij afsluiten
van Windows:
DRIVER_IRQL_NOT_LESS_OR_EQUAL
PPort driver
Oplossingen (2)
Oplossing 2:
• Bijhouden of de DPC al is uitgevoerd
nadat een interrupt is gegenereerd
• Werkt alleen goed als de interrupt door
jezelf gegenereerd wordt;
acceptabel voor deze driver maar
onmogelijk binnen de meeste drivers
PPort driver
Einde PPort driver
•
•
•
•
•
StartIo principe
Terugloopplug
StartIo, ISR en DPC implementatie
Probleem
Voorlopige oplossing
Vragen
Er kunnen nu vragen over de PPort driver
gesteld worden.
EZ-USB oplossing
EZ-USB oplossing
EZ-USB oplossing
•
•
•
•
Cypress EZ-USB chip
Cypress EZ-USB toolkit
USB MP3 device
USB experimenteerbord
EZ-USB oplossing
EZ-USB chip
• Cypress AN2131
• Snelheid effectief 6 MHz
(24 MHz ÷ 4 klokpulsen)
• 8 kilobyte intern RAM
• Dataoverdracht van MCU naar USB
module via RAM geheugen
EZ-USB oplossing
Cypress EZ-USB toolkit
• Firmware voor Keil C51
– Keil uVision 2 benodigd
• Broncode van een universele driver
• Veel documentatie
EZ-USB oplossing
USB MP3 Device
•
•
•
•
Rob Looijmans
Jan Blanken
Ron van Balen
Gerard Akse
EZ-USB oplossing
USB MP3 Device (2)
• Twee stereo MP3 naar analoog decoders
verbonden via SPI bus via UART met EZUSB processor
• Functioneert als terugloopapparaat en
genereert een test sinustoon via een
speciaal commando
• Functioneert in de toekomst als USB
geluidskaart
EZ-USB oplossing
USB experimenteerbord
•
•
•
•
•
•
•
32 kilobyte extra RAM geheugen
EEPROM via I2C bus
8 LEDs
4 drukknoppen, optioneel als interrupts
2 RS232 poorten
LCD aansluiting
Standaardheaders voor uitbreidingen voor
printplaat Peter Klijn
EZ-USB oplossing
USB experimenteerbord (2)
• Hardware gereed voor 18 april a.s.
• Als voorbeeld wordt een aangepaste
driver geschreven
• Geschikt als voorbeeldhardware bij het
schrijven van een eigen driver
• Geschikt om te leren werken met een
8051 processor
EZ-USB oplossing
Einde EZ-USB oplossing
• Handige toolkit, inclusief alle benodigde
broncode en documentatie
• Tenminste twee projecten maken op dit
moment gebruik van de EZ-USB chip
• Het toekomstgerichte experimenteerbord
zorgt dat Cypress EZ-USB voorlopig de
standaard is binnen Fontys
Vragen
Er kunnen nu vragen over de EZ-USB
oplossing gesteld worden.
Slot
Slot
Verdere stage


Stage duurt nog circa 14 weken
Vrijwel elke dag tot aan de zomervakantie
beschikbaar voor vragen over device
drivers in lokaal 0.153
Slot
Slot




Hulpmiddelen
Device drivers
Pport driver
EZ-USB oplossing
Vragen
Algemene vragen over deze presentatie
kunnen nu gesteld worden.
Einde
Deze PowerPoint presentatie is desgewenst
te downloaden vanaf:
stage.sools.com
Download