Home | History | Annotate | Download | only in sys
      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