Date: Fri, 2 Feb 2007 13:57:09 +0100 From: Michael Knudsen <none@e--molioner.dk.lh.bsd-dk.dk> To: bsd-dk@bsd-dk.dk Subject: Re: Drivere
Quoting Christian Elmerkjær (chrisne@gmail.com):
> Jeg har et pcmcia edge-kort, hvor der så vidt jeg ved ikke findes
> nogen drivere til.
> Så tænkte jeg:
> "Det må da være muligt at prøve at se om man kunne sætte sig ind i
> hvordan man laver drivere!!!"
> Jeg er (næsten) uddannet Datalog, så har en smule ide om pointere og
> lign.! :), men hvor begynder man. Hvordan bygger man en driver? Er det
> nemmere til OpenBSD end til FreeBSD? Hvor finder man dikumentation om
> emnet? Og vigtigst af alt: Har jeg tabt på Forhånd?
Der er tre aspekter:
1) Hvordan skal man snakke med hardwaren?
2) Hvad skal driveren rent faktisk goere?
3) Hvordan slutter man driveren til sit OS?
1) daekker over ting, der er specifikt for hvert stykke hardware eller
hver gruppe af kompatibelt hardware. 2) er generelt for en klasse af
hardware, e.g. netvaerkskort, lydkort, diskcontrollere, etc. 3) er
generelt for en klasse af hardware specifikt for et operativsystem.
1) er dokumenteret i databladet, som producenten (maaske) laver. Mange
gange er disse umulige at faa fat i ad lovlige kanaler med mindre man
underskriver en NDA (ikke-spredningsaftale). Det afhaenger med andre
ord i hoej grad af producenten, om du kan faa fat i dette materiale.
Baade 2) og 3) er mange gange ikke dokumenteret. NetBSD har noget
dokumentation liggende, som kan vaere en udmaerket start, men der skal
mere til. Laes en masse kode. Hvis du eksempelvis forsoeger at skrive
en driver til et netvaerkskort, saa laes koden til en masse
netkortsdrivere. Vaelg nogle simple kort ud uden en masse
hardwarespecifik funktionalitet, som kun forvirrer din forstaaelse af de
generelle principper. Naar du har faaet styr paa dem, boer du kunne
bygge et skelet op til en driver.
I OpenBSD (og givetvis ogsaa FreeBSD og co. i en eller anden form) bestaar
en minimal driver kaldet e.g. `asdf' af foelgende ting:
1) struct asdf_softc
Dette er en kontrolstruktur, som kernen bruger til at holde styr
paa al sin viden omkring paagaeldende hardwareenhed. Det vil
typisk som minimum vaere information, som skal bruges af kernen
for at kommunikere med hardware, e.g. io-adresser etc.
Derudover kan det taenkes, at een driver understoetter et antal
forskellige hardwareenheder, der har forskellig funktionalitet.
Dette vil typisk ogsaa vaere angivet i softc-structen, saa
driveren nemt kan se, hvilken funktionalitet der er tilstede.
2) asdf_probe()
Denne funktion bruges til at undersoege, om en givet
hardwareenhed findes paa systemet. Eksempelvis netkort findes
typisk paa flere forskellige bustyper, e.g. PCI, ISA, cardbus,
usb etc. Disse vil typisk have en _probe()-funktion specifik
for hver bustype, og disse vil saa kalde noget busuafhaengigt
kode. Et saadant eksempel er fxp(4)-driveren.
For PCI sammenligner man typisk blot vendor og product ID med en
liste over understoettede ID-saet, og ved positiv match
returnerer man > 1, hvorefter autoconf vil fortaelle, at man har
fundet enheden.
3) asdf_attach()
Denne funktion kaldes af autoconf, naar det er afgjort, at en
hardwareenhed er understoettet og oenskes tilkoblet
operativsystemet. Funktionen kaldes med en raekke parametre,
hvor en pointer til en asdf_softc er den vigtigste.
Denne funktion goer alt, der skal til for at starte og
initialisere enheden, saa den er i en kendt tilstand. Den goer
derudover alt, der skal til for at bruge enheden. For et
netvaerkskort betyder dette blandt andet at registrere enheden
som et netvaerkskort, saa det blandt andet dukker op med
``ifconfig -a''. Det vil ogsaa vaere igennem denne funktion, at
e.g. hardwareenhedens DMA-engine bliver programmeret. Mange
moderne hardwareenheder kraever, at der uploades firmware til
enheden for at fungere, og dette skal typisk ogsaa ske her.
Funktionen staar ogsaa for at registrere en eventuel
interrupt-haandteringsrutine og eventuelle `hooks' -- e.g.
powerhooks, der haandterer, naar maskinen gaar i standby eller
vaagner igen (her vil hardwaren typisk skulle slukkes og
geninitialiseres).
Ovenstaaende er (noget af) alt det generelle. Dertil kommer samarbejdet
med andre systemer i kernen, e.g. vfs til lagerenheder, lyd, etc. Det
bedste er nok som naevnt ovenfor at laese en masse lignende drivere og
proeve sig frem ud fra dette.
Mvh. Michael.
-- Five exclamation marks, the sure sign of an insane mind. -- (Terry Pratchett, Reaper Man)
This archive was generated by hypermail 2b30 : Wed 28 Feb 2007 - 23:00:02 CET