Cómo leer y escribir en un puerto paralelo desde un programa C utilizando el driver ppdev y la llamada al sistema ioctl

Módulos necesarios

Necesitaremos tener instalados los módulos parport, parport_pc y ppdev. Estos módulos ya vienen incluidos a partir del Linux 2.4.x y superiores.

Lo primero que se hará es ejecutar el comando lsmod, para ver una lista de los módulos cargados, si no aparecen los módulos que necesitamos habrá que cargarlos, para ello utilizamos los comandos insmod o modprobe.

Obtener permisos

La función ioctl envía comandos al puerto paralelo a través del archivo de sistema /dev/parport0, sólo tiene permisos de lectura y escritura el superusuario y el grupo lp (en Debian); los usuarios que requieran acceso al puerto paralelo deben ser añadidos a dicho grupo.

Función ioctl

El Formato de ioctl es: ioctl(fd, operctl, res)

  • fd: Aquí indicamos el archivo de dispositivo, en nuestro caso /dev/parport0 que está asociado al puerto paralelo.
  • operctl: Indicamos que es lo que queremos hacer con el puerto (ver sección Comandos de Control).
  • res: En nuestro caso devuelve un unsined char, pero dependiendo del uso de ioctl puede devolver otro tipo de datos.

Para ver el funcionamiento de ioctl, lo mejor es un ejemplo:

/** Abrimos el fichero de dispositivo para lectura y escritura. **/
fd = open("/dev/parport0", O_RDWR);

/** Lo primero es pedir el acceso al puerto. **/
if( ioctl(fd, PPCLAIM)){
    perror("PPCLAIM");
    close(fd);
    return 1;
}

for (;;) {
   /** Consultamos el registro de estado y el resultado se
       guarda en la variable status. **/

  ioctl(fd, PPRSTATUS, &status);

  /** Si se recibe un acknowledge salimos del bucle. **/
  if((status & 0x40) == 0x00)
      break;
}

Comandos de Control

  • PPCLAIM: Pedir acceso al puerto.
  • PPWCONTROL y PPRCONTROL: Escribir y leer datos de control respectivamente.
  • PPRSTATUS: Leer el registro de estado.
  • PPWDATA y PPRDATA: Para escribir y leer datos respectivamente.

Estos son los habituales, pero en el enlace GUIE-The Linux 2.4 Parallel Port Subsystem podréis encontrar muchos más.

Referencias



blog comments powered by Disqus