On Fri, Feb 07, 2020 at 18:13:25 +0530, Pankaj Bansal wrote:
> Use ArmPlatformPkg/PL011SerialPortLib with some changes:
> 1. add Get clock API to get the UART clock from ArmPlatformLib
> 2. remove SerialPortInitalize functionality
>
> This is same as being done in Silicon/NXP/Library/BaseSerialPortLib16550.
And just like for that one, any functionality changes need to be
introduced conditionally in the original - if there is no other way to
achieve the same effect.
/
Leif
> Signed-off-by: Pankaj Bansal <[email protected]>
> ---
> .../PL011SerialPortLib/PL011SerialPortLib.c | 229 ++++++++++++++++++
> .../PL011SerialPortLib/PL011SerialPortLib.inf | 42 ++++
> Silicon/NXP/NxpQoriqLs.dsc.inc | 1 +
> 3 files changed, 272 insertions(+)
> create mode 100644
> Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.c
> create mode 100644
> Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.inf
>
> diff --git a/Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.c
> b/Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.c
> new file mode 100644
> index 0000000000..35cfe8e324
> --- /dev/null
> +++ b/Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.c
> @@ -0,0 +1,229 @@
> +/** @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 - 2016, ARM Ltd. All rights reserved.<BR>
> + Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
> + Copyright 2020 NXP
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Base.h>
> +
> +#include <Library/IoLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PL011UartClockLib.h>
> +#include <Library/PL011UartLib.h>
> +#include <Library/SerialPortLib.h>
> +#include <Ppi/NxpPlatformGetClock.h>
> +
> +extern NXP_PLATFORM_GET_CLOCK_PPI mPlatformGetClockPpi;
> +
> +/** Initialise the serial device hardware with default settings.
> +
> + @retval RETURN_SUCCESS The serial device was initialised.
> + @retval RETURN_INVALID_PARAMETER One or more of the default settings
> + has an unsupported value.
> + **/
> +RETURN_STATUS
> +EFIAPI
> +SerialPortInitialize (
> + VOID
> + )
> +{
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Write data to serial device.
> +
> + @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 written to serial device.
> +
> +**/
> +UINTN
> +EFIAPI
> +SerialPortWrite (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + return PL011UartWrite ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer,
> NumberOfBytes);
> +}
> +
> +/**
> + Read data from serial device and save the data in buffer.
> +
> + @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 Actual number of bytes read from serial device.
> +
> +**/
> +UINTN
> +EFIAPI
> +SerialPortRead (
> + OUT UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> +)
> +{
> + return PL011UartRead ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer,
> NumberOfBytes);
> +}
> +
> +/**
> + Check to see if any data is available to be read from the debug device.
> +
> + @retval TRUE At least one byte of data is available to be read
> + @retval FALSE No data is available to be read
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +SerialPortPoll (
> + VOID
> + )
> +{
> + return PL011UartPoll ((UINTN)PcdGet64 (PcdSerialRegisterBase));
> +}
> +/**
> + Set new attributes to PL011.
> +
> + @param BaudRate The baud rate of the serial device. If the
> + baud rate is not supported, the speed will
> + be reduced down to the nearest supported
> one
> + and the variable's value will be updated
> + accordingly.
> + @param ReceiveFifoDepth The number of characters the device will
> + buffer on input. If the specified value is
> + not supported, the variable's value will
> + be reduced down to the nearest supported
> one.
> + @param Timeout If applicable, the number of microseconds
> the
> + device will wait before timing out a Read
> or
> + a Write operation.
> + @param Parity If applicable, this is the EFI_PARITY_TYPE
> + that is computed or checked as each
> character
> + is transmitted or received. If the device
> + does not support parity, the value is the
> + default parity value.
> + @param DataBits The number of data bits in each character
> + @param StopBits If applicable, the EFI_STOP_BITS_TYPE
> number
> + of stop bits per character. If the device
> + does not support stop bits, the value is
> the
> + default stop bit value.
> +
> + @retval EFI_SUCCESS All attributes were set correctly.
> + @retval EFI_INVALID_PARAMETERS One or more attributes has an unsupported
> + value.
> + @retval RETURN_DEVICE_ERROR The serial device is not functioning
> correctly.
> +
> +**/
> +RETURN_STATUS
> +EFIAPI
> +SerialPortSetAttributes (
> + IN OUT UINT64 *BaudRate,
> + IN OUT UINT32 *ReceiveFifoDepth,
> + IN OUT UINT32 *Timeout,
> + IN OUT EFI_PARITY_TYPE *Parity,
> + IN OUT UINT8 *DataBits,
> + IN OUT EFI_STOP_BITS_TYPE *StopBits
> + )
> +{
> + UINT64 SerialClock;
> +
> + SerialClock = mPlatformGetClockPpi.PlatformGetClock (NXP_UART_CLOCK, 0);
> + if (SerialClock == 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + return PL011UartInitializePort (
> + (UINTN)PcdGet64 (PcdSerialRegisterBase),
> + SerialClock,
> + BaudRate,
> + ReceiveFifoDepth,
> + Parity,
> + DataBits,
> + StopBits
> + );
> +}
> +
> +/**
> +
> + Assert or deassert the control signals on a serial port.
> + The following control signals are set according their bit settings :
> + . Request to Send
> + . Data Terminal Ready
> +
> + @param[in] Control The following bits are taken into account :
> + . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the
> + "Request To Send" control signal if this bit is
> + equal to one/zero.
> + . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert
> + the "Data Terminal Ready" control signal if this
> + bit is equal to one/zero.
> + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : enable/disable
> + the hardware loopback if this bit is equal to
> + one/zero.
> + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not supported.
> + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/
> + disable the hardware flow control based on CTS
> (Clear
> + To Send) and RTS (Ready To Send) control signals.
> +
> + @retval RETURN_SUCCESS The new control bits were set on the device.
> + @retval RETURN_UNSUPPORTED The device does not support this operation.
> +
> +**/
> +RETURN_STATUS
> +EFIAPI
> +SerialPortSetControl (
> + IN UINT32 Control
> + )
> +{
> + return PL011UartSetControl ((UINTN)PcdGet64 (PcdSerialRegisterBase),
> Control);
> +}
> +
> +/**
> +
> + Retrieve the status of the control bits on a serial device.
> +
> + @param[out] Control Status of the control bits on a serial device :
> +
> + . EFI_SERIAL_DATA_CLEAR_TO_SEND,
> + EFI_SERIAL_DATA_SET_READY,
> + EFI_SERIAL_RING_INDICATE,
> + EFI_SERIAL_CARRIER_DETECT,
> + EFI_SERIAL_REQUEST_TO_SEND,
> + EFI_SERIAL_DATA_TERMINAL_READY
> + are all related to the DTE (Data Terminal
> Equipment)
> + and DCE (Data Communication Equipment) modes of
> + operation of the serial device.
> + . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the
> + receive buffer is empty, 0 otherwise.
> + . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if
> the
> + transmit buffer is empty, 0 otherwise.
> + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one
> if
> + the hardware loopback is enabled (the output feeds
> + the receive buffer), 0 otherwise.
> + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one
> + if a loopback is accomplished by software, else 0.
> + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal to
> + one if the hardware flow control based on CTS
> (Clear
> + To Send) and RTS (Ready To Send) control signals is
> + enabled, 0 otherwise.
> +
> + @retval RETURN_SUCCESS The control bits were read from the device.
> +
> +**/
> +RETURN_STATUS
> +EFIAPI
> +SerialPortGetControl (
> + OUT UINT32 *Control
> + )
> +{
> + return PL011UartGetControl ((UINTN)PcdGet64 (PcdSerialRegisterBase),
> Control);
> +}
> diff --git a/Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.inf
> b/Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.inf
> new file mode 100644
> index 0000000000..29f234027f
> --- /dev/null
> +++ b/Silicon/NXP/Library/PL011SerialPortLib/PL011SerialPortLib.inf
> @@ -0,0 +1,42 @@
> +#/** @file
> +#
> +# Component description file for PL011SerialPortLib module
> +#
> +# Copyright (c) 2011-2016, ARM Ltd. All rights reserved.<BR>
> +# Copyright 2020 NXP
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#**/
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = PL011SerialPortLib
> + FILE_GUID = 8ecefc8f-a2c4-4091-b80f-20f7aeb0567f
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = SerialPortLib
> +
> +[Sources.common]
> + PL011SerialPortLib.c
> +
> +[LibraryClasses]
> + PL011UartLib
> + PcdLib
> + ArmPlatformLib
> +
> +[Packages]
> + EmbeddedPkg/EmbeddedPkg.dec
> + MdePkg/MdePkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> + ArmPlatformPkg/ArmPlatformPkg.dec
> + Silicon/NXP/NxpQoriqLs.dec
> +
> +[Pcd]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
> +
> +[FixedPcd]
> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits
> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity
> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits
> diff --git a/Silicon/NXP/NxpQoriqLs.dsc.inc b/Silicon/NXP/NxpQoriqLs.dsc.inc
> index 9922686304..2ab6ee1920 100644
> --- a/Silicon/NXP/NxpQoriqLs.dsc.inc
> +++ b/Silicon/NXP/NxpQoriqLs.dsc.inc
> @@ -100,6 +100,7 @@
> IoAccessLib|Silicon/NXP/Library/IoAccessLib/IoAccessLib.inf
> PlatformPeiLib|Silicon/NXP/Library/PlatformPeiLib/PlatformPeiLib.inf
> MemoryInitPeiLib|Silicon/NXP/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf
> + PL011UartLib|ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.inf
>
> [LibraryClasses.common.SEC]
> PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
> --
> 2.17.1
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#54304): https://edk2.groups.io/g/devel/message/54304
Mute This Topic: https://groups.io/mt/71046340/21656
Group Owner: [email protected]
Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-