123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968 |
- Summary of CDROM ioctl calls.
- ============================
- Edward A. Falk <efalk@google.com>
- November, 2004
- This document attempts to describe the ioctl(2) calls supported by
- the CDROM layer. These are by-and-large implemented (as of Linux 2.6)
- in drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c
- ioctl values are listed in <linux/cdrom.h>. As of this writing, they
- are as follows:
- CDROMPAUSE Pause Audio Operation
- CDROMRESUME Resume paused Audio Operation
- CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)
- CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti)
- CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr)
- CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry)
- CDROMSTOP Stop the cdrom drive
- CDROMSTART Start the cdrom drive
- CDROMEJECT Ejects the cdrom media
- CDROMVOLCTRL Control output volume (struct cdrom_volctrl)
- CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl)
- CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes)
- (struct cdrom_read)
- CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes)
- (struct cdrom_read)
- CDROMREADAUDIO (struct cdrom_read_audio)
- CDROMEJECT_SW enable(1)/disable(0) auto-ejecting
- CDROMMULTISESSION Obtain the start-of-last-session
- address of multi session disks
- (struct cdrom_multisession)
- CDROM_GET_MCN Obtain the "Universal Product Code"
- if available (struct cdrom_mcn)
- CDROM_GET_UPC Deprecated, use CDROM_GET_MCN instead.
- CDROMRESET hard-reset the drive
- CDROMVOLREAD Get the drive's volume setting
- (struct cdrom_volctrl)
- CDROMREADRAW read data in raw mode (2352 Bytes)
- (struct cdrom_read)
- CDROMREADCOOKED read data in cooked mode
- CDROMSEEK seek msf address
- CDROMPLAYBLK scsi-cd only, (struct cdrom_blk)
- CDROMREADALL read all 2646 bytes
- CDROMGETSPINDOWN return 4-bit spindown value
- CDROMSETSPINDOWN set 4-bit spindown value
- CDROMCLOSETRAY pendant of CDROMEJECT
- CDROM_SET_OPTIONS Set behavior options
- CDROM_CLEAR_OPTIONS Clear behavior options
- CDROM_SELECT_SPEED Set the CD-ROM speed
- CDROM_SELECT_DISC Select disc (for juke-boxes)
- CDROM_MEDIA_CHANGED Check is media changed
- CDROM_DRIVE_STATUS Get tray position, etc.
- CDROM_DISC_STATUS Get disc type, etc.
- CDROM_CHANGER_NSLOTS Get number of slots
- CDROM_LOCKDOOR lock or unlock door
- CDROM_DEBUG Turn debug messages on/off
- CDROM_GET_CAPABILITY get capabilities
- CDROMAUDIOBUFSIZ set the audio buffer size
- DVD_READ_STRUCT Read structure
- DVD_WRITE_STRUCT Write structure
- DVD_AUTH Authentication
- CDROM_SEND_PACKET send a packet to the drive
- CDROM_NEXT_WRITABLE get next writable block
- CDROM_LAST_WRITTEN get last block written on disc
- The information that follows was determined from reading kernel source
- code. It is likely that some corrections will be made over time.
- General:
- Unless otherwise specified, all ioctl calls return 0 on success
- and -1 with errno set to an appropriate value on error. (Some
- ioctls return non-negative data values.)
- Unless otherwise specified, all ioctl calls return -1 and set
- errno to EFAULT on a failed attempt to copy data to or from user
- address space.
- Individual drivers may return error codes not listed here.
- Unless otherwise specified, all data structures and constants
- are defined in <linux/cdrom.h>
- CDROMPAUSE Pause Audio Operation
- usage:
- ioctl(fd, CDROMPAUSE, 0);
- inputs: none
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- CDROMRESUME Resume paused Audio Operation
- usage:
- ioctl(fd, CDROMRESUME, 0);
- inputs: none
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)
- usage:
- struct cdrom_msf msf;
- ioctl(fd, CDROMPLAYMSF, &msf);
- inputs:
- cdrom_msf structure, describing a segment of music to play
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- notes:
- MSF stands for minutes-seconds-frames
- LBA stands for logical block address
- Segment is described as start and end times, where each time
- is described as minutes:seconds:frames. A frame is 1/75 of
- a second.
- CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti)
- usage:
- struct cdrom_ti ti;
- ioctl(fd, CDROMPLAYTRKIND, &ti);
- inputs:
- cdrom_ti structure, describing a segment of music to play
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- notes:
- Segment is described as start and end times, where each time
- is described as a track and an index.
- CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr)
- usage:
- cdrom_tochdr header;
- ioctl(fd, CDROMREADTOCHDR, &header);
- inputs:
- cdrom_tochdr structure
- outputs:
- cdrom_tochdr structure
- error return:
- ENOSYS cd drive not audio-capable.
- CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry)
- usage:
- struct cdrom_tocentry entry;
- ioctl(fd, CDROMREADTOCENTRY, &entry);
- inputs:
- cdrom_tocentry structure
- outputs:
- cdrom_tocentry structure
- error return:
- ENOSYS cd drive not audio-capable.
- EINVAL entry.cdte_format not CDROM_MSF or CDROM_LBA
- EINVAL requested track out of bounds
- EIO I/O error reading TOC
- notes:
- TOC stands for Table Of Contents
- MSF stands for minutes-seconds-frames
- LBA stands for logical block address
- CDROMSTOP Stop the cdrom drive
- usage:
- ioctl(fd, CDROMSTOP, 0);
- inputs: none
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- notes:
- Exact interpretation of this ioctl depends on the device,
- but most seem to spin the drive down.
- CDROMSTART Start the cdrom drive
- usage:
- ioctl(fd, CDROMSTART, 0);
- inputs: none
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- notes:
- Exact interpretation of this ioctl depends on the device,
- but most seem to spin the drive up and/or close the tray.
- Other devices ignore the ioctl completely.
- CDROMEJECT Ejects the cdrom media
- usage:
- ioctl(fd, CDROMEJECT, 0);
- inputs: none
- outputs: none
- error returns:
- ENOSYS cd drive not capable of ejecting
- EBUSY other processes are accessing drive, or door is locked
- notes:
- See CDROM_LOCKDOOR, below.
- CDROMCLOSETRAY pendant of CDROMEJECT
- usage:
- ioctl(fd, CDROMCLOSETRAY, 0);
- inputs: none
- outputs: none
- error returns:
- ENOSYS cd drive not capable of closing the tray
- EBUSY other processes are accessing drive, or door is locked
- notes:
- See CDROM_LOCKDOOR, below.
- CDROMVOLCTRL Control output volume (struct cdrom_volctrl)
- usage:
- struct cdrom_volctrl volume;
- ioctl(fd, CDROMVOLCTRL, &volume);
- inputs:
- cdrom_volctrl structure containing volumes for up to 4
- channels.
- outputs: none
- error return:
- ENOSYS cd drive not audio-capable.
- CDROMVOLREAD Get the drive's volume setting
- (struct cdrom_volctrl)
- usage:
- struct cdrom_volctrl volume;
- ioctl(fd, CDROMVOLREAD, &volume);
- inputs: none
- outputs:
- The current volume settings.
- error return:
- ENOSYS cd drive not audio-capable.
- CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl)
- usage:
- struct cdrom_subchnl q;
- ioctl(fd, CDROMSUBCHNL, &q);
- inputs:
- cdrom_subchnl structure
- outputs:
- cdrom_subchnl structure
- error return:
- ENOSYS cd drive not audio-capable.
- EINVAL format not CDROM_MSF or CDROM_LBA
- notes:
- Format is converted to CDROM_MSF or CDROM_LBA
- as per user request on return
- CDROMREADRAW read data in raw mode (2352 Bytes)
- (struct cdrom_read)
- usage:
- union {
- struct cdrom_msf msf; /* input */
- char buffer[CD_FRAMESIZE_RAW]; /* return */
- } arg;
- ioctl(fd, CDROMREADRAW, &arg);
- inputs:
- cdrom_msf structure indicating an address to read.
- Only the start values are significant.
- outputs:
- Data written to address provided by user.
- error return:
- EINVAL address less than 0, or msf less than 0:2:0
- ENOMEM out of memory
- notes:
- As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this
- ioctl accepts a cdrom_read structure, but actual source code
- reads a cdrom_msf structure and writes a buffer of data to
- the same address.
- MSF values are converted to LBA values via this formula:
- lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
- CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes)
- (struct cdrom_read)
- notes:
- Identical to CDROMREADRAW except that block size is
- CD_FRAMESIZE (2048) bytes
- CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes)
- (struct cdrom_read)
- notes:
- Identical to CDROMREADRAW except that block size is
- CD_FRAMESIZE_RAW0 (2336) bytes
- CDROMREADAUDIO (struct cdrom_read_audio)
- usage:
- struct cdrom_read_audio ra;
- ioctl(fd, CDROMREADAUDIO, &ra);
- inputs:
- cdrom_read_audio structure containing read start
- point and length
- outputs:
- audio data, returned to buffer indicated by ra
- error return:
- EINVAL format not CDROM_MSF or CDROM_LBA
- EINVAL nframes not in range [1 75]
- ENXIO drive has no queue (probably means invalid fd)
- ENOMEM out of memory
- CDROMEJECT_SW enable(1)/disable(0) auto-ejecting
- usage:
- int val;
- ioctl(fd, CDROMEJECT_SW, val);
- inputs:
- Flag specifying auto-eject flag.
- outputs: none
- error return:
- ENOSYS Drive is not capable of ejecting.
- EBUSY Door is locked
- CDROMMULTISESSION Obtain the start-of-last-session
- address of multi session disks
- (struct cdrom_multisession)
- usage:
- struct cdrom_multisession ms_info;
- ioctl(fd, CDROMMULTISESSION, &ms_info);
- inputs:
- cdrom_multisession structure containing desired
- format.
- outputs:
- cdrom_multisession structure is filled with last_session
- information.
- error return:
- EINVAL format not CDROM_MSF or CDROM_LBA
- CDROM_GET_MCN Obtain the "Universal Product Code"
- if available (struct cdrom_mcn)
- usage:
- struct cdrom_mcn mcn;
- ioctl(fd, CDROM_GET_MCN, &mcn);
- inputs: none
- outputs:
- Universal Product Code
- error return:
- ENOSYS Drive is not capable of reading MCN data.
- notes:
- Source code comments state:
- The following function is implemented, although very few
- audio discs give Universal Product Code information, which
- should just be the Medium Catalog Number on the box. Note,
- that the way the code is written on the CD is /not/ uniform
- across all discs!
- CDROM_GET_UPC CDROM_GET_MCN (deprecated)
- Not implemented, as of 2.6.8.1
- CDROMRESET hard-reset the drive
- usage:
- ioctl(fd, CDROMRESET, 0);
- inputs: none
- outputs: none
- error return:
- EACCES Access denied: requires CAP_SYS_ADMIN
- ENOSYS Drive is not capable of resetting.
- CDROMREADCOOKED read data in cooked mode
- usage:
- u8 buffer[CD_FRAMESIZE]
- ioctl(fd, CDROMREADCOOKED, buffer);
- inputs: none
- outputs:
- 2048 bytes of data, "cooked" mode.
- notes:
- Not implemented on all drives.
- CDROMREADALL read all 2646 bytes
- Same as CDROMREADCOOKED, but reads 2646 bytes.
- CDROMSEEK seek msf address
- usage:
- struct cdrom_msf msf;
- ioctl(fd, CDROMSEEK, &msf);
- inputs:
- MSF address to seek to.
- outputs: none
- CDROMPLAYBLK scsi-cd only, (struct cdrom_blk)
- usage:
- struct cdrom_blk blk;
- ioctl(fd, CDROMPLAYBLK, &blk);
- inputs:
- Region to play
- outputs: none
- CDROMGETSPINDOWN
- usage:
- char spindown;
- ioctl(fd, CDROMGETSPINDOWN, &spindown);
- inputs: none
- outputs:
- The value of the current 4-bit spindown value.
- CDROMSETSPINDOWN
- usage:
- char spindown
- ioctl(fd, CDROMSETSPINDOWN, &spindown);
- inputs:
- 4-bit value used to control spindown (TODO: more detail here)
- outputs: none
- CDROM_SET_OPTIONS Set behavior options
- usage:
- int options;
- ioctl(fd, CDROM_SET_OPTIONS, options);
- inputs:
- New values for drive options. The logical 'or' of:
- CDO_AUTO_CLOSE close tray on first open(2)
- CDO_AUTO_EJECT open tray on last release
- CDO_USE_FFLAGS use O_NONBLOCK information on open
- CDO_LOCK lock tray on open files
- CDO_CHECK_TYPE check type on open for data
- outputs:
- Returns the resulting options settings in the
- ioctl return value. Returns -1 on error.
- error return:
- ENOSYS selected option(s) not supported by drive.
- CDROM_CLEAR_OPTIONS Clear behavior options
- Same as CDROM_SET_OPTIONS, except that selected options are
- turned off.
- CDROM_SELECT_SPEED Set the CD-ROM speed
- usage:
- int speed;
- ioctl(fd, CDROM_SELECT_SPEED, speed);
- inputs:
- New drive speed.
- outputs: none
- error return:
- ENOSYS speed selection not supported by drive.
- CDROM_SELECT_DISC Select disc (for juke-boxes)
- usage:
- int disk;
- ioctl(fd, CDROM_SELECT_DISC, disk);
- inputs:
- Disk to load into drive.
- outputs: none
- error return:
- EINVAL Disk number beyond capacity of drive
- CDROM_MEDIA_CHANGED Check is media changed
- usage:
- int slot;
- ioctl(fd, CDROM_MEDIA_CHANGED, slot);
- inputs:
- Slot number to be tested, always zero except for jukeboxes.
- May also be special values CDSL_NONE or CDSL_CURRENT
- outputs:
- Ioctl return value is 0 or 1 depending on whether the media
- has been changed, or -1 on error.
- error returns:
- ENOSYS Drive can't detect media change
- EINVAL Slot number beyond capacity of drive
- ENOMEM Out of memory
- CDROM_DRIVE_STATUS Get tray position, etc.
- usage:
- int slot;
- ioctl(fd, CDROM_DRIVE_STATUS, slot);
- inputs:
- Slot number to be tested, always zero except for jukeboxes.
- May also be special values CDSL_NONE or CDSL_CURRENT
- outputs:
- Ioctl return value will be one of the following values
- from <linux/cdrom.h>:
- CDS_NO_INFO Information not available.
- CDS_NO_DISC
- CDS_TRAY_OPEN
- CDS_DRIVE_NOT_READY
- CDS_DISC_OK
- -1 error
- error returns:
- ENOSYS Drive can't detect drive status
- EINVAL Slot number beyond capacity of drive
- ENOMEM Out of memory
- CDROM_DISC_STATUS Get disc type, etc.
- usage:
- ioctl(fd, CDROM_DISC_STATUS, 0);
- inputs: none
- outputs:
- Ioctl return value will be one of the following values
- from <linux/cdrom.h>:
- CDS_NO_INFO
- CDS_AUDIO
- CDS_MIXED
- CDS_XA_2_2
- CDS_XA_2_1
- CDS_DATA_1
- error returns: none at present
- notes:
- Source code comments state:
- Ok, this is where problems start. The current interface for
- the CDROM_DISC_STATUS ioctl is flawed. It makes the false
- assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.
- Unfortunately, while this is often the case, it is also
- very common for CDs to have some tracks with data, and some
- tracks with audio. Just because I feel like it, I declare
- the following to be the best way to cope. If the CD has
- ANY data tracks on it, it will be returned as a data CD.
- If it has any XA tracks, I will return it as that. Now I
- could simplify this interface by combining these returns with
- the above, but this more clearly demonstrates the problem
- with the current interface. Too bad this wasn't designed
- to use bitmasks... -Erik
- Well, now we have the option CDS_MIXED: a mixed-type CD.
- User level programmers might feel the ioctl is not very
- useful.
- ---david
- CDROM_CHANGER_NSLOTS Get number of slots
- usage:
- ioctl(fd, CDROM_CHANGER_NSLOTS, 0);
- inputs: none
- outputs:
- The ioctl return value will be the number of slots in a
- CD changer. Typically 1 for non-multi-disk devices.
- error returns: none
- CDROM_LOCKDOOR lock or unlock door
- usage:
- int lock;
- ioctl(fd, CDROM_LOCKDOOR, lock);
- inputs:
- Door lock flag, 1=lock, 0=unlock
- outputs: none
- error returns:
- EDRIVE_CANT_DO_THIS Door lock function not supported.
- EBUSY Attempt to unlock when multiple users
- have the drive open and not CAP_SYS_ADMIN
- notes:
- As of 2.6.8.1, the lock flag is a global lock, meaning that
- all CD drives will be locked or unlocked together. This is
- probably a bug.
- The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h>
- and is currently (2.6.8.1) the same as EOPNOTSUPP
- CDROM_DEBUG Turn debug messages on/off
- usage:
- int debug;
- ioctl(fd, CDROM_DEBUG, debug);
- inputs:
- Cdrom debug flag, 0=disable, 1=enable
- outputs:
- The ioctl return value will be the new debug flag.
- error return:
- EACCES Access denied: requires CAP_SYS_ADMIN
- CDROM_GET_CAPABILITY get capabilities
- usage:
- ioctl(fd, CDROM_GET_CAPABILITY, 0);
- inputs: none
- outputs:
- The ioctl return value is the current device capability
- flags. See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc.
- CDROMAUDIOBUFSIZ set the audio buffer size
- usage:
- int arg;
- ioctl(fd, CDROMAUDIOBUFSIZ, val);
- inputs:
- New audio buffer size
- outputs:
- The ioctl return value is the new audio buffer size, or -1
- on error.
- error return:
- ENOSYS Not supported by this driver.
- notes:
- Not supported by all drivers.
- DVD_READ_STRUCT Read structure
- usage:
- dvd_struct s;
- ioctl(fd, DVD_READ_STRUCT, &s);
- inputs:
- dvd_struct structure, containing:
- type specifies the information desired, one of
- DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT,
- DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA,
- DVD_STRUCT_MANUFACT
- physical.layer_num desired layer, indexed from 0
- copyright.layer_num desired layer, indexed from 0
- disckey.agid
- outputs:
- dvd_struct structure, containing:
- physical for type == DVD_STRUCT_PHYSICAL
- copyright for type == DVD_STRUCT_COPYRIGHT
- disckey.value for type == DVD_STRUCT_DISCKEY
- bca.{len,value} for type == DVD_STRUCT_BCA
- manufact.{len,valu} for type == DVD_STRUCT_MANUFACT
- error returns:
- EINVAL physical.layer_num exceeds number of layers
- EIO Received invalid response from drive
- DVD_WRITE_STRUCT Write structure
- Not implemented, as of 2.6.8.1
- DVD_AUTH Authentication
- usage:
- dvd_authinfo ai;
- ioctl(fd, DVD_AUTH, &ai);
- inputs:
- dvd_authinfo structure. See <linux/cdrom.h>
- outputs:
- dvd_authinfo structure.
- error return:
- ENOTTY ai.type not recognized.
- CDROM_SEND_PACKET send a packet to the drive
- usage:
- struct cdrom_generic_command cgc;
- ioctl(fd, CDROM_SEND_PACKET, &cgc);
- inputs:
- cdrom_generic_command structure containing the packet to send.
- outputs: none
- cdrom_generic_command structure containing results.
- error return:
- EIO command failed.
- EPERM Operation not permitted, either because a
- write command was attempted on a drive which
- is opened read-only, or because the command
- requires CAP_SYS_RAWIO
- EINVAL cgc.data_direction not set
- CDROM_NEXT_WRITABLE get next writable block
- usage:
- long next;
- ioctl(fd, CDROM_NEXT_WRITABLE, &next);
- inputs: none
- outputs:
- The next writable block.
- notes:
- If the device does not support this ioctl directly, the
- ioctl will return CDROM_LAST_WRITTEN + 7.
- CDROM_LAST_WRITTEN get last block written on disc
- usage:
- long last;
- ioctl(fd, CDROM_LAST_WRITTEN, &last);
- inputs: none
- outputs:
- The last block written on disc
- notes:
- If the device does not support this ioctl directly, the
- result is derived from the disc's table of contents. If the
- table of contents can't be read, this ioctl returns an
- error.
|