5. Vue d'ensemble de la programmation des périphériques

Contenu de cette section

Le fichier d'en-tête drivers/scsi/sg.h dans l'arborescence des sources Linux contient une description de l'interface (ce qui suit est fondé sur la version 1.1.68 du noyau)~:

struct sg_header
 {
  int pack_len;
                   /* longueur du paquet entrant <4096 (y compris en-tete) */
  int reply_len;   /* longueur maxi de reponse attendue <4096 */
  int pack_id;     /* numero id du paquet */
  int result;      /* 0==ok, sinon voir les codes errno */
  unsigned int twelve_byte:1;
          /* Force la longueur a 12 pour les commandes des groupes 6 &amp; 7 */
  unsigned int other_flags:31;                  /* pour usage futur */
  unsigned char sense_buffer[16]; /* utilise seulement en lecture */
  /* la commande suit puis les donnees de la commande */
 };

Cette structure décrit comment une commande SCSI doit être traitée et disposer d'espace pour le résultat de son exécution. Les composants individuels de la structure seront abordés plus loin à la section sec-header .

La méthode générale pour échanger des données avec le pilote générique est la suivante~: pour envoyer une commande à un périphérique générique ouvert, il faut effectuer un write() d'un bloc composé de trois parties~:

                             struct sg_header
                               commande SCSI
                             donnees en sortie

Pour obtenir le résultat d'une commande, il faut effectuer un read() d'un bloc composé des trois parties (similaires)~:

                             struct sg_header
                             donnees en entree

Il s'agit d'une vue générale du processus. Les sections qui suivent décrivent chaque étape en détail.

NOTE~: jusqu'à de récentes versions du noyau, il reste nécessaire de bloquer le signal SIGINT entre les appels correspondants de write() et de read() (i.e. par sigprocmask()). Un return après la partie write() sans le read() suivant pour lire les résultats va bloquer les accès suivants. Ce blocage de signal n'a pas encore été inclus dans le code exemple. Evitez donc d'envoyer un SIGINT (par ˆC, par exemple) lors du test de ceux-ci.


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre