On 22 June 2017 at 15:02, Leif Lindholm <[email protected]> wrote: > On Thu, Jun 22, 2017 at 10:31:57AM +0100, Scott Telford wrote: >> Add serial port library to support the Cadence IP6528 UART used in the >> Cadence CSP platform. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Scott Telford <[email protected]> > > Reviewed-by: Leif Lindholm <[email protected]> >
Reviewed-by: Ard Biesheuvel <[email protected]> >> --- >> CadencePkg/Include/Library/CspSerialPortLib.h | 86 ++++ >> .../CadenceCspSerialPortLib/CspSerialPortLib.c | 523 >> +++++++++++++++++++++ >> .../CadenceCspSerialPortLib/CspSerialPortLib.inf | 52 ++ >> .../CadenceCspSerialPortLib/CspSerialPortLib.uni | Bin 0 -> 1622 bytes >> 4 files changed, 661 insertions(+) >> create mode 100644 CadencePkg/Include/Library/CspSerialPortLib.h >> create mode 100644 >> CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.c >> create mode 100644 >> CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.inf >> create mode 100644 >> CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.uni >> >> diff --git a/CadencePkg/Include/Library/CspSerialPortLib.h >> b/CadencePkg/Include/Library/CspSerialPortLib.h >> new file mode 100644 >> index 0000000..46fa0d8 >> --- /dev/null >> +++ b/CadencePkg/Include/Library/CspSerialPortLib.h >> @@ -0,0 +1,86 @@ >> +/** @file >> +* Serial Port Library for Cadence IP6528 UART. >> +* Copyright (c) 2017, Cadence Design Systems. All rights reserved. >> +* >> +* This program and the accompanying materials are licensed and made >> +* available under the terms and conditions of the BSD License which >> +* 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. >> +* >> +**/ >> + >> +#ifndef __CSP_SERIAL_PORT_LIB_H__ >> +#define __CSP_SERIAL_PORT_LIB_H__ >> + >> +// Cadence UART register offsets >> +#define CSP_UART_CR 0x00 // Control >> +#define CSP_UART_MR 0x04 // Mode >> +#define CSP_UART_IER 0x08 // Interrupt enable >> +#define CSP_UART_IDR 0x0C // Interrupt disable >> +#define CSP_UART_IMR 0x10 // Interrupt mask >> +#define CSP_UART_CISR 0x14 // Channel interrupt status >> +#define CSP_UART_BRGR 0x18 // Baud rate generator >> +#define CSP_UART_RTOR 0x1C // Rx Timeout >> +#define CSP_UART_RTRIG 0x20 // Rx FIFO trigger level >> +#define CSP_UART_MCR 0x24 // Modem control >> +#define CSP_UART_MSR 0x28 // Modem status >> +#define CSP_UART_CSR 0x2C // Channel status >> +#define CSP_UART_FIFO 0x30 // FIFO (Tx/Rx) >> +#define CSP_UART_BDIV 0x34 // Baud rate divider >> +#define CSP_UART_FDEL 0x38 // Flow delay >> +#define CSP_UART_PMIN 0x3C // IR min received pulse width >> +#define CSP_UART_PWID 0x40 // IR transmitted pulse Width >> +#define CSP_UART_TTRIG 0x44 // Tx FIFO trigger level >> + >> + >> +// Control Register Bit Definitions >> +#define CSP_UART_CR_STPBRK 0x00000100 // Stop Tx break >> +#define CSP_UART_CR_STTBRK 0x00000080 // Start Tx break >> +#define CSP_UART_CR_RSTTO 0x00000040 // Restart Rx timeout Counter >> +#define CSP_UART_CR_TXDIS 0x00000020 // Tx disable >> +#define CSP_UART_CR_TXEN 0x00000010 // Tx enable >> +#define CSP_UART_CR_RXDIS 0x00000008 // Rx disable >> +#define CSP_UART_CR_RXEN 0x00000004 // Rx enable >> +#define CSP_UART_CR_TXRES 0x00000002 // Tx reset >> +#define CSP_UART_CR_RXRES 0x00000001 // Rx reset >> + >> + >> +// Mode register bit definitions >> +#define CSP_UART_MR_CLKS 0x00000001 // Baud rate /8 >> pre-scalar >> +#define CSP_UART_MR_CHMODE_LLB 0x00000200 // Local loopback mode >> +#define CSP_UART_MR_CHMODE_NML 0x00000000 // Normal mode >> + >> +#define CSP_UART_MR_CHRL_6 0x00000006 // 6 databits >> +#define CSP_UART_MR_CHRL_7 0x00000004 // 7 databits >> +#define CSP_UART_MR_CHRL_8 0x00000000 // 8 databits >> + >> +#define CSP_UART_MR_PAR_NONE 0x00000020 // No parity mode >> +#define CSP_UART_MR_PAR_MARK 0x00000018 // Mark parity mode >> +#define CSP_UART_MR_PAR_SPACE 0x00000010 // Space parity mode >> +#define CSP_UART_MR_PAR_ODD 0x00000008 // Odd parity mode >> +#define CSP_UART_MR_PAR_EVEN 0x00000000 // Even parity mode >> + >> +#define CSP_UART_MR_NBSTOP_1 0x00000000 // 1 stop bit >> +#define CSP_UART_MR_NBSTOP_2 0x00000080 // 2 stop bits >> + >> +// Modem control register bit definitions >> +#define CSP_UART_MCR_DTR 0x00000001 // DTR control >> +#define CSP_UART_MCR_RTS 0x00000002 // RTS control >> +#define CSP_UART_MCR_FCM 0x00000020 // Auto flow control >> + >> +// Modem status register bit definitions >> +#define CSP_UART_MSR_FCMS 0x00000100 // Auto flow control >> status >> +#define CSP_UART_MSR_DCD 0x00000080 // DCD status >> +#define CSP_UART_MSR_RI 0x00000040 // RI status >> +#define CSP_UART_MSR_DSR 0x00000020 // DSR status >> +#define CSP_UART_MSR_CTS 0x00000010 // CTS status >> + >> +// Channel status register bit definitions >> +#define CSP_UART_CSR_REMPTY 0x00000002 // Rx FIFO empty >> +#define CSP_UART_CSR_TEMPTY 0x00000008 // Tx FIFO empty >> +#define CSP_UART_CSR_TFUL 0x00000010 // Tx FIFO full >> + >> +#endif >> diff --git a/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.c >> b/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.c >> new file mode 100644 >> index 0000000..9a9e14a >> --- /dev/null >> +++ b/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.c >> @@ -0,0 +1,523 @@ >> +/** @file >> + Serial Port Library for Cadence IP6528 UART. >> + Copyright (c) 2015-2017, Cadence Design Systems, Inc. All rights reserved. >> + >> + Based on: >> + >> + Null Serial Port library instance with empty functions. >> + >> + Copyright (c) 2006 - 2010, 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 >> + which 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 <Base.h> >> +#include <Library/BaseLib.h> >> +#include <Library/CspSerialPortLib.h> >> +#include <Library/CspSysReg.h> >> +#include <Library/DebugLib.h> >> +#include <Library/IoLib.h> >> +#include <Library/PcdLib.h> >> +#include <Library/SerialPortLib.h> >> + >> + >> +RETURN_STATUS >> +EFIAPI >> +CspUartInitializePort ( >> + IN UINTN UartBase, >> + IN OUT UINT64 *BaudRate, >> + IN OUT EFI_PARITY_TYPE *Parity, >> + IN OUT UINT8 *DataBits, >> + IN OUT EFI_STOP_BITS_TYPE *StopBits >> +); >> +VOID CspUartPutChar (IN UINTN UartBase, IN UINT8 Char); >> +UINT8 CspUartGetChar (IN UINTN UartBase); >> + >> +/** >> + Initialize the serial device hardware. >> + >> + If no initialization is required, then return RETURN_SUCCESS. >> + If the serial device was successfully initialized, then return >> RETURN_SUCCESS. >> + If the serial device could not be initialized, then return >> RETURN_DEVICE_ERROR. >> + >> + @retval RETURN_SUCCESS The serial device was initialized. >> + @retval RETURN_DEVICE_ERROR The serial device could not be initialized. >> + >> +**/ >> +RETURN_STATUS >> +EFIAPI >> +SerialPortInitialize ( >> + VOID >> + ) >> +{ >> + UINT64 BaudRate; >> + EFI_PARITY_TYPE Parity; >> + UINT8 DataBits; >> + EFI_STOP_BITS_TYPE StopBits; >> + >> + BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate); >> + Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity); >> + DataBits = FixedPcdGet8 (PcdUartDefaultDataBits); >> + StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits); >> + >> + return CspUartInitializePort ( >> + (UINTN)FixedPcdGet64 (PcdCspSerialBase), >> + &BaudRate, >> + &Parity, >> + &DataBits, >> + &StopBits >> + ); >> +} >> + >> +/** >> + Set new attributes to UART. >> + >> + @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. >> + >> +**/ >> +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 >> + ) >> +{ >> + return CspUartInitializePort ( >> + (UINTN)FixedPcdGet64 (PcdCspSerialBase), >> + BaudRate, >> + Parity, >> + DataBits, >> + StopBits >> + ); >> +} >> + >> +/** >> + Write data from buffer to serial device. >> + >> + Writes NumberOfBytes data bytes from Buffer to the serial device. >> + The number of bytes actually written to the serial device is returned. >> + If the return value is less than NumberOfBytes, then the write operation >> failed. >> + If Buffer is NULL, then ASSERT(). >> + If NumberOfBytes is zero, then return 0. >> + >> + @param Buffer The pointer to the data buffer to be written. >> + @param NumberOfBytes The number of bytes to written to the serial >> device. >> + >> + @retval 0 NumberOfBytes is 0. >> + @retval >0 The number of bytes written to the serial device. >> + If this value is less than NumberOfBytes, then >> the read operation failed. >> + >> +**/ >> +UINTN >> +EFIAPI >> +SerialPortWrite ( >> + IN UINT8 *Buffer, >> + IN UINTN NumberOfBytes >> +) >> +{ >> + UINTN i; >> + for (i = 0; i < NumberOfBytes; i++) { >> + CspUartPutChar ((UINTN)PcdGet64 (PcdCspSerialBase), Buffer[i]); >> + } >> + return i; >> +} >> + >> + >> +/** >> + Read data from serial device and save the datas in buffer. >> + >> + Reads NumberOfBytes data bytes from a serial device into the buffer >> + specified by Buffer. The number of bytes actually read is returned. >> + If the return value is less than NumberOfBytes, then the rest operation >> failed. >> + If Buffer is NULL, then ASSERT(). >> + If NumberOfBytes is zero, then return 0. >> + >> + @param Buffer The pointer to the data buffer to store the data >> read from the serial device. >> + @param NumberOfBytes The number of bytes which will be read. >> + >> + @retval 0 Read data failed; No data is to be read. >> + @retval >0 The actual number of bytes read from serial >> device. >> + >> +**/ >> +UINTN >> +EFIAPI >> +SerialPortRead ( >> + OUT UINT8 *Buffer, >> + IN UINTN NumberOfBytes >> +) >> +{ >> + UINTN i; >> + for (i = 0; i < NumberOfBytes; i++) { >> + Buffer[i] = CspUartGetChar ((UINTN)PcdGet64 (PcdCspSerialBase)); >> + } >> + return i; >> +} >> + >> +/** >> + Polls a serial device to see if there is any data waiting to be read. >> + >> + Polls a serial 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 >> + ) >> +{ >> + return (MmioRead32 ((UINTN)(PcdGet64 (PcdCspSerialBase + CSP_UART_CSR))) & >> + CSP_UART_CSR_REMPTY) ? FALSE : TRUE; >> +} >> + >> +/** >> + >> + 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 >> + ) >> +{ >> + UINT32 Bits; >> + >> + if (Control & (EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | >> + EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE )) { >> + return RETURN_UNSUPPORTED; >> + } >> + >> + Bits = MmioRead32 (PcdGet64 (PcdCspSerialBase) + CSP_UART_MCR); >> + >> + if (Control & EFI_SERIAL_REQUEST_TO_SEND) { >> + Bits |= CSP_UART_MCR_RTS; >> + } else { >> + Bits &= ~CSP_UART_MCR_RTS; >> + } >> + >> + if (Control & EFI_SERIAL_DATA_TERMINAL_READY) { >> + Bits |= CSP_UART_MCR_DTR; >> + } else { >> + Bits &= ~CSP_UART_MCR_DTR; >> + } >> + >> + if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) { >> + Bits |= CSP_UART_MCR_FCM; >> + } else { >> + Bits &= CSP_UART_MCR_FCM; >> + } >> + >> + MmioWrite32 ((PcdGet64 (PcdCspSerialBase) + CSP_UART_MCR), Bits); >> + >> + return RETURN_SUCCESS; >> +} >> + >> +/** >> + >> + 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 >> + ) >> +{ >> + UINT32 ModemStatusReg; >> + UINT32 ModemCtrlReg; >> + UINT32 ChanStatusReg; >> + >> + ModemCtrlReg = MmioRead32 ((UINTN)(PcdGet64 (PcdCspSerialBase) + >> + CSP_UART_MCR)); >> + ModemStatusReg = MmioRead32 ((UINTN)(PcdGet64 (PcdCspSerialBase) + >> + CSP_UART_MSR)); >> + ChanStatusReg = MmioRead32 ((UINTN)(PcdGet64 (PcdCspSerialBase) + >> + CSP_UART_CSR)); >> + >> + *Control = 0; >> + >> + if ((ModemStatusReg & CSP_UART_MSR_CTS) == CSP_UART_MSR_CTS) { >> + *Control |= EFI_SERIAL_CLEAR_TO_SEND; >> + } >> + >> + if ((ModemStatusReg & CSP_UART_MSR_DSR) == CSP_UART_MSR_DSR) { >> + *Control |= EFI_SERIAL_DATA_SET_READY; >> + } >> + >> + if ((ModemStatusReg & CSP_UART_MSR_RI) == CSP_UART_MSR_RI) { >> + *Control |= EFI_SERIAL_RING_INDICATE; >> + } >> + >> + if ((ModemStatusReg & CSP_UART_MSR_DCD) == CSP_UART_MSR_DCD) { >> + *Control |= EFI_SERIAL_CARRIER_DETECT; >> + } >> + >> + if ((ModemCtrlReg & CSP_UART_MCR_RTS) == CSP_UART_MCR_RTS) { >> + *Control |= EFI_SERIAL_REQUEST_TO_SEND; >> + } >> + >> + if ((ModemCtrlReg & CSP_UART_MCR_DTR) == CSP_UART_MCR_DTR) { >> + *Control |= EFI_SERIAL_DATA_TERMINAL_READY; >> + } >> + >> + if ((ChanStatusReg & CSP_UART_CSR_REMPTY) == CSP_UART_CSR_REMPTY) { >> + *Control |= EFI_SERIAL_INPUT_BUFFER_EMPTY; >> + } >> + >> + if ((ChanStatusReg & CSP_UART_CSR_TEMPTY) == CSP_UART_CSR_TEMPTY) { >> + *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY; >> + } >> + >> + if ((ModemCtrlReg & CSP_UART_MCR_FCM) == CSP_UART_MCR_FCM) { >> + *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; >> + } >> + >> + return RETURN_SUCCESS; >> +} >> + >> + >> +/** >> + >> + Initialise the serial port to the specified settings. >> + The serial port is re-configured only if the specified settings >> + are different from the current settings. >> + All unspecified settings will be set to the default values. >> + >> + @param UartBase The base address of the serial device. >> + @param BaudRate The baud rate of the serial device. If the >> + baud rate is not supported, the speed >> will be >> + reduced to the nearest supported one and >> the >> + variable's value will be updated >> accordingly. >> + @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 RETURN_SUCCESS All attributes were set correctly on the >> + serial device. >> + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an >> + unsupported value. >> + >> +**/ >> +RETURN_STATUS >> +EFIAPI >> +CspUartInitializePort ( >> + IN UINTN UartBase, >> + IN OUT UINT64 *BaudRate, >> + IN OUT EFI_PARITY_TYPE *Parity, >> + IN OUT UINT8 *DataBits, >> + IN OUT EFI_STOP_BITS_TYPE *StopBits >> + ) >> +{ >> + UINT32 RegVal = 0; >> + UINT32 BaudDivisor = 0; >> + >> + // Wait for Tx FIFO to empty before initializing >> + if (!(MmioRead32 (UartBase + CSP_UART_CR) & CSP_UART_CR_TXDIS)) { >> + while (!(MmioRead32 (UartBase + CSP_UART_CSR) & CSP_UART_CSR_TEMPTY)) >> + ; >> + } >> + >> + // Disable Tx/Rx before setting baud rate >> + RegVal = MmioRead32 (UartBase + CSP_UART_CR); >> + RegVal |= CSP_UART_CR_TXDIS | CSP_UART_CR_RXDIS; >> + MmioWrite32 ((UartBase + CSP_UART_CR), RegVal); >> + >> + // Set baud rate >> + UINT32 SelClk = MmioRead32 ((UINTN)(PcdGet64 (PcdCspSysRegBase) + >> + CSP_SYSREG_CPU_FREQ)); >> + UINT32 BDiv = 0; >> + >> + if (SelClk < 0x1800000) { >> + BaudDivisor = 1; >> + } else { >> + BaudDivisor = 8; >> + } >> + MmioWrite32 ((UartBase + CSP_UART_BRGR), BaudDivisor); >> + BDiv = (SelClk + ((*BaudRate * BaudDivisor) / 2)) / (*BaudRate * >> BaudDivisor); >> + MmioWrite32 ((UartBase + CSP_UART_BDIV), (BDiv - 1)); >> + >> + // Reset and enable Tx/Rx >> + RegVal = MmioRead32 (UartBase + CSP_UART_CR); >> + RegVal &= ~(CSP_UART_CR_TXDIS | CSP_UART_CR_RXDIS); >> + RegVal |= CSP_UART_CR_TXEN | CSP_UART_CR_TXRES | \ >> + CSP_UART_CR_RXEN | CSP_UART_CR_RXRES;; >> + MmioWrite32 ((UartBase + CSP_UART_CR), RegVal); >> + >> + RegVal = MmioRead32 (UartBase + CSP_UART_MR) & 1; >> + >> + // >> + // Data Bits >> + // >> + switch (*DataBits) { >> + case 0: >> + *DataBits = 8; >> + case 8: >> + RegVal |= CSP_UART_MR_CHRL_8; >> + break; >> + case 7: >> + RegVal |= CSP_UART_MR_CHRL_7; >> + break; >> + case 6: >> + RegVal |= CSP_UART_MR_CHRL_6; >> + break; >> + default: >> + return RETURN_INVALID_PARAMETER; >> + } >> + >> + // >> + // Stop Bits >> + // >> + switch (*StopBits) { >> + case DefaultStopBits: >> + *StopBits = OneStopBit; >> + case OneStopBit: >> + RegVal |= CSP_UART_MR_NBSTOP_1; >> + break; >> + case TwoStopBits: >> + RegVal |= CSP_UART_MR_NBSTOP_2; >> + break; >> + default: >> + return RETURN_INVALID_PARAMETER; >> + } >> + >> + // >> + // Parity >> + // >> + switch (*Parity) { >> + case DefaultParity: >> + *Parity = NoParity; >> + case NoParity: >> + RegVal |= CSP_UART_MR_PAR_NONE; >> + break; >> + case EvenParity: >> + RegVal |= CSP_UART_MR_PAR_EVEN; >> + break; >> + case OddParity: >> + RegVal |= CSP_UART_MR_PAR_ODD; >> + break; >> + case MarkParity: >> + RegVal |= CSP_UART_MR_PAR_MARK; >> + break; >> + case SpaceParity: >> + RegVal |= CSP_UART_MR_PAR_SPACE; >> + break; >> + default: >> + return RETURN_INVALID_PARAMETER; >> + } >> + >> + MmioWrite32 ((UartBase + CSP_UART_MR), RegVal); >> + >> + return RETURN_SUCCESS; >> +} >> + >> +VOID CspUartPutChar (IN UINTN UartBase, IN UINT8 Char) >> +{ >> + while ((MmioRead32 (UartBase + CSP_UART_CSR) & CSP_UART_CSR_TFUL) >> + == CSP_UART_CSR_TFUL) >> + ; >> + MmioWrite8 (UartBase + CSP_UART_FIFO, Char); >> +} >> + >> +UINT8 CspUartGetChar (IN UINTN UartBase) >> +{ >> + while ((MmioRead32 (UartBase + CSP_UART_CSR) & CSP_UART_CSR_REMPTY) >> + == CSP_UART_CSR_REMPTY) >> + ; >> + return MmioRead8 (UartBase + CSP_UART_FIFO); >> +} >> + >> diff --git a/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.inf >> b/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.inf >> new file mode 100644 >> index 0000000..46ea8f9 >> --- /dev/null >> +++ b/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.inf >> @@ -0,0 +1,52 @@ >> +## @file >> +# Serial Port Library for Cadence IP6528 UART. >> +# >> +# Based on: >> +# >> +# Null instance of Serial Port Library with empty functions. >> +# >> +# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> >> +# Copyright (C) 2017 Cadence Design Systems. All rights reserved worldwide. >> +# >> +# This program and the accompanying materials >> +# are licensed and made available under the terms and conditions of the >> BSD License >> +# which 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. >> +# >> +# >> +## >> + >> +[Defines] >> + INF_VERSION = 1.25 >> + BASE_NAME = CspSerialPortLib >> + MODULE_UNI_FILE = CspSerialPortLib.uni >> + FILE_GUID = C456789-8897-411a-91F8-7D7E45837146 >> + MODULE_TYPE = BASE >> + VERSION_STRING = 1.0 >> + LIBRARY_CLASS = SerialPortLib >> + >> +[Sources] >> + CspSerialPortLib.c >> + >> +[Packages] >> + ArmPkg/ArmPkg.dec >> + CadencePkg/CadenceCspPkg.dec >> + EmbeddedPkg/EmbeddedPkg.dec >> + MdePkg/MdePkg.dec >> + >> +[LibraryClasses] >> + DebugLib >> + IoLib >> + BaseLib >> + PcdLib >> + >> +[FixedPcd] >> + gCadenceCspTokenSpaceGuid.PcdCspSerialBase >> + gCadenceCspTokenSpaceGuid.PcdCspSysRegBase >> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate >> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits >> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity >> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits >> + >> diff --git a/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.uni >> b/CadencePkg/Library/CadenceCspSerialPortLib/CspSerialPortLib.uni >> new file mode 100644 >> index >> 0000000000000000000000000000000000000000..60434d42366ee99f53da028381deff21250cfda8 >> GIT binary patch >> literal 1622 >> zcmc(fL2uJQ5QXQA#D7?&7eK88T#z`CGzKi7juJ<OQ{^NjwUj2vP8<5?3*TGE-cW+X >> z1)<2^-PxHpZ{Cda<GyQMb3D)ZIeTMYt+1tC+GBf!Rd-`fCDt6fv!SgyZP<OpHf5jl >> z+;J{!WfeC$>x>u&mVBL^Vw+=W>=WzR$TExCEFs$|G2g&b#)Vz^Oiw^~3eHP=ZZGWB >> z0mK35m5*3)J0@OCF728%!qS7g*ay_gpA@C)Zh6nKY(3*8`z>hVe28NPuYyPi(~^h< >> z@0?uD*Djn59#SAji5VW(cuJQ$;#T-OEV*acC|k8!D5~_)OT49|bglUbL->joJNe%7 >> zsAoCdQ0JW8crVozm`IJ1II(U}#7uYvObWl(?V7%YxIStQIIG)%OX%0uYcb>fd$k2Q >> zg(x*@y_8FxQPop;HhI+}saj9X&8}PG{2iZ%oPO1%Rznjw-NmnW3W(8WPghOThEBZp >> zldU<cwUvMAtBa_<q(5C4?AKdinZkT-Cl78SP_B5woT!rb7Q<)Al&AKNch5d?PSDb! >> zrq&E=Vtt#ii@m}VJ7bNp2ZW%0!Z#4(G4{wQJ59CT9aiBAwZq!?XPu7sYCq>*yi%Xh >> z**RV#&+H6)0;(`lpMAth++|bF3}5*uYwh(GUuFNo`hgoUKV~2AveZ??_PNCg=m}a3 >> znJ48O?CBO}O8-S&&s{b>NA1+qUr(*y1xP6v6VPJ2fRXf)vOUzw;Pa>75na?*u%Pof >> rZ_S-%;RGx(?eP9r|9YLavcIcJGcl$f&C9Uu!=cLlXH^lJHQo9N7Zm#w >> >> literal 0 >> HcmV?d00001 >> >> -- >> 2.2.2 >> _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

