1 Summary of CDROM ioctl calls.
2 ============================
4 Edward A. Falk <efalk@google.com>
8 This document attempts to describe the ioctl(2) calls supported by
9 the CDROM layer. These are by-and-large implemented (as of Linux 2.6)
10 in drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c
12 ioctl values are listed in <linux/cdrom.h>. As of this writing, they
15 CDROMPAUSE Pause Audio Operation
16 CDROMRESUME Resume paused Audio Operation
17 CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)
18 CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti)
19 CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr)
20 CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry)
21 CDROMSTOP Stop the cdrom drive
22 CDROMSTART Start the cdrom drive
23 CDROMEJECT Ejects the cdrom media
24 CDROMVOLCTRL Control output volume (struct cdrom_volctrl)
25 CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl)
26 CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes)
28 CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes)
30 CDROMREADAUDIO (struct cdrom_read_audio)
31 CDROMEJECT_SW enable(1)/disable(0) auto-ejecting
32 CDROMMULTISESSION Obtain the start-of-last-session
33 address of multi session disks
34 (struct cdrom_multisession)
35 CDROM_GET_MCN Obtain the "Universal Product Code"
36 if available (struct cdrom_mcn)
37 CDROM_GET_UPC Deprecated, use CDROM_GET_MCN instead.
38 CDROMRESET hard-reset the drive
39 CDROMVOLREAD Get the drive's volume setting
40 (struct cdrom_volctrl)
41 CDROMREADRAW read data in raw mode (2352 Bytes)
43 CDROMREADCOOKED read data in cooked mode
44 CDROMSEEK seek msf address
45 CDROMPLAYBLK scsi-cd only, (struct cdrom_blk)
46 CDROMREADALL read all 2646 bytes
47 CDROMGETSPINDOWN return 4-bit spindown value
48 CDROMSETSPINDOWN set 4-bit spindown value
49 CDROMCLOSETRAY pendant of CDROMEJECT
50 CDROM_SET_OPTIONS Set behavior options
51 CDROM_CLEAR_OPTIONS Clear behavior options
52 CDROM_SELECT_SPEED Set the CD-ROM speed
53 CDROM_SELECT_DISC Select disc (for juke-boxes)
54 CDROM_MEDIA_CHANGED Check is media changed
55 CDROM_DRIVE_STATUS Get tray position, etc.
56 CDROM_DISC_STATUS Get disc type, etc.
57 CDROM_CHANGER_NSLOTS Get number of slots
58 CDROM_LOCKDOOR lock or unlock door
59 CDROM_DEBUG Turn debug messages on/off
60 CDROM_GET_CAPABILITY get capabilities
61 CDROMAUDIOBUFSIZ set the audio buffer size
62 DVD_READ_STRUCT Read structure
63 DVD_WRITE_STRUCT Write structure
64 DVD_AUTH Authentication
65 CDROM_SEND_PACKET send a packet to the drive
66 CDROM_NEXT_WRITABLE get next writable block
67 CDROM_LAST_WRITTEN get last block written on disc
70 The information that follows was determined from reading kernel source
71 code. It is likely that some corrections will be made over time.
81 Unless otherwise specified, all ioctl calls return 0 on success
82 and -1 with errno set to an appropriate value on error. (Some
83 ioctls return non-negative data values.)
85 Unless otherwise specified, all ioctl calls return -1 and set
86 errno to EFAULT on a failed attempt to copy data to or from user
89 Individual drivers may return error codes not listed here.
91 Unless otherwise specified, all data structures and constants
92 are defined in <linux/cdrom.h>
97 CDROMPAUSE Pause Audio Operation
101 ioctl(fd, CDROMPAUSE, 0);
108 ENOSYS cd drive not audio-capable.
111 CDROMRESUME Resume paused Audio Operation
115 ioctl(fd, CDROMRESUME, 0);
122 ENOSYS cd drive not audio-capable.
125 CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)
129 struct cdrom_msf msf;
130 ioctl(fd, CDROMPLAYMSF, &msf);
133 cdrom_msf structure, describing a segment of music to play
138 ENOSYS cd drive not audio-capable.
141 MSF stands for minutes-seconds-frames
142 LBA stands for logical block address
144 Segment is described as start and end times, where each time
145 is described as minutes:seconds:frames. A frame is 1/75 of
149 CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti)
154 ioctl(fd, CDROMPLAYTRKIND, &ti);
157 cdrom_ti structure, describing a segment of music to play
162 ENOSYS cd drive not audio-capable.
165 Segment is described as start and end times, where each time
166 is described as a track and an index.
170 CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr)
175 ioctl(fd, CDROMREADTOCHDR, &header);
178 cdrom_tochdr structure
181 cdrom_tochdr structure
184 ENOSYS cd drive not audio-capable.
188 CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry)
192 struct cdrom_tocentry entry;
193 ioctl(fd, CDROMREADTOCENTRY, &entry);
196 cdrom_tocentry structure
199 cdrom_tocentry structure
202 ENOSYS cd drive not audio-capable.
203 EINVAL entry.cdte_format not CDROM_MSF or CDROM_LBA
204 EINVAL requested track out of bounds
205 EIO I/O error reading TOC
208 TOC stands for Table Of Contents
209 MSF stands for minutes-seconds-frames
210 LBA stands for logical block address
214 CDROMSTOP Stop the cdrom drive
218 ioctl(fd, CDROMSTOP, 0);
225 ENOSYS cd drive not audio-capable.
228 Exact interpretation of this ioctl depends on the device,
229 but most seem to spin the drive down.
232 CDROMSTART Start the cdrom drive
236 ioctl(fd, CDROMSTART, 0);
243 ENOSYS cd drive not audio-capable.
246 Exact interpretation of this ioctl depends on the device,
247 but most seem to spin the drive up and/or close the tray.
248 Other devices ignore the ioctl completely.
251 CDROMEJECT Ejects the cdrom media
255 ioctl(fd, CDROMEJECT, 0);
262 ENOSYS cd drive not capable of ejecting
263 EBUSY other processes are accessing drive, or door is locked
266 See CDROM_LOCKDOOR, below.
270 CDROMCLOSETRAY pendant of CDROMEJECT
274 ioctl(fd, CDROMCLOSETRAY, 0);
281 ENOSYS cd drive not capable of closing the tray
282 EBUSY other processes are accessing drive, or door is locked
285 See CDROM_LOCKDOOR, below.
289 CDROMVOLCTRL Control output volume (struct cdrom_volctrl)
293 struct cdrom_volctrl volume;
294 ioctl(fd, CDROMVOLCTRL, &volume);
297 cdrom_volctrl structure containing volumes for up to 4
303 ENOSYS cd drive not audio-capable.
307 CDROMVOLREAD Get the drive's volume setting
308 (struct cdrom_volctrl)
312 struct cdrom_volctrl volume;
313 ioctl(fd, CDROMVOLREAD, &volume);
318 The current volume settings.
321 ENOSYS cd drive not audio-capable.
325 CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl)
329 struct cdrom_subchnl q;
330 ioctl(fd, CDROMSUBCHNL, &q);
333 cdrom_subchnl structure
336 cdrom_subchnl structure
339 ENOSYS cd drive not audio-capable.
340 EINVAL format not CDROM_MSF or CDROM_LBA
343 Format is converted to CDROM_MSF or CDROM_LBA
344 as per user request on return
348 CDROMREADRAW read data in raw mode (2352 Bytes)
354 struct cdrom_msf msf; /* input */
355 char buffer[CD_FRAMESIZE_RAW]; /* return */
357 ioctl(fd, CDROMREADRAW, &arg);
360 cdrom_msf structure indicating an address to read.
361 Only the start values are significant.
364 Data written to address provided by user.
367 EINVAL address less than 0, or msf less than 0:2:0
371 As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this
372 ioctl accepts a cdrom_read structure, but actual source code
373 reads a cdrom_msf structure and writes a buffer of data to
376 MSF values are converted to LBA values via this formula:
378 lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
383 CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes)
387 Identical to CDROMREADRAW except that block size is
388 CD_FRAMESIZE (2048) bytes
392 CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes)
396 Identical to CDROMREADRAW except that block size is
397 CD_FRAMESIZE_RAW0 (2336) bytes
401 CDROMREADAUDIO (struct cdrom_read_audio)
405 struct cdrom_read_audio ra;
406 ioctl(fd, CDROMREADAUDIO, &ra);
409 cdrom_read_audio structure containing read start
413 audio data, returned to buffer indicated by ra
416 EINVAL format not CDROM_MSF or CDROM_LBA
417 EINVAL nframes not in range [1 75]
418 ENXIO drive has no queue (probably means invalid fd)
422 CDROMEJECT_SW enable(1)/disable(0) auto-ejecting
427 ioctl(fd, CDROMEJECT_SW, val);
430 Flag specifying auto-eject flag.
435 ENOSYS Drive is not capable of ejecting.
441 CDROMMULTISESSION Obtain the start-of-last-session
442 address of multi session disks
443 (struct cdrom_multisession)
446 struct cdrom_multisession ms_info;
447 ioctl(fd, CDROMMULTISESSION, &ms_info);
450 cdrom_multisession structure containing desired
454 cdrom_multisession structure is filled with last_session
458 EINVAL format not CDROM_MSF or CDROM_LBA
461 CDROM_GET_MCN Obtain the "Universal Product Code"
462 if available (struct cdrom_mcn)
466 struct cdrom_mcn mcn;
467 ioctl(fd, CDROM_GET_MCN, &mcn);
472 Universal Product Code
475 ENOSYS Drive is not capable of reading MCN data.
478 Source code comments state:
480 The following function is implemented, although very few
481 audio discs give Universal Product Code information, which
482 should just be the Medium Catalog Number on the box. Note,
483 that the way the code is written on the CD is /not/ uniform
489 CDROM_GET_UPC CDROM_GET_MCN (deprecated)
491 Not implemented, as of 2.6.8.1
495 CDROMRESET hard-reset the drive
499 ioctl(fd, CDROMRESET, 0);
506 EACCES Access denied: requires CAP_SYS_ADMIN
507 ENOSYS Drive is not capable of resetting.
512 CDROMREADCOOKED read data in cooked mode
516 u8 buffer[CD_FRAMESIZE]
517 ioctl(fd, CDROMREADCOOKED, buffer);
522 2048 bytes of data, "cooked" mode.
525 Not implemented on all drives.
530 CDROMREADALL read all 2646 bytes
532 Same as CDROMREADCOOKED, but reads 2646 bytes.
536 CDROMSEEK seek msf address
540 struct cdrom_msf msf;
541 ioctl(fd, CDROMSEEK, &msf);
544 MSF address to seek to.
550 CDROMPLAYBLK scsi-cd only, (struct cdrom_blk)
554 struct cdrom_blk blk;
555 ioctl(fd, CDROMPLAYBLK, &blk);
569 ioctl(fd, CDROMGETSPINDOWN, &spindown);
574 The value of the current 4-bit spindown value.
584 ioctl(fd, CDROMSETSPINDOWN, &spindown);
587 4-bit value used to control spindown (TODO: more detail here)
595 CDROM_SET_OPTIONS Set behavior options
600 ioctl(fd, CDROM_SET_OPTIONS, options);
603 New values for drive options. The logical 'or' of:
604 CDO_AUTO_CLOSE close tray on first open(2)
605 CDO_AUTO_EJECT open tray on last release
606 CDO_USE_FFLAGS use O_NONBLOCK information on open
607 CDO_LOCK lock tray on open files
608 CDO_CHECK_TYPE check type on open for data
611 Returns the resulting options settings in the
612 ioctl return value. Returns -1 on error.
615 ENOSYS selected option(s) not supported by drive.
620 CDROM_CLEAR_OPTIONS Clear behavior options
622 Same as CDROM_SET_OPTIONS, except that selected options are
627 CDROM_SELECT_SPEED Set the CD-ROM speed
632 ioctl(fd, CDROM_SELECT_SPEED, speed);
640 ENOSYS speed selection not supported by drive.
644 CDROM_SELECT_DISC Select disc (for juke-boxes)
649 ioctl(fd, CDROM_SELECT_DISC, disk);
652 Disk to load into drive.
657 EINVAL Disk number beyond capacity of drive
661 CDROM_MEDIA_CHANGED Check is media changed
666 ioctl(fd, CDROM_MEDIA_CHANGED, slot);
669 Slot number to be tested, always zero except for jukeboxes.
670 May also be special values CDSL_NONE or CDSL_CURRENT
673 Ioctl return value is 0 or 1 depending on whether the media
674 has been changed, or -1 on error.
677 ENOSYS Drive can't detect media change
678 EINVAL Slot number beyond capacity of drive
683 CDROM_DRIVE_STATUS Get tray position, etc.
688 ioctl(fd, CDROM_DRIVE_STATUS, slot);
691 Slot number to be tested, always zero except for jukeboxes.
692 May also be special values CDSL_NONE or CDSL_CURRENT
695 Ioctl return value will be one of the following values
696 from <linux/cdrom.h>:
698 CDS_NO_INFO Information not available.
706 ENOSYS Drive can't detect drive status
707 EINVAL Slot number beyond capacity of drive
713 CDROM_DISC_STATUS Get disc type, etc.
717 ioctl(fd, CDROM_DISC_STATUS, 0);
722 Ioctl return value will be one of the following values
723 from <linux/cdrom.h>:
731 error returns: none at present
734 Source code comments state:
736 Ok, this is where problems start. The current interface for
737 the CDROM_DISC_STATUS ioctl is flawed. It makes the false
738 assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.
739 Unfortunately, while this is often the case, it is also
740 very common for CDs to have some tracks with data, and some
741 tracks with audio. Just because I feel like it, I declare
742 the following to be the best way to cope. If the CD has
743 ANY data tracks on it, it will be returned as a data CD.
744 If it has any XA tracks, I will return it as that. Now I
745 could simplify this interface by combining these returns with
746 the above, but this more clearly demonstrates the problem
747 with the current interface. Too bad this wasn't designed
748 to use bitmasks... -Erik
750 Well, now we have the option CDS_MIXED: a mixed-type CD.
751 User level programmers might feel the ioctl is not very
758 CDROM_CHANGER_NSLOTS Get number of slots
762 ioctl(fd, CDROM_CHANGER_NSLOTS, 0);
767 The ioctl return value will be the number of slots in a
768 CD changer. Typically 1 for non-multi-disk devices.
774 CDROM_LOCKDOOR lock or unlock door
779 ioctl(fd, CDROM_LOCKDOOR, lock);
782 Door lock flag, 1=lock, 0=unlock
787 EDRIVE_CANT_DO_THIS Door lock function not supported.
788 EBUSY Attempt to unlock when multiple users
789 have the drive open and not CAP_SYS_ADMIN
792 As of 2.6.8.1, the lock flag is a global lock, meaning that
793 all CD drives will be locked or unlocked together. This is
796 The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h>
797 and is currently (2.6.8.1) the same as EOPNOTSUPP
801 CDROM_DEBUG Turn debug messages on/off
806 ioctl(fd, CDROM_DEBUG, debug);
809 Cdrom debug flag, 0=disable, 1=enable
812 The ioctl return value will be the new debug flag.
815 EACCES Access denied: requires CAP_SYS_ADMIN
819 CDROM_GET_CAPABILITY get capabilities
823 ioctl(fd, CDROM_GET_CAPABILITY, 0);
828 The ioctl return value is the current device capability
829 flags. See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc.
833 CDROMAUDIOBUFSIZ set the audio buffer size
838 ioctl(fd, CDROMAUDIOBUFSIZ, val);
841 New audio buffer size
844 The ioctl return value is the new audio buffer size, or -1
848 ENOSYS Not supported by this driver.
851 Not supported by all drivers.
855 DVD_READ_STRUCT Read structure
860 ioctl(fd, DVD_READ_STRUCT, &s);
863 dvd_struct structure, containing:
864 type specifies the information desired, one of
865 DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT,
866 DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA,
868 physical.layer_num desired layer, indexed from 0
869 copyright.layer_num desired layer, indexed from 0
873 dvd_struct structure, containing:
874 physical for type == DVD_STRUCT_PHYSICAL
875 copyright for type == DVD_STRUCT_COPYRIGHT
876 disckey.value for type == DVD_STRUCT_DISCKEY
877 bca.{len,value} for type == DVD_STRUCT_BCA
878 manufact.{len,valu} for type == DVD_STRUCT_MANUFACT
881 EINVAL physical.layer_num exceeds number of layers
882 EIO Received invalid response from drive
886 DVD_WRITE_STRUCT Write structure
888 Not implemented, as of 2.6.8.1
892 DVD_AUTH Authentication
897 ioctl(fd, DVD_AUTH, &ai);
900 dvd_authinfo structure. See <linux/cdrom.h>
903 dvd_authinfo structure.
906 ENOTTY ai.type not recognized.
910 CDROM_SEND_PACKET send a packet to the drive
914 struct cdrom_generic_command cgc;
915 ioctl(fd, CDROM_SEND_PACKET, &cgc);
918 cdrom_generic_command structure containing the packet to send.
921 cdrom_generic_command structure containing results.
925 EPERM Operation not permitted, either because a
926 write command was attempted on a drive which
927 is opened read-only, or because the command
928 requires CAP_SYS_RAWIO
929 EINVAL cgc.data_direction not set
933 CDROM_NEXT_WRITABLE get next writable block
938 ioctl(fd, CDROM_NEXT_WRITABLE, &next);
943 The next writable block.
946 If the device does not support this ioctl directly, the
947 ioctl will return CDROM_LAST_WRITTEN + 7.
951 CDROM_LAST_WRITTEN get last block written on disc
956 ioctl(fd, CDROM_LAST_WRITTEN, &last);
961 The last block written on disc
964 If the device does not support this ioctl directly, the
965 result is derived from the disc's table of contents. If the
966 table of contents can't be read, this ioctl returns an