1/*
2 * 16 Feb 93	Julian Elischer	(julian@dialix.oz.au)
3 */
4
5/*
6<1>	Fixed a conflict with ioctl usage.  There were two different
7	functions using code #25.  Made file formatting consistent.
8	Added two new ioctl codes: door closing and audio pitch playback.
9	Added a STEREO union called STEREO.
10	5-Mar-95  Frank Durda IV	bsdmail@nemesis.lonestar.org
11
12<2>	Added a new ioctl that allows you to find out what capabilities
13	a drive has and what commands it will accept.  This allows a
14	user application to only offer controls (buttons, sliders, etc)
15	for functions that drive can actually do.   Things it can't do
16	can disappear or be greyed-out (like some other system).
17	If the driver doesn't respond to this call, well, handle it the
18	way you used to do it.
19	2-Apr-95  Frank Durda IV	bsdmail@nemesis.lonestar.org
20*/
21
22/* Shared between kernel & process */
23
24#ifndef	_SYS_CDIO_H_
25#define	_SYS_CDIO_H_
26
27#ifndef _KERNEL
28#include <sys/types.h>
29#endif
30#include <sys/ioccom.h>
31
32union msf_lba {
33	struct {
34		unsigned char   unused;
35		unsigned char   minute;
36		unsigned char   second;
37		unsigned char   frame;
38	} msf;
39	int     lba;    /* network byte order */
40	u_char	addr[4];
41};
42
43struct cd_toc_entry {
44#if BYTE_ORDER == LITTLE_ENDIAN
45	u_int	:8;
46	u_int	control:4;
47	u_int	addr_type:4;
48#else
49	u_int	:8;
50	u_int	addr_type:4;
51	u_int	control:4;
52#endif
53	u_char  track;
54	u_int	:8;
55	union msf_lba  addr;
56};
57
58struct cd_sub_channel_header {
59	u_int	:8;
60	u_char	audio_status;
61#define CD_AS_AUDIO_INVALID        0x00
62#define CD_AS_PLAY_IN_PROGRESS     0x11
63#define CD_AS_PLAY_PAUSED          0x12
64#define CD_AS_PLAY_COMPLETED       0x13
65#define CD_AS_PLAY_ERROR           0x14
66#define CD_AS_NO_STATUS            0x15
67	u_char	data_len[2];
68};
69
70struct cd_sub_channel_position_data {
71	u_char	data_format;
72	u_int	control:4;
73	u_int	addr_type:4;
74	u_char	track_number;
75	u_char	index_number;
76	union msf_lba  absaddr;
77	union msf_lba  reladdr;
78};
79
80struct cd_sub_channel_media_catalog {
81        u_char  data_format;
82        u_int   :8;
83        u_int   :8;
84        u_int   :8;
85        u_int   :7;
86        u_int   mc_valid:1;
87        u_char  mc_number[15];
88};
89
90struct cd_sub_channel_track_info {
91        u_char  data_format;
92        u_int   :8;
93        u_char  track_number;
94        u_int   :8;
95        u_int   :7;
96        u_int   ti_valid:1;
97        u_char  ti_number[15];
98};
99
100struct cd_sub_channel_info {
101	struct cd_sub_channel_header header;
102	union {
103		struct cd_sub_channel_position_data position;
104		struct cd_sub_channel_media_catalog media_catalog;
105		struct cd_sub_channel_track_info track_info;
106	} what;
107};
108
109/***************************************************************\
110* Ioctls for the CD drive					*
111\***************************************************************/
112
113struct ioc_play_track {
114	u_char	start_track;
115	u_char	start_index;
116	u_char	end_track;
117	u_char	end_index;
118};
119#define	CDIOCPLAYTRACKS	_IOW('c',1,struct ioc_play_track)
120
121struct ioc_play_blocks {
122	int	blk;
123	int	len;
124};
125#define	CDIOCPLAYBLOCKS	_IOW('c',2,struct ioc_play_blocks)
126
127struct ioc_read_subchannel {
128	u_char address_format;
129#define CD_LBA_FORMAT	1
130#define CD_MSF_FORMAT	2
131	u_char data_format;
132#define CD_SUBQ_DATA		0
133#define CD_CURRENT_POSITION	1
134#define CD_MEDIA_CATALOG	2
135#define CD_TRACK_INFO		3
136	u_char track;
137	int	data_len;
138	struct  cd_sub_channel_info *data;
139};
140#define CDIOCREADSUBCHANNEL _IOWR('c', 3 , struct ioc_read_subchannel )
141
142struct ioc_toc_header {
143	u_short len;
144	u_char  starting_track;
145	u_char  ending_track;
146};
147#define CDIOREADTOCHEADER _IOR('c',4,struct ioc_toc_header)
148
149struct ioc_read_toc_entry {
150	u_char	address_format;
151	u_char	starting_track;
152	u_short	data_len;
153	struct  cd_toc_entry *data;
154};
155#define CDIOREADTOCENTRYS _IOWR('c',5,struct ioc_read_toc_entry)
156
157struct ioc_read_toc_single_entry {
158	u_char	address_format;
159	u_char	track;
160	struct  cd_toc_entry entry;
161};
162#define CDIOREADTOCENTRY _IOWR('c',6,struct ioc_read_toc_single_entry)
163
164struct ioc_patch {
165	u_char	patch[4];	/* one for each channel */
166};
167#define	CDIOCSETPATCH	_IOW('c',9,struct ioc_patch)
168
169struct ioc_vol {
170	u_char	vol[4];	/* one for each channel */
171};
172#define	CDIOCGETVOL	_IOR('c',10,struct ioc_vol)
173
174#define	CDIOCSETVOL	_IOW('c',11,struct ioc_vol)
175
176#define	CDIOCSETMONO	_IO('c',12)
177
178#define	CDIOCSETSTERIO	_IO('c',13)
179#define	CDIOCSETSTEREO	_IO('c',13)
180
181#define	CDIOCSETMUTE	_IO('c',14)
182
183#define	CDIOCSETLEFT	_IO('c',15)
184
185#define	CDIOCSETRIGHT	_IO('c',16)
186
187#define	CDIOCSETDEBUG	_IO('c',17)
188
189#define	CDIOCCLRDEBUG	_IO('c',18)
190
191#define	CDIOCPAUSE	_IO('c',19)
192
193#define	CDIOCRESUME	_IO('c',20)
194
195#define	CDIOCRESET	_IO('c',21)
196
197#define	CDIOCSTART	_IO('c',22)
198
199#define	CDIOCSTOP	_IO('c',23)
200
201#define	CDIOCEJECT	_IO('c',24)
202
203struct ioc_play_msf {
204	u_char	start_m;
205	u_char	start_s;
206	u_char	start_f;
207	u_char	end_m;
208	u_char	end_s;
209	u_char	end_f;
210};
211#define	CDIOCPLAYMSF	_IOW('c',25,struct ioc_play_msf)
212
213#define	CDIOCALLOW	_IO('c',26)
214
215#define	CDIOCPREVENT	_IO('c',27)
216
217				/*<1>For drives that support it, this*/
218				/*<1>causes the drive to close its door*/
219				/*<1>and make the media (if any) ready*/
220#define CDIOCCLOSE	_IO('c',28)	/*<1>*/
221
222struct ioc_pitch {		/*<1>For drives that support it, this*/
223				/*<1>call instructs the drive to play the*/
224	short	speed;		/*<1>audio at a faster or slower-than-normal*/
225};				/*<1>rate. -32767 to -1 is slower, 0==normal,*/
226				/*<1>and 1 to 32767 is faster.  LSB bits are*/
227				/*<1>discarded first by drives with less res.*/
228#define	CDIOCPITCH	_IOW('c',29,struct ioc_pitch)	/*<1>*/
229
230struct ioc_capability {			/*<2>*/
231	u_long	play_function;		/*<2>*/
232#define CDDOPLAYTRK	0x00000001	/*<2>Can Play tracks/index*/
233#define	CDDOPLAYMSF	0x00000002	/*<2>Can Play msf to msf*/
234#define	CDDOPLAYBLOCKS	0x00000004	/*<2>Can Play range of blocks*/
235#define	CDDOPAUSE	0x00000100	/*<2>Output can be paused*/
236#define	CDDORESUME	0x00000200	/*<2>Output can be resumed*/
237#define	CDDORESET	0x00000400	/*<2>Drive can be completely reset*/
238#define	CDDOSTART	0x00000800	/*<2>Audio can be started*/
239#define CDDOSTOP	0x00001000	/*<2>Audio can be stopped*/
240#define CDDOPITCH	0x00002000	/*<2>Audio pitch */
241
242	u_long	routing_function;	/*<2>*/
243#define CDREADVOLUME	0x00000001	/*<2>Volume settings can be read*/
244#define CDSETVOLUME	0x00000002	/*<2>Volume settings can be set*/
245#define	CDSETMONO	0x00000100	/*<2>Output can be set to mono*/
246#define CDSETSTEREO	0x00000200	/*<2>Output can be set to stereo (def)*/
247#define	CDSETLEFT	0x00000400	/*<2>Output can be set to left only*/
248#define	CDSETRIGHT	0x00000800	/*<2>Output can be set to right only*/
249#define	CDSETMUTE	0x00001000	/*<2>Output can be muted*/
250#define CDSETPATCH	0x00008000	/*<2>Direct routing control allowed*/
251
252	u_long	special_function;	/*<2>*/
253#define	CDDOEJECT	0x00000001	/*<2>The tray can be opened*/
254#define	CDDOCLOSE	0x00000002	/*<2>The tray can be closed*/
255#define	CDDOLOCK	0x00000004	/*<2>The tray can be locked*/
256#define CDREADHEADER	0x00000100	/*<2>Can read Table of Contents*/
257#define	CDREADENTRIES	0x00000200	/*<2>Can read TOC Entries*/
258#define	CDREADSUBQ	0x00000200	/*<2>Can read Subchannel info*/
259#define CDREADRW	0x00000400	/*<2>Can read subcodes R-W*/
260#define	CDHASDEBUG	0x00004000	/*<2>The tray has dynamic debugging*/
261};					/*<2>*/
262
263#define	CDIOCCAPABILITY	_IOR('c',30,struct ioc_capability)	/*<2>*/
264
265#endif /* !_SYS_CDIO_H_ */
266