Programmation
modules sous Linux (partie
1) |
Suivant Programmation module |
V . Le bus PCI |
Le bus PCI (Peripheral Component Interconnect) est
une norme développée initialement par INTEL et distribuée
en version 1.0 en 1992. Cette toute première définition présentait
le PCI comme un bus local, proche des ressources, gravitant autour du processeur
central.
La spécification du bus a été étendue en 1993 de
manière à inclure une environnement plus large, avec des ressources
disposées sur des cartes enfichables dans une connectique normalisée.
Enfin, en 1995, la révision 2.1 de cette norme, a incorporé des
clarifications, ainsi que les spécifications nécessaires à
la migration du bus vers la technologie de cadencement à 66 MHz.
Une révision 2.2 est actuellement finalisée, elle devrait inclure
des définitions sur la gestion de l’énergie des alimentations.
Le bus PCI est un bus synchrone supportant un multiplexage
des signaux d’adressages et de données.
Il est avant tout prévu pour travailler avec des systèmes 32 bits,
dans un fonctionnement en échange entre un maître et un esclave
sous le contrôle d’un arbitre.
D’après la spécification du bus, un minimum de 49 signaux
est nécessaire pour un module capable d’assurer des fonctions de
maître, tandis que les autres signaux normalisés peuvent n’être
que des options.
La spécification du bus autorise l’interconnexion de quatre cartes
sur le bus PCI.
La norme prévoit également l’emploi de passerelles (bridges)
d’un bus PCI vers un autre bus PCI ou vers un autre type de bus (ISA par
exemple).
Dans le cas de l’utilisation de bridges PCI/PCI, jusqu’à
256 passerelles sont possibles.
Le principe de transfert de données sur le bus PCI exploite les échanges
par paquets (burst).
Pour le transfert de données, le PCI se compose donc :
Du bus
d’adresses et de données multiplexé, noté
AD[31..00], qui permet donc d’exploiter 32 bits en adressage (4 Go). Ce
bus réalise tout d'abord la phase dite d’adressage, puis il devient
bus de données (multiplexage).
Du bus
de commandes et de validation d’octets, noté C/BE[3..0]*,
qui permet, durant la phase d’adressage, de transmettre la commande de
bus, puis il devient bus de validation des données (groupes de 32 bits
sur le bus de données).
Du bus
de contrôle qui regroupe les signaux gérés par
le maître :
FRAME* : Départ et validation de transaction.
IRDY* : Etat du maître de l'échange.
En réponse l’esclave fournit :
TRDY* : Etat de l’esclave dans échange.
DEVSEL* : Indique la sélection d’un esclave
s’étant reconnu après l’adressage.
STOP* : Demande d’arrêt de l'échange.
Pour exécuter un transfert sur le bus PCI, le maître concerné
doit d’abord s’assurer de la disponibilité du bus pour son
propre usage. Le maître engage alors l’accès bus en positionnant
l’adresse et la commande, en même temps que le FRAME*. Après
un front d’horloge, le maître positionne alors l’IRDY*, qui
signale qu’il est paré pour le transfert, mais surtout qu'il termine
la phase d’adressage.
Les esclaves potentiellement concernés sont alors amenés à
répondre au maître consécutivement aux décodage d’adresses
qu’ils ont chacun réalisés. Le signal DEVSEL* positionné
indique alors qu’un esclave s’est reconnu pour l’échange,
et le positionnement de TRDY* indique qu’il est prêt pour le transfert.
Le maître positionne alors les signaux de validation des octets C/BE[3..0]*
, et dans le cas de l’écriture, émet la donnée. L’esclave
positionne, ou lit, la donnée et informe qu’il est paré
pour la suite en conservant TRDY*.
Le maître termine enfin l’échange, ou l’esclave réclame
la fin du transfert par STOP*,
Signaux de contrôle (CLK, RST*, PAR, PERR* et SERR*)
Le bus PCI étant synchrone, il intègre un signal d’horloge
global CLK. Une commande d’initialisation par le signal RST* est également
distribuée à tous les agents du bus. Par ailleurs, les agents
du PCI gèrent la parité par un signal PAR calculé sur les
bus AD[31..0] et C/BE[3..0]*. Une détection d’erreur pouvant entraîner
le positionnement d’un signal d’erreur PERR*. Enfin, une erreur
système, considérée comme grave, est signalée par
SERR* vers, en général, l’arbitre du bus.
Gestion des interruptions
Les interruptions sur le PCI sont optionnelles par rapport à la configuration
minimale nécessaire. Lorsqu’elles sont utilisées, elles
sont au nombre de quatre et fonctionnent de manière
asynchrone. Cependant, seule l’interruption INTA* est distribuée
à tous les agents par défaut. Lorsqu’une interruption est
prise en compte par le gestionnaire, l’acquittement et le transfert du
vecteur correspondant se font classiquement par le bus, mais en utilisant le
bus de commande C/BE[3..0]* positionné spécifiquement.
Les évolutions successives du bus PCI sont intervenues
sur les facteurs suivants :
Fréquence
: passage de 33 Mhz à 66 Mhz
Taille
: de 32 bits à 64 bits
Tension
: de 5V à 3.3V
Bande
passante max. : de 132 MO/s à 528 MO/s
Remarque: Si on ne considère que le transfert de données,
il faut ramener le taux de transfert à environ 80 à 90 MO/s pour
le mode 32 bits et 320 à 360 MO/s pour le mode 64 bits.
Le bus PCI a connu aussi des variantes en fonction de divers
besoins :
Le CompactPCI :
cette norme est en fait l'adaptation aux besoins industriels (connectique plus
résistante). Elle compatible électriquement même si elle
peut fonctionner sous 3.3V. Elle intègre aussi le Hot Swap qui permet
l'ajout et le retrait des cartes à chaud.
Le PXI (PCI eXtension for Instrumentation) est également
un bus adapté selon la même réflexion que le CompactPCI,
mais il vise plus le domaine de l’instrumentation. Sa norme est plus sévère
que celle du CompactPCI, sachant que des capacités logicielles sont aussi
spécifiées (stipulant que chaque module PXI doit supporter les
OS Window$).
Le SmallPCI (SPCI) pour l'intégration de l'architecture
PCI dans les ordinateurs portables. Elle possède les mêmes caractéristiques
et performances que le PCI standard.
Le PCI Hot Plug qui est en fait une extension à la norme
PCI pour permettre l'ajout et le retrait des cartes à chaud. Initiée
par Compaq, elle est maintenant un Industry Open standard.
Le PCIx, sous la conduite d'IBM, HP et Compaq, sera une norme
destinée aux serveurs. Elle devrait posséder une fréquence
de 133 Mhz et supportait des taux de transfert de 1 GO/s.
La norme PCI permet de définir trois espaces différents
: mémoire, E/S et configuration.
A l'initialisation, seul l'accès à l'espace de configuration est
possible.
La gestion des espaces mémoire et d'E/S ne sera donc possible qu'après
la lecture et l'interprétation des informations contenues dans l'espace
de configuration.
Les fonctionnalités liées aux espaces mémoire et d'E/S
ne seront pas les mêmes suivants les cartes PCI utilisées. En effet,
Une carte réseau n'offrira pas les mêmes fonctionalités
qu'une carte CAN/CNA industrielle par exemple.
La définition du PCI fournit une description complète d’un
espace de configuration que doit assurer tout composant interfaçable
sur le bus.
Les composants offrent un espace de 256 octets inclus dans
des registres. Les 64 premiers octets sont organisés de manière
standard.
Cet ensemble de registres est implanté de manière à pouvoir
être modifié au niveau local par un processeur intégré
par une mémoire externe.
Cependant, c’est surtout au niveau de l’accessibilité par
le bus PCI que cet espace est intéressant.
Les deux premiers registres identifient de manière unique le périphérique
:
Vendor
ID : numéro du constructeur de l'interface. Le groupe PCI Sig
fournit des numéros valides.
Device
ID : numéro de périphérique chez le constructeur.
Les registres suivants sont :
Le registre
Class Code permet d'indentifier le type de périphérique.
Les
registres Base Address Register (BAR 0 à BAR 5, soit
6 registres possibles) constituent un espace d'accès aux fonctions du
périphérique (les plages mémoires et/ou les ports d'E/S).
Le registre
IRQ Pin indiquera si l'interface gère les interruptions
et
le registre
IRQ line permettra de connaître le niveau de l'interruption
alloué par le BIOS.
Remarque : dans le cas du développement d'un driver pour une carte PCI, le programmeur devra connaître exactement le contenu des fonctionnalités de l'interface pour pouvoir les exploiter à partir des BARx. Généralement, cela s'obtient dans la documentation fournie par le constructeur de l'interface.
Le bus PCI étant Plug and Play, il sera donc configurer
automatiquement parle BIOS au démarrage de la machine.
L'utilisateur peut accèder aux informations concernant la configuration
et la détection des périphériques PCI en utilisant différents
outils :
La commande dmesg
qui permet de visualiser les messages émis par le système au démarrage.
La configuration PCI du système est visible par l'interface /proc
et la commande lspci.
Remarques :
La commande lspci
(et ses options) et la visualisation du fichier /proc/pci
donneront sensiblement les mêmes informations.
Pour accèder aux informations complètes de l'espace de configuration
des interfaces PCI, il faut utiliser la structure /proc/bus/pci.
Un répertoire est créé pour chaque numéro de bus
et un fichier pour chaque numéro de device sur le bus. Avec la commande
od, on pourra alors obtenir un
affichage en hexadécimal du contenu des registres. On peut aussi utiliser
l'option -x dela commande lspci.
Précédent Gestion des périphériques |
Sommaire |
Suivant Programmation module |
© 2002 for www.tvtsii.net by tv |