2 * Copyright (c) 1998 - 2006 Søren Schmidt <sos@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 * $FreeBSD: src/sys/dev/ata/atapi-cd.h,v 1.45 2006/01/05 21:27:19 sos Exp $
27 * $DragonFly: src/sys/dev/disk/nata/atapi-cd.h,v 1.3 2007/11/20 09:25:21 hasso Exp $
30 #include <sys/param.h>
32 #include <sys/devicestat.h>
34 /* CDROM Table Of Contents */
37 struct ioc_toc_header hdr;
38 struct cd_toc_entry tab[MAXTRK + 1];
41 /* DVD CSS authentication */
48 /* CDROM Audio Control Parameters Page */
50 /* mode page data header */
51 u_int16_t data_length;
55 u_int16_t blk_desc_len;
57 /* audio control page */
59 #define ATAPI_CDROM_AUDIO_PAGE 0x0e
60 #define ATAPI_CDROM_AUDIO_PAGE_MASK 0x4e
64 #define CD_PA_SOTC 0x02
65 #define CD_PA_IMMED 0x04
83 /* CDROM Capabilities and Mechanical Status Page */
85 /* mode page data header */
86 u_int16_t data_length;
88 #define MST_TYPE_MASK_LOW 0x0f
89 #define MST_FMT_NONE 0x00
90 #define MST_DATA_120 0x01
91 #define MST_AUDIO_120 0x02
92 #define MST_COMB_120 0x03
93 #define MST_PHOTO_120 0x04
94 #define MST_DATA_80 0x05
95 #define MST_AUDIO_80 0x06
96 #define MST_COMB_80 0x07
97 #define MST_PHOTO_80 0x08
99 #define MST_TYPE_MASK_HIGH 0x70
100 #define MST_CDROM 0x00
102 #define MST_CDRW 0x20
105 #define MST_NO_DISC 0x70
106 #define MST_DOOR_OPEN 0x71
107 #define MST_FMT_ERROR 0x72
111 u_int16_t blk_desc_len;
113 /* capabilities page */
115 #define ATAPI_CDROM_CAP_PAGE 0x2a
120 #define MST_READ_CDR 0x0001
121 #define MST_READ_CDRW 0x0002
122 #define MST_READ_PACKET 0x0004
123 #define MST_READ_DVDROM 0x0008
124 #define MST_READ_DVDR 0x0010
125 #define MST_READ_DVDRAM 0x0020
126 #define MST_WRITE_CDR 0x0100
127 #define MST_WRITE_CDRW 0x0200
128 #define MST_WRITE_TEST 0x0400
129 #define MST_WRITE_DVDR 0x1000
130 #define MST_WRITE_DVDRAM 0x2000
132 u_int16_t capabilities;
133 #define MST_AUDIO_PLAY 0x0001
134 #define MST_COMPOSITE 0x0002
135 #define MST_AUDIO_P1 0x0004
136 #define MST_AUDIO_P2 0x0008
137 #define MST_MODE2_f1 0x0010
138 #define MST_MODE2_f2 0x0020
139 #define MST_MULTISESSION 0x0040
140 #define MST_BURNPROOF 0x0080
141 #define MST_READ_CDDA 0x0100
142 #define MST_CDDA_STREAM 0x0200
143 #define MST_COMBINED_RW 0x0400
144 #define MST_CORRECTED_RW 0x0800
145 #define MST_SUPPORT_C2 0x1000
146 #define MST_ISRC 0x2000
147 #define MST_UPC 0x4000
150 #define MST_LOCKABLE 0x01
151 #define MST_LOCKED 0x02
152 #define MST_PREVENT 0x04
153 #define MST_EJECT 0x08
154 #define MST_MECH_MASK 0xe0
155 #define MST_MECH_CADDY 0x00
156 #define MST_MECH_TRAY 0x20
157 #define MST_MECH_POPUP 0x40
158 #define MST_MECH_CHANGER 0x80
159 #define MST_MECH_CARTRIDGE 0xa0
162 #define MST_SEP_VOL 0x01
163 #define MST_SEP_MUTE 0x02
165 u_int16_t max_read_speed; /* max raw data rate in bytes/1000 */
166 u_int16_t max_vol_levels; /* number of discrete volume levels */
167 u_int16_t buf_size; /* internal buffer size in bytes/1024 */
168 u_int16_t cur_read_speed; /* current data rate in bytes/1000 */
173 u_int16_t max_write_speed; /* max raw data rate in bytes/1000 */
174 u_int16_t cur_write_speed; /* current data rate in bytes/1000 */
175 u_int16_t copy_protect_rev;
179 /* CDROM Write Parameters Mode Page (Burners ONLY) */
181 /* mode page data header */
182 u_int16_t data_length;
183 u_int8_t medium_type;
186 u_int16_t blk_desc_len;
188 /* write parameters page */
190 #define ATAPI_CDROM_WRITE_PARAMETERS_PAGE 0x05
192 u_int8_t page_length; /* 0x32 */
193 u_int8_t write_type :4; /* write stream type */
194 #define CDR_WTYPE_PACKET 0x00
195 #define CDR_WTYPE_TRACK 0x01
196 #define CDR_WTYPE_SESSION 0x02
197 #define CDR_WTYPE_RAW 0x03
199 u_int8_t test_write :1; /* test write enable */
200 u_int8_t link_size_valid :1;
201 u_int8_t burnproof :1; /* BurnProof enable */
202 u_int8_t reserved2_7 :1;
203 u_int8_t track_mode :4; /* track mode */
204 #define CDR_TMODE_AUDIO 0x00
205 #define CDR_TMODE_AUDIO_PREEMP 0x01
206 #define CDR_TMODE_ALLOW_COPY 0x02
207 #define CDR_TMODE_DATA 0x04
208 #define CDR_TMODE_QUAD_AUDIO 0x08
210 u_int8_t copy :1; /* generation stamp */
211 u_int8_t fp :1; /* fixed packet type */
212 u_int8_t session_type :2; /* session type */
213 #define CDR_SESS_NONE 0x00
214 #define CDR_SESS_FINAL 0x01
215 #define CDR_SESS_RESERVED 0x02
216 #define CDR_SESS_MULTI 0x03
218 u_int8_t datablock_type :4; /* data type code (see cdrio.h) */
219 u_int8_t reserved4_4567 :4;
222 u_int8_t host_app_code :6; /* host application code */
223 u_int8_t reserved7_67 :2;
224 u_int8_t session_format; /* session format */
225 #define CDR_SESS_CDROM 0x00
226 #define CDR_SESS_CDI 0x10
227 #define CDR_SESS_CDROM_XA 0x20
230 u_int32_t packet_size; /* packet size in bytes */
231 u_int16_t audio_pause_length; /* audio pause length in secs */
232 u_int8_t media_catalog_number[16];
233 u_int8_t isr_code[16];
234 u_int8_t sub_hdr_byte0;
235 u_int8_t sub_hdr_byte1;
236 u_int8_t sub_hdr_byte2;
237 u_int8_t sub_hdr_byte3;
238 u_int8_t vendor_specific_byte0;
239 u_int8_t vendor_specific_byte1;
240 u_int8_t vendor_specific_byte2;
241 u_int8_t vendor_specific_byte3;
244 /* CDROM Read Track Information structure */
245 struct acd_track_info {
246 u_int16_t data_length;
247 u_int8_t track_number; /* current track number */
248 u_int8_t session_number; /* current session number */
250 u_int8_t track_mode :4; /* mode of this track */
251 u_int8_t copy :1; /* generation stamp */
252 u_int8_t damage :1; /* damaged track */
253 u_int8_t reserved5_67 :2;
254 u_int8_t data_mode :4; /* data mode of this disc */
255 u_int8_t fp :1; /* fixed packet */
256 u_int8_t packet :1; /* packet track */
257 u_int8_t blank :1; /* blank (empty) track */
258 u_int8_t rt :1; /* reserved track */
259 u_int8_t nwa_valid :1; /* next_writeable_addr field valid */
260 u_int8_t reserved7_17 :7;
261 u_int track_start_addr; /* start of this track */
262 u_int next_writeable_addr; /* next writeable addr on this disc */
263 u_int free_blocks; /* free block on this disc */
264 u_int fixed_packet_size; /* size of packets on this track */
265 u_int track_length; /* length of this track */
268 /* Structure holding tracknode data for track devices */
269 struct acd_tracknode {
270 cdev_t cdev; /* track device node */
273 /* Structure describing an ATAPI CDROM device */
275 int flags; /* device state flags */
276 #define F_LOCKED 0x0001 /* this unit is locked */
278 struct toc toc; /* table of disc contents */
279 struct audiopage au; /* audio page info */
280 struct audiopage aumask; /* audio page mask */
281 struct cappage cap; /* capabilities page info */
282 struct cd_sub_channel_info subchan; /* subchannel info */
283 int slot; /* this instance slot number */
284 time_t timestamp; /* this instance timestamp */
285 u_int32_t disk_size; /* size of current media */
286 u_int32_t block_size; /* blocksize currently used */
287 u_int32_t iomax; /* Max I/O request (bytes) */
288 struct disk disk; /* disk management */
289 struct devstat stats; /* devstat entry */
290 cdev_t cdev; /* device placeholder */
291 struct acd_tracknode *track[MAXTRK+1]; /* tracks */