OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [Documentation/] [ioctl/] [cdrom.txt] - Rev 3

Compare with Previous | Blame | View Log

                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, 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.



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 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.

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.