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