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