GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum wird die Probe-Methode zusätzlich zu init in Linux-Gerätetreibern benötigt?

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:

  1. name – Name für den Treiber, der unter allen PCI-Treibern im Kernel eindeutig ist. Es erscheint unter /sys/bus/pci/drivers .

  2. pci_device_id – Eine Tabelle mit Geräteidentifikationsdaten enthält die Chiptypen, die dieser Treiber unterstützt.

  3. probe – Die Adresse von xxx_probe() Funktion.

  4. 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.


Linux
  1. Linux:So finden Sie den für ein Gerät verwendeten Gerätetreiber

  2. Linux – Warum kann der Kernel Init nicht ausführen?

  3. Warum kann ich die Linux-Anzeige nicht exportieren?

  4. Warum teure Kopfhörer unter Linux billig klingen – die Treiber sind scheiße?

  5. Warum brauchen wir einen Bootloader in einem eingebetteten Gerät?

So installieren Sie die NVIDIA-Treiber unter Ubuntu 19.04 Disco Dingo Linux

So installieren Sie die NVIDIA-Treiber unter Ubuntu 19.10 Eoan Ermine Linux

So installieren Sie die NVIDIA-Treiber unter Ubuntu 20.10 Groovy Gorilla Linux

So installieren Sie die NVIDIA-Treiber unter Ubuntu 20.04 Focal Fossa Linux

So installieren Sie die neuesten Nvidia-Treiber unter Linux Mint 16 Petra

Warum ist das Zerreißen von Videos unter Linux ein solches Problem?