summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cdrw/mmc.h
blob: c48062a83c6eaeed741f3f415b0bdda862c0225c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_MMC_H
#define	_MMC_H

#ifdef	__cplusplus
extern "C" {
#endif

/* bytelengths for some SCSI data structures */
#define	SENSE_DATA_SIZE		16
#define	TRACK_INFO_SIZE		36
#define	DISC_INFO_BLOCK_SIZE	32
#define	INQUIRY_DATA_LENGTH	96
#define	GET_PERF_DATA_LEN	24
#define	SET_STREAM_DATA_LEN	28

#define	DEFAULT_SCSI_TIMEOUT    60

#define	MMC_FTR_HDR_LEN		8	/* byte len of Feature Header */
/*
 * byte length of the static part of a Feature Descriptor
 */
#define	MMC_FTR_DSCRPTR_BASE_LEN	4
#define	MMC_PRFL_DSCRPTR_LEN	4	/* byte len of Profile Descriptor */
/*
 * MMC Features; can be added to over time
 */
#define	MMC_FTR_PRFL_LIST	0x0000	/* Profile List Feature */
#define	MMC_FTR_CORE		0x0001	/* Core Feature */
#define	MMC_FTR_MORPHING	0x0002	/* Morphing Feature */
#define	MMC_FTR_REM_MED		0x0003	/* Removable Medium Feature */
#define	MMC_FTR_WR_PROTECT	0x0004	/* Write Protect Feature */
#define	MMC_FTR_RAND_READ	0x0010	/* Random Readable Feature */
#define	MMC_FTR_MULTI_READ	0x001D	/* Multi-Read Feature */
#define	MMC_FTR_CD_READ		0x001E	/* CD Read Feature */
#define	MMC_FTR_DVD_READ	0x001F	/* DVD Read Feature */
#define	MMC_FTR_RAND_WR		0x0020	/* Random Writable Feature */
#define	MMC_FTR_INC_STR_WR	0x0021	/* Incremental Streaming Writable */
#define	MMC_FTR_SCTR_ERSBL	0x0022	/* Sector Erasable Feature */
#define	MMC_FTR_FORMATTABLE	0x0023	/* Formattable Feature */
#define	MMC_FTR_DFCT_MNGMNT	0x0024	/* Hardware Defect Management Feature */
#define	MMC_FTR_RT_STREAM	0x0107	/* Real Time Streaming Feature */

/* Constants for READ TOC/PMA/ATIP command */
#define	FORMAT_FORMATTED_TOC	0
#define	FORMAT_MULTISESS_INFO	1
#define	FORMAT_RAW_TOC		2

/* size in bytes of raw TOC Data Length field */
#define	RTOC_DATA_LEN_SZ	2

/* Point field values for Raw TOC Track Descriptor */
#define	POINT_SESS_FIRST_TRK	0xA0	/* 1st track in session */
#define	POINT_SESS_LAST_TRK	0xA1	/* Last track in session */
#define	POINT_LEADOUT_ADDR	0xA2	/* Starting leadout address */

/* Q Sub-channel constants */
#define	Q_MODE_1		1	/* Mode-1 Q */
#define	Q_MODE_2		2	/* Mode-2 Q */

/* Convert Minute,Second,Frame address into Logical Block Address */
#define	MSF2LBA(m, s, f)	(((m) * 60 + (s)) * 75 + (f) - 150)

/*
 * MMC Response Data structures.  Use the read_scsi[16,32] and load_scsi[16,32]
 * routines when reading/writing fields > 1 byte in size.
 */
/*
 * Structures for the Raw TOC Response Format of the READ TOC/PMA/ATIP
 * command.
 */
typedef struct rtoc_hdr {	/* Raw TOC response format Header */
	uchar_t rh_data_len1;
	uchar_t rh_data_len0;
	uchar_t rh_first_sess_num;
	uchar_t rh_last_sess_num;
} rtoc_hdr_t;

typedef struct rtoc_td {	/* Raw TOC response format Track Descriptor */
	uchar_t rt_session_num;
#if defined(_BIT_FIELDS_LTOH)
	uchar_t	rt_control	: 4;
	uchar_t rt_adr		: 4;
#elif defined(_BIT_FIELDS_HTOL)
	uchar_t rt_adr		: 4;
	uchar_t rt_control	: 4;
#else
#error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif	/* _BIT_FIELDS_LTOH */

	uchar_t rt_tno;
	uchar_t rt_point;
	uchar_t rt_min;
	uchar_t rt_sec;
	uchar_t rt_frame;
	uchar_t rt_zero;
	uchar_t	rt_pmin;
	uchar_t rt_psec;
	uchar_t rt_pframe;
} rtoc_td_t;

int test_unit_ready(int fd);
int inquiry(int fd, uchar_t *inq);
int read_capacity(int fd, uchar_t *capbuf);
int read_track_info(int fd, int trackno, uchar_t *ti);
int mode_sense(int fd, uchar_t pc, int dbd, int page_len, uchar_t *buffer);
int mode_select(int fd, int page_len, uchar_t *buffer);
int read_toc(int fd, int format, int trackno, int buflen, uchar_t *buf);
int read_disc_info(int fd, uchar_t *di);
int get_configuration(int fd, uint16_t feature, int bufsize, uchar_t *buf);
int read10(int fd, uint32_t start_blk, uint16_t nblk, uchar_t *buf,
    uint32_t bufsize);
int write10(int fd, uint32_t start_blk, uint16_t nblk, uchar_t *buf,
    uint32_t bufsize);
int close_track(int fd, int trackno, int close_session, int immediate);
int blank_disc(int fd, int type, int immediate);
int read_cd(int fd, uint32_t start_blk, uint16_t nblk, uchar_t sector_type,
    uchar_t *buf, uint32_t bufsize);
int load_unload(int fd, int load);
int prevent_allow_mr(int fd, int op);
int read_header(int fd, uint32_t lba, uchar_t *buf);
int set_cd_speed(int fd, uint16_t read_speed, uint16_t write_speed);
int get_performance(int fd, int get_write_performance, uchar_t *perf);
int set_streaming(int fd, uchar_t *buf);
int rezero_unit(int fd);
int start_stop(int fd, int start);
int flush_cache(int fd);
int set_reservation(int fd, ulong_t size);
int format_media(int fd);
uint32_t read_format_capacity(int fd, uint_t *bsize);
void reset_dev(int fd);

extern int uscsi_error;		/* used for debugging failed uscsi */

#define	REZERO_UNIT_CMD		0x01
#define	FORMAT_UNIT_CMD		0x04
#define	INQUIRY_CMD		0x12
#define	MODE_SELECT_6_CMD	0x15
#define	MODE_SENSE_6_CMD	0x1A
#define	START_STOP_CMD		0x1B
#define	PREVENT_ALLOW_CMD	0x1E
#define	READ_FORMAT_CAP_CMD	0x23
#define	READ_CAP_CMD		0x25
#define	READ_10_CMD		0x28
#define	WRITE_10_CMD		0x2A
#define	SYNC_CACHE_CMD		0x35
#define	READ_TOC_CMD		0x43
#define	MODE_SELECT_10_CMD	0x55
#define	MODE_SENSE_10_CMD	0x5A
#define	READ_HDR_CMD		0x44
#define	GET_CONFIG_CMD		0x46

#define	READ_INFO_CMD		0x51
#define	READ_TRACK_CMD		0x52
#define	SET_RESERVATION_CMD	0x53
#define	CLOSE_TRACK_CMD		0x5B

#define	BLANK_CMD		0xA1
#define	GET_PERFORMANCE_CMD	0xAC
#define	READ_DVD_STRUCTURE	0xAD
#define	READ_CD_CMD		0xBE
#define	SET_CD_SPEED		0xBB

#define	STREAM_CMD		0xB6
#define	READ_AUDIO_CMD		0xD8

#ifdef	__cplusplus
}
#endif

#endif /* _MMC_H */