next up previous contents
Next: Makefile eines Gerätetreibers Up: Linux Gerätetreiber Previous: Erstellung von Gerätetreibern als

Hardwarezugriff

In einem Gerätetreiber muß man natürlich auch die Hardware des Geräts ansprechen können. Dazu stellt der Kernel verschiedene Funktionen bereit, mit deren Hilfe man die Hardware-Ressourcen, z.B. IO-Ports, verwalten und ansprechen kann.

Normalerweise belegt man beim Start des Gerätetreibers, also in init_module(), alle Ressourcen, die das Gerät braucht. Dazu geht man folgendermaßen vor:

  1. Mit check_region(int from, int num) fragt man ab, ob der entsprechende Portbereich von from bis from + num frei ist, d.h. nicht von anderen Treibern verwendet wird.
  2. Falls er frei ist, wird mit Hilfe von request_region(int from, int num, const char *name) der Bereich für den Treiber reserviert, wobei name einen aussagekräftigen Namen für den Portbereich angibt. Die belegten Portbereiche werden unter /proc/ioports angezeigt.
  3. Wenn der Treiber entfernt werden soll, also beim Aufruf von cleanup_module(), muß der Portbereich wieder freigegeben werden. Dies geschieht mittels
    release_region(int from, int num), welches den entsprechenden Portbereich wieder freigibt.

Auf die IO-Ports kann dann mittels inb(port), inw(port), outb(data, port) oder outw(data, port) zugegriffen werden, mit denen jeweils ein Byte (inb, outb) oder ein Wort (inw, outw) vom Port port gelesen, oder der Wert data auf den Port port geschrieben wird.

Falls man Interrupts belegen will, versucht man während der Initialisierung mit der Funktion
request_irq(unsigned int irq,
void (*handler)(int, void *, struct pt_regs *), long flags,
char *device, void *dev_id)

einer Interruptfunktion für den angegeben Interrupt zu belegen. Wenn der Aufruf nicht fehlschlägt, wird die Funktion handler bei jedem Interrupt aufgerufen. Mit free_irq(int irq, void *dev_id)) gibt man den Interrupt wieder frei, wenn der Treiber entfernt wird.

Wenn man Memory-Mapped Hardware ansprechen will, kann man direkt Variablen auf die Speicherbereiche der Hardware legen, wenn der Speicherbereich im ersten Megabyte, auch Adapterbereich genannt, liegt. Mit folgender Codesequenz bekommt man z.B. eine Variable, mit der man auf dem Adapterbereich an Adresse D0000H wordweise zugreifen kann:

   short *wert;
   int address = 0xD0000;

   werte = (short *)address;

Weiterhin stehen im Kernel Funktionen bereit, um Speicherbereiche (kmalloc()) oder DMA Kanäle (request_dma()) zu belegen. Die Funktionsweise ist im Quellcode des Kernels ersichtlich, z.B. im Soundtreiber oder verschiedenen Blocktreibern.


next up previous contents
Next: Makefile eines Gerätetreibers Up: Linux Gerätetreiber Previous: Erstellung von Gerätetreibern als

Marius Heuler
Tue Jan 7 12:11:50 MET 1997