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...
 

Functions

bool sbc_inquiry (void)
 Manages the INQUIRY command. More...
 
void sbc_lun_status_is_busy_or_change (void)
 Sends the status "busy or changed". More...
 
void sbc_lun_status_is_cdb_field (void)
 Sends the status "FAIL because CDB field is invalid". More...
 
void sbc_lun_status_is_fail (void)
 Sends the status "FAILED". More...
 
void sbc_lun_status_is_good (void)
 Sends the status "GOOD". More...
 
void sbc_lun_status_is_not_present (void)
 Sends the status "LUN not present". More...
 
void sbc_lun_status_is_protected (void)
 Sends the status "FAILED because of write protection". More...
 
bool sbc_mode_sense (bool b_sense_10)
 Manages the MODE SENSE (6) and (10) commands. More...
 
bool sbc_prevent_allow_medium_removal (void)
 Manages the PREVENT ALLOW MEDIUM REMOVAL command. More...
 
bool sbc_read_10 (void)
 Manages the READ (10) command. More...
 
bool sbc_read_capacity (void)
 Manages the READ CAPACITY (10) command. More...
 
bool sbc_request_sense (void)
 Manages the REQUEST SENSE command. More...
 
bool sbc_test_unit_ready (void)
 Manages the TEST UNIT READY command. More...
 
bool sbc_write_10 (void)
 Manages the WRITE (10) command. More...
 
bool scsi_decode_command (void)
 Decodes and launches the execution of SCSI commands. More...
 

Variables

uint8_t g_scsi_command [16]
 SCSI command buffer. More...
 
uint32_t g_scsi_data_remaining
 Remaining data transfer length. More...
 
uint8_t g_scsi_ep_ms_in
 USB mass-storage IN endpoint. More...
 
uint8_t g_scsi_ep_ms_out
 USB mass-storage OUT endpoint. More...
 
s_scsi_sense g_scsi_sense
 Sense data. More...
 
uint8_t g_scsi_status
 SCSI status. More...
 

#define CHECK_CONDITION   0x02
#define COMMAND_FAILED   0x01
#define SBC_ADDITIONAL_SENSE_LENGTH   0x0A

Referenced by sbc_request_sense().

#define SBC_ASC_FORMAT_ERROR   0x31
#define SBC_ASC_INVALID_COMMAND_OPERATION_CODE   0x20

Referenced by scsi_decode_command().

#define SBC_ASC_INVALID_FIELD_IN_CDB   0x24
#define SBC_ASC_LOGICAL_UNIT_NOT_READY   0x04
#define SBC_ASC_MEDIUM_NOT_PRESENT   0x3A
#define SBC_ASC_NO_ADDITIONAL_SENSE_INFORMATION   0x00
#define SBC_ASC_NOT_READY_TO_READY_CHANGE   0x28
#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.

Referenced by sbc_header_mode_sense().

#define Sbc_build_sense (   skey,
  sasc,
  sascq 
)
Value:
(g_scsi_sense.key = (skey),\
g_scsi_sense.asc = (sasc),\
g_scsi_sense.ascq = (sascq))
s_scsi_sense g_scsi_sense
Sense data.
Definition: scsi_decoder.c:87
uint8_t ascq
ADDITIONAL SENSE CODE QUALIFIER.
Definition: scsi_decoder.h:402
uint8_t asc
ADDITIONAL SENSE CODE.
Definition: scsi_decoder.h:401
uint8_t key
SENSE KEY.
Definition: scsi_decoder.h:400

Builds sense data.

Parameters
skeySENSE KEY.
sascADDITIONAL SENSE CODE.
sascqADDITIONAL SENSE CODE QUALIFIER.

Referenced by sbc_lun_status_is_busy_or_change(), sbc_lun_status_is_cdb_field(), sbc_lun_status_is_fail(), sbc_lun_status_is_good(), sbc_lun_status_is_not_present(), sbc_lun_status_is_protected(), and scsi_decode_command().

#define SBC_CMD_ACCESS_CONTROL_IN   0x86

Referenced by scsi_decode_command().

#define SBC_CMD_ACCESS_CONTROL_OUT   0x87

Referenced by scsi_decode_command().

#define SBC_CMD_DIR_OUT   0x00
#define SBC_CMD_EXTENDED_COPY   0x83

Referenced by scsi_decode_command().

#define SBC_CMD_FORMAT_UNIT   0x04

Referenced by scsi_decode_command().

#define SBC_CMD_INQUIRY   0x12
#define SBC_CMD_LOG_SELECT   0x4C

Referenced by scsi_decode_command().

#define SBC_CMD_LOG_SENSE   0x4D

Referenced by scsi_decode_command().

#define SBC_CMD_MODE_SELECT_10   0x55

Referenced by scsi_decode_command().

#define SBC_CMD_MODE_SELECT_6   0x15

Referenced by scsi_decode_command().

#define SBC_CMD_MODE_SENSE_10   0x5A

Referenced by scsi_decode_command().

#define SBC_CMD_MODE_SENSE_6   0x1A
#define SBC_CMD_PERSISTENT_RESERVE_IN   0x5E

Referenced by scsi_decode_command().

#define SBC_CMD_PERSISTENT_RESERVE_OUT   0x5F

Referenced by scsi_decode_command().

#define SBC_CMD_PREFETCH_10   0x34

Referenced by scsi_decode_command().

#define SBC_CMD_PREFETCH_16   0x90

Referenced by scsi_decode_command().

#define SBC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL   0x1E

Referenced by scsi_decode_command().

#define SBC_CMD_READ_10   0x28
#define SBC_CMD_READ_12   0xA8

Referenced by scsi_decode_command().

#define SBC_CMD_READ_16   0x88

Referenced by scsi_decode_command().

#define SBC_CMD_READ_6   0x08

Referenced by scsi_decode_command().

#define SBC_CMD_READ_ATTRIBUTE   0x8C

Referenced by scsi_decode_command().

#define SBC_CMD_READ_BUFFER   0x3C

Referenced by scsi_decode_command().

#define SBC_CMD_READ_CAPACITY_10   0x25
#define SBC_CMD_READ_DEFECT_DATA_10   0x37

Referenced by scsi_decode_command().

#define SBC_CMD_READ_DEFECT_DATA_12   0xB7

Referenced by scsi_decode_command().

#define SBC_CMD_READ_LONG_10   0x3E

Referenced by scsi_decode_command().

#define SBC_CMD_REASSIGN_BLOCKS   0x07

Referenced by scsi_decode_command().

#define SBC_CMD_RECEIVE_COPY_RESULTS   0x84

Referenced by scsi_decode_command().

#define SBC_CMD_RECEIVE_DIAGNOSTIC_RESULTS   0x1C

Referenced by scsi_decode_command().

#define SBC_CMD_REPORT_LUNS   0xA0

Referenced by scsi_decode_command().

#define SBC_CMD_REQUEST_SENSE   0x03
#define SBC_CMD_SEND_DIAGNOSTIC   0x1D

Referenced by scsi_decode_command().

#define SBC_CMD_START_STOP_UNIT   0x1B

Referenced by scsi_decode_command().

#define SBC_CMD_SYNCHRONIZE_CACHE_10   0x35

Referenced by scsi_decode_command().

#define SBC_CMD_SYNCHRONIZE_CACHE_16   0x91

Referenced by scsi_decode_command().

#define SBC_CMD_TEST_UNIT_READY   0x00
#define SBC_CMD_VERIFY_10   0x2F

Referenced by scsi_decode_command().

#define SBC_CMD_VERIFY_12   0xAF

Referenced by scsi_decode_command().

#define SBC_CMD_VERIFY_16   0x8F

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_10   0x2A
#define SBC_CMD_WRITE_12   0xAA

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_16   0x8A

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_6   0x0A

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_AND_VERIFY_10   0x2E

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_AND_VERIFY_12   0xAE

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_AND_VERIFY_16   0x8E

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_ATTRIBUTE   0x8D

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_BUFFER   0x3B

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_LONG_10   0x3F

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_SAME_10   0x41

Referenced by scsi_decode_command().

#define SBC_CMD_WRITE_SAME_16   0x93

Referenced by scsi_decode_command().

#define SBC_CMD_XDREAD_10   0x52

Referenced by scsi_decode_command().

#define SBC_CMD_XDWRITE_10   0x50

Referenced by scsi_decode_command().

#define SBC_CMD_XDWRITEREAD_10   0x53

Referenced by scsi_decode_command().

#define SBC_CMD_XPWRITE_10   0x51

Referenced by scsi_decode_command().

#define SBC_COMMAND_SPECIFIC_INFORMATION_0   0x00

Referenced by sbc_request_sense().

#define SBC_COMMAND_SPECIFIC_INFORMATION_1   0x00

Referenced by sbc_request_sense().

#define SBC_COMMAND_SPECIFIC_INFORMATION_2   0x00

Referenced by sbc_request_sense().

#define SBC_COMMAND_SPECIFIC_INFORMATION_3   0x00

Referenced by sbc_request_sense().

#define SBC_DEV_SPEC_PARAM_WR_ENABLE   0x00

Referenced by sbc_header_mode_sense().

#define SBC_DEV_SPEC_PARAM_WR_PROTECT   0x80

Referenced by sbc_header_mode_sense().

#define SBC_FIELD_REPLACEABLE_UNIT_CODE   0x00

Referenced by sbc_request_sense().

#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.

Referenced by sbc_read_capacity(), send_informational_exceptions_page(), and send_read_write_error_recovery_page().

#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.

Referenced by sbc_read_capacity().

#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.

Referenced by sbc_header_mode_sense().

#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

Referenced by sbc_mode_sense().

#define SBC_MODE_DATA_LENGTH_INFORMATIONAL_EXCEPTIONS   (SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS + 2 + 3)

Referenced by sbc_mode_sense().

#define SBC_MODE_DATA_LENGTH_READ_WRITE_ERROR_RECOVERY   (SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY + 2 + 3)

Referenced by sbc_mode_sense().

#define SBC_MRIE_GENERATE_NO_SENSE   0x05

Method of reporting informational exceptions (MRIE).

Referenced by send_informational_exceptions_page().

#define SBC_MSK_DBD   0x08
#define SBC_MSK_PAGE_CODE   0x3F

Referenced by sbc_mode_sense().

#define SBC_MSK_PAGE_CONTROL   0xC0
#define SBC_PAGE_CODE_ALL   0x3F

Referenced by sbc_mode_sense().

#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.

Referenced by sbc_read_capacity().

#define SBC_READ_RETRY_COUNT   0x03
#define SBC_RECOVERY_TIME_LIMIT   0x0000
#define SBC_RESPONSE_CODE_SENSE   0x70

Referenced by sbc_request_sense().

#define Sbc_send_check_condition ( )    (g_scsi_status = CHECK_CONDITION)

Sets status to CHECK CONDITION.

#define Sbc_send_good ( )    (g_scsi_status = COMMAND_PASSED )

Sets status to GOOD.

Referenced by sbc_lun_status_is_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
#define SBC_SENSE_KEY_HARDWARE_ERROR   0x04
#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
#define SBC_SENSE_KEY_NOT_READY   0x02
#define SBC_SENSE_KEY_RECOVERED_ERROR   0x01
#define SBC_SENSE_KEY_SPECIFIC_0   0x00

Referenced by sbc_request_sense().

#define SBC_SENSE_KEY_SPECIFIC_1   0x00

Referenced by sbc_request_sense().

#define SBC_SENSE_KEY_SPECIFIC_2   0x00

Referenced by sbc_request_sense().

#define SBC_SENSE_KEY_UNIT_ATTENTION   0x06
#define SBC_SENSE_KEY_VENDOR_SPECIFIC   0x09
#define SBC_SENSE_KEY_VOLUME_OVERFLOW   0x0D
#define Sbc_valid_write_usb (   length)
Value:
uint8_t g_scsi_ep_ms_in
USB mass-storage IN endpoint.
Definition: scsi_decoder.c:89
uint32_t g_scsi_data_remaining
Remaining data transfer length.
Definition: scsi_decoder.c:85
#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.

Referenced by sbc_inquiry(), sbc_mode_sense(), sbc_read_capacity(), and sbc_request_sense().

#define SBC_WRITE_RETRY_COUNT   0x80

bool sbc_inquiry ( void  )

Manages the INQUIRY command.

The INQUIRY command requests that information regarding the logical unit and SCSI target device be sent to the application client.

See sbc_st_std_inquiry_data.

Returns
Boolean indicating success.

References EP_MS_IN, g_scsi_command, g_scsi_ep_ms_in, Is_usb_endpoint_enabled, Is_usb_in_ready, min, NULL, sbc_lun_status_is_cdb_field(), sbc_lun_status_is_good(), Sbc_valid_write_usb, Usb_nb_busy_bank, Usb_reset_endpoint_fifo_access, and usb_write_ep_txpacket().

Referenced by scsi_decode_command().

void sbc_lun_status_is_busy_or_change ( void  )
void sbc_lun_status_is_cdb_field ( void  )

Sends the status "FAIL because CDB field is invalid".

References SBC_ASC_INVALID_FIELD_IN_CDB, Sbc_build_sense, Sbc_send_failed, and SBC_SENSE_KEY_ILLEGAL_REQUEST.

Referenced by sbc_inquiry(), sbc_mode_sense(), sbc_read_10(), and sbc_write_10().

void sbc_lun_status_is_not_present ( void  )
void sbc_lun_status_is_protected ( void  )

Sends the status "FAILED because of write protection".

References SBC_ASC_WRITE_PROTECTED, Sbc_build_sense, Sbc_send_failed, and SBC_SENSE_KEY_DATA_PROTECT.

Referenced by sbc_write_10().

bool sbc_mode_sense ( bool  b_sense_10)

Manages the MODE SENSE (6) and (10) commands.

The MODE SENSE (6/10) commands provide a means for a device server to report parameters to an application client. They are complementary commands to the MODE SELECT (6/10) commands. Device servers that implement the MODE SENSE (6/10) commands shall also implement the MODE SELECT (6/10) commands.

Parameters
b_sense_10Boolean indicating whether the (10) version of the command is requested:
  • true to specify a MODE SENSE (10) command;
  • false to specify a MODE SENSE (6) command.
Returns
Boolean indicating success.

References g_scsi_command, sbc_header_mode_sense(), sbc_lun_status_is_cdb_field(), sbc_lun_status_is_good(), SBC_MODE_DATA_LENGTH_CODE_ALL, SBC_MODE_DATA_LENGTH_INFORMATIONAL_EXCEPTIONS, SBC_MODE_DATA_LENGTH_READ_WRITE_ERROR_RECOVERY, SBC_MSK_PAGE_CODE, SBC_PAGE_CODE_ALL, SBC_PAGE_CODE_INFORMATIONAL_EXCEPTIONS, SBC_PAGE_CODE_READ_WRITE_ERROR_RECOVERY, Sbc_valid_write_usb, send_informational_exceptions_page(), and send_read_write_error_recovery_page().

Referenced by scsi_decode_command().

bool sbc_prevent_allow_medium_removal ( void  )

Manages the PREVENT ALLOW MEDIUM REMOVAL command.

The PREVENT ALLOW MEDIUM REMOVAL command requests that the logical unit enable or disable the removal of the medium. The logical unit shall not allow medium removal if any initiator port currently has medium removal prevented.

Returns
Boolean indicating success.

References sbc_lun_status_is_good().

Referenced by scsi_decode_command().

bool sbc_read_10 ( void  )

Manages the READ (10) command.

The READ (10) command requests that the device server read the specified logical block(s) and transfer them to the data-in buffer. Each logical block read includes user data and, if the medium is formatted with protection information enabled, protection information. Each logical block transferred includes user data and may include protection information, based on the RDPROTECT field and the medium format. The most recent data value written in the addressed logical block shall be returned.

Returns
Boolean indicating success.

References CTRL_BUSY, CTRL_FAIL, CTRL_GOOD, CTRL_NO_PRESENT, EP_MS_OUT, g_scsi_command, g_scsi_data_remaining, LSB, memory_2_usb(), ms_endpoint, MSB, MSB0W, MSB1W, MSB2W, MSB3W, sbc_lun_status_is_busy_or_change(), sbc_lun_status_is_cdb_field(), sbc_lun_status_is_fail(), sbc_lun_status_is_good(), sbc_lun_status_is_not_present(), and usb_LUN.

Referenced by scsi_decode_command().

bool sbc_read_capacity ( void  )

Manages the READ CAPACITY (10) command.

The READ CAPACITY (10) command requests that the device server transfer 8 bytes of parameter data describing the capacity and medium format of the direct-access block device to the data-in buffer. This command may be processed as if it has a HEAD OF QUEUE task attribute. If the logical unit supports protection information, the application client should use the READ CAPACITY (16) command instead of the READ CAPACITY (10) command.

Returns
Boolean indicating success.

References CTRL_BUSY, CTRL_FAIL, CTRL_GOOD, CTRL_NO_PRESENT, g_scsi_ep_ms_in, mem_read_capacity(), Sbc_format_mcu_to_scsi_data, sbc_format_mcu_to_scsi_data, sbc_lun_status_is_busy_or_change(), sbc_lun_status_is_fail(), sbc_lun_status_is_good(), sbc_lun_status_is_not_present(), SBC_READ_CAPACITY_LENGTH, Sbc_valid_write_usb, usb_LUN, Usb_reset_endpoint_fifo_access, and Usb_write_endpoint_data.

Referenced by scsi_decode_command().

bool sbc_test_unit_ready ( void  )

Manages the TEST UNIT READY command.

The TEST UNIT READY command provides a means to check if the logical unit is ready. This is not a request for a self-test. If the logical unit is able to accept an appropriate medium-access command without returning CHECK CONDITION status, this command shall return a GOOD status. If the logical unit is unable to become operational or is in a state such that an application client action (e.g., START UNIT command) is required to make the logical unit ready, the command shall be terminated with CHECK CONDITION status, with the sense key set to NOT READY.

Returns
Boolean indicating success.

References CTRL_BUSY, CTRL_FAIL, CTRL_GOOD, CTRL_NO_PRESENT, mem_test_unit_ready(), sbc_lun_status_is_busy_or_change(), sbc_lun_status_is_fail(), sbc_lun_status_is_good(), sbc_lun_status_is_not_present(), and usb_LUN.

Referenced by scsi_decode_command().

bool sbc_write_10 ( void  )

Manages the WRITE (10) command.

The WRITE (10) command requests that the device server transfer the specified logical block(s) from the data-out buffer and write them. Each logical block transferred includes user data and may include protection information, based on the WRPROTECT field and the medium format. Each logical block written includes user data and, if the medium is formatted with protection information enabled, protection information.

Returns
Boolean indicating success.

References CTRL_BUSY, CTRL_FAIL, CTRL_GOOD, CTRL_NO_PRESENT, EP_MS_IN, g_scsi_command, g_scsi_data_remaining, LSB, mem_wr_protect(), ms_endpoint, MSB, MSB0W, MSB1W, MSB2W, MSB3W, sbc_lun_status_is_busy_or_change(), sbc_lun_status_is_cdb_field(), sbc_lun_status_is_fail(), sbc_lun_status_is_good(), sbc_lun_status_is_not_present(), sbc_lun_status_is_protected(), usb_2_memory(), and usb_LUN.

Referenced by scsi_decode_command().

bool scsi_decode_command ( void  )

Decodes and launches the execution of SCSI commands.

Returns
Boolean indicating success.

References g_scsi_command, SBC_ASC_INVALID_COMMAND_OPERATION_CODE, Sbc_build_sense, SBC_CMD_ACCESS_CONTROL_IN, SBC_CMD_ACCESS_CONTROL_OUT, SBC_CMD_EXTENDED_COPY, SBC_CMD_FORMAT_UNIT, SBC_CMD_INQUIRY, SBC_CMD_LOG_SELECT, SBC_CMD_LOG_SENSE, SBC_CMD_MODE_SELECT_10, SBC_CMD_MODE_SELECT_6, SBC_CMD_MODE_SENSE_10, SBC_CMD_MODE_SENSE_6, SBC_CMD_PERSISTENT_RESERVE_IN, SBC_CMD_PERSISTENT_RESERVE_OUT, SBC_CMD_PREFETCH_10, SBC_CMD_PREFETCH_16, SBC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL, SBC_CMD_READ_10, SBC_CMD_READ_12, SBC_CMD_READ_16, SBC_CMD_READ_6, SBC_CMD_READ_ATTRIBUTE, SBC_CMD_READ_BUFFER, SBC_CMD_READ_CAPACITY_10, SBC_CMD_READ_DEFECT_DATA_10, SBC_CMD_READ_DEFECT_DATA_12, SBC_CMD_READ_LONG_10, SBC_CMD_REASSIGN_BLOCKS, SBC_CMD_RECEIVE_COPY_RESULTS, SBC_CMD_RECEIVE_DIAGNOSTIC_RESULTS, SBC_CMD_REPORT_LUNS, SBC_CMD_REQUEST_SENSE, SBC_CMD_SEND_DIAGNOSTIC, SBC_CMD_START_STOP_UNIT, SBC_CMD_SYNCHRONIZE_CACHE_10, SBC_CMD_SYNCHRONIZE_CACHE_16, SBC_CMD_TEST_UNIT_READY, SBC_CMD_VERIFY_10, SBC_CMD_VERIFY_12, SBC_CMD_VERIFY_16, SBC_CMD_WRITE_10, SBC_CMD_WRITE_12, SBC_CMD_WRITE_16, SBC_CMD_WRITE_6, SBC_CMD_WRITE_AND_VERIFY_10, SBC_CMD_WRITE_AND_VERIFY_12, SBC_CMD_WRITE_AND_VERIFY_16, SBC_CMD_WRITE_ATTRIBUTE, SBC_CMD_WRITE_BUFFER, SBC_CMD_WRITE_LONG_10, SBC_CMD_WRITE_SAME_10, SBC_CMD_WRITE_SAME_16, SBC_CMD_XDREAD_10, SBC_CMD_XDWRITE_10, SBC_CMD_XDWRITEREAD_10, SBC_CMD_XPWRITE_10, sbc_inquiry(), sbc_lun_status_is_good(), sbc_mode_sense(), sbc_prevent_allow_medium_removal(), sbc_read_10(), sbc_read_capacity(), sbc_request_sense(), Sbc_send_failed, SBC_SENSE_KEY_ILLEGAL_REQUEST, sbc_test_unit_ready(), sbc_write_10(), Scsi_start_read_action, Scsi_start_write_action, Scsi_stop_read_action, and Scsi_stop_write_action.

Referenced by usb_mass_storage_cbw().

uint8_t g_scsi_command[16]
uint32_t g_scsi_data_remaining

Remaining data transfer length.

Referenced by sbc_read_10(), sbc_write_10(), usb_mass_storage_cbw(), and usb_mass_storage_csw().

uint8_t g_scsi_ep_ms_out
s_scsi_sense g_scsi_sense

Sense data.

uint8_t g_scsi_status

SCSI status.

Referenced by usb_mass_storage_csw().