2 Include for Serial Driver
4 Copyright (c) 2006 - 2007, Intel Corporation.<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include <FrameworkPei.h>
22 #include <Protocol/IsaIo.h>
23 #include <Protocol/SerialIo.h>
24 #include <Protocol/DevicePath.h>
26 #include <Library/DebugLib.h>
27 #include <Library/UefiDriverEntryPoint.h>
28 #include <Library/BaseLib.h>
29 #include <Library/UefiLib.h>
30 #include <Library/DevicePathLib.h>
31 #include <Library/BaseMemoryLib.h>
32 #include <Library/MemoryAllocationLib.h>
33 #include <Library/UefiBootServicesTableLib.h>
34 #include <Library/ReportStatusCodeLib.h>
35 #include <Library/PcdLib.h>
37 // Driver Binding Externs
39 extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver
;
40 extern EFI_COMPONENT_NAME_PROTOCOL gIsaSerialComponentName
;
41 extern EFI_COMPONENT_NAME2_PROTOCOL gIsaSerialComponentName2
;
44 // Internal Data Structures
46 #define SERIAL_DEV_SIGNATURE SIGNATURE_32 ('s', 'e', 'r', 'd')
47 #define SERIAL_MAX_BUFFER_SIZE 16
48 #define TIMEOUT_STALL_INTERVAL 10
51 // Name: SERIAL_DEV_FIFO
52 // Purpose: To define Receive FIFO and Transmit FIFO
53 // Context: Used by serial data transmit and receive
55 // First UINT32: The index of the first data in array Data[]
56 // Last UINT32: The index, which you can put a new data into array Data[]
57 // Surplus UINT32: Identify how many data you can put into array Data[]
58 // Data[] UINT8 : An array, which used to store data
64 UINT8 Data
[SERIAL_MAX_BUFFER_SIZE
];
76 // Purpose: To provide device specific information
79 // Signature UINTN: The identity of the serial device
80 // SerialIo SERIAL_IO_PROTOCOL: Serial I/O protocol interface
81 // SerialMode SERIAL_IO_MODE:
82 // DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device
83 // Handle EFI_HANDLE: The handle instance attached to serial device
84 // BaseAddress UINT16: The base address of specific serial device
85 // Receive SERIAL_DEV_FIFO: The FIFO used to store data,
86 // which is received by UART
87 // Transmit SERIAL_DEV_FIFO: The FIFO used to store data,
88 // which you want to transmit by UART
89 // SoftwareLoopbackEnable BOOLEAN:
90 // Type EFI_UART_TYPE: Specify the UART type of certain serial device
96 EFI_SERIAL_IO_PROTOCOL SerialIo
;
97 EFI_SERIAL_IO_MODE SerialMode
;
98 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
100 EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
;
101 UART_DEVICE_PATH UartDevicePath
;
102 EFI_ISA_IO_PROTOCOL
*IsaIo
;
105 SERIAL_DEV_FIFO Receive
;
106 SERIAL_DEV_FIFO Transmit
;
107 BOOLEAN SoftwareLoopbackEnable
;
108 BOOLEAN HardwareFlowControl
;
110 EFI_UNICODE_STRING_TABLE
*ControllerNameTable
;
113 #include "ComponentName.h"
115 #define SERIAL_DEV_FROM_THIS(a) CR (a, SERIAL_DEV, SerialIo, SERIAL_DEV_SIGNATURE)
120 extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver
;
123 // Serial Driver Defaults
125 #define SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH 1
126 #define SERIAL_PORT_DEFAULT_TIMEOUT 1000000
129 #define SERIAL_PORT_DEFAULT_BAUD_RATE 115200
130 #define SERIAL_PORT_DEFAULT_PARITY NoParity
131 #define SERIAL_PORT_DEFAULT_DATA_BITS 8
132 #define SERIAL_PORT_DEFAULT_STOP_BITS 1
134 #define SERIAL_PORT_DEFAULT_CONTROL_MASK 0
138 // (24000000/13)MHz input clock
140 #define SERIAL_PORT_INPUT_CLOCK 1843200
143 // 115200 baud with rounding errors
145 #define SERIAL_PORT_MAX_BAUD_RATE 115400
146 #define SERIAL_PORT_MIN_BAUD_RATE 50
148 #define SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH 16
149 #define SERIAL_PORT_MIN_TIMEOUT 1 // 1 uS
150 #define SERIAL_PORT_MAX_TIMEOUT 100000000 // 100 seconds
154 #define SERIAL_REGISTER_THR 0 // WO Transmit Holding Register
155 #define SERIAL_REGISTER_RBR 0 // RO Receive Buffer Register
156 #define SERIAL_REGISTER_DLL 0 // R/W Divisor Latch LSB
157 #define SERIAL_REGISTER_DLM 1 // R/W Divisor Latch MSB
158 #define SERIAL_REGISTER_IER 1 // R/W Interrupt Enable Register
159 #define SERIAL_REGISTER_IIR 2 // RO Interrupt Identification Register
160 #define SERIAL_REGISTER_FCR 2 // WO FIFO Cotrol Register
161 #define SERIAL_REGISTER_LCR 3 // R/W Line Control Register
162 #define SERIAL_REGISTER_MCR 4 // R/W Modem Control Register
163 #define SERIAL_REGISTER_LSR 5 // R/W Line Status Register
164 #define SERIAL_REGISTER_MSR 6 // R/W Modem Status Register
165 #define SERIAL_REGISTER_SCR 7 // R/W Scratch Pad Register
168 // Name: SERIAL_PORT_IER_BITS
169 // Purpose: Define each bit in Interrupt Enable Register
172 // RAVIE Bit0: Receiver Data Available Interrupt Enable
173 // THEIE Bit1: Transmistter Holding Register Empty Interrupt Enable
174 // RIE Bit2: Receiver Interrupt Enable
175 // MIE Bit3: Modem Interrupt Enable
176 // Reserved Bit4-Bit7: Reserved
184 } SERIAL_PORT_IER_BITS
;
187 // Name: SERIAL_PORT_IER
191 // Bits SERIAL_PORT_IER_BITS: Bits of the IER
192 // Data UINT8: the value of the IER
195 SERIAL_PORT_IER_BITS Bits
;
200 // Name: SERIAL_PORT_IIR_BITS
201 // Purpose: Define each bit in Interrupt Identification Register
204 // IPS Bit0: Interrupt Pending Status
205 // IIB Bit1-Bit3: Interrupt ID Bits
206 // Reserved Bit4-Bit5: Reserved
207 // FIFOES Bit6-Bit7: FIFO Mode Enable Status
214 } SERIAL_PORT_IIR_BITS
;
217 // Name: SERIAL_PORT_IIR
221 // Bits SERIAL_PORT_IIR_BITS: Bits of the IIR
222 // Data UINT8: the value of the IIR
225 SERIAL_PORT_IIR_BITS Bits
;
230 // Name: SERIAL_PORT_FCR_BITS
231 // Purpose: Define each bit in FIFO Control Register
234 // TRFIFOE Bit0: Transmit and Receive FIFO Enable
235 // RESETRF Bit1: Reset Reciever FIFO
236 // RESETTF Bit2: Reset Transmistter FIFO
237 // DMS Bit3: DMA Mode Select
238 // Reserved Bit4-Bit5: Reserved
239 // RTB Bit6-Bit7: Receive Trigger Bits
248 } SERIAL_PORT_FCR_BITS
;
251 // Name: SERIAL_PORT_FCR
255 // Bits SERIAL_PORT_FCR_BITS: Bits of the FCR
256 // Data UINT8: the value of the FCR
259 SERIAL_PORT_FCR_BITS Bits
;
264 // Name: SERIAL_PORT_LCR_BITS
265 // Purpose: Define each bit in Line Control Register
268 // SERIALDB Bit0-Bit1: Number of Serial Data Bits
269 // STOPB Bit2: Number of Stop Bits
270 // PAREN Bit3: Parity Enable
271 // EVENPAR Bit4: Even Parity Select
272 // STICPAR Bit5: Sticky Parity
273 // BRCON Bit6: Break Control
274 // DLAB Bit7: Divisor Latch Access Bit
284 } SERIAL_PORT_LCR_BITS
;
287 // Name: SERIAL_PORT_LCR
291 // Bits SERIAL_PORT_LCR_BITS: Bits of the LCR
292 // Data UINT8: the value of the LCR
295 SERIAL_PORT_LCR_BITS Bits
;
300 // Name: SERIAL_PORT_MCR_BITS
301 // Purpose: Define each bit in Modem Control Register
304 // DTRC Bit0: Data Terminal Ready Control
305 // RTS Bit1: Request To Send Control
306 // OUT1 Bit2: Output1
307 // OUT2 Bit3: Output2, used to disable interrupt
308 // LME; Bit4: Loopback Mode Enable
309 // Reserved Bit5-Bit7: Reserved
318 } SERIAL_PORT_MCR_BITS
;
321 // Name: SERIAL_PORT_MCR
325 // Bits SERIAL_PORT_MCR_BITS: Bits of the MCR
326 // Data UINT8: the value of the MCR
329 SERIAL_PORT_MCR_BITS Bits
;
334 // Name: SERIAL_PORT_LSR_BITS
335 // Purpose: Define each bit in Line Status Register
338 // DR Bit0: Receiver Data Ready Status
339 // OE Bit1: Overrun Error Status
340 // PE Bit2: Parity Error Status
341 // FE Bit3: Framing Error Status
342 // BI Bit4: Break Interrupt Status
343 // THRE Bit5: Transmistter Holding Register Status
344 // TEMT Bit6: Transmitter Empty Status
345 // FIFOE Bit7: FIFO Error Status
356 } SERIAL_PORT_LSR_BITS
;
359 // Name: SERIAL_PORT_LSR
363 // Bits SERIAL_PORT_LSR_BITS: Bits of the LSR
364 // Data UINT8: the value of the LSR
367 SERIAL_PORT_LSR_BITS Bits
;
372 // Name: SERIAL_PORT_MSR_BITS
373 // Purpose: Define each bit in Modem Status Register
376 // DeltaCTS Bit0: Delta Clear To Send Status
377 // DeltaDSR Bit1: Delta Data Set Ready Status
378 // TrailingEdgeRI Bit2: Trailing Edge of Ring Indicator Status
379 // DeltaDCD Bit3: Delta Data Carrier Detect Status
380 // CTS Bit4: Clear To Send Status
381 // DSR Bit5: Data Set Ready Status
382 // RI Bit6: Ring Indicator Status
383 // DCD Bit7: Data Carrier Detect Status
388 UINT8 TrailingEdgeRI
: 1;
394 } SERIAL_PORT_MSR_BITS
;
397 // Name: SERIAL_PORT_MSR
401 // Bits SERIAL_PORT_MSR_BITS: Bits of the MSR
402 // Data UINT8: the value of the MSR
405 SERIAL_PORT_MSR_BITS Bits
;
411 // Define serial register I/O macros
413 #define READ_RBR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_RBR)
414 #define READ_DLL(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_DLL)
415 #define READ_DLM(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_DLM)
416 #define READ_IER(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_IER)
417 #define READ_IIR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_IIR)
418 #define READ_LCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_LCR)
419 #define READ_MCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_MCR)
420 #define READ_LSR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_LSR)
421 #define READ_MSR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_MSR)
422 #define READ_SCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_SCR)
424 #define WRITE_THR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_THR, D)
425 #define WRITE_DLL(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_DLL, D)
426 #define WRITE_DLM(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_DLM, D)
427 #define WRITE_IER(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_IER, D)
428 #define WRITE_FCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_FCR, D)
429 #define WRITE_LCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_LCR, D)
430 #define WRITE_MCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_MCR, D)
431 #define WRITE_LSR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_LSR, D)
432 #define WRITE_MSR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_MSR, D)
433 #define WRITE_SCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_SCR, D)
437 // Driver model protocol interface
442 SerialControllerDriverSupported (
443 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
444 IN EFI_HANDLE Controller
,
445 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
450 SerialControllerDriverStart (
451 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
452 IN EFI_HANDLE Controller
,
453 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
458 SerialControllerDriverStop (
459 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
460 IN EFI_HANDLE Controller
,
461 IN UINTN NumberOfChildren
,
462 IN EFI_HANDLE
*ChildHandleBuffer
466 // Serial I/O Protocol Interface
471 IN EFI_SERIAL_IO_PROTOCOL
*This
476 IsaSerialSetAttributes (
477 IN EFI_SERIAL_IO_PROTOCOL
*This
,
479 IN UINT32 ReceiveFifoDepth
,
481 IN EFI_PARITY_TYPE Parity
,
483 IN EFI_STOP_BITS_TYPE StopBits
488 IsaSerialSetControl (
489 IN EFI_SERIAL_IO_PROTOCOL
*This
,
495 IsaSerialGetControl (
496 IN EFI_SERIAL_IO_PROTOCOL
*This
,
503 IN EFI_SERIAL_IO_PROTOCOL
*This
,
504 IN OUT UINTN
*BufferSize
,
511 IN EFI_SERIAL_IO_PROTOCOL
*This
,
512 IN OUT UINTN
*BufferSize
,
517 // Internal Functions
520 IsaSerialPortPresent (
521 IN SERIAL_DEV
*SerialDevice
526 IN SERIAL_DEV_FIFO
*Fifo
531 IN SERIAL_DEV_FIFO
*Fifo
536 IN SERIAL_DEV_FIFO
*Fifo
,
541 IsaSerialFifoRemove (
542 IN SERIAL_DEV_FIFO
*Fifo
,
547 IsaSerialReceiveTransmit (
548 IN SERIAL_DEV
*SerialDevice
553 IN EFI_ISA_IO_PROTOCOL
*IsaIo
,
554 IN UINT16 BaseAddress
,
560 IN EFI_ISA_IO_PROTOCOL
*IsaIo
,
561 IN UINT16 BaseAddress
,