summaryrefslogtreecommitdiff
path: root/usb/device/massstorage/SBC.h
diff options
context:
space:
mode:
Diffstat (limited to 'usb/device/massstorage/SBC.h')
-rw-r--r--usb/device/massstorage/SBC.h653
1 files changed, 653 insertions, 0 deletions
diff --git a/usb/device/massstorage/SBC.h b/usb/device/massstorage/SBC.h
new file mode 100644
index 0000000..7c64844
--- /dev/null
+++ b/usb/device/massstorage/SBC.h
@@ -0,0 +1,653 @@
+/* ----------------------------------------------------------------------------
+ * 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.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \unit
+/// !Purpose
+///
+/// SCSI definitions.
+///
+/// !Usage
+///
+/// -# After command block received, Access and decode the SCSI command block
+/// with SBCCommand structure.
+//------------------------------------------------------------------------------
+
+#ifndef SBC_H
+#define SBC_H
+
+//------------------------------------------------------------------------------
+// Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "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
+///
+/// !Codes
+/// - SBC_INQUIRY
+/// - SBC_READ_10
+/// - SBC_READ_CAPACITY_10
+/// - SBC_REQUEST_SENSE
+/// - SBC_TEST_UNIT_READY
+/// - SBC_WRITE_10
+///
+/// !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
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "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
+///
+/// !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
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "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
+///
+/// !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
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "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
+///
+/// !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
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "SBC Sense Keys"
+/// This page lists sense key values returned in the REQUEST SENSE data
+/// \see spc4r06.pdf - Section 4.5.6 - Table 27
+///
+/// !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
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "SBC Sense Additionals"
+/// This page lists additional sense code values returned in REQUEST SENSE data
+/// \see spc4r06.pdf - Section 4.5.6 - Table 28
+///
+/// !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
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "MSD Endian Macros"
+/// This page lists the macros for endianness conversion.
+///
+/// !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
+
+//------------------------------------------------------------------------------
+/// \brief Structure for the INQUIRY command
+/// \see spc4r06.pdf - Section 6.4.1 - Table 81
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Standard INQUIRY data format returned by the device
+/// \see spc4r06.pdf - Section 6.4.2 - Table 82
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Data structure for the READ (10) command
+/// \see sbc3r07.pdf - Section 5.7 - Table 34
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Structure for the READ CAPACITY (10) command
+/// \see sbc3r07.pdf - Section 5.11.1 - Table 40
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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 Data structure for the TEST UNIT READY command
+/// \see spc4r06.pdf - Section 6.34 - Table 192
+//------------------------------------------------------------------------------
+typedef struct {
+
+ unsigned char bOperationCode; //!< 0x00 : SBC_TEST_UNIT_READY
+ unsigned char pReserved1[4]; //!< Reserved bits
+ unsigned char bControl; //!< 0x00
+
+} __attribute__ ((packed)) SBCTestUnitReady; // GCC
+
+//------------------------------------------------------------------------------
+/// \brief Structure for the WRITE (10) command
+/// \see sbc3r07.pdf - Section 5.26 - Table 70
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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;
+
+//------------------------------------------------------------------------------
+/// \brief Structure for the PREVENT/ALLOW MEDIUM REMOVAL command
+/// \see sbc3r07.pdf - Section 5.5 - Table 30
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Structure for the MODE SENSE (6) command
+/// \see spc4r06 - Section 6.9.1 - Table 98
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Header for the data returned after a MODE SENSE (6) command
+/// \see spc4r06.pdf - Section 7.4.3 - Table 268
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Informational exceptions control mode page
+/// \see spc4r06.pdf - Section 7.4.11 - Table 285
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \brief Read/write error recovery mode page
+/// \see sbc3r07.pdf - Section 6.3.5 - Table 122
+//------------------------------------------------------------------------------
+typedef struct {
+
+ 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
+
+//------------------------------------------------------------------------------
+/// \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 {
+
+ 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
+
personal git repositories of Harald Welte. Your mileage may vary