root/scsi/cd.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: cd.h,v 1.15 2007/05/27 01:15:32 mjc Exp $     */
    2 /*      $NetBSD: scsi_cd.h,v 1.6 1996/03/19 03:06:39 mycroft Exp $      */
    3 
    4 /*
    5  * Written by Julian Elischer (julian@tfs.com)
    6  * for TRW Financial Systems.
    7  *
    8  * TRW Financial Systems, in accordance with their agreement with Carnegie
    9  * Mellon University, makes this software available to CMU to distribute
   10  * or use in any manner that they see fit as long as this message is kept with 
   11  * the software. For this reason TFS also grants any other persons or
   12  * organisations permission to use or modify this software.
   13  *
   14  * TFS supplies this software to be publicly redistributed
   15  * on the understanding that TFS is not responsible for the correct
   16  * functioning of this software in any circumstances.
   17  *
   18  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
   19  */
   20 #ifndef _SCSI_CD_H
   21 #define _SCSI_CD_H 1
   22 
   23 /*
   24  *      Define two bits always in the same place in byte 2 (flag byte)
   25  */
   26 #define CD_RELADDR      0x01
   27 #define CD_MSF          0x02
   28 
   29 /*
   30  * SCSI command format
   31  */
   32 
   33 struct scsi_blank {
   34         u_int8_t opcode;
   35         u_int8_t byte2;
   36 #define BLANK_DISC      0
   37 #define BLANK_MINIMAL   1
   38         u_int8_t addr[4];
   39         u_int8_t unused[5];
   40         u_int8_t control;
   41 };
   42 
   43 struct scsi_close_track {
   44         u_int8_t opcode;
   45         u_int8_t flags;
   46 #define CT_IMMED        1
   47         u_int8_t closefunc;
   48 #define CT_CLOSE_TRACK  1
   49 #define CT_CLOSE_SESS   2
   50 #define CT_CLOSE_BORDER 3
   51         u_int8_t unused;
   52         u_int8_t track[2];
   53         u_int8_t unused1[3];
   54         u_int8_t control;
   55 };
   56 
   57 struct scsi_pause {
   58         u_int8_t opcode;
   59         u_int8_t byte2;
   60         u_int8_t unused[6];
   61         u_int8_t resume;
   62         u_int8_t control;
   63 };
   64 #define PA_PAUSE        1
   65 #define PA_RESUME       0
   66 
   67 struct scsi_play_msf {
   68         u_int8_t opcode;
   69         u_int8_t byte2;
   70         u_int8_t unused;
   71         u_int8_t start_m;
   72         u_int8_t start_s;
   73         u_int8_t start_f;
   74         u_int8_t end_m;
   75         u_int8_t end_s;
   76         u_int8_t end_f;
   77         u_int8_t control;
   78 };
   79 
   80 struct scsi_play_track {
   81         u_int8_t opcode;
   82         u_int8_t byte2;
   83         u_int8_t unused[2];
   84         u_int8_t start_track;
   85         u_int8_t start_index;
   86         u_int8_t unused1;
   87         u_int8_t end_track;
   88         u_int8_t end_index;
   89         u_int8_t control;
   90 };
   91 
   92 struct scsi_play {
   93         u_int8_t opcode;
   94         u_int8_t byte2;
   95         u_int8_t blk_addr[4];
   96         u_int8_t unused;
   97         u_int8_t xfer_len[2];
   98         u_int8_t control;
   99 };
  100 
  101 struct scsi_play_big {
  102         u_int8_t opcode;
  103         u_int8_t byte2; /* same as above */
  104         u_int8_t blk_addr[4];
  105         u_int8_t xfer_len[4];
  106         u_int8_t unused;
  107         u_int8_t control;
  108 };
  109 
  110 struct scsi_play_rel_big {
  111         u_int8_t opcode;
  112         u_int8_t byte2; /* same as above */
  113         u_int8_t blk_addr[4];
  114         u_int8_t xfer_len[4];
  115         u_int8_t track;
  116         u_int8_t control;
  117 };
  118 
  119 struct scsi_read_header {
  120         u_int8_t opcode;
  121         u_int8_t byte2;
  122         u_int8_t blk_addr[4];
  123         u_int8_t unused;
  124         u_int8_t data_len[2];
  125         u_int8_t control;
  126 };
  127 
  128 struct scsi_read_subchannel {
  129         u_int8_t opcode;
  130         u_int8_t byte2;
  131         u_int8_t byte3;
  132 #define SRS_SUBQ        0x40
  133         u_int8_t subchan_format;
  134         u_int8_t unused[2];
  135         u_int8_t track;
  136         u_int8_t data_len[2];
  137         u_int8_t control;
  138 };
  139 
  140 struct scsi_read_toc {
  141         u_int8_t opcode;
  142         u_int8_t byte2;
  143         u_int8_t unused[4];
  144         u_int8_t from_track;
  145         u_int8_t data_len[2];
  146         u_int8_t control;
  147 };
  148 
  149 struct scsi_read_track_info {
  150         u_int8_t opcode;
  151         u_int8_t addrtype;
  152 #define RTI_LBA         0
  153 #define RTI_TRACK       1
  154 #define RTI_BORDER      2
  155         u_int8_t addr[4];
  156         u_int8_t unused;
  157         u_int8_t data_len[2];
  158         u_int8_t control;
  159 };
  160 
  161 struct scsi_read_cd_capacity {
  162         u_int8_t opcode;
  163         u_int8_t byte2;
  164         u_int8_t addr[4];
  165         u_int8_t unused[3];
  166         u_int8_t control;
  167 };
  168 
  169 struct scsi_load_unload {
  170         u_int8_t opcode;
  171         u_int8_t reserved;
  172 #define IMMED   0x1
  173         u_int8_t reserved2[2];
  174         u_int8_t options;
  175 #define START   0x1
  176 #define LOUNLO  0x2
  177         u_int8_t reserved4[3];
  178         u_int8_t slot;
  179         u_int8_t reserved5[2];
  180         u_int8_t control;
  181 };
  182 
  183 struct scsi_set_cd_speed {
  184         u_int8_t opcode;
  185         u_int8_t rotation;
  186 #define ROTATE_CLV 0
  187 #define ROTATE_CAV 1
  188         u_int8_t read[2];
  189         u_int8_t write[2];
  190         u_int8_t reserved[5];
  191         u_int8_t control;
  192 };
  193 
  194 /*
  195  * Opcodes
  196  */
  197 
  198 #define READ_CD_CAPACITY        0x25    /* slightly different from disk */
  199 #define READ_SUBCHANNEL         0x42    /* cdrom read Subchannel */
  200 #define READ_TOC                0x43    /* cdrom read TOC */
  201 #define READ_HEADER             0x44    /* cdrom read header */
  202 #define PLAY                    0x45    /* cdrom play  'play audio' mode */
  203 #define PLAY_MSF                0x47    /* cdrom play Min,Sec,Frames mode */
  204 #define PLAY_TRACK              0x48    /* cdrom play track/index mode */
  205 #define PLAY_TRACK_REL          0x49    /* cdrom play track/index mode */
  206 #define PAUSE                   0x4b    /* cdrom pause in 'play audio' mode */
  207 #define READ_TRACK_INFO         0x52    /* read track/rzone info */
  208 #define CLOSE_TRACK             0x5b    /* close track/rzone/session/border */
  209 #define BLANK                   0xa1    /* cdrom blank */
  210 #define PLAY_BIG                0xa5    /* cdrom pause in 'play audio' mode */
  211 #define LOAD_UNLOAD             0xa6    /* cdrom load/unload media */
  212 #define PLAY_TRACK_REL_BIG      0xa9    /* cdrom play track/index mode */
  213 #define SET_CD_SPEED            0xbb    /* set cdrom read/write speed */
  214 
  215 /*
  216  * Mode pages
  217  */
  218 
  219 #define ERR_RECOVERY_PAGE       0x01
  220 #define WRITE_PARAM_PAGE        0x05
  221 #define CDVD_CAPABILITIES_PAGE  0x2a
  222 
  223 struct scsi_read_cd_cap_data {
  224         u_int8_t addr[4];
  225         u_int8_t length[4];
  226 };
  227 
  228 struct cd_audio_page {
  229         u_int8_t page_code;
  230 #define CD_PAGE_CODE    0x3F
  231 #define AUDIO_PAGE      0x0e
  232 #define CD_PAGE_PS      0x80
  233         u_int8_t param_len;
  234         u_int8_t flags;
  235 #define         CD_PA_SOTC      0x02
  236 #define         CD_PA_IMMED     0x04
  237         u_int8_t unused[2];
  238         u_int8_t format_lba;
  239 #define         CD_PA_FORMAT_LBA        0x0F
  240 #define         CD_PA_APR_VALID 0x80
  241         u_int8_t lb_per_sec[2];
  242         struct  port_control {
  243                 u_int8_t channels;
  244 #define CHANNEL 0x0F
  245 #define CHANNEL_0 1
  246 #define CHANNEL_1 2
  247 #define CHANNEL_2 4
  248 #define CHANNEL_3 8
  249 #define LEFT_CHANNEL    CHANNEL_0
  250 #define RIGHT_CHANNEL   CHANNEL_1
  251 #define MUTE_CHANNEL    0x0
  252 #define BOTH_CHANNEL    LEFT_CHANNEL | RIGHT_CHANNEL
  253                 u_int8_t volume;
  254         } port[4];
  255 #define LEFT_PORT       0
  256 #define RIGHT_PORT      1
  257 };
  258 
  259 /*
  260  * There are 2352 bytes in a CD digital audio frame.  One frame is 1/75 of a
  261  * second, at 44.1kHz sample rate, 16 bits/sample, 2 channels.
  262  *
  263  * The frame data have the two channels interleaved, with the left
  264  * channel first.  Samples are little endian 16-bit signed values.
  265  */
  266 #define CD_DA_BLKSIZ            2352    /* # bytes in CD-DA frame */
  267 #define CD_NORMAL_DENSITY_CODE  0x00    /* from Toshiba CD-ROM specs */
  268 #define CD_DA_DENSITY_CODE      0x82    /* from Toshiba CD-ROM specs */
  269 
  270 #define CDRETRIES       4
  271 
  272 struct scsi_read_dvd_structure {
  273         u_int8_t        opcode;         /* GPCMD_READ_DVD_STRUCTURE */
  274         u_int8_t        reserved;
  275         u_int8_t        address[4];
  276         u_int8_t        layer;
  277         u_int8_t        format;
  278         u_int8_t        length[2];
  279         u_int8_t        agid;           /* bottom 6 bits reserved */
  280         u_int8_t        control;
  281 };
  282 
  283 struct scsi_read_dvd_structure_data {
  284         u_int8_t        len[2];         /* Big-endian length of valid data. */
  285         u_int8_t        reserved[2];
  286         u_int8_t        data[2048];
  287 };
  288 
  289 #ifdef _KERNEL
  290 
  291 struct cd_softc {
  292         struct device sc_dev;
  293         struct disk sc_dk;
  294 
  295         int flags;
  296 #define CDF_LOCKED      0x01
  297 #define CDF_WANTED      0x02
  298 #define CDF_WLABEL      0x04            /* label is writable */
  299 #define CDF_LABELLING   0x08            /* writing label */
  300 #define CDF_ANCIENT     0x10            /* disk is ancient; for minphys */
  301 #ifdef CDDA
  302 #define CDF_CDDA        0x20
  303 #endif
  304         struct scsi_link *sc_link;      /* contains our targ, lun, etc. */
  305         struct cd_parms {
  306                 int blksize;
  307                 u_long disksize;        /* total number sectors */
  308         } params;
  309 #ifdef CDDA
  310         struct cd_parms orig_params;    /* filled in when CD-DA mode starts */
  311 #endif
  312         struct buf buf_queue;
  313         struct timeout sc_timeout;
  314         void *sc_cdpwrhook;             /* our power hook */
  315 };
  316 
  317 #endif /* _KERNEL */
  318 #endif

/* [<][>][^][v][top][bottom][index][help] */