xref: /reactos/drivers/serial/serial/serial.h (revision 7ed1883c)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         Serial driver
4  * FILE:            drivers/dd/serial/serial.h
5  * PURPOSE:         Serial driver header
6  *
7  * PROGRAMMERS:     Herv� Poussineau (hpoussin@reactos.org)
8  */
9 
10 #ifndef _SERIAL_PCH_
11 #define _SERIAL_PCH_
12 
13 #include <ntddk.h>
14 #include <ntddser.h>
15 
16 /* See winbase.h */
17 #define PST_RS232 1
18 #define COMMPROP_INITIALIZED 0xE73CF52E
19 
20 typedef enum
21 {
22   dsStopped,
23   dsStarted,
24   dsPaused,
25   dsRemoved,
26   dsSurpriseRemoved
27 } SERIAL_DEVICE_STATE;
28 
29 typedef enum
30 {
31 	UartUnknown,
32 	Uart8250,  /* initial version */
33 	Uart16450, /* + 38.4 Kbps */
34 	Uart16550, /* + 115 Kbps */
35 	Uart16550A,/* + FIFO 16 bytes */
36 	Uart16650, /* + FIFO 32 bytes, 230 Kbps, power management, auto-flow */
37 	Uart16750  /* + FIFO 64 bytes, 460 Kbps */
38 } UART_TYPE;
39 
40 typedef struct _CIRCULAR_BUFFER
41 {
42 	PUCHAR Buffer;
43 	ULONG Length;
44 	ULONG ReadPosition;
45 	ULONG WritePosition;
46 } CIRCULAR_BUFFER, *PCIRCULAR_BUFFER;
47 
48 typedef struct _SERIAL_DEVICE_EXTENSION
49 {
50 	PDEVICE_OBJECT Pdo;
51 	PDEVICE_OBJECT LowerDevice;
52 	SERIAL_DEVICE_STATE PnpState;
53 	IO_REMOVE_LOCK RemoveLock;
54 
55 	ULONG SerialPortNumber;
56 
57 	ULONG ComPort;
58 	ULONG BaudRate;
59 	ULONG BaseAddress;
60 	PKINTERRUPT Interrupt;
61 	KDPC ReceivedByteDpc;
62 	KDPC SendByteDpc;
63 	KDPC CompleteIrpDpc;
64 
65 	SERIAL_LINE_CONTROL SerialLineControl;
66 	UART_TYPE UartType;
67 	ULONG WaitMask;
68 	PIRP WaitOnMaskIrp;
69 
70 	ULONG BreakInterruptErrorCount;
71 	SERIALPERF_STATS SerialPerfStats;
72 	SERIAL_TIMEOUTS SerialTimeOuts;
73 	BOOLEAN IsOpened;
74 	KEVENT InputBufferNotEmpty;
75 	CIRCULAR_BUFFER InputBuffer;
76 	KSPIN_LOCK InputBufferLock;
77 	CIRCULAR_BUFFER OutputBuffer;
78 	KSPIN_LOCK OutputBufferLock;
79 
80 	UNICODE_STRING SerialInterfaceName;
81 
82 	/* Current values */
83 	UCHAR MCR; /* Base+4, Modem Control Register */
84 	UCHAR MSR; /* Base+6, Modem Status Register */
85 } SERIAL_DEVICE_EXTENSION, *PSERIAL_DEVICE_EXTENSION;
86 
87 typedef struct _WORKITEM_DATA
88 {
89 	PIRP Irp;
90 	PIO_WORKITEM IoWorkItem;
91 
92 	BOOLEAN UseIntervalTimeout;
93 	BOOLEAN UseTotalTimeout;
94 	LARGE_INTEGER IntervalTimeout;
95 	LARGE_INTEGER TotalTimeoutTime;
96 	BOOLEAN DontWait;
97 	BOOLEAN ReadAtLeastOneByte;
98 } WORKITEM_DATA, *PWORKITEM_DATA;
99 
100 #define SERIAL_TAG 'lreS'
101 
102 #define INFINITE MAXULONG
103 
104 /* Baud master clock */
105 #define BAUD_CLOCK      1843200
106 #define CLOCKS_PER_BIT  16
107 
108 /* UART registers and bits */
109 #define   SER_RBR(x)   ((PUCHAR)(x)+0) /* Receive Register */
110 #define   SER_THR(x)   ((PUCHAR)(x)+0) /* Transmit Register */
111 #define   SER_DLL(x)   ((PUCHAR)(x)+0) /* Baud Rate Divisor LSB */
112 #define   SER_IER(x)   ((PUCHAR)(x)+1) /* Interrupt Enable Register */
113 #define     SR_IER_DATA_RECEIVED  0x01
114 #define     SR_IER_THR_EMPTY      0x02
115 #define     SR_IER_LSR_CHANGE     0x04
116 #define     SR_IER_MSR_CHANGE     0x08
117 #define     SR_IER_SLEEP_MODE     0x10 /* Uart >= 16750 */
118 #define     SR_IER_LOW_POWER      0x20 /* Uart >= 16750 */
119 #define   SER_DLM(x)   ((PUCHAR)(x)+1) /* Baud Rate Divisor MSB */
120 #define   SER_IIR(x)   ((PUCHAR)(x)+2) /* Interrupt Identification Register */
121 #define     SR_IIR_SELF           0x00
122 #define     SR_IIR_ID_MASK        0x07
123 #define     SR_IIR_MSR_CHANGE     SR_IIR_SELF
124 #define     SR_IIR_THR_EMPTY     (SR_IIR_SELF | 2)
125 #define     SR_IIR_DATA_RECEIVED (SR_IIR_SELF | 4)
126 #define     SR_IIR_ERROR         (SR_IIR_SELF | 6)
127 #define   SER_FCR(x)   ((PUCHAR)(x)+2) /* FIFO Control Register (Uart >= 16550A) */
128 #define     SR_FCR_ENABLE_FIFO    0x01
129 #define     SR_FCR_CLEAR_RCVR    (0x02 | SR_FCR_ENABLE_FIFO)
130 #define     SR_FCR_CLEAR_XMIT    (0x04 | SR_FCR_ENABLE_FIFO)
131 #define     SR_FCR_1_BYTE        (0x00 | SR_FCR_ENABLE_FIFO)
132 #define     SR_FCR_4_BYTES       (0x40 | SR_FCR_ENABLE_FIFO)
133 #define     SR_FCR_8_BYTES       (0x80 | SR_FCR_ENABLE_FIFO)
134 #define     SR_FCR_14_BYTES      (0xC0 | SR_FCR_ENABLE_FIFO)
135 #define   SER_LCR(x)   ((PUCHAR)(x)+3) /* Line Control Register */
136 #define     SR_LCR_CS5            0x00
137 #define     SR_LCR_CS6            0x01
138 #define     SR_LCR_CS7            0x02
139 #define     SR_LCR_CS8            0x03
140 #define     SR_LCR_ST1            0x00
141 #define     SR_LCR_ST2            0x04
142 #define     SR_LCR_PNO            0x00
143 #define     SR_LCR_POD            0x08
144 #define     SR_LCR_PEV            0x18
145 #define     SR_LCR_PMK            0x28
146 #define     SR_LCR_PSP            0x38
147 #define     SR_LCR_BRK            0x40
148 #define     SR_LCR_DLAB           0x80
149 #define   SER_MCR(x)   ((PUCHAR)(x)+4) /* Modem Control Register */
150 #define     SR_MCR_DTR            SERIAL_DTR_STATE
151 #define     SR_MCR_RTS            SERIAL_RTS_STATE
152 #define   SER_LSR(x)   ((PUCHAR)(x)+5) /* Line Status Register */
153 #define     SR_LSR_DATA_RECEIVED  0x01
154 #define     SR_LSR_OVERRUN_ERROR  0x02
155 #define     SR_LSR_PARITY_ERROR   0x04
156 #define     SR_LSR_FRAMING_ERROR  0x08
157 #define     SR_LSR_BREAK_INT      0x10
158 #define     SR_LSR_THR_EMPTY      0x20
159 #define     SR_LSR_TSR_EMPTY      0x40
160 #define     SR_LSR_ERROR_IN_FIFO  0x80 /* Uart >= 16550A */
161 #define   SER_MSR(x)   ((PUCHAR)(x)+6) /* Modem Status Register */
162 #define     SR_MSR_CTS_CHANGED    0x01
163 #define     SR_MSR_DSR_CHANGED    0x02
164 #define     SR_MSR_RI_CHANGED     0x04
165 #define     SR_MSR_DCD_CHANGED    0x08
166 #define     SR_MSR_CTS            SERIAL_CTS_STATE /* Clear To Send */
167 #define     SR_MSR_DSR            SERIAL_DSR_STATE /* Data Set Ready */
168 #define     SI_MSR_RI             SERIAL_RI_STATE  /* Ring Indicator */
169 #define     SR_MSR_DCD            SERIAL_DCD_STATE /* Data Carrier Detect */
170 #define   SER_SCR(x)   ((PUCHAR)(x)+7) /* Scratch Pad Register, Uart >= Uart16450 */
171 
172 /************************************ circularbuffer.c */
173 
174 /* FIXME: transform these functions into #define? */
175 NTSTATUS
176 InitializeCircularBuffer(
177 	IN PCIRCULAR_BUFFER pBuffer,
178 	IN ULONG BufferSize);
179 
180 NTSTATUS
181 FreeCircularBuffer(
182 	IN PCIRCULAR_BUFFER pBuffer);
183 
184 BOOLEAN
185 IsCircularBufferEmpty(
186 	IN PCIRCULAR_BUFFER pBuffer);
187 
188 ULONG
189 GetNumberOfElementsInCircularBuffer(
190 	IN PCIRCULAR_BUFFER pBuffer);
191 
192 NTSTATUS
193 PushCircularBufferEntry(
194 	IN PCIRCULAR_BUFFER pBuffer,
195 	IN UCHAR Entry);
196 
197 NTSTATUS
198 PopCircularBufferEntry(
199 	IN PCIRCULAR_BUFFER pBuffer,
200 	OUT PUCHAR Entry);
201 
202 NTSTATUS
203 IncreaseCircularBufferSize(
204 	IN PCIRCULAR_BUFFER pBuffer,
205 	IN ULONG NewBufferSize);
206 
207 /************************************ cleanup.c */
208 
209 DRIVER_DISPATCH SerialCleanup;
210 
211 /************************************ close.c */
212 
213 DRIVER_DISPATCH SerialClose;
214 
215 /************************************ create.c */
216 
217 DRIVER_DISPATCH SerialCreate;
218 
219 /************************************ devctrl.c */
220 
221 DRIVER_DISPATCH SerialDeviceControl;
222 
223 NTSTATUS NTAPI
224 SerialSetBaudRate(
225 	IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
226 	IN ULONG NewBaudRate);
227 
228 NTSTATUS NTAPI
229 SerialSetLineControl(
230 	IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
231 	IN PSERIAL_LINE_CONTROL NewSettings);
232 
233 /************************************ info.c */
234 
235 DRIVER_DISPATCH SerialQueryInformation;
236 
237 /************************************ legacy.c */
238 
239 UART_TYPE
240 SerialDetectUartType(
241 	IN PUCHAR ComPortBase);
242 
243 /************************************ misc.c */
244 
245 DRIVER_DISPATCH ForwardIrpAndForget;
246 
247 VOID NTAPI
248 SerialReceiveByte(
249 	IN PKDPC Dpc,
250 	IN PVOID pDeviceExtension, // real type PSERIAL_DEVICE_EXTENSION
251 	IN PVOID Unused1,
252 	IN PVOID Unused2);
253 
254 VOID NTAPI
255 SerialSendByte(
256 	IN PKDPC Dpc,
257 	IN PVOID pDeviceExtension, // real type PSERIAL_DEVICE_EXTENSION
258 	IN PVOID Unused1,
259 	IN PVOID Unused2);
260 
261 VOID NTAPI
262 SerialCompleteIrp(
263 	IN PKDPC Dpc,
264 	IN PVOID pDeviceExtension, // real type PSERIAL_DEVICE_EXTENSION
265 	IN PVOID pIrp, // real type PIRP
266 	IN PVOID Unused);
267 
268 KSERVICE_ROUTINE SerialInterruptService;
269 
270 /************************************ pnp.c */
271 
272 NTSTATUS NTAPI
273 SerialAddDeviceInternal(
274 	IN PDRIVER_OBJECT DriverObject,
275 	IN PDEVICE_OBJECT Pdo,
276 	IN UART_TYPE UartType,
277 	IN PULONG pComPortNumber OPTIONAL,
278 	OUT PDEVICE_OBJECT* pFdo OPTIONAL);
279 
280 DRIVER_ADD_DEVICE SerialAddDevice;
281 
282 NTSTATUS NTAPI
283 SerialPnpStartDevice(
284 	IN PDEVICE_OBJECT DeviceObject,
285 	IN PCM_RESOURCE_LIST ResourceList,
286 	IN PCM_RESOURCE_LIST ResourceListTranslated);
287 
288 DRIVER_DISPATCH SerialPnp;
289 
290 /************************************ power.c */
291 
292 DRIVER_DISPATCH SerialPower;
293 
294 /************************************ rw.c */
295 
296 DRIVER_DISPATCH SerialRead;
297 DRIVER_DISPATCH SerialWrite;
298 
299 #endif /* _SERIAL_PCH_ */
300