GNU/Linux >> Linux Esercitazione >  >> Linux

Perché il metodo probe è necessario nei driver di dispositivo Linux oltre a init?

Init(void) // viene eseguito una volta quando il driver/modulo viene richiamato e imposta le cose per la macchina del driver del kernel.

Probe(*pdev) // viene utilizzato dalla macchina del driver del kernel secondo necessità per rilevare e installare i dispositivi effettivi


@Bandicoot :probe() verrà chiamato per assicurarsi che il dispositivo esista e che la funzionalità sia corretta. Se il dispositivo non è inseribile a caldo, la funzionalità di probe() può essere inserita nel metodo init(). Ciò ridurrà l'impronta di memoria del tempo di esecuzione del driver . Collegamento P.S.

Probe() si verifica al momento dell'avvio del dispositivo o quando il dispositivo è connesso. Per un dispositivo "piattaforma", la funzione probe viene richiamata quando viene registrato un dispositivo piattaforma e il suo nome dispositivo corrisponde al nome specificato nel driver del dispositivo. Collegamento P.S.

La funzione i2c_detect sonda l'adattatore I2C, cercando i diversi indirizzi specificati nella struttura addr_data. Se viene trovato un dispositivo, viene chiamata la funzione chip_detect. Collegamento P.S.

Un link che sicuramente chiarirà il tuo dubbio. Collegamento P.S.

Nel kernel 2.4.29, posso mostrarti come avviene il probe? Vedere di seguito (nome file: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

};

Nome file: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;
}

Pochi link importanti:

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 per kernel-2.4.29, viene chiamato quando vengono identificati il ​​fornitore e l'ID del dispositivo. Il driver del bus PCI lo fa per te. Vedere il codice seguente:

Nome file: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;
}

Gli autisti xxx_init_module() la funzione chiama pci_register_driver(struct pci_driver *drv) passando il riferimento alla struttura di tipo pci_driver . struct pci_driver è una struttura importante che tutti i driver PCI dovrebbero avere, che viene inizializzata con variabili come il nome del driver, l'elenco delle tabelle dei dispositivi PCI che il driver può supportare, le routine di callback per il sottosistema core PCI.

La struttura driver pci_driver ha importanti campi membro elencati di seguito:

  1. name – Nome del driver che è univoco tra tutti i driver PCI nel kernel. Apparirà sotto /sys/bus/pci/drivers .

  2. pci_device_id – Una tabella di dati di identificazione del dispositivo consiste nel tipo di chip supportati da questo driver.

  3. probe – L'indirizzo di xxx_probe() funzione.

  4. remove/suspend/resume/shutdown – indirizzo alla funzione che il sistema core PCI chiama quando il dispositivo PCI viene rispettivamente rimosso/sospeso/ripristinato/spegnimento. Generalmente utilizzato dai livelli superiori per la gestione dell'alimentazione.

Per ulteriori informazioni su come eseguire il sondaggio del driver dal core PCI, fare riferimento a Linux Device Driver Init.


Diversi tipi di dispositivi possono avere funzioni probe(). Ad esempio, i dispositivi PCI e USB hanno entrambi funzioni probe().

Se stai parlando di dispositivi PCI, ti consiglio di leggere il capitolo 12 di Linux Device Drivers, che copre questa parte dell'inizializzazione del driver. L'USB è trattato nel capitolo 13.

Risposta più breve, supponendo PCI:la funzione init del driver chiama pci_register_driver() che fornisce al kernel un elenco di dispositivi che è in grado di servire, insieme a un puntatore al probe() funzione. Il kernel quindi chiama il probe() del driver funzione una volta per ogni dispositivo.

Questa funzione sonda avvia l'inizializzazione per dispositivo:inizializzazione dell'hardware, allocazione delle risorse e registrazione del dispositivo con il kernel come dispositivo a blocchi o di rete o qualunque cosa sia.

Ciò rende più facile per i driver di dispositivo, perché non devono mai cercare dispositivi o preoccuparsi di trovare un dispositivo che è stato inserito a caldo. Il kernel gestisce quella parte e avvisa il driver giusto quando ha un dispositivo da gestire.


Linux
  1. Come installare un driver di dispositivo su Linux

  2. Perché abbiamo bisogno di un bootloader in un dispositivo integrato?

  3. Qual è la differenza tra un driver di piattaforma Linux e un normale driver di dispositivo?

  4. Driver di dispositivo Linux IOCTL

  5. Come trovare il driver (modulo) associato a un dispositivo su Linux?

Come installare i driver NVIDIA su Ubuntu 19.04 Disco Dingo Linux

Come installare i driver NVIDIA su Ubuntu 19.10 Eoan Ermine Linux

Come installare i driver NVIDIA su Ubuntu 20.10 Groovy Gorilla Linux

Come installare i driver NVIDIA su Ubuntu 20.04 Focal Fossa Linux

Come installare gli ultimi driver Nvidia su Linux Mint 16 Petra

Perché il video tearing è un tale problema in Linux?