|
Packit |
dd8086 |
/*
|
|
Packit |
dd8086 |
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
|
|
Packit |
dd8086 |
2016 Rocky Bernstein <rocky@gnu.org>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
dd8086 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
dd8086 |
the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
dd8086 |
(at your option) any later version.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
dd8086 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
dd8086 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
dd8086 |
GNU General Public License for more details.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
You should have received a copy of the GNU General Public License
|
|
Packit |
dd8086 |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
\file mmc.h
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
\brief Common definitions for MMC (Multimedia Commands). Applications
|
|
Packit |
dd8086 |
include this for direct MMC access.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
The documents we make use of are described in several
|
|
Packit |
dd8086 |
specifications made by the SCSI committee T10
|
|
Packit |
dd8086 |
http://www.t10.org. In particular, SCSI Primary Commands (SPC),
|
|
Packit |
dd8086 |
SCSI Block Commands (SBC), and Multi-Media Commands (MMC). These
|
|
Packit |
dd8086 |
documents generally have a numeric level number appended. For
|
|
Packit |
dd8086 |
example SPC-3 refers to ``SCSI Primary Commands - 3'.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
In year 2010 the current versions were SPC-3, SBC-2, MMC-5.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifndef CDIO_MMC_H_
|
|
Packit |
dd8086 |
#define CDIO_MMC_H_
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#include <cdio/cdio.h>
|
|
Packit |
dd8086 |
#include <cdio/types.h>
|
|
Packit |
dd8086 |
#include <cdio/dvd.h>
|
|
Packit |
dd8086 |
#include <cdio/audio.h>
|
|
Packit |
dd8086 |
#include <cdio/mmc_util.h>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifdef __cplusplus
|
|
Packit |
dd8086 |
extern "C" {
|
|
Packit |
dd8086 |
#endif /* __cplusplus */
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* On GNU/Linux see <linux/byteorder/big_endian.h> and
|
|
Packit |
dd8086 |
<linux/byteorder/little_endian.h>
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
dd8086 |
# if !defined(__LITTLE_ENDIAN_BITFIELD) && !defined(__BIG_ENDIAN_BITFIELD)
|
|
Packit |
dd8086 |
# define __MMC_BIG_ENDIAN_BITFIELD
|
|
Packit |
dd8086 |
# endif
|
|
Packit |
dd8086 |
#else
|
|
Packit |
dd8086 |
# if !defined(__LITTLE_ENDIAN_BITFIELD) && !defined(__BIG_ENDIAN_BITFIELD)
|
|
Packit |
dd8086 |
# define __MMC_LITTLE_ENDIAN_BITFIELD
|
|
Packit |
dd8086 |
# endif
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Structure of a SCSI/MMC sense reply.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This has been adapted from GNU/Linux request_sense of <linux/cdrom.h>
|
|
Packit |
dd8086 |
include this for direct MMC access.
|
|
Packit |
dd8086 |
See SCSI Primary Commands-2 (SPC-3) table 26 page 38.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef struct cdio_mmc_request_sense {
|
|
Packit |
dd8086 |
#if defined(__MMC_BIG_ENDIAN_BITFIELD)
|
|
Packit |
dd8086 |
uint8_t valid : 1; /**< valid bit is 1 if info is valid */
|
|
Packit |
dd8086 |
uint8_t error_code : 7;
|
|
Packit |
dd8086 |
#else
|
|
Packit |
dd8086 |
uint8_t error_code : 7;
|
|
Packit |
dd8086 |
uint8_t valid : 1; /**< valid bit is 1 if info is valid */
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
uint8_t segment_number;
|
|
Packit |
dd8086 |
#if defined(__MMC_BIG_ENDIAN_BITFIELD)
|
|
Packit |
dd8086 |
uint8_t filemark : 1; /**< manditory in sequential
|
|
Packit |
dd8086 |
* access devices */
|
|
Packit |
dd8086 |
uint8_t eom : 1; /**< end of medium. manditory in
|
|
Packit |
dd8086 |
* sequential access and
|
|
Packit |
dd8086 |
* printer devices */
|
|
Packit |
dd8086 |
uint8_t ili : 1; /**< incorrect length indicator */
|
|
Packit |
dd8086 |
uint8_t reserved1 : 1;
|
|
Packit |
dd8086 |
uint8_t sense_key : 4;
|
|
Packit |
dd8086 |
#else
|
|
Packit |
dd8086 |
uint8_t sense_key : 4;
|
|
Packit |
dd8086 |
uint8_t reserved1 : 1;
|
|
Packit |
dd8086 |
uint8_t ili : 1; /**< incorrect length indicator */
|
|
Packit |
dd8086 |
uint8_t eom : 1; /**< end of medium. manditory in
|
|
Packit |
dd8086 |
* sequential access and
|
|
Packit |
dd8086 |
* printer devices */
|
|
Packit |
dd8086 |
uint8_t filemark : 1; /**< manditory in sequential
|
|
Packit |
dd8086 |
* access devices */
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
uint8_t information[4];
|
|
Packit |
dd8086 |
uint8_t additional_sense_len; /**< Additional sense length (n-7) */
|
|
Packit |
dd8086 |
uint8_t command_info[4]; /**< Command-specific information */
|
|
Packit |
dd8086 |
uint8_t asc; /**< Additional sense code */
|
|
Packit |
dd8086 |
uint8_t ascq; /**< Additional sense code qualifier */
|
|
Packit |
dd8086 |
uint8_t fruc; /**< Field replaceable unit code */
|
|
Packit |
dd8086 |
uint8_t sks[3]; /**< Sense-key specific */
|
|
Packit |
dd8086 |
uint8_t asb[46]; /**< Additional sense bytes */
|
|
Packit |
dd8086 |
} cdio_mmc_request_sense_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Meanings of the values of mmc_request_sense.sense_key
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_NO_SENSE = 0,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_RECOVERED_ERROR = 1,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_NOT_READY = 2,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_MEDIUM_ERROR = 3,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_HARDWARE_ERROR = 4,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_ILLEGAL_REQUEST = 5,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_UNIT_ATTENTION = 6,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_DATA_PROTECT = 7,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_BLANK_CHECK = 8,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_VENDOR_SPECIFIC = 9,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_COPY_ABORTED = 10,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_ABORTED_COMMAND = 11,
|
|
Packit |
dd8086 |
CDIO_MMC_SENSE_KEY_OBSOLETE = 12,
|
|
Packit |
dd8086 |
} cdio_mmc_sense_key_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
\brief The opcode-portion (generic packet commands) of an MMC command.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
In general, those opcodes that end in 6 take a 6-byte command
|
|
Packit |
dd8086 |
descriptor, those that end in 10 take a 10-byte
|
|
Packit |
dd8086 |
descriptor and those that in in 12 take a 12-byte descriptor.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
(Not that you need to know that, but it seems to be a
|
|
Packit |
dd8086 |
big deal in the MMC specification.)
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_TEST_UNIT_READY = 0x00, /**< test if drive ready. */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_REQUEST_SENSE = 0x03,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_FORMAT_UNIT = 0x04,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_INQUIRY = 0x12, /**< Request drive
|
|
Packit |
dd8086 |
information. */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_MODE_SELECT_6 = 0x15, /**< Select medium
|
|
Packit |
dd8086 |
(6 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_MODE_SENSE_6 = 0x1a, /**< Get medium or device
|
|
Packit |
dd8086 |
information. Should be issued
|
|
Packit |
dd8086 |
before MODE SELECT to get
|
|
Packit |
dd8086 |
mode support or save current
|
|
Packit |
dd8086 |
settings. (6 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_START_STOP_UNIT = 0x1b, /**< Enable/disable Disc
|
|
Packit |
dd8086 |
operations. (6 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL
|
|
Packit |
dd8086 |
= 0x1e, /**< Enable/disable Disc
|
|
Packit |
dd8086 |
removal. (6 bytes). */
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Group 2 Commands (CDB's here are 10-bytes)
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_FORMAT_CAPACITIES = 0x23, /**< MMC-5 Section 6.24 */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_CAPACITIY = 0x25, /**< MMC-5 Section 6.19 */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_10 = 0x28, /**< Read data from drive
|
|
Packit |
dd8086 |
(10 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_WRITE_10 = 0x2a,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SEEK_10 = 0x2b,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_ERASE_10 = 0x2c, /**< MMC5 Section 6.4 */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_WRITE_AND_VERIFY_10 = 0x2e,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_VERIFY_10 = 0x2f,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SYNCHRONIZE_CACHE = 0x35,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_WRITE_BUFFER = 0x3b,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_BUFFER = 0x3c,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_SUBCHANNEL = 0x42, /**< Read Sub-Channel data.
|
|
Packit |
dd8086 |
(10 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_TOC = 0x43, /**< READ TOC/PMA/ATIP.
|
|
Packit |
dd8086 |
(10 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_HEADER = 0x44,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAY_AUDIO_10 = 0x45, /**< Begin audio playing at
|
|
Packit |
dd8086 |
current position
|
|
Packit |
dd8086 |
(10 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_GET_CONFIGURATION = 0x46, /**< Get drive Capabilities
|
|
Packit |
dd8086 |
(10 bytes) */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAY_AUDIO_MSF = 0x47, /**< Begin audio playing at
|
|
Packit |
dd8086 |
specified MSF (10
|
|
Packit |
dd8086 |
bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAY_AUDIO_TI = 0x48,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAY_TRACK_REL_10 = 0x49, /**< Play audio at the track
|
|
Packit |
dd8086 |
relative LBA. (10 bytes).
|
|
Packit |
dd8086 |
Doesn't seem to be part
|
|
Packit |
dd8086 |
of MMC standards but is
|
|
Packit |
dd8086 |
handled by Plextor drives.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_GET_EVENT_STATUS = 0x4a, /**< Report events and
|
|
Packit |
dd8086 |
Status. */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PAUSE_RESUME = 0x4b, /**< Stop or restart audio
|
|
Packit |
dd8086 |
playback. (10 bytes).
|
|
Packit |
dd8086 |
Used with a PLAY command. */
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_DISC_INFORMATION = 0x51, /**< Get CD information.
|
|
Packit |
dd8086 |
(10 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_TRACK_INFORMATION = 0x52, /**< Information about a
|
|
Packit |
dd8086 |
logical track. */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_RESERVE_TRACK = 0x53,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SEND_OPC_INFORMATION = 0x54,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_MODE_SELECT_10 = 0x55, /**< Select medium
|
|
Packit |
dd8086 |
(10-bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_REPAIR_TRACK = 0x58,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_MODE_SENSE_10 = 0x5a, /**< Get medium or device
|
|
Packit |
dd8086 |
information. Should be issued
|
|
Packit |
dd8086 |
before MODE SELECT to get
|
|
Packit |
dd8086 |
mode support or save current
|
|
Packit |
dd8086 |
settings. (6 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_CLOSE_TRACK_SESSION = 0x5b,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_BUFFER_CAPACITY = 0x5c,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SEND_CUE_SHEET = 0x5d,
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Group 5 Commands (CDB's here are 12-bytes)
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_REPORT_LUNS = 0xa0,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_BLANK = 0xa1,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SECURITY_PROTOCOL_IN = 0xa2,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SEND_KEY = 0xa3,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_REPORT_KEY = 0xa4,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAY_AUDIO_12 = 0xa5, /**< Begin audio playing at
|
|
Packit |
dd8086 |
current position
|
|
Packit |
dd8086 |
(12 bytes) */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_LOAD_UNLOAD = 0xa6, /**< Load/unload a Disc
|
|
Packit |
dd8086 |
(12 bytes) */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SET_READ_AHEAD = 0xa7,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_12 = 0xa8, /**< Read data from drive
|
|
Packit |
dd8086 |
(12 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAY_TRACK_REL_12 = 0xa9, /**< Play audio at the track
|
|
Packit |
dd8086 |
relative LBA. (12 bytes).
|
|
Packit |
dd8086 |
Doesn't seem to be part
|
|
Packit |
dd8086 |
of MMC standards but is
|
|
Packit |
dd8086 |
handled by Plextor drives.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_WRITE_12 = 0xaa,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_MEDIA_SERIAL_12 = 0xab, /**< MMC-5 Section 6.25 */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_GET_PERFORMANCE = 0xac,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_DVD_STRUCTURE = 0xad, /**< Get DVD structure info
|
|
Packit |
dd8086 |
from media (12 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SECURITY_PROTOCOL_OUT = 0xb5,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SET_STREAMING = 0xb6,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_MSF = 0xb9, /**< Read almost any field
|
|
Packit |
dd8086 |
of a CD sector at specified
|
|
Packit |
dd8086 |
MSF. (12 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SET_SPEED = 0xbb, /**< Set drive speed
|
|
Packit |
dd8086 |
(12 bytes). This is listed
|
|
Packit |
dd8086 |
as optional in ATAPI 2.6,
|
|
Packit |
dd8086 |
but is (curiously)
|
|
Packit |
dd8086 |
missing from Mt. Fuji,
|
|
Packit |
dd8086 |
Table 57. It is mentioned
|
|
Packit |
dd8086 |
in Mt. Fuji Table 377 as an
|
|
Packit |
dd8086 |
MMC command for SCSI
|
|
Packit |
dd8086 |
devices though... Most
|
|
Packit |
dd8086 |
ATAPI drives support it. */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_MECHANISM_STATUS = 0xbd,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_CD = 0xbe, /**< Read almost any field
|
|
Packit |
dd8086 |
of a CD sector at current
|
|
Packit |
dd8086 |
location. (12 bytes). */
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_SEND_DISC_STRUCTURE = 0xbf,
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Vendor-unique Commands
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_CD_PLAYBACK_STATUS = 0xc4 /**< SONY unique = command */,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PLAYBACK_CONTROL = 0xc9 /**< SONY unique = command */,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_CDDA = 0xd8 /**< Vendor unique = command */,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_CDXA = 0xdb /**< Vendor unique = command */,
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_READ_ALL_SUBCODES = 0xdf /**< Vendor unique = command */
|
|
Packit |
dd8086 |
} cdio_mmc_gpcmd_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Read Subchannel states
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_READ_SUB_ST_INVALID = 0x00, /**< audio status not supported */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_SUB_ST_PLAY = 0x11, /**< audio play operation in
|
|
Packit |
dd8086 |
progress */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_SUB_ST_PAUSED = 0x12, /**< audio play operation paused */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_SUB_ST_COMPLETED = 0x13, /**< audio play successfully
|
|
Packit |
dd8086 |
completed */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_SUB_ST_ERROR = 0x14, /**< audio play stopped due to
|
|
Packit |
dd8086 |
error */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_SUB_ST_NO_STATUS = 0x15, /**< no current audio status to
|
|
Packit |
dd8086 |
return */
|
|
Packit |
dd8086 |
} cdio_mmc_read_sub_state_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/** Level values that can go into READ_CD */
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_READ_TYPE_ANY = 0, /**< All types */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_TYPE_CDDA = 1, /**< Only CD-DA sectors */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_TYPE_MODE1 = 2, /**< mode1 sectors (user data = 2048) */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_TYPE_MODE2 = 3, /**< mode2 sectors form1 or form2 */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_TYPE_M2F1 = 4, /**< mode2 sectors form1 */
|
|
Packit |
dd8086 |
CDIO_MMC_READ_TYPE_M2F2 = 5 /**< mode2 sectors form2 */
|
|
Packit |
dd8086 |
} cdio_mmc_read_cd_type_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Format values for READ_TOC
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_READTOC_FMT_TOC = 0,
|
|
Packit |
dd8086 |
CDIO_MMC_READTOC_FMT_SESSION = 1,
|
|
Packit |
dd8086 |
CDIO_MMC_READTOC_FMT_FULTOC = 2,
|
|
Packit |
dd8086 |
CDIO_MMC_READTOC_FMT_PMA = 3, /**< Q subcode data */
|
|
Packit |
dd8086 |
CDIO_MMC_READTOC_FMT_ATIP = 4, /**< includes media type */
|
|
Packit |
dd8086 |
CDIO_MMC_READTOC_FMT_CDTEXT = 5 /**< CD-TEXT info */
|
|
Packit |
dd8086 |
} cdio_mmc_readtoc_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Page codes for MODE SENSE and MODE SET.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_R_W_ERROR_PAGE = 0x01,
|
|
Packit |
dd8086 |
CDIO_MMC_WRITE_PARMS_PAGE = 0x05,
|
|
Packit |
dd8086 |
CDIO_MMC_CDR_PARMS_PAGE = 0x0d,
|
|
Packit |
dd8086 |
CDIO_MMC_AUDIO_CTL_PAGE = 0x0e,
|
|
Packit |
dd8086 |
CDIO_MMC_POWER_PAGE = 0x1a,
|
|
Packit |
dd8086 |
CDIO_MMC_FAULT_FAIL_PAGE = 0x1c,
|
|
Packit |
dd8086 |
CDIO_MMC_TO_PROTECT_PAGE = 0x1d,
|
|
Packit |
dd8086 |
CDIO_MMC_CAPABILITIES_PAGE = 0x2a,
|
|
Packit |
dd8086 |
CDIO_MMC_ALL_PAGES = 0x3f,
|
|
Packit |
dd8086 |
} cdio_mmc_mode_page_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
READ DISC INFORMATION Data Types
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_READ_DISC_INFO_STANDARD = 0x0,
|
|
Packit |
dd8086 |
CDIO_MMC_READ_DISC_INFO_TRACK = 0x1,
|
|
Packit |
dd8086 |
CDIO_MMC_READ_DISC_INFO_POW = 0x2,
|
|
Packit |
dd8086 |
} cdio_mmc_read_disc_info_datatype_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* For backward compatibility. */
|
|
Packit |
dd8086 |
#define CDIO_MMC_GPCMD_READ_DISC_INFO CDIO_MMC_GPCMD_READ_DISC_INFORMATION
|
|
Packit |
dd8086 |
#define CDIO_MMC_GPCMD_READ_DISC_STRUCTURE CDIO_MMC_GPMD_READ_DVD_STRUCTURE
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
PRAGMA_BEGIN_PACKED
|
|
Packit |
dd8086 |
struct mmc_audio_volume_entry_s
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
uint8_t selection; /* Only the lower 4 bits are used. */
|
|
Packit |
dd8086 |
uint8_t volume;
|
|
Packit |
dd8086 |
} GNUC_PACKED;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
typedef struct mmc_audio_volume_entry_s mmc_audio_volume_entry_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
This struct is used by cdio_audio_get_volume and cdio_audio_set_volume
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
struct mmc_audio_volume_s
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
mmc_audio_volume_entry_t port[4];
|
|
Packit |
dd8086 |
} GNUC_PACKED;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
typedef struct mmc_audio_volume_s mmc_audio_volume_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
PRAGMA_END_PACKED
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Return type codes for GET_CONFIGURATION.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_GET_CONF_ALL_FEATURES = 0, /**< all features without regard
|
|
Packit |
dd8086 |
to currency. */
|
|
Packit |
dd8086 |
CDIO_MMC_GET_CONF_CURRENT_FEATURES = 1, /**< features which are currently
|
|
Packit |
dd8086 |
in effect (e.g. based on
|
|
Packit |
dd8086 |
medium inserted). */
|
|
Packit |
dd8086 |
CDIO_MMC_GET_CONF_NAMED_FEATURE = 2 /**< just the feature named in
|
|
Packit |
dd8086 |
the GET_CONFIGURATION cdb. */
|
|
Packit |
dd8086 |
} cdio_mmc_get_conf_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
FEATURE codes used in GET CONFIGURATION.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_PROFILE_LIST = 0x000, /**< Profile List Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CORE = 0x001,
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_MORPHING = 0x002, /**< Report/prevent operational
|
|
Packit |
dd8086 |
changes */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_REMOVABLE_MEDIUM = 0x003, /**< Removable Medium Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_WRITE_PROTECT = 0x004, /**< Write Protect Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_RANDOM_READABLE = 0x010, /**< Random Readable Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_MULTI_READ = 0x01D, /**< Multi-Read Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CD_READ = 0x01E, /**< CD Read Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DVD_READ = 0x01F, /**< DVD Read Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_RANDOM_WRITABLE = 0x020, /**< Random Writable Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INCR_WRITE = 0x021, /**< Incremental Streaming
|
|
Packit |
dd8086 |
Writable Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_SECTOR_ERASE = 0x022, /**< Sector Erasable Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_FORMATABLE = 0x023, /**< Formattable Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DEFECT_MGMT = 0x024, /**< Management Ability of the
|
|
Packit |
dd8086 |
Logical Unit/media system to
|
|
Packit |
dd8086 |
provide an apparently
|
|
Packit |
dd8086 |
defect-free space.*/
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_WRITE_ONCE = 0x025, /**< Write Once
|
|
Packit |
dd8086 |
Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_RESTRICT_OVERW = 0x026, /**< Restricted Overwrite
|
|
Packit |
dd8086 |
Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CD_RW_CAV = 0x027, /**< CD-RW CAV Write Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_MRW = 0x028, /**< MRW Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_ENHANCED_DEFECT = 0x029, /**< Enhanced Defect Reporting */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DVD_PRW = 0x02A, /**< DVD+RW Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DVD_PR = 0x02B, /**< DVD+R Feature */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_RIGID_RES_OVERW = 0x02C, /**< Rigid Restricted Overwrite */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CD_TAO = 0x02D, /**< CD Track at Once */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CD_SAO = 0x02E, /**< CD Mastering (Session at
|
|
Packit |
dd8086 |
Once) */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DVD_R_RW_WRITE = 0x02F, /**< DVD-R/RW Write */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CD_RW_MEDIA_WRITE= 0x037, /**< CD-RW Media Write Support */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DVD_PR_2_LAYER = 0x03B, /**< DVD+R Double Layer */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_POWER_MGMT = 0x100, /**< Initiator and device directed
|
|
Packit |
dd8086 |
power management */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_CDDA_EXT_PLAY = 0x103, /**< Ability to play audio CDs
|
|
Packit |
dd8086 |
via the Logical Unit's own
|
|
Packit |
dd8086 |
analog output */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_MCODE_UPGRADE = 0x104, /* Ability for the device to
|
|
Packit |
dd8086 |
accept new microcode via
|
|
Packit |
dd8086 |
the interface */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_TIME_OUT = 0x105, /**< Ability to respond to all
|
|
Packit |
dd8086 |
commands within a specific
|
|
Packit |
dd8086 |
time */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_DVD_CSS = 0x106, /**< Ability to perform DVD
|
|
Packit |
dd8086 |
CSS/CPPM authentication and
|
|
Packit |
dd8086 |
RPC */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_RT_STREAMING = 0x107, /**< Ability to read and write
|
|
Packit |
dd8086 |
using Initiator requested
|
|
Packit |
dd8086 |
performance parameters */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_LU_SN = 0x108, /**< The Logical Unit has a unique
|
|
Packit |
dd8086 |
identifier. */
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_FIRMWARE_DATE = 0x1FF, /**< Firmware creation date
|
|
Packit |
dd8086 |
report */
|
|
Packit |
dd8086 |
} cdio_mmc_feature_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INTERFACE_UNSPECIFIED = 0,
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INTERFACE_SCSI = 1,
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INTERFACE_ATAPI = 2,
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INTERFACE_IEEE_1394 = 3,
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INTERFACE_IEEE_1394A = 4,
|
|
Packit |
dd8086 |
CDIO_MMC_FEATURE_INTERFACE_FIBRE_CH = 5
|
|
Packit |
dd8086 |
} cdio_mmc_feature_interface_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
The largest Command Descriptor Block (CDB) size.
|
|
Packit |
dd8086 |
The possible sizes are 6, 10, and 12 bytes.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
#define MAX_CDB_LEN 12
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
\brief A Command Descriptor Block (CDB) used in sending MMC
|
|
Packit |
dd8086 |
commands.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef struct mmc_cdb_s {
|
|
Packit |
dd8086 |
uint8_t field[MAX_CDB_LEN];
|
|
Packit |
dd8086 |
} mmc_cdb_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
\brief Format of header block in data returned from an MMC
|
|
Packit |
dd8086 |
GET_CONFIGURATION command.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef struct mmc_feature_list_header_s {
|
|
Packit |
dd8086 |
unsigned char length_msb;
|
|
Packit |
dd8086 |
unsigned char length_1sb;
|
|
Packit |
dd8086 |
unsigned char length_2sb;
|
|
Packit |
dd8086 |
unsigned char length_lsb;
|
|
Packit |
dd8086 |
unsigned char reserved1;
|
|
Packit |
dd8086 |
unsigned char reserved2;
|
|
Packit |
dd8086 |
unsigned char profile_msb;
|
|
Packit |
dd8086 |
unsigned char profile_lsb;
|
|
Packit |
dd8086 |
} cdio_mmc_feature_list_header_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
An enumeration indicating whether an MMC command is sending
|
|
Packit |
dd8086 |
data, or getting data, or does none of both.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
typedef enum mmc_direction_s {
|
|
Packit |
dd8086 |
SCSI_MMC_DATA_READ,
|
|
Packit |
dd8086 |
SCSI_MMC_DATA_WRITE,
|
|
Packit |
dd8086 |
SCSI_MMC_DATA_NONE
|
|
Packit |
dd8086 |
} cdio_mmc_direction_t;
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Indicate to applications that SCSI_MMC_DATA_NONE is available.
|
|
Packit |
dd8086 |
It has been added after version 0.82 and should be used with commands
|
|
Packit |
dd8086 |
that neither read nor write payload bytes. (At least on Linux such
|
|
Packit |
dd8086 |
commands did work with SCSI_MMC_DATA_READ or SCSI_MMC_DATA_WRITE, too.)
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
#define SCSI_MMC_HAS_DIR_NONE 1
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
typedef struct mmc_subchannel_s
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
uint8_t reserved;
|
|
Packit |
dd8086 |
uint8_t audio_status;
|
|
Packit |
dd8086 |
uint16_t data_length; /**< Really ISO 9660 7.2.2 */
|
|
Packit |
dd8086 |
uint8_t format;
|
|
Packit |
dd8086 |
uint8_t address: 4;
|
|
Packit |
dd8086 |
uint8_t control: 4;
|
|
Packit |
dd8086 |
uint8_t track;
|
|
Packit |
dd8086 |
uint8_t index;
|
|
Packit |
dd8086 |
uint8_t abs_addr[4];
|
|
Packit |
dd8086 |
uint8_t rel_addr[4];
|
|
Packit |
dd8086 |
} cdio_mmc_subchannel_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_COMMAND(cdb, command) \
|
|
Packit |
dd8086 |
cdb[0] = command
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_READ_TYPE(cdb, sector_type) \
|
|
Packit |
dd8086 |
cdb[1] = (sector_type << 2)
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_GETPOS_LEN16(p, pos) \
|
|
Packit |
dd8086 |
(p[pos]<<8) + p[pos+1]
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_GET_LEN16(p) \
|
|
Packit |
dd8086 |
(p[0]<<8) + p[1]
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_GET_LEN32(p) \
|
|
Packit |
dd8086 |
(p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3];
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_LEN16(cdb, pos, len) \
|
|
Packit |
dd8086 |
cdb[pos ] = (len >> 8) & 0xff; \
|
|
Packit |
dd8086 |
cdb[pos+1] = (len ) & 0xff
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_READ_LBA(cdb, lba) \
|
|
Packit |
dd8086 |
cdb[2] = (lba >> 24) & 0xff; \
|
|
Packit |
dd8086 |
cdb[3] = (lba >> 16) & 0xff; \
|
|
Packit |
dd8086 |
cdb[4] = (lba >> 8) & 0xff; \
|
|
Packit |
dd8086 |
cdb[5] = (lba ) & 0xff
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_START_TRACK(cdb, command) \
|
|
Packit |
dd8086 |
cdb[6] = command
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_READ_LENGTH24(cdb, len) \
|
|
Packit |
dd8086 |
cdb[6] = (len >> 16) & 0xff; \
|
|
Packit |
dd8086 |
cdb[7] = (len >> 8) & 0xff; \
|
|
Packit |
dd8086 |
cdb[8] = (len ) & 0xff
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_READ_LENGTH16(cdb, len) \
|
|
Packit |
dd8086 |
CDIO_MMC_SET_LEN16(cdb, 7, len)
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_READ_LENGTH8(cdb, len) \
|
|
Packit |
dd8086 |
cdb[8] = (len ) & 0xff
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_MCSB_ALL_HEADERS 0xf
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb, val) \
|
|
Packit |
dd8086 |
cdb[9] = val << 3;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the output port volumes and port selections used on AUDIO PLAY
|
|
Packit |
dd8086 |
commands via a MMC MODE SENSE command using the CD Audio Control
|
|
Packit |
dd8086 |
Page.
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@param p_volume volume parameters retrieved
|
|
Packit |
dd8086 |
@return DRIVER_OP_SUCCESS if we ran the command ok.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t mmc_audio_get_volume (CdIo_t *p_cdio, /*out*/
|
|
Packit |
dd8086 |
mmc_audio_volume_t *p_volume);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Read Audio Subchannel information
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@param p_subchannel place for returned subchannel information
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t
|
|
Packit |
dd8086 |
mmc_audio_read_subchannel (CdIo_t *p_cdio,
|
|
Packit |
dd8086 |
/*out*/ cdio_subchannel_t *p_subchannel);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Return a string containing the name of the audio state as returned from
|
|
Packit |
dd8086 |
the Q_SUBCHANNEL.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
const char *mmc_audio_state2str( uint8_t i_audio_state );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the block size used in read requests, via MMC (e.g. READ_10,
|
|
Packit |
dd8086 |
READ_MSF, ...)
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@return the blocksize if > 0; error if <= 0
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
int mmc_get_blocksize ( CdIo_t *p_cdio );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Return the length in bytes of the Command Descriptor
|
|
Packit |
dd8086 |
Buffer (CDB) for a given MMC command. The length will be
|
|
Packit |
dd8086 |
either 6, 10, or 12.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
uint8_t mmc_get_cmd_len(uint8_t mmc_cmd);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the lsn of the end of the CD
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@return the lsn. On error return CDIO_INVALID_LSN.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
lsn_t mmc_get_disc_last_lsn( const CdIo_t *p_cdio );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Return the discmode as reported by the MMC Read (FULL) TOC
|
|
Packit |
dd8086 |
command.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
Information was obtained from Section 5.1.13 (Read TOC/PMA/ATIP)
|
|
Packit |
dd8086 |
pages 56-62 from the MMC draft specification, revision 10a
|
|
Packit |
dd8086 |
at http://www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf See
|
|
Packit |
dd8086 |
especially tables 72, 73 and 75.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
discmode_t mmc_get_discmode( const CdIo_t *p_cdio );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
typedef enum {
|
|
Packit |
dd8086 |
CDIO_MMC_LEVEL_WEIRD,
|
|
Packit |
dd8086 |
CDIO_MMC_LEVEL_1,
|
|
Packit |
dd8086 |
CDIO_MMC_LEVEL_2,
|
|
Packit |
dd8086 |
CDIO_MMC_LEVEL_3,
|
|
Packit |
dd8086 |
CDIO_MMC_LEVEL_NONE
|
|
Packit |
dd8086 |
} cdio_mmc_level_t;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the MMC level supported by the device.
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@return MMC level supported by the device.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
cdio_mmc_level_t mmc_get_drive_mmc_cap(CdIo_t *p_cdio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the DVD type associated with cd object.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@param s location to store DVD information.
|
|
Packit |
dd8086 |
@return the DVD discmode.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
discmode_t mmc_get_dvd_struct_physical ( const CdIo_t *p_cdio,
|
|
Packit |
dd8086 |
cdio_dvd_struct_t *s);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Find out if media tray is open or closed.
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@return 1 if media is open, 0 if closed. Error
|
|
Packit |
dd8086 |
return codes are the same as driver_return_code_t
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
int mmc_get_tray_status ( const CdIo_t *p_cdio );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the CD-ROM hardware info via an MMC INQUIRY command.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@param p_hw_info place to store hardware information retrieved
|
|
Packit |
dd8086 |
@return true if we were able to get hardware info, false if we had
|
|
Packit |
dd8086 |
an error.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
bool mmc_get_hwinfo ( const CdIo_t *p_cdio,
|
|
Packit |
dd8086 |
/* out*/ cdio_hwinfo_t *p_hw_info );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Find out if media has changed since the last call.
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@return 1 if media has changed since last call, 0 if not. Error
|
|
Packit |
dd8086 |
return codes are the same as driver_return_code_t
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
int mmc_get_media_changed(const CdIo_t *p_cdio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the media catalog number (MCN) from the CD via MMC.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@return the media catalog number r NULL if there is none or we
|
|
Packit |
dd8086 |
don't have the ability to get it.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
Note: The caller must free the returned string with cdio_free()
|
|
Packit |
dd8086 |
when done with it.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
char * mmc_get_mcn(const CdIo_t *p_cdio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get the international standard recording code (ISRC) of the track via MMC.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@param i_track the track to get the ISRC info for
|
|
Packit |
dd8086 |
@return international standard recording code or NULL if there is
|
|
Packit |
dd8086 |
none or we don't have the ability to get it.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
Note: The caller must free the returned string with cdio_free()
|
|
Packit |
dd8086 |
when done with it.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
char * mmc_get_track_isrc(const CdIo_t *p_cdio, track_t i_track);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Read cdtext information for a CdIo_t object .
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@return pointer to data on success, NULL on error or CD-Text information does
|
|
Packit |
dd8086 |
not exist.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
Note: the caller must free the returned memory
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
uint8_t * mmc_read_cdtext (const CdIo_t *p_cdio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Report if CD-ROM has a particular kind of interface (ATAPI, SCSCI, ...)
|
|
Packit |
dd8086 |
Is it possible for an interface to have several? If not this
|
|
Packit |
dd8086 |
routine could probably return the single mmc_feature_interface_t.
|
|
Packit |
dd8086 |
@param p_cdio the CD object to be acted upon.
|
|
Packit |
dd8086 |
@param e_interface
|
|
Packit |
dd8086 |
@return true if we have the interface and false if not.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
bool_3way_t mmc_have_interface(CdIo_t *p_cdio,
|
|
Packit |
dd8086 |
cdio_mmc_feature_interface_t e_interface );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Read just the user data part of some sort of data sector (via
|
|
Packit |
dd8086 |
mmc_read_cd).
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio object to read from
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_buf place to read data into. The caller should make
|
|
Packit |
dd8086 |
sure this location can store at least CDIO_CD_FRAMESIZE,
|
|
Packit |
dd8086 |
M2RAW_SECTOR_SIZE, or M2F2_SECTOR_SIZE depending on the
|
|
Packit |
dd8086 |
kind of sector getting read. If you don't know whether
|
|
Packit |
dd8086 |
you have a Mode 1/2, Form 1/ Form 2/Formless sector best
|
|
Packit |
dd8086 |
to reserve space for the maximum, M2RAW_SECTOR_SIZE.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param i_lsn sector to read
|
|
Packit |
dd8086 |
@param i_blocksize size of each block
|
|
Packit |
dd8086 |
@param i_blocks number of blocks to read
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t mmc_read_data_sectors ( CdIo_t *p_cdio, void *p_buf,
|
|
Packit |
dd8086 |
lsn_t i_lsn,
|
|
Packit |
dd8086 |
uint16_t i_blocksize,
|
|
Packit |
dd8086 |
uint32_t i_blocks );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Read sectors using SCSI-MMC GPCMD_READ_CD.
|
|
Packit |
dd8086 |
Can read only up to 25 blocks.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t mmc_read_sectors ( const CdIo_t *p_cdio, void *p_buf,
|
|
Packit |
dd8086 |
lsn_t i_lsn, int read_sector_type,
|
|
Packit |
dd8086 |
uint32_t i_blocks);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Run a Multimedia command (MMC).
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio CD structure set by cdio_open().
|
|
Packit |
dd8086 |
@param i_timeout_ms time in milliseconds we will wait for the command
|
|
Packit |
dd8086 |
to complete.
|
|
Packit |
dd8086 |
@param p_cdb CDB bytes. All values that are needed should be set
|
|
Packit |
dd8086 |
on input. We'll figure out what the right CDB length
|
|
Packit |
dd8086 |
should be.
|
|
Packit |
dd8086 |
@param e_direction direction the transfer is to go.
|
|
Packit |
dd8086 |
@param i_buf Size of buffer
|
|
Packit |
dd8086 |
@param p_buf Buffer for data, both sending and receiving.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@return 0 if command completed successfully.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t
|
|
Packit |
dd8086 |
mmc_run_cmd( const CdIo_t *p_cdio, unsigned int i_timeout_ms,
|
|
Packit |
dd8086 |
const mmc_cdb_t *p_cdb,
|
|
Packit |
dd8086 |
cdio_mmc_direction_t e_direction, unsigned int i_buf,
|
|
Packit |
dd8086 |
/*in/out*/ void *p_buf );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Run a Multimedia command (MMC) specifying the CDB length.
|
|
Packit |
dd8086 |
The motivation here is for example ot use in is an undocumented
|
|
Packit |
dd8086 |
debug command for LG drives (namely E7), whose length is being
|
|
Packit |
dd8086 |
miscalculated by mmc_get_cmd_len(); it doesn't follow the usual
|
|
Packit |
dd8086 |
code number to length conventions. Patch supplied by SukkoPera.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param p_cdio CD structure set by cdio_open().
|
|
Packit |
dd8086 |
@param i_timeout_ms time in milliseconds we will wait for the command
|
|
Packit |
dd8086 |
to complete.
|
|
Packit |
dd8086 |
@param p_cdb CDB bytes. All values that are needed should be set
|
|
Packit |
dd8086 |
on input.
|
|
Packit |
dd8086 |
@param i_cdb number of CDB bytes.
|
|
Packit |
dd8086 |
@param e_direction direction the transfer is to go.
|
|
Packit |
dd8086 |
@param i_buf Size of buffer
|
|
Packit |
dd8086 |
@param p_buf Buffer for data, both sending and receiving.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@return 0 if command completed successfully.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t
|
|
Packit |
dd8086 |
mmc_run_cmd_len( const CdIo_t *p_cdio, unsigned int i_timeout_ms,
|
|
Packit |
dd8086 |
const mmc_cdb_t *p_cdb, unsigned int i_cdb,
|
|
Packit |
dd8086 |
cdio_mmc_direction_t e_direction, unsigned int i_buf,
|
|
Packit |
dd8086 |
/*in/out*/ void *p_buf );
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Obtain the SCSI sense reply of the most-recently-performed MMC command.
|
|
Packit |
dd8086 |
These bytes give an indication of possible problems which occured in
|
|
Packit |
dd8086 |
the drive while the command was performed. With some commands they tell
|
|
Packit |
dd8086 |
about the current state of the drive (e.g. 00h TEST UNIT READY).
|
|
Packit |
dd8086 |
@param p_cdio CD structure set by cdio_open().
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param pp_sense returns the sense bytes received from the drive.
|
|
Packit |
dd8086 |
This is allocated memory or NULL if no sense bytes are
|
|
Packit |
dd8086 |
available. Dispose non-NULL pointers by cdio_free() when no longer
|
|
Packit |
dd8086 |
needed. See SPC-3 4.5.3 Fixed format sense data. SCSI error
|
|
Packit |
dd8086 |
codes as of SPC-3 Annex D, MMC-5 Annex F: sense[2]&15 = Key ,
|
|
Packit |
dd8086 |
sense[12] = ASC , sense[13] = ASCQ
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@return number of valid bytes in sense, 0 in case of no sense
|
|
Packit |
dd8086 |
bytes available, <0 in case of internal error.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
int mmc_last_cmd_sense ( const CdIo_t *p_cdio,
|
|
Packit |
dd8086 |
cdio_mmc_request_sense_t **pp_sense);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Set the block size for subsequest read requests, via MMC.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
driver_return_code_t mmc_set_blocksize ( const CdIo_t *p_cdio,
|
|
Packit |
dd8086 |
uint16_t i_blocksize);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
Get string name for MMC command
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
@param command cdio_mmc_gpcmd_t command value
|
|
Packit |
dd8086 |
@return string name of command
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
const char *mmc_cmd2str(uint8_t command);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifdef __cplusplus
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
#endif /* __cplusplus */
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/**
|
|
Packit |
dd8086 |
The below variables are trickery to force the above enum symbol
|
|
Packit |
dd8086 |
values to be recorded in debug symbol tables. They are used to
|
|
Packit |
dd8086 |
allow one to refer to the enumeration value names in the typedefs
|
|
Packit |
dd8086 |
above in a debugger and debugger expressions
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
extern cdio_mmc_feature_t debug_cdio_mmc_feature;
|
|
Packit |
dd8086 |
extern cdio_mmc_feature_interface_t debug_cdio_mmc_feature_interface;
|
|
Packit |
dd8086 |
extern cdio_mmc_feature_profile_t debug_cdio_mmc_feature_profile;
|
|
Packit |
dd8086 |
extern cdio_mmc_get_conf_t debug_cdio_mmc_get_conf;
|
|
Packit |
dd8086 |
extern cdio_mmc_gpcmd_t debug_cdio_mmc_gpcmd;
|
|
Packit |
dd8086 |
extern cdio_mmc_read_sub_state_t debug_cdio_mmc_read_sub_state;
|
|
Packit |
dd8086 |
extern cdio_mmc_read_cd_type_t debug_cdio_mmc_read_cd_type;
|
|
Packit |
dd8086 |
extern cdio_mmc_readtoc_t debug_cdio_mmc_readtoc;
|
|
Packit |
dd8086 |
extern cdio_mmc_mode_page_t debug_cdio_mmc_mode_page;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifndef DO_NOT_WANT_OLD_MMC_COMPATIBILITY
|
|
Packit |
dd8086 |
#define CDIO_MMC_GPCMD_START_STOP CDIO_MMC_GPCMD_START_STOP_UNIT
|
|
Packit |
dd8086 |
#define CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL \
|
|
Packit |
dd8086 |
CDIO_MMC_GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL
|
|
Packit |
dd8086 |
#endif /*DO_NOT_WANT_PARANOIA_COMPATIBILITY*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#endif /* CDIO_MMC_H_ */
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/*
|
|
Packit |
dd8086 |
* Local variables:
|
|
Packit |
dd8086 |
* c-file-style: "ruby"
|
|
Packit |
dd8086 |
* tab-width: 8
|
|
Packit |
dd8086 |
* indent-tabs-mode: nil
|
|
Packit |
dd8086 |
* End:
|
|
Packit |
dd8086 |
*/
|