1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_CDIO_H 28 #define _SYS_CDIO_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* 35 * CDROM io controls type definitions 36 */ 37 struct cdrom_msf { 38 unsigned char cdmsf_min0; /* starting minute */ 39 unsigned char cdmsf_sec0; /* starting second */ 40 unsigned char cdmsf_frame0; /* starting frame */ 41 unsigned char cdmsf_min1; /* ending minute */ 42 unsigned char cdmsf_sec1; /* ending second */ 43 unsigned char cdmsf_frame1; /* ending frame */ 44 }; 45 46 struct cdrom_ti { 47 unsigned char cdti_trk0; /* starting track */ 48 unsigned char cdti_ind0; /* starting index */ 49 unsigned char cdti_trk1; /* ending track */ 50 unsigned char cdti_ind1; /* ending index */ 51 }; 52 53 struct cdrom_tochdr { 54 unsigned char cdth_trk0; /* starting track */ 55 unsigned char cdth_trk1; /* ending track */ 56 }; 57 58 struct cdrom_tocentry { 59 unsigned char cdte_track; 60 unsigned cdte_adr :4; 61 unsigned cdte_ctrl :4; 62 unsigned char cdte_format; 63 union { 64 struct { 65 unsigned char minute; 66 unsigned char second; 67 unsigned char frame; 68 } msf; 69 int lba; 70 } cdte_addr; 71 unsigned char cdte_datamode; 72 }; 73 74 /* 75 * CDROM address format definition, for use with struct cdrom_tocentry 76 */ 77 #define CDROM_LBA 0x01 78 #define CDROM_MSF 0x02 79 80 /* 81 * Bitmask for CD-ROM data track in the cdte_ctrl field 82 * A track is either data or audio. 83 */ 84 #define CDROM_DATA_TRACK 0x04 85 86 /* 87 * For CDROMREADTOCENTRY, set the cdte_track to CDROM_LEADOUT to get 88 * the information for the leadout track. 89 */ 90 #define CDROM_LEADOUT 0xAA 91 92 struct cdrom_subchnl { 93 unsigned char cdsc_format; 94 unsigned char cdsc_audiostatus; 95 unsigned cdsc_adr: 4; 96 unsigned cdsc_ctrl: 4; 97 unsigned char cdsc_trk; 98 unsigned char cdsc_ind; 99 union { 100 struct { 101 unsigned char minute; 102 unsigned char second; 103 unsigned char frame; 104 } msf; 105 int lba; 106 } cdsc_absaddr; 107 union { 108 struct { 109 unsigned char minute; 110 unsigned char second; 111 unsigned char frame; 112 } msf; 113 int lba; 114 } cdsc_reladdr; 115 }; 116 117 /* 118 * Definition for audio status returned from Read Sub-channel 119 */ 120 #define CDROM_AUDIO_INVALID 0x00 /* audio status not supported */ 121 #define CDROM_AUDIO_PLAY 0x11 /* audio play operation in progress */ 122 #define CDROM_AUDIO_PAUSED 0x12 /* audio play operation paused */ 123 #define CDROM_AUDIO_COMPLETED 0x13 /* audio play successfully completed */ 124 #define CDROM_AUDIO_ERROR 0x14 /* audio play stopped due to error */ 125 #define CDROM_AUDIO_NO_STATUS 0x15 /* no current audio status to return */ 126 127 /* 128 * definition of audio volume control structure 129 */ 130 struct cdrom_volctrl { 131 unsigned char channel0; 132 unsigned char channel1; 133 unsigned char channel2; 134 unsigned char channel3; 135 }; 136 137 struct cdrom_read { 138 int cdread_lba; 139 caddr_t cdread_bufaddr; 140 int cdread_buflen; 141 }; 142 143 #if defined(_SYSCALL32) 144 145 struct cdrom_read32 { 146 int cdread_lba; 147 caddr32_t cdread_bufaddr; 148 int cdread_buflen; 149 }; 150 151 #define cdrom_read32tocdrom_read(cdrd32, cdrd) \ 152 cdrd->cdread_lba = cdrd32->cdread_lba; \ 153 cdrd->cdread_bufaddr = (caddr_t)(uintptr_t)cdrd32->cdread_bufaddr; \ 154 cdrd->cdread_buflen = cdrd32->cdread_buflen 155 156 #define cdrom_readtocdrom_read32(cdrd, cdrd32) \ 157 cdrd32->cdread_lba = cdrd->cdread_lba; \ 158 cdrd32->cdread_bufaddr = (caddr32_t)(uintptr_t)cdrd->cdread_bufaddr; \ 159 cdrd32->cdread_buflen = cdrd->cdread_buflen 160 161 #endif /* _SYSCALL32 */ 162 163 /* 164 * Definition of CD/DA structure 165 */ 166 struct cdrom_cdda { 167 unsigned int cdda_addr; 168 unsigned int cdda_length; 169 caddr_t cdda_data; 170 unsigned char cdda_subcode; 171 }; 172 173 #if defined(_SYSCALL32) 174 struct cdrom_cdda32 { 175 unsigned int cdda_addr; 176 unsigned int cdda_length; 177 caddr32_t cdda_data; 178 unsigned char cdda_subcode; 179 }; 180 181 #define cdrom_cdda32tocdrom_cdda(cdda32, cdda) \ 182 cdda->cdda_addr = cdda32->cdda_addr; \ 183 cdda->cdda_length = cdda32->cdda_length; \ 184 cdda->cdda_data = (caddr_t)(uintptr_t)cdda32->cdda_data; \ 185 cdda->cdda_subcode = cdda32->cdda_subcode 186 187 #define cdrom_cddatocdrom_cdda32(cdda, cdda32) \ 188 cdda32->cdda_addr = cdda->cdda_addr; \ 189 cdda32->cdda_length = cdda->cdda_length; \ 190 cdda32->cdda_data = (caddr32_t)(uintptr_t)cdda->cdda_data; \ 191 cdda32->cdda_subcode = cdda->cdda_subcode 192 193 #endif /* _SYSCALL32 */ 194 195 /* 196 * Definitions for cdda_subcode field 197 */ 198 #define CDROM_DA_NO_SUBCODE 0x00 /* CD/DA data with no subcode */ 199 #define CDROM_DA_SUBQ 0x01 /* CD/DA data with sub Q code */ 200 #define CDROM_DA_ALL_SUBCODE 0x02 /* CD/DA data with all subcode */ 201 #define CDROM_DA_SUBCODE_ONLY 0x03 /* All subcode only */ 202 203 /* 204 * Definition of CD/XA structure 205 */ 206 struct cdrom_cdxa { 207 unsigned int cdxa_addr; 208 unsigned int cdxa_length; 209 caddr_t cdxa_data; 210 unsigned char cdxa_format; 211 }; 212 213 #if defined(_SYSCALL32) 214 215 struct cdrom_cdxa32 { 216 unsigned int cdxa_addr; 217 unsigned int cdxa_length; 218 caddr32_t cdxa_data; 219 unsigned char cdxa_format; 220 }; 221 222 #define cdrom_cdxa32tocdrom_cdxa(cdxa32, cdxa) \ 223 cdxa->cdxa_addr = cdxa32->cdxa_addr; \ 224 cdxa->cdxa_length = cdxa32->cdxa_length; \ 225 cdxa->cdxa_data = (caddr_t)(uintptr_t)cdxa32->cdxa_data; \ 226 cdxa->cdxa_format = cdxa32->cdxa_format 227 228 #define cdrom_cdxatocdrom_cdxa32(cdxa, cdxa32) \ 229 cdxa32->cdxa_addr = cdxa->cdxa_addr; \ 230 cdxa32->cdxa_length = cdxa->cdxa_length; \ 231 cdxa32->cdxa_data = (caddr32_t)(uintptr_t)cdxa->cdxa_data; \ 232 cdxa32->cdxa_format = cdxa->cdxa_format 233 234 #endif /* _SYSCALL32 */ 235 236 /* 237 * Definitions for cdxa_format field 238 */ 239 #define CDROM_XA_DATA 0x00 /* CD/XA data only */ 240 #define CDROM_XA_SECTOR_DATA 0x01 /* CD/XA all sector data */ 241 #define CDROM_XA_DATA_W_ERROR 0x02 /* CD/XA data with error flags data */ 242 243 /* 244 * Definition of subcode structure 245 */ 246 struct cdrom_subcode { 247 unsigned int cdsc_length; 248 caddr_t cdsc_addr; 249 }; 250 251 #if defined(_SYSCALL32) 252 253 struct cdrom_subcode32 { 254 unsigned int cdsc_length; 255 caddr32_t cdsc_addr; 256 }; 257 258 #define cdrom_subcode32tocdrom_subcode(cdsc32, cdsc) \ 259 cdsc->cdsc_length = cdsc32->cdsc_length; \ 260 cdsc->cdsc_addr = (caddr_t)(uintptr_t)cdsc32->cdsc_addr 261 262 #define cdrom_subcodetocdrom_subcode32(cdsc, cdsc32) \ 263 cdsc32->cdsc_length = cdsc->cdsc_length; \ 264 cdsc32->cdsc_addr = (caddr32_t)(uintptr_t)cdsc->cdsc_addr 265 266 #endif /* _SYSCALL32 */ 267 268 /* 269 * Definitions for block size supported 270 */ 271 #define CDROM_BLK_512 512 272 #define CDROM_BLK_1024 1024 273 #define CDROM_BLK_2048 2048 274 #define CDROM_BLK_2056 2056 275 #define CDROM_BLK_2324 2324 276 #define CDROM_BLK_2336 2336 277 #define CDROM_BLK_2340 2340 278 #define CDROM_BLK_2352 2352 279 #define CDROM_BLK_2368 2368 280 #define CDROM_BLK_2448 2448 281 #define CDROM_BLK_2646 2646 282 #define CDROM_BLK_2647 2647 283 #define CDROM_BLK_SUBCODE 96 284 285 /* 286 * Definitions for drive speed supported 287 */ 288 #define CDROM_NORMAL_SPEED 0x00 289 #define CDROM_DOUBLE_SPEED 0x01 290 #define CDROM_QUAD_SPEED 0x03 291 #define CDROM_TWELVE_SPEED 0x0C 292 #define CDROM_MAXIMUM_SPEED 0xff 293 294 /* 295 * CDROM io control commands 296 */ 297 #define CDIOC (0x04 << 8) 298 #define CDROMPAUSE (CDIOC|151) /* Pause Audio Operation */ 299 #define CDROMRESUME (CDIOC|152) /* Resume paused Audio Operation */ 300 #define CDROMPLAYMSF (CDIOC|153) /* Play Audio MSF */ 301 #define CDROMPLAYTRKIND (CDIOC|154) /* Play Audio Track/index */ 302 #define CDROMREADTOCHDR (CDIOC|155) /* Read TOC header */ 303 #define CDROMREADTOCENTRY (CDIOC|156) /* Read a TOC entry */ 304 #define CDROMSTOP (CDIOC|157) /* Stop the cdrom drive */ 305 #define CDROMSTART (CDIOC|158) /* Start the cdrom drive */ 306 #define CDROMEJECT (CDIOC|159) /* Ejects the cdrom caddy */ 307 #define CDROMVOLCTRL (CDIOC|160) /* control output volume */ 308 #define CDROMSUBCHNL (CDIOC|161) /* read the subchannel data */ 309 #define CDROMREADMODE2 (CDIOC|162) /* read CDROM mode 2 data */ 310 #define CDROMREADMODE1 (CDIOC|163) /* read CDROM mode 1 data */ 311 312 #define CDROMREADOFFSET (CDIOC|164) /* read multi-session offset */ 313 314 #define CDROMGBLKMODE (CDIOC|165) /* get current block mode */ 315 #define CDROMSBLKMODE (CDIOC|166) /* set current block mode */ 316 #define CDROMCDDA (CDIOC|167) /* read CD/DA data */ 317 #define CDROMCDXA (CDIOC|168) /* read CD/XA data */ 318 #define CDROMSUBCODE (CDIOC|169) /* read subcode */ 319 #define CDROMGDRVSPEED (CDIOC|170) /* get current drive speed */ 320 #define CDROMSDRVSPEED (CDIOC|171) /* set current drive speed */ 321 322 #define CDROMCLOSETRAY (CDIOC|172) /* close cd tray,load media */ 323 324 /* 325 * Additional commands for CD-ROM 326 */ 327 /* 328 * 329 * Group 2 Commands 330 * 331 */ 332 #define SCMD_READ_SUBCHANNEL 0x42 /* optional SCSI command */ 333 #define SCMD_READ_TOC 0x43 /* optional SCSI command */ 334 #define SCMD_READ_HEADER 0x44 /* optional SCSI command */ 335 #define SCMD_PLAYAUDIO10 0x45 /* optional SCSI command */ 336 #define SCMD_PLAYAUDIO_MSF 0x47 /* optional SCSI command */ 337 #define SCMD_PLAYAUDIO_TI 0x48 /* optional SCSI command */ 338 #define SCMD_PLAYTRACK_REL10 0x49 /* optional SCSI command */ 339 #define SCMD_PAUSE_RESUME 0x4B /* optional SCSI command */ 340 341 /* 342 * 343 * Group 5 Commands 344 * 345 */ 346 #define SCMD_PLAYAUDIO12 0xA5 /* optional SCSI command */ 347 #define SCMD_PLAYTRACK_REL12 0xA9 /* optional SCSI command */ 348 #define SCMD_SET_CDROM_SPEED 0xBB /* optional SCSI command */ 349 #define SCMD_READ_CD 0xBE /* Universal way of accessing CD data */ 350 351 /* 352 * These defines are for SCMD_READ_CD command. 353 * See Expected Sector Type Field Definition (SCSI MMC-2 Spec section 6.1.15) 354 * This information is used to figure out which block size to use. 355 */ 356 #define READ_CD_EST_ALLTYPE 0x0 /* All Types */ 357 #define READ_CD_EST_CDDA 0x1 /* Only CD-DA */ 358 #define READ_CD_EST_MODE1 0x2 /* Only Yellow Book 2048 bytes */ 359 #define READ_CD_EST_MODE2 0x3 /* Only Yellow Book 2336 byte sectors */ 360 #define READ_CD_EST_MODE2FORM1 0x4 /* Only sectors with 2048 bytes */ 361 #define READ_CD_EST_MODE2FORM2 0x5 /* Only sectors with 2324 bytes */ 362 #define READ_CD_EST_RSVD1 0x6 /* reserved */ 363 #define READ_CD_EST_RSVD2 0x7 /* reserved */ 364 365 366 /* 367 * 368 * Group 6 Commands 369 * 370 */ 371 #define SCMD_CD_PLAYBACK_CONTROL 0xC9 /* SONY unique SCSI command */ 372 #define SCMD_CD_PLAYBACK_STATUS 0xC4 /* SONY unique SCSI command */ 373 #define SCMD_READ_CDDA 0xD8 /* Vendor unique SCSI command */ 374 #define SCMD_READ_CDXA 0xDB /* Vendor unique SCSI command */ 375 #define SCMD_READ_ALL_SUBCODES 0xDF /* Vendor unique SCSI command */ 376 377 #define CDROM_MODE2_SIZE 2336 378 379 /* 380 * scsi_key_strings for CDROM cdio SCMD_ definitions 381 */ 382 #define SCSI_CMDS_KEY_STRINGS_CDIO \ 383 /* 0x42 */ { SCMD_READ_SUBCHANNEL, "read_subchannel" }, \ 384 /* 0x43 */ { SCMD_READ_TOC, "read_toc" }, \ 385 /* 0x44 */ { SCMD_REPORT_DENSITIES | \ 386 SCMD_READ_HEADER, "report_densities/read_header" }, \ 387 /* 0x45 */ { SCMD_PLAYAUDIO10, "playaudio" }, \ 388 /* 0x46 */ { SCMD_GET_CONFIGURATION, "get_configuration" }, \ 389 /* 0x47 */ { SCMD_PLAYAUDIO_MSF, "playaudio_msf" }, \ 390 /* 0x48 */ { SCMD_PLAYAUDIO_TI, "playaudio_ti" }, \ 391 /* 0x49 */ { SCMD_PLAYTRACK_REL10, "playaudio_rel" }, \ 392 /* 0x4b */ { SCMD_PAUSE_RESUME, "pause_resume" }, \ 393 \ 394 /* 0xa5 */ { SCMD_PLAYAUDIO12, "playaudio(12)" }, \ 395 /* 0xa9 */ { SCMD_PLAYTRACK_REL12, "playtrack_rel" }, \ 396 /* 0xbb */ { SCMD_SET_CDROM_SPEED, "set_cd_speed" }, \ 397 /* 0xbe */ { SCMD_READ_CD, "read_cd" }, \ 398 \ 399 /* 0xc4 */ { SCMD_CD_PLAYBACK_STATUS, "cd_playback_status" }, \ 400 /* 0xc9 */ { SCMD_CD_PLAYBACK_CONTROL, "cd_playback_control" }, \ 401 /* 0xd8 */ { SCMD_READ_CDDA, "read_cdda" }, \ 402 /* 0xdb */ { SCMD_READ_CDXA, "read_cdxa" }, \ 403 /* 0xdf */ { SCMD_READ_ALL_SUBCODES, "read_all_subcodes" } 404 405 #ifdef __cplusplus 406 } 407 #endif 408 409 #endif /* _SYS_CDIO_H */