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