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_clien
T data qui renvoie null. Je veux suivre où il se remplit.
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
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.
Aussi, regardez dans le lien suivant pour voir la discussion sur kernelnewbies.
Https://www.mail-archive.com/kernelnewbies%40kernelnewbies.org/msg12423.html
@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;
}
Considérons un exemple de platform device driver
:
La fonction de déclenchement de démarrage pour le rappel
driver->probe()
est la macromodule_init()
appelée lors du chargement du pilote; cettemacro
est définie dansinclude/linux/module.h
.module_init(my_driver_init)
a le rappel à la fonctionmy_driver_init()
.my_driver_init()
fonction devrait avoir un appel àplatform_driver_register(my_driver)
platform_driver_register(my_driver)
attribuemy_driver -> probe()
poignée pour génériquedrv -> probe()
et appelle ladriver_register(my_driver)
function.driver_register(my_driver)
la fonction ajoutemy_driver
au bus de plate-forme et appelle la fonctiondriver_attach()
.De la même manière, même le
platform_device
doit être attaché au bus de plate-forme.Enfin, seulement si le
driver_match_device()
renvoie le succès basé sur le.name
&.id_table
parmi lesdriver
correspond à la liste des périphériques de plate-forme qui provient soit deACPI/DTS
, alors ledriver_probe_device()
est appelé qui a le rappeldrv->probe()
.
La fonction sonde sera appelée pour chaque interface du périphérique détecté sauf celles qui sont déjà enregistrées.
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.