IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Comment contrôler le port parallèle via ioctl


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Comment contrôler le port parallèle via ioctl
    Bonjour,

    J'ai une carte PC qui tourne avec un linux embarqué RedHat 7.3 (2.4.17 gcc 2.95.3).
    Je cherche à contrôler le port parallèle (10 pin) de la carte pour ensuite lire/écrire dans une Flash et finalement programmer un FPGA.
    Il n'a qu'un seul port parallèle physique (connecteur He10-10 pin) sur ma carte.
    Mais, je ne sais pas où lire/écrire car je vois 3 ports parallèles logiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # ls /dev | grep -e par -e lp
    lp0
    par0
    par1
    par2
    # cat /proc/ioports | grep parport
    0x278-0x27a : parport2
    0x378-0x37a : parport1
    0x3bc-0x3be : parport0
    J'ai cherché dans les posts et je suis tombé sur des bouts de code intéressants que j'ai récupéré et adapté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    char* par0 = "/dev/par0";
    char* par1 = = "/dev/par1";
    char* par1 = = "/dev/par2";
    int p0,p1,p2,res;
     
    p0 = open ( par0, O_RDWR | O_NOCTTY | O_NDELAY ) ;
    if ( p0 == -1 ) { fprintf(stderr,"Error open %s failed\n",par0) ;}
      else {fprintf(stdout,"---open %s success\n",par0);}
    p1 = open ( par0, O_RDWR | O_NOCTTY | O_NDELAY ) ;
    if ( p1 == -1 ) { fprintf(stderr,"Error open %s failed\n",par1) ;}
      else {fprintf(stdout,"---open %s success\n",par1);}
    p2 = open ( par0, O_RDWR | O_NOCTTY | O_NDELAY ) ;
    if ( p2 == -1 ) { fprintf(stderr,"Error open %s failed\n",par2) ;}
      else {fprintf(stdout,"---open %s success\n",par2);}
     
    res = ioctl ( p0 , PPCLAIM , &i ) ;
    if ( res != 0 )
    {fprintf(stderr,"NH: %s ERROR PPCLAIM res=%d,errno=%s\n",par0,res,strerror(errno));}
    res = ioctl ( p1 , PPCLAIM , &i ) ;
    if ( res != 0 )
    {fprintf(stderr,"NH: %s ERROR PPCLAIM res=%d,errno=%s\n",par1,res,strerror(errno));}
    res = ioctl ( p2 , PPCLAIM , &i ) ;
    if ( res != 0 )
    {fprintf(stderr,"NH: %s ERROR PPCLAIM res=%d,errno=%s\n",par2,res,strerror(errno));}
    Le résultat à l'execution est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    lp0: compatibility mode
    ---open /dev/par0 success
    lp1: compatibility mode
    ---open /dev/par1 success
    lp2: compatibility mode
    ---open /dev/par2 success
    /dev/par1 ERROR PPCLAIM res=-1,errno=Invalid argument
    /dev/par2 ERROR PPCLAIM res=-1,errno=Invalid argument
    /dev/par0 ERROR PPCLAIM res=-1,errno=Invalid argument
    Quelqu'un a-t-il une idée de pourquoi PPCLAIM échoue ?
    Quel est le port logique que je dois attaquer ?
    Le compatibility mode est-il un problème ?
    Merci d'avance.

  2. #2
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Port parallèle 10-pin avec ppdev ?
    Bonjour,

    J'ai installé le module "ppdev".
    Les appels ioctl("/dev/parport0", PPCLAIM...) fonctionnent désormais.

    ppdev semble écrit pour gérer les "PC-style hardware", ce que je comprends par "les ports parallèles standards (25-pin)".

    Puis-je contrôler mon port parallèle 10-pin avec ppdev ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Je m'en suis sorti.
    J'ai vérifié dans le BIOS l'adresse du port parallèle, c'était l'adresse classique 0x378.
    J'ai exécuté des appels "outb(valeur,0x378);" pour écrire dans le registre de DATA du port parallèle.
    Avec un oscillo, j'ai vérifié et rien ne sortait sur les pins de mon port parallèle 10-pin.

    Finalement, le buffer était bloqué en sortie tant que le bit AUTOFEED (bit 1 du registre de contrôle du port parallèle) n'était pas positionné à 1 dans mon code (c'est un '0' au final puisque ce bit est inversé):
    Donc avant d'envoyer les données sur mon port parallèle, il fallait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int autofeed = 0x2; // 0000 0010 = autofeed positionné à 1
    // Get permission 
      if (ioperm(BASE, 3, 1) < 0)   // BASE=0x378
        {
          perror("ioperm() 3 registers"); 
          status = ERROR_OPEN_PORT;
        }
      else
        {
          outb (autofeed, BASE+2);  // BASE+2=adresse du CONTROL register
        }
    Ceci a rendu la sortie de mon buffer valide et j'ai pu voir les signaux sortir sur les pins via l'oscillo.
    Après, j'ai utilisé seulement des appels outb() et inb(), suffisants dans mon cas (utilisation du port parallèle en mode standard - SPP).
    Les appels ioctl() nécessitent entre autres l'installation du module ppdev et me semblent utiles dans le cas d'une utilisation du port parallèle en mode ECP et EPP.
    Là c'est moi qui interprète.
    Voilà.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment contrôler un port usb
    Par Nerkem dans le forum C++
    Réponses: 9
    Dernier message: 08/08/2011, 17h51
  2. Comment piloter le port parallèle d'un PC ?
    Par kmaniche dans le forum Contribuez
    Réponses: 0
    Dernier message: 19/01/2010, 11h33
  3. Contrôler un port parallèle
    Par Crabe05 dans le forum Qt
    Réponses: 3
    Dernier message: 03/12/2008, 15h10
  4. Réponses: 6
    Dernier message: 09/04/2008, 22h49
  5. Comment contrôler le port parallèle d'une carte PCI ?
    Par Carheim dans le forum Composants
    Réponses: 1
    Dernier message: 07/08/2006, 23h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo