1 /* 2 * 16 Feb 93 Julian Elischer (julian@dialix.oz.au) 3 * 4 * $FreeBSD: src/sys/sys/cdio.h,v 1.21 1999/12/29 04:24:38 peter Exp $ 5 */ 6 7 /* 8 <1> Fixed a conflict with ioctl usage. There were two different 9 functions using code #25. Made file formatting consistent. 10 Added two new ioctl codes: door closing and audio pitch playback. 11 Added a STEREO union called STEREO. 12 5-Mar-95 Frank Durda IV bsdmail@nemesis.lonestar.org 13 14 <2> Added a new ioctl that allows you to find out what capabilities 15 a drive has and what commands it will accept. This allows a 16 user application to only offer controls (buttons, sliders, etc) 17 for functions that drive can actually do. Things it can't do 18 can disappear or be greyed-out (like some other system). 19 If the driver doesn't respond to this call, well, handle it the 20 way you used to do it. 21 2-Apr-95 Frank Durda IV bsdmail@nemesis.lonestar.org 22 */ 23 24 /* Shared between kernel & process */ 25 26 #ifndef _SYS_CDIO_H_ 27 #define _SYS_CDIO_H_ 28 29 #ifndef _SYS_TYPES_H_ 30 #include <sys/types.h> 31 #endif 32 #ifndef _SYS_IOCCOM_H_ 33 #include <sys/ioccom.h> 34 #endif 35 36 union msf_lba { 37 struct { 38 unsigned char unused; 39 unsigned char minute; 40 unsigned char second; 41 unsigned char frame; 42 } msf; 43 int lba; /* network byte order */ 44 u_char addr[4]; 45 }; 46 47 struct cd_toc_entry { 48 u_int :8; 49 u_int control:4; 50 u_int addr_type:4; 51 u_char track; 52 u_int :8; 53 union msf_lba addr; 54 }; 55 56 struct cd_sub_channel_header { 57 u_int :8; 58 u_char audio_status; 59 #define CD_AS_AUDIO_INVALID 0x00 60 #define CD_AS_PLAY_IN_PROGRESS 0x11 61 #define CD_AS_PLAY_PAUSED 0x12 62 #define CD_AS_PLAY_COMPLETED 0x13 63 #define CD_AS_PLAY_ERROR 0x14 64 #define CD_AS_NO_STATUS 0x15 65 u_char data_len[2]; 66 }; 67 68 struct cd_sub_channel_position_data { 69 u_char data_format; 70 u_int control:4; 71 u_int addr_type:4; 72 u_char track_number; 73 u_char index_number; 74 union msf_lba absaddr; 75 union msf_lba reladdr; 76 }; 77 78 struct cd_sub_channel_media_catalog { 79 u_char data_format; 80 u_int :8; 81 u_int :8; 82 u_int :8; 83 u_int :7; 84 u_int mc_valid:1; 85 u_char mc_number[15]; 86 }; 87 88 struct cd_sub_channel_track_info { 89 u_char data_format; 90 u_int :8; 91 u_char track_number; 92 u_int :8; 93 u_int :7; 94 u_int ti_valid:1; 95 u_char ti_number[15]; 96 }; 97 98 struct cd_sub_channel_info { 99 struct cd_sub_channel_header header; 100 union { 101 struct cd_sub_channel_position_data position; 102 struct cd_sub_channel_media_catalog media_catalog; 103 struct cd_sub_channel_track_info track_info; 104 } what; 105 }; 106 107 108 /***************************************************************\ 109 * Ioctls for the CD drive * 110 \***************************************************************/ 111 112 struct ioc_play_track 113 { 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 121 122 struct ioc_play_blocks 123 { 124 int blk; 125 int len; 126 }; 127 #define CDIOCPLAYBLOCKS _IOW('c',2,struct ioc_play_blocks) 128 129 130 struct ioc_read_subchannel { 131 u_char address_format; 132 #define CD_LBA_FORMAT 1 133 #define CD_MSF_FORMAT 2 134 u_char data_format; 135 #define CD_SUBQ_DATA 0 136 #define CD_CURRENT_POSITION 1 137 #define CD_MEDIA_CATALOG 2 138 #define CD_TRACK_INFO 3 139 u_char track; 140 int data_len; 141 struct cd_sub_channel_info *data; 142 }; 143 #define CDIOCREADSUBCHANNEL _IOWR('c', 3 , struct ioc_read_subchannel ) 144 145 146 struct ioc_toc_header { 147 u_short len; 148 u_char starting_track; 149 u_char ending_track; 150 }; 151 #define CDIOREADTOCHEADER _IOR('c',4,struct ioc_toc_header) 152 153 154 struct ioc_read_toc_entry { 155 u_char address_format; 156 u_char starting_track; 157 u_short data_len; 158 struct cd_toc_entry *data; 159 }; 160 #define CDIOREADTOCENTRYS _IOWR('c',5,struct ioc_read_toc_entry) 161 162 163 struct ioc_read_toc_single_entry { 164 u_char address_format; 165 u_char track; 166 struct cd_toc_entry entry; 167 }; 168 #define CDIOREADTOCENTRY _IOWR('c',6,struct ioc_read_toc_single_entry) 169 170 171 struct ioc_patch 172 { 173 u_char patch[4]; /* one for each channel */ 174 }; 175 #define CDIOCSETPATCH _IOW('c',9,struct ioc_patch) 176 177 178 struct ioc_vol 179 { 180 u_char vol[4]; /* one for each channel */ 181 }; 182 #define CDIOCGETVOL _IOR('c',10,struct ioc_vol) 183 184 #define CDIOCSETVOL _IOW('c',11,struct ioc_vol) 185 186 #define CDIOCSETMONO _IO('c',12) 187 188 #define CDIOCSETSTEREO _IO('c',13) 189 190 #define CDIOCSETMUTE _IO('c',14) 191 192 #define CDIOCSETLEFT _IO('c',15) 193 194 #define CDIOCSETRIGHT _IO('c',16) 195 196 #define CDIOCSETDEBUG _IO('c',17) 197 198 #define CDIOCCLRDEBUG _IO('c',18) 199 200 #define CDIOCPAUSE _IO('c',19) 201 202 #define CDIOCRESUME _IO('c',20) 203 204 #define CDIOCRESET _IO('c',21) 205 206 #define CDIOCSTART _IO('c',22) 207 208 #define CDIOCSTOP _IO('c',23) 209 210 #define CDIOCEJECT _IO('c',24) 211 212 213 struct ioc_play_msf 214 { 215 u_char start_m; 216 u_char start_s; 217 u_char start_f; 218 u_char end_m; 219 u_char end_s; 220 u_char end_f; 221 }; 222 #define CDIOCPLAYMSF _IOW('c',25,struct ioc_play_msf) 223 224 #define CDIOCALLOW _IO('c',26) 225 226 #define CDIOCPREVENT _IO('c',27) 227 228 /*<1>For drives that support it, this*/ 229 /*<1>causes the drive to close its door*/ 230 /*<1>and make the media (if any) ready*/ 231 #define CDIOCCLOSE _IO('c',28) /*<1>*/ 232 233 #endif /* !_SYS_CDIO_H_ */ 234