1*1370a723SSascha Wildner /** @file 2*1370a723SSascha Wildner Serial IO protocol as defined in the UEFI 2.0 specification. 3*1370a723SSascha Wildner 4*1370a723SSascha Wildner Abstraction of a basic serial device. Targeted at 16550 UART, but 5*1370a723SSascha Wildner could be much more generic. 6*1370a723SSascha Wildner 7*1370a723SSascha Wildner Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 8*1370a723SSascha Wildner SPDX-License-Identifier: BSD-2-Clause-Patent 9*1370a723SSascha Wildner 10*1370a723SSascha Wildner **/ 11*1370a723SSascha Wildner 12*1370a723SSascha Wildner #ifndef __SERIAL_IO_PROTOCOL_H__ 13*1370a723SSascha Wildner #define __SERIAL_IO_PROTOCOL_H__ 14*1370a723SSascha Wildner 15*1370a723SSascha Wildner #define EFI_SERIAL_IO_PROTOCOL_GUID \ 16*1370a723SSascha Wildner { \ 17*1370a723SSascha Wildner 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD } \ 18*1370a723SSascha Wildner } 19*1370a723SSascha Wildner 20*1370a723SSascha Wildner #define EFI_SERIAL_TERMINAL_DEVICE_TYPE_GUID \ 21*1370a723SSascha Wildner { \ 22*1370a723SSascha Wildner 0X6AD9A60F, 0X5815, 0X4C7C, { 0X8A, 0X10, 0X50, 0X53, 0XD2, 0XBF, 0X7A, 0X1B } \ 23*1370a723SSascha Wildner } 24*1370a723SSascha Wildner 25*1370a723SSascha Wildner /// 26*1370a723SSascha Wildner /// Protocol GUID defined in EFI1.1. 27*1370a723SSascha Wildner /// 28*1370a723SSascha Wildner #define SERIAL_IO_PROTOCOL EFI_SERIAL_IO_PROTOCOL_GUID 29*1370a723SSascha Wildner 30*1370a723SSascha Wildner typedef struct _EFI_SERIAL_IO_PROTOCOL EFI_SERIAL_IO_PROTOCOL; 31*1370a723SSascha Wildner 32*1370a723SSascha Wildner /// 33*1370a723SSascha Wildner /// Backward-compatible with EFI1.1. 34*1370a723SSascha Wildner /// 35*1370a723SSascha Wildner typedef EFI_SERIAL_IO_PROTOCOL SERIAL_IO_INTERFACE; 36*1370a723SSascha Wildner 37*1370a723SSascha Wildner /// 38*1370a723SSascha Wildner /// Parity type that is computed or checked as each character is transmitted or received. If the 39*1370a723SSascha Wildner /// device does not support parity, the value is the default parity value. 40*1370a723SSascha Wildner /// 41*1370a723SSascha Wildner typedef enum { 42*1370a723SSascha Wildner DefaultParity, 43*1370a723SSascha Wildner NoParity, 44*1370a723SSascha Wildner EvenParity, 45*1370a723SSascha Wildner OddParity, 46*1370a723SSascha Wildner MarkParity, 47*1370a723SSascha Wildner SpaceParity 48*1370a723SSascha Wildner } EFI_PARITY_TYPE; 49*1370a723SSascha Wildner 50*1370a723SSascha Wildner /// 51*1370a723SSascha Wildner /// Stop bits type 52*1370a723SSascha Wildner /// 53*1370a723SSascha Wildner typedef enum { 54*1370a723SSascha Wildner DefaultStopBits, 55*1370a723SSascha Wildner OneStopBit, 56*1370a723SSascha Wildner OneFiveStopBits, 57*1370a723SSascha Wildner TwoStopBits 58*1370a723SSascha Wildner } EFI_STOP_BITS_TYPE; 59*1370a723SSascha Wildner 60*1370a723SSascha Wildner // 61*1370a723SSascha Wildner // define for Control bits, grouped by read only, write only, and read write 62*1370a723SSascha Wildner // 63*1370a723SSascha Wildner // 64*1370a723SSascha Wildner // Read Only 65*1370a723SSascha Wildner // 66*1370a723SSascha Wildner #define EFI_SERIAL_CLEAR_TO_SEND 0x00000010 67*1370a723SSascha Wildner #define EFI_SERIAL_DATA_SET_READY 0x00000020 68*1370a723SSascha Wildner #define EFI_SERIAL_RING_INDICATE 0x00000040 69*1370a723SSascha Wildner #define EFI_SERIAL_CARRIER_DETECT 0x00000080 70*1370a723SSascha Wildner #define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x00000100 71*1370a723SSascha Wildner #define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x00000200 72*1370a723SSascha Wildner 73*1370a723SSascha Wildner // 74*1370a723SSascha Wildner // Write Only 75*1370a723SSascha Wildner // 76*1370a723SSascha Wildner #define EFI_SERIAL_REQUEST_TO_SEND 0x00000002 77*1370a723SSascha Wildner #define EFI_SERIAL_DATA_TERMINAL_READY 0x00000001 78*1370a723SSascha Wildner 79*1370a723SSascha Wildner // 80*1370a723SSascha Wildner // Read Write 81*1370a723SSascha Wildner // 82*1370a723SSascha Wildner #define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x00001000 83*1370a723SSascha Wildner #define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x00002000 84*1370a723SSascha Wildner #define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x00004000 85*1370a723SSascha Wildner 86*1370a723SSascha Wildner // 87*1370a723SSascha Wildner // Serial IO Member Functions 88*1370a723SSascha Wildner // 89*1370a723SSascha Wildner 90*1370a723SSascha Wildner /** 91*1370a723SSascha Wildner Reset the serial device. 92*1370a723SSascha Wildner 93*1370a723SSascha Wildner @param This Protocol instance pointer. 94*1370a723SSascha Wildner 95*1370a723SSascha Wildner @retval EFI_SUCCESS The device was reset. 96*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The serial device could not be reset. 97*1370a723SSascha Wildner 98*1370a723SSascha Wildner **/ 99*1370a723SSascha Wildner typedef 100*1370a723SSascha Wildner EFI_STATUS 101*1370a723SSascha Wildner (EFIAPI *EFI_SERIAL_RESET)( 102*1370a723SSascha Wildner IN EFI_SERIAL_IO_PROTOCOL *This 103*1370a723SSascha Wildner ); 104*1370a723SSascha Wildner 105*1370a723SSascha Wildner /** 106*1370a723SSascha Wildner Sets the baud rate, receive FIFO depth, transmit/receice time out, parity, 107*1370a723SSascha Wildner data bits, and stop bits on a serial device. 108*1370a723SSascha Wildner 109*1370a723SSascha Wildner @param This Protocol instance pointer. 110*1370a723SSascha Wildner @param BaudRate The requested baud rate. A BaudRate value of 0 will use the 111*1370a723SSascha Wildner device's default interface speed. 112*1370a723SSascha Wildner @param ReveiveFifoDepth The requested depth of the FIFO on the receive side of the 113*1370a723SSascha Wildner serial interface. A ReceiveFifoDepth value of 0 will use 114*1370a723SSascha Wildner the device's default FIFO depth. 115*1370a723SSascha Wildner @param Timeout The requested time out for a single character in microseconds. 116*1370a723SSascha Wildner This timeout applies to both the transmit and receive side of the 117*1370a723SSascha Wildner interface. A Timeout value of 0 will use the device's default time 118*1370a723SSascha Wildner out value. 119*1370a723SSascha Wildner @param Parity The type of parity to use on this serial device. A Parity value of 120*1370a723SSascha Wildner DefaultParity will use the device's default parity value. 121*1370a723SSascha Wildner @param DataBits The number of data bits to use on the serial device. A DataBits 122*1370a723SSascha Wildner vaule of 0 will use the device's default data bit setting. 123*1370a723SSascha Wildner @param StopBits The number of stop bits to use on this serial device. A StopBits 124*1370a723SSascha Wildner value of DefaultStopBits will use the device's default number of 125*1370a723SSascha Wildner stop bits. 126*1370a723SSascha Wildner 127*1370a723SSascha Wildner @retval EFI_SUCCESS The device was reset. 128*1370a723SSascha Wildner @retval EFI_INVALID_PARAMETER One or more attributes has an unsupported value. 129*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. 130*1370a723SSascha Wildner 131*1370a723SSascha Wildner **/ 132*1370a723SSascha Wildner typedef 133*1370a723SSascha Wildner EFI_STATUS 134*1370a723SSascha Wildner (EFIAPI *EFI_SERIAL_SET_ATTRIBUTES)( 135*1370a723SSascha Wildner IN EFI_SERIAL_IO_PROTOCOL *This, 136*1370a723SSascha Wildner IN UINT64 BaudRate, 137*1370a723SSascha Wildner IN UINT32 ReceiveFifoDepth, 138*1370a723SSascha Wildner IN UINT32 Timeout, 139*1370a723SSascha Wildner IN EFI_PARITY_TYPE Parity, 140*1370a723SSascha Wildner IN UINT8 DataBits, 141*1370a723SSascha Wildner IN EFI_STOP_BITS_TYPE StopBits 142*1370a723SSascha Wildner ); 143*1370a723SSascha Wildner 144*1370a723SSascha Wildner /** 145*1370a723SSascha Wildner Set the control bits on a serial device 146*1370a723SSascha Wildner 147*1370a723SSascha Wildner @param This Protocol instance pointer. 148*1370a723SSascha Wildner @param Control Set the bits of Control that are settable. 149*1370a723SSascha Wildner 150*1370a723SSascha Wildner @retval EFI_SUCCESS The new control bits were set on the serial device. 151*1370a723SSascha Wildner @retval EFI_UNSUPPORTED The serial device does not support this operation. 152*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. 153*1370a723SSascha Wildner 154*1370a723SSascha Wildner **/ 155*1370a723SSascha Wildner typedef 156*1370a723SSascha Wildner EFI_STATUS 157*1370a723SSascha Wildner (EFIAPI *EFI_SERIAL_SET_CONTROL_BITS)( 158*1370a723SSascha Wildner IN EFI_SERIAL_IO_PROTOCOL *This, 159*1370a723SSascha Wildner IN UINT32 Control 160*1370a723SSascha Wildner ); 161*1370a723SSascha Wildner 162*1370a723SSascha Wildner /** 163*1370a723SSascha Wildner Retrieves the status of thecontrol bits on a serial device 164*1370a723SSascha Wildner 165*1370a723SSascha Wildner @param This Protocol instance pointer. 166*1370a723SSascha Wildner @param Control A pointer to return the current Control signals from the serial device. 167*1370a723SSascha Wildner 168*1370a723SSascha Wildner @retval EFI_SUCCESS The control bits were read from the serial device. 169*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. 170*1370a723SSascha Wildner 171*1370a723SSascha Wildner **/ 172*1370a723SSascha Wildner typedef 173*1370a723SSascha Wildner EFI_STATUS 174*1370a723SSascha Wildner (EFIAPI *EFI_SERIAL_GET_CONTROL_BITS)( 175*1370a723SSascha Wildner IN EFI_SERIAL_IO_PROTOCOL *This, 176*1370a723SSascha Wildner OUT UINT32 *Control 177*1370a723SSascha Wildner ); 178*1370a723SSascha Wildner 179*1370a723SSascha Wildner /** 180*1370a723SSascha Wildner Writes data to a serial device. 181*1370a723SSascha Wildner 182*1370a723SSascha Wildner @param This Protocol instance pointer. 183*1370a723SSascha Wildner @param BufferSize On input, the size of the Buffer. On output, the amount of 184*1370a723SSascha Wildner data actually written. 185*1370a723SSascha Wildner @param Buffer The buffer of data to write 186*1370a723SSascha Wildner 187*1370a723SSascha Wildner @retval EFI_SUCCESS The data was written. 188*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device reported an error. 189*1370a723SSascha Wildner @retval EFI_TIMEOUT The data write was stopped due to a timeout. 190*1370a723SSascha Wildner 191*1370a723SSascha Wildner **/ 192*1370a723SSascha Wildner typedef 193*1370a723SSascha Wildner EFI_STATUS 194*1370a723SSascha Wildner (EFIAPI *EFI_SERIAL_WRITE)( 195*1370a723SSascha Wildner IN EFI_SERIAL_IO_PROTOCOL *This, 196*1370a723SSascha Wildner IN OUT UINTN *BufferSize, 197*1370a723SSascha Wildner IN VOID *Buffer 198*1370a723SSascha Wildner ); 199*1370a723SSascha Wildner 200*1370a723SSascha Wildner /** 201*1370a723SSascha Wildner Writes data to a serial device. 202*1370a723SSascha Wildner 203*1370a723SSascha Wildner @param This Protocol instance pointer. 204*1370a723SSascha Wildner @param BufferSize On input, the size of the Buffer. On output, the amount of 205*1370a723SSascha Wildner data returned in Buffer. 206*1370a723SSascha Wildner @param Buffer The buffer to return the data into. 207*1370a723SSascha Wildner 208*1370a723SSascha Wildner @retval EFI_SUCCESS The data was read. 209*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device reported an error. 210*1370a723SSascha Wildner @retval EFI_TIMEOUT The data write was stopped due to a timeout. 211*1370a723SSascha Wildner 212*1370a723SSascha Wildner **/ 213*1370a723SSascha Wildner typedef 214*1370a723SSascha Wildner EFI_STATUS 215*1370a723SSascha Wildner (EFIAPI *EFI_SERIAL_READ)( 216*1370a723SSascha Wildner IN EFI_SERIAL_IO_PROTOCOL *This, 217*1370a723SSascha Wildner IN OUT UINTN *BufferSize, 218*1370a723SSascha Wildner OUT VOID *Buffer 219*1370a723SSascha Wildner ); 220*1370a723SSascha Wildner 221*1370a723SSascha Wildner /** 222*1370a723SSascha Wildner @par Data Structure Description: 223*1370a723SSascha Wildner The data values in SERIAL_IO_MODE are read-only and are updated by the code 224*1370a723SSascha Wildner that produces the SERIAL_IO_PROTOCOL member functions. 225*1370a723SSascha Wildner 226*1370a723SSascha Wildner @param ControlMask 227*1370a723SSascha Wildner A mask for the Control bits that the device supports. The device 228*1370a723SSascha Wildner must always support the Input Buffer Empty control bit. 229*1370a723SSascha Wildner 230*1370a723SSascha Wildner @param TimeOut 231*1370a723SSascha Wildner If applicable, the number of microseconds to wait before timing out 232*1370a723SSascha Wildner a Read or Write operation. 233*1370a723SSascha Wildner 234*1370a723SSascha Wildner @param BaudRate 235*1370a723SSascha Wildner If applicable, the current baud rate setting of the device; otherwise, 236*1370a723SSascha Wildner baud rate has the value of zero to indicate that device runs at the 237*1370a723SSascha Wildner device's designed speed. 238*1370a723SSascha Wildner 239*1370a723SSascha Wildner @param ReceiveFifoDepth 240*1370a723SSascha Wildner The number of characters the device will buffer on input 241*1370a723SSascha Wildner 242*1370a723SSascha Wildner @param DataBits 243*1370a723SSascha Wildner The number of characters the device will buffer on input 244*1370a723SSascha Wildner 245*1370a723SSascha Wildner @param Parity 246*1370a723SSascha Wildner If applicable, this is the EFI_PARITY_TYPE that is computed or 247*1370a723SSascha Wildner checked as each character is transmitted or reveived. If the device 248*1370a723SSascha Wildner does not support parity the value is the default parity value. 249*1370a723SSascha Wildner 250*1370a723SSascha Wildner @param StopBits 251*1370a723SSascha Wildner If applicable, the EFI_STOP_BITS_TYPE number of stop bits per 252*1370a723SSascha Wildner character. If the device does not support stop bits the value is 253*1370a723SSascha Wildner the default stop bit values. 254*1370a723SSascha Wildner 255*1370a723SSascha Wildner **/ 256*1370a723SSascha Wildner typedef struct { 257*1370a723SSascha Wildner UINT32 ControlMask; 258*1370a723SSascha Wildner 259*1370a723SSascha Wildner // 260*1370a723SSascha Wildner // current Attributes 261*1370a723SSascha Wildner // 262*1370a723SSascha Wildner UINT32 Timeout; 263*1370a723SSascha Wildner UINT64 BaudRate; 264*1370a723SSascha Wildner UINT32 ReceiveFifoDepth; 265*1370a723SSascha Wildner UINT32 DataBits; 266*1370a723SSascha Wildner UINT32 Parity; 267*1370a723SSascha Wildner UINT32 StopBits; 268*1370a723SSascha Wildner } EFI_SERIAL_IO_MODE; 269*1370a723SSascha Wildner 270*1370a723SSascha Wildner #define EFI_SERIAL_IO_PROTOCOL_REVISION 0x00010000 271*1370a723SSascha Wildner #define EFI_SERIAL_IO_PROTOCOL_REVISION1p1 0x00010001 272*1370a723SSascha Wildner #define SERIAL_IO_INTERFACE_REVISION EFI_SERIAL_IO_PROTOCOL_REVISION 273*1370a723SSascha Wildner 274*1370a723SSascha Wildner /// 275*1370a723SSascha Wildner /// The Serial I/O protocol is used to communicate with UART-style serial devices. 276*1370a723SSascha Wildner /// These can be standard UART serial ports in PC-AT systems, serial ports attached 277*1370a723SSascha Wildner /// to a USB interface, or potentially any character-based I/O device. 278*1370a723SSascha Wildner /// 279*1370a723SSascha Wildner struct _EFI_SERIAL_IO_PROTOCOL { 280*1370a723SSascha Wildner /// 281*1370a723SSascha Wildner /// The revision to which the EFI_SERIAL_IO_PROTOCOL adheres. All future revisions 282*1370a723SSascha Wildner /// must be backwards compatible. If a future version is not backwards compatible, 283*1370a723SSascha Wildner /// it is not the same GUID. 284*1370a723SSascha Wildner /// 285*1370a723SSascha Wildner UINT32 Revision; 286*1370a723SSascha Wildner EFI_SERIAL_RESET Reset; 287*1370a723SSascha Wildner EFI_SERIAL_SET_ATTRIBUTES SetAttributes; 288*1370a723SSascha Wildner EFI_SERIAL_SET_CONTROL_BITS SetControl; 289*1370a723SSascha Wildner EFI_SERIAL_GET_CONTROL_BITS GetControl; 290*1370a723SSascha Wildner EFI_SERIAL_WRITE Write; 291*1370a723SSascha Wildner EFI_SERIAL_READ Read; 292*1370a723SSascha Wildner /// 293*1370a723SSascha Wildner /// Pointer to SERIAL_IO_MODE data. 294*1370a723SSascha Wildner /// 295*1370a723SSascha Wildner EFI_SERIAL_IO_MODE *Mode; 296*1370a723SSascha Wildner /// 297*1370a723SSascha Wildner /// Pointer to a GUID identifying the device connected to the serial port. 298*1370a723SSascha Wildner /// This field is NULL when the protocol is installed by the serial port 299*1370a723SSascha Wildner /// driver and may be populated by a platform driver for a serial port 300*1370a723SSascha Wildner /// with a known device attached. The field will remain NULL if there is 301*1370a723SSascha Wildner /// no platform serial device identification information available. 302*1370a723SSascha Wildner /// 303*1370a723SSascha Wildner CONST EFI_GUID *DeviceTypeGuid; // Revision 1.1 304*1370a723SSascha Wildner }; 305*1370a723SSascha Wildner 306*1370a723SSascha Wildner extern EFI_GUID gEfiSerialIoProtocolGuid; 307*1370a723SSascha Wildner extern EFI_GUID gEfiSerialTerminalDeviceTypeGuid; 308*1370a723SSascha Wildner 309*1370a723SSascha Wildner #endif 310