[Kos-dev] IDE ... ca avance !

Christophe kos-dev@enix.org
Sat, 2 Feb 2002 23:34:20 +0100


[Thomas]
Je me disais bien que t'avais participe au Archos 6000. J'ai un pote
qui l'a achete. T'as pas un ou deux trucs caches a me dire pour que
j'ai le style ? :o)

[Moi]
Euh... ben j'ai un tas de truc là-dessus.

Mais s'est-il renseigné sur un site où ils le décortiquent aussi bien sur le
partie software qu'hardware ?

Je vais te faire une confidence : on aurait pu faire mieux si on nous avait
laissé une peu plus de temps.

[Thomas]
Sinon pour l'IDE maintenant j'arrive a lire le premier secteur, et a
lire et comprendre la table des partitions.

Mais le probleme pour l'instant c'est que je fais tout en "polled
read", c'est à dire que j'attends que le bit BUSY soit a 0. Pour
l'attente je fais une boucle et a chaque fois je fais un usleep(1), ce
qui permet a d'autres threads de tourner, mais je prefererais attendre
l'IRQ.

Sauf que pour l'instant quand je demande a ce qu'il y ai generation
d'IRQ, bin je me choppe jamais d'IRQ. Je viens de me rendre compte que
c'est l'IRQ 14 et 15 qu'il faut utiliser, et donc peut etre qu'il faut
activer l'IRQ sur le pic master qui sert a faire la cascade avec le
slave. Non ?

[Moi]

Plusieurs choses :

- activer la cascade master-slave et les IRQ 14 ou 15;
- placer le bit 1 (nIEN, /IEN : Interrupt No ENable) dans le registre de
port 0x3F6 (octet en écriture, registre Device Controller) soit à 0;

Dés lors que tu écriras une commande dans le registre de port 0x1F7 (octet
en écriture, registre Command), le contrôleur enclenchera - si cela fait
partie du protocole utilisé par la commande) une interruption 14 pour le
primaire ou 15 pour le secondaire dès que le contrôleur sera prêt. Tu dois
alors lire le registre de port 0x1F7 (octet en lecture, registre STATus)
pour avertir le contrôleur de la prise en compte de l'IRQ.

Un chose toutefois : si tu utilises les interruptions mais qu'à un moment
donné tu as besoin de faire du polling, utilise le registre de port 0x3F6
(octet en lecture, registre Alternate STATus) au lieu du registre de port
0x1F7 pour éviter la perte d'un IRQ. Ces deux registres font exactement la
même chose que le dernier a une effet sur la valeur du pin INTR du contôleur
ATA.

Ah, petit détail, on devrait dire ATA et non IDE ! il y a un site là-dessus
avec un source de driver freeware : www.ata-atapi.com.

Voilà :)