web-dev-qa-db-fra.com

Qui appelle la sonde () du pilote

Comment l'appel probe() est-il appelé? Qui l'appelle? Selon ma compréhension, __init() enregistre driver, puis probe() est appelé pour register les données de périphérique et irq etc. 

Je travaille sur le pilote d'écran tactile et son __init s'enregistre lui-même auprès de i2c driver. Examinez ensuite les données i2c_client qui renvoient null. Je veux suivre où il est rempli.

35
iSegFault

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 la probe() de cette structure bus_type. 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 appareil)
  • driver_probe_device
  • vraiment_probe
  • i2c_device_probe (c'est ce que dev-> bus-> sonde est pour un pilote i2c)
  • votre_probe_function
35
Mircea

J'ai préparé un graphique qui trace la fonction de sonde du lecteur de plate-forme. Vous travaillez avec un pilote I2C dont AFAIK est un pilote de plate-forme. J'espère que cela vous aide à identifier le problème.

 enter image description here

Regardez également le lien suivant pour voir la discussion sur kernelnewbies.

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

11
Sunil Shahu

@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 hot-pluggable, la fonctionnalité de probe () peut être insérée dans la méthode init (). réduire l'encombrement de la mémoire lors de l'exécution du pilote. P.S link

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 appelée lorsqu'un périphérique de la plate-forme est enregistré et que son nom de périphérique correspond au nom spécifié dans le pilote de périphérique. P.S link

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 appelée. P.S lien .

Un lien qui effacera sûrement votre doute. P.S link

Dans le noyau 2.4.29, je peux vous montrer comment se fait la détection? 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 kernel-2.4.29, il est appelé lorsque le fournisseur et l'ID de 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;
}
2
Manish

Considérons un exemple de platform device driver:

  1. La fonction de déclenchement de départ 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(). La fonction my_driver_init() devrait avoir un appel à platform_driver_register(my_driver)

  3. platform_driver_register(my_driver) attribue le handle my_driver -> probe() à la fonction drv -> probe() et appelle la fonction driver_register(my_driver).

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

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

  6. Enfin, si la fonction driver_match_device() renvoie succès, en fonction des correspondances .name et .id_table de la variable driver figurant dans la liste des périphériques de la plate-forme provenant de ACPI/DTS, la fonction driver_probe_device() est appelée et comporte le rappel drv->probe().

2
Sachin Mokashi

La fonction de sonde sera appelée pour chaque interface du périphérique détecté, à l'exception de celles déjà enregistrées. 

1
Anubhav Gupta

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, par exemple, 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),
                 },

Remarque: lorsque le nom (l3Gd20_gyr) du pilote et du périphérique correspondra, votre sonde sera appelée.

0
Deepak Singh