<HTML> <HEAD> <TITLE>Exemple d'utilisation du tampon SCSI</TITLE> </HEAD> <BODY> <H1>11. <A NAME="s11"></A>Exemple d'utilisation du tampon SCSI</H1> <P> <A HREF="SCSI-Programming-HOWTO.html#toc11">Contenu de cette section</A></P> <P>Nous allons utiliser ici la commande "TEST UNIT READY" pour contrôler si un support est chargé dans notre périphérique. Les déclarations d'en-tête et la fonction <CODE>handle_SCSI_cmd</CODE> de l'exemple de "Inquiry" seront aussi nécessaires.</P> <P></P> <P> <BLOCKQUOTE><CODE> <PRE> Table 73: Commande TEST UNIT READY +=====-========-========-========-========-========-========-========-========+ | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |Octet| | | | | | | | | |=====+=======================================================================| | 0 | Code operation (00h) | |-----+-----------------------------------------------------------------------| | 1 |Numero d'unite logique LUN| Reserve | |-----+-----------------------------------------------------------------------| | 2 | Reserve | |-----+-----------------------------------------------------------------------| | 3 | Reserve | |-----+-----------------------------------------------------------------------| | 4 | Reserve | |-----+-----------------------------------------------------------------------| | 5 | Controle | +=============================================================================+ </PRE> </CODE></BLOCKQUOTE> </P> <P>Voici la fonction qui l'implémente :</P> <P> <BLOCKQUOTE><CODE> <PRE> #define TESTUNITREADY_CMD 0 #define TESTUNITREADY_CMDLEN 6 #define ADD_SENSECODE 12 #define ADD_SC_QUALIFIER 13 #define NO_MEDIA_SC 0x3a #define NO_MEDIA_SCQ 0x00 int TestForMedium ( void ) { /* demande le statut READY */ static unsigned char cmdblk [TESTUNITREADY_CMDLEN] = { TESTUNITREADY_CMD, /* commande */ 0, /* lun/reserve */ 0, /* reserve */ 0, /* reserve */ 0, /* reserve */ 0};/* controle */ memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) ); /* * +------------------+ * | struct sg_header | <- commande * +------------------+ * | copie de cmdblk | <- commande + SCSI_OFF * +------------------+ */ if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd, 0, NULL)) { fprintf (stderr, "Unite non prete\n"); exit(2); } return *(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) != NO_MEDIA_SC || *(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) != NO_MEDIA_SCQ; } </PRE> </CODE></BLOCKQUOTE> </P> <P>Nous pouvons maintenant réaliser le contrôle à l'aide de la fonction <CODE>main</CODE> :</P> <P> <BLOCKQUOTE><CODE> <PRE> void main( void ) { fd = open(DEVICE, O_RDWR); if (fd < 0) { fprintf( stderr, "Il faut les permissions lecture/ecriture pour "DEVICE".\n" ); exit(1); } /* on regarde si le support est charge */ if (!TestForMedium()) { printf("le support n'est pas charge\n"); } else { printf("le support est charge\n"); } } </PRE> </CODE></BLOCKQUOTE> </P> <P>Le fichier <CODE>generic_demo.c</CODE> en annexe contient les deux exemples.</P> <P></P> <HR> <P> Chapitre <A HREF="SCSI-Programming-HOWTO-12.html">suivant</A>, Chapitre <A HREF="SCSI-Programming-HOWTO-10.html">Précédent</A> <P> Table des matières de <A HREF="SCSI-Programming-HOWTO.html#toc11">ce chapitre</A>, <A HREF="SCSI-Programming-HOWTO.html#toc">Table des matières</A> générale</P> <P> <A HREF="SCSI-Programming-HOWTO.html">Début</A> du document, <A HREF="#0"> Début de ce chapitre</A></P> </BODY> </HTML>