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

Contenu de cette section

Le fichier d'inclusion include/scsi/sg.h contient une description de l'interface (celle du noyau 1.3.98) :

struct sg_header
 {
                        /*
                         * longueur du paquet entrant (y compris en-tete)
                         */
  int pack_len;
                        /*
                         * taille max de la reponse attendue
                         */
  int reply_len;
                        /*
                         * numero d'id du paquet
                         */
  int pack_id;
                        /*
                         * 0 == ok,
                         * pour les autres, voir les codes pour errno
                         */
  int result;
                        /*
                         * Force la longueur a 12 pour les commandes des
                         * groupes 6 & 7
                         */
  unsigned int twelve_byte:1;
                        /*
                         * pour utilisation future
                         */
  unsigned int other_flags:31;
                        /*
                         * uniquement utilise lors des lectures
                         */
  unsigned char sense_buffer[16];
                        /*
                         * la commande suit puis les donnees de la
                         * commande
                         * .............
                         */

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

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 écrire (write()) un bloc composé des trois parties suivantes :

                             struct sg_header
                               commande SCSI
                     donnees envoyees avec la commande

Pour obtenir le résultat d'une commande, il faut lire (read()) un bloc composés des parties suivantes (similaires à l'écriture) :

                             struct sg_header
                             donnees en entree

Il s'agit d'une vue générale de la procédure. Les sections qui suivent décrivent chaque étape en détail.

NOTE : jusqu'à de récentes versions du noyau, il était nécessaire de bloquer le signal SIGINT entre les appels write() et le read() correspondant (par exemple, par sigprocmask()). Un retour après la partie écriture sans lecture pour récupérer les résultats va bloquer les accès suivants. Le blocage du signal n'a pas encore été inclus dans le code des exemples. 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