Integrated Drive Electronics

ï»ż
Integrated Drive Electronics

Integrated Drive Electronics

Wikibooks-logo-fr.png

Wikibooks propose un ouvrage abordant ce sujet : Integrated Drive Electronics.

Une nappe IDE

L' IDE, sigle 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. Cette connexion s'appuie sur les standards ATA et ATAPI.

Ce document prĂ©sente l'interface 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.

Sommaire

Présentation

Les pĂ©riphĂ©riques (disques, lecteurs de CD) sont reliĂ©s Ă  la carte mĂšre par une nappe souple comportant des connecteurs 40 points, parfois munis d'un dĂ©trompeur. Ces nappes Ă©taient par le passĂ© munies de 40 fils, mais depuis l'apparition de l'ATA 100, les nappes Ă  80 fils deviennent monnaie courante. La longueur standard des nappes est de 46 cm.

  • Ces connecteurs sont identiques pour le contrĂŽleur et les pĂ©riphĂ©riques, (voir illustration).
  • Les cartes mĂšres sont souvent Ă©quipĂ©es de 2, voire 4 ports IDE ( en 2009, et ce depuis quelques annĂ©es, il est trĂšs rare de voir plus d'un connecteur IDE sur une carte mĂšre rĂ©cente ). À l'avenir, les nouvelles cartes mĂšres devraient voir ce systĂšme disparaĂźtre de leur constitution 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 (ou MaĂźtre / Esclave en français), on positionne un cavalier sur le sĂ©lecteur incorporĂ© au pĂ©riphĂ©rique, en gĂ©nĂ©ral sur la tranche entre le connecteur destinĂ© Ă  la nappe et celui qui est destinĂ© Ă  l'alimentation Ă©lectrique. Il existe aussi une position CS (Cable Select, en français sĂ©lection par le cĂąble) 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. Dans ce cas, le fonctionnement standard suppose que le dernier connecteur de la nappe accueille le pĂ©riphĂ©rique maĂźtre (utilisĂ© par exemple pour le disque dur contenant le systĂšme d'exploitation) tandis que le connecteur intermĂ©diaire permet le branchement du pĂ©riphĂ©rique esclave.

ATA et ATAPI

La connexion IDE tire parti 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ées. 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 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 NCITS 347-2001
ATA-7 ATA/ATAPI-7 Ultra-DMA/133:
UDMA 6: 133
-- NCITS 361-2002
ATA-8 ATA/ATAPI-8 -- -- en projet

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 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 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, 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 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 Description
1F0 + X Registres de commande du 1er contrĂŽleur
3F0 + Y Registres de contrĂŽle 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 de secteurs
3 Secteur
4 Cylindre 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
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, 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 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 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 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
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 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.

Quelques opérations courantes

Connecteur ATA sur une carte mĂšre

Dans cette section, tous les codes sont écrits en assembleur AT&T (par exemple GNU 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 dues 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

IDE DisqueDur.JPG

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 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 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 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 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 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, fixe, est fournie par l'instruction 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 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é 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 (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);

Évolution du standard

Depuis 2003, le standard d'interface de connexion des mémoires de masse évolue peu à peu de l'IDE vers le Serial ATA aussi appelé S-ATA ou SATA.

Notes et références

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 d'ATA/ATAPI
    • PC Programmation SystĂšme, 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
  • Standards
    • T13 Technical 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

Voir aussi

Articles connexes

Liens externes

Ce document provient de « Integrated Drive Electronics ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Integrated Drive Electronics de Wikipédia en français (auteurs)

Regardez d'autres dictionnaires:

  • Integrated drive electronics — Integrated Drive Electronics 
   WikipĂ©dia en Français

  • Integrated Drive Electronics — IDE : Integrated Drive Electronics PATA : Parallel Advanced Technology Attachment 
   Wikipedia Español

  • Integrated Drive Electronics — La interfaz IDE (Integrated Drive Electronics) o ATA (Advanced Technology Attachment) controla los dispositivos de almacenamiento masivo de datos, como los discos duros y ATAPI (Advanced Technology Attachment Packet Interface) añade ademĂĄs… 
   Enciclopedia Universal

  • Integrated Drive Electronics — ATA/ATAPI Stiftleiste (am Host bzw. am PeripheriegerĂ€t) 80 und 40 adrige ATA/ATAPI Kabel, zum Verbinden von Host zu GerĂ€t ATA (Advanced Technology Attachment with Packet 
   Deutsch Wikipedia

  • Integrated Drive Electronics —    Abbreviated IDE. A popular hard disk interface standard, used for disks in the range of 40MB to 1.2GB, requiring medium to fast data transfer rates. The electronic control circuitry is located on the drive itself, thus eliminating the need for 
   Dictionary of networking

  • Integrated Drive Electronics — standard interface for drives, IDE standard 
   English contemporary dictionary

  • IDE (Integrated Drive Electronics) — Integrated Drive Electronics 
   WikipĂ©dia en Français

  • IDE (Integrated drive electronics) — Integrated Drive Electronics 
   WikipĂ©dia en Français

  • Enhanced Integrated Drive Electronics — E IDE L E IDE ou Enhanced Integrated Drive Electronics est une interface usuelle ancienne qui permet de relier un disque dur Ă  la carte mĂšre. Elle est aussi capable de piloter des lecteurs de CD Rom et des unitĂ©s de sauvegarde amovible. Portail… 
   WikipĂ©dia en Français

  • Enhanced Integrated Device Electronics — ATA/ATAPI Stiftleiste (am Host bzw. am PeripheriegerĂ€t) 80 und 40 adrige ATA/ATAPI Kabel, zum Verbinden von Host zu GerĂ€t ATA (Advanced Technology Attachment with Packet 
   Deutsch Wikipedia


Share the article and excerpts

Direct link

 Do a right-click on the link above
and select “Copy Link”

We are using cookies for the best presentation of our site. Continuing to use this site, you agree with this.