2cd884e627fd3d090ef6005633cd8d9fd967ab66
[reactos.git] / reactos / drivers / base / green / pnp.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS VT100 emulator
4 * FILE: drivers/dd/green/pnp.c
5 * PURPOSE: IRP_MJ_PNP operations
6 *
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8 */
9
10 #define NDEBUG
11 #include <debug.h>
12
13 #include "green.h"
14
15 NTSTATUS NTAPI
16 GreenAddDevice(
17 IN PDRIVER_OBJECT DriverObject,
18 IN PDEVICE_OBJECT Pdo)
19 {
20 PDEVICE_OBJECT Fdo = NULL;
21 PGREEN_DEVICE_EXTENSION DeviceExtension;
22 UNICODE_STRING serialPortName;
23 NTSTATUS Status;
24
25 DPRINT("Green: AddDevice(DriverObject %p, Pdo %p)\n", DriverObject, Pdo);
26
27 /* Create green FDO */
28 Status = IoCreateDevice(DriverObject,
29 sizeof(GREEN_DEVICE_EXTENSION),
30 NULL,
31 FILE_DEVICE_UNKNOWN,
32 FILE_DEVICE_SECURE_OPEN,
33 TRUE,
34 &Fdo);
35
36 if (!NT_SUCCESS(Status))
37 {
38 DPRINT1("Status = %08lx\n", Status);
39 return Status;
40 }
41
42 DeviceExtension = (PGREEN_DEVICE_EXTENSION)Fdo->DeviceExtension;
43 RtlZeroMemory(DeviceExtension, sizeof(GREEN_DEVICE_EXTENSION));
44 DeviceExtension->Common.Type = Green;
45
46 Status = KeyboardInitialize(DriverObject, &DeviceExtension->Keyboard);
47 if (!NT_SUCCESS(Status))
48 {
49 IoDeleteDevice(Fdo);
50 DPRINT1("Status = %08lx\n", Status);
51 return Status;
52 }
53 ((PKEYBOARD_DEVICE_EXTENSION)DeviceExtension->Keyboard->DeviceExtension)->Green = Fdo;
54
55 Status = ScreenInitialize(DriverObject, &DeviceExtension->Screen);
56 if (!NT_SUCCESS(Status))
57 {
58 IoDeleteDevice(DeviceExtension->Keyboard);
59 IoDeleteDevice(Fdo);
60 DPRINT1("Status = %08lx\n", Status);
61 return Status;
62 }
63 ((PSCREEN_DEVICE_EXTENSION)DeviceExtension->Screen->DeviceExtension)->Green = Fdo;
64
65 /* initialize green Fdo */
66 DeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo);
67 DeviceExtension->LineControl.WordLength = 8;
68 DeviceExtension->LineControl.Parity = NO_PARITY;
69 DeviceExtension->LineControl.StopBits = STOP_BIT_1;
70 DeviceExtension->BaudRate = SERIAL_BAUD_38400;
71 DeviceExtension->Timeouts.ReadTotalTimeoutConstant = 1; /* not null */
72 DeviceExtension->Timeouts.ReadIntervalTimeout = INFINITE;
73 DeviceExtension->Timeouts.ReadTotalTimeoutMultiplier = INFINITE;
74 DeviceExtension->Timeouts.WriteTotalTimeoutMultiplier = 0; /* FIXME */
75 DeviceExtension->Timeouts.WriteTotalTimeoutConstant = 0; /* FIXME */
76
77 /* open associated serial port */
78 RtlInitUnicodeString(&serialPortName, L"\\Device\\Serial1"); /* FIXME: don't hardcode string */
79 Status = ObReferenceObjectByName(
80 &serialPortName,
81 OBJ_EXCLUSIVE | OBJ_KERNEL_HANDLE,
82 NULL,
83 (ACCESS_MASK)0,
84 IoDeviceObjectType,
85 KernelMode,
86 NULL,
87 (PVOID*)&DeviceExtension->Serial);
88 /* FIXME: we never ObDereferenceObject */
89
90 Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO;
91 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
92
93 DPRINT("Status = %08lx\n", Status);
94 return Status;
95 }