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.
| Numero | Nom | Fonction |
|---|---|---|
| 1 | Strobe | Impulsion à zéro avant envoi |
| 2 | D0 | Bit de donnée |
| 3 | D1 | Bit de donnée |
| 4 | D2 | Bit de donnée |
| 5 | D3 | Bit de donnée |
| 6 | D4 | Bit de donnée |
| 7 | D5 | Bit de donnée |
| 8 | D6 | Bit de donnée |
| 9 | D7 | Bit de donnée |
| 10 | ACK | Bit d’état |
| 11 | Busy | Bit d’état |
| 12 | PE | Bit d’état |
| 13 | Select | Bit d’état |
| 14 | LF | Bit de contrôle en sortie |
| 15 | ERR | Entrée |
| 16 | INIT | Bit de contrôle en sortie |
| 17 | Select | Bit de contrôle en sortie |
| 18 a 25 | Masse |
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 :
| 0x378 | Registre de données (D0 a D7) |
| 0x379 | Registre d’état |
| 0x37A | Registre 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.
| Broche | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| Bit | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
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.
| Broche | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| Bit | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
|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
Suivez les prochains articles où vous serons proposés plusieurs programmes, en cours d’écriture, dont vous pourrez vous inspirer dans vos réalisations.



Répondre à l'auteur: