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 )
{
  /* 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;
}
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.
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