# Commande SCSI

Dans l'architecture SCSI chaque équipement connecté au bus peut envoyer un ordre à n'importe quel autre. Le format de cet ordre ou commande SCSI est normalisé pour garantir l'interopérabilité (ainsi un disque dur de n'importe quel fabricant fonctionnera de la même façon une fois connecté à un contrôleur SCSI employé sur un serveur.)

## Format d'une commande

Les commandes sont envoyées en respectant un format appelé CDB pour Command Descriptor Block. Historiquement le format des commandes SCSI employait un nombre d'octets prédéterminé (6, 10, 12 ou 16 octets), les commandes les plus récentes emploient un nombre variable d'octets, voici par exemple la description de la commande READ (6) :
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | (MSB) | | | | |
| 2 | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire |
| 3 | | | | | | | | (LSB) |
| 4 | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire |
| 5 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |
Un bloc est la capacité minimale transférable de/vers le support de stockage, le plus souvent il fait 512 octets pour un disque dur mais comme ce n'est pas nécessairement le cas, la commande READ CAPACITY permet à l'ordinateur y accédant de déterminer la taille exacte de l'unité de stockage manipulée par le support.
Les commandes varient selon la catégorie de l'équipement connecté au bus SCSI (disques durs, lecteurs de bandes magnétiques, robots de sauvegarde, tiroirs de disques, etc.) Il existe un ensemble commun de commandes que tout équipement implémente et des versions spécifiques selon la catégorie de l'équipement. Le format CDB est spécifié dans le document d'architecture générale SCSI.

## Exemples de commandes

Ces commandes correspondent à la norme ANSI INCITS 408-2005. L'exemple READ vient de la norme ANSI INCITS 405-2005.

### Test Unit Ready

Cette commande permet de demander à un périphérique s'il est prêt à transférer des données, i.e. le disque dur est en rotation, la bande dans un lecteur est chargée et prête, etc.
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY | 0 = commande TEST UNIT READY |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | | | | | |
| 2 | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) |
| 3 | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) |
| 4 | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) |
| 5 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |

### INQUIRY

Cette commande est obligatoirement présente sur tous les périphériques. Elle permet d'obtenir des informations sur l'équipement connecté. Cette commande est disponible dès que l'équipement est alimenté, même s'il n'a pas encore fini sa séquence d'initialisation (il fournira éventuellement une réponse plus complète une fois initialisé.)
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY | 0x12 = 18 = commande INQUIRY |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | (réservé) | (réservé) | (réservé) | (réservé) | EVPD |
| 2 | Numéro de page | Numéro de page | Numéro de page | Numéro de page | Numéro de page | Numéro de page | Numéro de page | Numéro de page |
| 3 | (MSB) | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | |
| 4 | | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | Taille maxi de la réponse | (LSB) |
| 5 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |

### READ

Il existe plusieurs versions de cette commande, la plus ancienne READ (6) permet de coder le numéro de premier bloc à lire sur 21 bits (sur un disque dur cela ne permet d'accéder qu'au premier 1 Gio) cette commande est pourtant toujours obligatoirement supportée pour conserver la compatibilité avec les codes en ROM de certains serveurs informatiques qui lisent leur code d'amorçage via cette commande (ce dernier devra alors avoir été enregistré vers le début du disque.)
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) | 8 = commande READ (6) |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | (MSB) | | | | |
| 2 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 3 | | | | | | | | (LSB) |
| 4 | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire |
| 5 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |

#### READ(10)

La commande READ (10) est une extension de la précédente, elle propose un numéro de LBA sur 32 bits (2 Tio avec un bloc de 512 octets). Le bit DPO ("Disable Page Out") signale à l'unité qu'il n'est sans doute pas utile de mettre les données lues en cache car elles ne sont plus nécessaires, à l'inverse le bit FUA ("Force Unit Access") demande de ne pas utiliser le cache lors d'une lecture, enfin le bit RelAd ("Relative Address") est employé lors de commandes liées pour préciser que le numéro de LBA est relatif à la précédente commande de lecture. Cette commande a été spécifiée vers 1982 et aurait donc pu être décrite dans la première norme ce qui à l'époque où les plus gros disques durs n'atteignaient pas 1 Gio était d'une clairvoyance remarquable.
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) | 0x28 = 40 = commande READ (10) |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | DPO | FUA | (réservé) | (réservé) | RelAd |
| 2 | (MSB) | | | | | | | |
| 3 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 4 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 5 | | | | | | | | (LSB) |
| 6 | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) |
| 7 | (MSB) | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | |
| 8 | | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | (LSB) |
| 9 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |

#### READ(12)

La commande READ (12) est à nouveau une extension de la précédente, elle propose un nombre de blocs à lire codé sur 32 bits (avec un bloc de 512 octets cela permet un transfert maximum de 2 Tio en une seule commande.)
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) | 0xA8 = 168 = commande READ (12) |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | DPO | FUA | (réservé) | (réservé) | RelAd |
| 2 | (MSB) | | | | | | | |
| 3 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 4 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 5 | | | | | | | | (LSB) |
| 6 | (MSB) | | | | | | | |
| 7 | | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | |
| 8 | | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | |
| 9 | | | | | | | | (LSB) |
| 10 | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) |
| 11 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |

#### READ(16)

La commande READ (16) est elle aussi une extension de la précédente, elle propose un numéro de LBA sur 64 bits (plus de 8 000 000 Pio avec des blocs de 512 octets).
| bit→ ↓octet | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) | 0x88 = 136 = commande READ (16) |
| 1 | Numéro d'unité | Numéro d'unité | Numéro d'unité | DPO | FUA | (réservé) | (réservé) | RelAd |
| 2 | (MSB) | | | | | | | |
| 3 | | | | | | | | |
| 4 | | | | | | | | |
| 5 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 6 | | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | Numéro du premier bloc à lire | |
| 7 | | | | | | | | |
| 8 | | | | | | | | |
| 9 | | | | | | | | (LSB) |
| 10 | (MSB) | | | | | | | |
| 11 | | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | |
| 12 | | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | Nombre de blocs contigus à lire | |
| 13 | | | | | | | | (LSB) |
| 14 | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) | (réservé) |
| 15 | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle | Contrôle |