Annotation of sys/scsi/cd.h, Revision 1.1.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