1 /*- 2 * Copyright (c) 1998 - 2006 Søren Schmidt <sos@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 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. 14 * 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. 25 * 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 $ 28 */ 29 30 #include <sys/param.h> 31 #include <sys/cdio.h> 32 #include <sys/devicestat.h> 33 34 /* CDROM Table Of Contents */ 35 #define MAXTRK 99 36 struct toc { 37 struct ioc_toc_header hdr; 38 struct cd_toc_entry tab[MAXTRK + 1]; 39 }; 40 41 /* DVD CSS authentication */ 42 struct dvd_miscauth { 43 u_int16_t length; 44 u_int16_t reserved; 45 u_int8_t data[2048]; 46 }; 47 48 /* CDROM Audio Control Parameters Page */ 49 struct audiopage { 50 /* mode page data header */ 51 u_int16_t data_length; 52 u_int8_t medium_type; 53 u_int8_t dev_spec; 54 u_int8_t unused[2]; 55 u_int16_t blk_desc_len; 56 57 /* audio control page */ 58 u_int8_t page_code; 59 #define ATAPI_CDROM_AUDIO_PAGE 0x0e 60 #define ATAPI_CDROM_AUDIO_PAGE_MASK 0x4e 61 62 u_int8_t param_len; 63 u_int8_t flags; 64 #define CD_PA_SOTC 0x02 65 #define CD_PA_IMMED 0x04 66 67 u_int8_t reserved3; 68 u_int8_t reserved4; 69 u_int8_t reserved5; 70 u_int16_t lb_per_sec; 71 struct port_control { 72 u_int8_t channels:4; 73 #define CHANNEL_0 1 74 #define CHANNEL_1 2 75 #define CHANNEL_2 4 76 #define CHANNEL_3 8 77 78 u_int8_t volume; 79 } port[4]; 80 }; 81 82 83 /* CDROM Capabilities and Mechanical Status Page */ 84 struct cappage { 85 /* mode page data header */ 86 u_int16_t data_length; 87 u_int8_t medium_type; 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 98 99 #define MST_TYPE_MASK_HIGH 0x70 100 #define MST_CDROM 0x00 101 #define MST_CDR 0x10 102 #define MST_CDRW 0x20 103 #define MST_DVD 0x40 104 105 #define MST_NO_DISC 0x70 106 #define MST_DOOR_OPEN 0x71 107 #define MST_FMT_ERROR 0x72 108 109 u_int8_t dev_spec; 110 u_int16_t unused; 111 u_int16_t blk_desc_len; 112 113 /* capabilities page */ 114 u_int8_t page_code; 115 #define ATAPI_CDROM_CAP_PAGE 0x2a 116 117 u_int8_t param_len; 118 119 u_int16_t media; 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 131 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 148 149 u_int8_t mechanism; 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 160 161 uint8_t audio; 162 #define MST_SEP_VOL 0x01 163 #define MST_SEP_MUTE 0x02 164 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 */ 169 170 u_int8_t reserved3; 171 u_int8_t misc; 172 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; 176 u_int16_t reserved4; 177 }; 178 179 /* CDROM Write Parameters Mode Page (Burners ONLY) */ 180 struct write_param { 181 /* mode page data header */ 182 u_int16_t data_length; 183 u_int8_t medium_type; 184 u_int8_t dev_spec; 185 u_int8_t unused[2]; 186 u_int16_t blk_desc_len; 187 188 /* write parameters page */ 189 u_int8_t page_code; 190 #define ATAPI_CDROM_WRITE_PARAMETERS_PAGE 0x05 191 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 198 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 209 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 217 218 u_int8_t datablock_type :4; /* data type code (see cdrio.h) */ 219 u_int8_t reserved4_4567 :4; 220 u_int8_t link_size; 221 u_int8_t reserved6; 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 228 229 u_int8_t reserved9; 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; 242 } __packed; 243 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 */ 249 u_int8_t reserved4; 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 */ 266 }; 267 268 /* Structure holding tracknode data for track devices */ 269 struct acd_tracknode { 270 cdev_t cdev; /* track device node */ 271 }; 272 273 /* Structure describing an ATAPI CDROM device */ 274 struct acd_softc { 275 int flags; /* device state flags */ 276 #define F_LOCKED 0x0001 /* this unit is locked */ 277 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 */ 292 }; 293