1/*- 2 * Copyright (c) 1998 - 2008 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$ 27 */ 28 29/* CDROM Table Of Contents */ 30#define MAXTRK 99 31struct toc { 32 struct ioc_toc_header hdr; 33 struct cd_toc_entry tab[MAXTRK + 1]; 34}; 35 36/* DVD CSS authentication */ 37struct dvd_miscauth { 38 u_int16_t length; 39 u_int16_t reserved; 40 u_int8_t data[2048]; 41}; 42 43/* CDROM Audio Control Parameters Page */ 44struct audiopage { 45 /* mode page data header */ 46 u_int16_t data_length; 47 u_int8_t medium_type; 48 u_int8_t dev_spec; 49 u_int8_t unused[2]; 50 u_int16_t blk_desc_len; 51 52 /* audio control page */ 53 u_int8_t page_code; 54#define ATAPI_CDROM_AUDIO_PAGE 0x0e 55#define ATAPI_CDROM_AUDIO_PAGE_MASK 0x4e 56 57 u_int8_t param_len; 58 u_int8_t flags; 59#define CD_PA_SOTC 0x02 60#define CD_PA_IMMED 0x04 61 62 u_int8_t reserved3; 63 u_int8_t reserved4; 64 u_int8_t reserved5; 65 u_int16_t lb_per_sec; 66 struct port_control { 67 u_int8_t channels:4; 68#define CHANNEL_0 1 69#define CHANNEL_1 2 70#define CHANNEL_2 4 71#define CHANNEL_3 8 72 73 u_int8_t volume; 74 } port[4]; 75}; 76 77 78/* CDROM Capabilities and Mechanical Status Page */ 79struct cappage { 80 /* mode page data header */ 81 u_int16_t data_length; 82 u_int8_t medium_type; 83#define MST_TYPE_MASK_LOW 0x0f 84#define MST_FMT_NONE 0x00 85#define MST_DATA_120 0x01 86#define MST_AUDIO_120 0x02 87#define MST_COMB_120 0x03 88#define MST_PHOTO_120 0x04 89#define MST_DATA_80 0x05 90#define MST_AUDIO_80 0x06 91#define MST_COMB_80 0x07 92#define MST_PHOTO_80 0x08 93 94#define MST_TYPE_MASK_HIGH 0x70 95#define MST_CDROM 0x00 96#define MST_CDR 0x10 97#define MST_CDRW 0x20 98#define MST_DVD 0x40 99 100#define MST_NO_DISC 0x70 101#define MST_DOOR_OPEN 0x71 102#define MST_FMT_ERROR 0x72 103 104 u_int8_t dev_spec; 105 u_int16_t unused; 106 u_int16_t blk_desc_len; 107 108 /* capabilities page */ 109 u_int8_t page_code; 110#define ATAPI_CDROM_CAP_PAGE 0x2a 111 112 u_int8_t param_len; 113 114 u_int16_t media; 115#define MST_READ_CDR 0x0100 116#define MST_READ_CDRW 0x0200 117#define MST_READ_PACKET 0x0400 118#define MST_READ_DVDROM 0x0800 119#define MST_READ_DVDR 0x1000 120#define MST_READ_DVDRAM 0x2000 121#define MST_WRITE_CDR 0x0001 122#define MST_WRITE_CDRW 0x0002 123#define MST_WRITE_TEST 0x0004 124#define MST_WRITE_DVDR 0x0010 125#define MST_WRITE_DVDRAM 0x0020 126 127 u_int16_t capabilities; 128#define MST_AUDIO_PLAY 0x0100 129#define MST_COMPOSITE 0x0200 130#define MST_AUDIO_P1 0x0400 131#define MST_AUDIO_P2 0x0800 132#define MST_MODE2_f1 0x1000 133#define MST_MODE2_f2 0x2000 134#define MST_MULTISESSION 0x4000 135#define MST_BURNPROOF 0x8000 136#define MST_READ_CDDA 0x0001 137#define MST_CDDA_STREAM 0x0002 138#define MST_COMBINED_RW 0x0004 139#define MST_CORRECTED_RW 0x0008 140#define MST_SUPPORT_C2 0x0010 141#define MST_ISRC 0x0020 142#define MST_UPC 0x0040 143 144 u_int8_t mechanism; 145#define MST_LOCKABLE 0x01 146#define MST_LOCKED 0x02 147#define MST_PREVENT 0x04 148#define MST_EJECT 0x08 149#define MST_MECH_MASK 0xe0 150#define MST_MECH_CADDY 0x00 151#define MST_MECH_TRAY 0x20 152#define MST_MECH_POPUP 0x40 153#define MST_MECH_CHANGER 0x80 154#define MST_MECH_CARTRIDGE 0xa0 155 156 uint8_t audio; 157#define MST_SEP_VOL 0x01 158#define MST_SEP_MUTE 0x02 159 160 u_int16_t max_read_speed; /* max raw data rate in bytes/1000 */ 161 u_int16_t max_vol_levels; /* number of discrete volume levels */ 162 u_int16_t buf_size; /* internal buffer size in bytes/1024 */ 163 u_int16_t cur_read_speed; /* current data rate in bytes/1000 */ 164 165 u_int8_t reserved3; 166 u_int8_t misc; 167 168 u_int16_t max_write_speed; /* max raw data rate in bytes/1000 */ 169 u_int16_t cur_write_speed; /* current data rate in bytes/1000 */ 170 u_int16_t copy_protect_rev; 171 u_int16_t reserved4; 172}; 173 174#define CH_READY 0 175#define CH_LOADING 1 176#define CH_UNLOADING 2 177#define CH_INITIALIZING 3 178 179#define CD_IDLE 0 180#define CD_AUDIO_ACTIVE 1 181#define CD_AUDIO_SCAN 2 182#define CD_HOST_ACTIVE 3 183#define CD_NO_STATE 7 184 185/* CDROM Changer mechanism status structure */ 186struct changer { 187 u_int8_t current_slot :5; /* active changer slot */ 188 u_int8_t mech_state :2; /* current changer state */ 189 190 u_int8_t fault :1; /* fault in last operation */ 191 u_int8_t reserved0 :5; 192 u_int8_t cd_state :3; /* current mechanism state */ 193 194 u_int8_t current_lba[3]; /* current LBA */ 195 u_int8_t slots; /* number of available slots */ 196 u_int16_t table_length; /* slot table length */ 197 struct { 198 u_int8_t changed :1; /* media has changed in this slot */ 199 u_int8_t unused :6; 200 u_int8_t present :1; /* slot has a CD present */ 201 u_int8_t reserved0; 202 u_int8_t reserved1; 203 u_int8_t reserved2; 204 } slot[32]; 205}; 206 207/* CDROM Write Parameters Mode Page (Burners ONLY) */ 208struct write_param { 209 /* mode page data header */ 210 u_int16_t data_length; 211 u_int8_t medium_type; 212 u_int8_t dev_spec; 213 u_int8_t unused[2]; 214 u_int16_t blk_desc_len; 215 216 /* write parameters page */ 217 u_int8_t page_code; 218#define ATAPI_CDROM_WRITE_PARAMETERS_PAGE 0x05 219 220 u_int8_t page_length; /* 0x32 */ 221 u_int8_t write_type :4; /* write stream type */ 222#define CDR_WTYPE_PACKET 0x00 223#define CDR_WTYPE_TRACK 0x01 224#define CDR_WTYPE_SESSION 0x02 225#define CDR_WTYPE_RAW 0x03 226 227 u_int8_t test_write :1; /* test write enable */ 228 u_int8_t link_size_valid :1; 229 u_int8_t burnproof :1; /* BurnProof enable */ 230 u_int8_t reserved2_7 :1; 231 u_int8_t track_mode :4; /* track mode */ 232#define CDR_TMODE_AUDIO 0x00 233#define CDR_TMODE_AUDIO_PREEMP 0x01 234#define CDR_TMODE_ALLOW_COPY 0x02 235#define CDR_TMODE_DATA 0x04 236#define CDR_TMODE_QUAD_AUDIO 0x08 237 238 u_int8_t copy :1; /* generation stamp */ 239 u_int8_t fp :1; /* fixed packet type */ 240 u_int8_t session_type :2; /* session type */ 241#define CDR_SESS_NONE 0x00 242#define CDR_SESS_FINAL 0x01 243#define CDR_SESS_RESERVED 0x02 244#define CDR_SESS_MULTI 0x03 245 246 u_int8_t datablock_type :4; /* data type code (see cdrio.h) */ 247 u_int8_t reserved4_4567 :4; 248 u_int8_t link_size; 249 u_int8_t reserved6; 250 u_int8_t host_app_code :6; /* host application code */ 251 u_int8_t reserved7_67 :2; 252 u_int8_t session_format; /* session format */ 253#define CDR_SESS_CDROM 0x00 254#define CDR_SESS_CDI 0x10 255#define CDR_SESS_CDROM_XA 0x20 256 257 u_int8_t reserved9; 258 u_int32_t packet_size; /* packet size in bytes */ 259 u_int16_t audio_pause_length; /* audio pause length in secs */ 260 u_int8_t media_catalog_number[16]; 261 u_int8_t isr_code[16]; 262 u_int8_t sub_hdr_byte0; 263 u_int8_t sub_hdr_byte1; 264 u_int8_t sub_hdr_byte2; 265 u_int8_t sub_hdr_byte3; 266 u_int8_t vendor_specific_byte0; 267 u_int8_t vendor_specific_byte1; 268 u_int8_t vendor_specific_byte2; 269 u_int8_t vendor_specific_byte3; 270} __packed; 271 272/* CDROM Read Track Information structure */ 273struct acd_track_info { 274 u_int16_t data_length; 275 u_int8_t track_number; /* current track number */ 276 u_int8_t session_number; /* current session number */ 277 u_int8_t reserved4; 278 u_int8_t track_mode :4; /* mode of this track */ 279 u_int8_t copy :1; /* generation stamp */ 280 u_int8_t damage :1; /* damaged track */ 281 u_int8_t reserved5_67 :2; 282 u_int8_t data_mode :4; /* data mode of this disc */ 283 u_int8_t fp :1; /* fixed packet */ 284 u_int8_t packet :1; /* packet track */ 285 u_int8_t blank :1; /* blank (empty) track */ 286 u_int8_t rt :1; /* reserved track */ 287 u_int8_t nwa_valid :1; /* next_writeable_addr field valid */ 288 u_int8_t reserved7_17 :7; 289 u_int track_start_addr; /* start of this track */ 290 u_int next_writeable_addr; /* next writeable addr on this disc */ 291 u_int free_blocks; /* free block on this disc */ 292 u_int fixed_packet_size; /* size of packets on this track */ 293 u_int track_length; /* length of this track */ 294}; 295 296/* Structure describing an ATAPI CDROM device */ 297struct acd_softc { 298 int flags; /* device state flags */ 299#define F_LOCKED 0x0001 /* this unit is locked */ 300 301 struct toc toc; /* table of disc contents */ 302 struct audiopage au; /* audio page info */ 303 struct audiopage aumask; /* audio page mask */ 304 struct cappage cap; /* capabilities page info */ 305 struct cd_sub_channel_info subchan; /* subchannel info */ 306 struct changer *changer_info; /* changer info */ 307 struct acd_softc **driver; /* softc's of changer slots */ 308 int slot; /* this instance slot number */ 309 time_t timestamp; /* this instance timestamp */ 310 u_int32_t disk_size; /* size of current media */ 311 u_int32_t block_size; /* blocksize currently used */ 312 u_int32_t iomax; /* Max I/O request (bytes) */ 313 struct g_geom *gp; /* geom instance */ 314 struct g_provider *pp[MAXTRK+1]; /* providers */ 315}; 316