xref: /dflybsd-src/stand/contrib/edk2/MdePkg/Include/Protocol/SerialIo.h (revision 1370a72311f999d5cc5041717aeea26d08ad6923)
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