Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > a412ceb851151854794ced2a242192bb > files > 1394

howto-html-fr-20080722-1mdv2010.0.noarch.rpm

<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>6.&nbsp;Quelques ports utiles</title><link href="style.css" rel="stylesheet" type="text/css"><meta content="DocBook XSL Stylesheets V1.69.1" name="generator"><link rel="start" href="index.html" title="
    
        Petit guide de programmation des ports 
        d'entr&eacute;es / sorties sous Linux
    
    "><link rel="up" href="index.html" title="
    
        Petit guide de programmation des ports 
        d'entr&eacute;es / sorties sous Linux
    
    "><link rel="prev" href="ar01s05.html" title="5.&nbsp;D'autres langages de programmation"><link rel="next" href="ar01s07.html" title="7.&nbsp;Conseils"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">6.&nbsp;Quelques ports utiles</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="ar01s05.html">Pr&eacute;c&eacute;dent</a>&nbsp;</td><th align="center" width="60%">&nbsp;</th><td align="right" width="20%">&nbsp;<a accesskey="n" href="ar01s07.html">Suivant</a></td></tr></table><hr></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="N10381"></a>6.&nbsp;Quelques ports utiles</h2></div></div><div></div></div><p>
      Voici quelques informations utiles pour la programmation des ports 
      les plus utilis&eacute;s. Ces ports peuvent &ecirc;tre directement interfac&eacute;s 
      avec une &eacute;lectronique logique de type TTL (ou CMOS).
    </p><p>
      Si vous avez l'intention d'utiliser ces ports ou des ports 
      classiques en vue d'applications pour lesquels ils ont &eacute;t&eacute; con&ccedil;us 
      (par exemple pour contr&ocirc;ler une imprimante ou un modem ordinaire), 
      vous auriez int&eacute;r&ecirc;t &agrave; utiliser les pilotes d&eacute;j&agrave; existants (qui 
      sont g&eacute;n&eacute;ralement inclus dans le noyau) plut&ocirc;t que de programmer 
      directement les ports comme d&eacute;crit dans ce document. Cette section 
      s'adresse principalement aux personnes d&eacute;sireuses de connecter aux 
      ports d'entr&eacute;e / sortie standards de leur PC des &eacute;crans &agrave; 
      cristaux liquides, des moteurs pas-&agrave;-pas ou d'autres montages 
      &eacute;lectroniques faits maison.
    </p><p>
      En revanche, si votre but est de piloter un p&eacute;riph&eacute;rique grand
      public, tel qu'un scanner, disponible sur le march&eacute; depuis
      quelques temps d&eacute;j&agrave;, essayez plut&ocirc;t de savoir si un pilote a
      d&eacute;j&agrave; &eacute;t&eacute; d&eacute;velopp&eacute;. Le <a href="http://www.traduc.org/docs/HOWTO/lecture/Hardware-HOWTO.html" target="_top">Hardware-HOWTO</a> est un
      bon point de d&eacute;part pour mener cette investigation.
    </p><p>
      <a href="http://www.hut.fi/Misc/Electronics/" target="_top">http://www.hut.fi/Misc/Electronics/</a> est
      &eacute;galement une excellente source d'information sur la connexion
      de p&eacute;riph&eacute;riques &agrave; un ordinateur et sur l'&eacute;lectronique en
      g&eacute;n&eacute;rale.
    </p><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="N10393"></a>6.1.&nbsp;Le port parall&egrave;le</h3></div></div><div></div></div><p>
	L'adresse de base du port parall&egrave;le (appel&eacute;e
	<em class="replaceable"><code>BASE</code></em> ci-dessous) est 
	<code class="literal">0x3bc</code> pour <code class="filename">/dev/lp0</code>, <code class="literal">0x378</code>
	pour <code class="filename">/dev/lp1</code> et
	<code class="literal">0x278</code> pour
	<code class="filename">/dev/lp2</code>.
	Si vous souhaitez piloter un mat&eacute;riel fonctionnant comme une
	imprimante classique, voyez le <a href="http://www.traduc.org/docs/HOWTO/lecture/Printing-HOWTO.html" target="_top">Printing-HOWTO</a>.
      </p><p>
	En plus du mode standard d'&eacute;criture-seule d&eacute;crit ci-dessous, il 
	existe un mode &laquo;&nbsp;&eacute;tendu&nbsp;&raquo; bidirectionnel 
	sur la plupart des ports parall&egrave;les. Pour des informations &agrave; ce 
	sujet ainsi que sur les r&eacute;cents modes ECP / EPP (et le 
	standard IEEE 1284 en g&eacute;n&eacute;ral), voici deux adresses&nbsp;:  
	<a href="http://www.fapo.com/" target="_top">http://www.fapo.com/</a> et
	
	<a href="http://www.beyondlogic.org/" target="_top">http://www.beyondlogic.org/</a>. 
	Rappelez-vous cependant que puisque vous ne pouvez pas utiliser 
	les requ&ecirc;tes d'interruptions (IRQ) ou l'acc&egrave;s DMA dans un 
	programme en mode utilisateur, vous serez certainement oblig&eacute; 
	d'&eacute;crire un pilote pour le noyau afin d'exploiter les modes 
	ECP / EPP. Il me semble que quelqu'un est d&eacute;j&agrave; en train de 
	d&eacute;velopper un tel pilote, mais je n'en sais pas plus &agrave; ce sujet.
      </p><p>
	Le port <code class="literal"><em class="replaceable"><code>BASE</code></em>+0</code> 
	(port de donn&eacute;es) contr&ocirc;le les signaux de donn&eacute;es du port 
	(respectivement D0 &agrave; D7 pour les bits 0 &agrave; 7; &eacute;tats&nbsp;: 0 = 
	bas (0V), 1 = haut (5V)). Une &eacute;criture sur ce port positionne 
	l'&eacute;tat des broches correspondantes. La lecture retourne la 
	derni&egrave;re valeur &eacute;crite en mode standard ou &eacute;tendu, sinon les 
	donn&eacute;es pr&eacute;sentes sur les broches connect&eacute;es &agrave; un autre 
	p&eacute;riph&eacute;rique en mode de lecture &eacute;tendue.
      </p><p>
	Le port <code class="literal"><em class="replaceable"><code>BASE</code></em>+1</code>
	(port d'&eacute;tat) est en lecture seule et retourne l'&eacute;tat des
	signaux d'entr&eacute;e suivants&nbsp;:
	</p><div class="itemizedlist"><ul type="disc"><li><p>
	      Bits 0 et 1 sont r&eacute;serv&eacute;s.
	</p></li><li><p>
	      Bit 2 &eacute;tat d'IRQ (ne correspond pas &agrave; une broche, je ne sais pas comment il fonctionne)
	</p></li><li><p>
	      Bit 3 ERROR (1 = &eacute;tat haut)
	</p></li><li><p>
	      Bit 4 SLCT (1 = &eacute;tat haut)
	</p></li><li><p>
	      Bit 5 PE (1 = &eacute;tat haut)
	</p></li><li><p>
	      Bit 6 ACK (1 = &eacute;tat haut)
	</p></li><li><p>
	      Bit 7 -BUSY (0 = &eacute;tat haut)
	</p></li></ul></div><p>
	Le port <code class="literal"><em class="replaceable"><code>BASE</code></em>+2</code> (port de contr&ocirc;le) est en &eacute;criture seule (une lecture sur
	celui-ci retourne la derni&egrave;re valeur &eacute;crite) et contr&ocirc;le les signaux d'&eacute;tat
	suivants&nbsp;:
	</p><div class="itemizedlist"><ul type="disc"><li><p>
	      Bit 0 -STROBE (0 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 1 -AUTO_FD_XT (0 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 2 INIT (1 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 3 -SLCT_IN (0 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 4 active la requ&ecirc;te d'interruption (IRQ) du port 
	      parall&egrave;le (qui survient lors d'une transition 
	      bas-vers-haut de la broche ACK) lorsqu'il est positionn&eacute; &agrave; 
	      1.
	  </p></li><li><p>
	      Bit 5 contr&ocirc;le la direction du mode &eacute;tendu (0 = &eacute;criture, 1 = lecture) et est en &eacute;criture seule (une lecture sur ce bit ne retournera pas de valeur significative).
	  </p></li><li><p>
	      Bits 6 et 7 sont r&eacute;serv&eacute;s.
	  </p></li></ul></div><p>
	Brochage (d'un connecteur femelle sub-D 25 sur le port) 
	(e&nbsp;= entr&eacute;e, s&nbsp;= sortie)&nbsp;:
	</p><pre class="screen">
 1(e/s) -STROBE,   2(e/s) D0,          3(e/s) D1,          4(e/s) D2, 
 5(e/s) D3,        6(e/s) D4,          7(e/s) D5,          8(e/s) D6, 
 9(e/s) D7,       10(e) ACK,          11(e) -BUSY,        12(e) PE, 
13(e) SLCT,       14(s) -AUTO_FD_XT,  15(e) ERROR,        16(s) INIT,     
17(s) -SLCT_IN,   18-25 masse
</pre><p>
	Les sp&eacute;cifications donn&eacute;es par IBM indiquent que les broches 1, 
	14, 16 et 17 (les sorties de contr&ocirc;le) sont de type collecteur 
	ouvert ramen&eacute; &agrave; 5,0&nbsp;V au moyen d'une r&eacute;sistance de 
	4,7&nbsp;kohm (intensit&eacute; de fuite de 20&nbsp;mA, de source 
	0,55&nbsp;mA, &eacute;tat haut de sortie 5,0&nbsp;V moins tension de 
	<span class="foreignphrase"><em class="foreignphrase">pull-up</em></span>). Le reste des broches 
	ont une intensit&eacute; de fuite de 24&nbsp;mA, de source de 
	15&nbsp;mA et leur voltage &agrave; l'&eacute;tat haut est au minimum de 
	2,4&nbsp;V. L'&eacute;tat bas pour toutes les broches est au maximum de 
	0,5&nbsp;V. Les ports parall&egrave;les d'autres types que celui d'IBM 
	peuvent s'&eacute;carter de ce standard. Pour plus d'informations &agrave; ce 
	sujet, voyez l'adresse&nbsp;: <a href="http://www.hut.fi/Misc/Electronics/circuits/lptpower.html" target="_top">http://www.hut.fi/Misc/Electronics/circuits/lptpower.html</a>.
      </p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td valign="top" align="center" rowspan="2" width="25"><img alt="[Avertissement]" src="images/warning.png"></td><th align="left">Avertissement</th></tr><tr><td valign="top" align="left"><p>
	Faites tr&egrave;s attention aux masses&nbsp;! J'ai d&eacute;j&agrave; grill&eacute; &agrave; 
	plusieurs reprises des ports parall&egrave;les en les connectant alors 
	que l'ordinateur &eacute;tait sous tension. Utiliser un port parall&egrave;le 
	non int&eacute;gr&eacute; &agrave; la carte m&egrave;re peut s'av&eacute;rer une bonne solution 
	pour &eacute;viter de trop grands d&eacute;sagr&eacute;ments. Vous pouvez obtenir un 
	second port parall&egrave;le pour votre machine au moyen d'une carte 
	multi-entr&eacute;es / sorties &agrave; petit prix. Il vous suffit de 
	d&eacute;sactiver les ports dont vous n'avez pas besoin, puis de 
	configurer le port parall&egrave;le de la carte sur une adresse libre. 
	Vous n'avez pas besoin de vous pr&eacute;occuper de l'IRQ du port 
	parall&egrave;le si vous n'y faites pas appel.
      </p></td></tr></table></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="N10418"></a>6.2.&nbsp;Le port de manette de jeu</h3></div></div><div></div></div><p>
	Le port de manette de jeu est accessible aux adresses 
	<code class="literal">0x200</code>-<code class="literal">0x207</code>. Si vous 
	souhaitez contr&ocirc;ler une manette de jeu ordinaire, vous serez 
	probablement mieux servi en utilisant les pilotes distribu&eacute;s 
	avec le noyau.
      </p><p>
	Brochage (pour un connecteur sub-D 15 femelle)&nbsp;:
      </p><div class="itemizedlist"><ul type="disc"><li><p>
	      1,8,9,15&nbsp;: +5&nbsp;V (Alimentation)
	    </p></li><li><p>
	      4,5,12&nbsp;: masse
	    </p></li><li><p>
	      2,7,10,14&nbsp;: entr&eacute;es num&eacute;riques, respectivement BA1, 
	      BA2, BB1 et BB2
	    </p></li><li><p>
	      3,6,11,13&nbsp;: entr&eacute;es 
	      &laquo;&nbsp;analogiques&nbsp;&raquo;, respectivement AX, 
	      AY, BX et BY
	    </p></li></ul></div><p>
	Les broches fournissant une tension de +5&nbsp;V semblent 
	souvent &ecirc;tre connect&eacute;es directement sur l'alimentation de la 
	carte m&egrave;re, ce qui peut leur permettre d'obtenir pas mal de 
	puissance, en fonction de la carte m&egrave;re, du bloc d'alimentation 
	et du port de manette de jeu.
      </p><p>
	Les entr&eacute;es num&eacute;riques sont utilis&eacute;es pour les boutons des deux 
	manettes de jeu (manette A et manette B, avec deux boutons 
	chacune) que vous pouvez connecter au port. Ces entr&eacute;es 
	devraient &ecirc;tre de niveau TTL classique, ainsi vous pouvez lire 
	directement leurs valeurs sur le port d'&eacute;tat (voir plus bas). 
	Une v&eacute;ritable manette de jeu retourne un &eacute;tat bas (0&nbsp;V) 
	lorsque le bouton est press&eacute; et un &eacute;tat haut dans l'autre cas 
	(une tension de 5&nbsp;V des broches de d'alimentation au 
	travers d'une r&eacute;sistance de 1&nbsp;kohm).
      </p><p>
	Les pseudo entr&eacute;es analogiques mesurent en r&eacute;alit&eacute; la 
	r&eacute;sistance. Le port de manette de jeu comporte un quadruple 
	monostable (une puce de type NE558) connect&eacute; aux quatre 
	entr&eacute;es. Pour chaque entr&eacute;e, il y a une r&eacute;sistance de 
	2,2&nbsp;kohm entre la broche d'entr&eacute;e et la sortie du 
	monostable, et un condensateur de 0,01&nbsp;&micro;F entre la 
	sortie du monostable et la masse. Une v&eacute;ritable de manette de 
	jeu a un potentiom&egrave;tre pour chaque axe (X et Y), connect&eacute; entre 
	le +5&nbsp;V et la broche d'entr&eacute;e appropri&eacute;e (AX ou AY pour la 
	manette A, ou BX ou BY pour la manette B).
      </p><p>
	Lorsqu'il est activ&eacute;, le monostable initialise ses 
	lignes de sortie &agrave; un &eacute;tat haut (5&nbsp;V) et attend que chaque 
	condensateur de temporisation atteigne une tension de 3,3&nbsp;V 
	avant de mettre la sortie correspondante &agrave; un &eacute;tat bas. La dur&eacute;e 
	de l'&eacute;tat haut de la sortie du temporisateur est proportionnelle 
	&agrave; la r&eacute;sistance du potentiom&egrave;tre de la manette de jeu (en clair, 
	la position du manche de la manette de jeu de l'axe appropri&eacute;) 
	comme expliqu&eacute; ci-dessous&nbsp;:
      </p><div class="blockquote"><blockquote class="blockquote"><p>
      R = (t - 24.2) / 0.011
      </p></blockquote></div><p>
        o&ugrave; <code class="literal">R</code> est la r&eacute;sistance en ohm, du 
        potentiom&egrave;tre et <code class="literal">t</code> la dur&eacute;e de l'&eacute;tat haut de 
        la sortie, en microsecondes.
      </p><p>
	Pour effectuer une lecture sur les entr&eacute;es analogiques, vous 
	devez tout d'abord activer le monostable (au moyen d'une 
	&eacute;criture sur le port, voir plus bas), puis scruter l'&eacute;tat des 
	quatre axes au moyen de lectures r&eacute;p&eacute;t&eacute;es jusqu'&agrave; la transition 
	&agrave; un &eacute;tat bas, permettant ainsi de mesurer la dur&eacute;e de l'&eacute;tat 
	haut. Cette scrutation est tr&egrave;s gourmande en temps machine. De 
	plus, sur un syst&egrave;me multit&acirc;che non temps-r&eacute;el tel que Linux (en 
	mode utilisateur normal) le r&eacute;sultat n'est pas tr&egrave;s pr&eacute;cis, du 
	fait de l'impossibilit&eacute; de scruter le port constamment (&agrave; moins 
	d'utiliser un pilote noyau et de d&eacute;sactiver la gestion des 
	interruptions pendant la scrutation, mais sachez que vous 
	consommerez encore plus de temps machine). Si vous savez &agrave; 
	l'avance que le signal va mettre un certain temps (plusieurs 
	dizaines de millisecondes) avant de basculer, vous pouvez faire 
	appel &agrave; <code class="function">usleep()</code> avant de proc&eacute;der &agrave; la 
	scrutation afin de laisser un peu de temps machine aux autres 
	processus.
      </p><p>
	Le seul port d'entr&eacute;es / sorties auquel vous avez besoin 
	d'acc&eacute;der est le port <code class="literal">0x201</code> (les autres ports 
	se comportent de fa&ccedil;on identique ou ne r&eacute;agissent pas). Toute 
	&eacute;criture sur ce port, peu importe la valeur envoy&eacute;e, active le 
	temporisateur. Une lecture retourne l'&eacute;tat des signaux 
	d'entr&eacute;e&nbsp;:
      </p><div class="itemizedlist"><ul type="disc"><li><p>
	      Bit 0&nbsp;: AX (&eacute;tat de la sortie du temporisateur, 
	      1&nbsp;= &eacute;tat haut)
	  </p></li><li><p>
	      Bit 1&nbsp;: AY (&eacute;tat de la sortie du temporisateur,
	      1&nbsp;= &eacute;tat haut)
	  </p></li><li><p>
	      Bit 2&nbsp;: BX (&eacute;tat de la sortie du temporisateur,
	      1&nbsp;= &eacute;tat haut)
	  </p></li><li><p>
	      Bit 3&nbsp;: BY (&eacute;tat de la sortie du temporisateur,
	      1&nbsp;= &eacute;tat haut)
	  </p></li><li><p>
	      Bit 4&nbsp;: BA1 (entr&eacute;e num&eacute;rique, 1 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 5&nbsp;: BA2 (entr&eacute;e num&eacute;rique, 1 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 6&nbsp;: BB1 (entr&eacute;e num&eacute;rique, 1 = &eacute;tat haut)
	  </p></li><li><p>
	      Bit 7&nbsp;: BB2 (entr&eacute;e num&eacute;rique, 1 = &eacute;tat haut)
	  </p></li></ul></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="N10471"></a>6.3.&nbsp;Le port s&eacute;rie</h3></div></div><div></div></div><p>
	Si le p&eacute;riph&eacute;rique avec lequel vous communiquez est &agrave; peu pr&egrave;s 
	compatible avec le standard RS-232, vous devriez &ecirc;tre en mesure 
	d'utiliser pour cela le port s&eacute;rie. Le pilote s&eacute;rie du noyau 
	Linux devrait suffire pour la plupart des applications (vous ne 
	devriez pas avoir &agrave; programmer le port directement, de plus vous 
	devriez probablement &eacute;crire un pilote pour le noyau si vous 
	souhaitiez le faire), il est en effet tr&egrave;s polyvalent et l'usage 
	de d&eacute;bits non-standards ne devrait pas poser de probl&egrave;mes 
	particuliers.
      </p><p>
	Voyez la page de manuel de
	<span class="citerefentry"><span class="refentrytitle">termios</span>(3)</span>, le code source du pilote 
	(<code class="filename">linux/drivers/char/serial.c</code>) ainsi que la 
	page <a href="http://www.easysw.com/~mike/serial/" target="_top">http://www.easysw.com/~mike/serial/</a> 
	pour plus d'informations sur la programmation des ports s&eacute;ries 
	des syst&egrave;mes Unix.
      </p></div></div><div class="navfooter"><hr><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="ar01s05.html">Pr&eacute;c&eacute;dent</a>&nbsp;</td><td align="center" width="20%">&nbsp;</td><td align="right" width="40%">&nbsp;<a accesskey="n" href="ar01s07.html">Suivant</a></td></tr><tr><td valign="top" align="left" width="40%">5.&nbsp;D'autres langages de programmation&nbsp;</td><td align="center" width="20%"><a accesskey="h" href="index.html">Sommaire</a></td><td valign="top" align="right" width="40%">&nbsp;7.&nbsp;Conseils</td></tr></table></div></body></html>