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 :
-
name
– Nom du pilote unique parmi tous les pilotes PCI du noyau. Il apparaîtra sous/sys/bus/pci/drivers
. -
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. -
probe
– L'adresse dexxx_probe()
fonction. -
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.