IOport

Les ios sont un héritage du 8086. Le 8086 accède avait deux zone d'adresse l'une pour la mémoire, l'autre réduite (64 ko) pour les entrées sortie les IO. Il y a belle lurette que les cartes ne se contentent plus de cet espace mais elle continuent à en utiliser quelques octets.

Les ambitions ratées de portabilité entre processeurs (intel, alpha, mip, powerpc) font que les io ne sont pas accessibles directement mais à travers la couche HAL.

Les IO sont supposées translatables. Il faut donc appeler les fonctions en donnant une adresse physique et mémoriser l'adresse logique dans la zone extension pour utilisation ultérieure.

Dans la pratique on constate sur Intel qu'NT nous renvoie la valeur fournie.

A l'utilisation il faudra utiliser les fonctions READ_PORT_TYPE (ex READ_PORT_UCHAR(extention->io_addr_nt)) et WRITE_PORT_TYPE qui doivent utiliser les bonnes vielles fonctions inp et outp avec peut-être du code de synchronisation de bus.

Si vous voulez gérer les conflits entre carte il vous faudra aussi déclarer les ressources utilisées

Voici le code de translation :

PHYSICAL_ADDRESS PortAddress;
PHYSICAL_ADDRESS MappedAddress; // adresse mappée en mémoire
ULONG MemType; // type de mémoire 1=IO 0=Mémoire
PUCHAR io_addr_nt;

// faire de même pour les io
MemType = 1; // dans l'espace io 
// mapper la mémoire de la carte dans l'espace système
PortAddress.LowPart = io_addr;
PortAddress.HighPart = 0;
HalTranslateBusAddress( Isa, // type de carte ISA
0, // bus 0
PortAddress, // adresse physique sur la carte
&MemType, // type mémoire pas IO
&MappedAddress // adresse de map 
);
// récupérer l'adresse logique de cet espace système
extention->io_addr_nt = (PUCHAR)MappedAddress.LowPart;

 

Accueil ] Remonter ]