Init(void) // wird einmal ausgeführt, wenn der Treiber/das Modul aufgerufen wird, und richtet Dinge für die Kernel-Treibermaschine ein.
Probe(*pdev) // wird von der Kernel-Treibermaschine nach Bedarf verwendet, um tatsächliche Geräte zu erkennen und zu installieren
@Bandicoot :probe() wird aufgerufen, um sicherzustellen, dass das Gerät existiert und die Funktionalität in Ordnung ist. Wenn das Gerät nicht Hot-Plug-fähig ist, kann die Funktionalität von probe() in die init()-Methode eingefügt werden. Dadurch wird der Speicherbedarf des Treibers zur Laufzeit verringert . PS-Link
Probe() geschieht zum Zeitpunkt des Gerätestarts oder wenn das Gerät verbunden ist. Für ein "Plattform"-Gerät wird die Sondenfunktion aufgerufen, wenn ein Plattformgerät registriert ist und sein Gerätename mit dem im Gerätetreiber angegebenen Namen übereinstimmt. PS-Link
Die Funktion i2c_detect prüft den I2C-Adapter und sucht nach den verschiedenen Adressen, die in der addr_data-Struktur angegeben sind. Wenn ein Gerät gefunden wird, wird die Funktion chip_detect aufgerufen. PS-Link.
Ein Link, der Ihre Zweifel sicherlich ausräumen wird. PS-Link
In Kernel 2.4.29 kann ich Ihnen zeigen, wie Sonden passieren? Siehe unten (Dateiname:drivers/acorn/char/pcf8583.c )
static struct i2c_driver pcf8583_driver = {
name: "PCF8583",
id: I2C_DRIVERID_PCF8583,
flags: I2C_DF_NOTIFY,
attach_adapter: pcf8583_probe, /* This will be called from i2c-core.c P.S see below function i2c_add_driver()*/
detach_client: pcf8583_detach,
command: pcf8583_command
};
Dateiname:drivers/i2c/i2c-core.c
int i2c_add_driver(struct i2c_driver *driver)
{
........................
........................
/* now look for instances of driver on our adapters
*/
if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {
for (i=0;i<I2C_ADAP_MAX;i++)
if (adapters[i]!=NULL)
/* Ignore errors */
driver->attach_adapter(adapters[i]); /*This is a location from where probe is called. Pointer **driver** is of type **pcf8583_driver** which you have passed into this function*/
}
ADAP_UNLOCK();
return 0;
}
Einige wichtige Links:
1) http://www.slideshare.net/varunmahajan06/i2c-subsystem-in-linux2624
2) http://www.programering.com/a/MjNwcTMwATM.html
3) http://www.linuxjournal.com/article/6717
4) http://www.developermemo.com/2943157/
5) http://free-electrons.com/doc/kernel-architecture.pdf
6) http://www.techques.com/question/1-3014627/Probe-problem-when-writing-a-I2C-device-driver
In PCI für Kernel-2.4.29 wird es aufgerufen, wenn Anbieter und Geräte-ID identifiziert werden. PCI-Bustreiber erledigen dies für Sie. Bitte sehen Sie sich den folgenden Code an:
Dateiname:drivers/pci/pci.c
static int pci_announce_device(struct pci_driver *drv, struct pci_dev *dev)
{
const struct pci_device_id *id;
int ret = 0;
if (drv->id_table) {
id = pci_match_device(drv->id_table, dev); /* check for device presence*/
if (!id) {
ret = 0;
goto out;
}
} else
id = NULL;
dev_probe_lock();
if (drv->probe(dev, id) >= 0) { /* This is a location from where probe is called*/
dev->driver = drv;
ret = 1;
}
dev_probe_unlock();
out:
return ret;
}
Die Treiber xxx_init_module()
Funktion ruft pci_register_driver(struct pci_driver *drv)
auf durch Übergeben einer Referenz auf eine Struktur vom Typ pci_driver
. struct pci_driver
ist eine wichtige Struktur, die alle PCI-Treiber haben sollten und die mit Variablen wie Treibernamen, Tabellenliste der PCI-Geräte, die der Treiber unterstützen kann, Callback-Routinen für das PCI-Core-Subsystem initialisiert wird.
Die Treiber pci_driver-Struktur hat wichtige Mitgliedsfelder, die unten aufgelistet sind:
-
name
– Name für den Treiber, der unter allen PCI-Treibern im Kernel eindeutig ist. Es erscheint unter/sys/bus/pci/drivers
. -
pci_device_id
– Eine Tabelle mit Geräteidentifikationsdaten enthält die Chiptypen, die dieser Treiber unterstützt. -
probe
– Die Adresse vonxxx_probe()
Funktion. -
remove/suspend/resume/shutdown
– Adresse an die Funktion, die das PCI-Kernsystem aufruft, wenn das PCI-Gerät entfernt/unterbrochen/wieder aufgenommen/heruntergefahren wird. Wird im Allgemeinen von oberen Schichten für die Energieverwaltung verwendet.
Weitere Informationen darüber, wie das Testen des Treibers vom PCI-Kern ausgeführt wird, finden Sie unter Linux Device Driver Init.
Verschiedene Gerätetypen können probe()-Funktionen haben. Zum Beispiel haben sowohl PCI- als auch USB-Geräte probe()-Funktionen.
Wenn Sie über PCI-Geräte sprechen, würde ich Ihnen empfehlen, Kapitel 12 von Linux Device Drivers zu lesen, das diesen Teil der Treiberinitialisierung behandelt. USB wird in Kapitel 13 behandelt.
Kürzere Antwort, PCI vorausgesetzt:Die Init-Funktion des Treibers ruft pci_register_driver()
auf was dem Kernel eine Liste von Geräten gibt, die er bedienen kann, zusammen mit einem Zeiger auf probe()
Funktion. Der Kernel ruft dann den probe()
des Treibers auf Funktion einmal für jedes Gerät.
Diese Prüffunktion startet die Initialisierung pro Gerät:Initialisierung der Hardware, Zuweisung von Ressourcen und Registrierung des Geräts beim Kernel als Block- oder Netzwerkgerät oder was auch immer es ist.
Das macht es für Gerätetreiber einfacher, da sie nie nach Geräten suchen oder sich Gedanken darüber machen müssen, ein Gerät zu finden, das im laufenden Betrieb angeschlossen wurde. Der Kernel kümmert sich um diesen Teil und benachrichtigt den richtigen Treiber, wenn er ein Gerät hat, das Sie handhaben können.