/*
* This file has been modified for the cdrkit suite.
*
* The behaviour and appearence of the program code below can differ to a major
* extent from the version distributed by the original author(s).
*
* For details, see Changelog file distributed with the cdrkit package. If you
* received this file from another source then ask the distributing person for
* a log of modifications.
*
*/
/* @(#)scsimmc.h 1.11 04/03/01 Copyright 1997-2004 J. Schilling */
/*
* Definitions for SCSI/mmc compliant drives
*
* Copyright (c) 1997-2004 J. Schilling
*/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; see the file COPYING. If not, write to the Free Software
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _SCSIMMC_H
#define _SCSIMMC_H
#include <utypes.h>
#include <btorder.h>
typedef struct opc {
Uchar opc_speed[2];
Uchar opc_val[6];
} opc_t;
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
struct disk_info {
Uchar data_len[2]; /* Data len without this info */
Ucbit disk_status : 2; /* Status of the disk */
Ucbit sess_status : 2; /* Status of last session */
Ucbit erasable : 1; /* Disk is erasable */
Ucbit res2 : 3; /* Reserved */
Uchar first_track; /* # of first track on disk */
Uchar numsess; /* # of sessions */
Uchar first_track_ls; /* First track in last sessaion */
Uchar last_track_ls; /* Last track in last sessaion */
Ucbit bg_format_stat : 2; /* Background format status */
Ucbit dbit : 1; /* Dirty Bit of defect table */
Ucbit res7_34 : 2; /* Reserved */
Ucbit uru : 1; /* This is an unrestricted disk */
Ucbit dbc_v : 1; /* Disk bar code valid */
Ucbit did_v : 1; /* Disk id valid */
Uchar disk_type; /* Disk type */
Uchar res9[3]; /* Reserved */
Uchar disk_id[4]; /* Disk identification */
Uchar last_lead_in[4]; /* Last session lead in time */
Uchar last_lead_out[4]; /* Last session lead out time */
Uchar disk_barcode[8]; /* Disk bar code */
Uchar res32; /* Reserved */
Uchar num_opc_entries; /* # of OPC table entries */
opc_t opc_table[1]; /* OPC table */
};
#else /* Motorola bitorder */
struct disk_info {
Uchar data_len[2]; /* Data len without this info */
Ucbit res2 : 3; /* Reserved */
Ucbit erasable : 1; /* Disk is erasable */
Ucbit sess_status : 2; /* Status of last session */
Ucbit disk_status : 2; /* Status of the disk */
Uchar first_track; /* # of first track on disk */
Uchar numsess; /* # of sessions */
Uchar first_track_ls; /* First track in last sessaion */
Uchar last_track_ls; /* Last track in last sessaion */
Ucbit did_v : 1; /* Disk id valid */
Ucbit dbc_v : 1; /* Disk bar code valid */
Ucbit uru : 1; /* This is an unrestricted disk */
Ucbit res7_34 : 2; /* Reserved */
Ucbit dbit : 1; /* Dirty Bit of defect table */
Ucbit bg_format_stat : 2; /* Background format status */
Uchar disk_type; /* Disk type */
Uchar res9[3]; /* Reserved */
Uchar disk_id[4]; /* Disk identification */
Uchar last_lead_in[4]; /* Last session lead in time */
Uchar last_lead_out[4]; /* Last session lead out time */
Uchar disk_barcode[8]; /* Disk bar code */
Uchar res32; /* Reserved */
Uchar num_opc_entries; /* # of OPC table entries */
opc_t opc_table[1]; /* OPC table */
};
#endif
struct cd_mode_data {
struct scsi_mode_header header;
union cd_pagex {
struct cd_mode_page_05 page05;
struct cd_mode_page_2A page2A;
} pagex;
};
struct tocheader {
Uchar len[2];
Uchar first;
Uchar last;
};
/*
* Full TOC entry
*/
struct ftrackdesc {
Uchar sess_number;
#if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */
Ucbit control : 4;
Ucbit adr : 4;
#else /* Motorola byteorder */
Ucbit adr : 4;
Ucbit control : 4;
#endif
Uchar track;
Uchar point;
Uchar amin;
Uchar asec;
Uchar aframe;
Uchar res7;
Uchar pmin;
Uchar psec;
Uchar pframe;
};
struct fdiskinfo {
struct tocheader hd;
struct ftrackdesc desc[1];
};
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
struct atipdesc {
Ucbit ref_speed : 3; /* Reference speed */
Ucbit res4_3 : 1; /* Reserved */
Ucbit ind_wr_power : 3; /* Indicative tgt writing power */
Ucbit res4_7 : 1; /* Reserved (must be "1") */
Ucbit res5_05 : 6; /* Reserved */
Ucbit uru : 1; /* Disk is for unrestricted use */
Ucbit res5_7 : 1; /* Reserved (must be "0") */
Ucbit a3_v : 1; /* A 3 Values valid */
Ucbit a2_v : 1; /* A 2 Values valid */
Ucbit a1_v : 1; /* A 1 Values valid */
Ucbit sub_type : 3; /* Disc sub type */
Ucbit erasable : 1; /* Disk is erasable */
Ucbit res6_7 : 1; /* Reserved (must be "1") */
Uchar lead_in[4]; /* Lead in time */
Uchar lead_out[4]; /* Lead out time */
Uchar res15; /* Reserved */
Ucbit clv_high : 4; /* Highes usable CLV recording speed */
Ucbit clv_low : 3; /* Lowest usable CLV recording speed */
Ucbit res16_7 : 1; /* Reserved (must be "0") */
Ucbit res17_0 : 1; /* Reserved */
Ucbit tgt_y_pow : 3; /* Tgt y val of the power mod fun */
Ucbit power_mult : 3; /* Power multiplication factor */
Ucbit res17_7 : 1; /* Reserved (must be "0") */
Ucbit res_18_30 : 4; /* Reserved */
Ucbit rerase_pwr_ratio: 3; /* Recommended erase/write power*/
Ucbit res18_7 : 1; /* Reserved (must be "1") */
Uchar res19; /* Reserved */
Uchar a2[3]; /* A 2 Values */
Uchar res23; /* Reserved */
Uchar a3[3]; /* A 3 Vaules */
Uchar res27; /* Reserved */
};
#else /* Motorola bitorder */
struct atipdesc {
Ucbit res4_7 : 1; /* Reserved (must be "1") */
Ucbit ind_wr_power : 3; /* Indicative tgt writing power */
Ucbit res4_3 : 1; /* Reserved */
Ucbit ref_speed : 3; /* Reference speed */
Ucbit res5_7 : 1; /* Reserved (must be "0") */
Ucbit uru : 1; /* Disk is for unrestricted use */
Ucbit res5_05 : 6; /* Reserved */
Ucbit res6_7 : 1; /* Reserved (must be "1") */
Ucbit erasable : 1; /* Disk is erasable */
Ucbit sub_type : 3; /* Disc sub type */
Ucbit a1_v : 1; /* A 1 Values valid */
Ucbit a2_v : 1; /* A 2 Values valid */
Ucbit a3_v : 1; /* A 3 Values valid */
Uchar lead_in[4]; /* Lead in time */
Uchar lead_out[4]; /* Lead out time */
Uchar res15; /* Reserved */
Ucbit res16_7 : 1; /* Reserved (must be "0") */
Ucbit clv_low : 3; /* Lowest usable CLV recording speed */
Ucbit clv_high : 4; /* Highes usable CLV recording speed */
Ucbit res17_7 : 1; /* Reserved (must be "0") */
Ucbit power_mult : 3; /* Power multiplication factor */
Ucbit tgt_y_pow : 3; /* Tgt y val of the power mod fun */
Ucbit res17_0 : 1; /* Reserved */
Ucbit res18_7 : 1; /* Reserved (must be "1") */
Ucbit rerase_pwr_ratio: 3; /* Recommended erase/write power*/
Ucbit res_18_30 : 4; /* Reserved */
Uchar res19; /* Reserved */
Uchar a2[3]; /* A 2 Values */
Uchar res23; /* Reserved */
Uchar a3[3]; /* A 3 Vaules */
Uchar res27; /* Reserved */
};
#endif
struct atipinfo {
struct tocheader hd;
struct atipdesc desc;
};
/*
* XXX Check how we may merge Track_info & Rzone_info
*/
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
struct track_info {
Uchar data_len[2]; /* Data len without this info */
Uchar track_number; /* Track number for this info */
Uchar session_number; /* Session number for this info */
Uchar res4; /* Reserved */
Ucbit track_mode : 4; /* Track mode (Q-sub control) */
Ucbit copy : 1; /* This track is a higher copy */
Ucbit damage : 1; /* if 1 & nwa_valid 0: inc track*/
Ucbit res5_67 : 2; /* Reserved */
Ucbit data_mode : 4; /* Data mode of this track */
Ucbit fp : 1; /* This is a fixed packet track */
Ucbit packet : 1; /* This track is in packet mode */
Ucbit blank : 1; /* This is an invisible track */
Ucbit rt : 1; /* This is a reserved track */
Ucbit nwa_valid : 1; /* Next writable addr valid */
Ucbit res7_17 : 7; /* Reserved */
Uchar track_start[4]; /* Track start address */
Uchar next_writable_addr[4]; /* Next writable address */
Uchar free_blocks[4]; /* Free usr blocks in this track*/
Uchar packet_size[4]; /* Packet size if in fixed mode */
Uchar track_size[4]; /* # of user data blocks in trk */
};
#else /* Motorola bitorder */
struct track_info {
Uchar data_len[2]; /* Data len without this info */
Uchar track_number; /* Track number for this info */
Uchar session_number; /* Session number for this info */
Uchar res4; /* Reserved */
Ucbit res5_67 : 2; /* Reserved */
Ucbit damage : 1; /* if 1 & nwa_valid 0: inc track*/
Ucbit copy : 1; /* This track is a higher copy */
Ucbit track_mode : 4; /* Track mode (Q-sub control) */
Ucbit rt : 1; /* This is a reserved track */
Ucbit blank : 1; /* This is an invisible track */
Ucbit packet : 1; /* This track is in packet mode */
Ucbit fp : 1; /* This is a fixed packet track */
Ucbit data_mode : 4; /* Data mode of this track */
Ucbit res7_17 : 7; /* Reserved */
Ucbit nwa_valid : 1; /* Next writable addr valid */
Uchar track_start[4]; /* Track start address */
Uchar next_writable_addr[4]; /* Next writable address */
Uchar free_blocks[4]; /* Free usr blocks in this track*/
Uchar packet_size[4]; /* Packet size if in fixed mode */
Uchar track_size[4]; /* # of user data blocks in trk */
};
#endif
/*
* XXX Check how we may merge Track_info & Rzone_info
*/
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
struct rzone_info {
Uchar data_len[2]; /* Data len without this info */
Uchar rzone_num_lsb; /* RZone number LSB */
Uchar border_num_lsb; /* Border number LSB */
Uchar res_4; /* Reserved */
Ucbit res5_04 : 5; /* Reserved */
Ucbit damage : 1; /* Damaged RZone */
Ucbit res5_67 : 2; /* Reserved */
Ucbit res6_04 : 5; /* Reserved */
Ucbit incremental : 1; /* RZone is to be written incremental */
Ucbit blank : 1; /* RZone is blank */
Ucbit rt : 1; /* RZone is reserved */
Ucbit nwa_v : 1; /* Next WR address is valid */
Ucbit lra_v : 1; /* Last rec address is valid */
Ucbit res7_27 : 6; /* Reserved */
Uchar rzone_start[4]; /* RZone start address */
Uchar next_recordable_addr[4]; /* Next recordable address */
Uchar free_blocks[4]; /* Free blocks in RZone */
Uchar block_factor[4]; /* # of sectors of disc acc unit */
Uchar rzone_size[4]; /* RZone size */
Uchar last_recorded_addr[4]; /* Last Recorded addr in RZone */
Uchar rzone_num_msb; /* RZone number MSB */
Uchar border_num_msb; /* Border number MSB */
Uchar res_34_35[2]; /* Reserved */
};
#else /* Motorola bitorder */
struct rzone_info {
Uchar data_len[2]; /* Data len without this info */
Uchar rzone_num_lsb; /* RZone number LSB */
Uchar border_num_lsb; /* Border number LSB */
Uchar res_4; /* Reserved */
Ucbit res5_67 : 2; /* Reserved */
Ucbit damage : 1; /* Damaged RZone */
Ucbit res5_04 : 5; /* Reserved */
Ucbit rt : 1; /* RZone is reserved */
Ucbit blank : 1; /* RZone is blank */
Ucbit incremental : 1; /* RZone is to be written incremental */
Ucbit res6_04 : 5; /* Reserved */
Ucbit res7_27 : 6; /* Reserved */
Ucbit lra_v : 1; /* Last rec address is valid */
Ucbit nwa_v : 1; /* Next WR address is valid */
Uchar rzone_start[4]; /* RZone start address */
Uchar next_recordable_addr[4]; /* Next recordable address */
Uchar free_blocks[4]; /* Free blocks in RZone */
Uchar block_factor[4]; /* # of sectors of disc acc unit */
Uchar rzone_size[4]; /* RZone size */
Uchar last_recorded_addr[4]; /* Last Recorded addr in RZone */
Uchar rzone_num_msb; /* RZone number MSB */
Uchar border_num_msb; /* Border number MSB */
Uchar res_34_35[2]; /* Reserved */
};
#endif
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
struct dvd_structure_00 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Ucbit book_version : 4; /* DVD Book version */
Ucbit book_type : 4; /* DVD Book type */
Ucbit minimum_rate : 4; /* Minimum data rate (coded) */
Ucbit disc_size : 4; /* Disc size (coded) */
Ucbit layer_type : 4; /* Layer type */
Ucbit track_path : 1; /* 0 = parallel, 1 = opposit dir*/
Ucbit numlayers : 2; /* Number of Layers (0 == 1) */
Ucbit res2_7 : 1; /* Reserved */
Ucbit track_density : 4; /* Track density (coded) */
Ucbit linear_density : 4; /* Linear data density (coded) */
Uchar res8; /* Reserved */
Uchar phys_start[3]; /* Starting Physical sector # */
Uchar res12; /* Reserved */
Uchar phys_end[3]; /* End physical data sector # */
Uchar res16; /* Reserved */
Uchar end_layer0[3]; /* End sector # in layer */
Ucbit res20 : 7; /* Reserved */
Ucbit bca : 1; /* BCA flag bit */
};
#else /* Motorola bitorder */
struct dvd_structure_00 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Ucbit book_type : 4; /* DVD Book type */
Ucbit book_version : 4; /* DVD Book version */
Ucbit disc_size : 4; /* Disc size (coded) */
Ucbit minimum_rate : 4; /* Minimum data rate (coded) */
Ucbit res2_7 : 1; /* Reserved */
Ucbit numlayers : 2; /* Number of Layers (0 == 1) */
Ucbit track_path : 1; /* 0 = parallel, 1 = opposit dir*/
Ucbit layer_type : 4; /* Layer type */
Ucbit linear_density : 4; /* Linear data density (coded) */
Ucbit track_density : 4; /* Track density (coded) */
Uchar res8; /* Reserved */
Uchar phys_start[3]; /* Starting Physical sector # */
Uchar res12; /* Reserved */
Uchar phys_end[3]; /* End physical data sector # */
Uchar res16; /* Reserved */
Uchar end_layer0[3]; /* End sector # in layer */
Ucbit bca : 1; /* BCA flag bit */
Ucbit res20 : 7; /* Reserved */
};
#endif
struct dvd_structure_01 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar copyr_prot_type; /* Copyright prot system type */
Uchar region_mgt_info; /* Region management info */
Uchar res67[2]; /* Reserved */
};
struct dvd_structure_02 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar key_data[2048]; /* Disc Key data */
};
struct dvd_structure_03 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar bca_info[1]; /* BCA information (12-188 bytes)*/
};
struct dvd_structure_04 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar man_info[2048]; /* Disc manufacturing info */
};
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
struct dvd_structure_05 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Ucbit res4_03 : 4; /* Reserved */
Ucbit cgms : 2; /* CGMS (see below) */
Ucbit res4_6 : 1; /* Reserved */
Ucbit cpm : 1; /* This is copyrighted material */
Uchar res57[3]; /* Reserved */
};
#else /* Motorola bitorder */
struct dvd_structure_05 {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Ucbit cpm : 1; /* This is copyrighted material */
Ucbit res4_6 : 1; /* Reserved */
Ucbit cgms : 2; /* CGMS (see below) */
Ucbit res4_03 : 4; /* Reserved */
Uchar res57[3]; /* Reserved */
};
#endif
#define CGMS_PERMITTED 0 /* Unlimited copy permitted */
#define CGMS_RES 1 /* Reserved */
#define CGMS_ONE_COPY 2 /* One copy permitted */
#define CGMS_NO_COPY 3 /* No copy permitted */
struct dvd_structure_0D {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar last_rma_sector[2]; /* Last recorded RMA sector # */
Uchar rmd_bytes[1]; /* Content of Record man area */
};
struct dvd_structure_0E {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar field_id; /* Field ID (1) */
Uchar application_code; /* Disc Application code */
Uchar phys_data; /* Disc Phisical Data */
Uchar last_recordable_addr[3]; /* Last addr of recordable area */
Uchar res_a[2]; /* Reserved */
Uchar field_id_2; /* Field ID (2) */
Uchar ind_wr_power; /* Recommended writing power */
Uchar ind_wavelength; /* Wavelength for ind_wr_power */
Uchar opt_wr_strategy[4]; /* Optimum write Strategy */
Uchar res_b[1]; /* Reserved */
Uchar field_id_3; /* Field ID (3) */
Uchar man_id[6]; /* Manufacturer ID */
Uchar res_m1; /* Reserved */
Uchar field_id_4; /* Field ID (4) */
Uchar man_id2[6]; /* Manufacturer ID */
Uchar res_m2; /* Reserved */
};
struct dvd_structure_0F {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar res45[2]; /* Reserved */
Uchar random[2]; /* Random number */
Uchar year[4]; /* Year (ascii) */
Uchar month[2]; /* Month (ascii) */
Uchar day[2]; /* Day (ascii) */
Uchar hour[2]; /* Hour (ascii) */
Uchar minute[2]; /* Minute (ascii) */
Uchar second[2]; /* Second (ascii) */
};
struct dvd_structure_0F_w {
Uchar data_len[2]; /* Data len without this info */
Uchar res23[2]; /* Reserved */
Uchar res45[2]; /* Reserved */
Uchar year[4]; /* Year (ascii) */
Uchar month[2]; /* Month (ascii) */
Uchar day[2]; /* Day (ascii) */
Uchar hour[2]; /* Hour (ascii) */
Uchar minute[2]; /* Minute (ascii) */
Uchar second[2]; /* Second (ascii) */
};
struct mmc_cue {
Uchar cs_ctladr; /* CTL/ADR for this track */
Uchar cs_tno; /* This track number */
Uchar cs_index; /* Index within this track */
Uchar cs_dataform; /* Data form */
Uchar cs_scms; /* Serial copy management */
Uchar cs_min; /* Absolute time minutes */
Uchar cs_sec; /* Absolute time seconds */
Uchar cs_frame; /* Absolute time frames */
};
struct mmc_performance_header {
Uchar p_datalen[4]; /* Performance Data length */
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
Ucbit p_exept :1; /* Nominal vs. Exept. conditions*/
Ucbit p_write :1; /* Write vs. Read performance */
Ucbit p_res_4 :6; /* Reserved bits... */
#else /* Motorola bitorder */
Ucbit p_res_4 :6; /* Reserved bits... */
Ucbit p_write :1; /* Write vs. Read performance */
Ucbit p_exept :1; /* Nominal vs. Exept. conditions*/
#endif
Uchar p_res[3]; /* Reserved bytes */
};
struct mmc_performance { /* Type == 00 (nominal) */
Uchar start_lba[4]; /* Starting LBA */
Uchar start_perf[4]; /* Start Performance */
Uchar end_lba[4]; /* Ending LBA */
Uchar end_perf[4]; /* Ending Performance */
};
struct mmc_exceptions { /* Type == 00 (execptions) */
Uchar lba[4]; /* LBA */
Uchar time[2]; /* Time */
};
struct mmc_write_speed { /* Type == 00 (write speed) */
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
Ucbit p_mrw :1; /* Suitable for mixed read/write*/
Ucbit p_exact :1; /* Speed count for whole media */
Ucbit p_rdd :1; /* Media rotational control */
Ucbit p_wrc :2; /* Write rotational control */
Ucbit p_res :3; /* Reserved bits... */
#else /* Motorola bitorder */
Ucbit p_res :3; /* Reserved bits... */
Ucbit p_wrc :2; /* Write rotational control */
Ucbit p_rdd :1; /* Media rotational control */
Ucbit p_exact :1; /* Speed count for whole media */
Ucbit p_mrw :1; /* Suitable for mixed read/write*/
#endif
Uchar res[3]; /* Reserved Bytes */
Uchar end_lba[4]; /* Ending LBA */
Uchar read_speed[4]; /* Read Speed */
Uchar write_speed[4]; /* Write Speed */
};
#define WRC_DEF_RC 0 /* Media default rotational control */
#define WRC_CAV 1 /* CAV */
struct mmc_streaming { /* Performance for set streaming*/
#if defined(_BIT_FIELDS_LTOH) /* Intel bitorder */
Ucbit p_ra :1; /* Random Acess */
Ucbit p_exact :1; /* Set values exactly */
Ucbit p_rdd :1; /* Restore unit defaults */
Ucbit p_wrc :2; /* Write rotational control */
Ucbit p_res :3; /* Reserved bits... */
#else /* Motorola bitorder */
Ucbit p_res :3; /* Reserved bits... */
Ucbit p_wrc :2; /* Write rotational control */
Ucbit p_rdd :1; /* Restore unit defaults */
Ucbit p_exact :1; /* Set values exactly */
Ucbit p_ra :1; /* Random Acess */
#endif
Uchar res[3]; /* Reserved Bytes */
Uchar start_lba[4]; /* Starting LBA */
Uchar end_lba[4]; /* Ending LBA */
Uchar read_size[4]; /* Read Size */
Uchar read_time[4]; /* Read Time */
Uchar write_size[4]; /* Write Size */
Uchar write_time[4]; /* Write Time */
};
#endif /* _SCSIMMC_H */