Pour allouer dynamiquement des numéros de périphérique disponibles par le noyau Linux, on utilise la fonction suivante :
// Retourne le numéro de périphérique alloué, numéro mineur de départ,
// nombre de numéros mineurs consécutifs demandés, nom du périphérique
int allouer_region_periph(dev_t *periph, unsigned mineur_min, unsigned nombre, const char *nom)
Si vous connaissez déjà les numéros de périphérique à utiliser, vous pouvez les allouer statiquement avec :
// Numéro de périphérique à allouer, nombre de périphériques, nom du périphérique
int enregistrer_region_periph(dev_t periph, unsigned nombre, const char* nom)
Note : enregistrer_region_periph ne fait que réserver les numéros, tandis que enregistrer_periph effectue une registration complète : allocation automatique des numéros, création de la structure cdev et association avec les opérations de fichier.
Pour la désallocation :
void desenregistrer_region_periph(dev_t debut, unsigned nombre)
Enregistrement et désenregistrement du pilote
Déclaration de la variable cdev :
struct cdev pilote_cdev;
Initialisation de la structure :
void initialiser_cdev(struct cdev *cdev, const struct file_operations *ops_fichier);
Ajout du périphérique caractère :
int ajouter_cdev(struct cdev *pointeur, dev_t periph, unsigned nombre)
Suppression du pilote :
void supprimer_cdev(struct cdev *pointeur)
Création automatique des nœuds de périphérique
La création des nœuds de périphérique s'effectue dans la fonction d'entrée du pilote. Tout d'abord, nous devons créer une classe :
struct class *classe_creation(struct module *proprietaire, const char *nom)
Le désenregistrement du pilote nécessite la suppression de la classe avec la fonction detruire_classe :
void detruire_classe(struct class *classe);
Après avoir créé la classe, nous devons y ajouter un périphérique en utilisant la fonction creer_periph :
struct device *creer_periph(struct class *classe, struct device *parent, dev_t periph, void *donnees, const char* format, ...)
La suppression du périphérique se fait avec detruire_periph :
void detruire_periph(struct class *classe, dev_t periph)
Il suffit d'appeler ces fontcions dans les fonctions d'entrée et de sortie pour activer la création et la suppression automatiques des nœuds.
Données privées du périphérique
Dans la fonction d'ouverture du pilote, nous pouvons associer une structure de périphérique comme données privées au fichier du périphérique :
/* Structure de périphérique */
struct equipement_test{
dev_t identifiant; /* Identifiant du périphérique */
struct cdev cdev; /* Structure cdev */
struct class *classe; /* Classe */
struct device *periph; /* Périphérique */
int majeur; /* Numéro majeur */
int mineur; /* Numéro mineur */
};
struct equipement_test equipement;
/* Fonction d'ouverture */
static int equipement_ouvrir(struct inode *inoeud, struct file *fichier)
{
fichier->private_data = &equipement; /* Définition des données privées */
return 0;
}