Détails des ports
70h, F0h, 170h, 1F0h - Données, E/S, 16 bits
Ce port permet de transférer les données en lecture et en écriture.
Le transfert se fait par mots (16 bits).
71h, F1h, 171h, 1F1h - Registre des erreurs, Entrée, 8 bits
Ce registre contient le code d'erreur de la dernière opération exécutée. Après la commande diagnostic, il contient le résultat de cette commande.
| Bit | Valeur | Signification |
|---|
| 7 | 1 | Mauvais secteur détecté |
| 6 | 1 | Données non corrigibles |
| 5 | 1 | Changement de support (uniquement pour les supports amovibles) |
| 4 | 1 | Secteur ou adresse non trouvée, une requête sur un emplacement inexistant a été demandée |
| 3 | 1 | Demande de modification de support (uniquement pour les supports amovibles) |
| 2 | 1 | Commande interrompue |
| 1 | 1 | Piste 0 non trouvée, erreur pendant le recalibrage |
| 0 | 1 | Secteur trouvé mais impossible d'y accéder, le secteur est probablement endommagé |
| Valeur | Lecteur 0 (Maître) | Lecteur 1 (Esclave) |
|---|
| 1 | Pas d'erreur | Pas d'erreur |
2
3
4
5 | Erreur | Pas d'erreur |
| 0x81 | Pas d'erreur | Erreur |
0x82
0x83
0x84
0x85 | Erreur | Erreur |
Lors de l'exécution de la commande diagnostic, le maître est sélectionné. Pour obtenir l'état du lecteur esclave, il faut, après le diagnostic, sélectionner l'esclave puis relire ce port :
| Valeur | Lecteur 1 (Esclave) |
|---|
| 1 | Pas d'erreur |
2
3
4
5 | Erreur |
71h, F1h, 171h, 1F1h - Précompensation d'écriture, Sortie, 8 bits
Ce port est présent uniquement pour des raisons de compatibilité avec les anciens disques mais les contrôleurs IDE l'utilisent souvent pour des fonctions spécifiques selon les commandes.
72h, F2h, 172h, 1F2h - Nombre de secteurs, E/S, 8 bits
Ce registre contient le nombre de secteurs à lire ou à écrire, 0 signifiant en réalité 256. À la fin de l'opération de lecture ou d'écriture, il contient le nombre de secteurs restants (0 signifie que la commande a totalement aboutie). Il est parfois utilisé à d'autres fins par d'autres commandes.
73h, F3h, 173h, 1F3h - Secteur, E/S, 8 bits
Ce registre contient le numéro du 1 secteur concerné par chaque opération d'accès. Il peut également contenir les bits 0 à 7 de l'adresse LBA (voir la section correspondante)
Lorsqu'une opération est terminé, ce registre contient le numéro du dernier secteur affecté par l'opération.
74h, F4h, 174h, 1F4h - Cylindre inférieur, E/S, 8 bits
Ce registre contient les 8 bits de poids faibles du numéro de cylindre pour l'opération. Il peut également contenir les bits 8 à 15 de l'adresse LBA.
Une fois l'opération achevée, il contient les 8 bits de poids faibles du dernier cylindre affecté.
75h, F5h, 175h, 1F5h - Cylindre supérieur, E/S, 8 bits
Ce registre contient les 8 bits de poids forts du numéro de cylindre pour l'opération. Certains contrôleurs n'utilisent que les 2 bits de poids faibles de ce registre. Il est donc préférable de ne pas utiliser les autres. Il peut également contenir les bits 16 à 23 de l'adresse LBA (et dans ce cas, tout le registre est utilisé).
Une fois l'opération achevée, il contient les 8 bits de poids forts du dernier cylindre affecté.
76h, F6h, 176h, 1F6h - Lecteur et tête, E/S, 8 bits
Ce registre contient le lecteur sélectionné (bit 4, 0 = maître, 1 = esclave) ainsi que le numéro de la tête (bits 0 à 3) pour l'opération. Les bits 0 à 3 peuvent également contenir les bits 24 à 27 de l'adresse LBA.
Les bits 5 et 7 doivent être positionné à 1 tandis que le bit 6 indique le mode d'adressage (0 = CHS, 1 = LBA)
77h, F7h, 177h, 1F7h - État, Entrée, 8 bits
Ce registre contient l'état du contrôleur. Sa lecture provoque l'effacement de toute interruption en instance et constitue une confirmation tacite de celle-ci.
| Bit | Valeur | Signification |
|---|
| 7 | 0 | Contrôleur non occupé |
| 6 | 0 | Lecteur sélectionné non prêt |
| 1 | Lecteur prêt à répondre à une commande du contrôleur |
| 5 | 0 | Pas d'erreur d'écriture sur le lecteur sélectionné |
| 1 | Recherche terminée, les têtes sont à la position demandée et prêtes à lire ou écrire |
| 3 | 0 | Le contrôleur n'est pas en attente d'un transfert par le port de données |
| 1 | Le contrôleur est prêt à recevoir ou envoyer des mots (2 octets) sur le port de données |
| 2 | 0 | Les données lues ne contenaient pas d'erreur qui ait pu être corrigée |
| 1 | Les données lues contenaient des erreurs qui ont pu être réparées par le disque |
| 1 | | Ce bit n'est pas utilisé sur les lecteurs récents |
| 0 | 0 | Pas d'erreur dans la commande précédente |
| 1 | Erreur dans la commande précédente. La nature de l'erreur est indiquée dans le registre d'erreur |
77h, F7h, 177h, 1F7h - Commande, Sortie, 8 bits
C'est par ce port que sont envoyées les commandes. L'envoi d'une commande se fait en dernier, après avoir indiqué tous les paramètres nécessaires dans les autres ports.
Les commandes principales sont détaillées plus bas.
276h, 2F6h, 376h, 3F6h - État, Entrée, 8 bits
Ce registre est identique au registre d'état 77h, F7h, 177h, 1F7h mais n'influe pas sur les interruptions en cours.
276h, 2F6h, 376h, 3F6h - Registre de contrôle, Sortie, 8 bits
Ce registre contrôle l'initialisation du contrôleur.
| Bit | Valeur | Signification |
|---|
7
6
5
4 | | Inutilisés |
| 3 | | Lecteur de 1 à 8 têtes |
| Lecteur de plus de 8 têtes |
| 1 | 0 | Autorise les requêtes d'interruption (IRQ 14 pour le 1e contrôleur, IRQ 15 pour le second, IRQ 11 pour le 3e et IRQ 10 pour le dernier) |
| 1 | Désactive la requête d'interruption |
Pour initialiser le contrôleur, il faut positionner le bit 2 à 1 pendant 4.8 microsecondes ou plus puis le vider.
277h, 2F7h, 377h, 3F7h - Registre d'adresses, Entrée, 8 bits
Ce port fournit des informations sur la tête et le lecteur sélectionné mais est assez peu utilisé car il n'est pas supporté par tous les contrôleurs et est de plus partagé avec le contrôleur de disquettes.
Principales commandes
Le registre de commande peut, comme son nom l'indique, recevoir des commandes, lorsque, toutefois, l'état du contrôleur, indiquer par le registre d'état, le lui permet.
Voici un bref descriptif des plus importantes :
00h - Aucune opération
N'effectue aucune opération mais positionne le bit 2 du registre d'erreur (commande interrompue).
10h à 1F - Recalibrer
Cette commande initialise le lecteur en positionnant la tête de lecture sur le cylindre 0. Cette commande tient compte de la valeur de la tête et du lecteur. Les autres registres sont ignorés.
20h - Lire plusieurs secteurs, reessayer en cas d'erreur
Cette commande permet de lire plusieurs secteurs. Si une erreur de données survient, le contrôleur recommence pour tenter d'obtenir des données valides. Le nombre de tentatives dépend du constructeur.
En cas de réussite, les données peuvent être lues depuis le registre de données. Une interruption est déclenchée au transfert de chaque secteur.
Commande interdite si le jeu de commandes Packet est présent.
21h - Lire plusieurs secteurs, une seule tentative
Cette commande est identique à la précédente mais, en cas d'erreur, le contrôleur n'effectue pas de nouvelles tentatives.
En cas de réussite, les données peuvent être lues depuis le registre de données. Une interruption est déclenchée au transfert de chaque secteur.
Commande interdite si le jeu de commandes Packet est présent.
30h - Écrire plusieurs secteurs, reessayer en cas d'erreur
Cette commande permet d'écrire plusieurs secteurs. Si une erreur de données survient, le contrôleur recommence. Le nombre de tentatives dépend du constructeur.
En cas de réussite, les données peuvent être écrites depuis le registre de données. Une interruption est déclenchée au transfert de chaque secteur.
Commande interdite si le jeu de commandes Packet est présent.
31h - Écrire plusieurs secteurs, une seule tentative
Cette commande est identique à la précédente mais, en cas d'erreur, le contrôleur n'effectue pas de nouvelles tentatives.
En cas de réussite, les données peuvent être écrites depuis le registre de données. Une interruption est déclenchée au transfert de chaque secteur.
Commande interdite si le jeu de commandes Packet est présent.
70h à 7Fh - Recherche
Cette commande recherche l'emplacement indiqué par les informations CHS ou LBA, puis y positionne la tête de lecture. Les commandes nécessitant l'accès à un point du disque, comme la lecture ou l'écriture, effectue implicitement cette recherche. Cette fonction ne doit donc pas nécessairement être appelée avant les autres commandes.
Commande interdite si le jeu de commandes Packet est présent.
90h - Diagnostic
Cette commande effectue un diagnostic. Le lecteur 0 doit être sélectionné mais le diagnostic s'applique aux 2 lecteurs.
ECh - Obtenir les informations sur le disque
Cette commande renvoie 256 mots, c'est-à-dire un secteur, par le registre de données contenant différentes informations sur le lecteur sélectionné. Voici les quelques une de ces informations. Pour plus de détails, reportez-vous aux spécifications officielles.
| Indice | Taille | Signification |
|---|
| 2h | mot | Nombre total de cylindres logiques ou 16383 si le double-mot à l'indice 78h dépasse 16515072 |
| 6h | mot | Nombre total de têtes logiques ou 16 si le double-mot à l'indice 78h dépasse 16515072 |
| Ch | mot | Nombre total de secteurs logiques par piste logique ou 63 si le double-mot à l'indice 78h dépasse 16515072 |
| 14h | 10 mots | Numéro de série |
| 36h | 20 mots | Modèle |
| 78h | double-mot | Nombre total de secteurs adressables en mode LBA |
| A0h | mot | Numéro majeur de révision des spécifications ATA |
| A2h | mot | Numéro mineur de révision des spécifications ATA |
Commande interdite si le jeu de commandes Packet est présent.
A1h - Obtenir les informations sur le disque (Jeu d'instructions Packet)
Cette commande est similaire à la commande précédente mais est réservée au jeu d'instructions Packet. Les informations renvoyées sont toutefois différentes. Pour une description complète, reportez-vous aux spécifications officielles.
| Indice | Taille | Signification |
|---|
| 14h | 10 mots | Numéro de série |
| 36h | 20 mots | Modèle |
| A0h | mot | Numéro majeur de révision des spécifications ATA |
| A2h | mot | Numéro mineur de révision des spécifications ATA |
Commande interdite si le jeu de commandes Packet est absent.
A0h - Envoyer une commande Packet
Cette commande permet d'envoyer une commande Packet au contrôleur.
Voici comment utiliser cette commande :
Lancer la commande
| Features (0x1f1, 0x171, 0xf1, 0x71) | 0 |
| Sector Count (0x1f2, 0x172, 0xf2, 0x72) | 0 |
| Sector Number (0x1f3, 0x173, 0xf3, 0x73) | 0 |
| Byte Low (0x1f4, 0x174, 0xf4, 0x74) | (1) |
| Byte High (0x1f5, 0x175, 0xf5, 0x75) | (1) |
| Head and Disk (0x1f6, 0x176, 0xf6, 0x76) | (2) |
| Command (0x1f7, 0x177, 0xf7, 0x77) | 0xa0 |
(1) Ces deux registres contiennent le nombre maximum d'octet qui vont être transférés (ex. 4096 : Byte High = 0x10 ; Byte Low = 0)
(2) Ce registre s'utilise comme pour toutes les commandes.
Lorsque le contrôleur est prêt à recevoir la commande, Status & 0x8 == 8 (DRQ bit - Data ReQuest) et Interrupt Reason (Sector Count) & 0x7 == 1 (REL=0; I/O=0 ; C/D=1). Le paquet de commande peut alors être envoyé par le port de données (0x1f0, 0x170, 0xf0, 0x70).
Lorsque le contrôleur est prêt à envoyer ou recevoir des données (dans le cas d'une commande nécessitant un transfert), Status & 0x8 == 8 (DRQ bit - Data ReQuest) et Interrupt Reason (Sector Count) & 0x7 == 0 (REL=0; I/O=0 ; C/D=0) si le contrôleur reçoit, ou Status & 0x8 == 8 (DRQ bit - Data ReQuest) et Interrupt Reason (Sector Count) & 0x7 == 2 (REL=0; I/O=1 ; C/D=0) si le contrôleur envoie.
Enfin, Interrupt Reason (Sector Count) & 0x7 == 3 (REL=0; I/O=1 ; C/D=1) pour indiquer que la commande est terminée (avec ou sans erreur). Dans le cas d'une erreur, le registre d'erreur contient dans ses 4 bits de poids forts le numéro Sense Key de l'erreur. L'erreur complète peut être connue grâce à la commande Request Sense (non traitée dans ce document).
Commande interdite si le jeu de commandes Packet est absent.