Page suivantePage précédenteTable des matières

11. Exemple d'utilisation du tampon SCSI

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 handle_SCSI_cmd de l'exemple de "Inquiry" seront aussi nécessaires.

 Table 73: Commande TEST UNIT READY
+=====-========-========-========-========-========-========-========-========+
|  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
|Octet|        |        |        |        |        |        |        |        |
|=====+=======================================================================|
| 0   |                           Code opération (00h)                        |
|-----+-----------------------------------------------------------------------|
| 1   |Numero d'unité logique LUN|                  Réservé                   |
|-----+-----------------------------------------------------------------------|
| 2   |                           Réservé                                     |
|-----+-----------------------------------------------------------------------|
| 3   |                           Réservé                                     |
|-----+-----------------------------------------------------------------------|
| 4   |                           Réservé                                     |
|-----+-----------------------------------------------------------------------|
| 5   |                           Contrôle                                    |
+=============================================================================+

Voici la fonction qui l'implémente :

#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/réservé */
 0, /* réservé */
 0, /* réservé */
 0, /* réservé */
 0};/* contrôle */
 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;
}

Nous pouvons maintenant réaliser le contrôle à l'aide de la fonction main :

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");
 }
}

Le fichier generic_demo.c en annexe contient les deux exemples.


Page suivantePage précédenteTable des matières