Re: Drivere

From: Michael Knudsen (none@e--molioner.dk.lh.bsd-dk.dk)
Date: Fri 02 Feb 2007 - 13:57:09 CET


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