1 /* @(#)cdrecord.h 1.206 19/10/16 Copyright 1995-2019 J. Schilling */ 2 /* 3 * Definitions for cdrecord 4 * 5 * Copyright (c) 1995-2019 J. Schilling 6 */ 7 /* 8 * The contents of this file are subject to the terms of the 9 * Common Development and Distribution License, Version 1.0 only 10 * (the "License"). You may not use this file except in compliance 11 * with the License. 12 * 13 * See the file CDDL.Schily.txt in this distribution for details. 14 * A copy of the CDDL is also available via the Internet at 15 * http://www.opensource.org/licenses/cddl1.txt 16 * 17 * When distributing Covered Code, include this CDDL HEADER in each 18 * file and include the License file CDDL.Schily.txt from this distribution. 19 */ 20 21 /* 22 * Make sure it is there. We need it for off_t. 23 */ 24 #ifndef _SCHILY_TYPES_H 25 #include <schily/types.h> 26 #endif 27 28 #ifndef _SCHILY_UTYPES_H 29 #include <schily/utypes.h> 30 #endif 31 32 /* 33 * Defines for command line option flags 34 */ 35 #define F_DUMMY 0x00000001L /* Do dummy (simulation) writes */ 36 #define F_TOC 0x00000002L /* Get TOC */ 37 #define F_EJECT 0x00000004L /* Eject disk after doing the work */ 38 #define F_LOAD 0x00000008L /* Load disk only */ 39 #define F_MULTI 0x00000010L /* Create linkable TOC/multi-session */ 40 #define F_MSINFO 0x00000020L /* Get multi-session info */ 41 #define F_FIX 0x00000040L /* Fixate disk only */ 42 #define F_NOFIX 0x00000080L /* Do not fixate disk */ 43 #define F_VERSION 0x00000100L /* Print version info */ 44 #define F_CHECKDRIVE 0x00000200L /* Check for driver */ 45 #define F_INQUIRY 0x00000400L /* Do inquiry */ 46 #define F_PRCAP 0x00000800L /* Print capabilities */ 47 #define F_SCANBUS 0x00001000L /* Scan SCSI Bus */ 48 #define F_RESET 0x00002000L /* Reset SCSI Bus */ 49 #define F_BLANK 0x00004000L /* Blank CD-RW */ 50 #define F_PRATIP 0x00008000L /* Print ATIP info */ 51 #define F_PRDINFO 0x00010000L /* Print disk info (XXX not yet used) */ 52 #define F_IGNSIZE 0x00020000L /* Ignore disk size */ 53 #define F_SAO 0x00040000L /* Session at once */ 54 #define F_RAW 0x00080000L /* Raw mode */ 55 #define F_WRITE 0x00100000L /* Disk is going to be written */ 56 #define F_FORCE 0x00200000L /* Force things (e.g. blank on dead disk) */ 57 #define F_WAITI 0x00400000L /* Wait until data is available on stdin */ 58 #define F_OVERBURN 0x00800000L /* Allow oveburning */ 59 #define F_CLONE 0x01000000L /* Do clone writing */ 60 #define F_STDIN 0x02000000L /* We are using stdin as CD data */ 61 #define F_IMMED 0x04000000L /* Try tu use IMMED SCSI flag if possible */ 62 #define F_DLCK 0x08000000L /* Load disk and lock door */ 63 #define F_SETDROPTS 0x10000000L /* Set driver opts and exit */ 64 #define F_FORMAT 0x20000000L /* Format media */ 65 #define F_ABORT 0x40000000L /* Send abort sequence to drive */ 66 #ifdef PROTOTYPES 67 #define F_MEDIAINFO 0x80000000UL /* Print media info */ 68 #else 69 #define F_MEDIAINFO 0x80000000L /* Print media info */ 70 #endif 71 72 /* 73 * Defines for command extended line option flags2 74 */ 75 #define F2_XX 0x01 /* Not yet */ 76 77 #ifdef min 78 #undef min 79 #endif 80 #define min(a, b) ((a) < (b) ? (a):(b)) 81 82 #ifdef max 83 #undef max 84 #endif 85 #define max(a, b) ((a) < (b) ? (b):(a)) 86 87 #undef roundup 88 #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) 89 90 /* 91 * NOTICE: You should not make CDR_BUF_SIZE more than 92 * the buffer size of the CD-Recorder. 93 * 94 * The Philips CDD 521 is the recorder with the smallest buffer. 95 * It only has 256kB of buffer RAM. 96 * 97 * WARNING: Philips CDD 521 dies if CDR_BUF_SIZE is to big. 98 * If you like to support the CDD 521 keep the old buffer 99 * size at 63kB. 100 */ 101 /*#define CDR_BUF_SIZE (126*1024)*/ 102 #define CDR_BUF_SIZE (63*1024) 103 #define CDR_OLD_BUF_SIZE (63*1024) 104 #define CDR_MAX_BUF_SIZE (256*1024) 105 106 /* 107 * Never set MIN_GRACE_TIME < 3 seconds. We need to give 108 * the volume management a chance to settle before we 109 * start writing. 110 */ 111 #ifndef MIN_GRACE_TIME 112 #define MIN_GRACE_TIME 3 /* 3 seconds */ 113 #endif 114 #ifndef GRACE_TIME 115 #define GRACE_TIME 9 /* 9 seconds */ 116 #endif 117 118 /* 119 * Some sector sizes used for reading/writing ... 120 */ 121 #define DATA_SEC_SIZE 2048 /* 2048 bytes */ 122 #define MODE2_SEC_SIZE 2336 /* 2336 bytes */ 123 #define AUDIO_SEC_SIZE 2352 /* 2352 bytes */ 124 #define RAW16_SEC_SIZE (2352+16) /* 2368 bytes */ 125 #define RAW96_SEC_SIZE (2352+96) /* 2448 bytes */ 126 127 #define MAX_TRACK 99 /* Red Book track limit */ 128 129 #define PAD_SECS 15 /* NOTE: pad must be less than BUF_SIZE */ 130 #define PAD_SIZE (PAD_SECS * DATA_SEC_SIZE) 131 132 /* 133 * FIFO size must be at least 2x CDR_MAX_BUF_SIZE 134 */ 135 #if defined(sun) && defined(mc68000) 136 #define DEFAULT_FIFOSIZE (1L*1024L*1024L) 137 #else 138 #if defined(ultrix) 139 #define DEFAULT_FIFOSIZE (1L*1024L*1024L) 140 #else 141 #define DEFAULT_FIFOSIZE (4L*1024L*1024L) 142 #endif 143 #endif 144 145 146 #if !defined(HAVE_LARGEFILES) && SIZEOF_LLONG > SIZEOF_LONG 147 typedef Llong tsize_t; 148 #else 149 typedef off_t tsize_t; 150 #endif 151 152 #ifdef nono 153 typedef struct tindex { 154 int dummy; /* Not yet implemented */ 155 } tindex_t; 156 #endif 157 158 typedef struct ofile { 159 struct ofile *next; /* Next open file */ 160 int f; /* Open file */ 161 char *filename; /* File name */ 162 int refcnt; /* open reference count */ 163 } ofile_t; 164 165 typedef struct track { 166 void *xfp; /* Open file for this track from xopen()*/ 167 char *filename; /* File name for this track */ 168 169 tsize_t itracksize; /* Size of track bytes (-1 == until EOF)*/ 170 /* This is in units of isecsize */ 171 tsize_t tracksize; /* Size of track bytes (-1 == until EOF)*/ 172 /* This is in units of secsize */ 173 174 long trackstart; /* Start sector # of this track */ 175 long tracksecs; /* Size of this track (sectors) */ 176 long padsecs; /* Pad size for this track (sectors) */ 177 long pregapsize; /* Pre-gap size for this track (sectors)*/ 178 long index0start; /* Index 0 start within this tr(sectors)*/ 179 int isecsize; /* Read input sector size for this track*/ 180 int secsize; /* Sector size for this track (bytes) */ 181 int secspt; /* # of sectors to copy for one transfer*/ 182 int pktsize; /* # of blocks per write packet */ 183 Uchar dataoff; /* offset of user data in raw sector */ 184 Uchar tracks; /* Number of tracks on this disk */ 185 Uchar track; /* Track # as offset in track[] array */ 186 Uchar trackno; /* Track # on disk for this track */ 187 Uchar tracktype; /* Track type (toc type) */ 188 Uchar dbtype; /* Data block type for this track */ 189 int sectype; /* Sector type */ 190 int flags; /* Flags (see below) */ 191 int nindex; /* Number of indices for track */ 192 long *tindex; /* Track index descriptor */ 193 char *isrc; /* ISRC code for this track / disk MCN */ 194 void *text; /* Opaque CD-Text data (txtptr_t *) */ 195 } track_t; 196 197 #define track_base(tp) ((tp) - (tp)->track) 198 199 /* 200 * Defines for tp->flags 201 */ 202 #define TI_AUDIO 0x00001 /* File is an audio track */ 203 #define TI_PREEMP 0x00002 /* Audio track recorded w/preemphasis */ 204 #define TI_MIX 0x00004 /* This is a mixed mode track */ 205 #define TI_RAW 0x00008 /* Write this track in raw mode */ 206 #define TI_PAD 0x00010 /* Pad data track */ 207 #define TI_SWAB 0x00020 /* Swab audio data */ 208 #define TI_ISOSIZE 0x00040 /* Use iso size for track */ 209 #define TI_NOAUHDR 0x00080 /* Don't look for audio header */ 210 #define TI_FIRST 0x00100 /* This is the first track */ 211 #define TI_LAST 0x00200 /* This is the last track */ 212 #define TI_PACKET 0x00400 /* Fixed- or variable-packet track */ 213 #define TI_NOCLOSE 0x00800 /* Don't close the track after writing */ 214 #define TI_TAO 0x01000 /* This track is written in TAO mode */ 215 #define TI_PREGAP 0x02000 /* Prev. track incl. pregap of this tr. */ 216 #define TI_SCMS 0x04000 /* Force to follow the SCMS rules */ 217 #define TI_COPY 0x08000 /* Allow digital copy */ 218 #define TI_SHORT_TRACK 0x10000 /* Ignore min 4 second Red Book std. */ 219 #define TI_RAW16 0x20000 /* This track uses 16 bytes subch. */ 220 #define TI_RAW96R 0x40000 /* This track uses 96 bytes RAW subch. */ 221 #define TI_CLONE 0x80000 /* Special clone treatment needed */ 222 #define TI_TEXT 0x100000 /* This track holds CD-Text information */ 223 #define TI_NOCD 0x200000 /* We are not writing a CD track */ 224 #define TI_SAO 0x400000 /* This track is written in SAO mode */ 225 #define TI_USEINFO 0x800000 /* Use information from *.inf files */ 226 #define TI_QUADRO 0x1000000 /* Four Channel Audio Data */ 227 #define TI_STDIN 0x2000000 /* Track read is from stdin */ 228 #define TI_HIDDEN 0x4000000 /* Track is hidden / has hidden Tr. */ 229 230 231 #define is_audio(tp) (((tp)->flags & TI_AUDIO) != 0) 232 #define is_preemp(tp) (((tp)->flags & TI_PREEMP) != 0) 233 #define is_pad(tp) (((tp)->flags & TI_PAD) != 0) 234 #define is_swab(tp) (((tp)->flags & TI_SWAB) != 0) 235 #define is_first(tp) (((tp)->flags & TI_FIRST) != 0) 236 #define is_last(tp) (((tp)->flags & TI_LAST) != 0) 237 #define is_packet(tp) (((tp)->flags & TI_PACKET) != 0) 238 #define is_noclose(tp) (((tp)->flags & TI_NOCLOSE) != 0) 239 #define is_tao(tp) (((tp)->flags & TI_TAO) != 0) 240 #define is_sao(tp) (((tp)->flags & TI_SAO) != 0) 241 #define is_raw(tp) (((tp)->flags & TI_RAW) != 0) 242 #define is_raw16(tp) (((tp)->flags & TI_RAW16) != 0) 243 #define is_raw96(tp) (((tp)->flags & (TI_RAW|TI_RAW16)) == TI_RAW) 244 #define is_raw96p(tp) (((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == TI_RAW) 245 #define is_raw96r(tp) (((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == (TI_RAW|TI_RAW96R)) 246 #define is_pregap(tp) (((tp)->flags & TI_PREGAP) != 0) 247 #define is_scms(tp) (((tp)->flags & TI_SCMS) != 0) 248 #define is_copy(tp) (((tp)->flags & TI_COPY) != 0) 249 #define is_shorttrk(tp) (((tp)->flags & TI_SHORT_TRACK) != 0) 250 #define is_clone(tp) (((tp)->flags & TI_CLONE) != 0) 251 #define is_text(tp) (((tp)->flags & TI_TEXT) != 0) 252 #define is_quadro(tp) (((tp)->flags & TI_QUADRO) != 0) 253 #define is_hidden(tp) (((tp)->flags & TI_HIDDEN) != 0) 254 255 /* 256 * Defines for toc type / track type 257 */ 258 #define TOC_DA 0 /* CD-DA */ 259 #define TOC_ROM 1 /* CD-ROM */ 260 #define TOC_XA1 2 /* CD_ROM XA with first track in mode 1 */ 261 #define TOC_XA2 3 /* CD_ROM XA with first track in mode 2 */ 262 #define TOC_CDI 4 /* CDI */ 263 264 #define TOC_MASK 7 /* Mask needed for toctname[] */ 265 266 /* 267 * Additional flags in toc type / trackp->tracktype 268 * XXX TOCF_DUMMY istr schon in dp->cdr_cmdflags & F_DUMMY 269 * XXX TOCF_MULTI istr schon in dp->cdr_cmdflags & F_MULTI 270 */ 271 #define TOCF_DUMMY 0x10 /* Write in dummy (simulation) mode */ 272 #define TOCF_MULTI 0x20 /* Multisession (Open Next Programarea) */ 273 274 #define TOCF_MASK 0xF0 /* All possible flags in tracktype */ 275 276 extern char *toc2name[]; /* Convert toc type to name */ 277 extern int toc2sess[]; /* Convert toc type to session format */ 278 279 /* 280 * Defines for sector type 281 * 282 * Mode is 2 bits 283 * Aud is 1 bit 284 * 285 * Sector is: aud << 2 | mode 286 */ 287 #define ST_ROM_MODE1 1 /* CD-ROM in mode 1 (vanilla cdrom) */ 288 #define ST_ROM_MODE2 2 /* CD-ROM in mode 2 */ 289 #define ST_AUDIO_NOPRE 4 /* CD-DA stereo without preemphasis */ 290 #define ST_AUDIO_PRE 5 /* CD-DA stereo with preemphasis */ 291 292 #define ST_PREEMPMASK 0x01 /* Mask for preemphasis bit */ 293 #define ST_AUDIOMASK 0x04 /* Mask for audio bit */ 294 #define ST_MODEMASK 0x03 /* Mask for mode bits in sector type */ 295 #define ST_MASK 0x07 /* Mask needed for sectname[] */ 296 297 /* 298 * There are 6 different generic basic sector types. 299 */ 300 #define ST_MODE_AUDIO 0x00 /* Generic Audio mode */ 301 #define ST_MODE_0 0x10 /* Generic Zero mode */ 302 #define ST_MODE_1 0x20 /* Generic CD-ROM mode (ISO/IEC 10149) */ 303 #define ST_MODE_2 0x30 /* Generic Mode 2 (ISO/IEC 10149) */ 304 #define ST_MODE_2_FORM_1 0x40 /* Generic Mode 2 form 1 */ 305 #define ST_MODE_2_FORM_2 0x50 /* Generic Mode 2 form 2 */ 306 #define ST_MODE_2_MIXED 0x60 /* Generic Mode 2 mixed form (1/2) */ 307 308 #define ST_MODE_MASK 0x70 /* Mask needed to get generic sectype */ 309 310 #define ST_MODE_RAW 0x08 /* Do not touch EDC & subchannels */ 311 #define ST_NOSCRAMBLE 0x80 /* Do not srcamble sectors */ 312 313 #define SECT_AUDIO (ST_AUDIO_NOPRE | ST_MODE_AUDIO) 314 #define SECT_AUDIO_NOPRE (ST_AUDIO_NOPRE | ST_MODE_AUDIO) 315 #define SECT_AUDIO_PRE (ST_AUDIO_PRE | ST_MODE_AUDIO) 316 #define SECT_MODE_0 (ST_ROM_MODE1 | ST_MODE_0) 317 #define SECT_ROM (ST_ROM_MODE1 | ST_MODE_1) 318 #define SECT_MODE_2 (ST_ROM_MODE2 | ST_MODE_2) 319 #define SECT_MODE_2_F1 (ST_ROM_MODE2 | ST_MODE_2_FORM_1) 320 #define SECT_MODE_2_F2 (ST_ROM_MODE2 | ST_MODE_2_FORM_2) 321 #define SECT_MODE_2_MIX (ST_ROM_MODE2 | ST_MODE_2_MIXED) 322 323 extern char *st2name[]; /* Convert sector type to name */ 324 extern int st2mode[]; /* Convert sector type to control nibble*/ 325 326 /* 327 * Control nibble bits: 328 * 329 * 0 with preemphasis (audio) / incremental (data) 330 * 1 digital copy permitted 331 * 2 data (not audio) track 332 * 3 4 channels (not 2) 333 */ 334 #define TM_PREEM 0x1 /* Audio track with preemphasis */ 335 #define TM_INCREMENTAL 0x1 /* Incremental data track */ 336 #define TM_ALLOW_COPY 0x2 /* Digital copy permitted */ 337 #define TM_DATA 0x4 /* This is a data track */ 338 #define TM_QUADRO 0x8 /* Four channel audio */ 339 340 /* 341 * Adr nibble: 342 */ 343 #define ADR_NONE 0 /* Sub-Q mode info not supplied */ 344 #define ADR_POS 1 /* Sub-Q encodes position data */ 345 #define ADR_MCN 2 /* Sub-Q encodes Media Catalog Number */ 346 #define ADR_ISRC 3 /* Sub-Q encodes ISRC */ 347 348 /* 349 * Defines for write type (from SCSI-3/mmc) 350 */ 351 #define WT_PACKET 0x0 /* Packet writing */ 352 #define WT_TAO 0x1 /* Track at once */ 353 #define WT_SAO 0x2 /* Session at once */ 354 #define WT_RAW 0x3 /* Raw */ 355 #define WT_LAYER_JUMP 0x4 /* DVD-R/DL Layer jump */ 356 #define WT_RES_5 0x5 /* Reserved */ 357 #define WT_RES_6 0x6 /* Reserved */ 358 #define WT_RES_7 0x7 /* Reserved */ 359 #define WT_RES_8 0x8 /* Reserved */ 360 #define WT_RES_9 0x9 /* Reserved */ 361 #define WT_RES_A 0xA /* Reserved */ 362 #define WT_RES_B 0xB /* Reserved */ 363 #define WT_RES_C 0xC /* Reserved */ 364 #define WT_RES_D 0xD /* Reserved */ 365 #define WT_RES_E 0xE /* Reserved */ 366 #define WT_RES_F 0xF /* Reserved */ 367 368 /* 369 * Data block layout: 370 * 371 * - Sync pattern 12 Bytes: 0x00 0xFF 0xFF ... 0xFF 0xFF 0x00 372 * - Block header 4 Bytes: | minute | second | frame | mode | 373 * Mode byte: 374 * Bits 7, 6, 5 Run-in/Run-out/Link 375 * Bits 4, 3, 2 Reserved 376 * Bits 1, 0 Mode 377 * - Rest of sector see below. 378 * 379 * Mode 0 Format: 380 * 0 12 Bytes Sync header 381 * 12 4 Bytes Block header with Data mode == 0 382 * 16 2336 Bytes of zero data 383 * 384 * Mode 1 Format: 385 * 0 12 Bytes Sync header 386 * 12 4 Bytes Block header with Data mode == 1 387 * 16 2048 Bytes of user data 388 * 2064 4 Bytes CRC for Bytes 0-2063 389 * 2068 8 Bytes Zero fill 390 * 2076 172 Bytes P parity symbols 391 * 2248 104 Bytes Q parity symbols 392 * 393 * Mode 2 Format (formless): 394 * 0 12 Bytes Sync header 395 * 12 4 Bytes Block header with Data mode == 2 396 * 16 2336 Bytes of user data 397 * 398 * Mode 2 form 1 Format: 399 * 0 12 Bytes Sync header 400 * 12 4 Bytes Block header with Data mode == 2 401 * 16 4 Bytes subheader first copy 402 * 20 4 Bytes subheader second copy 403 * 24 2048 Bytes of user data 404 * 2072 4 Bytes CRC for Bytes 16-2071 405 * 2076 172 Bytes P parity symbols 406 * 2248 104 Bytes Q parity symbols 407 * 408 * Mode 2 form 2 Format: 409 * 0 12 Bytes Sync header 410 * 12 4 Bytes Block header with Data mode == 2 411 * 16 4 Bytes subheader first copy 412 * 20 4 Bytes subheader second copy 413 * 24 2324 Bytes of user data 414 * 2348 4 Bytes Optional CRC for Bytes 16-2347 415 */ 416 417 /* 418 * Mode Byte definitions (the 4th Byte in the Block header) 419 */ 420 #define SH_MODE_DATA 0x00 /* User Data Block */ 421 #define SH_MODE_RI4 0x20 /* Fourth run in Block */ 422 #define SH_MODE_RI3 0x40 /* Third run in Block */ 423 #define SH_MODE_RI2 0x60 /* Second run in Block */ 424 #define SH_MODE_RI1 0x80 /* First run in Block */ 425 #define SH_MODE_LINK 0xA0 /* Link Block */ 426 #define SH_MODE_RO2 0xC0 /* Second run out Block */ 427 #define SH_MODE_RO1 0xE0 /* First run out Block */ 428 #define SH_MODE_M0 0x00 /* Mode 0 Data */ 429 #define SH_MODE_M1 0x01 /* Mode 1 Data */ 430 #define SH_MODE_M2 0x02 /* Mode 2 Data */ 431 #define SH_MODE_MR 0x03 /* Reserved */ 432 433 /* 434 * Defines for data block type (from SCSI-3/mmc) 435 * 436 * Mandatory are only: 437 * DB_ROM_MODE1 (8) Mode 1 (ISO/IEC 10149) 438 * DB_XA_MODE2 (10) Mode 2-F1 (CD-ROM XA form 1) 439 * DB_XA_MODE2_MIX (13) Mode 2-MIX (CD-ROM XA 1/2+subhdr) 440 */ 441 #define DB_RAW 0 /* 2352 bytes of raw data */ 442 #define DB_RAW_PQ 1 /* 2368 bytes (raw data + P/Q Subchannel) */ 443 #define DB_RAW_PW 2 /* 2448 bytes (raw data + P-W Subchannel) */ 444 #define DB_RAW_PW_R 3 /* 2448 bytes (raw data + P-W raw Subchannel)*/ 445 #define DB_RES_4 4 /* - Reserved */ 446 #define DB_RES_5 5 /* - Reserved */ 447 #define DB_RES_6 6 /* - Reserved */ 448 #define DB_VU_7 7 /* - Vendor specific */ 449 #define DB_ROM_MODE1 8 /* 2048 bytes Mode 1 (ISO/IEC 10149) */ 450 #define DB_ROM_MODE2 9 /* 2336 bytes Mode 2 (ISO/IEC 10149) */ 451 #define DB_XA_MODE2 10 /* 2048 bytes Mode 2 (CD-ROM XA form 1) */ 452 #define DB_XA_MODE2_F1 11 /* 2056 bytes Mode 2 (CD-ROM XA form 1) */ 453 #define DB_XA_MODE2_F2 12 /* 2324 bytes Mode 2 (CD-ROM XA form 2) */ 454 #define DB_XA_MODE2_MIX 13 /* 2332 bytes Mode 2 (CD-ROM XA 1/2+subhdr) */ 455 #define DB_RES_14 14 /* - Reserved */ 456 #define DB_VU_15 15 /* - Vendor specific */ 457 458 extern char *db2name[]; /* Convert data block type to name */ 459 460 /* 461 * Defines for multi session type (from SCSI-3/mmc) 462 */ 463 #define MS_NONE 0 /* No B0 pointer. Next session not allowed*/ 464 #define MS_FINAL 1 /* B0 = FF:FF:FF. Next session not allowed*/ 465 #define MS_RES 2 /* Reserved */ 466 #define MS_MULTI 3 /* B0 = Next PA. Next session allowed */ 467 468 /* 469 * Defines for session format (from SCSI-3/mmc) 470 */ 471 #define SES_DA_ROM 0x00 /* CD-DA or CD-ROM disk */ 472 #define SES_CDI 0x10 /* CD-I disk */ 473 #define SES_XA 0x20 /* CD-ROM XA disk */ 474 #define SES_UNDEF 0xFF /* Undefined disk type (read disk info) */ 475 476 /* 477 * Defines for blanking of CD-RW discs (from SCSI-3/mmc) 478 */ 479 #define BLANK_DISC 0x00 /* Erase the entire disc */ 480 #define BLANK_MINIMAL 0x01 /* Erase the PMA, 1st session TOC, pregap */ 481 #define BLANK_TRACK 0x02 /* Erase an incomplete track */ 482 #define BLANK_UNRESERVE 0x03 /* Unreserve a track */ 483 #define BLANK_TAIL 0x04 /* Erase the tail of a track */ 484 #define BLANK_UNCLOSE 0x05 /* Unclose the last session */ 485 #define BLANK_SESSION 0x06 /* Erase the last session */ 486 487 /* 488 * Useful definitions for audio tracks 489 */ 490 #define msample (44100 * 2) /* one 16bit audio sample */ 491 #define ssample (msample * 2) /* one stereo sample */ 492 #define samples(v) ((v) / ssample) /* # of stereo samples */ 493 #define hsamples(v) ((v) / (ssample/100)) /* 100* # of stereo samples/s*/ 494 #define fsamples(v) ((v) / (ssample/75)) /* 75* # of stereo samples/s */ 495 496 #define minutes(v) ((int)(samples(v) / 60)) 497 #define seconds(v) ((int)(samples(v) % 60)) 498 #define hseconds(v) ((int)(hsamples(v) % 100)) 499 #define frames(v) ((int)(fsamples(v) % 75)) 500 501 /* 502 * sector based macros 503 */ 504 #define Sminutes(s) ((int)((s) / (60*75))) 505 #define Sseconds(s) ((int)((s) / 75)) 506 #define Shseconds(s) ((int)(((s) % 75)*100)/75) 507 #define Sframes(s) ((int)((s) % 75)) 508 509 typedef struct msf { 510 char msf_min; 511 char msf_sec; 512 char msf_frame; 513 } msf_t; 514 515 /* 516 * Definitions for read TOC/PMA/ATIP command 517 */ 518 #define FMT_TOC 0 519 #define FMT_SINFO 1 520 #define FMT_FULLTOC 2 521 #define FMT_PMA 3 522 #define FMT_ATIP 4 523 #define FMT_CDTEXT 5 524 525 /* 526 * Definitions for read disk information "recording flags" 527 * used in UInt16_t "ds_cdrflags". 528 */ 529 #define RF_WRITE 0x0001 /* Disk is going to be written */ 530 #define RF_BLANK 0x0002 /* Disk is going to be erased */ 531 #define RF_PRATIP 0x0004 /* Print ATIP info */ 532 #define RF_LEADIN 0x0008 /* Lead-in has been "manually" written */ 533 #define RF_BURNFREE 0x0010 /* BUFFER underrun free recording */ 534 #define RF_VARIREC 0x0020 /* Plextor VariRec */ 535 #define RF_AUDIOMASTER 0x0040 /* Yamaha AudioMaster */ 536 #define RF_FORCESPEED 0x0080 /* WriteSpeed forced high */ 537 #define RF_DID_STAT 0x0100 /* Already did call cdrstats() */ 538 #define RF_DID_CDRSTAT 0x0200 /* Already did call (*dp->cdr_stats)() */ 539 #define RF_WR_WAIT 0x0400 /* Wait during writing to free bus */ 540 #define RF_SINGLESESS 0x0800 /* Plextor single sess. mode */ 541 #define RF_HIDE_CDR 0x1000 /* Plextor hide CDR features */ 542 #define RF_SPEEDREAD 0x2000 /* Plextor SpeedReed */ 543 #define RF_GIGAREC 0x4000 /* Plextor GigaRec */ 544 545 /* 546 * Definitions for read disk information "disk status" 547 * used in "ds_diskstat". 548 */ 549 #define DS_EMPTY 0 /* Empty disk */ 550 #define DS_APPENDABLE 1 /* Incomplete disk (appendable) */ 551 #define DS_COMPLETE 2 /* Complete disk (closed/no B0 pointer) */ 552 #define DS_RESERVED 3 /* Reserved */ 553 554 /* 555 * Definitions for read disk information "session status" 556 * used in "ds_sessstat". 557 */ 558 #define SS_EMPTY 0 /* Empty session */ 559 #define SS_APPENDABLE 1 /* Incomplete session */ 560 #define SS_RESERVED 2 /* Reserved */ 561 #define SS_COMPLETE 3 /* Complete session (needs DS_COMPLETE) */ 562 563 /* 564 * Definitions for disk_status write mode 565 * used in "ds_wrmode". 566 */ 567 #define WM_NONE 0 /* No write mode selected */ 568 #define WM_BLANK 1 /* Blanking mode */ 569 #define WM_FORMAT 2 /* Formatting */ 570 #define WM_PACKET 4 /* Packet writing */ 571 #define WM_TAO 8 /* Track at Once */ 572 #define WM_SAO 12 /* Session at Once w/ cooked sectors */ 573 #define WM_SAO_RAW16 13 /* Session at Once RAW+16 byte sectors */ 574 #define WM_SAO_RAW96P 14 /* Session at Once RAW+96P byte sectors */ 575 #define WM_SAO_RAW96R 15 /* Session at Once RAW+96R byte sectors */ 576 #define WM_RAW 16 /* RAW with cooked sectors is impossible*/ 577 #define WM_RAW_RAW16 17 /* RAW with RAW+16 byte sectors */ 578 #define WM_RAW_RAW96P 18 /* RAW with RAW+96P byte sectors */ 579 #define WM_RAW_RAW96R 19 /* RAW with RAW+96R byte sectors */ 580 581 #define wm_base(wm) ((wm)/4*4) /* The basic write mode for this mode */ 582 583 /* 584 * Definitions for disk_status flags 585 * used in UInt16_t "ds_flags". 586 */ 587 #define DSF_DID_V 0x0001 /* Disk id valid */ 588 #define DSF_DBC_V 0x0002 /* Disk bar code valid */ 589 #define DSF_URU 0x0004 /* Disk is for unrestricted use */ 590 #define DSF_ERA 0x0008 /* Disk is erasable */ 591 #define DSF_HIGHSP_ERA 0x0010 /* Disk is high speed erasable */ 592 #define DSF_ULTRASP_ERA 0x0020 /* Disk is ultra speed erasable */ 593 #define DSF_ULTRASPP_ERA 0x0040 /* Disk is ultra speed+ erasable */ 594 #define DSF_NOCD 0x0080 /* Disk is not a CD */ 595 596 #define DSF_DVD 0x0100 /* Disk is a DVD */ 597 #define DSF_DVD_PLUS_R 0x0200 /* Disk is a DVD+R */ 598 #define DSF_DVD_PLUS_RW 0x0400 /* Disk is a DVD+RW */ 599 #define DSF_NEED_FORMAT 0x0800 /* Disk needs to be formatted */ 600 #define DSF_BD 0x1000 /* Disk is a BD */ 601 #define DSF_BD_RE 0x2000 /* Disk is a BD-RE */ 602 603 /* 604 * Definitions for disk_status disk type 605 * used in "ds_type". 606 */ 607 #define DST_UNKNOWN 0 608 #define DST_CD_ROM 0x08 609 #define DST_CD_R 0x09 610 #define DST_CD_RW 0x0A 611 #define DST_DVD_ROM 0x10 612 #define DST_DVD_R 0x11 613 #define DST_DVD_RAM 0x12 614 #define DST_DVD_RW 0x13 615 #define DST_DVD_RW_SEQ 0x14 616 #define DST_DVD_R_DL 0x15 617 #define DST_DVD_R_DL_LJ 0x16 618 #define DST_DVD_PLUS_RW 0x1A 619 #define DST_DVD_PLUS_R 0x1B 620 #define DST_DVD_PLUS_R_DL 0x2B 621 #define DST_BD_ROM 0x40 622 #define DST_BD_R_SEQ 0x41 623 #define DST_BD_R 0x42 624 #define DST_BD_RE 0x43 625 626 typedef struct disk_status dstat_t; 627 628 struct disk_status { 629 track_t *ds_trackp; /* Pointer to track structure */ 630 UInt32_t ds_diskid; /* Disk identification */ 631 UInt16_t ds_cdrflags; /* Recording flags from cdrecord*/ 632 UInt16_t ds_flags; /* Disk_status flags */ 633 Uchar ds_wrmode; /* Selected write mode */ 634 Uchar ds_type; /* Abstract disk type */ 635 636 Uchar ds_disktype; /* Disk type (from TOC/PMA) */ 637 Uchar ds_diskstat; /* Disk status (MMC) */ 638 Uchar ds_sessstat; /* Status of last sesion (MMC) */ 639 Uchar ds_trfirst; /* first track # */ 640 Uchar ds_trlast; /* last track # */ 641 Uchar ds_trfirst_ls; /* first track # in last session*/ 642 Uchar ds_barcode[8]; /* Disk bar code */ 643 644 Int32_t ds_first_leadin; /* Start of first lead in (ATIP)*/ 645 Int32_t ds_last_leadout; /* Start of last lead out (ATIP)*/ 646 Int32_t ds_curr_leadin; /* Start of next lead in */ 647 Int32_t ds_curr_leadout; /* Start of next lead out */ 648 649 Int32_t ds_maxblocks; /* # of official blocks on disk */ 650 Int32_t ds_maxrblocks; /* # real blocks on disk */ 651 Int32_t ds_fwa; /* first writable addr */ 652 653 Int32_t ds_startsec; /* Actual start sector */ 654 Int32_t ds_endsec; /* Actual end sector */ 655 Int32_t ds_buflow; /* # of times drive buffer empty*/ 656 657 UInt16_t ds_minbuf; /* Minimum drive bufer fill rt. */ 658 659 UInt16_t ds_at_min_speed; /* The minimal ATIP write speed */ 660 UInt16_t ds_at_max_speed; /* The maximal ATIP write speed */ 661 UInt16_t ds_dr_cur_rspeed; /* The drive's cur read speed */ 662 UInt16_t ds_dr_max_rspeed; /* The drive's max read speed */ 663 UInt16_t ds_dr_cur_wspeed; /* The drive's cur write speed */ 664 UInt16_t ds_dr_max_wspeed; /* The drive's max write speed */ 665 UInt16_t ds_wspeed; /* The selected/drive wr. speed */ 666 667 Int32_t ds_layer_break; /* Start of layer break */ 668 }; 669 670 /* 671 * First approach of a CDR device abstraction layer. 672 * This interface will change as long as I did not find the 673 * optimum that fits for all devices. 674 * 675 * Called with pointer to whole track array: 676 * cdr_send_cue() 677 * cdr_write_leadin() 678 * cdr_open_session() 679 * cdr_fixate() 680 * 681 * Called with (track_t *) 0 or pointer to current track: 682 * cdr_next_wr_address() 683 * 684 * Called with pointer to current track: 685 * cdr_open_track() 686 * cdr_close_track() 687 * 688 * Calling sequence: 689 * cdr_identify() May modify driver 690 * Here, the cdr_t will be allocated and 691 * copied to a new writable area. 692 * cdr_attach() Get drive properties 693 * cdr_buffer_cap() 694 * cdr_getdisktype() GET ATIP 695 * cdr_init() set TAO for -msinfo 696 * cdr_check_session XXX ???? 697 * cdr_opt1() set early options 698 * cdr_set_speed_dummy(scgp, dp, &speed) 699 * <--- Grace time processing goes here 700 * { do_opc(); cdr_blank() } 701 * cdr_opt2() set late options 702 * cdr_open_session() set up params (no wrt.) 703 * do_opc() 704 * cdr_write_leadin() start writing 705 * LOOP { 706 * cdr_open_track() 707 * cdr_next_wr_address() only TAO / Packet 708 * write_track_data() 709 * cdr_close_track() 710 * } 711 * write_leadout() XXX should go -> driver! 712 * cdr_fixate() 713 * cdr_stats() 714 */ 715 /*--------------------------------------------------------------------------*/ 716 typedef struct cdr_cmd cdr_t; 717 718 #ifdef _SCG_SCSITRANSP_H 719 struct cdr_cmd { 720 int cdr_dev; /* Numerical device type */ 721 UInt32_t cdr_cmdflags; /* Command line options */ 722 UInt32_t cdr_cmdflags2; /* More cmdline options */ 723 UInt32_t cdr_flags; /* Drive related flags */ 724 UInt32_t cdr_flags2; /* More Drive flags */ 725 UInt8_t cdr_cdrw_support; /* CD-RW write media types */ 726 UInt8_t cdr_wrmodedef; /* Default write mode */ 727 UInt16_t cdr_speeddef; /* Default write speed */ 728 UInt16_t cdr_speedmax; /* Max. write speed */ 729 730 char *cdr_drname; /* Driver ID string */ 731 char *cdr_drtext; /* Driver ID text */ 732 struct cd_mode_page_2A *cdr_cdcap; 733 dstat_t *cdr_dstat; 734 #ifdef _SCG_SCSIREG_H 735 cdr_t *(*cdr_identify) __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *)); /* identify drive */ 736 #else 737 cdr_t *(*cdr_identify) __PR((SCSI *scgp, cdr_t *, void *)); /* identify drive */ 738 #endif 739 int (*cdr_attach) __PR((SCSI *scgp, cdr_t *)); /* init error decoding etc*/ 740 int (*cdr_init) __PR((SCSI *scgp, cdr_t *)); /* init drive to useful deflts */ 741 int (*cdr_getdisktype) __PR((SCSI *scgp, cdr_t *)); /* get disk type */ 742 int (*cdr_prdiskstatus) __PR((SCSI *scgp, cdr_t *)); /* print disk status */ 743 int (*cdr_load) __PR((SCSI *scgp, cdr_t *)); /* load disk */ 744 int (*cdr_unload) __PR((SCSI *scgp, cdr_t *)); /* unload disk */ 745 int (*cdr_buffer_cap) __PR((SCSI *scgp, long *sizep, long *freep)); /* read buffer capacity */ 746 int (*cdr_check_recovery) __PR((SCSI *scgp, cdr_t *)); /* check if recover is needed */ 747 int (*cdr_recover) __PR((SCSI *scgp, cdr_t *, int track)); /* do recover */ 748 int (*cdr_set_speed_dummy) __PR((SCSI *scgp, cdr_t *, int *speedp)); /* set recording speed & dummy write */ 749 int (*cdr_set_secsize) __PR((SCSI *scgp, int secsize)); /* set sector size */ 750 int (*cdr_next_wr_address) __PR((SCSI *scgp, track_t *trackp, long *ap)); /* get next writable addr. */ 751 int (*cdr_reserve_track) __PR((SCSI *scgp, Ulong len)); /* reserve track for future use */ 752 int (*cdr_write_trackdata) __PR((SCSI *scgp, caddr_t buf, long daddr, long bytecnt, int seccnt, BOOL islast)); 753 int (*cdr_gen_cue) __PR((track_t *trackp, void *cuep, BOOL needgap)); /* generate cue sheet */ 754 int (*cdr_send_cue) __PR((SCSI *scgp, cdr_t *, track_t *trackp)); /* send cue sheet */ 755 int (*cdr_write_leadin) __PR((SCSI *scgp, cdr_t *, track_t *trackp)); /* write leadin */ 756 int (*cdr_open_track) __PR((SCSI *scgp, cdr_t *, track_t *trackp)); /* open new track */ 757 int (*cdr_close_track) __PR((SCSI *scgp, cdr_t *, track_t *trackp)); /* close written track */ 758 int (*cdr_open_session) __PR((SCSI *scgp, cdr_t *, track_t *trackp)); /* open new session */ 759 int (*cdr_close_session) __PR((SCSI *scgp, cdr_t *)); /* really needed ??? */ 760 int (*cdr_abort_session) __PR((SCSI *scgp, cdr_t *)); /* abort current write */ 761 int (*cdr_session_offset) __PR((SCSI *scgp, long *soff)); /* read session offset*/ 762 int (*cdr_fixate) __PR((SCSI *scgp, cdr_t *, track_t *trackp)); /* write toc on disk */ 763 int (*cdr_stats) __PR((SCSI *scgp, cdr_t *)); /* final statistics printing*/ 764 int (*cdr_blank) __PR((SCSI *scgp, cdr_t *, long addr, int blanktype)); /* blank something */ 765 int (*cdr_format) __PR((SCSI *scgp, cdr_t *, int fmtflags)); /* format media */ 766 int (*cdr_opc) __PR((SCSI *scgp, caddr_t bp, int cnt, int doopc)); /* Do OPC */ 767 int (*cdr_opt1) __PR((SCSI *scgp, cdr_t *)); /* do early option processing*/ 768 int (*cdr_opt2) __PR((SCSI *scgp, cdr_t *)); /* do late option processing */ 769 }; 770 #endif 771 772 /* 773 * Definitions for cdr_flags 774 */ 775 #define CDR_TAO 0x01 /* Drive supports Track at once */ 776 #define CDR_SAO 0x02 /* Drive supports Sess at once */ 777 #define CDR_PACKET 0x04 /* Drive supports packet writing*/ 778 #define CDR_RAW 0x08 /* Drive supports raw writing */ 779 #define CDR_RAW16 0x10 /* Drive supports RAW raw16 */ 780 #define CDR_RAW96P 0x20 /* Drive supports RAW raw96 pak */ 781 #define CDR_RAW96R 0x40 /* Drive supports RAW raw96 raw */ 782 #ifdef __needed__ 783 #define CDR_SRAW16 0x100 /* Drive supports SAO raw16 */ 784 #endif 785 #define CDR_SRAW96P 0x200 /* Drive supports SAO raw96 pak */ 786 #define CDR_SRAW96R 0x400 /* Drive supports SAO raw96 raw */ 787 #define CDR_LAYER_JUMP 0x800 /* Drive s. DVD-R/DL Layer jump */ 788 #define CDR_SWABAUDIO 0x1000 /* Drive swabs audio data */ 789 #define CDR_ISREADER 0x2000 /* Drive is s CD-ROM reader */ 790 #define CDR_TRAYLOAD 0x4000 /* Drive loads CD with tray */ 791 #define CDR_CADDYLOAD 0x8000 /* Drive loads CD with caddy */ 792 #define CDR_NO_LOLIMIT 0x10000 /* Drive ignores lead-out limit */ 793 #define CDR_DVD 0x20000 /* Drive is a DVD drive */ 794 #define CDR_SIMUL 0x40000 /* Drive is simulated */ 795 #define CDR_BURNFREE 0x80000 /* Drive sup. BUFund. free rec. */ 796 #define CDR_VARIREC 0x100000 /* Drive sup. VariRec Plex. */ 797 #define CDR_AUDIOMASTER 0x200000 /* Drive sup. AudioMaster Yamah.*/ 798 #define CDR_FORCESPEED 0x400000 /* Drive sup. WriteSpeed ctl. */ 799 #define CDR_DISKTATTOO 0x800000 /* Drive sup. Yamaha DiskT@2 */ 800 #define CDR_SINGLESESS 0x1000000 /* Drive sup. single sess. mode */ 801 #define CDR_HIDE_CDR 0x2000000 /* Drive sup. hide CDR features */ 802 #define CDR_SPEEDREAD 0x4000000 /* Drive sup. SpeedReed */ 803 #define CDR_GIGAREC 0x8000000 /* Drive sup. GigaRec Plex. */ 804 #define CDR_MMC 0x10000000 /* Drive is MMC compliant */ 805 #define CDR_MMC2 0x20000000 /* Drive is MMC-2 compliant */ 806 #define CDR_MMC3 0x40000000 /* Drive is MMC-3 compliant */ 807 #ifdef PROTOTYPES 808 #define CDR_ALLOC 0x80000000UL /* structure is allocated */ 809 #else 810 #define CDR_ALLOC 0x80000000 /* structure is allocated */ 811 #endif 812 813 /* 814 * Definitions for cdr_flags 815 */ 816 #define CDR2_NOCD 0x01 /* Drive not operating on a CD */ 817 #define CDR2_BD 0x02 /* Drive is a BluRay drive */ 818 819 /* 820 * Definitions for cdr_cdrw_support 821 */ 822 #define CDR_CDRW_NONE 0x00 /* CD-RW writing not supported */ 823 #define CDR_CDRW_MULTI 0x01 /* CD-RW multi speed supported */ 824 #define CDR_CDRW_HIGH 0x02 /* CD-RW high speed supported */ 825 #define CDR_CDRW_ULTRA 0x04 /* CD-RW ultra high speed supported */ 826 #define CDR_CDRW_ULTRAP 0x08 /* CD-RW ultra high speed+ supported */ 827 #define CDR_CDRW_ALL 0xFF /* All bits set: unknown - support all */ 828 829 /* 830 * cdrecord.c 831 */ 832 extern int read_buf __PR((int f, char *bp, int size)); 833 extern int fill_buf __PR((int f, track_t *trackp, long secno, char *bp, int size)); 834 extern int get_buf __PR((int f, track_t *trackp, long secno, char **bpp, int size)); 835 #ifdef _SCG_SCSITRANSP_H 836 extern int write_secs __PR((SCSI *scgp, cdr_t *dp, char *bp, long startsec, int bytespt, int secspt, BOOL islast)); 837 extern int write_track_data __PR((SCSI *scgp, cdr_t *, track_t *)); 838 extern int pad_track __PR((SCSI *scgp, cdr_t *dp, track_t *trackp, 839 long startsec, Llong amt, 840 BOOL dolast, Llong *bytesp)); 841 extern void load_media __PR((SCSI *scgp, cdr_t *, BOOL)); 842 extern void unload_media __PR((SCSI *scgp, cdr_t *, UInt32_t)); 843 extern void reload_media __PR((SCSI *scgp, cdr_t *)); 844 #endif 845 extern void raisepri __PR((int)); 846 extern int getnum __PR((char *arg, long *valp)); 847 848 /* 849 * cd_misc.c 850 */ 851 extern int from_bcd __PR((int b)); 852 extern int to_bcd __PR((int i)); 853 extern long msf_to_lba __PR((int m, int s, int f, BOOL force_positive)); 854 extern BOOL lba_to_msf __PR((long lba, msf_t *mp)); 855 extern void sec_to_msf __PR((long sec, msf_t *mp)); 856 extern void print_min_atip __PR((long li, long lo)); 857 extern BOOL is_cdspeed __PR((int speed)); 858 859 /* 860 * fifo.c 861 */ 862 extern long init_fifo __PR((long)); 863 extern BOOL init_faio __PR((track_t *track, int)); 864 extern BOOL await_faio __PR((void)); 865 extern void kill_faio __PR((void)); 866 extern int wait_faio __PR((void)); 867 extern int faio_read_buf __PR((int f, char *bp, int size)); 868 extern int faio_get_buf __PR((int f, char **bpp, int size)); 869 extern void fifo_stats __PR((void)); 870 extern int fifo_percent __PR((BOOL addone)); 871 872 /* 873 * wm_session.c 874 */ 875 #ifdef _SCG_SCSITRANSP_H 876 extern int write_session_data __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); 877 #endif 878 879 /* 880 * wm_track.c 881 */ 882 #ifdef _SCG_SCSITRANSP_H 883 /*extern int write_track_data __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));*/ 884 #endif 885 886 /* 887 * wm_packet.c 888 */ 889 #ifdef _SCG_SCSITRANSP_H 890 extern int write_packet_data __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); 891 #endif 892 893 /* 894 * modes.c 895 */ 896 #ifdef _SCG_SCSITRANSP_H 897 extern BOOL get_mode_params __PR((SCSI *scgp, int page, char *pagename, 898 Uchar *modep, Uchar *cmodep, 899 Uchar *dmodep, Uchar *smodep, 900 int *lenp)); 901 extern BOOL set_mode_params __PR((SCSI *scgp, char *pagename, Uchar *modep, 902 int len, int save, int secsize)); 903 #endif 904 905 /* 906 * misc.c 907 */ 908 #ifdef timerclear 909 extern void timevaldiff __PR((struct timeval *start, struct timeval *stop)); 910 extern void prtimediff __PR((const char *fmt, 911 struct timeval *start, 912 struct timeval *stop)); 913 #endif 914 915 /* 916 * getnum.c 917 */ 918 extern int getnum __PR((char *arg, long *valp)); 919 extern int getllnum __PR((char *arg, Llong *lvalp)); 920 921 /* 922 * scsi_cdr.c 923 */ 924 #ifdef _SCG_SCSITRANSP_H 925 extern BOOL unit_ready __PR((SCSI *scgp)); 926 extern BOOL wait_unit_ready __PR((SCSI *scgp, int secs)); 927 extern BOOL scsi_in_progress __PR((SCSI *scgp)); 928 extern BOOL cdr_underrun __PR((SCSI *scgp)); 929 extern int test_unit_ready __PR((SCSI *scgp)); 930 extern int rezero_unit __PR((SCSI *scgp)); 931 extern int request_sense __PR((SCSI *scgp)); 932 extern int request_sense_b __PR((SCSI *scgp, caddr_t bp, int cnt)); 933 extern int inquiry __PR((SCSI *scgp, caddr_t, int)); 934 extern int read_capacity __PR((SCSI *scgp)); 935 #ifdef EOF /* stdio.h has been included */ 936 extern void print_capacity __PR((SCSI *scgp, FILE *f)); 937 #endif 938 extern int scsi_load_unload __PR((SCSI *scgp, int)); 939 extern int scsi_prevent_removal __PR((SCSI *scgp, int)); 940 extern int scsi_start_stop_unit __PR((SCSI *scgp, int, int, BOOL immed)); 941 942 #define ROTCTL_CLV 0 /* CLV or PCAV */ 943 #define ROTCTL_CAV 1 /* True CAV */ 944 945 extern int scsi_set_speed __PR((SCSI *scgp, int readspeed, int writespeed, int rotctl)); 946 extern int scsi_get_speed __PR((SCSI *scgp, int *readspeedp, int *writespeedp)); 947 extern int qic02 __PR((SCSI *scgp, int)); 948 extern int write_xscsi __PR((SCSI *scgp, caddr_t, long, long, int)); 949 extern int write_xg0 __PR((SCSI *scgp, caddr_t, long, long, int)); 950 extern int write_xg1 __PR((SCSI *scgp, caddr_t, long, long, int)); 951 extern int write_xg5 __PR((SCSI *scgp, caddr_t, long, long, int)); 952 extern int seek_scsi __PR((SCSI *scgp, long addr)); 953 extern int seek_g0 __PR((SCSI *scgp, long addr)); 954 extern int seek_g1 __PR((SCSI *scgp, long addr)); 955 extern int scsi_flush_cache __PR((SCSI *scgp, BOOL immed)); 956 extern int read_buffer __PR((SCSI *scgp, caddr_t bp, int cnt, int mode)); 957 extern int write_buffer __PR((SCSI *scgp, char *buffer, long length, int mode, int bufferid, long offset)); 958 extern int read_subchannel __PR((SCSI *scgp, caddr_t bp, int track, 959 int cnt, int msf, int subq, int fmt)); 960 extern int read_toc __PR((SCSI *scgp, caddr_t, int, int, int, int)); 961 extern int read_toc_philips __PR((SCSI *scgp, caddr_t, int, int, int, int)); 962 extern int read_header __PR((SCSI *scgp, caddr_t, long, int, int)); 963 extern int read_disk_info __PR((SCSI *scgp, caddr_t, int)); 964 965 #define TI_TYPE_LBA 0 /* Address is LBA */ 966 #define TI_TYPE_TRACK 1 /* Address: 0 -> TOC, xx -> Track xx, 0xFF -> Inv Track */ 967 #define TI_TYPE_SESS 2 /* Address is session # */ 968 extern int read_track_info __PR((SCSI *scgp, caddr_t, int type, int addr, int cnt)); 969 extern int get_trackinfo __PR((SCSI *scgp, caddr_t, int type, int addr, int cnt)); 970 extern int read_rzone_info __PR((SCSI *scgp, caddr_t bp, int cnt)); 971 extern int reserve_tr_rzone __PR((SCSI *scgp, long size)); 972 extern int read_dvd_structure __PR((SCSI *scgp, caddr_t bp, int cnt, int mt, int addr, int layer, int fmt)); 973 extern int send_dvd_structure __PR((SCSI *scgp, caddr_t bp, int cnt, int fmt)); 974 extern int send_opc __PR((SCSI *scgp, caddr_t, int cnt, int doopc)); 975 976 #define CL_TYPE_STOP_DEICE 0 /* Stop De-icing a DVD+RW Media */ 977 #define CL_TYPE_TRACK 1 /* Close Track # */ 978 #define CL_TYPE_SESSION 2 /* Close Session/Border / Stop backgrnd. format */ 979 #define CL_TYPE_INTER_BORDER 3 /* Close intermediate Border */ 980 extern int scsi_close_tr_session __PR((SCSI *scgp, int type, int track, BOOL immed)); 981 extern int read_master_cue __PR((SCSI *scgp, caddr_t bp, int sheet, int cnt)); 982 extern int send_cue_sheet __PR((SCSI *scgp, caddr_t bp, long size)); 983 extern int read_buff_cap __PR((SCSI *scgp, long *, long *)); 984 extern int scsi_blank __PR((SCSI *scgp, long addr, int blanktype, BOOL immed)); 985 extern BOOL allow_atapi __PR((SCSI *scgp, BOOL new)); 986 extern int mode_select __PR((SCSI *scgp, Uchar *, int, int, int)); 987 extern int mode_sense __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf)); 988 extern int mode_select_sg0 __PR((SCSI *scgp, Uchar *, int, int, int)); 989 extern int mode_sense_sg0 __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf)); 990 extern int mode_select_g0 __PR((SCSI *scgp, Uchar *, int, int, int)); 991 extern int mode_select_g1 __PR((SCSI *scgp, Uchar *, int, int, int)); 992 extern int mode_sense_g0 __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf)); 993 extern int mode_sense_g1 __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf)); 994 extern int read_tochdr __PR((SCSI *scgp, cdr_t *, int *, int *)); 995 extern int read_cdtext __PR((SCSI *scgp)); 996 extern int read_trackinfo __PR((SCSI *scgp, int, long *, struct msf *, int *, int *, int *)); 997 extern int read_B0 __PR((SCSI *scgp, BOOL isbcd, long *b0p, long *lop)); 998 extern int read_session_offset __PR((SCSI *scgp, long *)); 999 extern int read_session_offset_philips __PR((SCSI *scgp, long *)); 1000 extern int sense_secsize __PR((SCSI *scgp, int current)); 1001 extern int select_secsize __PR((SCSI *scgp, int)); 1002 extern BOOL is_cddrive __PR((SCSI *scgp)); 1003 extern BOOL is_unknown_dev __PR((SCSI *scgp)); 1004 extern int read_scsi __PR((SCSI *scgp, caddr_t, long, int)); 1005 extern int read_g0 __PR((SCSI *scgp, caddr_t, long, int)); 1006 extern int read_g1 __PR((SCSI *scgp, caddr_t, long, int)); 1007 extern BOOL getdev __PR((SCSI *scgp, BOOL)); 1008 #ifdef EOF /* stdio.h has been included */ 1009 extern void printinq __PR((SCSI *scgp, FILE *f)); 1010 #endif 1011 extern void printdev __PR((SCSI *scgp)); 1012 extern BOOL do_inquiry __PR((SCSI *scgp, BOOL)); 1013 extern BOOL recovery_needed __PR((SCSI *scgp, cdr_t *)); 1014 extern int scsi_load __PR((SCSI *scgp, cdr_t *)); 1015 extern int scsi_unload __PR((SCSI *scgp, cdr_t *)); 1016 extern int scsi_cdr_write __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast)); 1017 extern struct cd_mode_page_2A * mmc_cap __PR((SCSI *scgp, Uchar *modep)); 1018 extern void mmc_getval __PR((struct cd_mode_page_2A *mp, 1019 BOOL *cdrrp, BOOL *cdwrp, 1020 BOOL *cdrrwp, BOOL *cdwrwp, 1021 BOOL *dvdp, BOOL *dvdwp)); 1022 extern BOOL is_mmc __PR((SCSI *scgp, BOOL *cdwp, BOOL *dvdwp)); 1023 extern BOOL mmc_check __PR((SCSI *scgp, BOOL *cdrrp, BOOL *cdwrp, 1024 BOOL *cdrrwp, BOOL *cdwrwp, 1025 BOOL *dvdp, BOOL *dvdwp)); 1026 extern void print_capabilities __PR((SCSI *scgp)); 1027 1028 extern int verify __PR((SCSI *scgp, long start, int count, long *bad_block)); 1029 #endif 1030 1031 /* 1032 * scsi_cdr.c 1033 */ 1034 #ifdef _SCG_SCSITRANSP_H 1035 extern void print_capabilities_mmc4 __PR((SCSI *scgp)); 1036 #endif 1037 1038 /* 1039 * scsi_mmc.c 1040 */ 1041 1042 /* 1043 * Definitions for the return value of get_mediatype() 1044 */ 1045 #define MT_NONE 0 /* Unknown or unsupported */ 1046 #define MT_CD 1 /* CD type media */ 1047 #define MT_DVD 2 /* DVD type media */ 1048 #define MT_BD 3 /* Blu Ray type media */ 1049 #define MT_HDDVD 4 /* HD-DVD type media */ 1050 1051 #ifdef _SCG_SCSITRANSP_H 1052 extern int get_configuration __PR((SCSI *scgp, caddr_t bp, int cnt, int st_feature, int rt)); 1053 extern int get_curprofile __PR((SCSI *scgp)); 1054 extern int has_profile __PR((SCSI *scgp, int profile)); 1055 extern int print_profiles __PR((SCSI *scgp)); 1056 extern int get_proflist __PR((SCSI *scgp, BOOL *wp, BOOL *cdp, BOOL *dvdp, 1057 BOOL *dvdplusp, BOOL *ddcdp)); 1058 extern int get_wproflist __PR((SCSI *scgp, BOOL *cdp, BOOL *dvdp, 1059 BOOL *dvdplusp, BOOL *ddcdp)); 1060 extern int get_mediatype __PR((SCSI *scgp)); 1061 #endif /* _SCG_SCSITRANSP_H */ 1062 extern int get_singlespeed __PR((int mt)); 1063 extern float get_secsps __PR((int mt)); 1064 extern char *get_mclassname __PR((int mt)); 1065 extern int get_blf __PR((int mt)); 1066 #ifdef _SCG_SCSITRANSP_H 1067 extern int print_features __PR((SCSI *scgp)); 1068 extern int check_writemodes_mmc __PR((SCSI *scgp, cdr_t *dp)); 1069 extern int scsi_get_perf_maxspeed __PR((SCSI *scgp, Ulong *readp, Ulong *writep, Ulong *endp)); 1070 extern int scsi_get_perf_curspeed __PR((SCSI *scgp, Ulong *readp, Ulong *writep, Ulong *endp)); 1071 extern int speed_select_mdvd __PR((SCSI *scgp, int readspeed, int writespeed)); 1072 extern void print_format_capacities __PR((SCSI *scgp)); 1073 extern int get_format_capacities __PR((SCSI *scgp, caddr_t bp, int cnt)); 1074 extern int read_format_capacities __PR((SCSI *scgp, caddr_t bp, int cnt)); 1075 #endif /* _SCG_SCSITRANSP_H */ 1076 #ifdef _SCSIMMC_H 1077 extern void przone __PR((struct rzone_info *rp)); 1078 #endif /* _SCSIMMC_H */ 1079 #ifdef _SCG_SCSITRANSP_H 1080 #ifdef _SCSIMMC_H 1081 extern int get_diskinfo __PR((SCSI *scgp, struct disk_info *dip, int cnt)); 1082 extern char *get_ses_type __PR((int ses_type)); 1083 extern void print_diskinfo __PR((struct disk_info *dip, BOOL is_cd)); 1084 #endif 1085 extern int prdiskstatus __PR((SCSI *scgp, cdr_t *dp, BOOL is_cd)); 1086 extern int sessstatus __PR((SCSI *scgp, BOOL is_cd, long *offp, long *nwap)); 1087 extern void print_performance_mmc __PR((SCSI *scgp)); 1088 #endif /* _SCG_SCSITRANSP_H */ 1089 1090 /* 1091 * scsi_mmc4.c 1092 */ 1093 #ifdef _SCG_SCSITRANSP_H 1094 extern int get_supported_cdrw_media_types __PR((SCSI *scgp)); 1095 #endif 1096 1097 /* 1098 * cdr_drv.c 1099 */ 1100 #ifdef _SCG_SCSITRANSP_H 1101 #ifdef _SCG_SCSIREG_H 1102 extern cdr_t *drive_identify __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *ip)); 1103 #else 1104 extern cdr_t *drive_identify __PR((SCSI *scgp, cdr_t *, void *ip)); 1105 #endif 1106 extern int drive_attach __PR((SCSI *scgp, cdr_t *)); 1107 #endif 1108 extern int attach_unknown __PR((void)); 1109 #ifdef _SCG_SCSITRANSP_H 1110 extern int blank_dummy __PR((SCSI *scgp, cdr_t *, long addr, int blanktype)); 1111 extern int blank_simul __PR((SCSI *scgp, cdr_t *, long addr, int blanktype)); 1112 EXPORT int format_dummy __PR((SCSI *scgp, cdr_t *, int fmtflags)); 1113 extern int drive_getdisktype __PR((SCSI *scgp, cdr_t *dp)); 1114 extern int cmd_ill __PR((SCSI *scgp)); 1115 extern int cmd_dummy __PR((SCSI *scgp, cdr_t *)); 1116 extern int no_sendcue __PR((SCSI *scgp, cdr_t *, track_t *trackp)); 1117 extern int no_diskstatus __PR((SCSI *scgp, cdr_t *)); 1118 extern int buf_dummy __PR((SCSI *scgp, long *sp, long *fp)); 1119 #endif 1120 extern BOOL set_cdrcmds __PR((char *name, cdr_t **dpp)); 1121 #ifdef _SCG_SCSITRANSP_H 1122 extern cdr_t *get_cdrcmds __PR((SCSI *scgp)); 1123 #endif 1124 1125 1126 /* 1127 * drv_mmc.c 1128 */ 1129 #ifdef _SCG_SCSITRANSP_H 1130 extern void mmc_opthelp __PR((SCSI *scgp, cdr_t *dp, int excode)); 1131 #endif 1132 extern char *hasdrvopt __PR((char *optstr, char *optname)); 1133 extern char *hasdrvoptx __PR((char *optstr, char *optname, int flag)); 1134 #ifdef _SCG_SCSITRANSP_H 1135 extern struct ricoh_mode_page_30 * get_justlink_ricoh __PR((SCSI *scgp, Uchar *mode)); 1136 #endif 1137 1138 /* 1139 * isosize.c 1140 */ 1141 extern Llong isosize __PR((int f)); 1142 extern Llong bisosize __PR((char *bp, int len)); 1143 1144 /* 1145 * audiosize.c 1146 */ 1147 extern BOOL is_auname __PR((const char *name)); 1148 extern off_t ausize __PR((int f)); 1149 extern BOOL is_wavname __PR((const char *name)); 1150 extern off_t wavsize __PR((int f)); 1151 1152 /* 1153 * auinfo.c 1154 */ 1155 extern BOOL auinfosize __PR((char *name, track_t *trackp)); 1156 extern BOOL auinfhidden __PR((char *name, int track, track_t *trackp)); 1157 extern void auinfo __PR((char *name, int track, track_t *trackp)); 1158 #ifdef CDTEXT_H 1159 extern textptr_t *gettextptr __PR((int track, track_t *trackp)); 1160 #endif 1161 extern void setmcn __PR((char *mcn, track_t *trackp)); 1162 extern void setisrc __PR((char *isrc, track_t *trackp)); 1163 extern void setindex __PR((char *tindex, track_t *trackp)); 1164 1165 /* 1166 * diskid.c 1167 */ 1168 extern void pr_manufacturer __PR((msf_t *mp, BOOL rw, BOOL audio)); 1169 extern int manufacturer_id __PR((msf_t *mp)); 1170 extern long disk_rcap __PR((msf_t *mp, long maxblock, BOOL rw, BOOL audio)); 1171 1172 /*--------------------------------------------------------------------------*/ 1173 /* Test only */ 1174 /*--------------------------------------------------------------------------*/ 1175 #ifdef _SCSIMMC_H 1176 /*extern int do_cue __PR((track_t *trackp, struct mmc_cue **cuep));*/ 1177 #else 1178 /*extern int do_cue __PR((track_t *trackp, void *cuep));*/ 1179 #endif 1180 1181 /* 1182 * subchan.c 1183 */ 1184 extern int do_leadin __PR((track_t *trackp)); 1185 #ifdef _SCG_SCSITRANSP_H 1186 extern int write_leadin __PR((SCSI *scgp, cdr_t *dp, track_t *trackp, int leadinstart)); 1187 extern int write_leadout __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); 1188 #endif 1189 extern void fillsubch __PR((track_t *trackp, Uchar *sp, int secno, int nsecs)); 1190 extern void filltpoint __PR((Uchar *sub, int ctrl_adr, int point, msf_t *mp)); 1191 extern void fillttime __PR((Uchar *sub, msf_t *mp)); 1192 extern void qpto96 __PR((Uchar *sub, Uchar *subq, int dop)); 1193 extern void addrw __PR((Uchar *sub, Uchar *subrwptr)); 1194 extern void qwto16 __PR((Uchar *subq, Uchar *subptr)); 1195 extern void subrecodesecs __PR((track_t *trackp, Uchar *bp, int address, int nsecs)); 1196 1197 /* 1198 * sector.c 1199 */ 1200 extern int encspeed __PR((BOOL be_verbose)); 1201 extern void encsectors __PR((track_t *trackp, Uchar *bp, int address, int nsecs)); 1202 extern void scrsectors __PR((track_t *trackp, Uchar *bp, int address, int nsecs)); 1203 extern void encodesector __PR((Uchar *sp, int sectype, int address)); 1204 extern void fillsector __PR((Uchar *sp, int sectype, int address)); 1205 1206 /* 1207 * clone.c 1208 */ 1209 extern void clone_toc __PR((track_t *trackp)); 1210 extern void clone_tracktype __PR((track_t *trackp)); 1211 1212 /* 1213 * cdtext.c 1214 */ 1215 extern BOOL checktextfile __PR((char *fname)); 1216 extern void packtext __PR((int tracks, track_t *trackp)); 1217 #ifdef _SCG_SCSITRANSP_H 1218 extern int write_cdtext __PR((SCSI *scgp, cdr_t *dp, long startsec)); 1219 #endif 1220 1221 /* 1222 * cue.c 1223 */ 1224 extern int parsecue __PR((char *cuefname, track_t trackp[])); 1225 #ifdef EOF /* stdio.h has been included */ 1226 extern void fparsecue __PR((FILE *f, track_t trackp[])); 1227 #endif 1228 1229 /* 1230 * vendor.c 1231 */ 1232 1233 /* 1234 * priv.c 1235 */ 1236 #ifdef CDDA2WAV 1237 extern void priv_init __PR((void)); 1238 extern void priv_on __PR((void)); 1239 extern void priv_off __PR((void)); 1240 #endif 1241 #if defined(CDRECORD) || defined(READCD) 1242 extern void priv_drop __PR((void)); 1243 extern BOOL priv_from_priv __PR((void)); 1244 #endif 1245 extern BOOL priv_eff_priv __PR((int pname)); 1246 #ifdef HAVE_SOLARIS_PPRIV 1247 extern void do_pfexec __PR((int ac, char *av[], ...)); 1248 #endif 1249