Detection ide

Signaler
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
salut,

quelqu'un aurait-il une doc ou un algo afin de detecter les peripheriques IDE et SATA sans l'aide du BIOS mais par acces aux ports E/S.

@++

1 réponse

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

exemple en Nasm:
ici, je lit le registre de status, je l'affiche, j'envoi une commande NOP au controleur et je réaffiche les status lus apres jusqu'a
!BUSY

apparement, si aucun disque n'est attaché au controleur, il repond 0x20 ou 0x00 ( peut etre suivant MASTER/SLAVE )
faut que je teste avec différentes positions MASTER/SLAVE et différentes combinaisons.

je préfererai gagner du temps avec un algo fiable.

( dans le cadre d'un boot en 32 bits )

PRIVATE ideTrace:;(devid)
LOCALBEGIN
pushb 0
pushb 0

%define lbuf pd[ebp-4]
%define lstat pd[ebp-8]

This ebx
sub esp,128
mov lbuf,esp

mov eax,__param(0)
lea esi,[ebx+CZONE]
mov edi,[ebx+eax*4+DISK.IDE.dev]
lea edi,[edi+ebx]

xor eax,eax
movzx edx,word [edi+IDEPARM.iobase]
lea edx,[edx+IDEREG_ALTST]
in al,dx
mov lstat,eax

lea edx,[ebx+IDESTR.fmtB]
call printf,lbuf,edx,lstat
mov eax,lbuf
call StaticPrint

mov eax,lstat
inc al
je .3

movzx edx,word [edi+IDEPARM.iobase]
mov al,(CB_DC_HD15+CB_DC_NIEN)
lea edx,[edx+IDEREG_ALTST]
out dx,al

movzx edx,word [edi+IDEPARM.iobase]
mov al,[esi+IDEPARM.drive]
lea edx,[edx+IDEREG_DSEL]
out dx,al

movzx edx,word [edi+IDEPARM.iobase]
mov al,IDECMD_NOP
lea edx,[edx+IDEREG_CMD]
out dx,al

IODELAY 50

.1
movzx edx,word [edi+IDEPARM.iobase]
xor eax,eax
lea edx,[edx+IDEREG_ALTST]
in al,dx
cmp eax,lstat
mov lstat,eax
je .2
lea edx,[ebx+IDESTR.fmtB]
call printf,lbuf,edx,lstat
mov eax,lbuf
call StaticPrint
.2
test lstat,IDEST_BSY
jne .1

.3
LOCALEND
ret

voilà, j'espère que c plus clair
( pas d'API ici car c'est moi qui doit la faire : )

@++