root/include/linux/cdrom.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * -- <linux/cdrom.h>
   3  * general (not only SCSI) header library for linux CDROM drivers
   4  * (C) 1992         David Giller rafetmad@oxy.edu
   5  *     1994, 1995   Eberhard Moenkeberg emoenke@gwdg.de
   6  *
   7  */
   8 
   9 #ifndef _LINUX_CDROM_H
  10 #define _LINUX_CDROM_H
  11 
  12 /*
  13  * some fix numbers
  14  */
  15 #define CD_MINS             74 /* max. minutes per CD, not really a limit */
  16 #define CD_SECS             60 /* seconds per minute */
  17 #define CD_FRAMES           75 /* frames per second */
  18 
  19 #define CD_SYNC_SIZE        12 /* 12 sync bytes per raw data frame, not transfered by the drive */
  20 #define CD_HEAD_SIZE         4 /* header (address) bytes per raw data frame */
  21 #define CD_SUBHEAD_SIZE      8 /* subheader bytes per raw XA data frame */
  22 #define CD_XA_HEAD        (CD_HEAD_SIZE+CD_SUBHEAD_SIZE) /* "before data" part of raw XA frame */
  23 #define CD_XA_SYNC_HEAD   (CD_SYNC_SIZE+CD_XA_HEAD)/* sync bytes + header of XA frame */
  24 
  25 #define CD_FRAMESIZE      2048 /* bytes per frame, "cooked" mode */
  26 #define CD_FRAMESIZE_RAW  2352 /* bytes per frame, "raw" mode */
  27 /* most drives don't deliver everything: */
  28 #define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE) /* 2340 */
  29 #define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE) /* 2336 */
  30 /* Optics drive also has a 'read all' mode: */
  31 #define CD_FRAMESIZE_RAWER 2646 /* bytes per frame */
  32 
  33 #define CD_EDC_SIZE         4 /* bytes EDC per most raw data frame types */
  34 #define CD_ZERO_SIZE        8 /* bytes zero per yellow book mode 1 frame */
  35 #define CD_ECC_SIZE       276 /* bytes ECC per most raw data frame types */
  36 #define CD_XA_TAIL        (CD_EDC_SIZE+CD_ECC_SIZE) /* "after data" part of raw XA frame */
  37 
  38 #define CD_FRAMESIZE_SUB    96 /* subchannel data "frame" size */
  39 #define CD_MSF_OFFSET      150 /* MSF numbering offset of first frame */
  40 
  41 #define CD_CHUNK_SIZE       24 /* lowest-level "data bytes piece" */
  42 #define CD_NUM_OF_CHUNKS    98 /* chunks per frame */
  43 
  44 #define CD_FRAMESIZE_XA CD_FRAMESIZE_RAW1 /* obsolete name */
  45 #define CD_BLOCK_OFFSET    CD_MSF_OFFSET /* obsolete name */
  46 
  47 /*
  48  * the raw frame layout:
  49  *
  50  * - audio (red):                  | audio_sample_bytes |
  51  *                                 |        2352        |
  52  *
  53  * - data (yellow, mode1):         | sync - head - data - EDC - zero - ECC |
  54  *                                 |  12  -   4  - 2048 -  4  -   8  - 276 |
  55  *
  56  * - data (yellow, mode2):         | sync - head - data |
  57  *                                 |  12  -   4  - 2336 |
  58  *
  59  * - XA data (green, mode2 form1): | sync - head - sub - data - EDC - ECC |
  60  *                                 |  12  -   4  -  8  - 2048 -  4  - 276 |
  61  *
  62  * - XA data (green, mode2 form2): | sync - head - sub - data - EDC |
  63  *                                 |  12  -   4  -  8  - 2324 -  4  |
  64  */
  65 
  66 /*
  67  * CDROM IOCTL structures
  68  */
  69 
  70 struct cdrom_blk 
  71 {
  72         unsigned from;
  73         unsigned short len;
  74 };
  75 
  76 
  77 struct cdrom_msf 
  78 {
  79         u_char  cdmsf_min0;     /* start minute */
  80         u_char  cdmsf_sec0;     /* start second */
  81         u_char  cdmsf_frame0;   /* start frame */
  82         u_char  cdmsf_min1;     /* end minute */
  83         u_char  cdmsf_sec1;     /* end second */
  84         u_char  cdmsf_frame1;   /* end frame */
  85 };
  86 
  87 struct cdrom_ti 
  88 {
  89         u_char  cdti_trk0;      /* start track */
  90         u_char  cdti_ind0;      /* start index */
  91         u_char  cdti_trk1;      /* end track */
  92         u_char  cdti_ind1;      /* end index */
  93 };
  94 
  95 struct cdrom_tochdr     
  96 {
  97         u_char  cdth_trk0;      /* start track */
  98         u_char  cdth_trk1;      /* end track */
  99 };
 100 
 101 struct cdrom_msf0               /* address in MSF format */
 102 {
 103         u_char  minute;
 104         u_char  second;
 105         u_char  frame;
 106 };
 107 
 108 union cdrom_addr                /* address in either MSF or logical format */
 109 {
 110         struct cdrom_msf0       msf;
 111         int                     lba;
 112 };
 113 
 114 struct cdrom_tocentry 
 115 {
 116         u_char  cdte_track;
 117         u_char  cdte_adr        :4;
 118         u_char  cdte_ctrl       :4;
 119         u_char  cdte_format;
 120         union cdrom_addr cdte_addr;
 121         u_char  cdte_datamode;
 122 };
 123 
 124 /*
 125  * CD-ROM address types (cdrom_tocentry.cdte_format)
 126  */
 127 #define CDROM_LBA 0x01 /* "logical block": first frame is #0 */
 128 #define CDROM_MSF 0x02 /* "minute-second-frame": binary, not bcd here! */
 129 
 130 /*
 131  * bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl)
 132  */
 133 #define CDROM_DATA_TRACK        0x04
 134 
 135 /*
 136  * The leadout track is always 0xAA, regardless of # of tracks on disc
 137  */
 138 #define CDROM_LEADOUT   0xAA
 139 
 140 struct cdrom_subchnl 
 141 {
 142         u_char  cdsc_format;
 143         u_char  cdsc_audiostatus;
 144         u_char  cdsc_adr:       4;
 145         u_char  cdsc_ctrl:      4;
 146         u_char  cdsc_trk;
 147         u_char  cdsc_ind;
 148         union cdrom_addr cdsc_absaddr;
 149         union cdrom_addr cdsc_reladdr;
 150 };
 151 
 152 struct cdrom_mcn {
 153   u_char medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */
 154 };
 155 
 156 /*
 157  * audio states (from SCSI-2, but seen with other drives, too)
 158  */
 159 #define CDROM_AUDIO_INVALID     0x00    /* audio status not supported */
 160 #define CDROM_AUDIO_PLAY        0x11    /* audio play operation in progress */
 161 #define CDROM_AUDIO_PAUSED      0x12    /* audio play operation paused */
 162 #define CDROM_AUDIO_COMPLETED   0x13    /* audio play successfully completed */
 163 #define CDROM_AUDIO_ERROR       0x14    /* audio play stopped due to error */
 164 #define CDROM_AUDIO_NO_STATUS   0x15    /* no current audio status to return */
 165 
 166 struct cdrom_volctrl
 167 {
 168         u_char  channel0;
 169         u_char  channel1;
 170         u_char  channel2;
 171         u_char  channel3;
 172 };
 173 
 174 struct cdrom_read      
 175 {
 176         int     cdread_lba;
 177         caddr_t cdread_bufaddr;
 178         int     cdread_buflen;
 179 };
 180 
 181 /*
 182  * extensions for transferring audio frames
 183  * currently used by sbpcd.c, cdu31a.c, ide-cd.c
 184  */
 185 struct cdrom_read_audio
 186 {
 187         union cdrom_addr addr; /* frame address */
 188         u_char addr_format; /* CDROM_LBA or CDROM_MSF */
 189         int nframes; /* number of 2352-byte-frames to read at once, limited by the drivers */
 190         u_char *buf; /* frame buffer (size: nframes*2352 bytes) */
 191 };
 192 
 193 /*
 194  * this has to be the "arg" of the CDROMMULTISESSION ioctl
 195  * for obtaining multi session info.
 196  * The returned "addr" is valid only if "xa_flag" is true.
 197  */
 198 struct cdrom_multisession
 199 {
 200         union cdrom_addr addr; /* frame address: start-of-last-session (not the new "frame 16"!)*/
 201         u_char xa_flag; /* 1: "is XA disk" */
 202         u_char addr_format; /* CDROM_LBA or CDROM_MSF */
 203 };
 204 
 205 #ifdef FIVETWELVE
 206 #define CDROM_MODE1_SIZE        512
 207 #else
 208 #define CDROM_MODE1_SIZE        2048
 209 #endif FIVETWELVE
 210 #define CDROM_MODE2_SIZE        2336
 211 
 212 /*
 213  * CD-ROM IOCTL commands
 214  * For IOCTL calls, we will commandeer byte 0x53, or 'S'.
 215  */
 216 
 217 #define CDROMPAUSE              0x5301
 218 #define CDROMRESUME             0x5302
 219 #define CDROMPLAYMSF            0x5303  /* (struct cdrom_msf) */
 220 #define CDROMPLAYTRKIND         0x5304  /* (struct cdrom_ti) */
 221 
 222 #define CDROMREADTOCHDR         0x5305  /* (struct cdrom_tochdr) */
 223 #define CDROMREADTOCENTRY       0x5306  /* (struct cdrom_tocentry) */
 224 
 225 #define CDROMSTOP               0x5307  /* stop the drive motor */
 226 #define CDROMSTART              0x5308  /* turn the motor on */
 227 
 228 #define CDROMEJECT              0x5309  /* eject CD-ROM media */
 229 
 230 #define CDROMVOLCTRL            0x530a  /* (struct cdrom_volctrl) */
 231 
 232 #define CDROMSUBCHNL            0x530b  /* (struct cdrom_subchnl) */
 233 
 234 #define CDROMREADMODE2          0x530c  /* (struct cdrom_read) */
 235                                           /* read type-2 data */
 236 
 237 #define CDROMREADMODE1          0x530d  /* (struct cdrom_read) */
 238                                           /* read type-1 data */
 239 
 240 #define CDROMREADAUDIO          0x530e  /* (struct cdrom_read_audio) */
 241 
 242 /*
 243  * enable (1) / disable (0) auto-ejecting
 244  */
 245 #define CDROMEJECT_SW           0x530f  /* arg: 0 or 1 */
 246  
 247 /*
 248  * obtain the start-of-last-session address of multi session disks
 249  */
 250 #define CDROMMULTISESSION       0x5310  /* (struct cdrom_multisession) */
 251 
 252 /*
 253  * obtain the "universal product code" number
 254  * (only some data disks have it coded)
 255  */
 256 #define CDROM_GET_UPC           0x5311  /* 8 bytes returned */
 257 
 258 #define CDROMRESET              0x5312  /* hard-reset the drive */
 259 #define CDROMVOLREAD            0x5313  /* let the drive tell its volume setting */
 260                                         /* (struct cdrom_volctrl) */
 261 
 262 /* 
 263  * these ioctls are used in aztcd.c and optcd.c
 264  */
 265 #define CDROMREADRAW            0x5314  /* read data in raw mode */
 266 #define CDROMREADCOOKED         0x5315  /* read data in cooked mode */
 267 #define CDROMSEEK               0x5316  /* seek msf address */
 268   
 269 /*
 270  * for playing audio in logical block addressing mode
 271  */
 272 #define CDROMPLAYBLK            0x5317  /* (struct cdrom_blk) */
 273 
 274 /* 
 275  * these ioctls are used in optcd.c
 276  */
 277 #define CDROMREADALL            0x5318  /* read all 2646 bytes */
 278 #define CDROMCLOSETRAY          0x5319  /* pendant of CDROMEJECT */
 279 
 280 
 281 /*
 282  * CD-ROM-specific SCSI command opcodes
 283  */
 284 
 285 /*
 286  * Group 2 (10-byte).  All of these are called 'optional' by SCSI-II.
 287  */
 288 #define SCMD_READ_TOC           0x43    /* read table of contents */
 289 #define SCMD_PLAYAUDIO_MSF      0x47    /* play data at time offset */
 290 #define SCMD_PLAYAUDIO_TI       0x48    /* play data at track/index */
 291 #define SCMD_PAUSE_RESUME       0x4B    /* pause/resume audio */
 292 #define SCMD_READ_SUBCHANNEL    0x42    /* read SC info on playing disc */
 293 #define SCMD_PLAYAUDIO10        0x45    /* play data at logical block */
 294 #define SCMD_READ_HEADER        0x44    /* read TOC header */
 295 
 296 /*
 297  * Group 5
 298  */
 299 #define SCMD_PLAYAUDIO12        0xA5    /* play data at logical block */
 300 #define SCMD_PLAYTRACK_REL12    0xA9    /* play track at relative offset */
 301 
 302 /*
 303  * Group 6 Commands
 304  */
 305 #define SCMD_CD_PLAYBACK_CONTROL 0xC9   /* Sony vendor-specific audio */
 306 #define SCMD_CD_PLAYBACK_STATUS 0xC4    /* control opcodes */
 307 
 308 /*
 309  * CD-ROM capacity structure.
 310  */
 311 struct scsi_capacity 
 312 {
 313         u_long  capacity;
 314         u_long  lbasize;
 315 };
 316 
 317 /*
 318  * CD-ROM MODE_SENSE/MODE_SELECT parameters
 319  */
 320 #define ERR_RECOVERY_PARMS      0x01
 321 #define DISCO_RECO_PARMS        0x02
 322 #define FORMAT_PARMS            0x03
 323 #define GEOMETRY_PARMS          0x04
 324 #define CERTIFICATION_PARMS     0x06
 325 #define CACHE_PARMS             0x38
 326 
 327 /*
 328  * standard mode-select header prepended to all mode-select commands
 329  */
 330 struct ccs_modesel_head 
 331 {
 332         u_char  _r1;    /* reserved */
 333         u_char  medium; /* device-specific medium type */
 334         u_char  _r2;    /* reserved */
 335         u_char  block_desc_length; /* block descriptor length */
 336         u_char  density; /* device-specific density code */
 337         u_char  number_blocks_hi; /* number of blocks in this block desc */
 338         u_char  number_blocks_med;
 339         u_char  number_blocks_lo;
 340         u_char  _r3;
 341         u_char  block_length_hi; /* block length for blocks in this desc */
 342         u_short block_length;
 343 };
 344 
 345 /*
 346  * error recovery parameters
 347  */
 348 struct ccs_err_recovery 
 349 {
 350         u_char  _r1 : 2;        /* reserved */
 351         u_char  page_code : 6;  /* page code */
 352         u_char  page_length;    /* page length */
 353         u_char  awre    : 1;    /* auto write realloc enabled */
 354         u_char  arre    : 1;    /* auto read realloc enabled */
 355         u_char  tb      : 1;    /* transfer block */
 356         u_char  rc      : 1;    /* read continuous */
 357         u_char  eec     : 1;    /* enable early correction */
 358         u_char  per     : 1;    /* post error */
 359         u_char  dte     : 1;    /* disable transfer on error */
 360         u_char  dcr     : 1;    /* disable correction */
 361         u_char  retry_count;    /* error retry count */
 362         u_char  correction_span; /* largest recov. to be attempted, bits */
 363         u_char  head_offset_count; /* head offset (2's C) for each retry */
 364         u_char  strobe_offset_count; /* data strobe */
 365         u_char  recovery_time_limit; /* time limit on recovery attempts */
 366 };
 367 
 368 /*
 369  * disco/reco parameters
 370  */
 371 struct ccs_disco_reco 
 372 {
 373         u_char  _r1     : 2;    /* reserved */
 374         u_char  page_code : 6;  /* page code */
 375         u_char  page_length;    /* page length */
 376         u_char  buffer_full_ratio; /* write buffer reconnect threshold */
 377         u_char  buffer_empty_ratio; /* read */
 378         u_short bus_inactivity_limit; /* limit on bus inactivity time */
 379         u_short disconnect_time_limit; /* minimum disconnect time */
 380         u_short connect_time_limit; /* minimum connect time */
 381         u_short _r2;            /* reserved */
 382 };
 383 
 384 /*
 385  * drive geometry parameters
 386  */
 387 struct ccs_geometry 
 388 {
 389         u_char  _r1     : 2;    /* reserved */
 390         u_char  page_code : 6;  /* page code */
 391         u_char  page_length;    /* page length */
 392         u_char  cyl_ub;         /* #cyls */
 393         u_char  cyl_mb;
 394         u_char  cyl_lb;
 395         u_char  heads;          /* #heads */
 396         u_char  precomp_cyl_ub; /* precomp start */
 397         u_char  precomp_cyl_mb;
 398         u_char  precomp_cyl_lb;
 399         u_char  current_cyl_ub; /* reduced current start */
 400         u_char  current_cyl_mb;
 401         u_char  current_cyl_lb;
 402         u_short step_rate;      /* stepping motor rate */
 403         u_char  landing_cyl_ub; /* landing zone */
 404         u_char  landing_cyl_mb;
 405         u_char  landing_cyl_lb;
 406         u_char  _r2;
 407         u_char  _r3;
 408         u_char  _r4;
 409 };
 410 
 411 /*
 412  * cache parameters
 413  */
 414 struct ccs_cache 
 415 {
 416         u_char  _r1     : 2;    /* reserved */
 417         u_char  page_code : 6;  /* page code */
 418         u_char  page_length;    /* page length */
 419         u_char  mode;           /* cache control byte */
 420         u_char  threshold;      /* prefetch threshold */
 421         u_char  max_prefetch;   /* maximum prefetch size */
 422         u_char  max_multiplier; /* maximum prefetch multiplier */
 423         u_char  min_prefetch;   /* minimum prefetch size */
 424         u_char  min_multiplier; /* minimum prefetch multiplier */
 425         u_char  _r2[8];
 426 };
 427 
 428 #endif  _LINUX_CDROM_H
 429 /*==========================================================================*/
 430 /*
 431  * Overrides for Emacs so that we follow Linus's tabbing style.
 432  * Emacs will notice this stuff at the end of the file and automatically
 433  * adjust the settings for this buffer only.  This must remain at the end
 434  * of the file. 
 435  * ---------------------------------------------------------------------------
 436  * Local variables:
 437  * c-indent-level: 8
 438  * c-brace-imaginary-offset: 0
 439  * c-brace-offset: -8
 440  * c-argdecl-indent: 8
 441  * c-label-offset: -8
 442  * c-continued-statement-offset: 8
 443  * c-continued-brace-offset: 0
 444  * End:
 445  */

/* [previous][next][first][last][top][bottom][index][help] */