1*4882a593Smuzhiyun============================ 2*4882a593SmuzhiyunSummary of CDROM ioctl calls 3*4882a593Smuzhiyun============================ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun- Edward A. Falk <efalk@google.com> 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunNovember, 2004 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunThis document attempts to describe the ioctl(2) calls supported by 10*4882a593Smuzhiyunthe CDROM layer. These are by-and-large implemented (as of Linux 2.6) 11*4882a593Smuzhiyunin drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunioctl values are listed in <linux/cdrom.h>. As of this writing, they 14*4882a593Smuzhiyunare as follows: 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun ====================== =============================================== 17*4882a593Smuzhiyun CDROMPAUSE Pause Audio Operation 18*4882a593Smuzhiyun CDROMRESUME Resume paused Audio Operation 19*4882a593Smuzhiyun CDROMPLAYMSF Play Audio MSF (struct cdrom_msf) 20*4882a593Smuzhiyun CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti) 21*4882a593Smuzhiyun CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr) 22*4882a593Smuzhiyun CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry) 23*4882a593Smuzhiyun CDROMSTOP Stop the cdrom drive 24*4882a593Smuzhiyun CDROMSTART Start the cdrom drive 25*4882a593Smuzhiyun CDROMEJECT Ejects the cdrom media 26*4882a593Smuzhiyun CDROMVOLCTRL Control output volume (struct cdrom_volctrl) 27*4882a593Smuzhiyun CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl) 28*4882a593Smuzhiyun CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes) 29*4882a593Smuzhiyun (struct cdrom_read) 30*4882a593Smuzhiyun CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes) 31*4882a593Smuzhiyun (struct cdrom_read) 32*4882a593Smuzhiyun CDROMREADAUDIO (struct cdrom_read_audio) 33*4882a593Smuzhiyun CDROMEJECT_SW enable(1)/disable(0) auto-ejecting 34*4882a593Smuzhiyun CDROMMULTISESSION Obtain the start-of-last-session 35*4882a593Smuzhiyun address of multi session disks 36*4882a593Smuzhiyun (struct cdrom_multisession) 37*4882a593Smuzhiyun CDROM_GET_MCN Obtain the "Universal Product Code" 38*4882a593Smuzhiyun if available (struct cdrom_mcn) 39*4882a593Smuzhiyun CDROM_GET_UPC Deprecated, use CDROM_GET_MCN instead. 40*4882a593Smuzhiyun CDROMRESET hard-reset the drive 41*4882a593Smuzhiyun CDROMVOLREAD Get the drive's volume setting 42*4882a593Smuzhiyun (struct cdrom_volctrl) 43*4882a593Smuzhiyun CDROMREADRAW read data in raw mode (2352 Bytes) 44*4882a593Smuzhiyun (struct cdrom_read) 45*4882a593Smuzhiyun CDROMREADCOOKED read data in cooked mode 46*4882a593Smuzhiyun CDROMSEEK seek msf address 47*4882a593Smuzhiyun CDROMPLAYBLK scsi-cd only, (struct cdrom_blk) 48*4882a593Smuzhiyun CDROMREADALL read all 2646 bytes 49*4882a593Smuzhiyun CDROMGETSPINDOWN return 4-bit spindown value 50*4882a593Smuzhiyun CDROMSETSPINDOWN set 4-bit spindown value 51*4882a593Smuzhiyun CDROMCLOSETRAY pendant of CDROMEJECT 52*4882a593Smuzhiyun CDROM_SET_OPTIONS Set behavior options 53*4882a593Smuzhiyun CDROM_CLEAR_OPTIONS Clear behavior options 54*4882a593Smuzhiyun CDROM_SELECT_SPEED Set the CD-ROM speed 55*4882a593Smuzhiyun CDROM_SELECT_DISC Select disc (for juke-boxes) 56*4882a593Smuzhiyun CDROM_MEDIA_CHANGED Check is media changed 57*4882a593Smuzhiyun CDROM_DRIVE_STATUS Get tray position, etc. 58*4882a593Smuzhiyun CDROM_DISC_STATUS Get disc type, etc. 59*4882a593Smuzhiyun CDROM_CHANGER_NSLOTS Get number of slots 60*4882a593Smuzhiyun CDROM_LOCKDOOR lock or unlock door 61*4882a593Smuzhiyun CDROM_DEBUG Turn debug messages on/off 62*4882a593Smuzhiyun CDROM_GET_CAPABILITY get capabilities 63*4882a593Smuzhiyun CDROMAUDIOBUFSIZ set the audio buffer size 64*4882a593Smuzhiyun DVD_READ_STRUCT Read structure 65*4882a593Smuzhiyun DVD_WRITE_STRUCT Write structure 66*4882a593Smuzhiyun DVD_AUTH Authentication 67*4882a593Smuzhiyun CDROM_SEND_PACKET send a packet to the drive 68*4882a593Smuzhiyun CDROM_NEXT_WRITABLE get next writable block 69*4882a593Smuzhiyun CDROM_LAST_WRITTEN get last block written on disc 70*4882a593Smuzhiyun ====================== =============================================== 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun 73*4882a593SmuzhiyunThe information that follows was determined from reading kernel source 74*4882a593Smuzhiyuncode. It is likely that some corrections will be made over time. 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun------------------------------------------------------------------------------ 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunGeneral: 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun Unless otherwise specified, all ioctl calls return 0 on success 81*4882a593Smuzhiyun and -1 with errno set to an appropriate value on error. (Some 82*4882a593Smuzhiyun ioctls return non-negative data values.) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun Unless otherwise specified, all ioctl calls return -1 and set 85*4882a593Smuzhiyun errno to EFAULT on a failed attempt to copy data to or from user 86*4882a593Smuzhiyun address space. 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun Individual drivers may return error codes not listed here. 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun Unless otherwise specified, all data structures and constants 91*4882a593Smuzhiyun are defined in <linux/cdrom.h> 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun------------------------------------------------------------------------------ 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun 96*4882a593SmuzhiyunCDROMPAUSE 97*4882a593Smuzhiyun Pause Audio Operation 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun usage:: 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun ioctl(fd, CDROMPAUSE, 0); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun inputs: 106*4882a593Smuzhiyun none 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun outputs: 110*4882a593Smuzhiyun none 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun error return: 114*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun 117*4882a593SmuzhiyunCDROMRESUME 118*4882a593Smuzhiyun Resume paused Audio Operation 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun usage:: 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun ioctl(fd, CDROMRESUME, 0); 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun inputs: 127*4882a593Smuzhiyun none 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun outputs: 131*4882a593Smuzhiyun none 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun error return: 135*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun 138*4882a593SmuzhiyunCDROMPLAYMSF 139*4882a593Smuzhiyun Play Audio MSF 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun (struct cdrom_msf) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun usage:: 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun struct cdrom_msf msf; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun ioctl(fd, CDROMPLAYMSF, &msf); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun inputs: 151*4882a593Smuzhiyun cdrom_msf structure, describing a segment of music to play 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun outputs: 155*4882a593Smuzhiyun none 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun error return: 159*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun notes: 162*4882a593Smuzhiyun - MSF stands for minutes-seconds-frames 163*4882a593Smuzhiyun - LBA stands for logical block address 164*4882a593Smuzhiyun - Segment is described as start and end times, where each time 165*4882a593Smuzhiyun is described as minutes:seconds:frames. 166*4882a593Smuzhiyun A frame is 1/75 of a second. 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun 169*4882a593SmuzhiyunCDROMPLAYTRKIND 170*4882a593Smuzhiyun Play Audio Track/index 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun (struct cdrom_ti) 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun usage:: 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct cdrom_ti ti; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun ioctl(fd, CDROMPLAYTRKIND, &ti); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun inputs: 182*4882a593Smuzhiyun cdrom_ti structure, describing a segment of music to play 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun outputs: 186*4882a593Smuzhiyun none 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun error return: 190*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun notes: 193*4882a593Smuzhiyun - Segment is described as start and end times, where each time 194*4882a593Smuzhiyun is described as a track and an index. 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun 198*4882a593SmuzhiyunCDROMREADTOCHDR 199*4882a593Smuzhiyun Read TOC header 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun (struct cdrom_tochdr) 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun usage:: 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun cdrom_tochdr header; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun ioctl(fd, CDROMREADTOCHDR, &header); 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun inputs: 211*4882a593Smuzhiyun cdrom_tochdr structure 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun outputs: 215*4882a593Smuzhiyun cdrom_tochdr structure 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun error return: 219*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun 223*4882a593SmuzhiyunCDROMREADTOCENTRY 224*4882a593Smuzhiyun Read TOC entry 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun (struct cdrom_tocentry) 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun usage:: 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun struct cdrom_tocentry entry; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun ioctl(fd, CDROMREADTOCENTRY, &entry); 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun inputs: 236*4882a593Smuzhiyun cdrom_tocentry structure 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun outputs: 240*4882a593Smuzhiyun cdrom_tocentry structure 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun error return: 244*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 245*4882a593Smuzhiyun - EINVAL entry.cdte_format not CDROM_MSF or CDROM_LBA 246*4882a593Smuzhiyun - EINVAL requested track out of bounds 247*4882a593Smuzhiyun - EIO I/O error reading TOC 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun notes: 250*4882a593Smuzhiyun - TOC stands for Table Of Contents 251*4882a593Smuzhiyun - MSF stands for minutes-seconds-frames 252*4882a593Smuzhiyun - LBA stands for logical block address 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun 256*4882a593SmuzhiyunCDROMSTOP 257*4882a593Smuzhiyun Stop the cdrom drive 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun usage:: 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun ioctl(fd, CDROMSTOP, 0); 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun inputs: 266*4882a593Smuzhiyun none 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun outputs: 270*4882a593Smuzhiyun none 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun error return: 274*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun notes: 277*4882a593Smuzhiyun - Exact interpretation of this ioctl depends on the device, 278*4882a593Smuzhiyun but most seem to spin the drive down. 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun 281*4882a593SmuzhiyunCDROMSTART 282*4882a593Smuzhiyun Start the cdrom drive 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun usage:: 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun ioctl(fd, CDROMSTART, 0); 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun inputs: 291*4882a593Smuzhiyun none 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun outputs: 295*4882a593Smuzhiyun none 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun error return: 299*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun notes: 302*4882a593Smuzhiyun - Exact interpretation of this ioctl depends on the device, 303*4882a593Smuzhiyun but most seem to spin the drive up and/or close the tray. 304*4882a593Smuzhiyun Other devices ignore the ioctl completely. 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun 307*4882a593SmuzhiyunCDROMEJECT 308*4882a593Smuzhiyun - Ejects the cdrom media 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun usage:: 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun ioctl(fd, CDROMEJECT, 0); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun inputs: 317*4882a593Smuzhiyun none 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun outputs: 321*4882a593Smuzhiyun none 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun error returns: 325*4882a593Smuzhiyun - ENOSYS cd drive not capable of ejecting 326*4882a593Smuzhiyun - EBUSY other processes are accessing drive, or door is locked 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun notes: 329*4882a593Smuzhiyun - See CDROM_LOCKDOOR, below. 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun 334*4882a593SmuzhiyunCDROMCLOSETRAY 335*4882a593Smuzhiyun pendant of CDROMEJECT 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun usage:: 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun ioctl(fd, CDROMCLOSETRAY, 0); 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun inputs: 344*4882a593Smuzhiyun none 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun outputs: 348*4882a593Smuzhiyun none 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun error returns: 352*4882a593Smuzhiyun - ENOSYS cd drive not capable of closing the tray 353*4882a593Smuzhiyun - EBUSY other processes are accessing drive, or door is locked 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun notes: 356*4882a593Smuzhiyun - See CDROM_LOCKDOOR, below. 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun 361*4882a593SmuzhiyunCDROMVOLCTRL 362*4882a593Smuzhiyun Control output volume (struct cdrom_volctrl) 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun usage:: 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun struct cdrom_volctrl volume; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun ioctl(fd, CDROMVOLCTRL, &volume); 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun inputs: 372*4882a593Smuzhiyun cdrom_volctrl structure containing volumes for up to 4 373*4882a593Smuzhiyun channels. 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun outputs: 376*4882a593Smuzhiyun none 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun error return: 380*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun 384*4882a593SmuzhiyunCDROMVOLREAD 385*4882a593Smuzhiyun Get the drive's volume setting 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun (struct cdrom_volctrl) 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun usage:: 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun struct cdrom_volctrl volume; 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun ioctl(fd, CDROMVOLREAD, &volume); 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun inputs: 397*4882a593Smuzhiyun none 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun outputs: 401*4882a593Smuzhiyun The current volume settings. 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun error return: 405*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun 409*4882a593SmuzhiyunCDROMSUBCHNL 410*4882a593Smuzhiyun Read subchannel data 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun (struct cdrom_subchnl) 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun usage:: 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun struct cdrom_subchnl q; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun ioctl(fd, CDROMSUBCHNL, &q); 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun inputs: 422*4882a593Smuzhiyun cdrom_subchnl structure 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun outputs: 426*4882a593Smuzhiyun cdrom_subchnl structure 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun error return: 430*4882a593Smuzhiyun - ENOSYS cd drive not audio-capable. 431*4882a593Smuzhiyun - EINVAL format not CDROM_MSF or CDROM_LBA 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun notes: 434*4882a593Smuzhiyun - Format is converted to CDROM_MSF or CDROM_LBA 435*4882a593Smuzhiyun as per user request on return 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun 439*4882a593SmuzhiyunCDROMREADRAW 440*4882a593Smuzhiyun read data in raw mode (2352 Bytes) 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun (struct cdrom_read) 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun usage:: 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun union { 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun struct cdrom_msf msf; /* input */ 449*4882a593Smuzhiyun char buffer[CD_FRAMESIZE_RAW]; /* return */ 450*4882a593Smuzhiyun } arg; 451*4882a593Smuzhiyun ioctl(fd, CDROMREADRAW, &arg); 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun inputs: 454*4882a593Smuzhiyun cdrom_msf structure indicating an address to read. 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun Only the start values are significant. 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun outputs: 459*4882a593Smuzhiyun Data written to address provided by user. 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun error return: 463*4882a593Smuzhiyun - EINVAL address less than 0, or msf less than 0:2:0 464*4882a593Smuzhiyun - ENOMEM out of memory 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun notes: 467*4882a593Smuzhiyun - As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this 468*4882a593Smuzhiyun ioctl accepts a cdrom_read structure, but actual source code 469*4882a593Smuzhiyun reads a cdrom_msf structure and writes a buffer of data to 470*4882a593Smuzhiyun the same address. 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun - MSF values are converted to LBA values via this formula:: 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET; 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun 479*4882a593SmuzhiyunCDROMREADMODE1 480*4882a593Smuzhiyun Read CDROM mode 1 data (2048 Bytes) 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun (struct cdrom_read) 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun notes: 485*4882a593Smuzhiyun Identical to CDROMREADRAW except that block size is 486*4882a593Smuzhiyun CD_FRAMESIZE (2048) bytes 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun 489*4882a593Smuzhiyun 490*4882a593SmuzhiyunCDROMREADMODE2 491*4882a593Smuzhiyun Read CDROM mode 2 data (2336 Bytes) 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun (struct cdrom_read) 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun notes: 496*4882a593Smuzhiyun Identical to CDROMREADRAW except that block size is 497*4882a593Smuzhiyun CD_FRAMESIZE_RAW0 (2336) bytes 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun 501*4882a593SmuzhiyunCDROMREADAUDIO 502*4882a593Smuzhiyun (struct cdrom_read_audio) 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun usage:: 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun struct cdrom_read_audio ra; 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun ioctl(fd, CDROMREADAUDIO, &ra); 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun inputs: 511*4882a593Smuzhiyun cdrom_read_audio structure containing read start 512*4882a593Smuzhiyun point and length 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun outputs: 515*4882a593Smuzhiyun audio data, returned to buffer indicated by ra 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun error return: 519*4882a593Smuzhiyun - EINVAL format not CDROM_MSF or CDROM_LBA 520*4882a593Smuzhiyun - EINVAL nframes not in range [1 75] 521*4882a593Smuzhiyun - ENXIO drive has no queue (probably means invalid fd) 522*4882a593Smuzhiyun - ENOMEM out of memory 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun 525*4882a593SmuzhiyunCDROMEJECT_SW 526*4882a593Smuzhiyun enable(1)/disable(0) auto-ejecting 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun usage:: 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun int val; 532*4882a593Smuzhiyun 533*4882a593Smuzhiyun ioctl(fd, CDROMEJECT_SW, val); 534*4882a593Smuzhiyun 535*4882a593Smuzhiyun inputs: 536*4882a593Smuzhiyun Flag specifying auto-eject flag. 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun outputs: 540*4882a593Smuzhiyun none 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun 543*4882a593Smuzhiyun error return: 544*4882a593Smuzhiyun - ENOSYS Drive is not capable of ejecting. 545*4882a593Smuzhiyun - EBUSY Door is locked 546*4882a593Smuzhiyun 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun 550*4882a593SmuzhiyunCDROMMULTISESSION 551*4882a593Smuzhiyun Obtain the start-of-last-session address of multi session disks 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun (struct cdrom_multisession) 554*4882a593Smuzhiyun 555*4882a593Smuzhiyun usage:: 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun struct cdrom_multisession ms_info; 558*4882a593Smuzhiyun 559*4882a593Smuzhiyun ioctl(fd, CDROMMULTISESSION, &ms_info); 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun inputs: 562*4882a593Smuzhiyun cdrom_multisession structure containing desired 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun format. 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun outputs: 567*4882a593Smuzhiyun cdrom_multisession structure is filled with last_session 568*4882a593Smuzhiyun information. 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun error return: 571*4882a593Smuzhiyun - EINVAL format not CDROM_MSF or CDROM_LBA 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun 574*4882a593SmuzhiyunCDROM_GET_MCN 575*4882a593Smuzhiyun Obtain the "Universal Product Code" 576*4882a593Smuzhiyun if available 577*4882a593Smuzhiyun 578*4882a593Smuzhiyun (struct cdrom_mcn) 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun usage:: 582*4882a593Smuzhiyun 583*4882a593Smuzhiyun struct cdrom_mcn mcn; 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun ioctl(fd, CDROM_GET_MCN, &mcn); 586*4882a593Smuzhiyun 587*4882a593Smuzhiyun inputs: 588*4882a593Smuzhiyun none 589*4882a593Smuzhiyun 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun outputs: 592*4882a593Smuzhiyun Universal Product Code 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun error return: 596*4882a593Smuzhiyun - ENOSYS Drive is not capable of reading MCN data. 597*4882a593Smuzhiyun 598*4882a593Smuzhiyun notes: 599*4882a593Smuzhiyun - Source code comments state:: 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun The following function is implemented, although very few 602*4882a593Smuzhiyun audio discs give Universal Product Code information, which 603*4882a593Smuzhiyun should just be the Medium Catalog Number on the box. Note, 604*4882a593Smuzhiyun that the way the code is written on the CD is /not/ uniform 605*4882a593Smuzhiyun across all discs! 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun 608*4882a593Smuzhiyun 609*4882a593Smuzhiyun 610*4882a593SmuzhiyunCDROM_GET_UPC 611*4882a593Smuzhiyun CDROM_GET_MCN (deprecated) 612*4882a593Smuzhiyun 613*4882a593Smuzhiyun 614*4882a593Smuzhiyun Not implemented, as of 2.6.8.1 615*4882a593Smuzhiyun 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun 618*4882a593SmuzhiyunCDROMRESET 619*4882a593Smuzhiyun hard-reset the drive 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun usage:: 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun ioctl(fd, CDROMRESET, 0); 625*4882a593Smuzhiyun 626*4882a593Smuzhiyun 627*4882a593Smuzhiyun inputs: 628*4882a593Smuzhiyun none 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun outputs: 632*4882a593Smuzhiyun none 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun error return: 636*4882a593Smuzhiyun - EACCES Access denied: requires CAP_SYS_ADMIN 637*4882a593Smuzhiyun - ENOSYS Drive is not capable of resetting. 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun 642*4882a593SmuzhiyunCDROMREADCOOKED 643*4882a593Smuzhiyun read data in cooked mode 644*4882a593Smuzhiyun 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun usage:: 647*4882a593Smuzhiyun 648*4882a593Smuzhiyun u8 buffer[CD_FRAMESIZE] 649*4882a593Smuzhiyun 650*4882a593Smuzhiyun ioctl(fd, CDROMREADCOOKED, buffer); 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun inputs: 653*4882a593Smuzhiyun none 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun 656*4882a593Smuzhiyun outputs: 657*4882a593Smuzhiyun 2048 bytes of data, "cooked" mode. 658*4882a593Smuzhiyun 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun notes: 661*4882a593Smuzhiyun Not implemented on all drives. 662*4882a593Smuzhiyun 663*4882a593Smuzhiyun 664*4882a593Smuzhiyun 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun 667*4882a593SmuzhiyunCDROMREADALL 668*4882a593Smuzhiyun read all 2646 bytes 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun 671*4882a593Smuzhiyun Same as CDROMREADCOOKED, but reads 2646 bytes. 672*4882a593Smuzhiyun 673*4882a593Smuzhiyun 674*4882a593Smuzhiyun 675*4882a593SmuzhiyunCDROMSEEK 676*4882a593Smuzhiyun seek msf address 677*4882a593Smuzhiyun 678*4882a593Smuzhiyun 679*4882a593Smuzhiyun usage:: 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun struct cdrom_msf msf; 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun ioctl(fd, CDROMSEEK, &msf); 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun inputs: 686*4882a593Smuzhiyun MSF address to seek to. 687*4882a593Smuzhiyun 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun outputs: 690*4882a593Smuzhiyun none 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun 693*4882a593Smuzhiyun 694*4882a593Smuzhiyun 695*4882a593SmuzhiyunCDROMPLAYBLK 696*4882a593Smuzhiyun scsi-cd only 697*4882a593Smuzhiyun 698*4882a593Smuzhiyun (struct cdrom_blk) 699*4882a593Smuzhiyun 700*4882a593Smuzhiyun 701*4882a593Smuzhiyun usage:: 702*4882a593Smuzhiyun 703*4882a593Smuzhiyun struct cdrom_blk blk; 704*4882a593Smuzhiyun 705*4882a593Smuzhiyun ioctl(fd, CDROMPLAYBLK, &blk); 706*4882a593Smuzhiyun 707*4882a593Smuzhiyun inputs: 708*4882a593Smuzhiyun Region to play 709*4882a593Smuzhiyun 710*4882a593Smuzhiyun 711*4882a593Smuzhiyun outputs: 712*4882a593Smuzhiyun none 713*4882a593Smuzhiyun 714*4882a593Smuzhiyun 715*4882a593Smuzhiyun 716*4882a593Smuzhiyun 717*4882a593SmuzhiyunCDROMGETSPINDOWN 718*4882a593Smuzhiyun usage:: 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun char spindown; 721*4882a593Smuzhiyun 722*4882a593Smuzhiyun ioctl(fd, CDROMGETSPINDOWN, &spindown); 723*4882a593Smuzhiyun 724*4882a593Smuzhiyun inputs: 725*4882a593Smuzhiyun none 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun 728*4882a593Smuzhiyun outputs: 729*4882a593Smuzhiyun The value of the current 4-bit spindown value. 730*4882a593Smuzhiyun 731*4882a593Smuzhiyun 732*4882a593Smuzhiyun 733*4882a593Smuzhiyun 734*4882a593Smuzhiyun 735*4882a593SmuzhiyunCDROMSETSPINDOWN 736*4882a593Smuzhiyun usage:: 737*4882a593Smuzhiyun 738*4882a593Smuzhiyun char spindown 739*4882a593Smuzhiyun 740*4882a593Smuzhiyun ioctl(fd, CDROMSETSPINDOWN, &spindown); 741*4882a593Smuzhiyun 742*4882a593Smuzhiyun inputs: 743*4882a593Smuzhiyun 4-bit value used to control spindown (TODO: more detail here) 744*4882a593Smuzhiyun 745*4882a593Smuzhiyun 746*4882a593Smuzhiyun outputs: 747*4882a593Smuzhiyun none 748*4882a593Smuzhiyun 749*4882a593Smuzhiyun 750*4882a593Smuzhiyun 751*4882a593Smuzhiyun 752*4882a593Smuzhiyun 753*4882a593Smuzhiyun 754*4882a593SmuzhiyunCDROM_SET_OPTIONS 755*4882a593Smuzhiyun Set behavior options 756*4882a593Smuzhiyun 757*4882a593Smuzhiyun 758*4882a593Smuzhiyun usage:: 759*4882a593Smuzhiyun 760*4882a593Smuzhiyun int options; 761*4882a593Smuzhiyun 762*4882a593Smuzhiyun ioctl(fd, CDROM_SET_OPTIONS, options); 763*4882a593Smuzhiyun 764*4882a593Smuzhiyun inputs: 765*4882a593Smuzhiyun New values for drive options. The logical 'or' of: 766*4882a593Smuzhiyun 767*4882a593Smuzhiyun ============== ================================== 768*4882a593Smuzhiyun CDO_AUTO_CLOSE close tray on first open(2) 769*4882a593Smuzhiyun CDO_AUTO_EJECT open tray on last release 770*4882a593Smuzhiyun CDO_USE_FFLAGS use O_NONBLOCK information on open 771*4882a593Smuzhiyun CDO_LOCK lock tray on open files 772*4882a593Smuzhiyun CDO_CHECK_TYPE check type on open for data 773*4882a593Smuzhiyun ============== ================================== 774*4882a593Smuzhiyun 775*4882a593Smuzhiyun outputs: 776*4882a593Smuzhiyun Returns the resulting options settings in the 777*4882a593Smuzhiyun ioctl return value. Returns -1 on error. 778*4882a593Smuzhiyun 779*4882a593Smuzhiyun error return: 780*4882a593Smuzhiyun - ENOSYS selected option(s) not supported by drive. 781*4882a593Smuzhiyun 782*4882a593Smuzhiyun 783*4882a593Smuzhiyun 784*4882a593Smuzhiyun 785*4882a593SmuzhiyunCDROM_CLEAR_OPTIONS 786*4882a593Smuzhiyun Clear behavior options 787*4882a593Smuzhiyun 788*4882a593Smuzhiyun 789*4882a593Smuzhiyun Same as CDROM_SET_OPTIONS, except that selected options are 790*4882a593Smuzhiyun turned off. 791*4882a593Smuzhiyun 792*4882a593Smuzhiyun 793*4882a593Smuzhiyun 794*4882a593SmuzhiyunCDROM_SELECT_SPEED 795*4882a593Smuzhiyun Set the CD-ROM speed 796*4882a593Smuzhiyun 797*4882a593Smuzhiyun 798*4882a593Smuzhiyun usage:: 799*4882a593Smuzhiyun 800*4882a593Smuzhiyun int speed; 801*4882a593Smuzhiyun 802*4882a593Smuzhiyun ioctl(fd, CDROM_SELECT_SPEED, speed); 803*4882a593Smuzhiyun 804*4882a593Smuzhiyun inputs: 805*4882a593Smuzhiyun New drive speed. 806*4882a593Smuzhiyun 807*4882a593Smuzhiyun 808*4882a593Smuzhiyun outputs: 809*4882a593Smuzhiyun none 810*4882a593Smuzhiyun 811*4882a593Smuzhiyun 812*4882a593Smuzhiyun error return: 813*4882a593Smuzhiyun - ENOSYS speed selection not supported by drive. 814*4882a593Smuzhiyun 815*4882a593Smuzhiyun 816*4882a593Smuzhiyun 817*4882a593SmuzhiyunCDROM_SELECT_DISC 818*4882a593Smuzhiyun Select disc (for juke-boxes) 819*4882a593Smuzhiyun 820*4882a593Smuzhiyun 821*4882a593Smuzhiyun usage:: 822*4882a593Smuzhiyun 823*4882a593Smuzhiyun int disk; 824*4882a593Smuzhiyun 825*4882a593Smuzhiyun ioctl(fd, CDROM_SELECT_DISC, disk); 826*4882a593Smuzhiyun 827*4882a593Smuzhiyun inputs: 828*4882a593Smuzhiyun Disk to load into drive. 829*4882a593Smuzhiyun 830*4882a593Smuzhiyun 831*4882a593Smuzhiyun outputs: 832*4882a593Smuzhiyun none 833*4882a593Smuzhiyun 834*4882a593Smuzhiyun 835*4882a593Smuzhiyun error return: 836*4882a593Smuzhiyun - EINVAL Disk number beyond capacity of drive 837*4882a593Smuzhiyun 838*4882a593Smuzhiyun 839*4882a593Smuzhiyun 840*4882a593SmuzhiyunCDROM_MEDIA_CHANGED 841*4882a593Smuzhiyun Check is media changed 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun 844*4882a593Smuzhiyun usage:: 845*4882a593Smuzhiyun 846*4882a593Smuzhiyun int slot; 847*4882a593Smuzhiyun 848*4882a593Smuzhiyun ioctl(fd, CDROM_MEDIA_CHANGED, slot); 849*4882a593Smuzhiyun 850*4882a593Smuzhiyun inputs: 851*4882a593Smuzhiyun Slot number to be tested, always zero except for jukeboxes. 852*4882a593Smuzhiyun 853*4882a593Smuzhiyun May also be special values CDSL_NONE or CDSL_CURRENT 854*4882a593Smuzhiyun 855*4882a593Smuzhiyun outputs: 856*4882a593Smuzhiyun Ioctl return value is 0 or 1 depending on whether the media 857*4882a593Smuzhiyun 858*4882a593Smuzhiyun has been changed, or -1 on error. 859*4882a593Smuzhiyun 860*4882a593Smuzhiyun error returns: 861*4882a593Smuzhiyun - ENOSYS Drive can't detect media change 862*4882a593Smuzhiyun - EINVAL Slot number beyond capacity of drive 863*4882a593Smuzhiyun - ENOMEM Out of memory 864*4882a593Smuzhiyun 865*4882a593Smuzhiyun 866*4882a593Smuzhiyun 867*4882a593SmuzhiyunCDROM_DRIVE_STATUS 868*4882a593Smuzhiyun Get tray position, etc. 869*4882a593Smuzhiyun 870*4882a593Smuzhiyun 871*4882a593Smuzhiyun usage:: 872*4882a593Smuzhiyun 873*4882a593Smuzhiyun int slot; 874*4882a593Smuzhiyun 875*4882a593Smuzhiyun ioctl(fd, CDROM_DRIVE_STATUS, slot); 876*4882a593Smuzhiyun 877*4882a593Smuzhiyun inputs: 878*4882a593Smuzhiyun Slot number to be tested, always zero except for jukeboxes. 879*4882a593Smuzhiyun 880*4882a593Smuzhiyun May also be special values CDSL_NONE or CDSL_CURRENT 881*4882a593Smuzhiyun 882*4882a593Smuzhiyun outputs: 883*4882a593Smuzhiyun Ioctl return value will be one of the following values 884*4882a593Smuzhiyun 885*4882a593Smuzhiyun from <linux/cdrom.h>: 886*4882a593Smuzhiyun 887*4882a593Smuzhiyun =================== ========================== 888*4882a593Smuzhiyun CDS_NO_INFO Information not available. 889*4882a593Smuzhiyun CDS_NO_DISC 890*4882a593Smuzhiyun CDS_TRAY_OPEN 891*4882a593Smuzhiyun CDS_DRIVE_NOT_READY 892*4882a593Smuzhiyun CDS_DISC_OK 893*4882a593Smuzhiyun -1 error 894*4882a593Smuzhiyun =================== ========================== 895*4882a593Smuzhiyun 896*4882a593Smuzhiyun error returns: 897*4882a593Smuzhiyun - ENOSYS Drive can't detect drive status 898*4882a593Smuzhiyun - EINVAL Slot number beyond capacity of drive 899*4882a593Smuzhiyun - ENOMEM Out of memory 900*4882a593Smuzhiyun 901*4882a593Smuzhiyun 902*4882a593Smuzhiyun 903*4882a593Smuzhiyun 904*4882a593SmuzhiyunCDROM_DISC_STATUS 905*4882a593Smuzhiyun Get disc type, etc. 906*4882a593Smuzhiyun 907*4882a593Smuzhiyun 908*4882a593Smuzhiyun usage:: 909*4882a593Smuzhiyun 910*4882a593Smuzhiyun ioctl(fd, CDROM_DISC_STATUS, 0); 911*4882a593Smuzhiyun 912*4882a593Smuzhiyun 913*4882a593Smuzhiyun inputs: 914*4882a593Smuzhiyun none 915*4882a593Smuzhiyun 916*4882a593Smuzhiyun 917*4882a593Smuzhiyun outputs: 918*4882a593Smuzhiyun Ioctl return value will be one of the following values 919*4882a593Smuzhiyun 920*4882a593Smuzhiyun from <linux/cdrom.h>: 921*4882a593Smuzhiyun 922*4882a593Smuzhiyun - CDS_NO_INFO 923*4882a593Smuzhiyun - CDS_AUDIO 924*4882a593Smuzhiyun - CDS_MIXED 925*4882a593Smuzhiyun - CDS_XA_2_2 926*4882a593Smuzhiyun - CDS_XA_2_1 927*4882a593Smuzhiyun - CDS_DATA_1 928*4882a593Smuzhiyun 929*4882a593Smuzhiyun error returns: 930*4882a593Smuzhiyun none at present 931*4882a593Smuzhiyun 932*4882a593Smuzhiyun notes: 933*4882a593Smuzhiyun - Source code comments state:: 934*4882a593Smuzhiyun 935*4882a593Smuzhiyun 936*4882a593Smuzhiyun Ok, this is where problems start. The current interface for 937*4882a593Smuzhiyun the CDROM_DISC_STATUS ioctl is flawed. It makes the false 938*4882a593Smuzhiyun assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc. 939*4882a593Smuzhiyun Unfortunately, while this is often the case, it is also 940*4882a593Smuzhiyun very common for CDs to have some tracks with data, and some 941*4882a593Smuzhiyun tracks with audio. Just because I feel like it, I declare 942*4882a593Smuzhiyun the following to be the best way to cope. If the CD has 943*4882a593Smuzhiyun ANY data tracks on it, it will be returned as a data CD. 944*4882a593Smuzhiyun If it has any XA tracks, I will return it as that. Now I 945*4882a593Smuzhiyun could simplify this interface by combining these returns with 946*4882a593Smuzhiyun the above, but this more clearly demonstrates the problem 947*4882a593Smuzhiyun with the current interface. Too bad this wasn't designed 948*4882a593Smuzhiyun to use bitmasks... -Erik 949*4882a593Smuzhiyun 950*4882a593Smuzhiyun Well, now we have the option CDS_MIXED: a mixed-type CD. 951*4882a593Smuzhiyun User level programmers might feel the ioctl is not very 952*4882a593Smuzhiyun useful. 953*4882a593Smuzhiyun ---david 954*4882a593Smuzhiyun 955*4882a593Smuzhiyun 956*4882a593Smuzhiyun 957*4882a593Smuzhiyun 958*4882a593SmuzhiyunCDROM_CHANGER_NSLOTS 959*4882a593Smuzhiyun Get number of slots 960*4882a593Smuzhiyun 961*4882a593Smuzhiyun 962*4882a593Smuzhiyun usage:: 963*4882a593Smuzhiyun 964*4882a593Smuzhiyun ioctl(fd, CDROM_CHANGER_NSLOTS, 0); 965*4882a593Smuzhiyun 966*4882a593Smuzhiyun 967*4882a593Smuzhiyun inputs: 968*4882a593Smuzhiyun none 969*4882a593Smuzhiyun 970*4882a593Smuzhiyun 971*4882a593Smuzhiyun outputs: 972*4882a593Smuzhiyun The ioctl return value will be the number of slots in a 973*4882a593Smuzhiyun CD changer. Typically 1 for non-multi-disk devices. 974*4882a593Smuzhiyun 975*4882a593Smuzhiyun error returns: 976*4882a593Smuzhiyun none 977*4882a593Smuzhiyun 978*4882a593Smuzhiyun 979*4882a593Smuzhiyun 980*4882a593SmuzhiyunCDROM_LOCKDOOR 981*4882a593Smuzhiyun lock or unlock door 982*4882a593Smuzhiyun 983*4882a593Smuzhiyun 984*4882a593Smuzhiyun usage:: 985*4882a593Smuzhiyun 986*4882a593Smuzhiyun int lock; 987*4882a593Smuzhiyun 988*4882a593Smuzhiyun ioctl(fd, CDROM_LOCKDOOR, lock); 989*4882a593Smuzhiyun 990*4882a593Smuzhiyun inputs: 991*4882a593Smuzhiyun Door lock flag, 1=lock, 0=unlock 992*4882a593Smuzhiyun 993*4882a593Smuzhiyun 994*4882a593Smuzhiyun outputs: 995*4882a593Smuzhiyun none 996*4882a593Smuzhiyun 997*4882a593Smuzhiyun 998*4882a593Smuzhiyun error returns: 999*4882a593Smuzhiyun - EDRIVE_CANT_DO_THIS 1000*4882a593Smuzhiyun 1001*4882a593Smuzhiyun Door lock function not supported. 1002*4882a593Smuzhiyun - EBUSY 1003*4882a593Smuzhiyun 1004*4882a593Smuzhiyun Attempt to unlock when multiple users 1005*4882a593Smuzhiyun have the drive open and not CAP_SYS_ADMIN 1006*4882a593Smuzhiyun 1007*4882a593Smuzhiyun notes: 1008*4882a593Smuzhiyun As of 2.6.8.1, the lock flag is a global lock, meaning that 1009*4882a593Smuzhiyun all CD drives will be locked or unlocked together. This is 1010*4882a593Smuzhiyun probably a bug. 1011*4882a593Smuzhiyun 1012*4882a593Smuzhiyun The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h> 1013*4882a593Smuzhiyun and is currently (2.6.8.1) the same as EOPNOTSUPP 1014*4882a593Smuzhiyun 1015*4882a593Smuzhiyun 1016*4882a593Smuzhiyun 1017*4882a593SmuzhiyunCDROM_DEBUG 1018*4882a593Smuzhiyun Turn debug messages on/off 1019*4882a593Smuzhiyun 1020*4882a593Smuzhiyun 1021*4882a593Smuzhiyun usage:: 1022*4882a593Smuzhiyun 1023*4882a593Smuzhiyun int debug; 1024*4882a593Smuzhiyun 1025*4882a593Smuzhiyun ioctl(fd, CDROM_DEBUG, debug); 1026*4882a593Smuzhiyun 1027*4882a593Smuzhiyun inputs: 1028*4882a593Smuzhiyun Cdrom debug flag, 0=disable, 1=enable 1029*4882a593Smuzhiyun 1030*4882a593Smuzhiyun 1031*4882a593Smuzhiyun outputs: 1032*4882a593Smuzhiyun The ioctl return value will be the new debug flag. 1033*4882a593Smuzhiyun 1034*4882a593Smuzhiyun 1035*4882a593Smuzhiyun error return: 1036*4882a593Smuzhiyun - EACCES Access denied: requires CAP_SYS_ADMIN 1037*4882a593Smuzhiyun 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun 1040*4882a593SmuzhiyunCDROM_GET_CAPABILITY 1041*4882a593Smuzhiyun get capabilities 1042*4882a593Smuzhiyun 1043*4882a593Smuzhiyun 1044*4882a593Smuzhiyun usage:: 1045*4882a593Smuzhiyun 1046*4882a593Smuzhiyun ioctl(fd, CDROM_GET_CAPABILITY, 0); 1047*4882a593Smuzhiyun 1048*4882a593Smuzhiyun 1049*4882a593Smuzhiyun inputs: 1050*4882a593Smuzhiyun none 1051*4882a593Smuzhiyun 1052*4882a593Smuzhiyun 1053*4882a593Smuzhiyun outputs: 1054*4882a593Smuzhiyun The ioctl return value is the current device capability 1055*4882a593Smuzhiyun flags. See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc. 1056*4882a593Smuzhiyun 1057*4882a593Smuzhiyun 1058*4882a593Smuzhiyun 1059*4882a593SmuzhiyunCDROMAUDIOBUFSIZ 1060*4882a593Smuzhiyun set the audio buffer size 1061*4882a593Smuzhiyun 1062*4882a593Smuzhiyun 1063*4882a593Smuzhiyun usage:: 1064*4882a593Smuzhiyun 1065*4882a593Smuzhiyun int arg; 1066*4882a593Smuzhiyun 1067*4882a593Smuzhiyun ioctl(fd, CDROMAUDIOBUFSIZ, val); 1068*4882a593Smuzhiyun 1069*4882a593Smuzhiyun inputs: 1070*4882a593Smuzhiyun New audio buffer size 1071*4882a593Smuzhiyun 1072*4882a593Smuzhiyun 1073*4882a593Smuzhiyun outputs: 1074*4882a593Smuzhiyun The ioctl return value is the new audio buffer size, or -1 1075*4882a593Smuzhiyun on error. 1076*4882a593Smuzhiyun 1077*4882a593Smuzhiyun error return: 1078*4882a593Smuzhiyun - ENOSYS Not supported by this driver. 1079*4882a593Smuzhiyun 1080*4882a593Smuzhiyun notes: 1081*4882a593Smuzhiyun Not supported by all drivers. 1082*4882a593Smuzhiyun 1083*4882a593Smuzhiyun 1084*4882a593Smuzhiyun 1085*4882a593Smuzhiyun 1086*4882a593SmuzhiyunDVD_READ_STRUCT Read structure 1087*4882a593Smuzhiyun 1088*4882a593Smuzhiyun usage:: 1089*4882a593Smuzhiyun 1090*4882a593Smuzhiyun dvd_struct s; 1091*4882a593Smuzhiyun 1092*4882a593Smuzhiyun ioctl(fd, DVD_READ_STRUCT, &s); 1093*4882a593Smuzhiyun 1094*4882a593Smuzhiyun inputs: 1095*4882a593Smuzhiyun dvd_struct structure, containing: 1096*4882a593Smuzhiyun 1097*4882a593Smuzhiyun =================== ========================================== 1098*4882a593Smuzhiyun type specifies the information desired, one of 1099*4882a593Smuzhiyun DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT, 1100*4882a593Smuzhiyun DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA, 1101*4882a593Smuzhiyun DVD_STRUCT_MANUFACT 1102*4882a593Smuzhiyun physical.layer_num desired layer, indexed from 0 1103*4882a593Smuzhiyun copyright.layer_num desired layer, indexed from 0 1104*4882a593Smuzhiyun disckey.agid 1105*4882a593Smuzhiyun =================== ========================================== 1106*4882a593Smuzhiyun 1107*4882a593Smuzhiyun outputs: 1108*4882a593Smuzhiyun dvd_struct structure, containing: 1109*4882a593Smuzhiyun 1110*4882a593Smuzhiyun =================== ================================ 1111*4882a593Smuzhiyun physical for type == DVD_STRUCT_PHYSICAL 1112*4882a593Smuzhiyun copyright for type == DVD_STRUCT_COPYRIGHT 1113*4882a593Smuzhiyun disckey.value for type == DVD_STRUCT_DISCKEY 1114*4882a593Smuzhiyun bca.{len,value} for type == DVD_STRUCT_BCA 1115*4882a593Smuzhiyun manufact.{len,valu} for type == DVD_STRUCT_MANUFACT 1116*4882a593Smuzhiyun =================== ================================ 1117*4882a593Smuzhiyun 1118*4882a593Smuzhiyun error returns: 1119*4882a593Smuzhiyun - EINVAL physical.layer_num exceeds number of layers 1120*4882a593Smuzhiyun - EIO Received invalid response from drive 1121*4882a593Smuzhiyun 1122*4882a593Smuzhiyun 1123*4882a593Smuzhiyun 1124*4882a593SmuzhiyunDVD_WRITE_STRUCT Write structure 1125*4882a593Smuzhiyun 1126*4882a593Smuzhiyun Not implemented, as of 2.6.8.1 1127*4882a593Smuzhiyun 1128*4882a593Smuzhiyun 1129*4882a593Smuzhiyun 1130*4882a593SmuzhiyunDVD_AUTH Authentication 1131*4882a593Smuzhiyun 1132*4882a593Smuzhiyun usage:: 1133*4882a593Smuzhiyun 1134*4882a593Smuzhiyun dvd_authinfo ai; 1135*4882a593Smuzhiyun 1136*4882a593Smuzhiyun ioctl(fd, DVD_AUTH, &ai); 1137*4882a593Smuzhiyun 1138*4882a593Smuzhiyun inputs: 1139*4882a593Smuzhiyun dvd_authinfo structure. See <linux/cdrom.h> 1140*4882a593Smuzhiyun 1141*4882a593Smuzhiyun 1142*4882a593Smuzhiyun outputs: 1143*4882a593Smuzhiyun dvd_authinfo structure. 1144*4882a593Smuzhiyun 1145*4882a593Smuzhiyun 1146*4882a593Smuzhiyun error return: 1147*4882a593Smuzhiyun - ENOTTY ai.type not recognized. 1148*4882a593Smuzhiyun 1149*4882a593Smuzhiyun 1150*4882a593Smuzhiyun 1151*4882a593SmuzhiyunCDROM_SEND_PACKET 1152*4882a593Smuzhiyun send a packet to the drive 1153*4882a593Smuzhiyun 1154*4882a593Smuzhiyun 1155*4882a593Smuzhiyun usage:: 1156*4882a593Smuzhiyun 1157*4882a593Smuzhiyun struct cdrom_generic_command cgc; 1158*4882a593Smuzhiyun 1159*4882a593Smuzhiyun ioctl(fd, CDROM_SEND_PACKET, &cgc); 1160*4882a593Smuzhiyun 1161*4882a593Smuzhiyun inputs: 1162*4882a593Smuzhiyun cdrom_generic_command structure containing the packet to send. 1163*4882a593Smuzhiyun 1164*4882a593Smuzhiyun 1165*4882a593Smuzhiyun outputs: 1166*4882a593Smuzhiyun none 1167*4882a593Smuzhiyun 1168*4882a593Smuzhiyun cdrom_generic_command structure containing results. 1169*4882a593Smuzhiyun 1170*4882a593Smuzhiyun error return: 1171*4882a593Smuzhiyun - EIO 1172*4882a593Smuzhiyun 1173*4882a593Smuzhiyun command failed. 1174*4882a593Smuzhiyun - EPERM 1175*4882a593Smuzhiyun 1176*4882a593Smuzhiyun Operation not permitted, either because a 1177*4882a593Smuzhiyun write command was attempted on a drive which 1178*4882a593Smuzhiyun is opened read-only, or because the command 1179*4882a593Smuzhiyun requires CAP_SYS_RAWIO 1180*4882a593Smuzhiyun - EINVAL 1181*4882a593Smuzhiyun 1182*4882a593Smuzhiyun cgc.data_direction not set 1183*4882a593Smuzhiyun 1184*4882a593Smuzhiyun 1185*4882a593Smuzhiyun 1186*4882a593SmuzhiyunCDROM_NEXT_WRITABLE 1187*4882a593Smuzhiyun get next writable block 1188*4882a593Smuzhiyun 1189*4882a593Smuzhiyun 1190*4882a593Smuzhiyun usage:: 1191*4882a593Smuzhiyun 1192*4882a593Smuzhiyun long next; 1193*4882a593Smuzhiyun 1194*4882a593Smuzhiyun ioctl(fd, CDROM_NEXT_WRITABLE, &next); 1195*4882a593Smuzhiyun 1196*4882a593Smuzhiyun inputs: 1197*4882a593Smuzhiyun none 1198*4882a593Smuzhiyun 1199*4882a593Smuzhiyun 1200*4882a593Smuzhiyun outputs: 1201*4882a593Smuzhiyun The next writable block. 1202*4882a593Smuzhiyun 1203*4882a593Smuzhiyun 1204*4882a593Smuzhiyun notes: 1205*4882a593Smuzhiyun If the device does not support this ioctl directly, the 1206*4882a593Smuzhiyun 1207*4882a593Smuzhiyun ioctl will return CDROM_LAST_WRITTEN + 7. 1208*4882a593Smuzhiyun 1209*4882a593Smuzhiyun 1210*4882a593Smuzhiyun 1211*4882a593SmuzhiyunCDROM_LAST_WRITTEN 1212*4882a593Smuzhiyun get last block written on disc 1213*4882a593Smuzhiyun 1214*4882a593Smuzhiyun 1215*4882a593Smuzhiyun usage:: 1216*4882a593Smuzhiyun 1217*4882a593Smuzhiyun long last; 1218*4882a593Smuzhiyun 1219*4882a593Smuzhiyun ioctl(fd, CDROM_LAST_WRITTEN, &last); 1220*4882a593Smuzhiyun 1221*4882a593Smuzhiyun inputs: 1222*4882a593Smuzhiyun none 1223*4882a593Smuzhiyun 1224*4882a593Smuzhiyun 1225*4882a593Smuzhiyun outputs: 1226*4882a593Smuzhiyun The last block written on disc 1227*4882a593Smuzhiyun 1228*4882a593Smuzhiyun 1229*4882a593Smuzhiyun notes: 1230*4882a593Smuzhiyun If the device does not support this ioctl directly, the 1231*4882a593Smuzhiyun result is derived from the disc's table of contents. If the 1232*4882a593Smuzhiyun table of contents can't be read, this ioctl returns an 1233*4882a593Smuzhiyun error. 1234