/dev
entweder als Character- oder als Blockorientiertes Gerät. Die interne Organisation ist aber anders.inb, readb
usw. Transaktionen zur Konfiguration werden über spezielle Kernelfunktionen ausgeführt.struct pci_dev
) an, in der die notwendigen Informationen abgelegt sind. Hier finden sich auch die Adressen der Speicherbereiche wieder, die vom Gerät im Konfigurationsspeicher angegeben sind. Da das Betriebssystem unter Umständen die Geräte nicht mit der dort angegebenen Adresse in den Adressraum der CPU mappt, sollte man ohnehin nur die Werte verwenden, die in der jeweiligen Datenstruktur abgelegt sind.unsigned long pci_resource_start(struct pci_dev *dev,int bar);
bar
(base address register) festgelegt.unsigned long pci_resource_end(struct pci_dev *dev,int bar);
unsigned long pci_resource_flags(struct pci_dev *dev,int bar);
<linux/ioport.h>
definiert. Sie definieren Eigenschaften der jeweiligen Ressource.
- int pci_register_driver(struct pci_driver *drv);
- int pci_module_init(struct pci_driver *drv);
- void pci_unregister_driver(struct pci_driver *drv);
- void pci_insert_device(struct pci_dev *dev,struct pci_bus *bus);
- void pci_remove_device(struct pci_dev *dev);
- struct pci_driver *pci_dev_driver(const struct pci_dev *dev);
Die zugehörige Struktur ist pci_driver
. Sie enthält ein paar Funktionen und eine Device-ID-Liste.pci_device_id
enthält diverse ID-Felder. Das jeweilige Device wird gegen diese Felder getestet. Jedes Feld kann auf PCI_ANY_ID
gesetzt werden und wird dann ignoriert.struct usb_driver
, die typischerweise so angewendet wird:
#include <linux/usb.h>
static struct usb_driver sample_usb_driver ={
name:"sample",
probe:sample_probe,
disconnect:sample_disconnect,
};
int init_module(void){
/*just register it;returns 0 or error code */
return usb_register(&sample_usb_driver);
}
void cleanup_module(void){
usb_deregister(&sample_usb_driver);
}
probe
wird vom USB-Kernel-Subsystem jedes Mal aufgerufen, wenn ein neues Gerät am System angeschlossen wird, oder wenn sich beim Laden des Treibers Geräte am Bus befinden, die niemand beansprucht.sample_probe
hat nun die Aufgabe, die erhaltenen Informationen auszuwerten und passende Geräte in Besitz zu nehmen. Dazu gibt diese Funktion einen Pointer zurück, der nicht NULL ist. Dieser Zeiger dient der Identifikation des Gerätes. Gewöhnlich wird das ein Zeiger auf die gerätespezifische Datenstruktur des Treibers sein.struct urb
(USB request block) gefüllt und an usb_submit_urb
weitergegeben werden. Das passiert normalerweise in der open
-Funktion, die im device special file gespeichert ist.