1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
/** @file
* PDM - Pluggable Device Manager, Serial port related interfaces.
*/
/*
* Copyright (C) 2018-2019 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
#ifndef VBOX_INCLUDED_vmm_pdmserialifs_h
#define VBOX_INCLUDED_vmm_pdmserialifs_h
#ifndef RT_WITHOUT_PRAGMA_ONCE
# pragma once
#endif
#include <VBox/types.h>
RT_C_DECLS_BEGIN
/** @defgroup grp_pdm_ifs_serial PDM Serial Port Interfaces
* @ingroup grp_pdm_interfaces
* @{
*/
/** @name Bit mask definitions for status line type.
* @{ */
#define PDMISERIALPORT_STS_LINE_DCD RT_BIT(0)
#define PDMISERIALPORT_STS_LINE_RI RT_BIT(1)
#define PDMISERIALPORT_STS_LINE_DSR RT_BIT(2)
#define PDMISERIALPORT_STS_LINE_CTS RT_BIT(3)
/** @} */
/** Pointer to a serial port interface. */
typedef struct PDMISERIALPORT *PPDMISERIALPORT;
/**
* Serial port interface (down).
*/
typedef struct PDMISERIALPORT
{
/**
* Notifies the upper device/driver that data is available for reading.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param cbAvail The amount of data available to be written.
*/
DECLR3CALLBACKMEMBER(int, pfnDataAvailRdrNotify, (PPDMISERIALPORT pInterface, size_t cbAvail));
/**
* Notifies the upper device/driver that all data was sent.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
*/
DECLR3CALLBACKMEMBER(int, pfnDataSentNotify, (PPDMISERIALPORT pInterface));
/**
* Try to read data from the device/driver above for writing.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param pvBuf Where to store the read data.
* @param cbRead How much to read.
* @param pcbRead Where to store the amount of data actually read on success.
*/
DECLR3CALLBACKMEMBER(int, pfnReadWr, (PPDMISERIALPORT pInterface, void *pvBuf, size_t cbRead, size_t *pcbRead));
/**
* Notify the device/driver when the status lines changed.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param fNewStatusLines New state of the status line pins.
* @thread Any thread.
*/
DECLR3CALLBACKMEMBER(int, pfnNotifyStsLinesChanged, (PPDMISERIALPORT pInterface, uint32_t fNewStatusLines));
/**
* Notify the device/driver that a break condition occurred.
*
* @returns VBox statsus code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @thread Any thread.
*/
DECLR3CALLBACKMEMBER(int, pfnNotifyBrk, (PPDMISERIALPORT pInterface));
} PDMISERIALPORT;
/** PDMISERIALPORT interface ID. */
#define PDMISERIALPORT_IID "44540323-06ca-44c1-8eb2-f5a387704dbd"
/**
* Supported parity modes.
*/
typedef enum PDMSERIALPARITY
{
/** Invalid parity setting. */
PDMSERIALPARITY_INVALID = 0,
/** No parity. */
PDMSERIALPARITY_NONE,
/** Even parity. */
PDMSERIALPARITY_EVEN,
/** Odd parity. */
PDMSERIALPARITY_ODD,
/** Mark parity. */
PDMSERIALPARITY_MARK,
/** Space parity. */
PDMSERIALPARITY_SPACE,
/** 32bit hack. */
PDMSERIALPARITY_32BIT_HACK = 0x7fffffff
} PDMSERIALPARITY;
/**
* Supported number of stop bits.
*/
typedef enum PDMSERIALSTOPBITS
{
/** Invalid stop bits setting. */
PDMSERIALSTOPBITS_INVALID = 0,
/** One stop bit is used. */
PDMSERIALSTOPBITS_ONE,
/** 1.5 stop bits are used. */
PDMSERIALSTOPBITS_ONEPOINTFIVE,
/** 2 stop bits are used. */
PDMSERIALSTOPBITS_TWO,
/** 32bit hack. */
PDMSERIALSTOPBITS_32BIT_HACK = 0x7fffffff
} PDMSERIALSTOPBITS;
/** Pointer to a serial interface. */
typedef struct PDMISERIALCONNECTOR *PPDMISERIALCONNECTOR;
/**
* Serial interface (up).
* Pairs with PDMISERIALPORT.
*/
typedef struct PDMISERIALCONNECTOR
{
/**
* Notifies the lower layer that data is available for writing.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
*/
DECLR3CALLBACKMEMBER(int, pfnDataAvailWrNotify, (PPDMISERIALCONNECTOR pInterface));
/**
* Try to read data from the underyling driver.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param pvBuf Where to store the read data.
* @param cbRead How much to read.
* @param pcbRead Where to store the amount of data actually read on success.
*/
DECLR3CALLBACKMEMBER(int, pfnReadRdr, (PPDMISERIALCONNECTOR pInterface, void *pvBuf, size_t cbRead, size_t *pcbRead));
/**
* Change device parameters.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param uBps Speed of the serial connection. (bits per second)
* @param enmParity Parity method.
* @param cDataBits Number of data bits.
* @param enmStopBits Number of stop bits.
* @thread Any thread.
*/
DECLR3CALLBACKMEMBER(int, pfnChgParams, (PPDMISERIALCONNECTOR pInterface, uint32_t uBps,
PDMSERIALPARITY enmParity, unsigned cDataBits,
PDMSERIALSTOPBITS enmStopBits));
/**
* Set the state of the modem lines.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param fRts Set to true to make the Request to Send line active otherwise to 0.
* @param fDtr Set to true to make the Data Terminal Ready line active otherwise 0.
* @thread Any thread.
*/
DECLR3CALLBACKMEMBER(int, pfnChgModemLines, (PPDMISERIALCONNECTOR pInterface, bool fRts, bool fDtr));
/**
* Changes the TD line into the requested break condition.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param fBrk Set to true to let the device send a break false to put into normal operation.
* @thread Any thread.
*/
DECLR3CALLBACKMEMBER(int, pfnChgBrk, (PPDMISERIALCONNECTOR pInterface, bool fBrk));
/**
* Queries the current state of the status lines.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param pfStsLines Where to store the status line states on success.
*/
DECLR3CALLBACKMEMBER(int, pfnQueryStsLines, (PPDMISERIALCONNECTOR pInterface, uint32_t *pfStsLines));
/**
* Flushes the indicated queues.
*
* @returns VBox status code.
* @param pInterface Pointer to the interface structure containing the called function pointer.
* @param fQueueRecv Flag whether to flush the receive queue.
* @param fQueueXmit Flag whether to flush the transmit queue.
*/
DECLR3CALLBACKMEMBER(int, pfnQueuesFlush, (PPDMISERIALCONNECTOR pInterface, bool fQueueRecv, bool fQueueXmit));
} PDMISERIALCONNECTOR;
/** PDMIMEDIA interface ID. */
#define PDMISERIALCONNECTOR_IID "d024f170-c00d-11e8-b568-0800200c9a66"
/** @} */
RT_C_DECLS_END
#endif /* !VBOX_INCLUDED_vmm_pdmserialifs_h */
|