File indexing completed on 2024-04-21 04:49:43

0001 /* 
0002 
0003     SPDX-FileCopyrightText: 2003-2009 Sebastian Trueg <trueg@k3b.org>
0004     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 
0010 #ifndef _K3B_MMC_H_
0011 #define _K3B_MMC_H_
0012 
0013 #include <config-k3b.h>
0014 
0015 
0016 namespace K3b {
0017     namespace Device 
0018     {
0019         /* 
0020          * struct disc_info taken from cdrwtool.h
0021          *
0022          *
0023          * disc status (status):
0024          *     00b - empty disc
0025          *     01b - incomplete disc (appendable)
0026          *     10b - Complete disc
0027          *     11b - Others
0028          *
0029          * State of last session (border)
0030          *     00b - Empty session
0031          *     01b - Incomplete session
0032          *     10b - Reserved
0033          *     11b - Complete session (only possible when disc status is complete)
0034          */
0035         typedef struct disc_info {
0036             quint16 length;
0037 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0038             unsigned char reserved1 : 3;
0039             unsigned char erasable  : 1;
0040             unsigned char border    : 2;
0041             unsigned char status    : 2;
0042 #else
0043             unsigned char status    : 2;
0044             unsigned char border    : 2;
0045             unsigned char erasable  : 1;
0046             unsigned char reserved1 : 3;
0047 #endif
0048             unsigned char n_first_track;
0049             unsigned char n_sessions_l;
0050             unsigned char first_track_l;
0051             unsigned char last_track_l;
0052 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0053             unsigned char did_v     : 1;
0054             unsigned char dbc_v     : 1;
0055             unsigned char uru       : 1;
0056             unsigned char reserved2 : 2;
0057             unsigned char dbit      : 1;
0058             unsigned char bg_f_status : 1;
0059 #else
0060             unsigned char bg_f_status : 1;
0061             unsigned char dbit      : 1;
0062             unsigned char reserved2 : 2;
0063             unsigned char uru       : 1;
0064             unsigned char dbc_v     : 1;
0065             unsigned char did_v     : 1;
0066 #endif
0067 
0068             /*
0069              * disc type
0070              *    00h - CD-DA of CDROM
0071              *    10h - CD-I
0072              *    20h - CD-ROM XA
0073              *    FFh - Undefined
0074              *    All other values are reserved
0075              */
0076             unsigned char disc_type;
0077             unsigned char n_sessions_m;
0078             unsigned char first_track_m;
0079             unsigned char last_track_m;
0080             quint32 disc_id;
0081 
0082             /*
0083              * Last session lead-in start time
0084              * if the disc is complete this shall be FF/FF/FF
0085              */
0086             unsigned char lead_in_r;
0087             unsigned char lead_in_m;
0088             unsigned char lead_in_s;
0089             unsigned char lead_in_f;
0090 
0091             /*
0092              * Last possible start time for start of lead-in
0093              * if the disc is complete this shall be FF/FF/FF
0094              */
0095             unsigned char lead_out_r;
0096             unsigned char lead_out_m;
0097             unsigned char lead_out_s;
0098             unsigned char lead_out_f;
0099 
0100             unsigned char disc_bar_code[8];
0101 
0102             //
0103             // We need to make sure the structure has a proper size
0104             // I think it needs to be a power of 2.
0105             // With ide-scsi there is no problem. But without the
0106             // GPCMD_READ_DISC_INFO command failes if the size is 34
0107             //
0108 
0109 /*     unsigned char reserved3; */
0110 /*     unsigned char opc_entries; */
0111         } disc_info_t;
0112 
0113 
0114 
0115         /* 
0116          * struct track_info taken from cdrwtool.h
0117          */
0118         typedef struct track_info {
0119             unsigned char data_length[2];
0120             unsigned char track_number_l;
0121             unsigned char session_number_l;
0122             unsigned char reserved1;
0123 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0124             unsigned char reserved2       : 2;
0125             unsigned char damage          : 1;
0126             unsigned char copy            : 1;
0127             unsigned char track_mode      : 4;
0128             unsigned char rt              : 1;
0129             unsigned char blank           : 1;
0130             unsigned char packet          : 1;
0131             unsigned char fp              : 1;
0132             unsigned char data_mode       : 4;
0133             unsigned char reserved3       : 6;
0134             unsigned char lra_v           : 1;
0135             unsigned char nwa_v           : 1;
0136 #else
0137             unsigned char track_mode      : 4;
0138             unsigned char copy            : 1;
0139             unsigned char damage          : 1;
0140             unsigned char reserved2       : 2;
0141             unsigned char data_mode       : 4;
0142             unsigned char fp              : 1;
0143             unsigned char packet          : 1;
0144             unsigned char blank           : 1;
0145             unsigned char rt              : 1;
0146             unsigned char nwa_v           : 1;
0147             unsigned char lra_v           : 1;
0148             unsigned char reserved3       : 6;
0149 #endif
0150             unsigned char track_start[4];
0151             unsigned char next_writable[4];
0152             unsigned char free_blocks[4];
0153             unsigned char packet_size[4];
0154             unsigned char track_size[4];
0155             unsigned char last_recorded[4];
0156             unsigned char track_number_m;
0157             unsigned char session_number_m;
0158             unsigned char reserved4;
0159             unsigned char reserved5;
0160             unsigned char read_compatibility[4];
0161         } track_info_t;
0162 
0163 
0164         /*
0165          * Use this with the GPCMD_READ_TOC_PMA_ATIP command
0166          * where format is set to 2 (Full TOC)
0167          */
0168         struct toc_raw_track_descriptor {
0169             unsigned char session_number;
0170 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0171             unsigned char adr     : 4;
0172             unsigned char control : 4;
0173 #else
0174             unsigned char control : 4;
0175             unsigned char adr     : 4;
0176 #endif
0177             unsigned char tno;
0178             unsigned char point;
0179             unsigned char min;
0180             unsigned char sec;
0181             unsigned char frame;
0182             unsigned char zero;
0183             unsigned char p_min;
0184             unsigned char p_sec;
0185             unsigned char p_frame;
0186         };
0187 
0188 
0189 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0190         struct cd_wr_speed_performance {
0191             unsigned char res0;                   /* Reserved                          */
0192             unsigned char res_1_27        : 6;    /* Reserved                          */
0193             unsigned char rot_ctl_sel     : 2;    /* Rotational control selected       */
0194             unsigned char wr_speed_supp[2];       /* Supported write speed             */
0195         };
0196 #else
0197         struct cd_wr_speed_performance {
0198             unsigned char res0;                   /* Reserved                          */
0199             unsigned char rot_ctl_sel     : 2;    /* Rotational control selected       */
0200             unsigned char res_1_27        : 6;    /* Reserved                          */
0201             unsigned char wr_speed_supp[2];       /* Supported write speed             */
0202         };
0203 #endif
0204 
0205 
0206         /**
0207          * Based on the cdrecord struct cd_mode_page_2A
0208          * MM Capabilities and Mechanical Status Page
0209          */
0210 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0211 
0212         struct mm_cap_page_2A {
0213             unsigned char PS               : 1;
0214             unsigned char res_1            : 1;
0215             unsigned char page_code        : 6;
0216             unsigned char page_len;             /* 0x14 = 20 Bytes (MMC) */
0217             /* 0x18 = 24 Bytes (MMC-2) */
0218             /* 0x1C >= 28 Bytes (MMC-3) */
0219             unsigned char res_2_67         : 2; /* Reserved        */
0220             unsigned char dvd_ram_read     : 1; /* Reads DVD-RAM media       */
0221             unsigned char dvd_r_read       : 1; /* Reads DVD-R media       */
0222             unsigned char dvd_rom_read     : 1; /* Reads DVD ROM media       */
0223             unsigned char method2          : 1; /* Reads fixed packet method2 media  */
0224             unsigned char cd_rw_read       : 1; /* Reads CD-RW media       */
0225             unsigned char cd_r_read        : 1; /* Reads CD-R  media       */
0226             unsigned char res_3_67         : 2; /* Reserved        */
0227             unsigned char dvd_ram_write    : 1; /* Supports writing DVD-RAM media    */
0228             unsigned char dvd_r_write      : 1; /* Supports writing DVD-R media      */
0229             unsigned char res_3_3          : 1; /* Reserved        */
0230             unsigned char test_write       : 1; /* Supports emulation write      */
0231             unsigned char cd_rw_write      : 1; /* Supports writing CD-RW media      */
0232             unsigned char cd_r_write       : 1; /* Supports writing CD-R  media      */
0233             unsigned char BUF              : 1; /* Supports Buffer under. free rec.  */
0234             unsigned char multi_session    : 1; /* Reads multi-session media      */
0235             unsigned char mode_2_form_2    : 1; /* Reads Mode-2 form 2 media      */
0236             unsigned char mode_2_form_1    : 1; /* Reads Mode-2 form 1 media (XA)    */
0237             unsigned char digital_port_1   : 1; /* Supports digital output on port 1 */
0238             unsigned char digital_port_2   : 1; /* Supports digital output on port 2 */
0239             unsigned char composite        : 1; /* Deliveres composite A/V stream    */
0240             unsigned char audio_play       : 1; /* Supports Audio play operation     */
0241             unsigned char read_bar_code    : 1; /* Supports reading bar codes      */
0242             unsigned char UPC              : 1; /* Reads media catalog number (UPC)  */
0243             unsigned char ISRC             : 1; /* Reads ISRC information      */
0244             unsigned char c2_pointers      : 1; /* Supports C2 error pointers      */
0245             unsigned char rw_deint_corr    : 1; /* Reads de-interleved R-W sub chan  */
0246             unsigned char rw_supported     : 1; /* Reads R-W sub channel information */
0247             unsigned char cd_da_accurate   : 1; /* READ CD data stream is accurate   */
0248             unsigned char cd_da_supported  : 1; /* Reads audio data with READ CD cmd */
0249             unsigned char loading_type     : 3; /* Loading mechanism type      */
0250             unsigned char res_6_4          : 1; /* Reserved        */
0251             unsigned char eject            : 1; /* Ejects disc/cartr with STOP LoEj  */
0252             unsigned char prevent_jumper   : 1; /* State of prev/allow jumper 0=pres */
0253             unsigned char lock_state       : 1; /* Lock state 0=unlocked 1=locked    */
0254             unsigned char lock             : 1; /* PREVENT/ALLOW may lock media      */
0255             unsigned char res_7            : 2; /* Reserved        */
0256             unsigned char rw_in_lead_in    : 1; /* Reads raw R-W subcode from lead in */
0257             unsigned char side_change      : 1; /* Side change capable       */
0258             unsigned char sw_slot_sel      : 1; /* Load empty slot in changer      */
0259             unsigned char disk_present_rep : 1; /* Changer supports disk present rep */
0260             unsigned char sep_chan_mute    : 1; /* Mute controls each channel separately */
0261             unsigned char sep_chan_vol     : 1; /* Vol controls each channel separately */
0262             unsigned char max_read_speed[2];    /* Max. read speed in KB/s      */
0263             /* obsolete in MMC-4 */
0264             unsigned char num_vol_levels[2];    /* # of supported volume levels      */
0265             unsigned char buffer_size[2];       /* Buffer size for the data in KB    */
0266             unsigned char cur_read_speed[2];    /* Current read speed in KB/s      */
0267             /* obsolete in MMC-4 */
0268             unsigned char res_16;               /* Reserved        */
0269             unsigned char res_17           : 2; /* Reserved        */
0270             unsigned char length           : 2; /* 0=32BCKs 1=16BCKs 2=24BCKs 3=24I2c*/
0271             unsigned char LSBF             : 1; /* Set: LSB first Clear: MSB first   */
0272             unsigned char RCK              : 1; /* Set: HIGH high LRCK=left channel  */
0273             unsigned char BCK              : 1; /* Data valid on falling edge of BCK */
0274             unsigned char res_17_0         : 1; /* Reserved        */
0275             unsigned char max_write_speed[2];   /* Max. write speed supported in KB/s*/
0276             /* obsolete in MMC-4 */
0277             unsigned char cur_write_speed[2];   /* Current write speed in KB/s      */
0278             /* obsolete in MMC-4 */
0279 
0280             /* Byte 22 ... Only in MMC-2      */
0281             unsigned char copy_man_rev[2];      /* Copy management revision supported*/
0282             unsigned char res_24;               /* Reserved        */
0283             unsigned char res_25;               /* Reserved        */
0284 
0285             /* Byte 26 ... Only in MMC-3      */
0286             unsigned char res_26;               /* Reserved        */
0287             unsigned char res_27_27        : 6; /* Reserved        */
0288             unsigned char rot_ctl_sel      : 2; /* Rotational control selected      */
0289             unsigned char v3_cur_write_speed[2]; /* Current write speed in KB/s      */
0290             unsigned char num_wr_speed_des[2];  /* # of wr speed perf descr. tables  */
0291             struct cd_wr_speed_performance
0292             wr_speed_des[1];                    /* wr speed performance descriptor   */
0293             /* Actually more (num_wr_speed_des)  */
0294         };
0295 
0296 #else  // LITTLE_ENDIAN
0297 
0298         struct mm_cap_page_2A {
0299             unsigned char page_code        : 6;
0300             unsigned char res_1            : 1;
0301             unsigned char PS               : 1;
0302             unsigned char page_len;             /* 0x14 = 20 Bytes (MMC) */
0303             /* 0x18 = 24 Bytes (MMC-2) */
0304             /* 0x1C >= 28 Bytes (MMC-3) */
0305             unsigned char cd_r_read        : 1; /* Reads CD-R  media       */
0306             unsigned char cd_rw_read       : 1; /* Reads CD-RW media       */
0307             unsigned char method2          : 1; /* Reads fixed packet method2 media  */
0308             unsigned char dvd_rom_read     : 1; /* Reads DVD ROM media       */
0309             unsigned char dvd_r_read       : 1; /* Reads DVD-R media       */
0310             unsigned char dvd_ram_read     : 1; /* Reads DVD-RAM media       */
0311             unsigned char res_2_67         : 2; /* Reserved        */
0312             unsigned char cd_r_write       : 1; /* Supports writing CD-R  media      */
0313             unsigned char cd_rw_write      : 1; /* Supports writing CD-RW media      */
0314             unsigned char test_write       : 1; /* Supports emulation write      */
0315             unsigned char res_3_3          : 1; /* Reserved        */
0316             unsigned char dvd_r_write      : 1; /* Supports writing DVD-R media      */
0317             unsigned char dvd_ram_write    : 1; /* Supports writing DVD-RAM media    */
0318             unsigned char res_3_67         : 2; /* Reserved        */
0319             unsigned char audio_play       : 1; /* Supports Audio play operation     */
0320             unsigned char composite        : 1; /* Deliveres composite A/V stream    */
0321             unsigned char digital_port_2   : 1; /* Supports digital output on port 2 */
0322             unsigned char digital_port_1   : 1; /* Supports digital output on port 1 */
0323             unsigned char mode_2_form_1    : 1; /* Reads Mode-2 form 1 media (XA)    */
0324             unsigned char mode_2_form_2    : 1; /* Reads Mode-2 form 2 media      */
0325             unsigned char multi_session    : 1; /* Reads multi-session media      */
0326             unsigned char BUF              : 1; /* Supports Buffer under. free rec.  */
0327             unsigned char cd_da_supported  : 1; /* Reads audio data with READ CD cmd */
0328             unsigned char cd_da_accurate   : 1; /* READ CD data stream is accurate   */
0329             unsigned char rw_supported     : 1; /* Reads R-W sub channel information */
0330             unsigned char rw_deint_corr    : 1; /* Reads de-interleved R-W sub chan  */
0331             unsigned char c2_pointers      : 1; /* Supports C2 error pointers      */
0332             unsigned char ISRC             : 1; /* Reads ISRC information      */
0333             unsigned char UPC              : 1; /* Reads media catalog number (UPC)  */
0334             unsigned char read_bar_code    : 1; /* Supports reading bar codes      */
0335             unsigned char lock             : 1; /* PREVENT/ALLOW may lock media      */
0336             unsigned char lock_state       : 1; /* Lock state 0=unlocked 1=locked    */
0337             unsigned char prevent_jumper   : 1; /* State of prev/allow jumper 0=pres */
0338             unsigned char eject            : 1; /* Ejects disc/cartr with STOP LoEj  */
0339             unsigned char res_6_4          : 1; /* Reserved        */
0340             unsigned char loading_type     : 3; /* Loading mechanism type      */
0341             unsigned char sep_chan_vol     : 1; /* Vol controls each channel separately */
0342             unsigned char sep_chan_mute    : 1; /* Mute controls each channel separately */
0343             unsigned char disk_present_rep : 1; /* Changer supports disk present rep */
0344             unsigned char sw_slot_sel      : 1; /* Load empty slot in changer      */
0345             unsigned char side_change      : 1; /* Side change capable       */
0346             unsigned char rw_in_lead_in    : 1; /* Reads raw R-W subcode from lead in */
0347             unsigned char res_7            : 2; /* Reserved        */
0348             unsigned char max_read_speed[2];    /* Max. read speed in KB/s      */
0349             /* obsolete in MMC-4 */
0350             unsigned char num_vol_levels[2];    /* # of supported volume levels      */
0351             unsigned char buffer_size[2];       /* Buffer size for the data in KB    */
0352             unsigned char cur_read_speed[2];    /* Current read speed in KB/s      */
0353             /* obsolete in MMC-4 */
0354             unsigned char res_16;               /* Reserved        */
0355             unsigned char res_17_0         : 1; /* Reserved        */
0356             unsigned char BCK              : 1; /* Data valid on falling edge of BCK */
0357             unsigned char RCK              : 1; /* Set: HIGH high LRCK=left channel  */
0358             unsigned char LSBF             : 1; /* Set: LSB first Clear: MSB first   */
0359             unsigned char length           : 2; /* 0=32BCKs 1=16BCKs 2=24BCKs 3=24I2c*/
0360             unsigned char res_17           : 2; /* Reserved        */
0361             unsigned char max_write_speed[2];   /* Max. write speed supported in KB/s*/
0362             /* obsolete in MMC-4 */
0363             unsigned char cur_write_speed[2];   /* Current write speed in KB/s      */
0364             /* obsolete in MMC-4 */
0365 
0366             /* Byte 22 ... Only in MMC-2      */
0367             unsigned char copy_man_rev[2];      /* Copy management revision supported*/
0368             unsigned char res_24;               /* Reserved        */
0369             unsigned char res_25;               /* Reserved        */
0370 
0371             /* Byte 26 ... Only in MMC-3      */
0372             unsigned char res_26;               /* Reserved        */
0373             unsigned char rot_ctl_sel      : 2; /* Rotational control selected      */
0374             unsigned char res_27_27        : 6; /* Reserved        */
0375             unsigned char v3_cur_write_speed[2]; /* Current write speed in KB/s      */
0376             unsigned char num_wr_speed_des[2];  /* # of wr speed perf descr. tables  */
0377             struct cd_wr_speed_performance
0378             wr_speed_des[1];                    /* wr speed performance descriptor   */
0379             /* Actually more (num_wr_speed_des)  */
0380         };
0381 #endif
0382 
0383         /**
0384          * Based on the cdrecord struct cd_mode_page_05
0385          * Write Parameters Mode Page
0386          */
0387 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0388         struct wr_param_page_05 {                /* write parameters */
0389             unsigned char PS               : 1;
0390             unsigned char res_1            : 1;
0391             unsigned char page_code        : 6;
0392             unsigned char page_len;                /* 0x32 = 50 Bytes */
0393             unsigned char res_2_7          : 1;
0394             unsigned char BUFE             : 1;    /* Enable Bufunderrun free rec.      */
0395             unsigned char LS_V             : 1;    /* Link size valid                   */
0396             unsigned char test_write       : 1;    /* Do not actually write data        */
0397             unsigned char write_type       : 4;    /* Session write type (PACKET/TAO...)*/
0398             unsigned char multi_session    : 2;    /* Multi session write type          */
0399             unsigned char fp               : 1;    /* Fixed packed (if in packet mode)  */
0400             unsigned char copy             : 1;    /* 1st higher gen of copy prot track */
0401             unsigned char track_mode       : 4;    /* Track mode (Q-sub control nibble) */
0402             unsigned char res_4            : 4;    /* Reserved                          */
0403             unsigned char dbtype           : 4;    /* Data block type                   */
0404             unsigned char link_size;               /* Link Size (default is 7)          */
0405             unsigned char res_6;                   /* Reserved                          */
0406             unsigned char res_7            : 2;    /* Reserved                          */
0407             unsigned char host_appl_code   : 6;    /* Host application code of disk     */
0408             unsigned char session_format;          /* Session format (DA/CDI/XA)        */
0409             unsigned char res_9;                   /* Reserved                          */
0410             unsigned char packet_size[4];          /* # of user datablocks/fixed packet */
0411             unsigned char audio_pause_len[2];      /* # of blocks where index is zero   */
0412             unsigned char media_cat_number[16];    /* Media catalog Number (MCN)        */
0413             unsigned char ISRC[14];                /* ISRC for this track               */
0414             unsigned char sub_header[4];
0415             unsigned char vendor_uniq[4];
0416         };
0417 
0418 #else // __LITTLE_ENDIAN
0419         struct wr_param_page_05 {       /* write parameters */
0420             unsigned char page_code        : 6;
0421             unsigned char res_1            : 1;
0422             unsigned char PS               : 1;
0423             unsigned char p_len;        /* 0x32 = 50 Bytes */
0424             unsigned char write_type       : 4; /* Session write type (PACKET/TAO...)*/
0425             unsigned char test_write       : 1; /* Do not actually write data        */
0426             unsigned char LS_V         : 1; /* Link size valid           */
0427             unsigned char BUFE         : 1; /* Enable Bufunderrun free rec.      */
0428             unsigned char res_2_7      : 1;
0429             unsigned char track_mode       : 4; /* Track mode (Q-sub control nibble) */
0430             unsigned char copy         : 1; /* 1st higher gen of copy prot track ~*/
0431             unsigned char fp           : 1; /* Fixed packed (if in packet mode)  */
0432             unsigned char multi_session    : 2; /* Multi session write type      */
0433             unsigned char dbtype       : 4; /* Data block type           */
0434             unsigned char res_4        : 4; /* Reserved              */
0435             unsigned char link_size;        /* Link Size (default is 7)      */
0436             unsigned char res_6;            /* Reserved              */
0437             unsigned char host_appl_code   : 6; /* Host application code of disk     */
0438             unsigned char res_7        : 2; /* Reserved              */
0439             unsigned char session_format;   /* Session format (DA/CDI/XA)        */
0440             unsigned char res_9;        /* Reserved              */
0441             unsigned char packet_size[4];   /* # of user datablocks/fixed packet */
0442             unsigned char audio_pause_len[2];   /* # of blocks where index is zero   */
0443             unsigned char media_cat_number[16]; /* Media catalog Number (MCN)        */
0444             unsigned char ISRC[14];     /* ISRC for this track           */
0445             unsigned char sub_header[4];
0446             unsigned char vendor_uniq[4];
0447         };
0448 #endif
0449 
0450 
0451         struct toc_track_descriptor {
0452             unsigned char res1;
0453 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0454             unsigned char adr     : 4;
0455             unsigned char control : 4;
0456 #else
0457             unsigned char control : 4;
0458             unsigned char adr     : 4;
0459 #endif
0460             unsigned char track_no;
0461             unsigned char res2;
0462             unsigned char start_adr[4];
0463         };
0464 
0465 
0466         struct atip_descriptor {
0467             unsigned char dataLength[2];
0468             unsigned char res1;
0469             unsigned char res2;
0470 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0471             unsigned char ind_wr_power : 4;  // indicated writing power
0472             unsigned char ddcd         : 1;  // DDCD
0473             unsigned char ref_speed    : 3;  // reference Speed
0474             unsigned char zero         : 1;  // 0
0475             unsigned char uru          : 1;  // Uru
0476             unsigned char res3         : 6;
0477             unsigned char one          : 1;  // 1
0478             unsigned char disc_type    : 1;  // Disc Type
0479             unsigned char disc_subtype : 3;  // Disc Sub-Type
0480             unsigned char a1_valid     : 1;
0481             unsigned char a2_valid     : 1;
0482             unsigned char a3_valid     : 1;
0483 #else
0484             unsigned char ref_speed    : 3;  // reference Speed
0485             unsigned char ddcd         : 1;  // DDCD
0486             unsigned char ind_wr_power : 4;  // indicated writing power
0487             unsigned char res3         : 6;
0488             unsigned char uru          : 1;  // Uru
0489             unsigned char zero         : 1;  // 0
0490             unsigned char a3_valid     : 1;
0491             unsigned char a2_valid     : 1;
0492             unsigned char a1_valid     : 1;
0493             unsigned char disc_subtype : 3;  // Disc Sub-Type
0494             unsigned char disc_type    : 1;  // Disc Type
0495             unsigned char one          : 1;  // 1
0496 #endif
0497             unsigned char res4;
0498             unsigned char lead_in_m;
0499             unsigned char lead_in_s;
0500             unsigned char lead_in_f;
0501             unsigned char res5;
0502             unsigned char lead_out_m;
0503             unsigned char lead_out_s;
0504             unsigned char lead_out_f;
0505             unsigned char res6;
0506             unsigned char a1[3];
0507             unsigned char res7;
0508             unsigned char a2[3];
0509             unsigned char res8;
0510             unsigned char a3[3];
0511             unsigned char res9;
0512             unsigned char s4[3];
0513             unsigned char res10;
0514         };
0515 
0516 
0517         struct mechanism_status_header {
0518 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0519             unsigned char fault         : 1;
0520             unsigned char changer_state : 2;
0521             unsigned char slot_low      : 5;
0522 #else
0523             unsigned char slot_low      : 5;
0524             unsigned char changer_state : 2;
0525             unsigned char fault         : 1;
0526 #endif
0527 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0528             unsigned char mech_state    : 3;
0529             unsigned char door_open     : 1;
0530             unsigned char res1          : 1;
0531             unsigned char slot_high     : 3;
0532 #else
0533             unsigned char slot_high     : 3;
0534             unsigned char res1          : 1;
0535             unsigned char door_open     : 1;
0536             unsigned char mech_state    : 3;
0537 #endif
0538             unsigned char current_lba[3];
0539             unsigned char num_slots;
0540             unsigned char slot_len[2];
0541         };
0542 
0543         struct mechanism_status_slot {
0544 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0545             unsigned char disc_present  : 1;
0546             unsigned char res1          : 6;
0547             unsigned char change        : 1;
0548 #else
0549             unsigned char change        : 1;
0550             unsigned char res1          : 6;
0551             unsigned char disc_present  : 1;
0552 #endif
0553 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0554             unsigned char res2          : 6;
0555             unsigned char cwp_v         : 1;
0556             unsigned char cwp           : 1;
0557 #else
0558             unsigned char cwp           : 1;
0559             unsigned char cwp_v         : 1;
0560             unsigned char res2          : 6;
0561 #endif
0562             unsigned char res3;
0563             unsigned char res4;
0564         };
0565 
0566 
0567         struct inquiry {
0568 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0569             unsigned char p_qualifier   : 3;
0570             unsigned char p_device_type : 5;
0571             unsigned char rmb           : 1;
0572             unsigned char reserved1     : 7;
0573 #else
0574             unsigned char p_device_type : 5;
0575             unsigned char p_qualifier   : 3;
0576             unsigned char reserved1     : 7;
0577             unsigned char rmb           : 1;
0578 #endif
0579             unsigned char version;
0580 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0581             unsigned char interface_dep : 4;
0582             unsigned char data_format   : 4;
0583 #else
0584             unsigned char data_format   : 4;
0585             unsigned char interface_dep : 4;
0586 #endif
0587             unsigned char add_length;
0588             unsigned char reserved2;
0589 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0590             unsigned char bque          : 1;
0591             unsigned char enc_serv      : 1;
0592             unsigned char vs1           : 1;
0593             unsigned char multi_p       : 1;
0594             unsigned char m_chngr       : 1;
0595             unsigned char reserved3     : 1;
0596             unsigned char reserved4     : 1;
0597             unsigned char addr_16       : 1;
0598             unsigned char rel_adr       : 1;
0599             unsigned char reserved5     : 1;
0600             unsigned char w_bus_16      : 1;
0601             unsigned char sync          : 1;
0602             unsigned char linked        : 1;
0603             unsigned char reserved6     : 1;
0604             unsigned char cmd_que       : 1;
0605             unsigned char vs2           : 1;
0606 #else
0607             unsigned char addr_16       : 1;
0608             unsigned char reserved4     : 1;
0609             unsigned char reserved3     : 1;
0610             unsigned char m_chngr       : 1;
0611             unsigned char multi_p       : 1;
0612             unsigned char vs1           : 1;
0613             unsigned char enc_serv      : 1;
0614             unsigned char bque          : 1;
0615             unsigned char vs2           : 1;
0616             unsigned char cmd_que       : 1;
0617             unsigned char reserved6     : 1;
0618             unsigned char linked        : 1;
0619             unsigned char sync          : 1;
0620             unsigned char w_bus_16      : 1;
0621             unsigned char reserved5     : 1;
0622             unsigned char rel_adr       : 1;
0623 #endif
0624             unsigned char vendor[8];
0625             unsigned char product[16];
0626             unsigned char revision[4];
0627             unsigned char vendor_specific[20];
0628             unsigned char reserved7[2];
0629             unsigned char version1[2];
0630             unsigned char version2[2];
0631             unsigned char version3[2];
0632             unsigned char version4[2];
0633             unsigned char version5[2];
0634             unsigned char version6[2];
0635             unsigned char version7[2];
0636             unsigned char version8[2];
0637 
0638             // bytes 74-95: reserved
0639             // bytes 96-n: vendor specific
0640         };
0641 
0642 
0643         struct ricoh_mode_page_30 {
0644 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0645             unsigned char PS               : 1;
0646             unsigned char res_1            : 1;
0647             unsigned char page_code        : 6;
0648 #else
0649             unsigned char page_code        : 6;
0650             unsigned char res_1            : 1;
0651             unsigned char PS               : 1;
0652 #endif
0653             unsigned char page_len;                  /* 0xE = 14 Bytes */
0654 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0655             unsigned char res_2_67        :2;
0656             unsigned char AWSCS           :1;     /* Auto write speed control supp. */
0657             unsigned char ARSCS           :1;     /* Auto read speed control supp. */
0658             unsigned char res_2_23        :2;
0659             unsigned char TWBFS           :1;     /* Test Burn-Free sup.  */
0660             unsigned char BUEFS           :1;     /* Burn-Free supported  */
0661 #else
0662             unsigned char BUEFS           :1;     /* Burn-Free supported  */
0663             unsigned char TWBFS           :1;     /* Test Burn-Free sup.  */
0664             unsigned char res_2_23        :2;
0665             unsigned char ARSCS           :1;     /* Auto read speed control supp. */
0666             unsigned char AWSCS           :1;     /* Auto write speed control supp. */
0667             unsigned char res_2_67        :2;
0668 #endif
0669 #ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN
0670             unsigned char res_3_67        :2;
0671             unsigned char AWSCD           :1;     /* Auto write speed control disabled */
0672             unsigned char ARSCE           :1;     /* Auto read speed control enabled */
0673             unsigned char res_2_13        :3;
0674             unsigned char BUEFE           :1;     /* Burn-Free enabled    */
0675 #else
0676             unsigned char BUEFE           :1;     /* Burn-Free enabled    */
0677             unsigned char res_2_13        :3;
0678             unsigned char ARSCE           :1;     /* Auto read speed control enabled */
0679             unsigned char AWSCD           :1;     /* Auto write speed control disabled */
0680             unsigned char res_3_67        :2;
0681 #endif
0682             unsigned char link_counter[2];        /* Burn-Free link counter */
0683             unsigned char res[10];                /* Padding up to 16 bytes */
0684         };
0685     }
0686 }
0687 
0688 #endif