mirror of
https://github.com/reactos/reactos.git
synced 2025-06-24 21:31:04 +00:00
159 lines
3.5 KiB
C
159 lines
3.5 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS kernel
|
|
* FILE: services/parallel/parallel.c
|
|
* PURPOSE: Parallel port driver
|
|
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
* UPDATE HISTORY:
|
|
* ??/??/??: Created
|
|
* 18/06/98: Made more NT like
|
|
*/
|
|
|
|
/* FUNCTIONS **************************************************************/
|
|
|
|
#include <wdm.h>
|
|
|
|
#include "parallel.h"
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
|
|
#define LP_B (0x378)
|
|
#define LP_S (READ_PORT_UCHAR((PUCHAR)(LP_B+1)))
|
|
#define LP_C (LP_B+2)
|
|
|
|
NTSTATUS NTAPI
|
|
DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
|
|
|
|
static void Parallel_Reset(void)
|
|
/*
|
|
* FUNCTION: Resets the device attached to the parallel port
|
|
*/
|
|
{
|
|
int i;
|
|
|
|
WRITE_PORT_UCHAR((PUCHAR)LP_C,0);
|
|
for (i=0;i<LP_DELAY;i++);
|
|
WRITE_PORT_UCHAR((PUCHAR)LP_C,LP_PSELECP | LP_PINITP);
|
|
}
|
|
|
|
static void Parallel_putchar(unsigned char ch)
|
|
/*
|
|
* FUNCTION: Writes a character to the parallel port
|
|
* ARGUMENTS:
|
|
* ch = character to write
|
|
*/
|
|
{
|
|
|
|
int count=0;
|
|
int status;
|
|
int wait=0;
|
|
|
|
do
|
|
{
|
|
status=LP_S;
|
|
count++;
|
|
}
|
|
while ( count < 500000 && !(status & LP_PBUSY) );
|
|
|
|
if (count==500000)
|
|
{
|
|
DPRINT("printer_putchar(): timed out\n");
|
|
return;
|
|
}
|
|
|
|
WRITE_PORT_UCHAR((PUCHAR)LP_B,ch);
|
|
while (wait != 10000) { wait++; }
|
|
WRITE_PORT_UCHAR((PUCHAR)LP_C, (LP_PSELECP | LP_PINITP | LP_PSTROBE ));
|
|
while (wait) { wait--; }
|
|
WRITE_PORT_UCHAR((PUCHAR)LP_C, LP_PSELECP | LP_PINITP);
|
|
}
|
|
|
|
static DRIVER_DISPATCH Dispatch;
|
|
static NTSTATUS NTAPI
|
|
Dispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
/*
|
|
* FUNCTION: Handles user mode requests
|
|
* ARGUMENTS:
|
|
* DeviceObject = Device for request
|
|
* Irp = I/O request packet describing request
|
|
* RETURNS: Success or failure
|
|
*/
|
|
{
|
|
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
|
|
NTSTATUS status;
|
|
ULONG i;
|
|
|
|
switch (Stack->MajorFunction)
|
|
{
|
|
case IRP_MJ_CREATE:
|
|
DPRINT("(Parallel Port Driver) Creating\n");
|
|
Parallel_Reset();
|
|
status = STATUS_SUCCESS;
|
|
break;
|
|
|
|
case IRP_MJ_CLOSE:
|
|
status = STATUS_SUCCESS;
|
|
break;
|
|
|
|
case IRP_MJ_WRITE:
|
|
DPRINT("(Parallel Port Driver) Writing %d bytes\n",
|
|
Stack->Parameters.Write.Length);
|
|
for (i=0;i<Stack->Parameters.Write.Length;i++)
|
|
{
|
|
Parallel_putchar(((char *)Irp->UserBuffer)[i]);
|
|
}
|
|
status = STATUS_SUCCESS;
|
|
break;
|
|
|
|
default:
|
|
status = STATUS_NOT_IMPLEMENTED;
|
|
break;
|
|
}
|
|
|
|
Irp->IoStatus.Status = status;
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return(status);
|
|
}
|
|
|
|
NTSTATUS NTAPI
|
|
DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
|
|
/*
|
|
* FUNCTION: Called by the system to initialize the driver
|
|
* ARGUMENTS:
|
|
* DriverObject = object describing this driver
|
|
* RegistryPath = path to our configuration entries
|
|
* RETURNS: Success or failure
|
|
*/
|
|
{
|
|
PDEVICE_OBJECT DeviceObject;
|
|
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\Parallel");
|
|
NTSTATUS Status;
|
|
|
|
DPRINT("Parallel Port Driver 0.0.1\n");
|
|
|
|
Status = IoCreateDevice(DriverObject,
|
|
0,
|
|
&DeviceName,
|
|
FILE_DEVICE_PARALLEL_PORT,
|
|
0,
|
|
FALSE,
|
|
&DeviceObject);
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
return(Status);
|
|
}
|
|
|
|
DeviceObject->Flags=0;
|
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = Dispatch;
|
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = Dispatch;
|
|
DriverObject->MajorFunction[IRP_MJ_WRITE] = Dispatch;
|
|
DriverObject->DriverUnload = NULL;
|
|
|
|
return(STATUS_SUCCESS);
|
|
}
|
|
|
|
/* EOF */
|