GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi la méthode probe est-elle nécessaire dans les pilotes de périphériques Linux en plus de init ?

Init(void) // s'exécute une fois lorsque le pilote/module est appelé et configure les choses pour la machine du pilote du noyau.

Probe(*pdev) // est utilisé par la machine du pilote du noyau selon les besoins pour détecter et installer les périphériques réels


@Bandicoot :probe() sera appelé pour s'assurer que le périphérique existe et que la fonctionnalité est correcte. Si le périphérique n'est pas enfichable à chaud, la fonctionnalité de probe() peut être placée dans la méthode init(). Cela réduira l'empreinte mémoire du pilote. . Lien PS

Probe() se produit au moment du démarrage du périphérique ou lorsque le périphérique est connecté. Pour un périphérique "plate-forme", la fonction de sonde est invoquée lorsqu'un périphérique de plate-forme est enregistré et que son nom de périphérique correspond au nom spécifié sur le pilote de périphérique. Lien PS

La fonction i2c_detect sonde l'adaptateur I2C, recherchant les différentes adresses spécifiées dans la structure addr_data. Si un périphérique est trouvé, la fonction chip_detect est alors appelée. Lien PS.

Un lien qui dissipera sûrement votre doute. Lien PS

Dans le noyau 2.4.29, je peux vous montrer comment se passe la sonde ? Veuillez voir ci-dessous (nom du fichier :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

} ;

Nom du fichier :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;
}

Quelques liens importants :

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

Dans PCI pour le noyau 2.4.29, il est appelé lorsque le fournisseur et l'identifiant du périphérique sont identifiés. Le pilote de bus PCI le fait pour vous. Veuillez voir le code ci-dessous :

Nom du fichier :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;
}

Les chauffeurs xxx_init_module() appels de fonction pci_register_driver(struct pci_driver *drv) en passant une référence à une structure de type pci_driver . struct pci_driver est une structure importante que tous les pilotes PCI devraient avoir, qui est initialisée avec des variables telles que le nom des pilotes, la liste des périphériques PCI que le pilote peut prendre en charge, les routines de rappel pour le sous-système central PCI.

La structure des pilotes pci_driver comporte des champs membres importants répertoriés ci-dessous :

  1. name – Nom du pilote unique parmi tous les pilotes PCI du noyau. Il apparaîtra sous /sys/bus/pci/drivers .

  2. pci_device_id - Un tableau de données d'identification de périphérique comprend le type de puces prises en charge par ce pilote.

  3. probe – L'adresse de xxx_probe() fonction.

  4. remove/suspend/resume/shutdown – adresse à la fonction que le système central PCI appelle lorsque le périphérique PCI est retiré/suspendu/repris/arrêt respectivement. Généralement utilisé par les couches supérieures pour la gestion de l'alimentation.

Pour plus d'informations sur la façon dont le sondage du pilote est exécuté à partir du cœur PCI, reportez-vous à Linux Device Driver Init.


Différents types de périphériques peuvent avoir des fonctions probe(). Par exemple, les périphériques PCI et USB ont tous deux des fonctions probe().

Si vous parlez de périphériques PCI, je vous recommande de lire le chapitre 12 de Linux Device Drivers, qui couvre cette partie de l'initialisation du pilote. L'USB est couvert au chapitre 13.

Réponse plus courte, en supposant que PCI :la fonction d'initialisation du pilote appelle pci_register_driver() qui donne au noyau une liste des périphériques qu'il est capable de desservir, ainsi qu'un pointeur vers le probe() fonction. Le noyau appelle alors le probe() du pilote fonction une fois pour chaque appareil.

Cette fonction de sonde démarre l'initialisation par périphérique :initialisation du matériel, allocation des ressources et enregistrement du périphérique auprès du noyau en tant que bloc ou périphérique réseau ou quoi que ce soit.

Cela facilite la tâche des pilotes de périphériques, car ils n'ont jamais besoin de rechercher des périphériques ni de s'inquiéter de trouver un périphérique branché à chaud. Le noyau gère cette partie et avertit le bon pilote lorsqu'il a un périphérique à gérer.


Linux
  1. Linux :Comment trouver le pilote de périphérique utilisé pour un périphérique ?

  2. Linux - Comment le noyau Linux connaît-il les numéros majeurs et mineurs des périphériques ?

  3. Pourquoi les écouteurs coûteux sonnent-ils bon marché sous Linux ? Les pilotes sont nuls ?

  4. Pourquoi avons-nous besoin d'un bootloader dans un appareil embarqué ?

  5. Quelle est la différence entre un pilote de plate-forme Linux et un pilote de périphérique normal ?

Comment installer les pilotes NVIDIA sur Ubuntu 19.04 Disco Dingo Linux

Comment installer les pilotes NVIDIA sur Ubuntu 19.10 Eoan Ermine Linux

Comment installer les pilotes NVIDIA sur Ubuntu 20.10 Groovy Gorilla Linux

Comment installer les pilotes NVIDIA sur Ubuntu 20.04 Focal Fossa Linux

Comment installer les derniers pilotes Nvidia sur Linux Mint 16 Petra

Pourquoi le déchirement vidéo est-il un tel problème sous Linux ?