[Kos-dev] encore une IRQ (2) !

kos-dev@enix.org kos-dev@enix.org
04 Feb 2002 14:18:08 +0100


"Christophe" <hlide@club-internet.fr> writes:

> Bon, dernier essai, masque l'interruption avant et enl=E8ve usleep(1)=
 apr=E8s
> l'=E9criture sur le registre Device Control et fais une boucle de lec=
ture dans
> le registre Status jusqu'=E0 ce que le contr=F4leur soit pr=EAt puis =
d=E9masque
> l'interruption : as-t-on toujours la g=E9n=E9ration de l'IRQ ?

Voila le bout de code. De toute facon il ne rentre jamais dans les
boucles while d'attente d'effacement du bit BSY. Il est tout de suite
a 0 le bit BSY !

Concernant le delay d'attente de 1 micro seconde, c'est parce que j'ai
rien d'autre que usleep pour le moment. usleep marque le thread
comment etant endormi, et le reactive n microsecondes plus tard.=20

Pour coder un truc plus precis (400ns), l'attente active ne
serait-elle pas plus appropriee ? (au lieu de marquer le thread comme
endormi, d'en choisir un autre, etc...). je ne me rends pas bien
compte que represente 400ns en nombre d'instructions.

  /* Attendre que le controleur soit pret */
  while(inb(ioaddr + ATA_STATUS) & ATA_S_BSY)
    {
      printk("Status is 0x%x\n", inb(ioaddr + ATA_ALTPORT));
      usleep(1);
    }
=20=20
  /* On lit le registre de status (a l'execution, il vaut bien 0x50) */
  printk("Status is 0x%x\n", inb(ioaddr + ATA_STATUS));

  i8259_disable_irq(IRQ_HARDDISK);
  /* On met nIEN a 1 dans device control */
  outb(ATA_A_nIEN | ATA_A_4BIT, ioaddr + ATA_DEVICE_CONTROL);
  usleep(1);


  /* on attend que le controleur soit pret */
  while(inb(ioaddr + ATA_STATUS) & ATA_S_BSY)
    {
      printk("Status is 0x%x\n", inb(ioaddr + ATA_ALTPORT));
      usleep(1);
    }

  i8259_enable_irq(IRQ_HARDDISK);
  /* =3D> ET LA BING IRQ */

  /* on selectionne le device */
  outb(ATA_D_IBM | device, ioaddr + ATA_DRIVE);

=20=20
=20=20
  /* on affiche l'etat (a l'execution : 0x50) */
  printk("Status is 0x%x\n", inb(ioaddr + ATA_STATUS));

  /* on envoie la commande */
  printk("Sencind cmd\n");
  outb(ATA_C_ATA_IDENTIFY, ioaddr + ATA_CMD);

Thomas
--=20
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso)      http://www.enix.org/~thomas/
(KOS)        http://kos.enix.org/=20
(Club LinUT) http://club-linut.enix.org