1/**@file
2
3Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4This program and the accompanying materials
5are licensed and made available under the terms and conditions of the BSD License
6which accompanies this distribution.  The full text of the license may be found at
7http://opensource.org/licenses/bsd-license.php
8
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12Module Name:
13
14  WinNtSerialIo.h
15
16Abstract:
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
54typedef 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')
62typedef 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//
105extern EFI_DRIVER_BINDING_PROTOCOL   gWinNtSerialIoDriverBinding;
106extern EFI_COMPONENT_NAME_PROTOCOL   gWinNtSerialIoComponentName;
107extern 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//
170EFI_STATUS
171EFIAPI
172InitializeWinNtSerialIo (
173  IN EFI_HANDLE           ImageHandle,
174  IN EFI_SYSTEM_TABLE     *SystemTable
175  )
176/*++
177
178Routine Description:
179
180  TODO: Add function description
181
182Arguments:
183
184  ImageHandle - TODO: add argument description
185  SystemTable - TODO: add argument description
186
187Returns:
188
189  TODO: add return values
190
191--*/
192;
193
194EFI_STATUS
195EFIAPI
196WinNtSerialIoDriverBindingSupported (
197  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
198  IN  EFI_HANDLE                      Handle,
199  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
200  )
201/*++
202
203Routine Description:
204
205  TODO: Add function description
206
207Arguments:
208
209  This                - TODO: add argument description
210  Handle              - TODO: add argument description
211  RemainingDevicePath - TODO: add argument description
212
213Returns:
214
215  TODO: add return values
216
217--*/
218;
219
220EFI_STATUS
221EFIAPI
222WinNtSerialIoDriverBindingStart (
223  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
224  IN  EFI_HANDLE                      Handle,
225  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
226  )
227/*++
228
229Routine Description:
230
231  TODO: Add function description
232
233Arguments:
234
235  This                - TODO: add argument description
236  Handle              - TODO: add argument description
237  RemainingDevicePath - TODO: add argument description
238
239Returns:
240
241  TODO: add return values
242
243--*/
244;
245
246EFI_STATUS
247EFIAPI
248WinNtSerialIoDriverBindingStop (
249  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,
250  IN  EFI_HANDLE                    Handle,
251  IN  UINTN                         NumberOfChildren,
252  IN  EFI_HANDLE                    *ChildHandleBuffer
253  )
254/*++
255
256Routine Description:
257
258  TODO: Add function description
259
260Arguments:
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
267Returns:
268
269  TODO: add return values
270
271--*/
272;
273
274EFI_STATUS
275EFIAPI
276WinNtSerialIoReset (
277  IN EFI_SERIAL_IO_PROTOCOL *This
278  )
279/*++
280
281Routine Description:
282
283  TODO: Add function description
284
285Arguments:
286
287  This  - TODO: add argument description
288
289Returns:
290
291  TODO: add return values
292
293--*/
294;
295
296EFI_STATUS
297EFIAPI
298WinNtSerialIoSetAttributes (
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
309Routine Description:
310
311  TODO: Add function description
312
313Arguments:
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
323Returns:
324
325  TODO: add return values
326
327--*/
328;
329
330EFI_STATUS
331EFIAPI
332WinNtSerialIoSetControl (
333  IN EFI_SERIAL_IO_PROTOCOL *This,
334  IN UINT32                 Control
335  )
336/*++
337
338Routine Description:
339
340  TODO: Add function description
341
342Arguments:
343
344  This    - TODO: add argument description
345  Control - TODO: add argument description
346
347Returns:
348
349  TODO: add return values
350
351--*/
352;
353
354EFI_STATUS
355EFIAPI
356WinNtSerialIoGetControl (
357  IN  EFI_SERIAL_IO_PROTOCOL  *This,
358  OUT UINT32                  *Control
359  )
360/*++
361
362Routine Description:
363
364  TODO: Add function description
365
366Arguments:
367
368  This    - TODO: add argument description
369  Control - TODO: add argument description
370
371Returns:
372
373  TODO: add return values
374
375--*/
376;
377
378EFI_STATUS
379EFIAPI
380WinNtSerialIoWrite (
381  IN EFI_SERIAL_IO_PROTOCOL   *This,
382  IN OUT UINTN                *BufferSize,
383  IN VOID                     *Buffer
384  )
385/*++
386
387Routine Description:
388
389  TODO: Add function description
390
391Arguments:
392
393  This        - TODO: add argument description
394  BufferSize  - TODO: add argument description
395  Buffer      - TODO: add argument description
396
397Returns:
398
399  TODO: add return values
400
401--*/
402;
403
404EFI_STATUS
405EFIAPI
406WinNtSerialIoRead (
407  IN  EFI_SERIAL_IO_PROTOCOL  *This,
408  IN  OUT UINTN               *BufferSize,
409  OUT VOID                    *Buffer
410  )
411/*++
412
413Routine Description:
414
415  TODO: Add function description
416
417Arguments:
418
419  This        - TODO: add argument description
420  BufferSize  - TODO: add argument description
421  Buffer      - TODO: add argument description
422
423Returns:
424
425  TODO: add return values
426
427--*/
428;
429
430BOOLEAN
431IsaSerialFifoFull (
432  IN SERIAL_DEV_FIFO *Fifo
433  )
434/*++
435
436Routine Description:
437
438  TODO: Add function description
439
440Arguments:
441
442  Fifo  - TODO: add argument description
443
444Returns:
445
446  TODO: add return values
447
448--*/
449;
450
451BOOLEAN
452IsaSerialFifoEmpty (
453  IN SERIAL_DEV_FIFO *Fifo
454  )
455/*++
456
457Routine Description:
458
459  TODO: Add function description
460
461Arguments:
462
463  Fifo  - TODO: add argument description
464
465Returns:
466
467  TODO: add return values
468
469--*/
470;
471
472EFI_STATUS
473IsaSerialFifoAdd (
474  IN SERIAL_DEV_FIFO *Fifo,
475  IN UINT8           Data
476  )
477/*++
478
479Routine Description:
480
481  TODO: Add function description
482
483Arguments:
484
485  Fifo  - TODO: add argument description
486  Data  - TODO: add argument description
487
488Returns:
489
490  TODO: add return values
491
492--*/
493;
494
495EFI_STATUS
496IsaSerialFifoRemove (
497  IN  SERIAL_DEV_FIFO *Fifo,
498  OUT UINT8           *Data
499  )
500/*++
501
502Routine Description:
503
504  TODO: Add function description
505
506Arguments:
507
508  Fifo  - TODO: add argument description
509  Data  - TODO: add argument description
510
511Returns:
512
513  TODO: add return values
514
515--*/
516;
517
518EFI_STATUS
519IsaSerialReceiveTransmit (
520  WIN_NT_SERIAL_IO_PRIVATE_DATA     *Private
521  )
522/*++
523
524Routine Description:
525
526  TODO: Add function description
527
528Arguments:
529
530  Private - TODO: add argument description
531
532Returns:
533
534  TODO: add return values
535
536--*/
537;
538
539#endif
540