00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00036 #ifndef __CDIO_MMC_H__
00037 #define __CDIO_MMC_H__
00038
00039 #include <cdio/cdio.h>
00040 #include <cdio/types.h>
00041 #include <cdio/dvd.h>
00042 #include <cdio/audio.h>
00043 #include <cdio/mmc_util.h>
00044
00045 #ifdef __cplusplus
00046 extern "C" {
00047 #endif
00048
00049
00050
00051
00052 #ifdef WORDS_BIGENDIAN
00053 # if !defined(__LITTLE_ENDIAN_BITFIELD) && !defined(__BIG_ENDIAN_BITFIELD)
00054 # define __MMC_BIG_ENDIAN_BITFIELD
00055 # endif
00056 #else
00057 # if !defined(__LITTLE_ENDIAN_BITFIELD) && !defined(__BIG_ENDIAN_BITFIELD)
00058 # define __MMC_LITTLE_ENDIAN_BITFIELD
00059 # endif
00060 #endif
00061
00069 typedef struct cdio_mmc_request_sense {
00070 #if defined(__MMC_BIG_ENDIAN_BITFIELD)
00071 uint8_t valid : 1;
00072 uint8_t error_code : 7;
00073 #else
00074 uint8_t error_code : 7;
00075 uint8_t valid : 1;
00076 #endif
00077 uint8_t segment_number;
00078 #if defined(__MMC_BIG_ENDIAN_BITFIELD)
00079 uint8_t filemark : 1;
00081 uint8_t eom : 1;
00084 uint8_t ili : 1;
00085 uint8_t reserved1 : 1;
00086 uint8_t sense_key : 4;
00087 #else
00088 uint8_t sense_key : 4;
00089 uint8_t reserved1 : 1;
00090 uint8_t ili : 1;
00091 uint8_t eom : 1;
00094 uint8_t filemark : 1;
00096 #endif
00097 uint8_t information[4];
00098 uint8_t additional_sense_len;
00099 uint8_t command_info[4];
00100 uint8_t asc;
00101 uint8_t ascq;
00102 uint8_t fruc;
00103 uint8_t sks[3];
00104 uint8_t asb[46];
00105 } cdio_mmc_request_sense_t;
00106
00107
00111 typedef enum {
00112 CDIO_MMC_SENSE_KEY_NO_SENSE = 0,
00113 CDIO_MMC_SENSE_KEY_RECOVERED_ERROR = 1,
00114 CDIO_MMC_SENSE_KEY_NOT_READY = 2,
00115 CDIO_MMC_SENSE_KEY_MEDIUM_ERROR = 3,
00116 CDIO_MMC_SENSE_KEY_HARDWARE_ERROR = 4,
00117 CDIO_MMC_SENSE_KEY_ILLEGAL_REQUEST = 5,
00118 CDIO_MMC_SENSE_KEY_UNIT_ATTENTION = 6,
00119 CDIO_MMC_SENSE_KEY_DATA_PROTECT = 7,
00120 CDIO_MMC_SENSE_KEY_BLANK_CHECK = 8,
00121 CDIO_MMC_SENSE_KEY_VENDOR_SPECIFIC = 9,
00122 CDIO_MMC_SENSE_KEY_COPY_ABORTED = 10,
00123 CDIO_MMC_SENSE_KEY_ABORTED_COMMAND = 11,
00124 CDIO_MMC_SENSE_KEY_OBSOLETE = 12,
00125 } cdio_mmc_sense_key_t;
00126
00138 typedef enum {
00139 CDIO_MMC_GPCMD_TEST_UNIT_READY = 0x00,
00140 CDIO_MMC_GPCMD_INQUIRY = 0x12,
00142 CDIO_MMC_GPCMD_MODE_SELECT_6 = 0x15,
00144 CDIO_MMC_GPCMD_MODE_SENSE_6 = 0x1a,
00149 CDIO_MMC_GPCMD_START_STOP_UNIT = 0x1b,
00151 CDIO_MMC_GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL
00152 = 0x1e,
00158 CDIO_MMC_GPCMD_READ_10 = 0x28,
00160 CDIO_MMC_GPCMD_READ_SUBCHANNEL = 0x42,
00162 CDIO_MMC_GPCMD_READ_TOC = 0x43,
00164 CDIO_MMC_GPCMD_READ_HEADER = 0x44,
00165 CDIO_MMC_GPCMD_PLAY_AUDIO_10 = 0x45,
00168 CDIO_MMC_GPCMD_GET_CONFIGURATION = 0x46,
00170 CDIO_MMC_GPCMD_PLAY_AUDIO_MSF = 0x47,
00173 CDIO_MMC_GPCMD_PLAY_AUDIO_TI = 0x48,
00174 CDIO_MMC_GPCMD_PLAY_TRACK_REL_10 = 0x49,
00181 CDIO_MMC_GPCMD_GET_EVENT_STATUS = 0x4a,
00183 CDIO_MMC_GPCMD_PAUSE_RESUME = 0x4b,
00187 CDIO_MMC_GPCMD_READ_DISC_INFO = 0x51,
00189 CDIO_MMC_GPCMD_READ_TRACK_INFORMATION = 0x52,
00191 CDIO_MMC_GPCMD_MODE_SELECT_10 = 0x55,
00193 CDIO_MMC_GPCMD_MODE_SENSE_10 = 0x5a,
00202 CDIO_MMC_GPCMD_PLAY_AUDIO_12 = 0xa5,
00205 CDIO_MMC_GPCMD_LOAD_UNLOAD = 0xa6,
00207 CDIO_MMC_GPCMD_READ_12 = 0xa8,
00209 CDIO_MMC_GPCMD_PLAY_TRACK_REL_12 = 0xa9,
00215 CDIO_MMC_GPCMD_READ_DVD_STRUCTURE = 0xad,
00217 CDIO_MMC_GPCMD_READ_MSF = 0xb9,
00220 CDIO_MMC_GPCMD_SET_SPEED = 0xbb,
00230 CDIO_MMC_GPCMD_READ_CD = 0xbe,
00236 CDIO_MMC_GPCMD_CD_PLAYBACK_STATUS = 0xc4 ,
00237 CDIO_MMC_GPCMD_PLAYBACK_CONTROL = 0xc9 ,
00238 CDIO_MMC_GPCMD_READ_CDDA = 0xd8 ,
00239 CDIO_MMC_GPCMD_READ_CDXA = 0xdb ,
00240 CDIO_MMC_GPCMD_READ_ALL_SUBCODES = 0xdf
00241 } cdio_mmc_gpcmd_t;
00242
00243
00247 typedef enum {
00248 CDIO_MMC_READ_SUB_ST_INVALID = 0x00,
00249 CDIO_MMC_READ_SUB_ST_PLAY = 0x11,
00251 CDIO_MMC_READ_SUB_ST_PAUSED = 0x12,
00252 CDIO_MMC_READ_SUB_ST_COMPLETED = 0x13,
00254 CDIO_MMC_READ_SUB_ST_ERROR = 0x14,
00256 CDIO_MMC_READ_SUB_ST_NO_STATUS = 0x15,
00258 } cdio_mmc_read_sub_state_t;
00259
00261 typedef enum {
00262 CDIO_MMC_READ_TYPE_ANY = 0,
00263 CDIO_MMC_READ_TYPE_CDDA = 1,
00264 CDIO_MMC_READ_TYPE_MODE1 = 2,
00265 CDIO_MMC_READ_TYPE_MODE2 = 3,
00266 CDIO_MMC_READ_TYPE_M2F1 = 4,
00267 CDIO_MMC_READ_TYPE_M2F2 = 5
00268 } cdio_mmc_read_cd_type_t;
00269
00273 typedef enum {
00274 CDIO_MMC_READTOC_FMT_TOC = 0,
00275 CDIO_MMC_READTOC_FMT_SESSION = 1,
00276 CDIO_MMC_READTOC_FMT_FULTOC = 2,
00277 CDIO_MMC_READTOC_FMT_PMA = 3,
00278 CDIO_MMC_READTOC_FMT_ATIP = 4,
00279 CDIO_MMC_READTOC_FMT_CDTEXT = 5
00280 } cdio_mmc_readtoc_t;
00281
00285 typedef enum {
00286 CDIO_MMC_R_W_ERROR_PAGE = 0x01,
00287 CDIO_MMC_WRITE_PARMS_PAGE = 0x05,
00288 CDIO_MMC_CDR_PARMS_PAGE = 0x0d,
00289 CDIO_MMC_AUDIO_CTL_PAGE = 0x0e,
00290 CDIO_MMC_POWER_PAGE = 0x1a,
00291 CDIO_MMC_FAULT_FAIL_PAGE = 0x1c,
00292 CDIO_MMC_TO_PROTECT_PAGE = 0x1d,
00293 CDIO_MMC_CAPABILITIES_PAGE = 0x2a,
00294 CDIO_MMC_ALL_PAGES = 0x3f,
00295 } cdio_mmc_mode_page_t;
00296
00300 typedef enum {
00301 CDIO_MMC_READ_DISC_INFO_STANDARD = 0x0,
00302 CDIO_MMC_READ_DISC_INFO_TRACK = 0x1,
00303 CDIO_MMC_READ_DISC_INFO_POW = 0x2,
00304 } cdio_mmc_read_disc_info_datatype_t;
00305
00306
00307 PRAGMA_BEGIN_PACKED
00308 struct mmc_audio_volume_entry_s
00309 {
00310 uint8_t selection;
00311 uint8_t volume;
00312 } GNUC_PACKED;
00313
00314 typedef struct mmc_audio_volume_entry_s mmc_audio_volume_entry_t;
00315
00319 struct mmc_audio_volume_s
00320 {
00321 mmc_audio_volume_entry_t port[4];
00322 } GNUC_PACKED;
00323
00324 typedef struct mmc_audio_volume_s mmc_audio_volume_t;
00325
00326 PRAGMA_END_PACKED
00327
00328
00332 typedef enum {
00333 CDIO_MMC_GET_CONF_ALL_FEATURES = 0,
00335 CDIO_MMC_GET_CONF_CURRENT_FEATURES = 1,
00338 CDIO_MMC_GET_CONF_NAMED_FEATURE = 2
00340 } cdio_mmc_get_conf_t;
00341
00342
00347 typedef enum {
00348 CDIO_MMC_FEATURE_PROFILE_LIST = 0x000,
00349 CDIO_MMC_FEATURE_CORE = 0x001,
00350 CDIO_MMC_FEATURE_MORPHING = 0x002,
00352 CDIO_MMC_FEATURE_REMOVABLE_MEDIUM = 0x003,
00353 CDIO_MMC_FEATURE_WRITE_PROTECT = 0x004,
00354 CDIO_MMC_FEATURE_RANDOM_READABLE = 0x010,
00355 CDIO_MMC_FEATURE_MULTI_READ = 0x01D,
00356 CDIO_MMC_FEATURE_CD_READ = 0x01E,
00357 CDIO_MMC_FEATURE_DVD_READ = 0x01F,
00358 CDIO_MMC_FEATURE_RANDOM_WRITABLE = 0x020,
00359 CDIO_MMC_FEATURE_INCR_WRITE = 0x021,
00361 CDIO_MMC_FEATURE_SECTOR_ERASE = 0x022,
00362 CDIO_MMC_FEATURE_FORMATABLE = 0x023,
00363 CDIO_MMC_FEATURE_DEFECT_MGMT = 0x024,
00367 CDIO_MMC_FEATURE_WRITE_ONCE = 0x025,
00369 CDIO_MMC_FEATURE_RESTRICT_OVERW = 0x026,
00371 CDIO_MMC_FEATURE_CD_RW_CAV = 0x027,
00372 CDIO_MMC_FEATURE_MRW = 0x028,
00373 CDIO_MMC_FEATURE_ENHANCED_DEFECT = 0x029,
00374 CDIO_MMC_FEATURE_DVD_PRW = 0x02A,
00375 CDIO_MMC_FEATURE_DVD_PR = 0x02B,
00376 CDIO_MMC_FEATURE_RIGID_RES_OVERW = 0x02C,
00377 CDIO_MMC_FEATURE_CD_TAO = 0x02D,
00378 CDIO_MMC_FEATURE_CD_SAO = 0x02E,
00380 CDIO_MMC_FEATURE_DVD_R_RW_WRITE = 0x02F,
00381 CDIO_MMC_FEATURE_CD_RW_MEDIA_WRITE= 0x037,
00382 CDIO_MMC_FEATURE_DVD_PR_2_LAYER = 0x03B,
00383 CDIO_MMC_FEATURE_POWER_MGMT = 0x100,
00385 CDIO_MMC_FEATURE_CDDA_EXT_PLAY = 0x103,
00388 CDIO_MMC_FEATURE_MCODE_UPGRADE = 0x104,
00389
00390
00391 CDIO_MMC_FEATURE_TIME_OUT = 0x105,
00394 CDIO_MMC_FEATURE_DVD_CSS = 0x106,
00397 CDIO_MMC_FEATURE_RT_STREAMING = 0x107,
00400 CDIO_MMC_FEATURE_LU_SN = 0x108,
00402 CDIO_MMC_FEATURE_FIRMWARE_DATE = 0x1FF,
00404 } cdio_mmc_feature_t;
00405
00406 typedef enum {
00407 CDIO_MMC_FEATURE_INTERFACE_UNSPECIFIED = 0,
00408 CDIO_MMC_FEATURE_INTERFACE_SCSI = 1,
00409 CDIO_MMC_FEATURE_INTERFACE_ATAPI = 2,
00410 CDIO_MMC_FEATURE_INTERFACE_IEEE_1394 = 3,
00411 CDIO_MMC_FEATURE_INTERFACE_IEEE_1394A = 4,
00412 CDIO_MMC_FEATURE_INTERFACE_FIBRE_CH = 5
00413 } cdio_mmc_feature_interface_t;
00414
00415
00420 #define MAX_CDB_LEN 12
00421
00426 typedef struct mmc_cdb_s {
00427 uint8_t field[MAX_CDB_LEN];
00428 } mmc_cdb_t;
00429
00434 typedef struct mmc_feature_list_header_s {
00435 unsigned char length_msb;
00436 unsigned char length_1sb;
00437 unsigned char length_2sb;
00438 unsigned char length_lsb;
00439 unsigned char reserved1;
00440 unsigned char reserved2;
00441 unsigned char profile_msb;
00442 unsigned char profile_lsb;
00443 } cdio_mmc_feature_list_header_t;
00444
00449 typedef enum mmc_direction_s {
00450 SCSI_MMC_DATA_READ,
00451 SCSI_MMC_DATA_WRITE,
00452 SCSI_MMC_DATA_NONE
00453 } cdio_mmc_direction_t;
00460 #define SCSI_MMC_HAS_DIR_NONE 1
00461
00462 typedef struct mmc_subchannel_s
00463 {
00464 uint8_t reserved;
00465 uint8_t audio_status;
00466 uint16_t data_length;
00467 uint8_t format;
00468 uint8_t address: 4;
00469 uint8_t control: 4;
00470 uint8_t track;
00471 uint8_t index;
00472 uint8_t abs_addr[4];
00473 uint8_t rel_addr[4];
00474 } cdio_mmc_subchannel_t;
00475
00476 #define CDIO_MMC_SET_COMMAND(cdb, command) \
00477 cdb[0] = command
00478
00479 #define CDIO_MMC_SET_READ_TYPE(cdb, sector_type) \
00480 cdb[1] = (sector_type << 2)
00481
00482 #define CDIO_MMC_GETPOS_LEN16(p, pos) \
00483 (p[pos]<<8) + p[pos+1]
00484
00485 #define CDIO_MMC_GET_LEN16(p) \
00486 (p[0]<<8) + p[1]
00487
00488 #define CDIO_MMC_GET_LEN32(p) \
00489 (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3];
00490
00491 #define CDIO_MMC_SET_LEN16(cdb, pos, len) \
00492 cdb[pos ] = (len >> 8) & 0xff; \
00493 cdb[pos+1] = (len ) & 0xff
00494
00495 #define CDIO_MMC_SET_READ_LBA(cdb, lba) \
00496 cdb[2] = (lba >> 24) & 0xff; \
00497 cdb[3] = (lba >> 16) & 0xff; \
00498 cdb[4] = (lba >> 8) & 0xff; \
00499 cdb[5] = (lba ) & 0xff
00500
00501 #define CDIO_MMC_SET_START_TRACK(cdb, command) \
00502 cdb[6] = command
00503
00504 #define CDIO_MMC_SET_READ_LENGTH24(cdb, len) \
00505 cdb[6] = (len >> 16) & 0xff; \
00506 cdb[7] = (len >> 8) & 0xff; \
00507 cdb[8] = (len ) & 0xff
00508
00509 #define CDIO_MMC_SET_READ_LENGTH16(cdb, len) \
00510 CDIO_MMC_SET_LEN16(cdb, 7, len)
00511
00512 #define CDIO_MMC_SET_READ_LENGTH8(cdb, len) \
00513 cdb[8] = (len ) & 0xff
00514
00515 #define CDIO_MMC_MCSB_ALL_HEADERS 0xf
00516
00517 #define CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb, val) \
00518 cdb[9] = val << 3;
00519
00528 driver_return_code_t mmc_audio_get_volume (CdIo_t *p_cdio,
00529 mmc_audio_volume_t *p_volume);
00530
00537 driver_return_code_t
00538 mmc_audio_read_subchannel (CdIo_t *p_cdio,
00539 cdio_subchannel_t *p_subchannel);
00540
00550 driver_return_code_t
00551 mmc_isrc_track_read_subchannel (CdIo_t *p_cdio, const track_t track,
00552 char *p_isrc);
00553
00558 const char *mmc_audio_state2str( uint8_t i_audio_state );
00559
00566 int mmc_get_blocksize ( CdIo_t *p_cdio );
00567
00573 uint8_t mmc_get_cmd_len(uint8_t mmc_cmd);
00574
00581 lsn_t mmc_get_disc_last_lsn( const CdIo_t *p_cdio );
00582
00592 discmode_t mmc_get_discmode( const CdIo_t *p_cdio );
00593
00594
00595 typedef enum {
00596 CDIO_MMC_LEVEL_WEIRD,
00597 CDIO_MMC_LEVEL_1,
00598 CDIO_MMC_LEVEL_2,
00599 CDIO_MMC_LEVEL_3,
00600 CDIO_MMC_LEVEL_NONE
00601 } cdio_mmc_level_t;
00602
00608 cdio_mmc_level_t mmc_get_drive_mmc_cap(CdIo_t *p_cdio);
00609
00610
00618 discmode_t mmc_get_dvd_struct_physical ( const CdIo_t *p_cdio,
00619 cdio_dvd_struct_t *s);
00620
00627 int mmc_get_tray_status ( const CdIo_t *p_cdio );
00628
00637 bool mmc_get_hwinfo ( const CdIo_t *p_cdio,
00638 cdio_hwinfo_t *p_hw_info );
00639
00640
00647 int mmc_get_media_changed(const CdIo_t *p_cdio);
00648
00660 char * mmc_get_mcn(const CdIo_t *p_cdio);
00661
00670 bool_3way_t mmc_have_interface(CdIo_t *p_cdio,
00671 cdio_mmc_feature_interface_t e_interface );
00672
00673
00692 driver_return_code_t mmc_read_data_sectors ( CdIo_t *p_cdio, void *p_buf,
00693 lsn_t i_lsn,
00694 uint16_t i_blocksize,
00695 uint32_t i_blocks );
00696
00701 driver_return_code_t mmc_read_sectors ( const CdIo_t *p_cdio, void *p_buf,
00702 lsn_t i_lsn, int read_sector_type,
00703 uint32_t i_blocks);
00704
00720 driver_return_code_t
00721 mmc_run_cmd( const CdIo_t *p_cdio, unsigned int i_timeout_ms,
00722 const mmc_cdb_t *p_cdb,
00723 cdio_mmc_direction_t e_direction, unsigned int i_buf,
00724 void *p_buf );
00725
00745 driver_return_code_t
00746 mmc_run_cmd_len( const CdIo_t *p_cdio, unsigned int i_timeout_ms,
00747 const mmc_cdb_t *p_cdb, unsigned int i_cdb,
00748 cdio_mmc_direction_t e_direction, unsigned int i_buf,
00749 void *p_buf );
00750
00768 int mmc_last_cmd_sense ( const CdIo_t *p_cdio,
00769 cdio_mmc_request_sense_t **pp_sense);
00770
00774 driver_return_code_t mmc_set_blocksize ( const CdIo_t *p_cdio,
00775 uint16_t i_blocksize);
00776
00777 #ifdef __cplusplus
00778 }
00779 #endif
00780
00787 extern cdio_mmc_feature_t debug_cdio_mmc_feature;
00788 extern cdio_mmc_feature_interface_t debug_cdio_mmc_feature_interface;
00789 extern cdio_mmc_feature_profile_t debug_cdio_mmc_feature_profile;
00790 extern cdio_mmc_get_conf_t debug_cdio_mmc_get_conf;
00791 extern cdio_mmc_gpcmd_t debug_cdio_mmc_gpcmd;
00792 extern cdio_mmc_read_sub_state_t debug_cdio_mmc_read_sub_state;
00793 extern cdio_mmc_read_cd_type_t debug_cdio_mmc_read_cd_type;
00794 extern cdio_mmc_readtoc_t debug_cdio_mmc_readtoc;
00795 extern cdio_mmc_mode_page_t debug_cdio_mmc_mode_page;
00796
00797 #ifndef DO_NOT_WANT_OLD_MMC_COMPATIBILITY
00798 #define CDIO_MMC_GPCMD_START_STOP CDIO_MMC_GPCMD_START_STOP_UNIT
00799 #define CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL \
00800 CDIO_MMC_GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL
00801 #endif
00802
00803 #endif
00804
00805
00806
00807
00808
00809
00810
00811