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