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

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