Some upgrades for green:
authorArt Yerkes <art.yerkes@gmail.com>
Sun, 30 Oct 2005 22:33:26 +0000 (22:33 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Sun, 30 Oct 2005 22:33:26 +0000 (22:33 +0000)
- Either create the blue device or attach to it
- If we can't open a serial device, forward the IRP to the original blue
- Scrolling fix
- Don't do DO_BUFFERED_IO if we use Irp->UserBuffer
- Pass a zero offset when writing to serial port

Green now displays correctly and fails back correctly.  Keyboard part doesn't
yet coexist with current ReactOS.  That's next.

svn path=/trunk/; revision=18898

reactos/drivers/dd/green/green.h
reactos/drivers/dd/green/pnp.c
reactos/drivers/dd/green/screen.c

index dcc3fd2..eb69269 100644 (file)
@@ -76,6 +76,7 @@ typedef struct _SCREEN_DEVICE_EXTENSION
 
        UCHAR SendBuffer[1024];
        ULONG SendBufferPosition;
+       PDEVICE_OBJECT PreviousBlue;
 } SCREEN_DEVICE_EXTENSION, *PSCREEN_DEVICE_EXTENSION;
 
 typedef struct _GREEN_DEVICE_EXTENSION
index 1da5b86..29822bb 100644 (file)
@@ -32,8 +32,12 @@ GreenAddDevice(
                FILE_DEVICE_SECURE_OPEN,
                TRUE,
                &Fdo);
+
        if (!NT_SUCCESS(Status))
+       {
+               DPRINT1("Status = %08x\n", Status);
                return Status;
+       }
 
        DeviceExtension = (PGREEN_DEVICE_EXTENSION)Fdo->DeviceExtension;
        RtlZeroMemory(DeviceExtension, sizeof(GREEN_DEVICE_EXTENSION));
@@ -43,6 +47,7 @@ GreenAddDevice(
        if (!NT_SUCCESS(Status))
        {
                IoDeleteDevice(Fdo);
+               DPRINT1("Status = %08x\n", Status);
                return Status;
        }
        ((PKEYBOARD_DEVICE_EXTENSION)DeviceExtension->Keyboard->DeviceExtension)->Green = Fdo;
@@ -52,6 +57,7 @@ GreenAddDevice(
        {
                IoDeleteDevice(DeviceExtension->Keyboard);
                IoDeleteDevice(Fdo);
+               DPRINT1("Status = %08x\n", Status);
                return Status;
        }
        ((PSCREEN_DEVICE_EXTENSION)DeviceExtension->Screen->DeviceExtension)->Green = Fdo;
@@ -84,5 +90,6 @@ GreenAddDevice(
        Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO;
        Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
+       DPRINT1("Status = %08x\n", Status);
        return Status;
 }
index 6f8f7e9..1f620e0 100644 (file)
@@ -38,6 +38,9 @@ AddToSendBuffer(
        int CurrentInt;
        UCHAR CurrentChar;
        NTSTATUS Status;
+        LARGE_INTEGER ZeroOffset;
+
+        ZeroOffset.QuadPart = 0;
 
        SizeLeft = sizeof(DeviceExtension->SendBuffer) - DeviceExtension->SendBufferPosition;
        if (SizeLeft < NumberOfChars * 2 || NumberOfChars == 0)
@@ -47,7 +50,7 @@ AddToSendBuffer(
                        IRP_MJ_WRITE,
                        SerialDevice,
                        DeviceExtension->SendBuffer, DeviceExtension->SendBufferPosition,
-                       NULL, /* StartingOffset */
+                        &ZeroOffset,
                        NULL, /* Event */
                        &ioStatus);
                if (!Irp)
@@ -55,7 +58,9 @@ AddToSendBuffer(
                        DPRINT1("Green: IoBuildSynchronousFsdRequest() failed. Unable to flush output buffer\n");
                        return;
                }
+
                Status = IoCallDriver(SerialDevice, Irp);
+
                if (!NT_SUCCESS(Status) && Status != STATUS_PENDING)
                {
                        DPRINT1("Green: IoCallDriver() failed. Status = 0x%08lx\n", Status);
@@ -69,6 +74,7 @@ AddToSendBuffer(
        while (NumberOfChars-- > 0)
        {
                CurrentInt = va_arg(args, int);
+
                if (CurrentInt > 0)
                {
                        CurrentChar = (UCHAR)CurrentInt;
@@ -107,7 +113,7 @@ ScreenInitialize(
        IN PDRIVER_OBJECT DriverObject,
        OUT PDEVICE_OBJECT* ScreenFdo)
 {
-       PDEVICE_OBJECT Fdo;
+       PDEVICE_OBJECT Fdo, PreviousBlue = NULL;
        PSCREEN_DEVICE_EXTENSION DeviceExtension;
        UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\BlueScreen");
        NTSTATUS Status;
@@ -121,12 +127,56 @@ ScreenInitialize(
                FILE_DEVICE_SECURE_OPEN,
                TRUE,
                &Fdo);
-       if (!NT_SUCCESS(Status))
+
+        if (Status == STATUS_OBJECT_NAME_COLLISION)
+        {
+               DPRINT("Green: Attaching to old blue\n");
+
+               /* Suggested by hpoussin .. Hide previous blue device 
+                * This makes us able to coexist with blue, and install
+                * when loaded */
+               Status = IoCreateDevice(DriverObject,
+                       sizeof(SCREEN_DEVICE_EXTENSION),
+                       NULL,
+                       FILE_DEVICE_SCREEN,
+                       FILE_DEVICE_SECURE_OPEN,
+                       TRUE,
+                       &Fdo);
+
+               if (!NT_SUCCESS(Status))
+                       return Status;
+
+               Status = IoAttachDevice(
+                       Fdo,
+                       &DeviceName, /* FIXME: don't hardcode string */
+                       &PreviousBlue);
+
+               if (!NT_SUCCESS(Status)) {
+                       IoDeleteDevice(Fdo);
+                       return Status;
+               }
+        }
+       else if (!NT_SUCCESS(Status))
                return Status;
 
+       /* We definately have a device object.  PreviousBlue may or may
+        * not be null */
+       
        DeviceExtension = (PSCREEN_DEVICE_EXTENSION)Fdo->DeviceExtension;
        RtlZeroMemory(DeviceExtension, sizeof(SCREEN_DEVICE_EXTENSION));
        DeviceExtension->Common.Type = Screen;
+       DeviceExtension->PreviousBlue = PreviousBlue;
+
+       if (!NT_SUCCESS(Status)) 
+       {
+               /* If a device was attached, detach it first */
+               if (DeviceExtension->PreviousBlue)
+                       IoDetachDevice(DeviceExtension->PreviousBlue);
+
+               IoDeleteDevice(Fdo);
+                return Status;
+       }
+
        /* initialize screen */
        DeviceExtension->Columns = 80;
        DeviceExtension->Rows = 25;
@@ -136,6 +186,10 @@ ScreenInitialize(
                2 * DeviceExtension->Columns * DeviceExtension->Rows * sizeof(UCHAR));
        if (!DeviceExtension->VideoMemory)
        {
+               /* If a device was attached, detach it first */
+               if (DeviceExtension->PreviousBlue)
+                       IoDetachDevice(DeviceExtension->PreviousBlue);
+
                IoDeleteDevice(Fdo);
                return STATUS_INSUFFICIENT_RESOURCES;
        }
@@ -150,7 +204,7 @@ ScreenInitialize(
        AddToSendBuffer(DeviceExtension, 4, ESC, '[', '7', 'l'); /* disable line wrap */
        AddToSendBuffer(DeviceExtension, 4, ESC, '[', '3', 'g'); /* clear all tabs */
 
-       Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO;
+       Fdo->Flags |= DO_POWER_PAGABLE;
        Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
        *ScreenFdo = Fdo;
@@ -166,6 +220,7 @@ ScreenWrite(
        PIO_STACK_LOCATION Stack;
        PUCHAR Buffer;
        PSCREEN_DEVICE_EXTENSION DeviceExtension;
+       PDEVICE_OBJECT SerialDevice;
        PUCHAR VideoMemory; /* FIXME: is it useful? */
        ULONG VideoMemorySize; /* FIXME: is it useful? */
 
@@ -181,16 +236,27 @@ ScreenWrite(
        DeviceExtension = (PSCREEN_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
        VideoMemory = DeviceExtension->VideoMemory;
 
+       SerialDevice = ((PGREEN_DEVICE_EXTENSION)DeviceExtension->Green->DeviceExtension)->Serial;
+       if (!SerialDevice)
+       {
+               DPRINT1("Calling blue\n");
+               IoSkipCurrentIrpStackLocation(Irp);
+               return IoCallDriver(DeviceExtension->PreviousBlue, Irp);
+       }
+
        Columns = DeviceExtension->Columns;
        Rows = DeviceExtension->Rows;
        CursorX = (DeviceExtension->LogicalOffset / 2) % Columns + 1;
        CursorY = (DeviceExtension->LogicalOffset / 2) / Columns + 1;
        VideoMemorySize = Columns * Rows * 2 * sizeof(UCHAR);
-       DPRINT1("Y: %lu\n", CursorY);
-       DPRINT1("Buffer =");
+
+#if DBG
+       DPRINT("Y: %lu\n", CursorY);
+       DPRINT("Buffer =");
        for (i = 0; i < Stack->Parameters.Write.Length; i++)
                DbgPrint(" 0x%02x", Buffer[i]);
        DbgPrint("\n");
+#endif
 
        if (!(DeviceExtension->Mode & ENABLE_PROCESSED_OUTPUT))
        {
@@ -228,6 +294,7 @@ ScreenWrite(
                                {
                                        CursorY++;
                                        CursorX = 1;
+                                       AddToSendBuffer(DeviceExtension, 1, '\n');
                                        AddToSendBuffer(DeviceExtension, 6, ESC, '[', -(int)CursorY, ';', '1', 'H');
                                        break;
                                }
@@ -268,17 +335,18 @@ ScreenWrite(
                                        if (CursorX > Columns)
                                        {
                                                CursorX = 1;
-                                               DPRINT1("Y: %lu -> %lu\n", CursorY, CursorY + 1);
+                                               DPRINT("Y: %lu -> %lu\n", CursorY, CursorY + 1);
                                                CursorY++;
                                                AddToSendBuffer(DeviceExtension, 6, ESC, '[', -(int)CursorY, ';', '1', 'H');
 
                                        }
                                }
                        }
-                       if (CursorY > Rows)
+                       if (CursorY >= Rows)
                        {
-                               DPRINT1("Y: %lu -> %lu\n", CursorY, CursorY - 1);
+                               DPRINT("Y: %lu -> %lu\n", CursorY, CursorY - 1);
                                CursorY--;
+                               AddToSendBuffer(DeviceExtension, 6, ESC, '[', -(int)1, ';', -(int)(Rows), 'r');
                                AddToSendBuffer(DeviceExtension, 2, ESC, 'D');
                                AddToSendBuffer(DeviceExtension, 6, ESC, '[', -(int)CursorY, ';', -(int)CursorX, 'H');
                        }
@@ -304,11 +372,20 @@ ScreenDeviceControl(
 {
        PIO_STACK_LOCATION Stack;
        PSCREEN_DEVICE_EXTENSION DeviceExtension;
+       PDEVICE_OBJECT SerialDevice;
        NTSTATUS Status;
 
        Stack = IoGetCurrentIrpStackLocation(Irp);
        DeviceExtension = (PSCREEN_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
+       SerialDevice = ((PGREEN_DEVICE_EXTENSION)DeviceExtension->Green->DeviceExtension)->Serial;
+       if (!SerialDevice)
+       {
+               DPRINT1("Calling blue\n");
+               IoSkipCurrentIrpStackLocation(Irp);
+               return IoCallDriver(DeviceExtension->PreviousBlue, Irp);
+       }
+
        switch (Stack->Parameters.DeviceIoControl.IoControlCode)
        {
                case IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO:
@@ -510,7 +587,7 @@ ScreenDeviceControl(
                                                -(int)(ConsoleDraw->Y + y), ';',
                                                -(int)(ConsoleDraw->X), 'H');
                                        Video = (PUCHAR)(ConsoleDraw + 1);
-                                       Video = &Video[((ConsoleDraw->Y + y) * DeviceExtension->Columns + ConsoleDraw->X) * 2];
+                                       Video = &Video[((ConsoleDraw->Y + y) * /*DeviceExtension->Columns +*/ ConsoleDraw->X) * 2];
                                        for (x = 0; x < ConsoleDraw->SizeX; x++)
                                        {
                                                AddToSendBuffer(DeviceExtension, 1, Video[x * 2]);