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 :

Portage appels DeviceIoControl windows sous linux


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 Portage appels DeviceIoControl windows sous linux
    Bonjour,

    Je souhaite porter sur Linux (Red Hat 7.3) du code C Windows qui permet de programmer un FPGA en passant par le port parallèle.
    J'ai réussi à faire le mapping entre CreateFile windows et open Linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HANDLE    nt_device_handle = CreateFile( 
                nt_lpt_str,
                GENERIC_READ | GENERIC_WRITE,
                0,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL );
    Donne: int nt_device_handle open("/dev/lp0", O_RDWR);

    Mais je ne parviens pas à porter les appels Windows DeviceIoControl en ioctl Linux (qui serait l'équivalent d'après mes recherches).
    Mon problème est que le prototype de DeviceIoControl est statique et que celui de ioctl ne l'est pas (d'après le man).
    Quand je passe rigoureusement les mêmes arguments, ça ne passe pas.

    Par exemple, ici une opération de read (je crois):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    result = DeviceIoControl(
     nt_device_handle,                         /* handle to device */
     PGDC_IOCTL_GET_DEVICE_INFO_PP,   /* IO control code */
     (ULONG *) NULL,                          /* IN buffer (list buffer) */
     0,                                        /* length of IN buffer in bytes */
     &buffer,                               /* OUT buffer, unsigned long buffer[1] */
     sizeof(ULONG),                     /* length of OUT buffer in bytes */
     &returned_length,                /* number of writes performed, unsigned long =0 */
     NULL ))                              /* wait for operation to complete */
    que je transforme en (ça me retourne -1, errno = Invalid Argument):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    result = ioctl(
     nt_device_handle,
     PGDC_IOCTL_GET_DEVICE_INFO_PP,
     (unsigned long *) NULL,
     0,
     &buffer,
     sizeof(unsigned long),
     &returned_length,
     NULL ))
    Quelqu'un a-t-il une expérience de ces appels ioctl ?
    Merci d'avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 601
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 601
    Points : 17 914
    Points
    17 914
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nico2022
    Quelqu'un a-t-il une expérience de ces appels ioctl ?
    Merci d'avance.
    oui, mais je connais pas sous *n*x les symboles :


    PGDC_IOCTL_GET_DEVICE_INFO_PP

    Explicites un peu plus ce que tu veux faire stp....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  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 veux positionner des bits, faire des read/write et puis envoyer un gros buffer (en fait un fichier pour programmer le FPGA).

    Je ne parviens pas à trouver à quoi ces codes correspondent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define	PGDC_IOCTL_GET_DEVICE_INFO_PP	0x00166A00L
    #define PGDC_IOCTL_READ_PORT_PP			0x00166A04L
    #define PGDC_IOCTL_WRITE_PORT_PP		0x0016AA08L
    #define PGDC_IOCTL_PROCESS_LIST_PP		0x0016AA1CL
    #define PGDC_WRITE_PORT					0x0a82
    #define PGDC_HDLC_NTDRIVER_VERSION		2
    Il y a un certain nombre d'appels DeviceIoControl du même type qui servent à lire ou écrire sur le port parallèle standard 25 pins.
    (Je précise que j'utilise maintenant un port parallèle 10 pins sous Linux.
    Je n'en ai pas d'autres.
    Je ne sais pas si cela va avoir un impact.
    Les adresses des registres du port parallèle sur mon Linux semblent classiques.
    J'espère que c'est bien lp0 même si le connecteur change.)

    Un autre exemple (write d'un octet):
    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
     
    // index des registres du port parallèle par rapport à l'adresse de base
    // (apparemment 0x3bc chez moi)
    #define LPT_DATA	0 
    #define LPT_STATUS	1
    #define LPT_CONTROL	2
     
    buffer[0] = port; //=1 pour LPT_STATUS, =2 pour LPT_CONTROL
    buffer[1] = data; //=0x40 par ex
     
     
    status = DeviceIoControl(
    	nt_device_handle,	/* Handle to device */
    	PGDC_IOCTL_WRITE_PORT_PP, /* IO Control code for write */
    	(ULONG *)&buffer,	/* Buffer to driver. */
    	2 * sizeof(int),	/* Length of buffer in bytes. */
    	(ULONG *)NULL,		/* Buffer from driver.  Not used. */
    	0,			/* Length of buffer in bytes. */
    	(ULONG *)&returned_length,	/* Bytes returned.  Should be zero. */
    	NULL);			/* Wait for operation to complete */
    Je viens de m'apercevoir que mon port parallèle 10 pins dit qu'il fonctionne en "Compatibility mode".
    Apparemment, c'est un mode unidirectionnel (seulement output).
    Ca peut être un problème, au moins pour le read.

  4. #4
    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
    J'avance.
    Apparemment, il y avait un bout de prise hardware derrière auquel ces codes PGDC peuvent appartenir.
    Donc, je vais virer tous les appels qui ont des codes comme ça.
    Par contre, il faudra bien que je sois capable de communiquer avec le FPGA directement.
    Je reviens.

  5. #5
    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
    Il y avait une prise hardware qui se branchait sur le port parallèle classique (25 pin) du PC sous Windows.
    Tous les appels à DeviceIoControl étaient destinés à ce driver.
    Maintenant, je n'ai plus cette prise et donc plus ce driver non plus.
    Les appels ioctl doivent attaquer directement le port parallèle 10 pin de ma carte PC.
    Je me suis rendu compte qu'un "lsmod" effectué sur ma carte PC Linux ne me renvoie rien.
    En particulier, je lis sur plein de sites que pour gérer un port parallèle, il faut les modules parport et parport_pc.
    Je ne sais pas trop où les trouver.
    Mais je vais chercher.

  6. #6
    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
    Bon, je vais ouvrir un autre topic et revenir sur celui-là après quand mon problème de port parallèle sera résolu.

  7. #7
    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
    J'ai installé le module ppdev "user space parallel port driver" sur la carte Linux.
    Par la suite, les appels ioctl semblent fonctionner:
    Exemple:
    fd = open("/dev/parport0", O_RDWR);
    ioctl(fd,PPCLAIM);

    Le port parallèle de ma carte ne réagit pas trop quand je fais des read/write.
    Mais bon ça avance.

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

Discussions similaires

  1. Emulation windows sous linux
    Par steve o'steen dans le forum Applications et environnements graphiques
    Réponses: 10
    Dernier message: 01/06/2006, 20h42
  2. HDD Windows sous linux (Reconnaissance) sous Mandrake
    Par fod_34 dans le forum Matériel
    Réponses: 4
    Dernier message: 19/04/2006, 19h01
  3. Acceder a windows sous linux
    Par vinzzzz dans le forum Administration système
    Réponses: 4
    Dernier message: 17/03/2006, 19h13
  4. Réponses: 1
    Dernier message: 29/11/2005, 17h06
  5. bizarrerie avec l'appel system read sous linux.
    Par Hypnocrate dans le forum C
    Réponses: 20
    Dernier message: 20/11/2005, 02h47

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