Root/
Source at commit 1580 created 12 years 9 months ago. By blackosx, Attempted to enable 'exclusive' choices in auto generated boot options, but it's not working at present. I've added notes to remind me to look again at some point. | |
---|---|
1 | /*␊ |
2 | * Copyright (c) 1998-2009 Apple Inc. All rights reserved.␊ |
3 | *␊ |
4 | * @APPLE_LICENSE_HEADER_START@␊ |
5 | * ␊ |
6 | * This file contains Original Code and/or Modifications of Original Code␊ |
7 | * as defined in and that are subject to the Apple Public Source License␊ |
8 | * Version 2.0 (the 'License'). You may not use this file except in␊ |
9 | * compliance with the License. Please obtain a copy of the License at␊ |
10 | * http://www.opensource.apple.com/apsl/ and read it before using this␊ |
11 | * file.␊ |
12 | * ␊ |
13 | * The Original Code and all software distributed under the License are␊ |
14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER␊ |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,␊ |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,␊ |
17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.␊ |
18 | * Please see the License for the specific language governing rights and␊ |
19 | * limitations under the License.␊ |
20 | * ␊ |
21 | * @APPLE_LICENSE_HEADER_END@␊ |
22 | */␊ |
23 | ␊ |
24 | #ifndef␉_IOCDTYPES_H␊ |
25 | #define␉_IOCDTYPES_H␊ |
26 | ␊ |
27 | #include <IOKit/IOTypes.h>␊ |
28 | #include <libkern/OSByteOrder.h>␊ |
29 | ␊ |
30 | #pragma pack(push, 1) /* (enable 8-bit struct packing) */␊ |
31 | ␊ |
32 | /*␊ |
33 | * Minutes, Seconds, Frames (M:S:F)␊ |
34 | *␊ |
35 | * All M:S:F values passed across I/O Kit APIs are guaranteed to be␊ |
36 | * binary-encoded numbers (no BCD-encoded numbers are ever passed).␊ |
37 | */␊ |
38 | ␊ |
39 | typedef struct␊ |
40 | {␊ |
41 | UInt8 minute;␊ |
42 | UInt8 second;␊ |
43 | UInt8 frame;␊ |
44 | } CDMSF;␊ |
45 | ␊ |
46 | /*␊ |
47 | * Media Catalogue Numbers (MCN), International Standard Recording Codes (ISRC)␊ |
48 | *␊ |
49 | * All MCN and ISRC values passed across I/O Kit APIs are guaranteed␊ |
50 | * to have a zero-terminating byte, for convenient use as C strings.␊ |
51 | */␊ |
52 | ␊ |
53 | #define kCDMCNMaxLength 13␊ |
54 | #define kCDISRCMaxLength 12␊ |
55 | ␊ |
56 | typedef char CDMCN [kCDMCNMaxLength + 1];␊ |
57 | typedef char CDISRC[kCDISRCMaxLength + 1];␊ |
58 | ␊ |
59 | /*␊ |
60 | * Audio Status␊ |
61 | *␊ |
62 | * All CDAudioStatus fields passed across I/O Kit APIs are guaranteed to␊ |
63 | * be binary-encoded numbers (no BCD-encoded numbers are ever passed).␊ |
64 | */␊ |
65 | ␊ |
66 | #define kCDAudioStatusUnsupported 0x00␊ |
67 | #define kCDAudioStatusActive 0x11␊ |
68 | #define kCDAudioStatusPaused 0x12␊ |
69 | #define kCDAudioStatusSuccess 0x13␊ |
70 | #define kCDAudioStatusFailure 0x14␊ |
71 | #define kCDAudioStatusNone 0x15␊ |
72 | ␊ |
73 | typedef struct␊ |
74 | {␊ |
75 | UInt8 status;␊ |
76 | struct␊ |
77 | {␊ |
78 | CDMSF time;␊ |
79 | struct␊ |
80 | {␊ |
81 | UInt8 index;␊ |
82 | UInt8 number;␊ |
83 | CDMSF time;␊ |
84 | } track;␊ |
85 | } position;␊ |
86 | } CDAudioStatus;␊ |
87 | ␊ |
88 | /*␊ |
89 | * Table Of Contents␊ |
90 | *␊ |
91 | * All CDTOC fields passed across I/O Kit APIs are guaranteed to be␊ |
92 | * binary-encoded numbers (no BCD-encoded numbers are ever passed).␊ |
93 | */␊ |
94 | ␊ |
95 | typedef struct␊ |
96 | {␊ |
97 | UInt8 session;␊ |
98 | #ifdef __LITTLE_ENDIAN__␊ |
99 | UInt8 control:4, adr:4;␊ |
100 | #else /* !__LITTLE_ENDIAN__ */␊ |
101 | UInt8 adr:4, control:4;␊ |
102 | #endif /* !__LITTLE_ENDIAN__ */␊ |
103 | UInt8 tno;␊ |
104 | UInt8 point;␊ |
105 | CDMSF address;␊ |
106 | UInt8 zero;␊ |
107 | CDMSF p;␊ |
108 | } CDTOCDescriptor;␊ |
109 | ␊ |
110 | typedef struct␊ |
111 | {␊ |
112 | UInt16 length;␊ |
113 | UInt8 sessionFirst;␊ |
114 | UInt8 sessionLast;␊ |
115 | CDTOCDescriptor descriptors[0];␊ |
116 | } CDTOC;␊ |
117 | ␊ |
118 | /*␊ |
119 | * Table Of Contents Descriptor Count Convenience Function␊ |
120 | */␊ |
121 | ␊ |
122 | static inline UInt32 CDTOCGetDescriptorCount(CDTOC * toc)␊ |
123 | {␊ |
124 | UInt32 tocSize = OSSwapBigToHostInt16(toc->length) + (UInt32) sizeof(toc->length);␊ |
125 | ␊ |
126 | return (tocSize < (UInt32) sizeof(CDTOC)) ? 0 : ␊ |
127 | (tocSize - (UInt32) sizeof(CDTOC)) / (UInt32) sizeof(CDTOCDescriptor);␊ |
128 | }␊ |
129 | ␊ |
130 | /*␊ |
131 | * M:S:F To LBA Convenience Function␊ |
132 | */␊ |
133 | ␊ |
134 | static inline UInt32 CDConvertMSFToLBA(CDMSF msf)␊ |
135 | {␊ |
136 | return (((msf.minute * 60U) + msf.second) * 75U) + msf.frame - 150U;␊ |
137 | }␊ |
138 | ␊ |
139 | /*␊ |
140 | * M:S:F To Clipped LBA Convenience Function␊ |
141 | */␊ |
142 | ␊ |
143 | static inline UInt32 CDConvertMSFToClippedLBA(CDMSF msf)␊ |
144 | {␊ |
145 | return (msf.minute == 0 && msf.second <= 1) ? 0 : CDConvertMSFToLBA(msf);␊ |
146 | }␊ |
147 | ␊ |
148 | /*␊ |
149 | * LBA To M:S:F Convenience Function␊ |
150 | */␊ |
151 | ␊ |
152 | static inline CDMSF CDConvertLBAToMSF(UInt32 lba)␊ |
153 | {␊ |
154 | CDMSF msf;␊ |
155 | ␊ |
156 | lba += 150;␊ |
157 | msf.minute = (lba / (75 * 60));␊ |
158 | msf.second = (lba % (75 * 60)) / 75;␊ |
159 | msf.frame = (lba % (75 ));␊ |
160 | ␊ |
161 | return msf;␊ |
162 | }␊ |
163 | ␊ |
164 | /*␊ |
165 | * Track Number To M:S:F Convenience Function␊ |
166 | *␊ |
167 | * The CDTOC structure is assumed to be complete, that is, none of␊ |
168 | * the descriptors are missing or clipped due to an insufficiently␊ |
169 | * sized buffer holding the CDTOC contents.␊ |
170 | */␊ |
171 | ␊ |
172 | static inline CDMSF CDConvertTrackNumberToMSF(UInt8 track, CDTOC * toc)␊ |
173 | {␊ |
174 | UInt32 count = CDTOCGetDescriptorCount(toc);␊ |
175 | UInt32 i;␊ |
176 | CDMSF msf = { 0xFF, 0xFF, 0xFF };␊ |
177 | ␊ |
178 | for (i = 0; i < count; i++)␊ |
179 | {␊ |
180 | if (toc->descriptors[i].point == track && toc->descriptors[i].adr == 1)␊ |
181 | {␊ |
182 | msf = toc->descriptors[i].p;␊ |
183 | break;␊ |
184 | }␊ |
185 | }␊ |
186 | ␊ |
187 | return msf;␊ |
188 | }␊ |
189 | ␊ |
190 | /*␊ |
191 | * Sector Areas, Sector Types␊ |
192 | *␊ |
193 | * Bytes Per Type CDDA Mode1 Mode2 Mode2Form1 Mode2Form2␊ |
194 | * Per Area +----------+----------+----------+----------+----------+␊ |
195 | * Sync | 0 | 12 | 12 | 12 | 12 |␊ |
196 | * Header | 0 | 4 | 4 | 4 | 4 |␊ |
197 | * SubHeader | 0 | 0 | 0 | 8 | 8 |␊ |
198 | * User | 2352 | 2048 | 2336 | 2048 | 2328 |␊ |
199 | * Auxiliary | 0 | 288 | 0 | 280 | 0 |␊ |
200 | * ErrorFlags | 294 | 294 | 294 | 294 | 294 |␊ |
201 | * SubChannel | 96 | 96 | 96 | 96 | 96 |␊ |
202 | * SubChannelQ | 16 | 16 | 16 | 16 | 16 |␊ |
203 | * +----------+----------+----------+----------+----------+␊ |
204 | */␊ |
205 | ␊ |
206 | typedef enum␊ |
207 | {␊ |
208 | kCDSectorAreaSync = 0x80,␊ |
209 | kCDSectorAreaHeader = 0x20,␊ |
210 | kCDSectorAreaSubHeader = 0x40,␊ |
211 | kCDSectorAreaUser = 0x10,␊ |
212 | kCDSectorAreaAuxiliary = 0x08,␊ |
213 | kCDSectorAreaErrorFlags = 0x02,␊ |
214 | kCDSectorAreaSubChannel = 0x01,␊ |
215 | kCDSectorAreaSubChannelQ = 0x04␊ |
216 | } CDSectorArea;␊ |
217 | ␊ |
218 | typedef enum␊ |
219 | {␊ |
220 | kCDSectorTypeUnknown = 0x00,␊ |
221 | kCDSectorTypeCDDA = 0x01,␊ |
222 | kCDSectorTypeMode1 = 0x02,␊ |
223 | kCDSectorTypeMode2 = 0x03,␊ |
224 | kCDSectorTypeMode2Form1 = 0x04,␊ |
225 | kCDSectorTypeMode2Form2 = 0x05,␊ |
226 | kCDSectorTypeCount = 0x06␊ |
227 | } CDSectorType;␊ |
228 | ␊ |
229 | typedef enum␊ |
230 | {␊ |
231 | kCDSectorSizeCDDA = 2352,␊ |
232 | kCDSectorSizeMode1 = 2048,␊ |
233 | kCDSectorSizeMode2 = 2336,␊ |
234 | kCDSectorSizeMode2Form1 = 2048,␊ |
235 | kCDSectorSizeMode2Form2 = 2328,␊ |
236 | kCDSectorSizeWhole = 2352␊ |
237 | } CDSectorSize;␊ |
238 | ␊ |
239 | /*␊ |
240 | * Media Types␊ |
241 | */␊ |
242 | ␊ |
243 | typedef enum␊ |
244 | {␊ |
245 | kCDMediaTypeUnknown = 0x0100,␊ |
246 | kCDMediaTypeROM = 0x0102, /* CD-ROM */␊ |
247 | kCDMediaTypeR = 0x0104, /* CD-R */␊ |
248 | kCDMediaTypeRW = 0x0105, /* CD-RW */␊ |
249 | ␊ |
250 | kCDMediaTypeMin = 0x0100,␊ |
251 | kCDMediaTypeMax = 0x01FF␊ |
252 | };␊ |
253 | ␊ |
254 | typedef UInt32 CDMediaType;␊ |
255 | ␊ |
256 | /*␊ |
257 | * Media Speed (kB/s)␊ |
258 | */␊ |
259 | ␊ |
260 | #define kCDSpeedMin 0x00B0␊ |
261 | #define kCDSpeedMax 0xFFFF␊ |
262 | ␊ |
263 | /*␊ |
264 | * MMC Formats␊ |
265 | */␊ |
266 | ␊ |
267 | // Read Table Of Contents Format Types␊ |
268 | typedef UInt8 CDTOCFormat;␊ |
269 | enum␊ |
270 | {␊ |
271 | kCDTOCFormatTOC = 0x02, // CDTOC␊ |
272 | kCDTOCFormatPMA = 0x03, // CDPMA␊ |
273 | kCDTOCFormatATIP = 0x04, // CDATIP␊ |
274 | kCDTOCFormatTEXT = 0x05 // CDTEXT␊ |
275 | };␊ |
276 | ␊ |
277 | // Read Table Of Contents Format 0x03␊ |
278 | struct CDPMADescriptor␊ |
279 | {␊ |
280 | UInt8 reserved;␊ |
281 | #ifdef __LITTLE_ENDIAN__␊ |
282 | UInt8 control:4, adr:4;␊ |
283 | #else /* !__LITTLE_ENDIAN__ */␊ |
284 | UInt8 adr:4, control:4;␊ |
285 | #endif /* !__LITTLE_ENDIAN__ */␊ |
286 | UInt8 tno;␊ |
287 | UInt8 point;␊ |
288 | CDMSF address;␊ |
289 | UInt8 zero;␊ |
290 | CDMSF p;␊ |
291 | };␊ |
292 | typedef struct CDPMADescriptor CDPMADescriptor;␊ |
293 | ␊ |
294 | struct CDPMA␊ |
295 | {␊ |
296 | UInt16 dataLength;␊ |
297 | UInt8 reserved;␊ |
298 | UInt8 reserved2;␊ |
299 | CDPMADescriptor descriptors[0];␊ |
300 | };␊ |
301 | typedef struct CDPMA CDPMA;␊ |
302 | ␊ |
303 | // Read Table Of Contents Format 0x04␊ |
304 | struct CDATIP␊ |
305 | {␊ |
306 | UInt16 dataLength;␊ |
307 | UInt8 reserved[2];␊ |
308 | #ifdef __LITTLE_ENDIAN__␊ |
309 | UInt8 referenceSpeed:3;␊ |
310 | UInt8 reserved3:1;␊ |
311 | UInt8 indicativeTargetWritingPower:3;␊ |
312 | UInt8 reserved2:1;␊ |
313 | ␊ |
314 | UInt8 reserved5:6;␊ |
315 | UInt8 unrestrictedUse:1;␊ |
316 | UInt8 reserved4:1;␊ |
317 | ␊ |
318 | UInt8 a3Valid:1;␊ |
319 | UInt8 a2Valid:1;␊ |
320 | UInt8 a1Valid:1;␊ |
321 | UInt8 discSubType:3;␊ |
322 | UInt8 discType:1;␊ |
323 | UInt8 reserved6:1;␊ |
324 | #else /* !__LITTLE_ENDIAN__ */␊ |
325 | UInt8 reserved2:1;␊ |
326 | UInt8 indicativeTargetWritingPower:3;␊ |
327 | UInt8 reserved3:1;␊ |
328 | UInt8 referenceSpeed:3;␊ |
329 | ␊ |
330 | UInt8 reserved4:1;␊ |
331 | UInt8 unrestrictedUse:1;␊ |
332 | UInt8 reserved5:6;␊ |
333 | ␊ |
334 | UInt8 reserved6:1;␊ |
335 | UInt8 discType:1;␊ |
336 | UInt8 discSubType:3;␊ |
337 | UInt8 a1Valid:1;␊ |
338 | UInt8 a2Valid:1;␊ |
339 | UInt8 a3Valid:1;␊ |
340 | #endif /* !__LITTLE_ENDIAN__ */␊ |
341 | UInt8 reserved7;␊ |
342 | CDMSF startTimeOfLeadIn;␊ |
343 | UInt8 reserved8;␊ |
344 | CDMSF lastPossibleStartTimeOfLeadOut;␊ |
345 | UInt8 reserved9;␊ |
346 | UInt8 a1[3];␊ |
347 | UInt8 reserved10;␊ |
348 | UInt8 a2[3];␊ |
349 | UInt8 reserved11;␊ |
350 | UInt8 a3[3];␊ |
351 | UInt8 reserved12;␊ |
352 | };␊ |
353 | typedef struct CDATIP CDATIP;␊ |
354 | ␊ |
355 | // Read Table Of Contents Format 0x05␊ |
356 | struct CDTEXTDescriptor␊ |
357 | {␊ |
358 | UInt8 packType;␊ |
359 | UInt8 trackNumber;␊ |
360 | UInt8 sequenceNumber;␊ |
361 | #ifdef __LITTLE_ENDIAN__␊ |
362 | UInt8 characterPosition:4;␊ |
363 | UInt8 blockNumber:3;␊ |
364 | UInt8 doubleByteCharacterCode:1;␊ |
365 | #else /* !__LITTLE_ENDIAN__ */␊ |
366 | UInt8 doubleByteCharacterCode:1;␊ |
367 | UInt8 blockNumber:3;␊ |
368 | UInt8 characterPosition:4;␊ |
369 | #endif /* !__LITTLE_ENDIAN__ */␊ |
370 | UInt8 textData[12];␊ |
371 | UInt8 reserved[2];␊ |
372 | };␊ |
373 | typedef struct CDTEXTDescriptor CDTEXTDescriptor;␊ |
374 | ␊ |
375 | struct CDTEXT␊ |
376 | {␊ |
377 | UInt16 dataLength;␊ |
378 | UInt8 reserved;␊ |
379 | UInt8 reserved2;␊ |
380 | CDTEXTDescriptor descriptors[0];␊ |
381 | };␊ |
382 | typedef struct CDTEXT CDTEXT;␊ |
383 | ␊ |
384 | // Read Disc Information Format␊ |
385 | struct CDDiscInfo␊ |
386 | {␊ |
387 | UInt16 dataLength;␊ |
388 | #ifdef __LITTLE_ENDIAN__␊ |
389 | UInt8 discStatus:2;␊ |
390 | UInt8 stateOfLastSession:2;␊ |
391 | UInt8 erasable:1;␊ |
392 | UInt8 reserved:3;␊ |
393 | #else /* !__LITTLE_ENDIAN__ */␊ |
394 | UInt8 reserved:3;␊ |
395 | UInt8 erasable:1;␊ |
396 | UInt8 stateOfLastSession:2;␊ |
397 | UInt8 discStatus:2;␊ |
398 | #endif /* !__LITTLE_ENDIAN__ */␊ |
399 | UInt8 numberOfFirstTrack;␊ |
400 | UInt8 numberOfSessionsLSB;␊ |
401 | UInt8 firstTrackNumberInLastSessionLSB;␊ |
402 | UInt8 lastTrackNumberInLastSessionLSB;␊ |
403 | #ifdef __LITTLE_ENDIAN__␊ |
404 | UInt8 reserved3:5;␊ |
405 | UInt8 unrestrictedUse:1;␊ |
406 | UInt8 discBarCodeValid:1;␊ |
407 | UInt8 discIdentificationValid:1;␊ |
408 | #else /* !__LITTLE_ENDIAN__ */␊ |
409 | UInt8 discIdentificationValid:1;␊ |
410 | UInt8 discBarCodeValid:1;␊ |
411 | UInt8 unrestrictedUse:1;␊ |
412 | UInt8 reserved3:5;␊ |
413 | #endif /* !__LITTLE_ENDIAN__ */␊ |
414 | UInt8 discType;␊ |
415 | UInt8 numberOfSessionsMSB;␊ |
416 | UInt8 firstTrackNumberInLastSessionMSB;␊ |
417 | UInt8 lastTrackNumberInLastSessionMSB;␊ |
418 | UInt32 discIdentification;␊ |
419 | UInt8 reserved7;␊ |
420 | CDMSF lastSessionLeadInStartTime;␊ |
421 | UInt8 reserved8;␊ |
422 | CDMSF lastPossibleStartTimeOfLeadOut;␊ |
423 | UInt8 discBarCode[8];␊ |
424 | UInt8 reserved9;␊ |
425 | UInt8 numberOfOPCTableEntries;␊ |
426 | UInt8 opcTableEntries[0];␊ |
427 | };␊ |
428 | typedef struct CDDiscInfo CDDiscInfo;␊ |
429 | ␊ |
430 | // Read Track Information Address Types␊ |
431 | typedef UInt8 CDTrackInfoAddressType;␊ |
432 | enum␊ |
433 | {␊ |
434 | kCDTrackInfoAddressTypeLBA = 0x00,␊ |
435 | kCDTrackInfoAddressTypeTrackNumber = 0x01,␊ |
436 | kCDTrackInfoAddressTypeSessionNumber = 0x02,␊ |
437 | };␊ |
438 | ␊ |
439 | // Read Track Information Format␊ |
440 | struct CDTrackInfo␊ |
441 | {␊ |
442 | UInt16 dataLength;␊ |
443 | UInt8 trackNumberLSB;␊ |
444 | UInt8 sessionNumberLSB;␊ |
445 | UInt8 reserved;␊ |
446 | #ifdef __LITTLE_ENDIAN__␊ |
447 | UInt8 trackMode:4;␊ |
448 | UInt8 copy:1;␊ |
449 | UInt8 damage:1;␊ |
450 | UInt8 reserved3:2;␊ |
451 | ␊ |
452 | UInt8 dataMode:4;␊ |
453 | UInt8 fixedPacket:1;␊ |
454 | UInt8 packet:1;␊ |
455 | UInt8 blank:1;␊ |
456 | UInt8 reservedTrack:1;␊ |
457 | ␊ |
458 | UInt8 nextWritableAddressValid:1;␊ |
459 | UInt8 lastRecordedAddressValid:1;␊ |
460 | UInt8 reserved5:6;␊ |
461 | #else /* !__LITTLE_ENDIAN__ */␊ |
462 | UInt8 reserved3:2;␊ |
463 | UInt8 damage:1;␊ |
464 | UInt8 copy:1;␊ |
465 | UInt8 trackMode:4;␊ |
466 | ␊ |
467 | UInt8 reservedTrack:1;␊ |
468 | UInt8 blank:1;␊ |
469 | UInt8 packet:1;␊ |
470 | UInt8 fixedPacket:1;␊ |
471 | UInt8 dataMode:4;␊ |
472 | ␊ |
473 | UInt8 reserved5:6;␊ |
474 | UInt8 lastRecordedAddressValid:1;␊ |
475 | UInt8 nextWritableAddressValid:1;␊ |
476 | #endif /* !__LITTLE_ENDIAN__ */␊ |
477 | UInt32 trackStartAddress;␊ |
478 | UInt32 nextWritableAddress;␊ |
479 | UInt32 freeBlocks;␊ |
480 | UInt32 fixedPacketSize;␊ |
481 | UInt32 trackSize;␊ |
482 | UInt32 lastRecordedAddress;␊ |
483 | UInt8 trackNumberMSB;␊ |
484 | UInt8 sessionNumberMSB;␊ |
485 | UInt8 reserved6;␊ |
486 | UInt8 reserved7;␊ |
487 | };␊ |
488 | typedef struct CDTrackInfo CDTrackInfo;␊ |
489 | ␊ |
490 | #pragma pack(pop) /* (reset to default struct packing) */␊ |
491 | ␊ |
492 | #endif /* _IOCDTYPES_H */␊ |
493 |