Root/
Source at commit 2350 created 10 years 5 months ago. By ifabio, remove duplicated define. | |
---|---|
1 | /*␊ |
2 | *Copyright (c) 2000 Apple Computer, Inc. All rights reserved.␊ |
3 | *␊ |
4 | *@APPLE_LICENSE_HEADER_START@␊ |
5 | *␊ |
6 | *The contents of this file constitute Original Code as defined in and␊ |
7 | *are subject to the Apple Public Source License Version 1.1 (the␊ |
8 | *"License"). You may not use this file except in compliance with the␊ |
9 | *License. Please obtain a copy of the License at␊ |
10 | *http://www.apple.com/publicsource and read it before using this file.␊ |
11 | *␊ |
12 | *This Original Code and all software distributed under the License are␊ |
13 | *distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER␊ |
14 | *EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,␊ |
15 | *INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,␊ |
16 | *FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the␊ |
17 | *License for the specific language governing rights and limitations␊ |
18 | *under the License.␊ |
19 | *␊ |
20 | *@APPLE_LICENSE_HEADER_END@␊ |
21 | */␊ |
22 | /*␊ |
23 | * IOSerialStreamSync.h␊ |
24 | *␊ |
25 | * 2000-10-21␉gvdl␉Initial real change to IOKit serial family.␊ |
26 | *␊ |
27 | */␊ |
28 | ␊ |
29 | #ifndef␉_SERIAL_IOSERIALSTREAMSYNC_H␊ |
30 | #define␉_SERIAL_IOSERIALSTREAMSYNC_H␊ |
31 | ␊ |
32 | #include <IOKit/IOService.h>␊ |
33 | ␊ |
34 | #ifdef __LP64__␊ |
35 | ␊ |
36 | #define PD_DATA_MASK 0x03U␊ |
37 | #define PD_DATA_VOID 0x00U␊ |
38 | #define PD_DATA_BYTE 0x01U␊ |
39 | #define PD_DATA_WORD 0x02U␊ |
40 | #define PD_DATA_LONG 0x03U␊ |
41 | ␊ |
42 | #else␊ |
43 | ␊ |
44 | #define PD_DATA_MASK 0x03UL␊ |
45 | #define PD_DATA_VOID 0x00UL␊ |
46 | #define PD_DATA_BYTE 0x01UL␊ |
47 | #define PD_DATA_WORD 0x02UL␊ |
48 | #define PD_DATA_LONG 0x03UL␊ |
49 | ␊ |
50 | #endif␊ |
51 | ␊ |
52 | #define PD_OP(x)␉((x) << 2)␊ |
53 | #define PD_E_MASK␉(~PD_DATA_MASK)␊ |
54 | ␊ |
55 | /* General Command & Status events */␊ |
56 | #define PD_E_EOQ␉␉(PD_DATA_VOID|PD_OP( 0))␉// Always nextEvent on empty queue␊ |
57 | #define PD_E_ACTIVE␉␉(PD_DATA_BYTE|PD_OP( 1))␉// BOOL start/shutdown chip␊ |
58 | ␊ |
59 | /* Queue management events - all units are multiples of characters␊ |
60 | *based on the current character size␊ |
61 | */␊ |
62 | #define PD_E_TXQ_SIZE ␉␉(PD_DATA_LONG|PD_OP( 2))␊ |
63 | #define PD_E_RXQ_SIZE␉␉(PD_DATA_LONG|PD_OP( 3))␊ |
64 | #define PD_E_TXQ_LOW_WATER␉(PD_DATA_LONG|PD_OP( 4))␊ |
65 | #define PD_E_RXQ_LOW_WATER␉(PD_DATA_LONG|PD_OP( 5))␊ |
66 | #define PD_E_TXQ_HIGH_WATER␉(PD_DATA_LONG|PD_OP( 6))␊ |
67 | #define PD_E_RXQ_HIGH_WATER␉(PD_DATA_LONG|PD_OP( 7))␊ |
68 | #define PD_E_TXQ_AVAILABLE␉(PD_DATA_LONG|PD_OP( 8))␊ |
69 | #define PD_E_RXQ_AVAILABLE␉(PD_DATA_LONG|PD_OP( 9))␊ |
70 | #define PD_E_TXQ_FLUSH ␉␉(PD_DATA_VOID|PD_OP(10))␊ |
71 | #define PD_E_RXQ_FLUSH␉␉(PD_DATA_LONG|PD_OP(11))␊ |
72 | ␊ |
73 | /* port & link characteristics - units are half bits */␊ |
74 | #define PD_E_DATA_RATE ␉␉(PD_DATA_LONG|PD_OP(12))␉// raw bits of symbols per second␊ |
75 | #define PD_E_RX_DATA_RATE␉(PD_DATA_LONG|PD_OP(13))␊ |
76 | #define PD_E_DATA_SIZE ␉␉(PD_DATA_LONG|PD_OP(14))␉// raw bits per symbol␊ |
77 | #define PD_E_RX_DATA_SIZE␉(PD_DATA_LONG|PD_OP(15))␊ |
78 | #define PD_E_DATA_INTEGRITY␉(PD_DATA_LONG|PD_OP(16))␉// parity or ECC method␊ |
79 | #define PD_E_RX_DATA_INTEGRITY␉(PD_DATA_LONG|PD_OP(17))␊ |
80 | #define PD_E_EXTERNAL_CLOCK_MODE (PD_DATA_LONG|PD_OP(28))␉// multiplier between clock and data rates␊ |
81 | ␊ |
82 | /* timeout events */␊ |
83 | #define PD_E_DELAY␉␉(PD_DATA_LONG|PD_OP(18))␉// inter-character delay (us)␊ |
84 | #define PD_E_DATA_LATENCY␉(PD_DATA_LONG|PD_OP(19))␉// A dequeueData Latency timeout␊ |
85 | ␉␉␉␉␉␉␉␉// rcs Secondary Timer mainly to fix performance ␊ |
86 | ␉␉␉␉␉␉␉␉// problems with MIDI and IRDA drivers.␊ |
87 | ␉␉␉␉␉␉␉␉// Midi and Irda drivers will issue an IOCTL␊ |
88 | ␉␉␉␉␉␉␉␉// call with this as the selector and␊ |
89 | ␉␉␉␉␉␉␉␉// the Data as the value they want the rate set␊ |
90 | ␉␉␉␉␉␉␉␉// to (Typically 1 for IrDA devices) ␊ |
91 | #define PD_E_FLOW_CONTROL (PD_DATA_LONG|PD_OP(20)) ␉// enable/disable each flow mechanism␊ |
92 | ␊ |
93 | /* I/O events */␊ |
94 | #define PD_E_VALID_DATA ␉(PD_DATA_VOID|PD_OP(21))␉// A valid frame was received␊ |
95 | #define PD_E_VALID_DATA_BYTE ␉(PD_DATA_BYTE|PD_E_VALID_DATA)␊ |
96 | #define PD_E_VALID_DATA_WORD ␉(PD_DATA_WORD|PD_E_VALID_DATA)␊ |
97 | #define PD_E_VALID_DATA_LONG ␉(PD_DATA_LONG|PD_E_VALID_DATA)␊ |
98 | ␊ |
99 | #define PD_E_SPECIAL␉␉(PD_DATA_VOID|PD_OP(22))␉// valid data received with 'special' value␊ |
100 | #define PD_E_SPECIAL_BYTE ␉(PD_DATA_BYTE|PD_E_SPECIAL)␊ |
101 | #define PD_E_SPECIAL_WORD ␉(PD_DATA_WORD|PD_E_SPECIAL)␊ |
102 | #define PD_E_SPECIAL_LONG ␉(PD_DATA_LONG|PD_E_SPECIAL)␊ |
103 | ␊ |
104 | #define PD_E_FRAMING_ERROR ␉(PD_DATA_VOID|PD_OP(23))␉// Failure occured assembling frame␊ |
105 | #define PD_E_FRAMING_BYTE ␉(PD_DATA_BYTE|PD_E_FRAMING_ERROR)␊ |
106 | #define PD_E_FRAMING_WORD ␉(PD_DATA_WORD|PD_E_FRAMING_ERROR)␊ |
107 | #define PD_E_FRAMING_LONG ␉(PD_DATA_LONG|PD_E_FRAMING_ERROR)␊ |
108 | ␊ |
109 | #define PD_E_INTEGRITY_ERROR ␉(PD_DATA_VOID|PD_OP(24))␉// An uncorrectable frame was received␊ |
110 | #define PD_E_INTEGRITY_BYTE ␉(PD_DATA_BYTE|PD_E_INTEGRITY_ERROR)␊ |
111 | #define PD_E_INTEGRITY_WORD ␉(PD_DATA_WORD|PD_E_INTEGRITY_ERROR)␊ |
112 | #define PD_E_INTEGRITY_LONG ␉(PD_DATA_LONG|PD_E_INTEGRITY_ERROR)␊ |
113 | ␊ |
114 | #define PD_E_INTEGRITY_WARNING ␉(PD_DATA_VOID|PD_OP(25))␉// A correctable frame was received␊ |
115 | #define PD_E_HW_OVERRUN_ERROR ␉(PD_DATA_VOID|PD_OP(26))␉// Hardware's buffer overflowed, data lost␊ |
116 | #define PD_E_SW_OVERRUN_ERROR ␉(PD_DATA_VOID|PD_OP(27))␉// Driver's buffer overflowed, data lost␊ |
117 | ␊ |
118 | /*␊ |
119 | *The variables below make up the bits returned␊ |
120 | *by the State methods:- getState, setState, watchState␊ |
121 | */␊ |
122 | #define PD_S_MASK␉␉0xffff0000UL␊ |
123 | #define PD_S_RX_OFFSET␉␉7␊ |
124 | ␊ |
125 | #define PD_S_ACQUIRED␉␉0x80000000UL␊ |
126 | #define PD_S_ACTIVE␉␉0x40000000UL␊ |
127 | ␊ |
128 | #define PD_S_TX_ENABLE␉␉0x20000000UL␊ |
129 | #define PD_S_TX_BUSY␉␉0x10000000UL␊ |
130 | #define PD_S_TX_EVENT ␉␉0x08000000UL␊ |
131 | #define PD_S_TXQ_EMPTY ␉␉0x04000000UL␊ |
132 | #define PD_S_TXQ_LOW_WATER ␉0x02000000UL␊ |
133 | #define PD_S_TXQ_HIGH_WATER ␉0x01000000UL␊ |
134 | #define PD_S_TXQ_FULL ␉␉0x00800000UL␊ |
135 | #define PD_S_TXQ_MASK␉␉( PD_S_TXQ_EMPTY | PD_S_TXQ_LOW_WATER \␊ |
136 | | PD_S_TXQ_FULL | PD_S_TXQ_HIGH_WATER )␊ |
137 | ␊ |
138 | #define PD_S_RX_ENABLE␉␉(PD_S_TX_ENABLE >> PD_S_RX_OFFSET)␊ |
139 | #define PD_S_RX_BUSY␉␉(PD_S_TX_BUSY >> PD_S_RX_OFFSET)␊ |
140 | #define PD_S_RX_EVENT␉␉(PD_S_TX_EVENT >> PD_S_RX_OFFSET)␊ |
141 | #define PD_S_RXQ_EMPTY ␉␉(PD_S_TXQ_EMPTY >> PD_S_RX_OFFSET)␊ |
142 | #define PD_S_RXQ_LOW_WATER␉(PD_S_TXQ_LOW_WATER >> PD_S_RX_OFFSET)␊ |
143 | #define PD_S_RXQ_HIGH_WATER␉(PD_S_TXQ_HIGH_WATER >> PD_S_RX_OFFSET)␊ |
144 | #define PD_S_RXQ_FULL ␉␉(PD_S_TXQ_FULL >> PD_S_RX_OFFSET)␊ |
145 | #define PD_S_RXQ_MASK␉␉(PD_S_TXQ_MASK >> PD_S_RX_OFFSET)␊ |
146 | ␊ |
147 | class IOSerialDriverSync;␊ |
148 | class IOSerialStreamSync : public IOService␊ |
149 | {␊ |
150 | OSDeclareDefaultStructors(IOSerialStreamSync);␊ |
151 | ␊ |
152 | protected:␊ |
153 | IOSerialDriverSync *fProvider;␊ |
154 | void *fRefCon;␊ |
155 | ␊ |
156 | public:␊ |
157 | /* acquire tests and sets the state of the port object. If the port was␊ |
158 | *available, then the state is set to busy, and kIOReturnSuccess is returned.␊ |
159 | *If the port was already busy and sleep is YES, then the thread will sleep␊ |
160 | *until the port is freed, then re-attempts the acquire. If the port was␊ |
161 | *already busy and sleep in NO, then kIOReturnExclusiveAccess is returned.␊ |
162 | */ ␊ |
163 | virtual IOReturn acquirePort(bool sleep);␊ |
164 | ␊ |
165 | /* release sets the state of the port object to available and wakes up any␊ |
166 | *threads sleeping for access to this port. It will return kIOReturnSuccess␊ |
167 | *if the port was in a busy state, and kIOReturnNotOpen if it was available.␊ |
168 | */␊ |
169 | virtual IOReturn releasePort();␊ |
170 | ␊ |
171 | /*␊ |
172 | *Set the state for the port device.␊ |
173 | */␊ |
174 | virtual IOReturn setState(UInt32 state, UInt32 mask);␊ |
175 | ␊ |
176 | /*␊ |
177 | *Get the state for the port device.␊ |
178 | */␊ |
179 | virtual UInt32 getState();␊ |
180 | ␊ |
181 | /*␊ |
182 | *Wait for the at least one of the state bits defined in mask to be equal␊ |
183 | *to the value defined in state.␊ |
184 | *Check on entry then sleep until necessary.␊ |
185 | */␊ |
186 | virtual IOReturn watchState(UInt32 *state, UInt32 mask);␊ |
187 | ␊ |
188 | /* nextEvent returns the type of the next event on the RX queue. If no␊ |
189 | *events are present on the RX queue, then EOQ is returned.␊ |
190 | */␊ |
191 | virtual UInt32 nextEvent();␊ |
192 | ␊ |
193 | /* executeEvent causes the specified event to be processed immediately.␊ |
194 | *This is primarily used for channel control commands like START & STOP␊ |
195 | */␊ |
196 | virtual IOReturn executeEvent(UInt32 event, UInt32 data);␊ |
197 | ␊ |
198 | /* requestEvent processes the specified event as an immediate request and␊ |
199 | *returns the results in data. This is primarily used for getting link␊ |
200 | *status information and verifying baud rate and such.␊ |
201 | */␊ |
202 | virtual IOReturn requestEvent(UInt32 event, UInt32 *data);␊ |
203 | ␊ |
204 | /* enqueueEvent will place the specified event into the TX queue. The␊ |
205 | *sleep argument allows the caller to specify the enqueueEvent's␊ |
206 | *behaviour when the TX queue is full. If sleep is true, then this␊ |
207 | *method will sleep until the event is enqueued. If sleep is false,␊ |
208 | *then enqueueEvent will immediatly return kIOReturnNoResources.␊ |
209 | */␊ |
210 | virtual IOReturn enqueueEvent(UInt32 event, UInt32 data, bool sleep);␊ |
211 | ␊ |
212 | /* dequeueEvent will remove the oldest event from the RX queue and return␊ |
213 | *it in event & data. The sleep argument defines the behaviour if the RX␊ |
214 | *queue is empty. If sleep is true, then this method will sleep until an␊ |
215 | *event is available. If sleep is false, then an EOQ event will be␊ |
216 | *returned. In either case kIOReturnSuccess is returned.␊ |
217 | */␊ |
218 | virtual IOReturn dequeueEvent(UInt32 *event, UInt32 *data, bool sleep);␊ |
219 | ␊ |
220 | /* enqueueData will attempt to copy data from the specified buffer to the␊ |
221 | *TX queue as a sequence of VALID_DATA events. The argument bufferSize␊ |
222 | *specifies the number of bytes to be sent. The actual number of bytes␊ |
223 | *transferred is returned in transferCount. If sleep is true, then this␊ |
224 | *method will sleep until all bytes can be transferred. If sleep is␊ |
225 | *false, then as many bytes as possible will be copied to the TX queue.␊ |
226 | */␊ |
227 | virtual IOReturn enqueueData(UInt8 *buffer, UInt32 size, UInt32 *count, bool sleep );␊ |
228 | ␊ |
229 | /* dequeueData will attempt to copy data from the RX queue to the specified␊ |
230 | *buffer. No more than bufferSize VALID_DATA events will be transferred.␊ |
231 | *In other words, copying will continue until either a non-data event is␊ |
232 | *encountered or the transfer buffer is full. The actual number of bytes␊ |
233 | *transferred is returned in transferCount.␊ |
234 | *␊ |
235 | *The sleep semantics of this method are slightly more complicated than␊ |
236 | *other methods in this API: Basically, this method will continue to␊ |
237 | *sleep until either minCount characters have been received or a non␊ |
238 | *data event is next in the RX queue. If minCount is zero, then this␊ |
239 | *method never sleeps and will return immediatly if the queue is empty.␊ |
240 | *␊ |
241 | *The latency parameter specifies the maximum amount of time that should␊ |
242 | *pass after the first character is available before the routine returns.␊ |
243 | *This allows the caller to specify a 'packet' timeout. The unit of the␊ |
244 | *latency parameter is microseconds, though the exact delay may vary␊ |
245 | *depending on the granularity of the timeout services available to the␊ |
246 | *driver.␊ |
247 | */␊ |
248 | virtual IOReturn dequeueData(UInt8 *buffer, UInt32 size, UInt32 *count, UInt32 min);␊ |
249 | ␊ |
250 | /*␉Internal for IOSerialDriver only */␊ |
251 | virtual bool init(OSDictionary *dictionary = 0, void *refCon = 0);␊ |
252 | virtual bool attach(IOService *provider);␊ |
253 | void *getRefCon() const { return fRefCon; }␊ |
254 | ␊ |
255 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 0);␊ |
256 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 1);␊ |
257 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 2);␊ |
258 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 3);␊ |
259 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 4);␊ |
260 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 5);␊ |
261 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 6);␊ |
262 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 7);␊ |
263 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 8);␊ |
264 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 9);␊ |
265 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 10);␊ |
266 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 11);␊ |
267 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 12);␊ |
268 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 13);␊ |
269 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 14);␊ |
270 | OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 15);␊ |
271 | };␊ |
272 | ␊ |
273 | #endif /* !_SERIAL_IOSERIALSTREAMSYNC_H */␊ |
274 | ␊ |
275 | ␊ |
276 |