Plateforme
Introduction
Pour les périphériques, le noyau Linux a développé un bus plateforme, lequel supporte des pilotes pour la gestion de ces périphériques ne faisant pas partie d’un type de bus avec une détection dynamique.
L’interface <linux/platform_device.h>
offre des méthodes/services pour
créer simplement des fichiers d’accès aux attributs des pilotes et
périphériques
les pilotes (driver)
La structure struct platform_driver
permet de spécifier les méthodes et services d’un pilote plateforme
struct platform_driver {
int (*probe) (struct platform_device *);
int (*remove) (struct platform_device *);
void (*shutdown) (struct platform_device *);
int (*suspend) (struct platform_device *, pm_message_t);
int (*resume) (struct platform_device *);
struct device_driver driver;
// ...
};
probe
: méthode pour l’instanciation du périphérique. Cette méthode n’est appelée que si lors de l’enregistrement du pilote, celui-ci trouve un string de compatibilité dans le Device Treeremove
: méthode pour la destruction du périphérique. Cette méthode est appelée lors du dé-enregistrement du piloteshutdown
: méthode pour la destruction du périphérique. Cette méthode est appelée lorsque le système Linux est éteint (shutdown)suspend
etresume
sont des méthodes appelées lors de la mise en sommeil et réveil du pilote.driver
attribut décrivant le pilotename
attribut pour spécifier le nom du pilote, lequel sera visible sous/sys
of_match_table
pointe sur la table des strings de compatibilité
La macro platform_driver_register et la méthode platform_driver_unregister permettent d’enregistrer/de libérer le pilote.
int platform_driver_register (struct platform_driver *);
void platform_driver_unregister (struct platform_driver *);
Ces méthodes doivent simplement être appelées dans les méthodes init
et exit
du module.
Les périphériques (device)
Dans le cas d’un périphérique appartenant à la plateforme, on peut également utiliser les
méthodes de l’interface <linux/platform_device.h>
La structure struct platform_device
permet de spécifier les attributs du périphérique :
struct platform_device {
const char* name;
int id;
struct device dev; // -> a release method should be attached
u32 num_resources;
struct resource *resource;
};
- Cette structure permet de spécifier le nom du périphérique, le numéro d’instance
(
id
, -1 s’il n’existe qu’une instance), ainsi que les ressources utilisées par le périphérique. - Si le périphérique implémente les services d’un char device, le numéro de
périphérique obtenu lors de l’instanciation du
cdev
devra être assigné à l’attribut.dev.devt
. Cette opération permettra au noyau Linux de créer le fichier d’accès dans/dev
Les méthodes platform_device_register
et
platform_device_unregister
permettent d’enregistrer/de libérer le périphérique.
int platform_device_register (struct platform_device *);
void platform_device_unregister (struct platform_device *);
Miscdevice
La structure struct miscdevice
définie dans l’interface <linux/miscdevice.h>
simplifie l’instanciation du périphérique avec la
création d’un fichier d’accès sous /dev
.
struct miscdevice {
int minor;
const char *name;
const struct file_operations *fops;
// ...
struct device *this_device;
umode_t mode;
};
minor
minor device number du périphérique, utiliserMISC_DYNAMIC_MINOR
pour obtenir dynamiquement un numéro mineurname
nom du périphérique, ce nom sera également le nom du fichier d’accèsfops
pointeur sur la structure contenant les opérations sur le fichier d’accès (struct file_operations
)mode
définit les droits sur fichier d’accès sous /dev
Les méthodes misc_register
et misc_deregister
permettent d’enregistrer/de libérer le périphérique :
int misc_register (struct miscdevice *);
void misc_deregister (struct miscdevice *);