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