merge ROS Shell without integrated explorer part into trunk
[reactos.git] / reactos / drivers / dd / serial / serial.h
1 #if defined(__GNUC__)
2 #include <ddk/ntddk.h>
3 #include <ddk/ntddser.h>
4 #include <stdio.h>
5
6 #include <debug.h>
7
8 /* FIXME: these prototypes MUST NOT be here! */
9 NTSTATUS STDCALL
10 IoAttachDeviceToDeviceStackSafe(
11 IN PDEVICE_OBJECT SourceDevice,
12 IN PDEVICE_OBJECT TargetDevice,
13 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
14
15 #elif defined(_MSC_VER)
16 #include <ntddk.h>
17 #include <ntddser.h>
18 #include <stdio.h>
19
20 #define STDCALL
21
22 #define DPRINT1 DbgPrint("(%s:%d) ", __FILE__, __LINE__), DbgPrint
23 #define CHECKPOINT1 DbgPrint("(%s:%d)\n", __FILE__, __LINE__)
24
25 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
26
27 NTSTATUS STDCALL
28 IoAttachDeviceToDeviceStackSafe(
29 IN PDEVICE_OBJECT SourceDevice,
30 IN PDEVICE_OBJECT TargetDevice,
31 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
32
33 #ifdef NDEBUG2
34 #define DPRINT
35 #define CHECKPOINT
36 #else
37 #define DPRINT DPRINT1
38 #define CHECKPOINT CHECKPOINT1
39 #undef NDEBUG
40 #endif
41 #else
42 #error Unknown compiler!
43 #endif
44
45 typedef enum
46 {
47 dsStopped,
48 dsStarted,
49 dsPaused,
50 dsRemoved,
51 dsSurpriseRemoved
52 } SERIAL_DEVICE_STATE;
53
54 typedef enum
55 {
56 UartUnknown,
57 Uart8250, /* initial version */
58 Uart16450, /* + 38.4 Kbps */
59 Uart16550, /* + 115 Kbps */
60 Uart16550A,/* + FIFO 16 bytes */
61 Uart16650, /* + FIFO 32 bytes, 230 Kbps, power management, auto-flow */
62 Uart16750 /* + FIFO 64 bytes, 460 Kbps */
63 } UART_TYPE;
64
65 typedef struct _CIRCULAR_BUFFER
66 {
67 PUCHAR Buffer;
68 ULONG Length;
69 ULONG ReadPosition;
70 ULONG WritePosition;
71 } CIRCULAR_BUFFER, *PCIRCULAR_BUFFER;
72
73 typedef struct _SERIAL_DEVICE_EXTENSION
74 {
75 PDEVICE_OBJECT Pdo;
76 PDEVICE_OBJECT LowerDevice;
77 SERIAL_DEVICE_STATE PnpState;
78 IO_REMOVE_LOCK RemoveLock;
79
80 ULONG SerialPortNumber;
81
82 ULONG ComPort;
83 ULONG BaudRate;
84 ULONG BaseAddress;
85 PKINTERRUPT Interrupt;
86 KDPC ReceivedByteDpc;
87 KDPC SendByteDpc;
88
89 SERIAL_LINE_CONTROL SerialLineControl;
90 UART_TYPE UartType;
91 ULONG WaitMask;
92
93 ULONG BreakInterruptErrorCount;
94 SERIALPERF_STATS SerialPerfStats;
95 SERIAL_TIMEOUTS SerialTimeOuts;
96 BOOLEAN IsOpened;
97 KEVENT InputBufferNotEmpty;
98 CIRCULAR_BUFFER InputBuffer;
99 KSPIN_LOCK InputBufferLock;
100 CIRCULAR_BUFFER OutputBuffer;
101 KSPIN_LOCK OutputBufferLock;
102
103 UNICODE_STRING SerialInterfaceName;
104
105 /* Current values */
106 UCHAR MCR; /* Base+4, Modem Control Register */
107 UCHAR MSR; /* Base+6, Modem Status Register */
108 } SERIAL_DEVICE_EXTENSION, *PSERIAL_DEVICE_EXTENSION;
109
110 typedef struct _WORKITEM_DATA
111 {
112 PIRP Irp;
113 PIO_WORKITEM IoWorkItem;
114
115 BOOLEAN UseIntervalTimeout;
116 BOOLEAN UseTotalTimeout;
117 LARGE_INTEGER IntervalTimeout;
118 LARGE_INTEGER TotalTimeoutTime;
119 BOOLEAN DontWait;
120 BOOLEAN ReadAtLeastOneByte;
121 } WORKITEM_DATA, *PWORKITEM_DATA;
122
123 #define SERIAL_TAG TAG('S', 'e', 'r', 'l')
124
125 #define INFINITE ((ULONG)-1)
126
127 /* Baud master clock */
128 #define BAUD_CLOCK 1843200
129 #define CLOCKS_PER_BIT 16
130
131 /* UART registers and bits */
132 #define SER_RBR(x) ((x)+0) /* Receive Register */
133 #define SER_THR(x) ((x)+0) /* Transmit Register */
134 #define SER_DLL(x) ((x)+0) /* Baud Rate Divisor LSB */
135 #define SER_IER(x) ((x)+1) /* Interrupt Enable Register */
136 #define SR_IER_DATA_RECEIVED 0x01
137 #define SR_IER_THR_EMPTY 0x02
138 #define SR_IER_LSR_CHANGE 0x04
139 #define SR_IER_MSR_CHANGE 0x08
140 #define SR_IER_SLEEP_MODE 0x10 /* Uart >= 16750 */
141 #define SR_IER_LOW_POWER 0x20 /* Uart >= 16750 */
142 #define SER_DLM(x) ((x)+1) /* Baud Rate Divisor MSB */
143 #define SER_IIR(x) ((x)+2) /* Interrupt Identification Register */
144 #define SR_IIR_SELF 0x00
145 #define SR_IIR_ID_MASK 0x07
146 #define SR_IIR_MSR_CHANGE SR_IIR_SELF
147 #define SR_IIR_THR_EMPTY (SR_IIR_SELF | 2)
148 #define SR_IIR_DATA_RECEIVED (SR_IIR_SELF | 4)
149 #define SR_IIR_ERROR (SR_IIR_SELF | 6)
150 #define SER_FCR(x) ((x)+2) /* FIFO Control Register (Uart >= 16550A) */
151 #define SR_FCR_ENABLE_FIFO 0x01
152 #define SR_FCR_CLEAR_RCVR (0x02 | SR_FCR_ENABLE_FIFO)
153 #define SR_FCR_CLEAR_XMIT (0x04 | SR_FCR_ENABLE_FIFO)
154 #define SR_FCR_1_BYTE (0x00 | SR_FCR_ENABLE_FIFO)
155 #define SR_FCR_4_BYTES (0x40 | SR_FCR_ENABLE_FIFO)
156 #define SR_FCR_8_BYTES (0x80 | SR_FCR_ENABLE_FIFO)
157 #define SR_FCR_14_BYTES (0xC0 | SR_FCR_ENABLE_FIFO)
158 #define SER_LCR(x) ((x)+3) /* Line Control Register */
159 #define SR_LCR_CS5 0x00
160 #define SR_LCR_CS6 0x01
161 #define SR_LCR_CS7 0x02
162 #define SR_LCR_CS8 0x03
163 #define SR_LCR_ST1 0x00
164 #define SR_LCR_ST2 0x04
165 #define SR_LCR_PNO 0x00
166 #define SR_LCR_POD 0x08
167 #define SR_LCR_PEV 0x18
168 #define SR_LCR_PMK 0x28
169 #define SR_LCR_PSP 0x38
170 #define SR_LCR_BRK 0x40
171 #define SR_LCR_DLAB 0x80
172 #define SER_MCR(x) ((x)+4) /* Modem Control Register */
173 #define SR_MCR_DTR 0x01
174 #define SR_MCR_RTS 0x02
175 #define SER_LSR(x) ((x)+5) /* Line Status Register */
176 #define SR_LSR_DATA_RECEIVED 0x01
177 #define SR_LSR_OVERRUN_ERROR 0x02
178 #define SR_LSR_PARITY_ERROR 0x04
179 #define SR_LSR_FRAMING_ERROR 0x08
180 #define SR_LSR_BREAK_INT 0x10
181 #define SR_LSR_THR_EMPTY 0x20
182 #define SR_LSR_TSR_EMPTY 0x40
183 #define SR_LSR_ERROR_IN_FIFO 0x80 /* Uart >= 16550A */
184 #define SER_MSR(x) ((x)+6) /* Modem Status Register */
185 #define SR_MSR_CTS_CHANGED 0x01
186 #define SR_MSR_DSR_CHANGED 0x02
187 #define SR_MSR_RI_CHANGED 0x04
188 #define SR_MSR_DCD_CHANGED 0x08
189 #define SR_MSR_CTS 0x10 /* Clear To Send */
190 #define SR_MSR_DSR 0x20 /* Data Set Ready */
191 #define SI_MSR_RI 0x40 /* Ring Indicator */
192 #define SR_MSR_DCD 0x80 /* Data Carrier Detect */
193 #define SER_SCR(x) ((x)+7) /* Scratch Pad Register */
194
195 /************************************ circularbuffer.c */
196
197 /* FIXME: transform these functions into #define? */
198 NTSTATUS
199 InitializeCircularBuffer(
200 IN PCIRCULAR_BUFFER pBuffer,
201 IN ULONG BufferSize);
202
203 NTSTATUS
204 FreeCircularBuffer(
205 IN PCIRCULAR_BUFFER pBuffer);
206
207 BOOLEAN
208 IsCircularBufferEmpty(
209 IN PCIRCULAR_BUFFER pBuffer);
210
211 NTSTATUS
212 PushCircularBufferEntry(
213 IN PCIRCULAR_BUFFER pBuffer,
214 IN UCHAR Entry);
215
216 NTSTATUS
217 PopCircularBufferEntry(
218 IN PCIRCULAR_BUFFER pBuffer,
219 OUT PUCHAR Entry);
220
221 NTSTATUS
222 IncreaseCircularBufferSize(
223 IN PCIRCULAR_BUFFER pBuffer,
224 IN ULONG NewBufferSize);
225
226 /************************************ cleanup.c */
227
228 NTSTATUS STDCALL
229 SerialCleanup(
230 IN PDEVICE_OBJECT DeviceObject,
231 IN PIRP Irp);
232
233 /************************************ close.c */
234
235 NTSTATUS STDCALL
236 SerialClose(
237 IN PDEVICE_OBJECT DeviceObject,
238 IN PIRP Irp);
239
240 /************************************ create.c */
241
242 NTSTATUS STDCALL
243 SerialCreate(
244 IN PDEVICE_OBJECT DeviceObject,
245 IN PIRP Irp);
246
247 /************************************ devctrl.c */
248
249 NTSTATUS STDCALL
250 SerialDeviceControl(
251 IN PDEVICE_OBJECT DeviceObject,
252 IN PIRP Irp);
253
254 NTSTATUS STDCALL
255 SerialSetBaudRate(
256 IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
257 IN ULONG NewBaudRate);
258
259 NTSTATUS STDCALL
260 SerialSetLineControl(
261 IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
262 IN PSERIAL_LINE_CONTROL NewSettings);
263
264 /************************************ info.c */
265
266 NTSTATUS STDCALL
267 SerialQueryInformation(
268 IN PDEVICE_OBJECT DeviceObject,
269 IN PIRP Irp);
270
271 /************************************ legacy.c */
272
273 UART_TYPE
274 SerialDetectUartType(
275 IN PUCHAR ComPortBase);
276
277 NTSTATUS
278 DetectLegacyDevices(
279 IN PDRIVER_OBJECT DriverObject);
280
281 /************************************ misc.c */
282
283 NTSTATUS
284 ForwardIrpAndWait(
285 IN PDEVICE_OBJECT DeviceObject,
286 IN PIRP Irp);
287
288 NTSTATUS STDCALL
289 ForwardIrpAndForget(
290 IN PDEVICE_OBJECT DeviceObject,
291 IN PIRP Irp);
292
293 VOID STDCALL
294 SerialReceiveByte(
295 IN PKDPC Dpc,
296 IN PVOID pDeviceExtension, // real type PSERIAL_DEVICE_EXTENSION
297 IN PVOID pByte, // real type UCHAR
298 IN PVOID Unused);
299
300 VOID STDCALL
301 SerialSendByte(
302 IN PKDPC Dpc,
303 IN PVOID pDeviceExtension, // real type PSERIAL_DEVICE_EXTENSION
304 IN PVOID Unused1,
305 IN PVOID Unused2);
306
307 BOOLEAN STDCALL
308 SerialInterruptService(
309 IN PKINTERRUPT Interrupt,
310 IN OUT PVOID ServiceContext);
311
312 /************************************ pnp.c */
313
314 NTSTATUS STDCALL
315 SerialAddDeviceInternal(
316 IN PDRIVER_OBJECT DriverObject,
317 IN PDEVICE_OBJECT Pdo,
318 IN UART_TYPE UartType,
319 IN PULONG pComPortNumber OPTIONAL,
320 OUT PDEVICE_OBJECT* pFdo OPTIONAL);
321
322 NTSTATUS STDCALL
323 SerialAddDevice(
324 IN PDRIVER_OBJECT DriverObject,
325 IN PDEVICE_OBJECT Pdo);
326
327 NTSTATUS STDCALL
328 SerialPnpStartDevice(
329 IN PDEVICE_OBJECT DeviceObject,
330 IN PCM_RESOURCE_LIST ResourceList);
331
332 NTSTATUS STDCALL
333 SerialPnp(
334 IN PDEVICE_OBJECT DeviceObject,
335 IN PIRP Irp);
336
337 /************************************ power.c */
338
339 NTSTATUS STDCALL
340 SerialPower(
341 IN PDEVICE_OBJECT DeviceObject,
342 IN PIRP Irp);
343
344 /************************************ rw.c */
345
346 NTSTATUS STDCALL
347 SerialRead(
348 IN PDEVICE_OBJECT DeviceObject,
349 IN PIRP Irp);
350
351 NTSTATUS STDCALL
352 SerialWrite(
353 IN PDEVICE_OBJECT DeviceObject,
354 IN PIRP Irp);
355