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.