]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c
ArmPlatformPkg/PL011Uart: Create PL011 UART driver
[mirror_edk2.git] / ArmPlatformPkg / Library / PL011SerialPortLib / PL011SerialPortLib.c
index 54ea28a769982647e321673685acbc132f0d89b1..842bbe005b36e9f22dac8d81c6dc9c96a18ae473 100644 (file)
 **/
 
 #include <Include/Uefi.h>
-#include <Library/SerialPortLib.h>
+
 #include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/SerialPortLib.h>
+
 #include <Drivers/PL011Uart.h>
+
 #include <ArmPlatform.h>
 
 /*
@@ -33,32 +37,11 @@ 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 PL011UartInitialize (
+      (UINTN)PcdGet64 (PcdSerialRegisterBase),
+      (UINTN)PcdGet64 (PcdUartDefaultBaudRate),
+      PL011_UARTLCR_H_WLEN_8);
 }
 
 /**
@@ -76,16 +59,9 @@ 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);
 }
 
 /**
@@ -105,14 +81,7 @@ 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);
 }
 
 /**
@@ -129,5 +98,5 @@ SerialPortPoll (
   VOID
   )
 {
-  return ((MmioRead32 (PL011_CONSOLE_UART_BASE + UARTFR) & UART_RX_EMPTY_FLAG_MASK) == 0);
+  return PL011UartPoll ((UINTN)PcdGet64 (PcdSerialRegisterBase));
 }