Home | History | Annotate | Download | only in Drivers
      1 /** @file
      2 *
      3 *  Copyright (c) 2011-2014, ARM Limited. All rights reserved.
      4 *
      5 *  This program and the accompanying materials
      6 *  are licensed and made available under the terms and conditions of the BSD License
      7 *  which accompanies this distribution.  The full text of the license may be found at
      8 *  http://opensource.org/licenses/bsd-license.php
      9 *
     10 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 *
     13 **/
     14 
     15 #ifndef __PL011_UART_H__
     16 #define __PL011_UART_H__
     17 
     18 #include <Uefi.h>
     19 #include <Protocol/SerialIo.h>
     20 
     21 // PL011 Registers
     22 #define UARTDR                    0x000
     23 #define UARTRSR                   0x004
     24 #define UARTECR                   0x004
     25 #define UARTFR                    0x018
     26 #define UARTILPR                  0x020
     27 #define UARTIBRD                  0x024
     28 #define UARTFBRD                  0x028
     29 #define UARTLCR_H                 0x02C
     30 #define UARTCR                    0x030
     31 #define UARTIFLS                  0x034
     32 #define UARTIMSC                  0x038
     33 #define UARTRIS                   0x03C
     34 #define UARTMIS                   0x040
     35 #define UARTICR                   0x044
     36 #define UARTDMACR                 0x048
     37 
     38 #define UARTPID0                  0xFE0
     39 #define UARTPID1                  0xFE4
     40 #define UARTPID2                  0xFE8
     41 #define UARTPID3                  0xFEC
     42 
     43 // Data status bits
     44 #define UART_DATA_ERROR_MASK      0x0F00
     45 
     46 // Status reg bits
     47 #define UART_STATUS_ERROR_MASK    0x0F
     48 
     49 // Flag reg bits
     50 #define PL011_UARTFR_RI           (1 << 8)  // Ring indicator
     51 #define PL011_UARTFR_TXFE         (1 << 7)  // Transmit FIFO empty
     52 #define PL011_UARTFR_RXFF         (1 << 6)  // Receive  FIFO full
     53 #define PL011_UARTFR_TXFF         (1 << 5)  // Transmit FIFO full
     54 #define PL011_UARTFR_RXFE         (1 << 4)  // Receive  FIFO empty
     55 #define PL011_UARTFR_BUSY         (1 << 3)  // UART busy
     56 #define PL011_UARTFR_DCD          (1 << 2)  // Data carrier detect
     57 #define PL011_UARTFR_DSR          (1 << 1)  // Data set ready
     58 #define PL011_UARTFR_CTS          (1 << 0)  // Clear to send
     59 
     60 // Flag reg bits - alternative names
     61 #define UART_TX_EMPTY_FLAG_MASK   PL011_UARTFR_TXFE
     62 #define UART_RX_FULL_FLAG_MASK    PL011_UARTFR_RXFF
     63 #define UART_TX_FULL_FLAG_MASK    PL011_UARTFR_TXFF
     64 #define UART_RX_EMPTY_FLAG_MASK   PL011_UARTFR_RXFE
     65 #define UART_BUSY_FLAG_MASK       PL011_UARTFR_BUSY
     66 
     67 // Control reg bits
     68 #define PL011_UARTCR_CTSEN        (1 << 15) // CTS hardware flow control enable
     69 #define PL011_UARTCR_RTSEN        (1 << 14) // RTS hardware flow control enable
     70 #define PL011_UARTCR_RTS          (1 << 11) // Request to send
     71 #define PL011_UARTCR_DTR          (1 << 10) // Data transmit ready.
     72 #define PL011_UARTCR_RXE          (1 << 9)  // Receive enable
     73 #define PL011_UARTCR_TXE          (1 << 8)  // Transmit enable
     74 #define PL011_UARTCR_LBE          (1 << 7)  // Loopback enable
     75 #define PL011_UARTCR_UARTEN       (1 << 0)  // UART Enable
     76 
     77 // Line Control Register Bits
     78 #define PL011_UARTLCR_H_SPS       (1 << 7)  // Stick parity select
     79 #define PL011_UARTLCR_H_WLEN_8    (3 << 5)
     80 #define PL011_UARTLCR_H_WLEN_7    (2 << 5)
     81 #define PL011_UARTLCR_H_WLEN_6    (1 << 5)
     82 #define PL011_UARTLCR_H_WLEN_5    (0 << 5)
     83 #define PL011_UARTLCR_H_FEN       (1 << 4)  // FIFOs Enable
     84 #define PL011_UARTLCR_H_STP2      (1 << 3)  // Two stop bits select
     85 #define PL011_UARTLCR_H_EPS       (1 << 2)  // Even parity select
     86 #define PL011_UARTLCR_H_PEN       (1 << 1)  // Parity Enable
     87 #define PL011_UARTLCR_H_BRK       (1 << 0)  // Send break
     88 
     89 #define PL011_UARTPID2_VER(X)     (((X) >> 4) & 0xF)
     90 #define PL011_VER_R1P4            0x2
     91 
     92 /*
     93 
     94   Programmed hardware of Serial port.
     95 
     96   @return    Always return EFI_UNSUPPORTED.
     97 
     98 **/
     99 RETURN_STATUS
    100 EFIAPI
    101 PL011UartInitializePort (
    102   IN OUT UINTN               UartBase,
    103   IN OUT UINT64              *BaudRate,
    104   IN OUT UINT32              *ReceiveFifoDepth,
    105   IN OUT EFI_PARITY_TYPE     *Parity,
    106   IN OUT UINT8               *DataBits,
    107   IN OUT EFI_STOP_BITS_TYPE  *StopBits
    108   );
    109 
    110 /**
    111 
    112   Assert or deassert the control signals on a serial port.
    113   The following control signals are set according their bit settings :
    114   . Request to Send
    115   . Data Terminal Ready
    116 
    117   @param[in]  UartBase  UART registers base address
    118   @param[in]  Control   The following bits are taken into account :
    119                         . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the
    120                           "Request To Send" control signal if this bit is
    121                           equal to one/zero.
    122                         . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert
    123                           the "Data Terminal Ready" control signal if this
    124                           bit is equal to one/zero.
    125                         . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : enable/disable
    126                           the hardware loopback if this bit is equal to
    127                           one/zero.
    128                         . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not supported.
    129                         . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/
    130                           disable the hardware flow control based on CTS (Clear
    131                           To Send) and RTS (Ready To Send) control signals.
    132 
    133   @retval  RETURN_SUCCESS      The new control bits were set on the serial device.
    134   @retval  RETURN_UNSUPPORTED  The serial device does not support this operation.
    135 
    136 **/
    137 RETURN_STATUS
    138 EFIAPI
    139 PL011UartSetControl (
    140   IN UINTN   UartBase,
    141   IN UINT32  Control
    142   );
    143 
    144 /**
    145 
    146   Retrieve the status of the control bits on a serial device.
    147 
    148   @param[in]   UartBase  UART registers base address
    149   @param[out]  Control   Status of the control bits on a serial device :
    150 
    151                          . EFI_SERIAL_DATA_CLEAR_TO_SEND, EFI_SERIAL_DATA_SET_READY,
    152                            EFI_SERIAL_RING_INDICATE, EFI_SERIAL_CARRIER_DETECT,
    153                            EFI_SERIAL_REQUEST_TO_SEND, EFI_SERIAL_DATA_TERMINAL_READY
    154                            are all related to the DTE (Data Terminal Equipment) and
    155                            DCE (Data Communication Equipment) modes of operation of
    156                            the serial device.
    157                          . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the receive
    158                            buffer is empty, 0 otherwise.
    159                          . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if the transmit
    160                            buffer is empty, 0 otherwise.
    161                          . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one if the
    162                            hardware loopback is enabled (the ouput feeds the receive
    163                            buffer), 0 otherwise.
    164                          . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one if a
    165                            loopback is accomplished by software, 0 otherwise.
    166                          . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal to one if the
    167                            hardware flow control based on CTS (Clear To Send) and RTS
    168                            (Ready To Send) control signals is enabled, 0 otherwise.
    169 
    170 
    171   @retval RETURN_SUCCESS  The control bits were read from the serial device.
    172 
    173 **/
    174 RETURN_STATUS
    175 EFIAPI
    176 PL011UartGetControl (
    177   IN UINTN     UartBase,
    178   OUT UINT32  *Control
    179   );
    180 
    181 /**
    182   Write data to serial device.
    183 
    184   @param  Buffer           Point of data buffer which need to be written.
    185   @param  NumberOfBytes    Number of output bytes which are cached in Buffer.
    186 
    187   @retval 0                Write data failed.
    188   @retval !0               Actual number of bytes written to serial device.
    189 
    190 **/
    191 UINTN
    192 EFIAPI
    193 PL011UartWrite (
    194   IN  UINTN       UartBase,
    195   IN  UINT8       *Buffer,
    196   IN  UINTN       NumberOfBytes
    197   );
    198 
    199 /**
    200   Read data from serial device and save the data in buffer.
    201 
    202   @param  Buffer           Point of data buffer which need to be written.
    203   @param  NumberOfBytes    Number of output bytes which are cached in Buffer.
    204 
    205   @retval 0                Read data failed.
    206   @retval !0               Actual number of bytes read from serial device.
    207 
    208 **/
    209 UINTN
    210 EFIAPI
    211 PL011UartRead (
    212   IN  UINTN       UartBase,
    213   OUT UINT8       *Buffer,
    214   IN  UINTN       NumberOfBytes
    215   );
    216 
    217 /**
    218   Check to see if any data is available to be read from the debug device.
    219 
    220   @retval EFI_SUCCESS       At least one byte of data is available to be read
    221   @retval EFI_NOT_READY     No data is available to be read
    222   @retval EFI_DEVICE_ERROR  The serial device is not functioning properly
    223 
    224 **/
    225 BOOLEAN
    226 EFIAPI
    227 PL011UartPoll (
    228   IN  UINTN       UartBase
    229   );
    230 
    231 #endif
    232