Microchip® Advanced Software Framework

scsi_decoder.h File Reference
#include "conf_usb.h"
#include "compiler.h"
#include "preprocessor.h"

Data Structures

struct  s_scsi_sense
 Sense data. More...
 
struct  sbc_st_std_inquiry_data
 INQUIRY data. More...
 

Macros

#define SBC_BLOCK_DESCRIPTOR_LENGTH   0x00
 MODE SENSE BLOCK DESCRIPTOR LENGTH. More...
 
#define Sbc_build_sense(skey, sasc, sascq)
 Builds sense data. More...
 
#define SBC_MEDIUM_TYPE   0x00
 MEDIUM TYPE for direct-access block devices. More...
 
#define SBC_MRIE_GENERATE_NO_SENSE   0x05
 Method of reporting informational exceptions (MRIE). More...
 
#define SBC_READ_CAPACITY_LENGTH   0x08
 READ CAPACITY (10) parameter data length. More...
 
#define Sbc_valid_write_usb(length)
 Sends the USB mass-storage endpoint FIFO and updates g_scsi_data_remaining accordingly. More...
 
bmCBWFlags
#define SBC_CMD_DIR_IN   0x80
 
#define SBC_CMD_DIR_OUT   0x00
 
SCSI Commands
#define SBC_CMD_TEST_UNIT_READY   0x00
 
#define SBC_CMD_REQUEST_SENSE   0x03
 
#define SBC_CMD_FORMAT_UNIT   0x04
 
#define SBC_CMD_REASSIGN_BLOCKS   0x07
 
#define SBC_CMD_READ_6   0x08
 
#define SBC_CMD_WRITE_6   0x0A
 
#define SBC_CMD_INQUIRY   0x12
 
#define SBC_CMD_MODE_SELECT_6   0x15
 
#define SBC_CMD_MODE_SENSE_6   0x1A
 
#define SBC_CMD_START_STOP_UNIT   0x1B
 
#define SBC_CMD_RECEIVE_DIAGNOSTIC_RESULTS   0x1C
 
#define SBC_CMD_SEND_DIAGNOSTIC   0x1D
 
#define SBC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL   0x1E
 
#define SBC_CMD_READ_CAPACITY_10   0x25
 
#define SBC_CMD_READ_10   0x28
 
#define SBC_CMD_WRITE_10   0x2A
 
#define SBC_CMD_WRITE_AND_VERIFY_10   0x2E
 
#define SBC_CMD_VERIFY_10   0x2F
 
#define SBC_CMD_PREFETCH_10   0x34
 
#define SBC_CMD_SYNCHRONIZE_CACHE_10   0x35
 
#define SBC_CMD_READ_DEFECT_DATA_10   0x37
 
#define SBC_CMD_WRITE_BUFFER   0x3B
 
#define SBC_CMD_READ_BUFFER   0x3C
 
#define SBC_CMD_READ_LONG_10   0x3E
 
#define SBC_CMD_WRITE_LONG_10   0x3F
 
#define SBC_CMD_WRITE_SAME_10   0x41
 
#define SBC_CMD_LOG_SELECT   0x4C
 
#define SBC_CMD_LOG_SENSE   0x4D
 
#define SBC_CMD_XDWRITE_10   0x50
 
#define SBC_CMD_XPWRITE_10   0x51
 
#define SBC_CMD_XDREAD_10   0x52
 
#define SBC_CMD_XDWRITEREAD_10   0x53
 
#define SBC_CMD_MODE_SELECT_10   0x55
 
#define SBC_CMD_MODE_SENSE_10   0x5A
 
#define SBC_CMD_PERSISTENT_RESERVE_IN   0x5E
 
#define SBC_CMD_PERSISTENT_RESERVE_OUT   0x5F
 
#define SBC_CMD_EXTENDED_COPY   0x83
 
#define SBC_CMD_RECEIVE_COPY_RESULTS   0x84
 
#define SBC_CMD_ACCESS_CONTROL_IN   0x86
 
#define SBC_CMD_ACCESS_CONTROL_OUT   0x87
 
#define SBC_CMD_READ_16   0x88
 
#define SBC_CMD_WRITE_16   0x8A
 
#define SBC_CMD_READ_ATTRIBUTE   0x8C
 
#define SBC_CMD_WRITE_ATTRIBUTE   0x8D
 
#define SBC_CMD_WRITE_AND_VERIFY_16   0x8E
 
#define SBC_CMD_VERIFY_16   0x8F
 
#define SBC_CMD_PREFETCH_16   0x90
 
#define SBC_CMD_SYNCHRONIZE_CACHE_16   0x91
 
#define SBC_CMD_WRITE_SAME_16   0x93
 
#define SBC_CMD_REPORT_LUNS   0xA0
 
#define SBC_CMD_READ_12   0xA8
 
#define SBC_CMD_WRITE_12   0xAA
 
#define SBC_CMD_WRITE_AND_VERIFY_12   0xAE
 
#define SBC_CMD_VERIFY_12   0xAF
 
#define SBC_CMD_READ_DEFECT_DATA_12   0xB7
 
Status Codes
#define COMMAND_PASSED   0x00
 
#define COMMAND_FAILED   0x01
 
#define CHECK_CONDITION   0x02
 
Sense Key Definitions
#define SBC_SENSE_KEY_NO_SENSE   0x00
 
#define SBC_SENSE_KEY_RECOVERED_ERROR   0x01
 
#define SBC_SENSE_KEY_NOT_READY   0x02
 
#define SBC_SENSE_KEY_MEDIUM_ERROR   0x03
 
#define SBC_SENSE_KEY_HARDWARE_ERROR   0x04
 
#define SBC_SENSE_KEY_ILLEGAL_REQUEST   0x05
 
#define SBC_SENSE_KEY_UNIT_ATTENTION   0x06
 
#define SBC_SENSE_KEY_DATA_PROTECT   0x07
 
#define SBC_SENSE_KEY_BLANK_CHECK   0x08
 
#define SBC_SENSE_KEY_VENDOR_SPECIFIC   0x09
 
#define SBC_SENSE_KEY_COPY_ABORTED   0x0A
 
#define SBC_SENSE_KEY_ABORTED_COMMAND   0x0B
 
#define SBC_SENSE_KEY_VOLUME_OVERFLOW   0x0D
 
#define SBC_SENSE_KEY_MISCOMPARE   0x0E
 
Additional Sense Code Definitions
#define SBC_ASC_NO_ADDITIONAL_SENSE_INFORMATION   0x00
 
#define SBC_ASC_LOGICAL_UNIT_NOT_READY   0x04
 
#define SBC_ASC_INVALID_FIELD_IN_CDB   0x24
 
#define SBC_ASC_WRITE_PROTECTED   0x27
 
#define SBC_ASC_FORMAT_ERROR   0x31
 
#define SBC_ASC_INVALID_COMMAND_OPERATION_CODE   0x20
 
#define SBC_ASC_NOT_READY_TO_READY_CHANGE   0x28
 
#define SBC_ASC_MEDIUM_NOT_PRESENT   0x3A
 
Additional Sense Code Qualifier Definitions
#define SBC_ASCQ_FORMAT_COMMAND_FAILED   0x01
 
#define SBC_ASCQ_INITIALIZING_COMMAND_REQUIRED   0x02
 
#define SBC_ASCQ_OPERATION_IN_PROGRESS   0x07
 
Fixed Format Sense Data
#define SBC_RESPONSE_CODE_SENSE   0x70
 
#define SBC_ADDITIONAL_SENSE_LENGTH   0x0A
 
#define SBC_COMMAND_SPECIFIC_INFORMATION_3   0x00
 
#define SBC_COMMAND_SPECIFIC_INFORMATION_2   0x00
 
#define SBC_COMMAND_SPECIFIC_INFORMATION_1   0x00
 
#define SBC_COMMAND_SPECIFIC_INFORMATION_0   0x00
 
#define SBC_FIELD_REPLACEABLE_UNIT_CODE   0x00
 
#define SBC_SENSE_KEY_SPECIFIC_2   0x00
 
#define SBC_SENSE_KEY_SPECIFIC_1   0x00
 
#define SBC_SENSE_KEY_SPECIFIC_0   0x00
 
MODE SENSE Bit-Masks
#define SBC_MSK_DBD   0x08
 
#define SBC_MSK_PAGE_CONTROL   0xC0
 
#define SBC_MSK_PAGE_CODE   0x3F
 
Mode Page Codes for Direct-Access Block Devices
#define SBC_PAGE_CODE_READ_WRITE_ERROR_RECOVERY   0x01
 
#define SBC_PAGE_CODE_INFORMATIONAL_EXCEPTIONS   0x1C
 
#define SBC_PAGE_CODE_ALL   0x3F
 
Mode Data Lengths for Direct-Access Block Devices
#define SBC_MODE_DATA_LENGTH_READ_WRITE_ERROR_RECOVERY   (SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY + 2 + 3)
 
#define SBC_MODE_DATA_LENGTH_INFORMATIONAL_EXCEPTIONS   (SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS + 2 + 3)
 
#define SBC_MODE_DATA_LENGTH_CODE_ALL
 
<tt>DEVICE-SPECIFIC PARAMETER</tt> Write Protect (\c WP) Bit-Masks.
#define SBC_DEV_SPEC_PARAM_WR_ENABLE   0x00
 
#define SBC_DEV_SPEC_PARAM_WR_PROTECT   0x80
 
Mode Page Lengths for Direct-Access Block Devices
#define SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY   0x0A
 
#define SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS   0x0A
 
Read-Write Error Recovery Mode Page Bit-Fields
#define SBC_READ_RETRY_COUNT   0x03
 
#define SBC_WRITE_RETRY_COUNT   0x80
 
#define SBC_RECOVERY_TIME_LIMIT   0x0000
 
MCU <-> SCSI Endianism Conversion Macros
#define Sbc_format_mcu_to_scsi_data(width, data)   ((TPASTE2(U, width))(data))
 Converts 16-, 32- or 64-bit data from MCU to SCSI endianism. More...
 
#define Sbc_format_scsi_to_mcu_data(width, data)   ((TPASTE2(U, width))(data))
 Converts 16-, 32- or 64-bit data from SCSI to MCU endianism. More...
 
#define sbc_format_mcu_to_scsi_data(width, data)   ((TPASTE2(U, width))(data))
 Converts 16-, 32- or 64-bit data from MCU to SCSI endianism. More...
 
#define sbc_format_scsi_to_mcu_data(width, data)   ((TPASTE2(U, width))(data))
 Converts 16-, 32- or 64-bit data from SCSI to MCU endianism. More...
 
Status Macros
#define Sbc_send_failed()   (g_scsi_status = COMMAND_FAILED )
 Sets status to FAILED. More...
 
#define Sbc_send_check_condition()   (g_scsi_status = CHECK_CONDITION)
 Sets status to CHECK CONDITION. More...
 
#define Sbc_send_good()   (g_scsi_status = COMMAND_PASSED )
 Sets status to GOOD. More...
 

#define CHECK_CONDITION   0x02
#define COMMAND_FAILED   0x01
#define SBC_ADDITIONAL_SENSE_LENGTH   0x0A
#define SBC_ASC_FORMAT_ERROR   0x31
#define SBC_ASC_INVALID_COMMAND_OPERATION_CODE   0x20
#define SBC_ASC_INVALID_FIELD_IN_CDB   0x24
#define SBC_ASC_LOGICAL_UNIT_NOT_READY   0x04
#define SBC_ASC_MEDIUM_NOT_PRESENT   0x3A

Referenced by host_ms_request_sense().

#define SBC_ASC_NO_ADDITIONAL_SENSE_INFORMATION   0x00
#define SBC_ASC_NOT_READY_TO_READY_CHANGE   0x28

Referenced by host_ms_request_sense().

#define SBC_ASC_WRITE_PROTECTED   0x27
#define SBC_ASCQ_FORMAT_COMMAND_FAILED   0x01
#define SBC_ASCQ_INITIALIZING_COMMAND_REQUIRED   0x02
#define SBC_ASCQ_OPERATION_IN_PROGRESS   0x07
#define SBC_BLOCK_DESCRIPTOR_LENGTH   0x00

MODE SENSE BLOCK DESCRIPTOR LENGTH.

#define Sbc_build_sense (   skey,
  sasc,
  sascq 
)
Value:
(g_scsi_sense.key = (skey),\
g_scsi_sense.asc = (sasc),\
g_scsi_sense.ascq = (sascq))

Builds sense data.

Parameters
skeySENSE KEY.
sascADDITIONAL SENSE CODE.
sascqADDITIONAL SENSE CODE QUALIFIER.
#define SBC_CMD_ACCESS_CONTROL_IN   0x86
#define SBC_CMD_ACCESS_CONTROL_OUT   0x87
#define SBC_CMD_DIR_OUT   0x00
#define SBC_CMD_EXTENDED_COPY   0x83
#define SBC_CMD_FORMAT_UNIT   0x04
#define SBC_CMD_INQUIRY   0x12

Referenced by host_ms_inquiry().

#define SBC_CMD_LOG_SELECT   0x4C
#define SBC_CMD_LOG_SENSE   0x4D
#define SBC_CMD_MODE_SELECT_10   0x55
#define SBC_CMD_MODE_SELECT_6   0x15
#define SBC_CMD_MODE_SENSE_10   0x5A
#define SBC_CMD_MODE_SENSE_6   0x1A

Referenced by host_wr_protect().

#define SBC_CMD_PERSISTENT_RESERVE_IN   0x5E
#define SBC_CMD_PERSISTENT_RESERVE_OUT   0x5F
#define SBC_CMD_PREFETCH_10   0x34
#define SBC_CMD_PREFETCH_16   0x90
#define SBC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL   0x1E
#define SBC_CMD_READ_10   0x28
#define SBC_CMD_READ_12   0xA8
#define SBC_CMD_READ_16   0x88
#define SBC_CMD_READ_6   0x08
#define SBC_CMD_READ_ATTRIBUTE   0x8C
#define SBC_CMD_READ_BUFFER   0x3C
#define SBC_CMD_READ_CAPACITY_10   0x25

Referenced by host_read_capacity().

#define SBC_CMD_READ_DEFECT_DATA_10   0x37
#define SBC_CMD_READ_DEFECT_DATA_12   0xB7
#define SBC_CMD_READ_LONG_10   0x3E
#define SBC_CMD_REASSIGN_BLOCKS   0x07
#define SBC_CMD_RECEIVE_COPY_RESULTS   0x84
#define SBC_CMD_RECEIVE_DIAGNOSTIC_RESULTS   0x1C
#define SBC_CMD_REPORT_LUNS   0xA0
#define SBC_CMD_REQUEST_SENSE   0x03

Referenced by host_ms_request_sense().

#define SBC_CMD_SEND_DIAGNOSTIC   0x1D
#define SBC_CMD_START_STOP_UNIT   0x1B
#define SBC_CMD_SYNCHRONIZE_CACHE_10   0x35
#define SBC_CMD_SYNCHRONIZE_CACHE_16   0x91
#define SBC_CMD_TEST_UNIT_READY   0x00

Referenced by host_test_unit_ready().

#define SBC_CMD_VERIFY_10   0x2F
#define SBC_CMD_VERIFY_12   0xAF
#define SBC_CMD_VERIFY_16   0x8F
#define SBC_CMD_WRITE_10   0x2A

Referenced by host_write_10_extram().

#define SBC_CMD_WRITE_12   0xAA
#define SBC_CMD_WRITE_16   0x8A
#define SBC_CMD_WRITE_6   0x0A
#define SBC_CMD_WRITE_AND_VERIFY_10   0x2E
#define SBC_CMD_WRITE_AND_VERIFY_12   0xAE
#define SBC_CMD_WRITE_AND_VERIFY_16   0x8E
#define SBC_CMD_WRITE_ATTRIBUTE   0x8D
#define SBC_CMD_WRITE_BUFFER   0x3B
#define SBC_CMD_WRITE_LONG_10   0x3F
#define SBC_CMD_WRITE_SAME_10   0x41
#define SBC_CMD_WRITE_SAME_16   0x93
#define SBC_CMD_XDREAD_10   0x52
#define SBC_CMD_XDWRITE_10   0x50
#define SBC_CMD_XDWRITEREAD_10   0x53
#define SBC_CMD_XPWRITE_10   0x51
#define SBC_COMMAND_SPECIFIC_INFORMATION_0   0x00
#define SBC_COMMAND_SPECIFIC_INFORMATION_1   0x00
#define SBC_COMMAND_SPECIFIC_INFORMATION_2   0x00
#define SBC_COMMAND_SPECIFIC_INFORMATION_3   0x00
#define SBC_DEV_SPEC_PARAM_WR_ENABLE   0x00
#define SBC_DEV_SPEC_PARAM_WR_PROTECT   0x80
#define SBC_FIELD_REPLACEABLE_UNIT_CODE   0x00
#define Sbc_format_mcu_to_scsi_data (   width,
  data 
)    ((TPASTE2(U, width))(data))

Converts 16-, 32- or 64-bit data from MCU to SCSI endianism.

Depending on MCU endianism, swaps or not data bytes.

Parameters
widthData width in bits: 16, 32 or 64.
data16-, 32- or 64-bit data to format.
Returns
Formatted 16-, 32- or 64-bit data.
Note
More optimized if only used with values known at compile time.
#define sbc_format_mcu_to_scsi_data (   width,
  data 
)    ((TPASTE2(U, width))(data))

Converts 16-, 32- or 64-bit data from MCU to SCSI endianism.

Depending on MCU endianism, swaps or not data bytes.

Parameters
widthData width in bits: 16, 32 or 64.
data16-, 32- or 64-bit data to format.
Returns
Formatted 16-, 32- or 64-bit data.
Note
More optimized if only used with values unknown at compile time.
#define Sbc_format_scsi_to_mcu_data (   width,
  data 
)    ((TPASTE2(U, width))(data))

Converts 16-, 32- or 64-bit data from SCSI to MCU endianism.

Depending on MCU endianism, swaps or not data bytes.

Parameters
widthData width in bits: 16, 32 or 64.
data16-, 32- or 64-bit data to format.
Returns
Formatted 16-, 32- or 64-bit data.
Note
More optimized if only used with values known at compile time.
#define sbc_format_scsi_to_mcu_data (   width,
  data 
)    ((TPASTE2(U, width))(data))

Converts 16-, 32- or 64-bit data from SCSI to MCU endianism.

Depending on MCU endianism, swaps or not data bytes.

Parameters
widthData width in bits: 16, 32 or 64.
data16-, 32- or 64-bit data to format.
Returns
Formatted 16-, 32- or 64-bit data.
Note
More optimized if only used with values unknown at compile time.

Referenced by host_read_capacity().

#define SBC_MEDIUM_TYPE   0x00

MEDIUM TYPE for direct-access block devices.

#define SBC_MODE_DATA_LENGTH_CODE_ALL
Value:
#define SBC_BLOCK_DESCRIPTOR_LENGTH
MODE SENSE BLOCK DESCRIPTOR LENGTH.
Definition: scsi_decoder.h:220
#define SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY
Definition: scsi_decoder.h:225
#define SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS
Definition: scsi_decoder.h:226
#define SBC_MODE_DATA_LENGTH_INFORMATIONAL_EXCEPTIONS   (SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS + 2 + 3)
#define SBC_MODE_DATA_LENGTH_READ_WRITE_ERROR_RECOVERY   (SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY + 2 + 3)
#define SBC_MRIE_GENERATE_NO_SENSE   0x05

Method of reporting informational exceptions (MRIE).

#define SBC_MSK_DBD   0x08
#define SBC_MSK_PAGE_CODE   0x3F
#define SBC_MSK_PAGE_CONTROL   0xC0
#define SBC_PAGE_CODE_ALL   0x3F
#define SBC_PAGE_CODE_INFORMATIONAL_EXCEPTIONS   0x1C
#define SBC_PAGE_CODE_READ_WRITE_ERROR_RECOVERY   0x01
#define SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS   0x0A
#define SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY   0x0A
#define SBC_READ_CAPACITY_LENGTH   0x08

READ CAPACITY (10) parameter data length.

#define SBC_READ_RETRY_COUNT   0x03
#define SBC_RECOVERY_TIME_LIMIT   0x0000
#define SBC_RESPONSE_CODE_SENSE   0x70
#define Sbc_send_check_condition ( )    (g_scsi_status = CHECK_CONDITION)

Sets status to CHECK CONDITION.

#define Sbc_send_failed ( )    (g_scsi_status = COMMAND_FAILED )

Sets status to FAILED.

#define Sbc_send_good ( )    (g_scsi_status = COMMAND_PASSED )

Sets status to GOOD.

#define SBC_SENSE_KEY_ABORTED_COMMAND   0x0B
#define SBC_SENSE_KEY_BLANK_CHECK   0x08
#define SBC_SENSE_KEY_COPY_ABORTED   0x0A
#define SBC_SENSE_KEY_DATA_PROTECT   0x07

Referenced by host_ms_request_sense().

#define SBC_SENSE_KEY_HARDWARE_ERROR   0x04

Referenced by host_ms_request_sense().

#define SBC_SENSE_KEY_ILLEGAL_REQUEST   0x05
#define SBC_SENSE_KEY_MEDIUM_ERROR   0x03

Referenced by host_ms_request_sense().

#define SBC_SENSE_KEY_MISCOMPARE   0x0E
#define SBC_SENSE_KEY_NO_SENSE   0x00

Referenced by host_ms_request_sense().

#define SBC_SENSE_KEY_NOT_READY   0x02

Referenced by host_ms_request_sense().

#define SBC_SENSE_KEY_RECOVERED_ERROR   0x01
#define SBC_SENSE_KEY_SPECIFIC_0   0x00
#define SBC_SENSE_KEY_SPECIFIC_1   0x00
#define SBC_SENSE_KEY_SPECIFIC_2   0x00
#define SBC_SENSE_KEY_UNIT_ATTENTION   0x06

Referenced by host_ms_request_sense().

#define SBC_SENSE_KEY_VENDOR_SPECIFIC   0x09
#define SBC_SENSE_KEY_VOLUME_OVERFLOW   0x0D
#define Sbc_valid_write_usb (   length)
Value:
(Usb_ack_in_ready_send(g_scsi_ep_ms_in),\
g_scsi_data_remaining -= (length))
#define Usb_ack_in_ready_send(ep)
acks IN ready and sends current bank
Definition: usb_drv.h:739

Sends the USB mass-storage endpoint FIFO and updates g_scsi_data_remaining accordingly.

Parameters
lengthNumber of bytes sent.
#define SBC_WRITE_RETRY_COUNT   0x80