Functions | |
static void | sbc_header_mode_sense (bool b_sense_10, uint8_t u8_data_length) |
Writes the header of the MODE SENSE (6) and (10) commands. More... | |
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... | |
static void | send_informational_exceptions_page (void) |
Writes the Informational Exceptions Control mode page. More... | |
static void | send_read_write_error_recovery_page (uint8_t length) |
Writes the Error Recovery mode page. 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... | |
uint8_t | ms_endpoint |
static const sbc_st_std_inquiry_data | sbc_std_inquiry_data |
INQUIRY data. More... | |
uint8_t | usb_LUN |
|
static |
Writes the header of the MODE SENSE (6) and (10) commands.
b_sense_10 | Boolean indicating whether the (10) version of the command is requested:
|
u8_data_length | Data length in bytes. |
References g_scsi_ep_ms_in, mem_wr_protect(), SBC_BLOCK_DESCRIPTOR_LENGTH, SBC_DEV_SPEC_PARAM_WR_ENABLE, SBC_DEV_SPEC_PARAM_WR_PROTECT, SBC_MEDIUM_TYPE, usb_LUN, Usb_reset_endpoint_fifo_access, and Usb_write_endpoint_data.
Referenced by sbc_mode_sense().
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.
References EP_MS_IN, g_scsi_command, g_scsi_ep_ms_in, Is_usb_endpoint_enabled, Is_usb_in_ready, min, 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 | ) |
Sends the status "busy or changed".
References SBC_ASC_NOT_READY_TO_READY_CHANGE, Sbc_build_sense, Sbc_send_failed, and SBC_SENSE_KEY_UNIT_ATTENTION.
Referenced by sbc_read_10(), sbc_read_capacity(), sbc_test_unit_ready(), and sbc_write_10().
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_fail | ( | void | ) |
Sends the status "FAILED".
References SBC_ASC_NO_ADDITIONAL_SENSE_INFORMATION, Sbc_build_sense, Sbc_send_failed, and SBC_SENSE_KEY_HARDWARE_ERROR.
Referenced by sbc_read_10(), sbc_read_capacity(), sbc_test_unit_ready(), and sbc_write_10().
void sbc_lun_status_is_good | ( | void | ) |
Sends the status "GOOD".
References SBC_ASC_NO_ADDITIONAL_SENSE_INFORMATION, Sbc_build_sense, Sbc_send_good, and SBC_SENSE_KEY_NO_SENSE.
Referenced by sbc_inquiry(), sbc_mode_sense(), sbc_prevent_allow_medium_removal(), sbc_read_10(), sbc_read_capacity(), sbc_request_sense(), sbc_test_unit_ready(), sbc_write_10(), and scsi_decode_command().
void sbc_lun_status_is_not_present | ( | void | ) |
Sends the status "LUN not present".
References SBC_ASC_MEDIUM_NOT_PRESENT, Sbc_build_sense, Sbc_send_failed, and SBC_SENSE_KEY_NOT_READY.
Referenced by sbc_read_10(), sbc_read_capacity(), sbc_test_unit_ready(), and sbc_write_10().
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().
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.
b_sense_10 | Boolean indicating whether the (10) version of the command is requested:
|
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.
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.
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.
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_request_sense | ( | void | ) |
Manages the REQUEST SENSE command.
The REQUEST SENSE command requests that the device server transfer sense data to the application client.
See s_scsi_sense.
References s_scsi_sense::asc, s_scsi_sense::ascq, EP_MS_IN, g_scsi_command, g_scsi_ep_ms_in, s_scsi_sense::key, min, SBC_ADDITIONAL_SENSE_LENGTH, SBC_COMMAND_SPECIFIC_INFORMATION_0, SBC_COMMAND_SPECIFIC_INFORMATION_1, SBC_COMMAND_SPECIFIC_INFORMATION_2, SBC_COMMAND_SPECIFIC_INFORMATION_3, SBC_FIELD_REPLACEABLE_UNIT_CODE, sbc_lun_status_is_good(), SBC_RESPONSE_CODE_SENSE, SBC_SENSE_KEY_SPECIFIC_0, SBC_SENSE_KEY_SPECIFIC_1, SBC_SENSE_KEY_SPECIFIC_2, Sbc_valid_write_usb, Usb_nb_busy_bank, Usb_reset_endpoint_fifo_access, and usb_write_ep_txpacket().
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.
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.
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.
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().
|
static |
Writes the Informational Exceptions Control mode page.
References g_scsi_ep_ms_in, Sbc_format_mcu_to_scsi_data, SBC_MRIE_GENERATE_NO_SENSE, SBC_PAGE_CODE_INFORMATIONAL_EXCEPTIONS, SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS, and Usb_write_endpoint_data.
Referenced by sbc_mode_sense().
|
static |
Writes the Error Recovery mode page.
length | Allocated data length in bytes. |
References g_scsi_ep_ms_in, Sbc_format_mcu_to_scsi_data, SBC_PAGE_CODE_READ_WRITE_ERROR_RECOVERY, SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY, SBC_READ_RETRY_COUNT, SBC_RECOVERY_TIME_LIMIT, SBC_WRITE_RETRY_COUNT, and Usb_write_endpoint_data.
Referenced by sbc_mode_sense().
uint8_t g_scsi_command[16] |
SCSI command buffer.
Referenced by sbc_inquiry(), sbc_mode_sense(), sbc_read_10(), sbc_request_sense(), sbc_write_10(), scsi_decode_command(), and usb_mass_storage_cbw().
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_in |
USB mass-storage IN endpoint.
Referenced by at45dbx_read_multiple_sector_callback(), device_mass_storage_task_init(), sbc_header_mode_sense(), sbc_inquiry(), sbc_read_capacity(), sbc_request_sense(), sd_mmc_spi_read_multiple_sector_callback(), send_informational_exceptions_page(), send_read_write_error_recovery_page(), and virtual_usb_read_10().
uint8_t g_scsi_ep_ms_out |
USB mass-storage OUT endpoint.
Referenced by at45dbx_write_multiple_sector_callback(), device_mass_storage_task_init(), sd_mmc_spi_write_multiple_sector_callback(), and virtual_usb_write_10().
s_scsi_sense g_scsi_sense |
Sense data.
uint8_t g_scsi_status |
SCSI status.
Referenced by usb_mass_storage_csw().
uint8_t ms_endpoint |
Referenced by sbc_read_10(), sbc_write_10(), and usb_mass_storage_cbw().
|
static |
INQUIRY data.
uint8_t usb_LUN |
Referenced by sbc_header_mode_sense(), sbc_read_10(), sbc_read_capacity(), sbc_test_unit_ready(), sbc_write_10(), and usb_mass_storage_cbw().