Accueil du site > Programmation > Port parallèle en C sous Linux

Port parallèle en C sous Linux

samedi 12 juin 2004, par Pierre-Luc Bacon


Sommaire

  Obtention de l'accès  
  Opérations sur les ports  
  Comment puis-je agir sur des broches spécifiques ?   
  Programme récapitulatif  
  Montage d'essais  

Le port parallèle, commun à tous les ordinateurs standards, se présente sous la forme d’un connecteur comptant 25 contacts. Ce connecteur, généralement désigné sous l’appellation « sub-d » ou DB25, a été originellement conçu pour les imprimantes. Comme son nom l’indique, le port parallèle envoie et reçoit ses données en parallèle, donc sur plusieurs broches à la fois. Le tableau suivant dresse la liste des fonctions attribuées à chacune de ces broches.

NumeroNomFonction
1StrobeImpulsion à zéro avant envoi
2D0Bit de donnée
3D1Bit de donnée
4D2Bit de donnée
5D3Bit de donnée
6D4Bit de donnée
7D5Bit de donnée
8D6Bit de donnée
9D7Bit de donnée
10ACKBit d’état
11BusyBit d’état
12PEBit d’état
13SelectBit d’état
14LFBit de contrôle en sortie
15ERREntrée
16INITBit de contrôle en sortie
17SelectBit de contrôle en sortie
18 a 25Masse

Obtention de l'accès

Avant toutes manipulations sur le port, nous devons obtenir les droits d’accès sur celui-ci. Pour ce faire nous utiliserons la fonction ioperm() définie dans la librairie standard unistd.h. La déclaration de cette fonction se présente ainsi :

int ioperm(unsigned long from, unsigned long num, int turn_on) ;

La valeur de retour de cette fonction est 0 en cas de réussite et -1 pour un échec. Lorsque l’opération échoue, errno est aussitôt défini.

Le premier paramètre est celui indiquant le registre sur lequel nous demandons les permissions. Le port parallèle dispose de trois registres :

0x378Registre de données (D0 a D7)
0x379Registre d’état
0x37ARegistre de contrôle

Le deuxième élément de ioperm() représenté par la variable num, dans cet exemple, indique le nombres de ports consécutifs devant être ouverts à la suite de from. Quant à l’expression turn_on, elle contient une valeur entière Booléenne spécifiant simplement si les ports doivent être ouverts (1) ou fermés (0). Une attention devra donc être portée de manière à éviter d’omettre la fermeture d’un port dans un programme donné. Voici un exemple d’ouverture et de fermeture à l’aide de la fonction ioperm() :

Opérations sur les ports

L’écriture ou la lecture sur le port peut se faire par l’entremise des fonctions outb() et inb() respectivement. Ces deux fonctions prennent en charge des valeurs codées sur un octet maximum, d’ou le b signifiant byte. Pour des valeurs supérieurs, les fonctions outw() et in(w) issues de l’assembleur sont en mesure d’agir sur le premier port 8 bits (p) et sur le second (p+1). Dans cet article qui se consacre au port parallèle de base, nous utiliserons les fonctions d’octet seulement. Mais sachez que les instructions de manipulations sur un mot (16 bits) pourraient vous être utiles dans des applications où vous utiliserez des ports à plus haut débit comme le port ISA par exemple.

Les fonctions inb() et outb() exigent les arguments suivants :

Comment puis-je agir sur des broches spécifiques ?

Comme nous l’avons vu plus haut, à chaque broche est associé un bit donné. Donc écrire sur une broche spécifique revient simplement à mettre le bit correspondant à 1 ou 0.

Imaginons que l’on veuille mettre au niveau haut les broches 2, 3 et 7. Pour ce faire, nous allons d’abord nous reporter au tableau suivant qui met en correspondance bit et broche.

Broche23456789
BitD0D1D2D3D4D5D6D7

Dans notre exemple, l’octet qui sera écrit aura ainsi la forme 00100011. Quelques notions de binaire suffisent ensuite pour effectuer la conversion vers la valeur décimale :

1*2exp0 + 1*2exp1 +1*2exp5 = 35

Ces quelques explications conduisent vers une version plus complète du tableau précédent.

Broche23456789
BitD0D1D2D3D4D5D6D7

|Valeur|1|2|4|8|16|32|64|128|

Programme récapitulatif

Montage d'essais

Vous pouvez visualiser le résultat de vos expérimentation rapidement en effectuant un simple montage à base de DEL.

Si vous comptez réaliser vos essais sur une plaques à insertion, il serait fortement conseillé de vous fabriquer un adapteur DB25 qui demeurera très utile en tout temps. Des circuits imprimés sont téléchargeables sur ce site à la page de l’article concerné.

Adapteur subd pour plaques à insertion

JPEG - 2.3 ko
Visionneur d’état
Un outil plutôt utile.

Suivez les prochains articles où vous serons proposés plusieurs programmes, en cours d’écriture, dont vous pourrez vous inspirer dans vos réalisations.

P.-S.

L’exécution des programmes qui requièrent un accès au port parallèle doit se faire avec les privilèges de super-utilisateurs (root).
Enregistrer au format PDF
Marquer cet article: Delicious Technorati

Répondre à cet articleRépondre à l'auteur:Pierre-Luc BaconRecommander à un ami

9 Messages de forum