[BACK]Return to cd.h CVS log [TXT][DIR] Up to [local] / sys / scsi

Annotation of sys/scsi/cd.h, Revision 1.1

1.1     ! nbrk        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

CVSweb