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_clien
t qui renvoient null. Je veux suivre où il est rempli.
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:
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.
Regardez également 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 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;
}
Considérons un exemple de platform device driver
:
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
.
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)
platform_driver_register(my_driver)
attribue le handle my_driver -> probe()
à la fonction drv -> probe()
et appelle la fonction driver_register(my_driver)
.
La fonction driver_register(my_driver)
ajoute my_driver
au bus de la plate-forme et appelle la fonction driver_attach()
.
De la même manière, même le platform_device
doit être connecté au bus de la plate-forme.
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()
.
La fonction de sonde sera appelée pour chaque interface du périphérique détecté, à l'exception de celles 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, 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.