Qui appelle la sonde () du pilote

Comment l'appel probe() est-il appelé? Qui l'appelle? Selon ma compréhension, __init() registres de driver, puis en quelque sorte probe() est appelé à register les données de l'appareil et irq, etc. Exactement comment ça se passe?

Je travaille sur le pilote d'écran tactile et son __init s'enregistre sur i2c driver. Ensuite, sondez expect i2c_clienT data qui renvoie null. Je veux suivre où il se remplit.

33
demandé sur Sachin Mokashi 2011-09-28 09:07:28

6 réponses

Longue histoire courte: la fonction probe () du pilote est appelée à la suite de l'appel du register_driver pour ce bus spécifique. Plus précisément, il est appelé par le probe() de bus_type structure. Dans votre cas: i2c_bus_type.

Voici la chaîne d'appels dans votre cas I2C:

  • i2c_register_driver
  • driver_register
  • bus_add_driver
  • driver_attach
  • _ _ driver_attach (pour votre dispositif)
  • driver_probe_device
  • really_probe
  • i2c_device_probe (c'est ce que dev->bus>sonde est un pilote i2c)
  • your_probe_function
34
répondu Mircea 2012-09-28 19:34:21

J'ai préparé un graphique qui trace la fonction de sonde de platform drive. Vous travaillez avec le pilote I2C qui AFAIK est un pilote de plate-forme. J'espère que cela vous aidera à tracer le problème.

entrez la description de l'image ici

Aussi, regardez dans le lien suivant pour voir la discussion sur kernelnewbies.

Https://www.mail-archive.com/kernelnewbies%40kernelnewbies.org/msg12423.html

10
répondu Sunil Shahu 2015-10-14 06:47:27

@iSegFault : 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 mise dans la méthode init ().Cela réduira l'empreinte mémoire du pilote lors de l'exécution. P. S lien

Sonde () se produit au moment du démarrage de l'appareil ou lorsque l'appareil est connecté.Pour un périphérique" plate-forme", la fonction de sonde est appelé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. P. S lien

La fonction i2c_detect sonde l'adaptateur I2C, en 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. P. S lien.

Un lien qui va sûrement effacer votre doute. P. S lien

Dans le noyau 2.4.29, je peux vous montrer comment ne sonde arriver ? Veuillez voir ci-dessous (Nom du fichier: pilotes/gland/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: pilotes / 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 kernel-2.4.29, il est appelé lorsque le fournisseur et l'ID de périphérique sont identifiés. Le conducteur de bus PCI le fait pour vous. Veuillez voir le code ci-dessous:

Nom du fichier: pilotes / 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;
}
2
répondu Manish 2015-03-03 19:18:53

Considérons un exemple de platform device driver:

  1. La fonction de déclenchement de démarrage pour le rappel driver->probe() est la macro module_init() appelée lors du chargement du pilote; cette macro est définie dans include/linux/module.h.

  2. module_init(my_driver_init) a le rappel à la fonction my_driver_init(). my_driver_init() fonction devrait avoir un appel à platform_driver_register(my_driver)

  3. platform_driver_register(my_driver) attribue my_driver -> probe() poignée pour générique drv -> probe() et appelle la driver_register(my_driver) function.

  4. driver_register(my_driver) la fonction ajoute my_driver au bus de plate-forme et appelle la fonction driver_attach().

  5. De la même manière, même le platform_device doit être attaché au bus de plate-forme.

  6. Enfin, seulement si le driver_match_device() renvoie le succès basé sur le .name & .id_table parmi les driver correspond à la liste des périphériques de plate-forme qui provient soit de ACPI/DTS, alors le driver_probe_device() est appelé qui a le rappel drv->probe().

2
répondu Sachin Mokashi 2016-12-21 08:20:29

La fonction sonde sera appelée pour chaque interface du périphérique détecté sauf celles qui sont déjà enregistrées.

1
répondu Anubhav Gupta 2015-03-31 12:51:02

La fonction de sonde sera appelée lorsque name fera correspondre la structure des pilotes de formulaire à la structure du périphérique. Ci-dessous mentionné par exemple pour la structure du pilote et du périphérique.

1: Structure Du Conducteur

 static struct driver your_driver = {
        .driver = {
              .name = YUR_NAME,

                  },

Par exemple.

static struct i2c_driver l3gd20_driver = {
        .driver = {

                        .name = l3gd20_gyr,

                   }

2: Structure De L'Appareil

static structure device  your_devices = {
              .name = YUR_NAME,
              },

Par exemple.

static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
                {
                I2C_BOARD_INFO("l3gd20_gyr", 0x6a),
                 },

Note: Lorsque le nom (l3gd20_gyr) du pilote et du périphérique correspondra à votre sonde recevra un appel.

0
répondu Deepak Singh 2017-09-07 06:50:08