1 /**@file
2 
3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   WinNtSerialIo.h
15 
16 Abstract:
17 
18 
19 **/
20 
21 #ifndef _WIN_NT_SERIAL_IO_
22 #define _WIN_NT_SERIAL_IO_
23 
24 //
25 // The package level header files this module uses
26 //
27 #include <Uefi.h>
28 #include <WinNtDxe.h>
29 //
30 // The protocols, PPI and GUID defintions for this module
31 //
32 #include <Protocol/WinNtIo.h>
33 #include <Protocol/ComponentName.h>
34 #include <Protocol/SerialIo.h>
35 #include <Protocol/DriverBinding.h>
36 #include <Protocol/DevicePath.h>
37 //
38 // The Library classes this module consumes
39 //
40 #include <Library/DebugLib.h>
41 #include <Library/BaseLib.h>
42 #include <Library/UefiDriverEntryPoint.h>
43 #include <Library/UefiLib.h>
44 #include <Library/BaseMemoryLib.h>
45 #include <Library/UefiBootServicesTableLib.h>
46 #include <Library/DevicePathLib.h>
47 #include <Library/MemoryAllocationLib.h>
48 #include <Library/PcdLib.h>
49 
50 
51 #define SERIAL_MAX_BUFFER_SIZE  256
52 #define TIMEOUT_STALL_INTERVAL  10
53 
54 typedef struct {
55   UINT32  First;
56   UINT32  Last;
57   UINT32  Surplus;
58   UINT8   Data[SERIAL_MAX_BUFFER_SIZE];
59 } SERIAL_DEV_FIFO;
60 
61 #define WIN_NT_SERIAL_IO_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('N', 'T', 's', 'i')
62 typedef struct {
63   UINT64                    Signature;
64 
65   //
66   // Protocol data for the new handle we are going to add
67   //
68   EFI_HANDLE                Handle;
69   EFI_SERIAL_IO_PROTOCOL    SerialIo;
70   EFI_SERIAL_IO_MODE        SerialIoMode;
71   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
72 
73   //
74   // Private Data
75   //
76   EFI_HANDLE                ControllerHandle;
77   EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;
78   UART_DEVICE_PATH          UartDevicePath;
79   EFI_WIN_NT_THUNK_PROTOCOL *WinNtThunk;
80 
81   EFI_UNICODE_STRING_TABLE  *ControllerNameTable;
82 
83   //
84   // Private NT type Data;
85   //
86   HANDLE                    NtHandle;
87   DCB                       NtDCB;
88   DWORD                     NtError;
89   COMSTAT                   NtComStatus;
90 
91   BOOLEAN                   SoftwareLoopbackEnable;
92   BOOLEAN                   HardwareFlowControl;
93   BOOLEAN                   HardwareLoopbackEnable;
94 
95   SERIAL_DEV_FIFO           Fifo;
96 
97 } WIN_NT_SERIAL_IO_PRIVATE_DATA;
98 
99 #define WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS(a) \
100          CR(a, WIN_NT_SERIAL_IO_PRIVATE_DATA, SerialIo, WIN_NT_SERIAL_IO_PRIVATE_DATA_SIGNATURE)
101 
102 //
103 // Global Protocol Variables
104 //
105 extern EFI_DRIVER_BINDING_PROTOCOL   gWinNtSerialIoDriverBinding;
106 extern EFI_COMPONENT_NAME_PROTOCOL   gWinNtSerialIoComponentName;
107 extern EFI_COMPONENT_NAME2_PROTOCOL  gWinNtSerialIoComponentName2;
108 
109 //
110 // Macros to convert EFI serial types to NT serial types.
111 //
112 
113 //
114 // one second
115 //
116 #define SERIAL_TIMEOUT_DEFAULT  (1000 * 1000)
117 #define SERIAL_BAUD_DEFAULT     115200
118 #define SERIAL_FIFO_DEFAULT     14
119 #define SERIAL_DATABITS_DEFAULT 8
120 #define SERIAL_PARITY_DEFAULT   DefaultParity
121 #define SERIAL_STOPBITS_DEFAULT DefaultStopBits
122 
123 #define SERIAL_CONTROL_MASK     (EFI_SERIAL_CLEAR_TO_SEND                | \
124                                  EFI_SERIAL_DATA_SET_READY               | \
125                                  EFI_SERIAL_RING_INDICATE                | \
126                                  EFI_SERIAL_CARRIER_DETECT               | \
127                                  EFI_SERIAL_REQUEST_TO_SEND              | \
128                                  EFI_SERIAL_DATA_TERMINAL_READY          | \
129                                  EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE     | \
130                                  EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE     | \
131                                  EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE | \
132                                  EFI_SERIAL_INPUT_BUFFER_EMPTY)
133 
134 #define ConvertBaud2Nt(x)       (DWORD) x
135 #define ConvertData2Nt(x)       (BYTE) x
136 
137 #define ConvertParity2Nt(x)              \
138     (BYTE) (                             \
139     x == DefaultParity ? NOPARITY    :   \
140     x == NoParity      ? NOPARITY    :   \
141     x == EvenParity    ? EVENPARITY  :   \
142     x == OddParity     ? ODDPARITY   :   \
143     x == MarkParity    ? MARKPARITY  :   \
144     x == SpaceParity   ? SPACEPARITY : 0 \
145     )
146 
147 #define ConvertStop2Nt(x)                 \
148     (BYTE) (                                \
149     x == DefaultParity   ? ONESTOPBIT   :   \
150     x == OneFiveStopBits ? ONE5STOPBITS :   \
151     x == TwoStopBits     ? TWOSTOPBITS  : 0 \
152     )
153 
154 #define ConvertTime2Nt(x) ((x) / 1000)
155 
156 //
157 // 115400 baud with rounding errors
158 //
159 #define SERIAL_PORT_MAX_BAUD_RATE 115400
160 
161 #define SERIAL_PORT_MIN_BAUD_RATE           50
162 #define SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH  16
163 
164 #define SERIAL_PORT_MIN_TIMEOUT             1         // 1 uS
165 #define SERIAL_PORT_MAX_TIMEOUT             100000000 // 100 seconds
166 
167 //
168 // Function Prototypes
169 //
170 EFI_STATUS
171 EFIAPI
172 InitializeWinNtSerialIo (
173   IN EFI_HANDLE           ImageHandle,
174   IN EFI_SYSTEM_TABLE     *SystemTable
175   )
176 /*++
177 
178 Routine Description:
179 
180   TODO: Add function description
181 
182 Arguments:
183 
184   ImageHandle - TODO: add argument description
185   SystemTable - TODO: add argument description
186 
187 Returns:
188 
189   TODO: add return values
190 
191 --*/
192 ;
193 
194 EFI_STATUS
195 EFIAPI
196 WinNtSerialIoDriverBindingSupported (
197   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
198   IN  EFI_HANDLE                      Handle,
199   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
200   )
201 /*++
202 
203 Routine Description:
204 
205   TODO: Add function description
206 
207 Arguments:
208 
209   This                - TODO: add argument description
210   Handle              - TODO: add argument description
211   RemainingDevicePath - TODO: add argument description
212 
213 Returns:
214 
215   TODO: add return values
216 
217 --*/
218 ;
219 
220 EFI_STATUS
221 EFIAPI
222 WinNtSerialIoDriverBindingStart (
223   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
224   IN  EFI_HANDLE                      Handle,
225   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
226   )
227 /*++
228 
229 Routine Description:
230 
231   TODO: Add function description
232 
233 Arguments:
234 
235   This                - TODO: add argument description
236   Handle              - TODO: add argument description
237   RemainingDevicePath - TODO: add argument description
238 
239 Returns:
240 
241   TODO: add return values
242 
243 --*/
244 ;
245 
246 EFI_STATUS
247 EFIAPI
248 WinNtSerialIoDriverBindingStop (
249   IN  EFI_DRIVER_BINDING_PROTOCOL   *This,
250   IN  EFI_HANDLE                    Handle,
251   IN  UINTN                         NumberOfChildren,
252   IN  EFI_HANDLE                    *ChildHandleBuffer
253   )
254 /*++
255 
256 Routine Description:
257 
258   TODO: Add function description
259 
260 Arguments:
261 
262   This              - TODO: add argument description
263   Handle            - TODO: add argument description
264   NumberOfChildren  - TODO: add argument description
265   ChildHandleBuffer - TODO: add argument description
266 
267 Returns:
268 
269   TODO: add return values
270 
271 --*/
272 ;
273 
274 EFI_STATUS
275 EFIAPI
276 WinNtSerialIoReset (
277   IN EFI_SERIAL_IO_PROTOCOL *This
278   )
279 /*++
280 
281 Routine Description:
282 
283   TODO: Add function description
284 
285 Arguments:
286 
287   This  - TODO: add argument description
288 
289 Returns:
290 
291   TODO: add return values
292 
293 --*/
294 ;
295 
296 EFI_STATUS
297 EFIAPI
298 WinNtSerialIoSetAttributes (
299   IN EFI_SERIAL_IO_PROTOCOL *This,
300   IN UINT64                 BaudRate,
301   IN UINT32                 ReceiveFifoDepth,
302   IN UINT32                 Timeout,
303   IN EFI_PARITY_TYPE        Parity,
304   IN UINT8                  DataBits,
305   IN EFI_STOP_BITS_TYPE     StopBits
306   )
307 /*++
308 
309 Routine Description:
310 
311   TODO: Add function description
312 
313 Arguments:
314 
315   This              - TODO: add argument description
316   BaudRate          - TODO: add argument description
317   ReceiveFifoDepth  - TODO: add argument description
318   Timeout           - TODO: add argument description
319   Parity            - TODO: add argument description
320   DataBits          - TODO: add argument description
321   StopBits          - TODO: add argument description
322 
323 Returns:
324 
325   TODO: add return values
326 
327 --*/
328 ;
329 
330 EFI_STATUS
331 EFIAPI
332 WinNtSerialIoSetControl (
333   IN EFI_SERIAL_IO_PROTOCOL *This,
334   IN UINT32                 Control
335   )
336 /*++
337 
338 Routine Description:
339 
340   TODO: Add function description
341 
342 Arguments:
343 
344   This    - TODO: add argument description
345   Control - TODO: add argument description
346 
347 Returns:
348 
349   TODO: add return values
350 
351 --*/
352 ;
353 
354 EFI_STATUS
355 EFIAPI
356 WinNtSerialIoGetControl (
357   IN  EFI_SERIAL_IO_PROTOCOL  *This,
358   OUT UINT32                  *Control
359   )
360 /*++
361 
362 Routine Description:
363 
364   TODO: Add function description
365 
366 Arguments:
367 
368   This    - TODO: add argument description
369   Control - TODO: add argument description
370 
371 Returns:
372 
373   TODO: add return values
374 
375 --*/
376 ;
377 
378 EFI_STATUS
379 EFIAPI
380 WinNtSerialIoWrite (
381   IN EFI_SERIAL_IO_PROTOCOL   *This,
382   IN OUT UINTN                *BufferSize,
383   IN VOID                     *Buffer
384   )
385 /*++
386 
387 Routine Description:
388 
389   TODO: Add function description
390 
391 Arguments:
392 
393   This        - TODO: add argument description
394   BufferSize  - TODO: add argument description
395   Buffer      - TODO: add argument description
396 
397 Returns:
398 
399   TODO: add return values
400 
401 --*/
402 ;
403 
404 EFI_STATUS
405 EFIAPI
406 WinNtSerialIoRead (
407   IN  EFI_SERIAL_IO_PROTOCOL  *This,
408   IN  OUT UINTN               *BufferSize,
409   OUT VOID                    *Buffer
410   )
411 /*++
412 
413 Routine Description:
414 
415   TODO: Add function description
416 
417 Arguments:
418 
419   This        - TODO: add argument description
420   BufferSize  - TODO: add argument description
421   Buffer      - TODO: add argument description
422 
423 Returns:
424 
425   TODO: add return values
426 
427 --*/
428 ;
429 
430 BOOLEAN
431 IsaSerialFifoFull (
432   IN SERIAL_DEV_FIFO *Fifo
433   )
434 /*++
435 
436 Routine Description:
437 
438   TODO: Add function description
439 
440 Arguments:
441 
442   Fifo  - TODO: add argument description
443 
444 Returns:
445 
446   TODO: add return values
447 
448 --*/
449 ;
450 
451 BOOLEAN
452 IsaSerialFifoEmpty (
453   IN SERIAL_DEV_FIFO *Fifo
454   )
455 /*++
456 
457 Routine Description:
458 
459   TODO: Add function description
460 
461 Arguments:
462 
463   Fifo  - TODO: add argument description
464 
465 Returns:
466 
467   TODO: add return values
468 
469 --*/
470 ;
471 
472 EFI_STATUS
473 IsaSerialFifoAdd (
474   IN SERIAL_DEV_FIFO *Fifo,
475   IN UINT8           Data
476   )
477 /*++
478 
479 Routine Description:
480 
481   TODO: Add function description
482 
483 Arguments:
484 
485   Fifo  - TODO: add argument description
486   Data  - TODO: add argument description
487 
488 Returns:
489 
490   TODO: add return values
491 
492 --*/
493 ;
494 
495 EFI_STATUS
496 IsaSerialFifoRemove (
497   IN  SERIAL_DEV_FIFO *Fifo,
498   OUT UINT8           *Data
499   )
500 /*++
501 
502 Routine Description:
503 
504   TODO: Add function description
505 
506 Arguments:
507 
508   Fifo  - TODO: add argument description
509   Data  - TODO: add argument description
510 
511 Returns:
512 
513   TODO: add return values
514 
515 --*/
516 ;
517 
518 EFI_STATUS
519 IsaSerialReceiveTransmit (
520   WIN_NT_SERIAL_IO_PRIVATE_DATA     *Private
521   )
522 /*++
523 
524 Routine Description:
525 
526   TODO: Add function description
527 
528 Arguments:
529 
530   Private - TODO: add argument description
531 
532 Returns:
533 
534   TODO: add return values
535 
536 --*/
537 ;
538 
539 #endif
540