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.