10. Exemple d'utilisation du tampon SCSI

Contenu de cette section

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 operation (00h)                        |
|-----+-----------------------------------------------------------------------|
| 1   |Numero d'unite logique LUN|                  Reserve                   |
|-----+-----------------------------------------------------------------------|
| 2   |                           Reserve                                     |
|-----+-----------------------------------------------------------------------|
| 3   |                           Reserve                                     |
|-----+-----------------------------------------------------------------------|
| 4   |                           Reserve                                     |
|-----+-----------------------------------------------------------------------|
| 5   |                           Controle                                    |
+=============================================================================+

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 )
{
  /* request READY status */
  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;
}

Nous pouvons réaliser le contrôle à l'aide de cette 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 est decharge\n");
  } else {
    printf("le support est charge\n");
  }
}

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


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