🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #14767

Re: Programacion del puerto paralelo

#14767
From: Manuel V. Santos L�pez
Date: Thu, 05 Oct 2000 00:00
122 lines
4916 bytes
El jue, 05 oct 2000, Deivit escribi�:
>Tengo una placa de 8 rel�s conectada al puerto paralelo. Bajo DOS desarroll�
>un programa que la hacia funcionar correctamente, pero no tengo ni idea de
>como portar eso a Linux (exactamente Debian Woody).
>
>La cuesti�n es la siguiente: Los reles se encienden mandando un byte
>hexadec. al puerto paralelo, por ejemplo: BFh = 10111111 mandando eso,
>encenderia los reles 1 y 3,4,5,6,7,8. En DOS el programa me funciona bien,
>pero no se como hacerlo en Linux pues nunca he programado para este OS y no
>se como funcionan las librerias y eso. Adjunto va el codigo que yo escribi,
>y si alguien me ayuda a pasarlo a linux se lo agradeceria :)
>
>RELAY.C--------
>-----------------------------------
>#include <dos.h>
>
>#define LPT1 0x00400008  /* BIOS printer address entries */
>#define LPT2 0x0040000a
>#define LPT3 0x0040000c
>#define LPT4 0x0040000e
>
>int main(int argc, char *argv[])
>{
>unsigned int port,data;
>unsigned int bios_printer_addr;
>
>if (argc>3) exit(1);
>  switch(argc)
>    {
>      case 1:
>        exit(1);
>
>      case 2:
>        port=*(bios_printer_addr=LPT1);
>        if (port==NULL)
>          {
>            printf("LPT1 does not exist\n");
>            exit(1);
>          }
>
>        sscanf(argv[1],"%x",&data);
>        break;
>
>      case 3:
>         if (argv[1][0]=='/')
>           switch(argv[1][1])
>     {
>       case '1':
>         port=*(bios_printer_addr=LPT1);
>                if (port==NULL)
>                  {
>                    printf("LPT1 does not exist\n");
>                    exit(1);
>                  }
>                sscanf(argv[2],"%x",&data);
>                 break;
>
>       case '2':
>         port=*(bios_printer_addr=LPT2);
>                if (port==NULL)
>                  {
>                    printf("LPT2 does not exist\n");
>                    exit(1);
>                  }
>
>                sscanf(argv[2],"%x",&data);
>         break;
>
>              case '3':
>                port=*(bios_printer_addr=LPT3);
>                if (port==NULL)
>                  {
>                    printf("LPT3 does not exist\n");
>                    exit(1);
>                  }
>
>                sscanf(argv[2],"%x",&data);
>                break;
>
>              case '4':
>                port=*(bios_printer_addr=LPT4);
>                if (port==NULL)
>                  {
>                    printf("LPT4 does not exist\n");
>                    exit(1);
>                  }
>
>                sscanf(argv[2],"%x",&data);
>                break;
>
>       default:
>                printf("Invalid printer port!\n");
>       exit(1);
>     }
> else exit(1);
>    }
>
>   outportb(port, (char)data);
>   return 0;
>}

Es muy sencillo. Consulta la llamada ioperm(). �sta permite acceder a los
puertos de E/S en linux. 

Es una funci�n privilegiada, por lo que tendr�s que
tener privilegios de root para ejecutarla. Tambien es posible cambiar el bit
SET UID de los permisos del programa, para que lo pueda ejecutar cualquier
usuario.

Para hacer la entrada y la salida de un puerto existen las siguientes funciones:
       outb, outw, outl, outsb, outsw, outsl - salida por puerto
       inb, inw, inl, insb, insw, insl - entrada desde puerto
       outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - E/S pausada

Existe una forma m�s elegante que todo esto, es crear un controlador de
dispositivo. Si te animas consulta estos ducumentos on-line:
	The linux kernel hacker's guide.
	The linux kernel hacker's modules

(Creo que los nombres son correctos).

Espero haberte ayudado. Manvic.
Technical Details
Message-ID: <970677968.1434194023@news.wanadoo.es>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <1D1D5.4$Ba2.88@telenews.teleline.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f9fff,52f70884b47e3bd7
X-Google-Attributes: gidf9fff,public
X-Google-Thread: 10465c,52f70884b47e3bd7
X-Google-Attributes: gid10465c,public
X-Google-Thread: f78ff,52f70884b47e3bd7
X-Google-Attributes: gidf78ff,public
X-Google-Thread: f86c8,52f70884b47e3bd7
X-Google-Attributes: gidf86c8,public
From: Manuel V. Santos L�pez <manvic@wanadoo.es>
Subject: Re: Programacion del puerto paralelo
Date: 2000/10/05
Message-ID: <970677968.1434194023@news.wanadoo.es>
X-Deja-AN: 677942363
Content-Transfer-Encoding: 8bit
References: <1D1D5.4$Ba2.88@telenews.teleline.es>
Followup-To: es.comp.os.linux.programacion,esp.comp.so.linux.programacion,linux.debian.spanish,linux.debian.user.spanish
Content-Type: text/plain; charset="iso-8859-1"
X-Complaints-To: abuse@wanadoo.es
X-Trace: m2newsread.uni2.es 970764589 62.36.132.191 (Thu, 05 Oct 2000 18:49:49 MET DST)
Organization: Servidor Usenet News de Uni2/Wanadoo
MIME-Version: 1.0
NNTP-Posting-Date: Thu, 05 Oct 2000 18:49:49 MET DST
Newsgroups: es.comp.os.linux.programacion,esp.comp.so.linux.programacion,linux.debian.spanish,linux.debian.user.spanish