]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.h
ac35b903e3d33b84c269f238b7147d6e70587fcc
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / IsaSerialDxe / Serial.h
1 /*++
2
3 Copyright (c) 2006 - 2007, Intel Corporation<BR>
4 All rights reserved. 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
13 Module Name:
14
15 serial.h
16
17 Abstract:
18
19 Include for Serial Driver
20
21 Revision History:
22
23 --*/
24
25 #ifndef _SERIAL_H
26 #define _SERIAL_H
27
28
29 #include <PiDxe.h>
30 #include <FrameworkPei.h>
31
32 #include <Protocol/IsaIo.h>
33 #include <Protocol/SerialIo.h>
34 #include <Protocol/DevicePath.h>
35
36 #include <Library/DebugLib.h>
37 #include <Library/UefiDriverEntryPoint.h>
38 #include <Library/BaseLib.h>
39 #include <Library/UefiLib.h>
40 #include <Library/DevicePathLib.h>
41 #include <Library/BaseMemoryLib.h>
42 #include <Library/MemoryAllocationLib.h>
43 #include <Library/UefiBootServicesTableLib.h>
44 #include <Library/ReportStatusCodeLib.h>
45 #include <Library/PcdLib.h>
46 //
47 // Driver Binding Externs
48 //
49 extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver;
50 extern EFI_COMPONENT_NAME_PROTOCOL gIsaSerialComponentName;
51
52 //
53 // Internal Data Structures
54 //
55 #define SERIAL_DEV_SIGNATURE EFI_SIGNATURE_32 ('s', 'e', 'r', 'd')
56 #define SERIAL_MAX_BUFFER_SIZE 16
57 #define TIMEOUT_STALL_INTERVAL 10
58
59 //
60 // Name: SERIAL_DEV_FIFO
61 // Purpose: To define Receive FIFO and Transmit FIFO
62 // Context: Used by serial data transmit and receive
63 // Fields:
64 // First UINT32: The index of the first data in array Data[]
65 // Last UINT32: The index, which you can put a new data into array Data[]
66 // Surplus UINT32: Identify how many data you can put into array Data[]
67 // Data[] UINT8 : An array, which used to store data
68 //
69 typedef struct {
70 UINT32 First;
71 UINT32 Last;
72 UINT32 Surplus;
73 UINT8 Data[SERIAL_MAX_BUFFER_SIZE];
74 } SERIAL_DEV_FIFO;
75
76 typedef enum {
77 UART8250 = 0,
78 UART16450 = 1,
79 UART16550 = 2,
80 UART16550A= 3
81 } EFI_UART_TYPE;
82
83 //
84 // Name: SERIAL_DEV
85 // Purpose: To provide device specific information
86 // Context:
87 // Fields:
88 // Signature UINTN: The identity of the serial device
89 // SerialIo SERIAL_IO_PROTOCOL: Serial I/O protocol interface
90 // SerialMode SERIAL_IO_MODE:
91 // DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device
92 // Handle EFI_HANDLE: The handle instance attached to serial device
93 // BaseAddress UINT16: The base address of specific serial device
94 // Receive SERIAL_DEV_FIFO: The FIFO used to store data,
95 // which is received by UART
96 // Transmit SERIAL_DEV_FIFO: The FIFO used to store data,
97 // which you want to transmit by UART
98 // SoftwareLoopbackEnable BOOLEAN:
99 // Type EFI_UART_TYPE: Specify the UART type of certain serial device
100 //
101 typedef struct {
102 UINTN Signature;
103
104 EFI_HANDLE Handle;
105 EFI_SERIAL_IO_PROTOCOL SerialIo;
106 EFI_SERIAL_IO_MODE SerialMode;
107 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
108
109 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
110 UART_DEVICE_PATH UartDevicePath;
111 EFI_ISA_IO_PROTOCOL *IsaIo;
112
113 UINT16 BaseAddress;
114 SERIAL_DEV_FIFO Receive;
115 SERIAL_DEV_FIFO Transmit;
116 BOOLEAN SoftwareLoopbackEnable;
117 BOOLEAN HardwareFlowControl;
118 EFI_UART_TYPE Type;
119 EFI_UNICODE_STRING_TABLE *ControllerNameTable;
120 } SERIAL_DEV;
121
122 #include "ComponentName.h"
123
124 #define SERIAL_DEV_FROM_THIS(a) CR (a, SERIAL_DEV, SerialIo, SERIAL_DEV_SIGNATURE)
125
126 //
127 // Globale Variables
128 //
129 extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver;
130
131 //
132 // Serial Driver Defaults
133 //
134 #define SERIAL_PORT_DEFAULT_BAUD_RATE 115200
135 #define SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH 1
136 #define SERIAL_PORT_DEFAULT_TIMEOUT 1000000
137 #define SERIAL_PORT_DEFAULT_PARITY NoParity
138 #define SERIAL_PORT_DEFAULT_DATA_BITS 8
139 #define SERIAL_PORT_DEFAULT_STOP_BITS 1
140 #define SERIAL_PORT_DEFAULT_CONTROL_MASK 0
141
142 //
143 // (24000000/13)MHz input clock
144 //
145 #define SERIAL_PORT_INPUT_CLOCK 1843200
146
147 //
148 // 115200 baud with rounding errors
149 //
150 #define SERIAL_PORT_MAX_BAUD_RATE 115400
151 #define SERIAL_PORT_MIN_BAUD_RATE 50
152
153 #define SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH 16
154 #define SERIAL_PORT_MIN_TIMEOUT 1 // 1 uS
155 #define SERIAL_PORT_MAX_TIMEOUT 100000000 // 100 seconds
156 //
157 // UART Registers
158 //
159 #define SERIAL_REGISTER_THR 0 // WO Transmit Holding Register
160 #define SERIAL_REGISTER_RBR 0 // RO Receive Buffer Register
161 #define SERIAL_REGISTER_DLL 0 // R/W Divisor Latch LSB
162 #define SERIAL_REGISTER_DLM 1 // R/W Divisor Latch MSB
163 #define SERIAL_REGISTER_IER 1 // R/W Interrupt Enable Register
164 #define SERIAL_REGISTER_IIR 2 // RO Interrupt Identification Register
165 #define SERIAL_REGISTER_FCR 2 // WO FIFO Cotrol Register
166 #define SERIAL_REGISTER_LCR 3 // R/W Line Control Register
167 #define SERIAL_REGISTER_MCR 4 // R/W Modem Control Register
168 #define SERIAL_REGISTER_LSR 5 // R/W Line Status Register
169 #define SERIAL_REGISTER_MSR 6 // R/W Modem Status Register
170 #define SERIAL_REGISTER_SCR 7 // R/W Scratch Pad Register
171 #pragma pack(1)
172 //
173 // Name: SERIAL_PORT_IER_BITS
174 // Purpose: Define each bit in Interrupt Enable Register
175 // Context:
176 // Fields:
177 // RAVIE Bit0: Receiver Data Available Interrupt Enable
178 // THEIE Bit1: Transmistter Holding Register Empty Interrupt Enable
179 // RIE Bit2: Receiver Interrupt Enable
180 // MIE Bit3: Modem Interrupt Enable
181 // Reserved Bit4-Bit7: Reserved
182 //
183 typedef struct {
184 UINT8 RAVIE : 1;
185 UINT8 THEIE : 1;
186 UINT8 RIE : 1;
187 UINT8 MIE : 1;
188 UINT8 Reserved : 4;
189 } SERIAL_PORT_IER_BITS;
190
191 //
192 // Name: SERIAL_PORT_IER
193 // Purpose:
194 // Context:
195 // Fields:
196 // Bits SERIAL_PORT_IER_BITS: Bits of the IER
197 // Data UINT8: the value of the IER
198 //
199 typedef union {
200 SERIAL_PORT_IER_BITS Bits;
201 UINT8 Data;
202 } SERIAL_PORT_IER;
203
204 //
205 // Name: SERIAL_PORT_IIR_BITS
206 // Purpose: Define each bit in Interrupt Identification Register
207 // Context:
208 // Fields:
209 // IPS Bit0: Interrupt Pending Status
210 // IIB Bit1-Bit3: Interrupt ID Bits
211 // Reserved Bit4-Bit5: Reserved
212 // FIFOES Bit6-Bit7: FIFO Mode Enable Status
213 //
214 typedef struct {
215 UINT8 IPS : 1;
216 UINT8 IIB : 3;
217 UINT8 Reserved : 2;
218 UINT8 FIFOES : 2;
219 } SERIAL_PORT_IIR_BITS;
220
221 //
222 // Name: SERIAL_PORT_IIR
223 // Purpose:
224 // Context:
225 // Fields:
226 // Bits SERIAL_PORT_IIR_BITS: Bits of the IIR
227 // Data UINT8: the value of the IIR
228 //
229 typedef union {
230 SERIAL_PORT_IIR_BITS Bits;
231 UINT8 Data;
232 } SERIAL_PORT_IIR;
233
234 //
235 // Name: SERIAL_PORT_FCR_BITS
236 // Purpose: Define each bit in FIFO Control Register
237 // Context:
238 // Fields:
239 // TRFIFOE Bit0: Transmit and Receive FIFO Enable
240 // RESETRF Bit1: Reset Reciever FIFO
241 // RESETTF Bit2: Reset Transmistter FIFO
242 // DMS Bit3: DMA Mode Select
243 // Reserved Bit4-Bit5: Reserved
244 // RTB Bit6-Bit7: Receive Trigger Bits
245 //
246 typedef struct {
247 UINT8 TRFIFOE : 1;
248 UINT8 RESETRF : 1;
249 UINT8 RESETTF : 1;
250 UINT8 DMS : 1;
251 UINT8 Reserved : 2;
252 UINT8 RTB : 2;
253 } SERIAL_PORT_FCR_BITS;
254
255 //
256 // Name: SERIAL_PORT_FCR
257 // Purpose:
258 // Context:
259 // Fields:
260 // Bits SERIAL_PORT_FCR_BITS: Bits of the FCR
261 // Data UINT8: the value of the FCR
262 //
263 typedef union {
264 SERIAL_PORT_FCR_BITS Bits;
265 UINT8 Data;
266 } SERIAL_PORT_FCR;
267
268 //
269 // Name: SERIAL_PORT_LCR_BITS
270 // Purpose: Define each bit in Line Control Register
271 // Context:
272 // Fields:
273 // SERIALDB Bit0-Bit1: Number of Serial Data Bits
274 // STOPB Bit2: Number of Stop Bits
275 // PAREN Bit3: Parity Enable
276 // EVENPAR Bit4: Even Parity Select
277 // STICPAR Bit5: Sticky Parity
278 // BRCON Bit6: Break Control
279 // DLAB Bit7: Divisor Latch Access Bit
280 //
281 typedef struct {
282 UINT8 SERIALDB : 2;
283 UINT8 STOPB : 1;
284 UINT8 PAREN : 1;
285 UINT8 EVENPAR : 1;
286 UINT8 STICPAR : 1;
287 UINT8 BRCON : 1;
288 UINT8 DLAB : 1;
289 } SERIAL_PORT_LCR_BITS;
290
291 //
292 // Name: SERIAL_PORT_LCR
293 // Purpose:
294 // Context:
295 // Fields:
296 // Bits SERIAL_PORT_LCR_BITS: Bits of the LCR
297 // Data UINT8: the value of the LCR
298 //
299 typedef union {
300 SERIAL_PORT_LCR_BITS Bits;
301 UINT8 Data;
302 } SERIAL_PORT_LCR;
303
304 //
305 // Name: SERIAL_PORT_MCR_BITS
306 // Purpose: Define each bit in Modem Control Register
307 // Context:
308 // Fields:
309 // DTRC Bit0: Data Terminal Ready Control
310 // RTS Bit1: Request To Send Control
311 // OUT1 Bit2: Output1
312 // OUT2 Bit3: Output2, used to disable interrupt
313 // LME; Bit4: Loopback Mode Enable
314 // Reserved Bit5-Bit7: Reserved
315 //
316 typedef struct {
317 UINT8 DTRC : 1;
318 UINT8 RTS : 1;
319 UINT8 OUT1 : 1;
320 UINT8 OUT2 : 1;
321 UINT8 LME : 1;
322 UINT8 Reserved : 3;
323 } SERIAL_PORT_MCR_BITS;
324
325 //
326 // Name: SERIAL_PORT_MCR
327 // Purpose:
328 // Context:
329 // Fields:
330 // Bits SERIAL_PORT_MCR_BITS: Bits of the MCR
331 // Data UINT8: the value of the MCR
332 //
333 typedef union {
334 SERIAL_PORT_MCR_BITS Bits;
335 UINT8 Data;
336 } SERIAL_PORT_MCR;
337
338 //
339 // Name: SERIAL_PORT_LSR_BITS
340 // Purpose: Define each bit in Line Status Register
341 // Context:
342 // Fields:
343 // DR Bit0: Receiver Data Ready Status
344 // OE Bit1: Overrun Error Status
345 // PE Bit2: Parity Error Status
346 // FE Bit3: Framing Error Status
347 // BI Bit4: Break Interrupt Status
348 // THRE Bit5: Transmistter Holding Register Status
349 // TEMT Bit6: Transmitter Empty Status
350 // FIFOE Bit7: FIFO Error Status
351 //
352 typedef struct {
353 UINT8 DR : 1;
354 UINT8 OE : 1;
355 UINT8 PE : 1;
356 UINT8 FE : 1;
357 UINT8 BI : 1;
358 UINT8 THRE : 1;
359 UINT8 TEMT : 1;
360 UINT8 FIFOE : 1;
361 } SERIAL_PORT_LSR_BITS;
362
363 //
364 // Name: SERIAL_PORT_LSR
365 // Purpose:
366 // Context:
367 // Fields:
368 // Bits SERIAL_PORT_LSR_BITS: Bits of the LSR
369 // Data UINT8: the value of the LSR
370 //
371 typedef union {
372 SERIAL_PORT_LSR_BITS Bits;
373 UINT8 Data;
374 } SERIAL_PORT_LSR;
375
376 //
377 // Name: SERIAL_PORT_MSR_BITS
378 // Purpose: Define each bit in Modem Status Register
379 // Context:
380 // Fields:
381 // DeltaCTS Bit0: Delta Clear To Send Status
382 // DeltaDSR Bit1: Delta Data Set Ready Status
383 // TrailingEdgeRI Bit2: Trailing Edge of Ring Indicator Status
384 // DeltaDCD Bit3: Delta Data Carrier Detect Status
385 // CTS Bit4: Clear To Send Status
386 // DSR Bit5: Data Set Ready Status
387 // RI Bit6: Ring Indicator Status
388 // DCD Bit7: Data Carrier Detect Status
389 //
390 typedef struct {
391 UINT8 DeltaCTS : 1;
392 UINT8 DeltaDSR : 1;
393 UINT8 TrailingEdgeRI : 1;
394 UINT8 DeltaDCD : 1;
395 UINT8 CTS : 1;
396 UINT8 DSR : 1;
397 UINT8 RI : 1;
398 UINT8 DCD : 1;
399 } SERIAL_PORT_MSR_BITS;
400
401 //
402 // Name: SERIAL_PORT_MSR
403 // Purpose:
404 // Context:
405 // Fields:
406 // Bits SERIAL_PORT_MSR_BITS: Bits of the MSR
407 // Data UINT8: the value of the MSR
408 //
409 typedef union {
410 SERIAL_PORT_MSR_BITS Bits;
411 UINT8 Data;
412 } SERIAL_PORT_MSR;
413
414 #pragma pack()
415 //
416 // Define serial register I/O macros
417 //
418 #define READ_RBR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_RBR)
419 #define READ_DLL(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_DLL)
420 #define READ_DLM(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_DLM)
421 #define READ_IER(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_IER)
422 #define READ_IIR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_IIR)
423 #define READ_LCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_LCR)
424 #define READ_MCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_MCR)
425 #define READ_LSR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_LSR)
426 #define READ_MSR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_MSR)
427 #define READ_SCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_SCR)
428
429 #define WRITE_THR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_THR, D)
430 #define WRITE_DLL(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_DLL, D)
431 #define WRITE_DLM(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_DLM, D)
432 #define WRITE_IER(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_IER, D)
433 #define WRITE_FCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_FCR, D)
434 #define WRITE_LCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_LCR, D)
435 #define WRITE_MCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_MCR, D)
436 #define WRITE_LSR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_LSR, D)
437 #define WRITE_MSR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_MSR, D)
438 #define WRITE_SCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_SCR, D)
439
440 //
441 // Prototypes
442 // Driver model protocol interface
443 //
444
445 EFI_STATUS
446 EFIAPI
447 SerialControllerDriverSupported (
448 IN EFI_DRIVER_BINDING_PROTOCOL *This,
449 IN EFI_HANDLE Controller,
450 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
451 );
452
453 EFI_STATUS
454 EFIAPI
455 SerialControllerDriverStart (
456 IN EFI_DRIVER_BINDING_PROTOCOL *This,
457 IN EFI_HANDLE Controller,
458 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
459 );
460
461 EFI_STATUS
462 EFIAPI
463 SerialControllerDriverStop (
464 IN EFI_DRIVER_BINDING_PROTOCOL *This,
465 IN EFI_HANDLE Controller,
466 IN UINTN NumberOfChildren,
467 IN EFI_HANDLE *ChildHandleBuffer
468 );
469
470 //
471 // Serial I/O Protocol Interface
472 //
473 EFI_STATUS
474 EFIAPI
475 IsaSerialReset (
476 IN EFI_SERIAL_IO_PROTOCOL *This
477 );
478
479 EFI_STATUS
480 EFIAPI
481 IsaSerialSetAttributes (
482 IN EFI_SERIAL_IO_PROTOCOL *This,
483 IN UINT64 BaudRate,
484 IN UINT32 ReceiveFifoDepth,
485 IN UINT32 Timeout,
486 IN EFI_PARITY_TYPE Parity,
487 IN UINT8 DataBits,
488 IN EFI_STOP_BITS_TYPE StopBits
489 );
490
491 EFI_STATUS
492 EFIAPI
493 IsaSerialSetControl (
494 IN EFI_SERIAL_IO_PROTOCOL *This,
495 IN UINT32 Control
496 );
497
498 EFI_STATUS
499 EFIAPI
500 IsaSerialGetControl (
501 IN EFI_SERIAL_IO_PROTOCOL *This,
502 OUT UINT32 *Control
503 );
504
505 EFI_STATUS
506 EFIAPI
507 IsaSerialWrite (
508 IN EFI_SERIAL_IO_PROTOCOL *This,
509 IN OUT UINTN *BufferSize,
510 IN VOID *Buffer
511 );
512
513 EFI_STATUS
514 EFIAPI
515 IsaSerialRead (
516 IN EFI_SERIAL_IO_PROTOCOL *This,
517 IN OUT UINTN *BufferSize,
518 OUT VOID *Buffer
519 );
520
521 //
522 // Internal Functions
523 //
524 BOOLEAN
525 IsaSerialPortPresent (
526 IN SERIAL_DEV *SerialDevice
527 );
528
529 BOOLEAN
530 IsaSerialFifoFull (
531 IN SERIAL_DEV_FIFO *Fifo
532 );
533
534 BOOLEAN
535 IsaSerialFifoEmpty (
536 IN SERIAL_DEV_FIFO *Fifo
537 );
538
539 EFI_STATUS
540 IsaSerialFifoAdd (
541 IN SERIAL_DEV_FIFO *Fifo,
542 IN UINT8 Data
543 );
544
545 EFI_STATUS
546 IsaSerialFifoRemove (
547 IN SERIAL_DEV_FIFO *Fifo,
548 OUT UINT8 *Data
549 );
550
551 EFI_STATUS
552 IsaSerialReceiveTransmit (
553 IN SERIAL_DEV *SerialDevice
554 );
555
556 UINT8
557 IsaSerialReadPort (
558 IN EFI_ISA_IO_PROTOCOL *IsaIo,
559 IN UINT16 BaseAddress,
560 IN UINT32 Offset
561 );
562
563 VOID
564 IsaSerialWritePort (
565 IN EFI_ISA_IO_PROTOCOL *IsaIo,
566 IN UINT16 BaseAddress,
567 IN UINT32 Offset,
568 IN UINT8 Data
569 );
570
571 #endif