Author: cfinck
Date: Thu Jul 16 15:12:50 2015
New Revision: 68406
URL:
http://svn.reactos.org/svn/reactos?rev=68406&view=rev
Log:
Merge r67713 and r67936 (Eric's parport driver) from trunk
Added:
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/fdo.c
- copied, changed from r67713, trunk/reactos/drivers/parallel/parport/fdo.c
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/hardware.h
- copied unchanged from r67936, trunk/reactos/drivers/parallel/parport/hardware.h
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/misc.c
- copied, changed from r67713, trunk/reactos/drivers/parallel/parport/misc.c
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/pdo.c
- copied, changed from r67713, trunk/reactos/drivers/parallel/parport/pdo.c
Modified:
branches/colins-printing-for-freedom/ (props changed)
branches/colins-printing-for-freedom/reactos/ (props changed)
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/CMakeLists.txt
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.c
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.h
Propchange: branches/colins-printing-for-freedom/
------------------------------------------------------------------------------
svn:mergeinfo = /trunk:67713,67936
Propchange: branches/colins-printing-for-freedom/reactos/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jul 16 15:12:50 2015
@@ -20,3 +20,4 @@
/branches/usb-bringup:51335,51337,51341-51343,51348,51350,51353,51355,51365-51369,51372,51384-54388,54396-54398,54736-54737,54752-54754,54756-54760,54762,54764-54765,54767-54768,54772,54774-54777,54781,54787,54790-54792,54797-54798,54806,54808,54834-54838,54843,54850,54852,54856,54858-54859
/branches/usb-bringup-trunk:55019-55543,55548-55554,55556-55567
/branches/wlan-bringup:54809-54998
+/trunk/reactos:67713,67936
Modified:
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
---
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/CMakeLists.txt [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/CMakeLists.txt [iso-8859-1]
Thu Jul 16 15:12:50 2015
@@ -1,5 +1,16 @@
-add_library(parport SHARED parport.c parport.rc)
+list(APPEND SOURCE
+ fdo.c
+ misc.c
+ pdo.c
+ parport.c
+ parport.h)
+
+add_library(parport SHARED
+ ${SOURCE}
+ parport.rc)
+
set_module_type(parport kernelmodedriver)
+add_pch(parport parport.h SOURCE)
add_importlibs(parport ntoskrnl hal)
add_cd_file(TARGET parport DESTINATION reactos/system32/drivers FOR all)
Copied: branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/fdo.c (from
r67713, trunk/reactos/drivers/parallel/parport/fdo.c)
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
--- trunk/reactos/drivers/parallel/parport/fdo.c [iso-8859-1] (original)
+++
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/fdo.c [iso-8859-1]
Thu Jul 16 15:12:50 2015
@@ -6,37 +6,6 @@
*/
#include "parport.h"
-
-/*
- * The following constants describe the various signals of the printer port
- * hardware. Note that the hardware inverts some signals and that some
- * signals are active low. An example is LP_STROBE, which must be programmed
- * with 1 for being active and 0 for being inactive, because the strobe signal
- * gets inverted, but it is also active low.
- */
-
-/*
- * bit defines for 8255 status port
- * base + 1
- * accessed with LP_S(minor), which gets the byte...
- */
-#define LP_PBUSY 0x80 /* inverted input, active high */
-#define LP_PACK 0x40 /* unchanged input, active low */
-#define LP_POUTPA 0x20 /* unchanged input, active high */
-#define LP_PSELECD 0x10 /* unchanged input, active high */
-#define LP_PERRORP 0x08 /* unchanged input, active low */
-
-/*
- * defines for 8255 control port
- * base + 2
- * accessed with LP_C(minor)
- */
-#define LP_PINTEN 0x10
-#define LP_PSELECP 0x08 /* inverted output, active low */
-#define LP_PINITP 0x04 /* unchanged output, active low */
-#define LP_PAUTOLF 0x02 /* inverted output, active low */
-#define LP_PSTROBE 0x01 /* inverted output, active low */
-
/* FUNCTIONS ****************************************************************/
@@ -86,11 +55,7 @@
DeviceExtension->Common.IsFDO = TRUE;
DeviceExtension->Common.PnpState = dsStopped;
- DeviceExtension->ParallelPortNumber =
IoGetConfigurationInformation()->ParallelCount++;
- if (pLptPortNumber == NULL)
- DeviceExtension->LptPort = DeviceExtension->ParallelPortNumber + 1;
- else
- DeviceExtension->LptPort = *pLptPortNumber;
+ DeviceExtension->PortNumber =
IoGetConfigurationInformation()->ParallelCount++;
DeviceExtension->Pdo = Pdo;
Status = IoAttachDeviceToDeviceStackSafe(Fdo,
@@ -141,127 +106,185 @@
IN PCM_RESOURCE_LIST ResourceListTranslated)
{
PFDO_DEVICE_EXTENSION DeviceExtension;
+ ULONG i;
+// ULONG Vector = 0;
+// KIRQL Dirql = 0;
+// KAFFINITY Affinity = 0;
+// KINTERRUPT_MODE InterruptMode = Latched;
+// BOOLEAN ShareInterrupt = TRUE;
+
+ DPRINT("FdoStartDevice ()\n");
+
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ ASSERT(DeviceExtension);
+ ASSERT(DeviceExtension->Common.IsFDO == TRUE);
+
+ if (!ResourceList)
+ {
+ DPRINT1("No allocated resources sent to driver\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ if (ResourceList->Count != 1)
+ {
+ DPRINT1("Wrong number of allocated resources sent to driver\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ if ((ResourceList->List[0].PartialResourceList.Version != 1) ||
+ (ResourceList->List[0].PartialResourceList.Revision != 1) ||
+ (ResourceListTranslated->List[0].PartialResourceList.Version != 1) ||
+ (ResourceListTranslated->List[0].PartialResourceList.Revision != 1))
+ {
+ DPRINT1("Revision mismatch: %u.%u != 1.1 or %u.%u != 1.1\n",
+ ResourceList->List[0].PartialResourceList.Version,
+ ResourceList->List[0].PartialResourceList.Revision,
+ ResourceListTranslated->List[0].PartialResourceList.Version,
+ ResourceListTranslated->List[0].PartialResourceList.Revision);
+ return STATUS_REVISION_MISMATCH;
+ }
+
+ DeviceExtension->BaseAddress = 0;
+
+ for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
+ {
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
&ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptorTranslated =
&ResourceListTranslated->List[0].PartialResourceList.PartialDescriptors[i];
+
+ switch (PartialDescriptor->Type)
+ {
+ case CmResourceTypePort:
+ DPRINT("Port: BaseAddress 0x%lx Length %lu\n",
+ PartialDescriptor->u.Port.Start.u.LowPart,
+ PartialDescriptor->u.Port.Length);
+
+ if (DeviceExtension->BaseAddress == 0)
+ {
+ if (PartialDescriptor->u.Port.Length < 8)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ DeviceExtension->BaseAddress =
PartialDescriptor->u.Port.Start.u.LowPart;
+ }
+ break;
+
+ case CmResourceTypeInterrupt:
+ DPRINT("Interrupt: Level %lu Vector %lu\n",
+ PartialDescriptorTranslated->u.Interrupt.Level,
+ PartialDescriptorTranslated->u.Interrupt.Vector);
+
+// Dirql = (KIRQL)PartialDescriptorTranslated->u.Interrupt.Level;
+// Vector = PartialDescriptorTranslated->u.Interrupt.Vector;
+// Affinity = PartialDescriptorTranslated->u.Interrupt.Affinity;
+
+// if (PartialDescriptorTranslated->Flags &
CM_RESOURCE_INTERRUPT_LATCHED)
+// InterruptMode = Latched;
+// else
+// InterruptMode = LevelSensitive;
+
+// ShareInterrupt = (PartialDescriptorTranslated->ShareDisposition ==
CmResourceShareShared);
+ break;
+
+ default:
+ DPRINT1("Other ressource: \n");
+ break;
+ }
+ }
+
+ DPRINT("New LPT port: Base 0x%lx\n",
+ DeviceExtension->BaseAddress);
+
+ if (!DeviceExtension->BaseAddress)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+#if 0
+ if (!Dirql)
+ return STATUS_INSUFFICIENT_RESOURCES;
+#endif
+
+ DeviceExtension->Common.PnpState = dsStarted;
+
+
+ /* We don't really care if the call succeeded or not... */
+
+ return STATUS_SUCCESS;
+}
+
+
+static
+NTSTATUS
+FdoCreateRawParallelPdo(
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PPDO_DEVICE_EXTENSION PdoDeviceExtension = NULL;
+ PDEVICE_OBJECT Pdo = NULL;
WCHAR DeviceNameBuffer[32];
WCHAR LinkNameBuffer[32];
WCHAR LptPortBuffer[32];
UNICODE_STRING DeviceName;
UNICODE_STRING LinkName;
UNICODE_STRING LptPort;
- ULONG i;
-// ULONG Vector = 0;
-// KIRQL Dirql = 0;
-// KAFFINITY Affinity = 0;
-// KINTERRUPT_MODE InterruptMode = Latched;
-// BOOLEAN ShareInterrupt = TRUE;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING KeyName;
HANDLE KeyHandle;
NTSTATUS Status;
- DPRINT("FdoStartDevice ()\n");
-
- DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- ASSERT(DeviceExtension);
- ASSERT(DeviceExtension->Common.IsFDO == TRUE);
-
- if (!ResourceList)
- {
- DPRINT1("No allocated resources sent to driver\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if (ResourceList->Count != 1)
- {
- DPRINT1("Wrong number of allocated resources sent to driver\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if ((ResourceList->List[0].PartialResourceList.Version != 1) ||
- (ResourceList->List[0].PartialResourceList.Revision != 1) ||
- (ResourceListTranslated->List[0].PartialResourceList.Version != 1) ||
- (ResourceListTranslated->List[0].PartialResourceList.Revision != 1))
- {
- DPRINT1("Revision mismatch: %u.%u != 1.1 or %u.%u != 1.1\n",
- ResourceList->List[0].PartialResourceList.Version,
- ResourceList->List[0].PartialResourceList.Revision,
- ResourceListTranslated->List[0].PartialResourceList.Version,
- ResourceListTranslated->List[0].PartialResourceList.Revision);
- return STATUS_REVISION_MISMATCH;
- }
-
- DeviceExtension->BaseAddress = 0;
-
- for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
- {
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
&ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptorTranslated =
&ResourceListTranslated->List[0].PartialResourceList.PartialDescriptors[i];
-
- switch (PartialDescriptor->Type)
- {
- case CmResourceTypePort:
- DPRINT("Port: BaseAddress 0x%lx Length %lu\n",
- PartialDescriptor->u.Port.Start.u.LowPart,
- PartialDescriptor->u.Port.Length);
-
- if (DeviceExtension->BaseAddress == 0)
- {
- if (PartialDescriptor->u.Port.Length < 8)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- DeviceExtension->BaseAddress =
PartialDescriptor->u.Port.Start.u.LowPart;
- }
- break;
-
- case CmResourceTypeInterrupt:
- DPRINT("Interrupt: Level %lu Vector %lu\n",
- PartialDescriptorTranslated->u.Interrupt.Level,
- PartialDescriptorTranslated->u.Interrupt.Vector);
-
-// Dirql = (KIRQL)PartialDescriptorTranslated->u.Interrupt.Level;
-// Vector = PartialDescriptorTranslated->u.Interrupt.Vector;
-// Affinity = PartialDescriptorTranslated->u.Interrupt.Affinity;
-
-// if (PartialDescriptorTranslated->Flags &
CM_RESOURCE_INTERRUPT_LATCHED)
-// InterruptMode = Latched;
-// else
-// InterruptMode = LevelSensitive;
-
-// ShareInterrupt = (PartialDescriptorTranslated->ShareDisposition ==
CmResourceShareShared);
- break;
-
- default:
- DPRINT1("Other ressource: \n");
- break;
- }
- }
-
- DPRINT("New LPT port: Base 0x%lx\n",
- DeviceExtension->BaseAddress);
-
- if (!DeviceExtension->BaseAddress)
- return STATUS_INSUFFICIENT_RESOURCES;
-
-#if 0
- if (!Dirql)
- return STATUS_INSUFFICIENT_RESOURCES;
-#endif
-
- /* Create link \DosDevices\LPTX -> \Device\ParallelPortX */
- swprintf(DeviceNameBuffer, L"\\Device\\ParallelPort%lu",
DeviceExtension->ParallelPortNumber);
- swprintf(LinkNameBuffer, L"\\DosDevices\\LPT%lu",
DeviceExtension->LptPort);
- swprintf(LptPortBuffer, L"LPT%lu", DeviceExtension->LptPort);
- RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
+ DPRINT("FdoCreateRawParallelPdo()\n");
+
+ FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* Create new device object */
+ swprintf(DeviceNameBuffer,
+ L"\\Device\\Parallel%lu",
+ FdoDeviceExtension->PortNumber);
+ RtlInitUnicodeString(&DeviceName,
+ DeviceNameBuffer);
+
+ Status = IoCreateDevice(DeviceObject->DriverObject,
+ sizeof(PDO_DEVICE_EXTENSION),
+ &DeviceName,
+ FILE_DEVICE_CONTROLLER,
+ 0,
+ FALSE,
+ &Pdo);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("IoCreateDevice() failed with status 0x%08x\n", Status);
+ goto done;
+ }
+
+ Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
+ Pdo->Flags |= DO_POWER_PAGABLE;
+
+ PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Pdo->DeviceExtension;
+ RtlZeroMemory(PdoDeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
+
+ PdoDeviceExtension->Common.IsFDO = FALSE;
+ PdoDeviceExtension->Common.PnpState = dsStopped;
+
+ Pdo->StackSize = DeviceObject->StackSize + 1;
+
+ FdoDeviceExtension->AttachedRawPdo = Pdo;
+ PdoDeviceExtension->AttachedFdo = DeviceObject;
+
+ PdoDeviceExtension->PortNumber = FdoDeviceExtension->PortNumber;
+ PdoDeviceExtension->LptPort = PdoDeviceExtension->PortNumber + 1;
+
+
+ /* Create link \DosDevices\LPTX -> \Device\ParallelY */
+ swprintf(LinkNameBuffer, L"\\DosDevices\\LPT%lu",
PdoDeviceExtension->LptPort);
RtlInitUnicodeString(&LinkName, LinkNameBuffer);
- RtlInitUnicodeString(&LptPort, LptPortBuffer);
Status = IoCreateSymbolicLink(&LinkName,
&DeviceName);
if (!NT_SUCCESS(Status))
{
DPRINT1("IoCreateSymbolicLink() failed with status 0x%08x\n", Status);
- return Status;
- }
-
+ goto done;
+ }
+
+ swprintf(LptPortBuffer, L"LPT%lu", PdoDeviceExtension->LptPort);
+ RtlInitUnicodeString(&LptPort, LptPortBuffer);
/* Write an entry value under HKLM\HARDWARE\DeviceMap\PARALLEL PORTS. */
/* This step is not mandatory, so do not exit in case of error. */
@@ -292,10 +315,66 @@
ZwClose(KeyHandle);
}
- DeviceExtension->Common.PnpState = dsStarted;
-
-
- /* We don't really care if the call succeeded or not... */
+ Pdo->Flags |= DO_BUFFERED_IO;
+ Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
+
+done:
+ if (!NT_SUCCESS(Status))
+ {
+ if (Pdo)
+ {
+ ASSERT(PdoDeviceExtension);
+ IoDeleteDevice(Pdo);
+ }
+ }
+
+ return Status;
+}
+
+
+static
+NTSTATUS
+FdoQueryBusRelations(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ PIO_STACK_LOCATION IrpSp)
+{
+ PFDO_DEVICE_EXTENSION DeviceExtension;
+ PDEVICE_RELATIONS DeviceRelations;
+ ULONG Size;
+ ULONG i;
+ ULONG PdoCount = 0;
+ NTSTATUS Status;
+
+ UNREFERENCED_PARAMETER(IrpSp);
+
+ DPRINT("FdoQueryBusRelations()\n");
+
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ ASSERT(DeviceExtension->Common.IsFDO);
+
+ /* TODO: Enumerate parallel devices and create their PDOs */
+
+ Status = FdoCreateRawParallelPdo(DeviceObject);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ PdoCount++;
+
+ /* Allocate a buffer for the device relations */
+ Size = sizeof(DEVICE_RELATIONS) + sizeof(PDEVICE_OBJECT) * (PdoCount - 1);
+ DeviceRelations = ExAllocatePoolWithTag(PagedPool, Size, PARPORT_TAG);
+ if (DeviceRelations == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Fill the buffer */
+ i = 0;
+ ObReferenceObject(DeviceExtension->AttachedRawPdo);
+ DeviceRelations->Objects[i] = DeviceExtension->AttachedRawPdo;
+
+ Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
+
+ DPRINT("Done\n");
return STATUS_SUCCESS;
}
@@ -345,7 +424,7 @@
goto done;
}
- DPRINT("Open LPT%lu: successful\n", DeviceExtension->LptPort);
+ DPRINT("Open parallel port %lu: successful\n",
DeviceExtension->PortNumber);
DeviceExtension->OpenCount++;
done:
@@ -397,68 +476,11 @@
FdoWrite(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- PFDO_DEVICE_EXTENSION DeviceExtension;
- PIO_STACK_LOCATION IoStack;
- PUCHAR Buffer;
- ULONG i;
- UCHAR PortStatus;
- ULONG ulCount;
-
DPRINT("FdoWrite()\n");
-
- DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- Buffer = GetUserBuffer(Irp);
- DPRINT("Length: %lu\n", IoStack->Parameters.Write.Length);
- DPRINT("Buffer: %p\n", Buffer);
-
- if (Buffer != NULL)
- {
- DPRINT("%s\n", Buffer);
- }
-
- for (i = 0; i < IoStack->Parameters.Write.Length; i++)
- {
- DPRINT("%lu: %c\n", i, Buffer[i]);
-
- ulCount = 0;
-
- do
- {
- KeStallExecutionProcessor(10);
- PortStatus = READ_PORT_UCHAR((PUCHAR)(DeviceExtension->BaseAddress + 1));
- ulCount++;
- }
- while (ulCount < 500000 && !(PortStatus & LP_PBUSY));
-
- if (ulCount == 500000)
- {
- DPRINT1("Timed out\n");
-
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_TIMEOUT;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return STATUS_TIMEOUT;
- }
-
- /* Write character */
- WRITE_PORT_UCHAR((PUCHAR)DeviceExtension->BaseAddress, Buffer[i]);
-
- KeStallExecutionProcessor(10);
-
- WRITE_PORT_UCHAR((PUCHAR)(DeviceExtension->BaseAddress + 2), (LP_PSELECP |
LP_PINITP | LP_PSTROBE));
-
- KeStallExecutionProcessor(10);
-
- WRITE_PORT_UCHAR((PUCHAR)(DeviceExtension->BaseAddress + 2), (LP_PSELECP |
LP_PINITP));
- }
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
return STATUS_SUCCESS;
}
@@ -524,26 +546,29 @@
switch (Stack->Parameters.QueryDeviceRelations.Type)
{
case BusRelations:
- DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
BusRelations\n");
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
BusRelations\n");
+ Status = FdoQueryBusRelations(DeviceObject, Irp, Stack);
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+
+ case RemovalRelations:
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
RemovalRelations\n");
return ForwardIrpAndForget(DeviceObject, Irp);
- case RemovalRelations:
- DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
RemovalRelations\n");
- return ForwardIrpAndForget(DeviceObject, Irp);
-
default:
- DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown
type 0x%lx\n",
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown
type 0x%lx\n",
Stack->Parameters.QueryDeviceRelations.Type);
return ForwardIrpAndForget(DeviceObject, Irp);
}
break;
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* (optional) 0xd */
- DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
+ DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
return ForwardIrpAndForget(DeviceObject, Irp);
default:
- DPRINT1("Unknown minor function 0x%x\n", MinorFunction);
+ DPRINT("Unknown minor function 0x%x\n", MinorFunction);
return ForwardIrpAndForget(DeviceObject, Irp);
}
Copied: branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/misc.c (from
r67713, trunk/reactos/drivers/parallel/parport/misc.c)
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
--- trunk/reactos/drivers/parallel/parport/misc.c [iso-8859-1] (original)
+++
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/misc.c [iso-8859-1]
Thu Jul 16 15:12:50 2015
@@ -61,7 +61,10 @@
{
PDEVICE_OBJECT LowerDevice;
- LowerDevice =
((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice;
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ LowerDevice =
((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice;
+ else
+ LowerDevice =
((PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedFdo;
ASSERT(LowerDevice);
IoSkipCurrentIrpStackLocation(Irp);
Modified: branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.c
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
---
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.c [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.c [iso-8859-1]
Thu Jul 16 15:12:50 2015
@@ -7,7 +7,15 @@
#include "parport.h"
static DRIVER_UNLOAD DriverUnload;
+static DRIVER_DISPATCH DispatchCreate;
+static DRIVER_DISPATCH DispatchClose;
+static DRIVER_DISPATCH DispatchCleanup;
+static DRIVER_DISPATCH DispatchPnp;
+static DRIVER_DISPATCH DispatchPower;
DRIVER_INITIALIZE DriverEntry;
+
+
+/* FUNCTIONS ****************************************************************/
static
VOID
@@ -17,14 +25,109 @@
DPRINT("Parport DriverUnload\n");
}
+
+static
+NTSTATUS
+NTAPI
+DispatchCreate(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ return FdoCreate(DeviceObject, Irp);
+ else
+ return PdoCreate(DeviceObject, Irp);
+}
+
+
+static
+NTSTATUS
+NTAPI
+DispatchClose(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ return FdoClose(DeviceObject, Irp);
+ else
+ return PdoClose(DeviceObject, Irp);
+}
+
+
+static
+NTSTATUS
+NTAPI
+DispatchCleanup(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ return FdoCleanup(DeviceObject, Irp);
+ else
+ return PdoCleanup(DeviceObject, Irp);
+}
+
+
+static
+NTSTATUS
+NTAPI
+DispatchWrite(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ return FdoWrite(DeviceObject, Irp);
+ else
+ return PdoWrite(DeviceObject, Irp);
+}
+
+
+static
+NTSTATUS
+NTAPI
+DispatchPnp(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ return FdoPnp(DeviceObject, Irp);
+ else
+ return PdoPnp(DeviceObject, Irp);
+}
+
+
+static
+NTSTATUS
+NTAPI
+DispatchPower(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+ return FdoPower(DeviceObject, Irp);
+ else
+ return PdoPower(DeviceObject, Irp);
+}
+
+
NTSTATUS
NTAPI
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegPath)
{
+ ULONG i;
+
DPRINT("Parport DriverEntry\n");
DriverObject->DriverUnload = DriverUnload;
+ DriverObject->DriverExtension->AddDevice = AddDevice;
+
+ for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
+ DriverObject->MajorFunction[i] = ForwardIrpAndForget;
+
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
+ DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
+ DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCleanup;
+// DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
+ DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchWrite;
+// DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
+// DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
DispatchQueryInformation;
+ DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
return STATUS_SUCCESS;
}
Modified: branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.h
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
---
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.h [iso-8859-1]
(original)
+++
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/parport.h [iso-8859-1]
Thu Jul 16 15:12:50 2015
@@ -1,6 +1,7 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: Parallel Port Function Driver
+ * FILE: drivers/parallel/parport/parport.h
* PURPOSE: Parport driver header
*/
@@ -8,9 +9,143 @@
#define _PARPORT_PCH_
#include <ntddk.h>
-#include <ntddser.h>
+#include <ndk/haltypes.h>
+#include <ntddpar.h>
+#include <stdio.h>
+
+#include "hardware.h"
//#define NDEBUG
#include <debug.h>
+typedef enum
+{
+ dsStopped,
+ dsStarted,
+ dsPaused,
+ dsRemoved,
+ dsSurpriseRemoved
+} DEVICE_STATE;
+
+typedef struct _COMMON_DEVICE_EXTENSION
+{
+ BOOLEAN IsFDO;
+ DEVICE_STATE PnpState;
+} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
+
+typedef struct _FDO_DEVICE_EXTENSION
+{
+ COMMON_DEVICE_EXTENSION Common;
+
+ PDEVICE_OBJECT Pdo;
+ PDEVICE_OBJECT LowerDevice;
+
+ PDEVICE_OBJECT AttachedRawPdo;
+ PDEVICE_OBJECT AttachedPdo[2];
+
+ ULONG PortNumber;
+
+ ULONG OpenCount;
+
+ ULONG BaseAddress;
+ PKINTERRUPT Interrupt;
+
+} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
+
+typedef struct _PDO_DEVICE_EXTENSION
+{
+ COMMON_DEVICE_EXTENSION Common;
+
+ PDEVICE_OBJECT AttachedFdo;
+
+ ULONG PortNumber;
+ ULONG LptPort;
+
+ ULONG OpenCount;
+
+} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
+
+#define PARPORT_TAG 'trpP'
+
+/* fdo.c */
+
+DRIVER_ADD_DEVICE AddDevice;
+
+NTSTATUS
+NTAPI
+FdoCreate(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+FdoClose(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+FdoCleanup(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+FdoWrite(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+FdoPnp(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+FdoPower(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+
+/* misc.c */
+
+NTSTATUS
+ForwardIrpAndWait(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+DRIVER_DISPATCH ForwardIrpAndForget;
+
+PVOID
+GetUserBuffer(IN PIRP Irp);
+
+//KSERVICE_ROUTINE ParportInterruptService;
+
+
+/* pdo.c */
+
+NTSTATUS
+NTAPI
+PdoCreate(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+PdoClose(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+PdoCleanup(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+PdoWrite(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+PdoPnp(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+PdoPower(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
#endif /* _PARPORT_PCH_ */
Copied: branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/pdo.c (from
r67713, trunk/reactos/drivers/parallel/parport/pdo.c)
URL:
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/rea…
==============================================================================
--- trunk/reactos/drivers/parallel/parport/pdo.c [iso-8859-1] (original)
+++
branches/colins-printing-for-freedom/reactos/drivers/parallel/parport/pdo.c [iso-8859-1]
Thu Jul 16 15:12:50 2015
@@ -14,12 +14,31 @@
PdoCreate(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
+ PPDO_DEVICE_EXTENSION DeviceExtension;
+ PIO_STACK_LOCATION Stack;
+ NTSTATUS Status = STATUS_SUCCESS;
+
DPRINT("PdoCreate()\n");
+ Stack = IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (Stack->Parameters.Create.Options & FILE_DIRECTORY_FILE)
+ {
+ DPRINT1("Not a directory\n");
+ Status = STATUS_NOT_A_DIRECTORY;
+ goto done;
+ }
+
+ DPRINT("Open LPT%lu: successful\n", DeviceExtension->LptPort);
+ DeviceExtension->OpenCount++;
+
+done:
+ Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
+
+ return Status;
}
@@ -28,11 +47,17 @@
PdoClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
+ PPDO_DEVICE_EXTENSION pDeviceExtension;
+
DPRINT("PdoClose()\n");
+
+ pDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ pDeviceExtension->OpenCount--;
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
return STATUS_SUCCESS;
}
@@ -56,7 +81,66 @@
PdoWrite(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
+ PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PIO_STACK_LOCATION IoStack;
+ PUCHAR Buffer;
+ ULONG i;
+ UCHAR PortStatus;
+ ULONG ulCount;
+
DPRINT("PdoWrite()\n");
+
+ PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FdoDeviceExtension =
(PFDO_DEVICE_EXTENSION)PdoDeviceExtension->AttachedFdo->DeviceExtension;
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ Buffer = GetUserBuffer(Irp);
+ DPRINT("Length: %lu\n", IoStack->Parameters.Write.Length);
+ DPRINT("Buffer: %p\n", Buffer);
+
+ if (Buffer != NULL)
+ {
+ DPRINT("%s\n", Buffer);
+ }
+
+ for (i = 0; i < IoStack->Parameters.Write.Length; i++)
+ {
+ DPRINT("%lu: %c\n", i, Buffer[i]);
+
+ ulCount = 0;
+
+ do
+ {
+ KeStallExecutionProcessor(10);
+ PortStatus = READ_PORT_UCHAR((PUCHAR)(FdoDeviceExtension->BaseAddress +
1));
+ ulCount++;
+ }
+ while (ulCount < 500000 && !(PortStatus & LP_PBUSY));
+
+ if (ulCount == 500000)
+ {
+ DPRINT("Timed out\n");
+
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_TIMEOUT;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_TIMEOUT;
+ }
+
+ /* Write character */
+ WRITE_PORT_UCHAR((PUCHAR)FdoDeviceExtension->BaseAddress, Buffer[i]);
+
+ KeStallExecutionProcessor(10);
+
+ WRITE_PORT_UCHAR((PUCHAR)(FdoDeviceExtension->BaseAddress + 2), (LP_PSELECP |
LP_PINITP | LP_PSTROBE));
+
+ KeStallExecutionProcessor(10);
+
+ WRITE_PORT_UCHAR((PUCHAR)(FdoDeviceExtension->BaseAddress + 2), (LP_PSELECP |
LP_PINITP));
+ }
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;