]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c
ArmPlatformPkg/PL011Uart: Allowed to change UART settings in its initialization function
[mirror_edk2.git] / ArmPlatformPkg / Library / PL011SerialPortLib / PL011SerialPortLib.c
index 54ea28a769982647e321673685acbc132f0d89b1..e3d8aabbc767a3d954e8010635aeb62b13c3cfb4 100644 (file)
@@ -1,8 +1,8 @@
 /** @file
   Serial I/O Port library functions with no library constructor/destructor
 
-
   Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+  Copyright (c) 2012, ARM Ltd. All rights reserved.<BR>
   
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD License
 
 **/
 
-#include <Include/Uefi.h>
-#include <Library/SerialPortLib.h>
+#include <Include/Base.h>
+
 #include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/SerialPortLib.h>
+
 #include <Drivers/PL011Uart.h>
-#include <ArmPlatform.h>
+
 
 /*
 
   Programmed hardware of Serial port.
 
-  @return    Always return EFI_UNSUPPORTED.
+  @return    Always return RETURN_UNSUPPORTED.
 
 **/
 RETURN_STATUS
@@ -33,42 +36,24 @@ SerialPortInitialize (
   VOID
   )
 {
-       if (PL011_CONSOLE_UART_SPEED == 115200) {
-               // Initialize baud rate generator
-               MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTIBRD, UART_115200_IDIV);
-               MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTFBRD, UART_115200_FDIV);
-       } else if (PL011_CONSOLE_UART_SPEED == 38400) {
-               // Initialize baud rate generator
-               MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTIBRD, UART_38400_IDIV);
-               MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTFBRD, UART_38400_FDIV);
-       } else if (PL011_CONSOLE_UART_SPEED == 19200) {
-               // Initialize baud rate generator
-               MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTIBRD, UART_19200_IDIV);
-               MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTFBRD, UART_19200_FDIV);
-       } else {
-               return EFI_INVALID_PARAMETER;
-       }
-
-  // No parity, 1 stop, no fifo, 8 data bits
-  MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTLCR_H, 0x60);
-
-  // Clear any pending errors
-  MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTECR, 0);
-
-  // enable tx, rx, and uart overall
-  MmioWrite32 (PL011_CONSOLE_UART_BASE + UARTCR, 0x301);
-
-  return EFI_SUCCESS;
+  return PL011UartInitializePort (
+      (UINTN)PcdGet64 (PcdSerialRegisterBase),
+      (UINTN)PcdGet64 (PcdUartDefaultBaudRate),
+      0, // Use the default value for Fifo depth
+      0, // Use the default value for Timeout,
+      (EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity),
+      PcdGet8 (PcdUartDefaultDataBits),
+      (EFI_STOP_BITS_TYPE) PcdGet8 (PcdUartDefaultStopBits));
 }
 
 /**
   Write data to serial device.
 
-  @param  Buffer           Point of data buffer which need to be writed.
+  @param  Buffer           Point of data buffer which need to be written.
   @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.
+  @retval !0               Actual number of bytes written to serial device.
 
 **/
 UINTN
@@ -76,26 +61,19 @@ EFIAPI
 SerialPortWrite (
   IN UINT8     *Buffer,
   IN UINTN     NumberOfBytes
-)
+  )
 {
-       UINTN  Count;
-
-       for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) {
-               while ((MmioRead32 (PL011_CONSOLE_UART_BASE + UARTFR) & UART_TX_EMPTY_FLAG_MASK) == 0);
-               MmioWrite8 (PL011_CONSOLE_UART_BASE + UARTDR, *Buffer);
-       }
-
-       return NumberOfBytes;
+  return PL011UartWrite ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer, NumberOfBytes);
 }
 
 /**
-  Read data from serial device and save the datas in buffer.
+  Read data from serial device and save the data in buffer.
 
-  @param  Buffer           Point of data buffer which need to be writed.
+  @param  Buffer           Point of data buffer which need to be written.
   @param  NumberOfBytes    Number of output bytes which are cached in Buffer.
 
   @retval 0                Read data failed.
-  @retval !0               Aactual number of bytes read from serial device.
+  @retval !0               Actual number of bytes read from serial device.
 
 **/
 UINTN
@@ -105,21 +83,14 @@ SerialPortRead (
   IN  UINTN     NumberOfBytes
 )
 {
-  UINTN   Count;
-
-       for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) {
-               while ((MmioRead32 (PL011_CONSOLE_UART_BASE + UARTFR) & UART_RX_EMPTY_FLAG_MASK) != 0);
-               *Buffer = MmioRead8 (PL011_CONSOLE_UART_BASE + UARTDR);
-       }
-
-       return NumberOfBytes;
+  return PL011UartRead ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer, NumberOfBytes);
 }
 
 /**
-  Check to see if any data is avaiable to be read from the debug device.
+  Check to see if any data is available to be read from the debug device.
 
-  @retval EFI_SUCCESS       At least one byte of data is avaiable to be read
-  @retval EFI_NOT_READY     No data is avaiable to be read
+  @retval EFI_SUCCESS       At least one byte of data is available to be read
+  @retval EFI_NOT_READY     No data is available to be read
   @retval EFI_DEVICE_ERROR  The serial device is not functioning properly
 
 **/
@@ -129,5 +100,5 @@ SerialPortPoll (
   VOID
   )
 {
-  return ((MmioRead32 (PL011_CONSOLE_UART_BASE + UARTFR) & UART_RX_EMPTY_FLAG_MASK) == 0);
+  return PL011UartPoll ((UINTN)PcdGet64 (PcdSerialRegisterBase));
 }