Integrated Drive Electronics
Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.
Un câble IDE
Un câble IDE

L' IDE, acronyme de Integrated Drive Electronics, est le plus répandu des standards commerciaux d'interface de connexion pour mémoires de masses (disque dur, CDROM, DVD) en micro-informatique (La micro-informatique est un terme désignant les « petits » (le préfixe μιχρο, venant du grec) ordinateurs personnels; le...). Cette connexion s'appuie sur les standards ATA et ATAPI.

Ce document présente l'interface (Une interface est une zone, réelle ou virtuelle qui sépare deux éléments. L’interface désigne ainsi ce que chaque élément a besoin de connaître de l’autre pour pouvoir fonctionner correctement.) IDE. Il n'est pas exhaustif et de nombreuses fonctions sont évoquées sans être détaillées. Néanmoins, les informations contenues dans ce document suffisent pour les opérations de base, d'ailleurs illustrées par du code.

Attention : ce document ne doit servir que d'introduction. Afin d'aller plus loin dans la connaissance d'ATA et d'ATAPI, il est préférable de consulter des documents de meilleure qualité, idéalement les spécifications officielles.

Présentation

Les périphériques (disques, lecteurs de CD) sont reliés à la carte mère (La carte mère est un matériel informatique (composé de circuits imprimés et de ports de connexion) servant à interconnecter toutes les composantes d’un micro-ordinateur. On peut ainsi...) par une nappe souple comportant des connecteurs 40 points, parfois munis d'un détrompeur, ces nappes étaient par le passé (Le passé est d'abord un concept lié au temps : il est constitué de l'ensemble des configurations successives du monde et s'oppose au futur sur une échelle des temps centrée sur le présent. L'intuition du...) munies de 40 fils, mais depuis l'apparition de l'ATA 100, les nappes à 80 fils deviennent monnaie courante. La longueur (La longueur d’un objet est la distance entre ses deux extrémités les plus éloignées. Lorsque l’objet est filiforme...) standard des nappes est de 46 cm.

  • Ces connecteurs sont identiques pour le controleur et les périphériques, (voir illustration).
  • Les cartes mères sont souvent équipées de 2, voire 4 ports IDE. À l'avenir, les nouvelles cartes mères n'en proposeront généralement plus qu'un seul en raison du début de l'obsolescence de ce standard. Chaque port permet de brancher 2 périphériques : un en maître, un en esclave. Une carte mère disposant de 2 ports IDE permet donc de brancher 4 périphériques de stockage ; on parlera alors de maître primaire/secondaire et esclave primaire/secondaire.
  • La distinction maître/esclave permet simplement de séparer logiquement les unités de stockage qui sont elles connectées physiquement en parallèle sur le contrôleur, par contre l'exploitation de chacun d'eux est similaire.
  • Pour effectuer cette distinction Master / Slave (La lave est une roche en fusion, plus ou moins fluide, émise par un volcan lors d’une éruption. La lave est issue d'un magma, réserve de...) (ou Maître / Esclave en français), on positionne un cavalier sur le sélecteur incorporé au périphérique. Il existe aussi une position CS (Cable Select) qui permet (si on positionne les 2 périphériques en CS) de déterminer automatiquement lequel est maître et lequel est esclave, en fonction de la position sur le câble.

ATA et ATAPI

La connexion IDE tire partie des protocoles ATA/ATAPI.
ATAPI (ATA with Packet Interface extension) est en fait une extension de ATA (AT Attachement). Ce dernier est le protocole utilisé par les disques durs IDE tandis qu'ATAPI est plutôt utilisé par les lecteurs et graveurs de CD-ROM et DVD-ROM ainsi que par quelques lecteurs de disquettes spéciales de type ZIP par exemple.

La principale différence entre les deux protocoles réside dans l'existence, dans ATAPI, de l'extension Packet Interface qui implémente le jeu d'instructions Packet. De plus, de nombreuses commandes ATA sont interdites si ce jeu d'instructions est présent.

Dans les sections suivantes, les commandes réservées à ATA ou à ATAPI seront indiquée. Les commandes communes aux deux protocoles ne porteront pas de mention spéciale.

Les différents standards

Standard Autres dénominations Taux de transfert (Mo/s) Nouveautés Référence ANSI
ATA-1 ATA, IDE PIO 0,1,2: 3.3, 5.2, 8.3
Single-word DMA 0,1,2: 2.1, 4.2, 8.3
Multi-word DMA 0: 4.2
Supporte jusqu'à 528 Mo X3.221-1994
(obsolète depuis 1999)
ATA-2 EIDE, Fast ATA, Fast IDE, Ultra (ULTra (pour (en)« Urban Light Transport ») est un système de transport individuel de type Personal Rapid Transit (PRT), autrement dit un moyen de transport...) ATA PIO 3,4: 11.1, 16.6
Multi-word DMA 1,2: 13.3, 16,6
LBA (jusqu'à 8.4 Go) X3.279-1996
(obsolète depuis 2001)
ATA-3 EIDE " S.M.A.R.T., Sécurité X3.298-1997
(obsolète depuis 2002)
ATA-4 ATAPI-4, ATA/ATAPI-4 Ultra-DMA/33:
UDMA 0,1,2: 16.7, 25.0, 33.3
jeu d'instructions Packet NCITS 317-1998
ATA-5 ATA/ATAPI-5 Ultra-DMA/66:
UDMA 3,4: 44.4, 66.7
détecte les câbles à 80 fils NCITS 340-2000
ATA-6 ATA/ATAPI-6 Ultra-DMA/100:
UDMA 5: 100
Automatic Acoustic Management (AAM est l'acronyme de Automatic Acoustic Management qui désigne une fonctionnalité disponible sur les disques durs modernes. Actuellement, cette fonction est généralement désactivée par défaut.) NCITS 347-2001
ATA-7 ATA/ATAPI-7 Ultra-DMA/133:
UDMA 6: 133
-- NCITS 361-2002
ATA-8 ATA/ATAPI-8 -- -- en projet (Un projet est un engagement irréversible de résultat incertain, non reproductible a priori à l’identique, nécessitant le concours et l’intégration d’une grande diversité de...)

Jeu d'instructions Packet

Ce jeu d'instructions constitue la principale différence entre ATA et ATAPI. Il implémente les deux commandes suivantes :

  • Obtention d'informations : une commande (Commande : terme utilisé dans de nombreux domaines, généralement il désigne un ordre ou un souhait impératif.) du même type existe dans le protocole ATA mais fournit des informations différentes. Ces deux commandes sont décrites plus bas.
  • Envoi d'une commande Packet : cette commande permet l'envoi de commandes Packet dans un format spécial par le biais du port de données. Ces commandes permettent d'envoyer plus d'informations que les commandes ATA normales. Cette commande est également décrite plus bas.

Ces commandes servent (Servent est la contraction du mot serveur et client.) d'interface à un jeu d'instructions spéciales spécifiques au type de périphérique (CD-ROM, CD-R/RW, DVD…). Ces commandes ne sont pas définies par le protocole ATAPI.

Dans le cas des CD-ROM et des DVD (Le DVD officiellement Digital Versatile Disc - même si d'autres dénominations sont employées - est un disque optique numérique exploité pour la sauvegarde et le stockage de...), ces commandes sont définies par le T10 (Technical Committee T10, dépendant de NCITS (National Committee for Information and Technology Standards) chargé de SCSI) dans les MMC (Multimedia Commands 1, 2 et 3 actuellement).
Note : Ces commandes étaient, pour les CD-ROM, définies dans le document SFF-8020i, maintenant obsolète.

Tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou l'univers.) système digne de ce nom doit impérativement supporter un protocole soit par le biais d'un pilote ou bien sûr, serait plus simple d'utiliser le BIOS qui fournit déjà des fonctions d'accès aux disques durs (interruption 13h) mais ces fonctions sont limitées, lentes, et parfois boguées. Se baser sur le BIOS ne permet donc pas d'avoir un système fiable sans compter qu'en mode protégé, cela est impossible. C'est pourquoi il faut réécrire les routines d'accès aux disques pour avoir un pilote satisfaisant.

Quelques-unes des commandes de base sont décrites dans ce document.

Ports et commandes

Récapitulatif

Voici un récapitulatif des ports utilisés par le protocole IDE.

(Voir plus bas la signification de X et Y)
Adresse (Les adresses forment une notion importante en communication, elles permettent à une entité de s'adresser à une autre parmi un ensemble d'entités. Pour qu'il n'y...) Description
1F0 + X Registres de commande du 1er contrôleur
3F0 + Y Registres de contrôle (Le mot contrôle peut avoir plusieurs sens. Il peut être employé comme synonyme d'examen, de vérification et de maîtrise.) du 1er contrôleur
170 + X Registres de commande du 2e contrôleur
370 + Y Registres de contrôle du 2e contrôleur
F0 + X Registres de commande du 3e contrôleur
2F0 + Y Registres de contrôle du 3e contrôleur
70 + X Registres de commande du 4e contrôleur
270 + Y Registres de contrôle du 4e contrôleur
Lecture des commandes (entrée)
X Signification
0 Données
1 Registre d'erreur
2 Nombre (La notion de nombre en linguistique est traitée à l’article « Nombre grammatical ».) de secteurs
3 Secteur
4 Cylindre (Un cylindre est une surface dans l'espace définie par une droite (d), appelée génératrice, passant par un point variable décrivant...) inférieur
5 Cylindre supérieur
6 Lecteur et tête
7 État
Écriture des commandes (sortie)
X Signification
0 Données
1 Précompensation d'écriture
2 Nombre de secteurs
3 Secteur
4 Cylindre inférieur
5 Cylindre supérieur
6 Lecteur et tête
7 Commande
Lecture des contrôles (entrée)
Y Signification
6 État du disque dur (Un disque dur est une mémoire de masse magnétique utilisée principalement dans les ordinateurs, mais également dans des baladeurs numériques, des...)
7 Registre d'adresses
Écriture des contrôles (sortie)
Y Signification
6 Registre de contrôle

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 (Le diagnostic (du grec δι?γνωση, diágnosi, à partir de δια-, dia-, „par, à travers, séparation,...), il contient le résultat de cette commande.

Signification lorsque le bit d'erreur du registre d'état est défini
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 (Le mot requête, synonyme de demande, est employé dans les domaines suivants :) 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é
Signification après la commande diagnostic (lecteur 0 (maître) sélectionné)
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 :

Signification après la commande diagnostic (lecteur 1 (esclave) sélectionné)
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 1er 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 (Le poids est la force de pesanteur, d'origine gravitationnelle et inertielle, exercée par la Terre sur un corps massique en raison uniquement du voisinage de la Terre. Elle est égale à l'opposé de la...) 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é
1 Contrôleur 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 Erreur d'écriture
4 0 Recherche (La recherche scientifique désigne en premier lieu l’ensemble des actions entreprises en vue de produire et de développer les connaissances scientifiques. Par extension...) en cours
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 (Le mot disque est employé, aussi bien en géométrie que dans la vie courante, pour désigner une forme ronde et régulière, à l'image d'un palet — discus en latin.)
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
2 Fonctionnement normal
1 Initialisation
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
0   Inutilisé

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 (Graphie) 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 ( Total est la qualité de ce qui est complet, sans exception. D'un point de vue comptable, un total est le résultat d'une addition, c'est-à-dire...) 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 (La logique (du grec logikê, dérivé de logos (λόγος), terme inventé par Xénocrate signifiant à la fois raison, langage, et raisonnement) est dans une...) 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.

Quelques opérations courantes

Connecteur ATA sur une carte mère
Connecteur ATA sur une carte mère

Dans cette section, tous les codes sont écrits en assembleur AT&T (par exemple GNU (GNU est un système d'exploitation composé exclusivement de logiciels libres.) Assembly compiler). Ils sont susceptibles de contenir quelques erreurs car ils n'ont pas été testés tels qu'ils sont présentés ici (puisqu'ils ne sont pas complets). Par ailleurs, les méthodes présentées ne sont pas nécessairement les seules ou les meilleures méthodes existantes. Ils sont fournis à titre d'exemples. Les difficultés présentées ci-après sont principalement dûes au manque d'uniformité des matériels qui ne respectent pas toujours à la lettre les spécification ATA/ATAPI, avec pour résultat des comportements qui peuvent varier dans certains cas (comme lorsqu'un disque est absent par exemple).

Détecter les contrôleurs

Pour savoir si un contrôleur est présent, il faut tester ces ports. Sur certains système, un port non attribué renverra toujours 0xff. Malheureusement, un port attribué peut aussi renvoyer 0xff et sur certains systèmes, la valeur est aléatoire. Vérifier cette valeur n'est donc pas un moyen sûr de détecter la présence d'un contrôleur.

Une autre méthode est de modifier la valeur d'un port en lecture/écriture et de vérifier ensuite que la modification a été effectuée.

Le registre de lecteur et de tête est en entrée/sortie. Aussi, il peut être utilisé pour cette opération :

  • Lecture du disque actuellement sélectionné :

movw $PORT_HEAD_AND_DISK, %dx // 0x1f6, 0x176, 0xf6 ou 0x76 selon le contrôleur testé
inb %dx, %al
movb %al, %bl
andb $0x10, %bl
shrb $4, %bl

BL contient maintenant 0 (Maître) ou 1 (Esclave)

  • Sélection de l'autre disque :

cmpb $0, %bl
jz setslave
jmp setmaster
setmaster:
andb $0xef, %al
jmp set
setslave:
orb $0x10, %al
set:
outb %al, %dx

  • Relecture du disque actuellement sélectionné :

inb %dx, %al
andb $0x10, %al
shrb $4, %al

AL contient maintenant 0 (Maître) ou 1 (Esclave)

  • Comparaison : avant (BL) et maintenant (AL) :

cmpb %bl, %al
jz no_adapter
jmp adapter_found
no_adapter: // contrôleur absent
adapter_found: // contrôleur présent

Détecter les disques

La détection des disques installés sur un contrôleur est plus délicate.
Une méthode est d'envoyer une commande au disque et d'attendre. Si la réponse tarde trop, on suppose que le disque testé n'existe pas. Cette méthode n'est sûre que si l'attente est suffisamment grande. Il faut faire attention à la commande que l'on choisit. En effet, selon que l'on veut détecter uniquement les disques ATA, ATAPI ou les deux, il faut choisir la commande qui corresponde. En choisissant la commande 0xec et en attendant que le contrôleur soit prèt à recevoir des données, les disques ATAPI répondront mais ne seront jamais prêts pour un transfert. Le programme déduira donc que le disque n'existe pas.

En fait, avec cette méthode, il faut bien choisir la commande à envoyer et le résultat qu'on en attend. movw $PORT_HEAD_AND_DISK, %dx // 0x1f6, 0x176, 0xf6 ou 0x76
movb $HEAD_AND_DISK, %al // 0xa0 pour tester le maître, 0xb0 pour l'esclave
outb %al, %dx
movw $PORT_COMMAND, %dx // 0x1f7, 0x177, 0xf7 ou 0x77
movb $COMMAND, %al // Commande à utiliser (on pourra utiliser par exemple la commande 0xec, ce qui permet du même coup de lire les informations du disque s'il est présent, dans ce cas, il ne faut pas oublier d'ajouter le code nécessaire à la récupération de ces informations)
outb %al, %dx movl $TIMEOUT, %ecx // Nombre de tentatives de lecture de l'état du contrôleur
movw $PORT_STAT, %dx // 0x1f7, 0x177, 0xf7, 0x77
detect_disk_loop:
inb %dx, %al
andb $0xfe, %al // Contrôleur et disque
cmpb $0x50, %al // prêts ?
je disque_present
loop detect_disk_loop
disque_absent: disque_present: Une autre méthode, plus simple à mettre en œuvre et plus rapide, mais moins sûre, est de tenter de détecter les protocoles utilisés par les disques. Cette méthode est moins efficace car si un contrôleur n'existe pas, les valeurs que les ports peuvent retourner dépendent des machines et peuvent être totalement aléatoires, et donc, pourquoi pas, correspondre aux valeurs du standard sans qu'aucun disque ne soit présent.
De même, si un contrôleur existe mais n'est branché qu'à un seul disque, les valeurs seront les mêmes quel que soit le disque sélectionné, comme s'il y avait deux disques. On peut éventuellement combiner les deux en commençant par la deuxième méthode puis, pour les disques détectés, en vérifiant avec la première. Dans la plupart des cas, le disque existe vraiment et cette vérification est donc assez rapide.

Obtenir quelques informations sur un disque

La commande 0xec permet d'obtenir des informations sur le disque ATA sélectionné. Cette commande n'a besoin (Les besoins se situent au niveau de l'interaction entre l'individu et l'environnement. Il est souvent fait un classement des besoins humains en trois...) que d'une information : le disque sélectionné. En retour, elle envoie 256 mots (double-octets) sur le registre de données (0x1f0, 0x170, 0xf0 ou 0x70).
Pour les disques ATAPI, il faut utiliser la commande 0xa1 et ne pas oublier que les valeurs retournées n'ont pas toutes la même signification.

movw $PORT_HEAD_AND_DISK, %dx // 0x1f6, 0x176, 0xf6 ou 0x76
movb $HEAD_AND_DISK, %al // 0xa0 ou 0xb0
outb %al, %dx
movw $PORT_COMMAND, %dx // 0x1f7, 0x177, 0xf7 ou 0x77
movb $0xec, %al // ou 0xa1 pour les disques ATAPI
outb %al, %dx

movl $TIMEOUT, %ecx // Nombre de tentatives de lecture de l'état du contrôleur
movw $PORT_STAT, %dx // 0x1f7, 0x177, 0xf7, 0x77
wait_loop:
inb %dx, %al
andb $0xd8, %al // Contrôleur et disque
cmpb $0x58, %al // prêts à transférer ?
je transf""
loop wait_loop
timeout: // Le disque n'est pas prêt

transf: // effectuer le transfert
movl $OFFSET_BUFFER, %edi
movw $SEGMENT_BUFFER, %es
movl 0x100, %ecx
movw $PORT_DATA, %dx // 0x1f0, 0x170, 0xf0 ou 0x70
rep insw

Il ne reste plus ici qu'à interpréter les valeurs lues.

Initialiser un contrôleur

Pour initialiser un contrôleur, il faut utiliser le registre de contrôle (0x3f6, 0x376, 0x2f6 ou 0x276 en écriture seule).
Il faut en effet positionner le bit 2 (le 3e bit en partant de la droite) pendant 4.8 microsecondes ou plus, puis le vider.
La procédure n'a donc rien de complexe en soit mais l'attente doit être programmée selon le système d'exploitation utilisé (et donc les fonctions d'API disponibles).

Lire

Depuis un disque ATA

La lecture fonctionne de la même manière que la lecture d'informations concernant le disque (voir plus haut) mais n'utilise pas les mêmes paramètres d'entrée. Voici ceux concernant la lecture :

0x1f2, 0x172, 0xf2 ou 0x72 Nombre de secteurs à lire
0x1f3, 0x173, 0xf3 ou 0x73 Numéro de secteur du 1e secteur à transférer
0x1f4, 0x174, 0xf4 ou 0x74 Octet inférieur du numéro de cylindre du 1e secteur à transférer
0x1f5, 0x175, 0xf5 ou 0x75 Octet supérieur du numéro de cylindre du 1e secteur à transférer
0x1f6, 0x176, 0xf6 ou 0x76 Disque et numéro de tête du 1e secteur à transférer
Numéro de commande 0x20

En sortie, le disque envoie sur le port de donnée (Dans les technologies de l'information (TI), une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction d'affaire, d'un événement, etc.) n*256 mots où n est le nombre de secteur à lire.

Depuis un disque ATAPI

Il faut utiliser la commande Packet suivante :
Octet 1. 0xA8
Octet 2. 0
Octets 3-6. Adresse LBA du 1e secteur à lire
Octets 7-10. Nombre de secteurs.
Octet 11. 0
Octet 12. 0

Le contrôleur renvoie les données lues ((2048 * nombre de secteurs) octets).

Note : L'adresse est le nombre de secteur est indiqué avec la norme (Une norme, du latin norma (« équerre, règle ») désigne un état habituellement répandu ou moyen considéré le plus souvent comme une règle à suivre. Ce terme...) Big endian :
Octet 3 = ( lba >> 24 ) & 0xff;
Octet 4 = ( lba >> 16 ) & 0xff;
Octet 5 = ( lba >> 8 ) & 0xff;
Octet 6 = lba & 0xff;
Octet 7 = ( count >> 24 ) & 0xff;
Octet 8 = ( count >> 16 ) & 0xff;
Octet 9 = ( count >> 8 ) & 0xff;
Octet 10 = count & 0xff;

Écrire

Vers un disque ATA

L'écriture se passe exactement de la même manière que la lecture si ce n'est que la commande est 0x30 et que les données ne sont pas transférées du disque à la mémoire (D'une manière générale, la mémoire est le stockage de l'information. C'est aussi le souvenir d'une information.) mais de la mémoire au disque.

Vers un disque ATAPI

Dans le cas d'un CD-ROM, cette commande ne peut être utilisée que pour un graveur.

Prise en charge (La charge utile (payload en anglais ; la charge payante) représente ce qui est effectivement transporté par un moyen de transport donné, et qui donne lieu à un paiement ou un bénéfice non pécuniaire pour être...) des erreurs

Une bonne prise en charge des erreurs est également un point important pour un pilote fonctionnel.

Pour cela, il faut lire le port d'erreur (0x1f1, 0x171, 0xf1 ou 0x71) après chaque commande. Le contenu de ce port est décrit plus haut. La documentation officielle est plus exhaustive sur ce port, dont la valeur peut parfois dépendre de la dernière commande.

Pour les commandes Packet, il faut utiliser la commande (Packet) Request Sense pour connaître la valeur de la dernière erreur (non traitée dans cet article).

Détecter le protocole

Les disques ATA et ATAPI fonctionnant différemment, il est important de pourvoir détecter le protocole utilisé par un disque. Cela se réalise de la manière suivante :

  1. En premier lieu, il faut initialiser le contrôleur
  2. Ensuite, il faut sélectionner le disque dont on veut connaître le protocole
  3. Puis il faut lire les registres Sector Count et Sector Number
  4. Si ces registres valent tous les deux 1, il faut lire les registres Cylinder Low et Cylinder High.
  5. Si ces registres valent tous les deux 0, le disque est ATA, si ces registres valent respectivement 0x14 et 0xeb, le disque est ATAPI

Après avoir obtenu le protocole d'un disque, on peut sélectionner l'autre disque pour en déterminer le protocole sans avoir à réinitialiser (tant que les valeurs n'ont pas été modifiées).

Attention, toutefois, si un seul disque se trouve sur un contrôleur, les valeurs pour le disque qui n'existe pas peuvent être erronées en fonction des architectures. Cette méthode ne permet donc pas de détecter un disque.

Déterminer la capacité

Dans le cas d'un disque dur ATA, cette donnée (Dans les technologies de l'information, une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction, d'un événement,...), fixe, est fournie par l'instruction (Une instruction est une forme d'information communiquée qui est à la fois une commande et une explication pour décrire l'action, le comportement, la méthode ou la tâche...) Identify Device (ECh) sous la forme du nombre de secteurs adressables en mode LBA ou, dans le cas d'un disque ne supportant pas ce mode, de la structure CHS logique du disque.

Au contraire, dans le cas d'un lecteur de CD-ROM ATAPI, dont le média (On nomme média un moyen impersonnel de diffusion d'informations (comme la presse, la radio, la télévision), utilisé pour communiquer. Les médias permettent de diffuser une information vers un grand nombre...) est amovible, la capacité varie selon le média actuellement dans le lecteur. Il existe donc une commande Packet Read Capacity qui donne le numéro logique du dernier bloc de données. Cette commande n'indique pas la capacité totale du CD, mais la quantité (La quantité est un terme générique de la métrologie (compte, montant) ; un scalaire, vecteur, nombre d’objets ou d’une autre...) de données pressées (CD-ROM) ou gravées (CD-R/RW).

Voici la structure de cette commande :

0 Code opération : 25h
1 0h
2 0h
3 0h
4 0h
5 0h
6 0h
7 0h
8 0h
9 0h
10 0h
11 0h

La commande renvoie 8 octets de réponse :

0

Most Significant Byte
Adresse LBA du dernier
secteur adressable
Least Significant Byte

1
2
3
4

Most Significant Byte
Nombre d'octet dans un
secteur (normalement 2048)
Least Significant Byte

5
6
7

Interdire ou autoriser le retrait d'un média

ATAPI

Cette opération se réalise grâce à la commande Prevent Allow Medium Removal définie dans les SPC-2 (SCSI Primary Commands).

La structure de cette commande est la suivante :

0 Code opération : 1eh
1 0h
2 0h
3 0h
4 0h pour autoriser et 3h pour interdire
5 0h
6 0h
7 0h
8 0h
9 0h
10 0h
11 0h

Cette commande n'envoie pas de réponse.

Fonctions plus avancées

LBA - Logical Block Address

Présentation

Le mode CHS permet d'adresser un secteur du disque en indiquant son numéro de secteur, le numéro du cylindre où il se trouve ainsi que le numéro de la tête. Malheureusement, ce mode ne permet d'adresser que 1024 cylindres, 63 secteurs et 256 têtes soit 1024*63*256*512=8455716864 octets soit un peu moins de 8 Go, ce qui est peu de nos jours (Le jour ou la journée est l'intervalle qui sépare le lever du coucher du Soleil ; c'est la période entre deux nuits, pendant laquelle les rayons du...) (quoique certains disques supportent des adresses CHS supérieures à cette limite).
Au contraire, le mode LBA utilise une adresse logique sur 28 bits : le 1e secteur a l'adresse 0, le 63e l'adresse 62, le 1e secteur du 2e cylindre l'adresse 63 (s’il y a 63 secteurs par cylindres) et ainsi de suite. Le mode LBA permet donc d'adresser 2^28*512=137438953472 octets soit 128 Go.

Utilisation, différences par rapport au mode CHS

L'utilisation du mode LBA n'est pas beaucoup plus compliquée que le mode CHS, les différences peuvent être résumées de la manière suivante :

Registre Mode CHS Mode LBA
Registre de lecteur et tête, bit 6 0 1
Numéro de secteur Numéro du secteur Bits 0 à 7 de l'adresse LBA
Numéro de cylindre, octet de poids faible Numéro de cylindre, octet de poids faible Bits 8 à 15 de l'adresse LBA
Numéro de cylindre, octet de poids fort Numéro de cylindre, octet de poids fort Bits 16 à 23 de l'adresse LBA
Registre de lecteur et tête, bits 0 à 3 Numéro de tête Bits 24 à 27 de l'adresse LBA

Pour le reste, tout est identique.

Conversion d'une adresse CHS en adresse LBA et inversement

adresse logique = (numero de secteur - 1) + (numero de tête * nombre de secteurs par cylindre) + (numero de cylindre * nombre de secteurs par cylindre * nombre de têtes)

secteur CHS = entier(1 + reste de (adresse logique / nombre de secteurs par pistes))
tête CHS = entier(reste de ((adresse logique / nombre de secteurs par pistes) / nombre de têtes))
piste CHS = entier(adresse logique / (nombre de secteurs par cylindre * nombre de faces))

Considérons lba l'adresse logique, c le cylindre, h la tête, s le secteur, H le nombre de têtes et S le nombre de secteurs par cylindre, voici les mêmes formules dans une syntaxe de style C (types entiers) :

lba = (s - 1) + (h * S) + (c * S * H);
s = 1 + (lba% S);
h = (lba / S)% H;
c = lba / (S * H);

Conclusion

Les informations contenues dans ce document sont directement inspirées des spécifications officielles, mais sont très simplifiées. La section sources et références bibliographiques vous permettra d'approfondir votre connaissance des standard ATA/ATAPI.

Sources et références bibliographiques

  • Programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent l'écriture des programmes informatiques. C'est une étape importante de la conception...) d'ATA/ATAPI
    • PC Programmation Système (La programmation système est un type de programmation qui vise au développement de programmes qui font partie du système d'exploitation d'un ordinateur ou qui en réalisent les fonctions....), Franck van Gilluwe, CampusPress, 1999, ISBN 2-7440-0559-2, traduit de l'américain The Undocumented PC, Second Edition
    • IDE - Hardware Reference & Information Document, Alex T. Ivopol, mailto:ivopola@emco.co.nz, 1994
    • ATA-ATAPI.com, un site entièrement dédié à ce standard par l'un des membres du T13 qui les conçoit : http://www.ata-atapi.com
  • Codes sources
  • LBA
    • Revue LOGIN: 70, Architecture (Architectures est une série documentaire proposée par Frédéric Campain et Richard Copans, diffusé sur Arte depuis 1995.) d'un OS : le système de fichiers, Vincent Perdereau, mailto:vincent.perdereau@lemel.fr
  • Standards
    • T13 Technical (Un technical est un anglicisme désignant un véhicule de combat improvisé et typique d'une force militaire irrégulière locale.) Committee, responsable de la gestion du standard ATA/ATAPI. Les spécifications officielles sont disponibles sur le site : http://www.t13.org
    • T10 Technical Committee, responsable de la gestion du standard SCSI mais également des MMC (MultiMedia Commands, il s'agit en fait des jeux de commandes Packet pour CD-ROM). Les spécifications officielles sont disponibles sur le site ftp : ftp://ftp.t10.org, et notamment dans le répertoire /t10/drafts/. Le site est : http://www.t10.org

Évolution du standard

Depuis 2003, le standard d'interface de connexion des mémoires de masse (Le terme masse est utilisé pour désigner deux grandeurs attachées à un corps : l'une quantifie l'inertie du corps (la masse inerte) et l'autre la contribution du corps à la force de gravitation (la masse grave)....) évolue peu à peu de l'IDE vers le Serial ATA aussi appelé S-ATA ou SATA.

Page générée en 0.336 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique