/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the disclaimer below. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \file * \section Purpose * * SCSI definitions. * * \section Usage * * -# After command block received, Access and decode the SCSI command block * with SBCCommand structure. */ #ifndef SBC_H #define SBC_H /** \addtogroup usbd_msd *@{ */ /*------------------------------------------------------------------------------ * Definitions *------------------------------------------------------------------------------*/ /** \addtogroup usbd_sbc_operation_codes SBC Operation Codes * @{ * This page lists operation codes of commands described in the SBC-3 * standard. * * \note That most commands are actually defined in other standards, * like SPC-4. Optional commands are not included here. * * \see sbc3r07.pdf - Section 5.1 - Table 12 * \see spc4r06.pdf * \see SBCCommand * * \section Codes * - SBC_INQUIRY * - SBC_READ_10 * - SBC_READ_CAPACITY_10 * - SBC_REQUEST_SENSE * - SBC_TEST_UNIT_READY * - SBC_WRITE_10 * * \section Optional Codes but required by Windows * - SBC_PREVENT_ALLOW_MEDIUM_REMOVAL * - SBC_MODE_SENSE_6 * - SBC_VERIFY_10 * - SBC_READ_FORMAT_CAPACITIES */ /** Request information regarding parameters of the target and Logical Unit. */ #define SBC_INQUIRY 0x12 /** Request the transfer data to the host. */ #define SBC_READ_10 0x28 /** Request capacities of the currently installed medium. */ #define SBC_READ_CAPACITY_10 0x25 /** Request that the device server transfer sense data. */ #define SBC_REQUEST_SENSE 0x03 /** Check if the LUN is ready */ #define SBC_TEST_UNIT_READY 0x00 /** Request that the device write the data transferred by the host. */ #define SBC_WRITE_10 0x2A /** Request that the target enable or disable the removal of the medium in */ /** the Logical Unit. */ #define SBC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E /** Report parameters. */ #define SBC_MODE_SENSE_6 0x1A /** Request that the %device verify the data on the medium. */ #define SBC_VERIFY_10 0x2F /** Request a list of the possible capacities that can be formatted on medium */ #define SBC_READ_FORMAT_CAPACITIES 0x23 /** @}*/ /** \addtogroup usbd_sbc_periph_quali SBC Periph. Qualifiers * @{ * This page lists the peripheral qualifier values specified in the INQUIRY * data * \see spc4r06.pdf - Section 6.4.2 - Table 83 * \see SBCInquiryData * * \section Qualifiers * - SBC_PERIPHERAL_DEVICE_CONNECTED * - SBC_PERIPHERAL_DEVICE_NOT_CONNECTED * - SBC_PERIPHERAL_DEVICE_NOT_SUPPORTED */ #define SBC_PERIPHERAL_DEVICE_CONNECTED 0x00 #define SBC_PERIPHERAL_DEVICE_NOT_CONNECTED 0x01 #define SBC_PERIPHERAL_DEVICE_NOT_SUPPORTED 0x03 /** @}*/ /** \addtogroup usbd_sbc_periph_types SBC Periph. Types * @{ * This page lists peripheral device types specified in the INQUIRY data * \see spc4r06.pdf - Section 6.4.2 - Table 84 * \see SBCInquiryData * * \section Types * - SBC_DIRECT_ACCESS_BLOCK_DEVICE * - SBC_SEQUENTIAL_ACCESS_DEVICE * - SBC_PRINTER_DEVICE * - SBC_PROCESSOR_DEVICE * - SBC_WRITE_ONCE_DEVICE * - SBC_CD_DVD_DEVICE * - SBC_SCANNER_DEVICE * - SBC_OPTICAL_MEMORY_DEVICE * - SBC_MEDIA_CHANGER_DEVICE * - SBC_COMMUNICATION_DEVICE * - SBC_STORAGE_ARRAY_CONTROLLER_DEVICE * - SBC_ENCLOSURE_SERVICES_DEVICE * - SBC_SIMPLIFIED_DIRECT_ACCESS_DEVICE * - SBC_OPTICAL_CARD_READER_WRITER_DEVICE * - SBC_BRIDGE_CONTROLLER_COMMANDS * - SBC_OBJECT_BASED_STORAGE_DEVICE */ #define SBC_DIRECT_ACCESS_BLOCK_DEVICE 0x00 #define SBC_SEQUENTIAL_ACCESS_DEVICE 0x01 #define SBC_PRINTER_DEVICE 0x02 #define SBC_PROCESSOR_DEVICE 0x03 #define SBC_WRITE_ONCE_DEVICE 0x04 #define SBC_CD_DVD_DEVICE 0x05 #define SBC_SCANNER_DEVICE 0x06 #define SBC_OPTICAL_MEMORY_DEVICE 0x07 #define SBC_MEDIA_CHANGER_DEVICE 0x08 #define SBC_COMMUNICATION_DEVICE 0x09 #define SBC_STORAGE_ARRAY_CONTROLLER_DEVICE 0x0C #define SBC_ENCLOSURE_SERVICES_DEVICE 0x0D #define SBC_SIMPLIFIED_DIRECT_ACCESS_DEVICE 0x0E #define SBC_OPTICAL_CARD_READER_WRITER_DEVICE 0x0F #define SBC_BRIDGE_CONTROLLER_COMMANDS 0x10 #define SBC_OBJECT_BASED_STORAGE_DEVICE 0x11 /** @}*/ /*------------------------------------------------------------------------------ */ /** \brief Version value for the SBC-3 specification */ /** \see spc4r06.pdf - Section 6.4.2 - Table 85 */ #define SBC_SPC_VERSION_4 0x06 /*------------------------------------------------------------------------------ */ /*------------------------------------------------------------------------------ */ /** \brief Values for the TPGS field returned in INQUIRY data */ /** \see spc4r06.pdf - Section 6.4.2 - Table 86 */ #define SBC_TPGS_NONE 0x0 #define SBC_TPGS_ASYMMETRIC 0x1 #define SBC_TPGS_SYMMETRIC 0x2 #define SBC_TPGS_BOTH 0x3 /*------------------------------------------------------------------------------ */ /*------------------------------------------------------------------------------ */ /** \brief Version descriptor value for the SBC-3 specification */ /** \see spc4r06.pdf - Section 6.4.2 - Table 87 */ #define SBC_VERSION_DESCRIPTOR_SBC_3 0x04C0 /*------------------------------------------------------------------------------ */ /** \addtogroup usbd_sbc_secse_codes SBC Sense Response Codes * @{ * This page lists sense data response codes returned in REQUEST SENSE data * \see spc4r06.pdf - Section 4.5.1 - Table 12 * * \section Codes * - SBC_SENSE_DATA_FIXED_CURRENT * - SBC_SENSE_DATA_FIXED_DEFERRED * - SBC_SENSE_DATA_DESCRIPTOR_CURRENT * - SBC_SENSE_DATA_DESCRIPTOR_DEFERRED */ #define SBC_SENSE_DATA_FIXED_CURRENT 0x70 #define SBC_SENSE_DATA_FIXED_DEFERRED 0x71 #define SBC_SENSE_DATA_DESCRIPTOR_CURRENT 0x72 #define SBC_SENSE_DATA_DESCRIPTOR_DEFERRED 0x73 /** @}*/ /** \addtogroup usbd_sbc_sense_keys SBC Sense Keys * @{ * This page lists sense key values returned in the REQUEST SENSE data * \see spc4r06.pdf - Section 4.5.6 - Table 27 * * \section Keys * - SBC_SENSE_KEY_NO_SENSE * - SBC_SENSE_KEY_RECOVERED_ERROR * - SBC_SENSE_KEY_NOT_READY * - SBC_SENSE_KEY_MEDIUM_ERROR * - SBC_SENSE_KEY_HARDWARE_ERROR * - SBC_SENSE_KEY_ILLEGAL_REQUEST * - SBC_SENSE_KEY_UNIT_ATTENTION * - SBC_SENSE_KEY_DATA_PROTECT * - SBC_SENSE_KEY_BLANK_CHECK * - SBC_SENSE_KEY_VENDOR_SPECIFIC * - SBC_SENSE_KEY_COPY_ABORTED * - SBC_SENSE_KEY_ABORTED_COMMAND * - SBC_SENSE_KEY_VOLUME_OVERFLOW * - SBC_SENSE_KEY_MISCOMPARE */ /** No specific sense key. Successful command. */ #define SBC_SENSE_KEY_NO_SENSE 0x00 /** Command completed succesfully with some recovery action by the %device. */ #define SBC_SENSE_KEY_RECOVERED_ERROR 0x01 /** The device can not be accessed. */ #define SBC_SENSE_KEY_NOT_READY 0x02 /** Command terminated with a error condition that was probably caused by a */ /** flaw in the medium or an error in the recorded data. */ #define SBC_SENSE_KEY_MEDIUM_ERROR 0x03 /** Hardware failure while performing the command or during a self test. */ #define SBC_SENSE_KEY_HARDWARE_ERROR 0x04 /** Illegal parameter found in the command or additional parameters. */ #define SBC_SENSE_KEY_ILLEGAL_REQUEST 0x05 /** Removable medium may have been changed or the %device has been reset. */ #define SBC_SENSE_KEY_UNIT_ATTENTION 0x06 /** Write on a block that is protected. */ #define SBC_SENSE_KEY_DATA_PROTECT 0x07 /** Indicates that a write-once device or a sequential-access device */ /** encountered blank medium or format-defined end-of-data indication while */ /** reading or a write-once device encountered a non-blank medium while writing. */ #define SBC_SENSE_KEY_BLANK_CHECK 0x08 /** Reporting vendor specific conditions. */ #define SBC_SENSE_KEY_VENDOR_SPECIFIC 0x09 /** EXTENDED COPY command was aborted. */ #define SBC_SENSE_KEY_COPY_ABORTED 0x0A /** Device aborted the command. */ #define SBC_SENSE_KEY_ABORTED_COMMAND 0x0B /** A buffered peripheral device is overflow. */ #define SBC_SENSE_KEY_VOLUME_OVERFLOW 0x0D /** The source data did not match the data read from the medium. */ #define SBC_SENSE_KEY_MISCOMPARE 0x0E /** @}*/ /** \addtogroup usbd_sbc_sense_additionals SBC Sense Additionals * @{ * This page lists additional sense code values returned in REQUEST SENSE data * \see spc4r06.pdf - Section 4.5.6 - Table 28 * * \section Additional Codes * - SBC_ASC_LOGICAL_UNIT_NOT_READY * - SBC_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE * - SBC_ASC_INVALID_FIELD_IN_CDB * - SBC_ASC_WRITE_PROTECTED * - SBC_ASC_FORMAT_CORRUPTED * - SBC_ASC_INVALID_COMMAND_OPERATION_CODE * - SBC_ASC_TOO_MUCH_WRITE_DATA * - SBC_ASC_NOT_READY_TO_READY_CHANGE * - SBC_ASC_MEDIUM_NOT_PRESENT */ #define SBC_ASC_LOGICAL_UNIT_NOT_READY 0x04 #define SBC_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21 #define SBC_ASC_INVALID_FIELD_IN_CDB 0x24 #define SBC_ASC_WRITE_PROTECTED 0x27 #define SBC_ASC_FORMAT_CORRUPTED 0x31 #define SBC_ASC_INVALID_COMMAND_OPERATION_CODE 0x20 #define SBC_ASC_TOO_MUCH_WRITE_DATA 0x26 #define SBC_ASC_NOT_READY_TO_READY_CHANGE 0x28 #define SBC_ASC_MEDIUM_NOT_PRESENT 0x3A /** @}*/ /*------------------------------------------------------------------------------ */ /** \brief MEDIUM TYPE field value for direct-access block devices */ /** \see sbc3r06.pdf - Section 6.3.1 */ #define SBC_MEDIUM_TYPE_DIRECT_ACCESS_BLOCK_DEVICE 0x00 /*------------------------------------------------------------------------------ */ /*------------------------------------------------------------------------------ */ /** \brief MRIE field values */ /** \see sbc3r06.pdf - Section 7.4.11 - Table 286 */ #define SBC_MRIE_NO_REPORTING 0x00 #define SBC_MRIE_ASYNCHRONOUS 0x01 #define SBC_MRIE_GENERATE_UNIT_ATTENTION 0x02 #define SBC_MRIE_COND_GENERATE_RECOVERED_ERROR 0x03 #define SBC_MRIE_UNCOND_GENERATE_RECOVERED_ERROR 0x04 #define SBC_MRIE_GENERATE_NO_SENSE 0x05 #define SBC_MRIE_ON_REQUEST 0x06 /*------------------------------------------------------------------------------ */ /*------------------------------------------------------------------------------ */ /** \brief Supported mode pages */ /** \see sbc3r06.pdf - Section 6.3.1 - Table 115 */ #define SBC_PAGE_READ_WRITE_ERROR_RECOVERY 0x01 #define SBC_PAGE_INFORMATIONAL_EXCEPTIONS_CONTROL 0x1C #define SBC_PAGE_RETURN_ALL 0x3F #define SBC_PAGE_VENDOR_SPECIFIC 0x00 /*------------------------------------------------------------------------------ */ /** \addtogroup usbd_msd_endian_macros MSD Endian Macros * @{ * This page lists the macros for endianness conversion. * * \section Macros * - WORDB * - DWORDB * - STORE_DWORDB * - STORE_WORDB */ /** \brief Converts a byte array to a word value using the big endian format */ #define WORDB(bytes) ((unsigned short) ((bytes[0] << 8) | bytes[1])) /** \brief Converts a byte array to a dword value using the big endian format */ #define DWORDB(bytes) ((unsigned int) ((bytes[0] << 24) | (bytes[1] << 16) \ | (bytes[2] << 8) | bytes[3])) /** \brief Stores a dword value in a byte array, in big endian format */ #define STORE_DWORDB(dword, bytes) \ bytes[0] = (unsigned char) (((dword) >> 24) & 0xFF); \ bytes[1] = (unsigned char) (((dword) >> 16) & 0xFF); \ bytes[2] = (unsigned char) (((dword) >> 8) & 0xFF); \ bytes[3] = (unsigned char) ((dword) & 0xFF); /** \brief Stores a word value in a byte array, in big endian format */ #define STORE_WORDB(word, bytes) \ bytes[0] = (unsigned char) (((word) >> 8) & 0xFF); \ bytes[1] = (unsigned char) ((word) & 0xFF); /** @}*/ /*------------------------------------------------------------------------------ * Structures *------------------------------------------------------------------------------*/ #ifdef __ICCARM__ /* IAR */ #pragma pack(1) /* IAR */ #define __attribute__(...) /* IAR */ #endif /* IAR */ /** * \typedef SBCInquiry * \brief Structure for the INQUIRY command * \see spc4r06.pdf - Section 6.4.1 - Table 81 */ typedef struct _SBCInquiry { unsigned char bOperationCode; /*!< 0x12 : SBC_INQUIRY */ unsigned char isEVPD:1, /*!< Type of requested data */ bReserved1:7; /*!< Reserved bits */ unsigned char bPageCode; /*!< Specifies the VPD to return */ unsigned char pAllocationLength[2]; /*!< Size of host buffer */ unsigned char bControl; /*!< 0x00 */ } __attribute__ ((packed)) SBCInquiry; /* GCC */ /** * \typedef SBCInquiryData * \brief Standard INQUIRY data format returned by the device * \see spc4r06.pdf - Section 6.4.2 - Table 82 */ typedef struct _SBCInquiryData { unsigned char bPeripheralDeviceType:5, /*!< Peripheral device type */ bPeripheralQualifier :3; /*!< Peripheral qualifier */ unsigned char bReserved1:7, /*!< Reserved bits */ isRMB :1; /*!< Is media removable ? */ unsigned char bVersion; /*!< SPC version used */ unsigned char bResponseDataFormat:4, /*!< Must be 0x2 */ isHIGHSUP :1, /*!< Hierarchical addressing used ? */ isNORMACA :1, /*!< ACA attribute supported ? */ bObsolete1 :2; /*!< Obsolete bits */ unsigned char bAdditionalLength; /*!< Length of remaining INQUIRY data */ unsigned char isSCCS :1, /*!< Embedded SCC ? */ isACC :1, /*!< Access control coordinator ? */ bTPGS :2, /*!< Target port support group */ is3PC :1, /*!< Third-party copy supported ? */ bReserved2:2, /*!< Reserved bits */ isProtect :1; /*!< Protection info supported ? */ unsigned char bObsolete2:1, /*!< Obsolete bit */ isEncServ :1, /*!< Embedded enclosure service comp? */ isVS :1, /*!< ??? */ isMultiP :1, /*!< Multi-port device ? */ bObsolete3:3, /*!< Obsolete bits */ bUnused1 :1; /*!< Unused feature */ unsigned char bUnused2:6, /*!< Unused features */ isCmdQue:1, /*!< Task management model supported ? */ isVS2 :1; /*!< ??? */ unsigned char pVendorID[8]; /*!< T10 vendor identification */ unsigned char pProductID[16]; /*!< Vendor-defined product ID */ unsigned char pProductRevisionLevel[4];/*!< Vendor-defined product revision */ unsigned char pVendorSpecific[20]; /*!< Vendor-specific data */ unsigned char bUnused3; /*!< Unused features */ unsigned char bReserved3; /*!< Reserved bits */ unsigned short pVersionDescriptors[8]; /*!< Standards the device complies to */ unsigned char pReserved4[22]; /*!< Reserved bytes */ } __attribute__ ((packed)) SBCInquiryData; /* GCC */ /** * \typedef SBCRead10 * \brief Data structure for the READ (10) command * \see sbc3r07.pdf - Section 5.7 - Table 34 */ typedef struct _SBCRead10 { unsigned char bOperationCode; /*!< 0x28 : SBC_READ_10 */ unsigned char bObsolete1:1, /*!< Obsolete bit */ isFUA_NV:1, /*!< Cache control bit */ bReserved1:1, /*!< Reserved bit */ isFUA:1, /*!< Cache control bit */ isDPO:1, /*!< Cache control bit */ bRdProtect:3; /*!< Protection information to send */ unsigned char pLogicalBlockAddress[4]; /*!< Index of first block to read */ unsigned char bGroupNumber:5, /*!< Information grouping */ bReserved2:3; /*!< Reserved bits */ unsigned char pTransferLength[2]; /*!< Number of blocks to transmit */ unsigned char bControl; /*!< 0x00 */ } __attribute__ ((packed)) SBCRead10; /* GCC */ /** * \typedef SBCReadCapacity10 * \brief Structure for the READ CAPACITY (10) command * \see sbc3r07.pdf - Section 5.11.1 - Table 40 */ typedef struct _SBCReadCapacity10 { unsigned char bOperationCode; /*!< 0x25 : RBC_READ_CAPACITY */ unsigned char bObsolete1:1, /*!< Obsolete bit */ bReserved1:7; /*!< Reserved bits */ unsigned char pLogicalBlockAddress[4]; /*!< Block to evaluate if PMI is set */ unsigned char pReserved2[2]; /*!< Reserved bytes */ unsigned char isPMI:1, /*!< Partial medium indicator bit */ bReserved3:7; /*!< Reserved bits */ unsigned char bControl; /*!< 0x00 */ } SBCReadCapacity10; /*------------------------------------------------------------------------------ * \brief Data returned by the device after a READ CAPACITY (10) command * \see sbc3r07.pdf - Section 5.11.2 - Table 41 *------------------------------------------------------------------------------*/ typedef struct { unsigned char pLogicalBlockAddress[4]; /*!< Address of last logical block */ unsigned char pLogicalBlockLength[4]; /*!< Length of each logical block */ } SBCReadCapacity10Data; /*------------------------------------------------------------------------------ * \brief Structure for the REQUEST SENSE command * \see spc4r06.pdf - Section 6.26 - Table 170 *------------------------------------------------------------------------------*/ typedef struct { unsigned char bOperationCode; /*!< 0x03 : SBC_REQUEST_SENSE */ unsigned char isDesc :1, /*!< Type of information expected */ bReserved1:7; /*!< Reserved bits */ unsigned char pReserved2[2]; /*!< Reserved bytes */ unsigned char bAllocationLength; /*!< Size of host buffer */ unsigned char bControl; /*!< 0x00 */ } SBCRequestSense; /*------------------------------------------------------------------------------ * \brief Fixed format sense data returned after a REQUEST SENSE command has * been received with a DESC bit cleared. * \see spc4r06.pdf - Section 4.5.3 - Table 26 *------------------------------------------------------------------------------*/ typedef struct { unsigned char bResponseCode:7, /*!< Sense data format */ isValid :1; /*!< Information field is standard */ unsigned char bObsolete1; /*!< Obsolete byte */ unsigned char bSenseKey :4, /*!< Generic error information */ bReserved1:1, /*!< Reserved bit */ isILI :1, /*!< SSC */ isEOM :1, /*!< SSC */ isFilemark:1; /*!< SSC */ unsigned char pInformation[4]; /*!< Command-specific */ unsigned char bAdditionalSenseLength; /*!< sizeof(SBCRequestSense_data)-8 */ unsigned char pCommandSpecificInformation[4]; /*!< Command-specific */ unsigned char bAdditionalSenseCode; /*!< Additional error information */ unsigned char bAdditionalSenseCodeQualifier; /*!< Further error information */ unsigned char bFieldReplaceableUnitCode; /*!< Specific component code */ unsigned char bSenseKeySpecific:7, /*!< Additional exception info */ isSKSV :1; /*!< Is sense key specific valid? */ unsigned char pSenseKeySpecific[2]; /*!< Additional exception info */ } SBCRequestSenseData; /** * \brief SBCTestUnitReady * Data structure for the TEST UNIT READY command * \see spc4r06.pdf - Section 6.34 - Table 192 */ typedef struct _SBCTestUnitReady { unsigned char bOperationCode; /*!< 0x00 : SBC_TEST_UNIT_READY */ unsigned char pReserved1[4]; /*!< Reserved bits */ unsigned char bControl; /*!< 0x00 */ } __attribute__ ((packed)) SBCTestUnitReady; /* GCC */ /** * \typedef SBCWrite10 * \brief Structure for the WRITE (10) command * \see sbc3r07.pdf - Section 5.26 - Table 70 */ typedef struct _SBCWrite10 { unsigned char bOperationCode; /*!< 0x2A : SBC_WRITE_10 */ unsigned char bObsolete1:1, /*!< Obsolete bit */ isFUA_NV:1, /*!< Cache control bit */ bReserved1:1, /*!< Reserved bit */ isFUA:1, /*!< Cache control bit */ isDPO:1, /*!< Cache control bit */ bWrProtect:3; /*!< Protection information to send */ unsigned char pLogicalBlockAddress[4]; /*!< First block to write */ unsigned char bGroupNumber:5, /*!< Information grouping */ bReserved2:3; /*!< Reserved bits */ unsigned char pTransferLength[2]; /*!< Number of blocks to write */ unsigned char bControl; /*!< 0x00 */ } SBCWrite10; /** * \typedef SBCMediumRemoval * \brief Structure for the PREVENT/ALLOW MEDIUM REMOVAL command * \see sbc3r07.pdf - Section 5.5 - Table 30 */ typedef struct _SBCMediumRemoval { unsigned char bOperationCode; /*!< 0x1E : SBC_PREVENT_ALLOW_MEDIUM_REMOVAL */ unsigned char pReserved1[3]; /*!< Reserved bytes */ unsigned char bPrevent:2, /*!< Accept/prohibit removal */ bReserved2:6; /*!< Reserved bits */ unsigned char bControl; /*!< 0x00 */ } __attribute__ ((packed)) SBCMediumRemoval; /* GCC */ /** * \typedef SBCModeSense6 * \brief Structure for the MODE SENSE (6) command * \see spc4r06 - Section 6.9.1 - Table 98 */ typedef struct _SBCModeSense6 { unsigned char bOperationCode; /*!< 0x1A : SBC_MODE_SENSE_6 */ unsigned char bReserved1:3, /*!< Reserved bits */ isDBD:1, /*!< Disable block descriptors bit */ bReserved2:4; /*!< Reserved bits */ unsigned char bPageCode:6, /*!< Mode page to return */ bPC:2; /*!< Type of parameter values to return */ unsigned char bSubpageCode; /*!< Mode subpage to return */ unsigned char bAllocationLength; /*!< Host buffer allocated size */ unsigned char bControl; /*!< 0x00 */ } __attribute__ ((packed)) SBCModeSense6; /* GCC */ /** * \typedef SBCModeParameterHeader6 * \brief Header for the data returned after a MODE SENSE (6) command * \see spc4r06.pdf - Section 7.4.3 - Table 268 */ typedef struct _SBCModeParameterHeader6 { unsigned char bModeDataLength; /*!< Length of mode data to follow */ unsigned char bMediumType; /*!< Type of medium (SBC_MEDIUM_TYPE_DIRECT_ACCESS_BLOCK_DEVICE) */ unsigned char bReserved1:4, /*!< Reserved bits */ isDPOFUA:1, /*!< DPO/FUA bits supported ? */ bReserved2:2, /*!< Reserved bits */ isWP:1; /*!< Is medium write-protected ? */ unsigned char bBlockDescriptorLength; /*!< Length of all block descriptors */ } __attribute__ ((packed)) SBCModeParameterHeader6; /* GCC */ /** * \typedef SBCInformationalExceptionsControl * \brief Informational exceptions control mode page * \see spc4r06.pdf - Section 7.4.11 - Table 285 */ typedef struct _SBCInformationalExceptionsControl { unsigned char bPageCode:6, /*!< 0x1C : SBC_PAGE_INFORMATIONAL_EXCEPTIONS_CONTROL */ isSPF:1, /*!< Page or subpage data format */ isPS:1; /*!< Parameters saveable ? */ unsigned char bPageLength; /*!< Length of page data (0x0A) */ unsigned char isLogErr:1, /*!< Should informational exceptions be logged ? */ isEBackErr:1, /*!< Enable background error bit */ isTest:1, /*!< Create a device test failure ? */ isDExcpt:1, /*!< Disable exception control bit */ isEWasc:1, /*!< Report warnings ? */ isEBF:1, /*!< Enable background function bit */ bReserved1:1, /*!< Reserved bit */ isPerf:1; /*!< Delay acceptable when treating exceptions ? */ unsigned char bMRIE:4, /*!< Method of reporting informational exceptions */ bReserved2:4; /*!< Reserved bits */ unsigned char pIntervalTimer[4]; /*!< Error reporting period */ unsigned char pReportCount[4]; /*!< Maximum number of time a report can be issued */ } __attribute__ ((packed)) SBCInformationalExceptionsControl; /* GCC */ /** * \typedef SBCReadWriteErrorRecovery * \brief Read/write error recovery mode page * \see sbc3r07.pdf - Section 6.3.5 - Table 122 */ typedef struct _SBCReadWriteErrorRecovery { unsigned char bPageCode:6, /*!< 0x01 : SBC_PAGE_READ_WRITE_ERROR_RECOVERY */ isSPF:1, /*!< Page or subpage data format */ isPS:1; /*!< Parameters saveable ? */ unsigned char bPageLength; /*!< Length of page data (0x0A) */ unsigned char isDCR:1, /*!< Disable correction bit */ isDTE:1, /*!< Data terminate on error bit */ isPER:1, /*!< Post error bit */ isEER:1, /*!< Enable early recovery bit */ isRC:1, /*!< Read continuous bit */ isTB:1, /*!< Transfer block bit */ isARRE:1, /*!< Automatic read reallocation enabled bit */ isAWRE:1; /*!< Automatic write reallocation enabled bit */ unsigned char bReadRetryCount; /*!< Number of retries when reading */ unsigned char pObsolete1[3]; /*!< Obsolete bytes */ unsigned char bReserved1; /*!< Reserved byte */ unsigned char bWriteRetryCount; /*!< Number of retries when writing */ unsigned char bReserved2; /*!< Reserved byte */ unsigned char pRecoveryTimeLimit[2]; /*!< Maximum time duration for error recovery */ } __attribute__ ((packed)) SBCReadWriteErrorRecovery; /* GCC */ /** * \typedef SBCCommand * \brief Generic structure for holding information about SBC commands * \see SBCInquiry * \see SBCRead10 * \see SBCReadCapacity10 * \see SBCRequestSense * \see SBCTestUnitReady * \see SBCWrite10 * \see SBCMediumRemoval * \see SBCModeSense6 */ typedef union _SBCCommand { unsigned char bOperationCode; /*!< Operation code of the command */ SBCInquiry inquiry; /*!< INQUIRY command */ SBCRead10 read10; /*!< READ (10) command */ SBCReadCapacity10 readCapacity10; /*!< READ CAPACITY (10) command */ SBCRequestSense requestSense; /*!< REQUEST SENSE command */ SBCTestUnitReady testUnitReady; /*!< TEST UNIT READY command */ SBCWrite10 write10; /*!< WRITE (10) command */ SBCMediumRemoval mediumRemoval; /*!< PREVENT/ALLOW MEDIUM REMOVAL command */ SBCModeSense6 modeSense6; /*!< MODE SENSE (6) command */ } SBCCommand; #ifdef __ICCARM__ /* IAR */ #pragma pack() /* IAR */ #endif /* IAR */ /**@}*/ #endif /*#ifndef SBC_H */