| /** @file |
| Serial I/O Port library functions with no library constructor/destructor |
| |
| Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR> |
|
|
| This program and the accompanying materials are licensed and made available under
|
| the terms and conditions of the BSD License that accompanies this distribution.
|
| The full text of the license may be found at
|
| http://opensource.org/licenses/bsd-license.php.
|
|
|
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. |
| |
| **/ |
| |
| #include "PlatformSerialPortLib.h" |
| |
| UINT16 gComBase = 0x3f8; |
| UINTN gBps = 115200; |
| UINT8 gData = 8; |
| UINT8 gStop = 1; |
| UINT8 gParity = 0; |
| UINT8 gBreakSet = 0; |
| |
| /** |
| Initialize Serial Port |
| |
| The Baud Rate Divisor registers are programmed and the LCR |
| is used to configure the communications format. Hard coded |
| UART config comes from globals in DebugSerialPlatform lib. |
| |
| @param None |
| |
| @retval None |
| |
| **/ |
| RETURN_STATUS |
| EFIAPI |
| UARTInitialize ( |
| VOID |
| ) |
| { |
| UINTN Divisor; |
| UINT8 OutputData; |
| UINT8 Data; |
| |
| // |
| // Map 5..8 to 0..3 |
| // |
| Data = (UINT8) (gData - (UINT8) 5); |
| |
| // |
| // Calculate divisor for baud generator |
| // |
| Divisor = 115200 / gBps; |
| |
| // |
| // Set communications format |
| // |
| OutputData = (UINT8) ((DLAB << 7) | ((gBreakSet << 6) | ((gParity << 3) | ((gStop << 2) | Data)))); |
| IoWrite8 (gComBase + LCR_OFFSET, OutputData); |
| |
| // |
| // Configure baud rate |
| // |
| IoWrite8 (gComBase + BAUD_HIGH_OFFSET, (UINT8) (Divisor >> 8)); |
| IoWrite8 (gComBase + BAUD_LOW_OFFSET, (UINT8) (Divisor & 0xff)); |
| |
| // |
| // Switch back to bank 0 |
| // |
| OutputData = (UINT8) ((~DLAB << 7) | ((gBreakSet << 6) | ((gParity << 3) | ((gStop << 2) | Data)))); |
| IoWrite8 (gComBase + LCR_OFFSET, OutputData); |
| |
| return RETURN_SUCCESS; |
| } |
| |
| /** |
| Common function to initialize UART Serial device and USB Serial device. |
| |
| @param None |
| |
| @retval None |
| |
| **/ |
| RETURN_STATUS |
| EFIAPI |
| SerialPortInitialize ( |
| VOID |
| ) |
| { |
| |
| UARTInitialize (); |
| |
| |
| return RETURN_SUCCESS; |
| } |
| |
| /** |
| Write data to serial device. |
| |
| If the buffer is NULL, then return 0; |
| if NumberOfBytes is zero, then return 0. |
| |
| @param Buffer Point of data buffer which need to be writed. |
| @param NumberOfBytes Number of output bytes which are cached in Buffer. |
| |
| @retval 0 Write data failed. |
| @retval !0 Actual number of bytes writed to serial device. |
| |
| **/ |
| UINTN |
| EFIAPI |
| UARTDbgOut ( |
| IN UINT8 *Buffer, |
| IN UINTN NumberOfBytes |
| ) |
| { |
| UINTN Result; |
| UINT8 Data; |
| |
| if (NULL == Buffer) { |
| return 0; |
| } |
| |
| Result = NumberOfBytes; |
| |
| while (NumberOfBytes--) { |
| // |
| // Wait for the serial port to be ready. |
| // |
| do { |
| Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET); |
| } while ((Data & LSR_TXRDY) == 0); |
| IoWrite8 ((UINT16) PcdGet64 (PcdSerialRegisterBase), *Buffer++); |
| } |
| |
| return Result; |
| } |
| |
| /** |
| Common function to write data to UART Serial device and USB Serial device. |
| |
| @param Buffer Point of data buffer which need to be writed. |
| @param NumberOfBytes Number of output bytes which are cached in Buffer. |
| |
| **/ |
| UINTN |
| EFIAPI |
| SerialPortWrite ( |
| IN UINT8 *Buffer, |
| IN UINTN NumberOfBytes |
| ) |
| { |
| if (FeaturePcdGet (PcdStatusCodeUseIsaSerial)) { |
| UARTDbgOut (Buffer, NumberOfBytes); |
| } |
| |
| return RETURN_SUCCESS; |
| } |
| |
| /** |
| Read data from serial device and save the datas in buffer. |
| |
| If the buffer is NULL, then return 0; |
| if NumberOfBytes is zero, then return 0. |
| |
| @param Buffer Point of data buffer which need to be writed. |
| @param NumberOfBytes Number of output bytes which are cached in Buffer. |
| |
| @retval 0 Read data failed. |
| @retval !0 Actual number of bytes raed to serial device. |
| |
| **/ |
| UINTN |
| EFIAPI |
| UARTDbgIn ( |
| OUT UINT8 *Buffer, |
| IN UINTN NumberOfBytes |
| ) |
| { |
| UINTN Result; |
| UINT8 Data; |
| |
| if (NULL == Buffer) { |
| return 0; |
| } |
| |
| Result = NumberOfBytes; |
| |
| while (NumberOfBytes--) { |
| // |
| // Wait for the serial port to be ready. |
| // |
| do { |
| Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET); |
| } while ((Data & LSR_RXDA) == 0); |
| |
| *Buffer++ = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase)); |
| } |
| |
| return Result; |
| } |
| |
| /** |
| Common function to Read data from UART serial device, USB serial device and save the datas in buffer. |
| |
| @param Buffer Point of data buffer which need to be writed. |
| @param NumberOfBytes Number of output bytes which are cached in Buffer. |
| |
| **/ |
| UINTN |
| EFIAPI |
| SerialPortRead ( |
| OUT UINT8 *Buffer, |
| IN UINTN NumberOfBytes |
| ) |
| { |
| if (FeaturePcdGet (PcdStatusCodeUseIsaSerial)) { |
| UARTDbgIn (Buffer, NumberOfBytes); |
| } |
| |
| return RETURN_SUCCESS; |
| } |
| |
| |
| /** |
| Polls a serial device to see if there is any data waiting to be read. |
| |
| Polls aserial device to see if there is any data waiting to be read. |
| If there is data waiting to be read from the serial device, then TRUE is returned. |
| If there is no data waiting to be read from the serial device, then FALSE is returned. |
| |
| @retval TRUE Data is waiting to be read from the serial device. |
| @retval FALSE There is no data waiting to be read from the serial device. |
| |
| **/ |
| BOOLEAN |
| EFIAPI |
| SerialPortPoll ( |
| VOID |
| ) |
| { |
| UINT8 Data; |
| |
| // |
| // Read the serial port status. |
| // |
| Data = IoRead8 ((UINT16) PcdGet64 (PcdSerialRegisterBase) + LSR_OFFSET); |
| |
| return (BOOLEAN) ((Data & LSR_RXDA) != 0); |
| } |