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
;
43 // Internal Data Structures
45 #define SERIAL_DEV_SIGNATURE EFI_SIGNATURE_32 ('s', 'e', 'r', 'd')
46 #define SERIAL_MAX_BUFFER_SIZE 16
47 #define TIMEOUT_STALL_INTERVAL 10
50 // Name: SERIAL_DEV_FIFO
51 // Purpose: To define Receive FIFO and Transmit FIFO
52 // Context: Used by serial data transmit and receive
54 // First UINT32: The index of the first data in array Data[]
55 // Last UINT32: The index, which you can put a new data into array Data[]
56 // Surplus UINT32: Identify how many data you can put into array Data[]
57 // Data[] UINT8 : An array, which used to store data
63 UINT8 Data
[SERIAL_MAX_BUFFER_SIZE
];
75 // Purpose: To provide device specific information
78 // Signature UINTN: The identity of the serial device
79 // SerialIo SERIAL_IO_PROTOCOL: Serial I/O protocol interface
80 // SerialMode SERIAL_IO_MODE:
81 // DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device
82 // Handle EFI_HANDLE: The handle instance attached to serial device
83 // BaseAddress UINT16: The base address of specific serial device
84 // Receive SERIAL_DEV_FIFO: The FIFO used to store data,
85 // which is received by UART
86 // Transmit SERIAL_DEV_FIFO: The FIFO used to store data,
87 // which you want to transmit by UART
88 // SoftwareLoopbackEnable BOOLEAN:
89 // Type EFI_UART_TYPE: Specify the UART type of certain serial device
95 EFI_SERIAL_IO_PROTOCOL SerialIo
;
96 EFI_SERIAL_IO_MODE SerialMode
;
97 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
99 EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
;
100 UART_DEVICE_PATH UartDevicePath
;
101 EFI_ISA_IO_PROTOCOL
*IsaIo
;
104 SERIAL_DEV_FIFO Receive
;
105 SERIAL_DEV_FIFO Transmit
;
106 BOOLEAN SoftwareLoopbackEnable
;
107 BOOLEAN HardwareFlowControl
;
109 EFI_UNICODE_STRING_TABLE
*ControllerNameTable
;
112 #include "ComponentName.h"
114 #define SERIAL_DEV_FROM_THIS(a) CR (a, SERIAL_DEV, SerialIo, SERIAL_DEV_SIGNATURE)
119 extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver
;
122 // Serial Driver Defaults
124 #define SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH 1
125 #define SERIAL_PORT_DEFAULT_TIMEOUT 1000000
128 #define SERIAL_PORT_DEFAULT_BAUD_RATE 115200
129 #define SERIAL_PORT_DEFAULT_PARITY NoParity
130 #define SERIAL_PORT_DEFAULT_DATA_BITS 8
131 #define SERIAL_PORT_DEFAULT_STOP_BITS 1
133 #define SERIAL_PORT_DEFAULT_CONTROL_MASK 0
137 // (24000000/13)MHz input clock
139 #define SERIAL_PORT_INPUT_CLOCK 1843200
142 // 115200 baud with rounding errors
144 #define SERIAL_PORT_MAX_BAUD_RATE 115400
145 #define SERIAL_PORT_MIN_BAUD_RATE 50
147 #define SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH 16
148 #define SERIAL_PORT_MIN_TIMEOUT 1 // 1 uS
149 #define SERIAL_PORT_MAX_TIMEOUT 100000000 // 100 seconds
153 #define SERIAL_REGISTER_THR 0 // WO Transmit Holding Register
154 #define SERIAL_REGISTER_RBR 0 // RO Receive Buffer Register
155 #define SERIAL_REGISTER_DLL 0 // R/W Divisor Latch LSB
156 #define SERIAL_REGISTER_DLM 1 // R/W Divisor Latch MSB
157 #define SERIAL_REGISTER_IER 1 // R/W Interrupt Enable Register
158 #define SERIAL_REGISTER_IIR 2 // RO Interrupt Identification Register
159 #define SERIAL_REGISTER_FCR 2 // WO FIFO Cotrol Register
160 #define SERIAL_REGISTER_LCR 3 // R/W Line Control Register
161 #define SERIAL_REGISTER_MCR 4 // R/W Modem Control Register
162 #define SERIAL_REGISTER_LSR 5 // R/W Line Status Register
163 #define SERIAL_REGISTER_MSR 6 // R/W Modem Status Register
164 #define SERIAL_REGISTER_SCR 7 // R/W Scratch Pad Register
167 // Name: SERIAL_PORT_IER_BITS
168 // Purpose: Define each bit in Interrupt Enable Register
171 // RAVIE Bit0: Receiver Data Available Interrupt Enable
172 // THEIE Bit1: Transmistter Holding Register Empty Interrupt Enable
173 // RIE Bit2: Receiver Interrupt Enable
174 // MIE Bit3: Modem Interrupt Enable
175 // Reserved Bit4-Bit7: Reserved
183 } SERIAL_PORT_IER_BITS
;
186 // Name: SERIAL_PORT_IER
190 // Bits SERIAL_PORT_IER_BITS: Bits of the IER
191 // Data UINT8: the value of the IER
194 SERIAL_PORT_IER_BITS Bits
;
199 // Name: SERIAL_PORT_IIR_BITS
200 // Purpose: Define each bit in Interrupt Identification Register
203 // IPS Bit0: Interrupt Pending Status
204 // IIB Bit1-Bit3: Interrupt ID Bits
205 // Reserved Bit4-Bit5: Reserved
206 // FIFOES Bit6-Bit7: FIFO Mode Enable Status
213 } SERIAL_PORT_IIR_BITS
;
216 // Name: SERIAL_PORT_IIR
220 // Bits SERIAL_PORT_IIR_BITS: Bits of the IIR
221 // Data UINT8: the value of the IIR
224 SERIAL_PORT_IIR_BITS Bits
;
229 // Name: SERIAL_PORT_FCR_BITS
230 // Purpose: Define each bit in FIFO Control Register
233 // TRFIFOE Bit0: Transmit and Receive FIFO Enable
234 // RESETRF Bit1: Reset Reciever FIFO
235 // RESETTF Bit2: Reset Transmistter FIFO
236 // DMS Bit3: DMA Mode Select
237 // Reserved Bit4-Bit5: Reserved
238 // RTB Bit6-Bit7: Receive Trigger Bits
247 } SERIAL_PORT_FCR_BITS
;
250 // Name: SERIAL_PORT_FCR
254 // Bits SERIAL_PORT_FCR_BITS: Bits of the FCR
255 // Data UINT8: the value of the FCR
258 SERIAL_PORT_FCR_BITS Bits
;
263 // Name: SERIAL_PORT_LCR_BITS
264 // Purpose: Define each bit in Line Control Register
267 // SERIALDB Bit0-Bit1: Number of Serial Data Bits
268 // STOPB Bit2: Number of Stop Bits
269 // PAREN Bit3: Parity Enable
270 // EVENPAR Bit4: Even Parity Select
271 // STICPAR Bit5: Sticky Parity
272 // BRCON Bit6: Break Control
273 // DLAB Bit7: Divisor Latch Access Bit
283 } SERIAL_PORT_LCR_BITS
;
286 // Name: SERIAL_PORT_LCR
290 // Bits SERIAL_PORT_LCR_BITS: Bits of the LCR
291 // Data UINT8: the value of the LCR
294 SERIAL_PORT_LCR_BITS Bits
;
299 // Name: SERIAL_PORT_MCR_BITS
300 // Purpose: Define each bit in Modem Control Register
303 // DTRC Bit0: Data Terminal Ready Control
304 // RTS Bit1: Request To Send Control
305 // OUT1 Bit2: Output1
306 // OUT2 Bit3: Output2, used to disable interrupt
307 // LME; Bit4: Loopback Mode Enable
308 // Reserved Bit5-Bit7: Reserved
317 } SERIAL_PORT_MCR_BITS
;
320 // Name: SERIAL_PORT_MCR
324 // Bits SERIAL_PORT_MCR_BITS: Bits of the MCR
325 // Data UINT8: the value of the MCR
328 SERIAL_PORT_MCR_BITS Bits
;
333 // Name: SERIAL_PORT_LSR_BITS
334 // Purpose: Define each bit in Line Status Register
337 // DR Bit0: Receiver Data Ready Status
338 // OE Bit1: Overrun Error Status
339 // PE Bit2: Parity Error Status
340 // FE Bit3: Framing Error Status
341 // BI Bit4: Break Interrupt Status
342 // THRE Bit5: Transmistter Holding Register Status
343 // TEMT Bit6: Transmitter Empty Status
344 // FIFOE Bit7: FIFO Error Status
355 } SERIAL_PORT_LSR_BITS
;
358 // Name: SERIAL_PORT_LSR
362 // Bits SERIAL_PORT_LSR_BITS: Bits of the LSR
363 // Data UINT8: the value of the LSR
366 SERIAL_PORT_LSR_BITS Bits
;
371 // Name: SERIAL_PORT_MSR_BITS
372 // Purpose: Define each bit in Modem Status Register
375 // DeltaCTS Bit0: Delta Clear To Send Status
376 // DeltaDSR Bit1: Delta Data Set Ready Status
377 // TrailingEdgeRI Bit2: Trailing Edge of Ring Indicator Status
378 // DeltaDCD Bit3: Delta Data Carrier Detect Status
379 // CTS Bit4: Clear To Send Status
380 // DSR Bit5: Data Set Ready Status
381 // RI Bit6: Ring Indicator Status
382 // DCD Bit7: Data Carrier Detect Status
387 UINT8 TrailingEdgeRI
: 1;
393 } SERIAL_PORT_MSR_BITS
;
396 // Name: SERIAL_PORT_MSR
400 // Bits SERIAL_PORT_MSR_BITS: Bits of the MSR
401 // Data UINT8: the value of the MSR
404 SERIAL_PORT_MSR_BITS Bits
;
410 // Define serial register I/O macros
412 #define READ_RBR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_RBR)
413 #define READ_DLL(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_DLL)
414 #define READ_DLM(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_DLM)
415 #define READ_IER(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_IER)
416 #define READ_IIR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_IIR)
417 #define READ_LCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_LCR)
418 #define READ_MCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_MCR)
419 #define READ_LSR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_LSR)
420 #define READ_MSR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_MSR)
421 #define READ_SCR(IO, B) IsaSerialReadPort (IO, B, SERIAL_REGISTER_SCR)
423 #define WRITE_THR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_THR, D)
424 #define WRITE_DLL(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_DLL, D)
425 #define WRITE_DLM(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_DLM, D)
426 #define WRITE_IER(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_IER, D)
427 #define WRITE_FCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_FCR, D)
428 #define WRITE_LCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_LCR, D)
429 #define WRITE_MCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_MCR, D)
430 #define WRITE_LSR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_LSR, D)
431 #define WRITE_MSR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_MSR, D)
432 #define WRITE_SCR(IO, B, D) IsaSerialWritePort (IO, B, SERIAL_REGISTER_SCR, D)
436 // Driver model protocol interface
441 SerialControllerDriverSupported (
442 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
443 IN EFI_HANDLE Controller
,
444 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
449 SerialControllerDriverStart (
450 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
451 IN EFI_HANDLE Controller
,
452 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
457 SerialControllerDriverStop (
458 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
459 IN EFI_HANDLE Controller
,
460 IN UINTN NumberOfChildren
,
461 IN EFI_HANDLE
*ChildHandleBuffer
465 // Serial I/O Protocol Interface
470 IN EFI_SERIAL_IO_PROTOCOL
*This
475 IsaSerialSetAttributes (
476 IN EFI_SERIAL_IO_PROTOCOL
*This
,
478 IN UINT32 ReceiveFifoDepth
,
480 IN EFI_PARITY_TYPE Parity
,
482 IN EFI_STOP_BITS_TYPE StopBits
487 IsaSerialSetControl (
488 IN EFI_SERIAL_IO_PROTOCOL
*This
,
494 IsaSerialGetControl (
495 IN EFI_SERIAL_IO_PROTOCOL
*This
,
502 IN EFI_SERIAL_IO_PROTOCOL
*This
,
503 IN OUT UINTN
*BufferSize
,
510 IN EFI_SERIAL_IO_PROTOCOL
*This
,
511 IN OUT UINTN
*BufferSize
,
516 // Internal Functions
519 IsaSerialPortPresent (
520 IN SERIAL_DEV
*SerialDevice
525 IN SERIAL_DEV_FIFO
*Fifo
530 IN SERIAL_DEV_FIFO
*Fifo
535 IN SERIAL_DEV_FIFO
*Fifo
,
540 IsaSerialFifoRemove (
541 IN SERIAL_DEV_FIFO
*Fifo
,
546 IsaSerialReceiveTransmit (
547 IN SERIAL_DEV
*SerialDevice
552 IN EFI_ISA_IO_PROTOCOL
*IsaIo
,
553 IN UINT16 BaseAddress
,
559 IN EFI_ISA_IO_PROTOCOL
*IsaIo
,
560 IN UINT16 BaseAddress
,