Programar el puerto paralelo en Windows con inpout32.dll y hwinterface.sys

Iniciado por ~, 9 Abril 2016, 04:06 AM

0 Miembros y 1 Visitante están viendo este tema.

~

Programar el puerto paralelo en Windows

Descargar lpthandler.tar

Solo necesitamos conectar un LED entre el pin 9 y el 22 del paralelo.

O como muestra el esquema, entre cualquiera de los pines anaranjados (los pines de datos) y cualquiera de los pines grises (pines de polo a Tierra, GND). Tenemos un total de 16 de esos pines, 2 pines por bit de datos para poder conectar las 2 patas de un LED u otro dispositivo.

Asegurarse de poner el LED en la polaridad correcta, o darle vuelta, o simplemente no va a dejar pasar la electricidad y no va a encender.


Uso de este programa para encender todos los 8 LEDS:
lpthandler.exe 3bc 11111111

  o sino el puerto 378
lpthandler.exe 378 11111111

  o sino el puerto 278
lpthandler.exe 278 11111111


Uso de este programa para apagar todos los 8 LEDS:
lpthandler.exe 3bc 00000000

  o sino el puerto 378
lpthandler.exe 378 00000000

  o sino el puerto 278
lpthandler.exe 278 00000000


Cada uno de los 8 bits a escribir debe ser un 1 o 0.
Un 0 apaga y un 1 enciende.



/*
En resumen solo necesitamos:

 Out32(Direccion_Base_Puerto_Paralelo+2, 0);          //Resetear Puerto de Control
 Out32(Direccion_Base_Puerto_Paralelo,   0xFF-0x00);  //Escribir el Puerto de Datos
*/



//Aquí, la Direccion_Base_Puerto_Paralelo
//puede ser:
//          0x3BC -- LPT1
//          0x378 -- LPT1
//          0x278 -- LPT2
///

//Necesitamos resetear el Puerto de Control escribiéndole un 0
//para configurar sus opciones, controladas por cada uno de
//sus bits:
///
 Out32(Direccion_Base_Puerto_Paralelo+2, 0);

//Enviamos un valor entre 0 y 255 al puerto de Datos:
///
 Out32(Direccion_Base_Puerto_Paralelo,   0xFF-0x00);


Por si no se entiende el código, se puede ver cómo se escribió en tiempo real, carácter por carácter como en la programación original:

>> Ver Tutorial Animado de Código de lpthandler.c <<





Cita de: ~ en  7 Abril 2016, 17:35 PMLo primero son los binarios y el código fuente del driver de acceso general a bajo nivel:

inpout32_source_and_bins.zip [Mirror 1]

inpout32_source_and_bins.zip [Mirror 2]


Después necesitamos saber qué direcciones de I/O tiene el puerto paralelo. Los puertos de I/O son como direcciones de memoria que van desde 0 hasta 65535. Cada una de esas posiciones podemos enviar 1, 2 o 4 bytes, o nosotros podemos recibir 1, 2 o 4 bytes. Por ahora solo vamos a enviar 1 byte a la vez.



El LPT1 está en el puerto (0x378, 378h)(888 decimal) o (0x3BC, 3BCh)(956 decimal).

El LPT2 está en el puerto (0x278, 278h)(632 decimal).

El LPT3 está en el puerto (0x3BC, 3BCh)(956 decimal).

El puerto paralelo es un periférico de 8 bits, así que usa 8 pines de datos para representar los 8 bits de cada byte (ya que usa datos y señales en paralelo, simultáneos), y esos son los pines que manipulamos con encendido o apagado cada vez que escribimos, por ejemplo, al puerto 0x378 (Los Pines Anaranjados, del 2 al 9):





Conector Hembra, en la Tarjeta Madre:





Ahora necesitamos usar void _stdcall Out32(short PortAddress, short data), que viene del driver inpout32.dll y hwinterface.sys.

Algo como esto:
Out32(378h, 255-0);





El código completo es el siguiente:
//NOTE: Compile with GCC under MinGW.
//
// gcc lpthandler.c -o lpthandler.exe
//
//Usage:
// lpthandler.exe LPT_Port Byte_Bit_Data
//
// LPT_Port:
//  - can be 3bc, 378 or 278
//
// Byte_Bit_Data:
//  - can range from 00000000 to 11111111 (written like that, in binary).
//    Every bit controls one of 8 LEDs.
//
// LEDs are connected between DATA and GROUND lines.
// DATA to GROUND lines are connected like this, for pins:
//
// DATA is + and GROUND is -
//
//  2-18
//  3-19
//  4-20
//  5-21
//  6-22
//  7-23
//  8-24
//  9-25
//
// Remember to set the parallel ports as Standard/Normal in the BIOS
// to ensure proper working of the basics with this program.
///

#include <stdio.h>
#include <windows.h>

typedef short _stdcall (*_Out32)(short portaddr, short value);
typedef short _stdcall (*_Inp32)(short portaddr);

int main(int argc, char *argv[])
{
HINSTANCE INPOUT32_DLL_Handle;
_Inp32 Inp32;
_Out32 Out32;


//Load the inpout32.dll library. It's also associated
//with hwinterface.sys, but it should open it by itself:
///
 INPOUT32_DLL_Handle=LoadLibrary("inpout32.dll");
 if(INPOUT32_DLL_Handle == NULL)
 {
  printf("LoadLibrary failed for inpout32.dll...\n\n");
  return -1;
 }


//Get access to the Out32/Inp32 functions from inpout32.dll:
///
 Out32 = (_Out32)GetProcAddress(INPOUT32_DLL_Handle, "Out32");
 Inp32 = (_Inp32)GetProcAddress(INPOUT32_DLL_Handle, "Inp32");

//NOTE: The following two lines are the actual logic of the program
//      and are at the top of importance and the program's key logic.
//      Everything else could be considered API noise:

//Configure the CONTROL Port with a 0 to sanitize the port state:
///
 Out32(strtol(argv[1],NULL,16)+2, 0);  //Bit 0: Strobe
                                       //Bit 1: Auto Line Feed
                                       //Bit 2: Initialize Printer
                                       //Bit 3: Select Printer
                                       //Bit 4: Enable IRQ Via Ack Line
                                       //Bit 5: Enable Bi-Directional Port
                                       //Bit 6: Unused
                                       //Bit 7: Unused



//Write the Data port with the desired 8-bit value:
///
 Out32(strtol(argv[1],NULL,16), strtol(argv[2],NULL,2));


//Unload our inpout32.dll library:
///
 FreeLibrary(INPOUT32_DLL_Handle);

return 0;
}

Sitio web (si la siguiente imagen no aparece es porque está offline):

~

Programar el Puerto Paralelo en Windows, Parte 2

Este simplemente es la grabación en video de la grabación de texto para conveniencia y para anidar aquí mismo en los mensajes del foro la grabación, además de también mostrar unos pocos detalles extra durante y fuera de la grabación de texto:

Basics of Parallel Port Programming Under Windows, Part 2 of 2
[youtube=640,480]zAxeCLuWZCk[/youtube]
Sitio web (si la siguiente imagen no aparece es porque está offline):

Hason

Hola , saludos, estoy mirando esto, y no me queda claro , que puedo hacer con esto.

Haber, ¿con el puerto paralelo podria reflasear los drivers de la placa base  si no tengo acceso normalmente?

Agradeceria mayor información.

Un saludo.
Verse constantemente expuesto al peligro puede generar desprecio hacia él.
El que resiste, gana
Aníbal sabía como conseguir la victoria, pero no cómo utilizarla

https://amaltea.wordpress.com/2008/03/06/proverbios-y-refranes-grecolatinos/