00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #ifndef _SCSI_DECODER_H_
00049 #define _SCSI_DECODER_H_
00050
00051
00052
00053
00054 #include "conf_usb.h"
00055 #include "compiler.h"
00056 #include "preprocessor.h"
00057
00058
00059
00060
00063
00064 #define SBC_CMD_DIR_IN 0x80
00065 #define SBC_CMD_DIR_OUT 0x00
00067
00068
00070
00071 #define SBC_CMD_TEST_UNIT_READY 0x00
00072 #define SBC_CMD_REQUEST_SENSE 0x03
00073 #define SBC_CMD_FORMAT_UNIT 0x04
00074 #define SBC_CMD_REASSIGN_BLOCKS 0x07
00075 #define SBC_CMD_READ_6 0x08
00076 #define SBC_CMD_WRITE_6 0x0A
00077 #define SBC_CMD_INQUIRY 0x12
00078 #define SBC_CMD_MODE_SELECT_6 0x15
00079 #define SBC_CMD_MODE_SENSE_6 0x1A
00080 #define SBC_CMD_START_STOP_UNIT 0x1B
00081 #define SBC_CMD_RECEIVE_DIAGNOSTIC_RESULTS 0x1C
00082 #define SBC_CMD_SEND_DIAGNOSTIC 0x1D
00083 #define SBC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E
00084 #define SBC_CMD_READ_CAPACITY_10 0x25
00085 #define SBC_CMD_READ_10 0x28
00086 #define SBC_CMD_WRITE_10 0x2A
00087 #define SBC_CMD_WRITE_AND_VERIFY_10 0x2E
00088 #define SBC_CMD_VERIFY_10 0x2F
00089 #define SBC_CMD_PREFETCH_10 0x34
00090 #define SBC_CMD_SYNCHRONIZE_CACHE_10 0x35
00091 #define SBC_CMD_READ_DEFECT_DATA_10 0x37
00092 #define SBC_CMD_WRITE_BUFFER 0x3B
00093 #define SBC_CMD_READ_BUFFER 0x3C
00094 #define SBC_CMD_READ_LONG_10 0x3E
00095 #define SBC_CMD_WRITE_LONG_10 0x3F
00096 #define SBC_CMD_WRITE_SAME_10 0x41
00097 #define SBC_CMD_LOG_SELECT 0x4C
00098 #define SBC_CMD_LOG_SENSE 0x4D
00099 #define SBC_CMD_XDWRITE_10 0x50
00100 #define SBC_CMD_XPWRITE_10 0x51
00101 #define SBC_CMD_XDREAD_10 0x52
00102 #define SBC_CMD_XDWRITEREAD_10 0x53
00103 #define SBC_CMD_MODE_SELECT_10 0x55
00104 #define SBC_CMD_MODE_SENSE_10 0x5A
00105 #define SBC_CMD_PERSISTENT_RESERVE_IN 0x5E
00106 #define SBC_CMD_PERSISTENT_RESERVE_OUT 0x5F
00107 #define SBC_CMD_EXTENDED_COPY 0x83
00108 #define SBC_CMD_RECEIVE_COPY_RESULTS 0x84
00109 #define SBC_CMD_ACCESS_CONTROL_IN 0x86
00110 #define SBC_CMD_ACCESS_CONTROL_OUT 0x87
00111 #define SBC_CMD_READ_16 0x88
00112 #define SBC_CMD_WRITE_16 0x8A
00113 #define SBC_CMD_READ_ATTRIBUTE 0x8C
00114 #define SBC_CMD_WRITE_ATTRIBUTE 0x8D
00115 #define SBC_CMD_WRITE_AND_VERIFY_16 0x8E
00116 #define SBC_CMD_VERIFY_16 0x8F
00117 #define SBC_CMD_PREFETCH_16 0x90
00118 #define SBC_CMD_SYNCHRONIZE_CACHE_16 0x91
00119 #define SBC_CMD_WRITE_SAME_16 0x93
00120 #define SBC_CMD_REPORT_LUNS 0xA0
00121 #define SBC_CMD_READ_12 0xA8
00122 #define SBC_CMD_WRITE_12 0xAA
00123 #define SBC_CMD_WRITE_AND_VERIFY_12 0xAE
00124 #define SBC_CMD_VERIFY_12 0xAF
00125 #define SBC_CMD_READ_DEFECT_DATA_12 0xB7
00127
00128
00130
00131 #define COMMAND_PASSED 0x00
00132 #define COMMAND_FAILED 0x01
00133 #define CHECK_CONDITION 0x02
00135
00136
00138
00139 #define SBC_SENSE_KEY_NO_SENSE 0x00
00140 #define SBC_SENSE_KEY_RECOVERED_ERROR 0x01
00141 #define SBC_SENSE_KEY_NOT_READY 0x02
00142 #define SBC_SENSE_KEY_MEDIUM_ERROR 0x03
00143 #define SBC_SENSE_KEY_HARDWARE_ERROR 0x04
00144 #define SBC_SENSE_KEY_ILLEGAL_REQUEST 0x05
00145 #define SBC_SENSE_KEY_UNIT_ATTENTION 0x06
00146 #define SBC_SENSE_KEY_DATA_PROTECT 0x07
00147 #define SBC_SENSE_KEY_BLANK_CHECK 0x08
00148 #define SBC_SENSE_KEY_VENDOR_SPECIFIC 0x09
00149 #define SBC_SENSE_KEY_COPY_ABORTED 0x0A
00150 #define SBC_SENSE_KEY_ABORTED_COMMAND 0x0B
00151 #define SBC_SENSE_KEY_VOLUME_OVERFLOW 0x0D
00152 #define SBC_SENSE_KEY_MISCOMPARE 0x0E
00154
00155
00157
00158 #define SBC_ASC_NO_ADDITIONAL_SENSE_INFORMATION 0x00
00159 #define SBC_ASC_LOGICAL_UNIT_NOT_READY 0x04
00160 #define SBC_ASC_INVALID_FIELD_IN_CDB 0x24
00161 #define SBC_ASC_WRITE_PROTECTED 0x27
00162 #define SBC_ASC_FORMAT_ERROR 0x31
00163 #define SBC_ASC_INVALID_COMMAND_OPERATION_CODE 0x20
00164 #define SBC_ASC_NOT_READY_TO_READY_CHANGE 0x28
00165 #define SBC_ASC_MEDIUM_NOT_PRESENT 0x3A
00167
00168
00170
00171 #define SBC_ASCQ_FORMAT_COMMAND_FAILED 0x01
00172 #define SBC_ASCQ_INITIALIZING_COMMAND_REQUIRED 0x02
00173 #define SBC_ASCQ_OPERATION_IN_PROGRESS 0x07
00175
00176
00178
00179 #define SBC_RESPONSE_CODE_SENSE 0x70
00180 #define SBC_ADDITIONAL_SENSE_LENGTH 0x0A
00181 #define SBC_COMMAND_SPECIFIC_INFORMATION_3 0x00
00182 #define SBC_COMMAND_SPECIFIC_INFORMATION_2 0x00
00183 #define SBC_COMMAND_SPECIFIC_INFORMATION_1 0x00
00184 #define SBC_COMMAND_SPECIFIC_INFORMATION_0 0x00
00185 #define SBC_FIELD_REPLACEABLE_UNIT_CODE 0x00
00186 #define SBC_SENSE_KEY_SPECIFIC_2 0x00
00187 #define SBC_SENSE_KEY_SPECIFIC_1 0x00
00188 #define SBC_SENSE_KEY_SPECIFIC_0 0x00
00190
00191
00193
00194 #define SBC_MSK_DBD 0x08
00195 #define SBC_MSK_PAGE_CONTROL 0xC0
00196 #define SBC_MSK_PAGE_CODE 0x3F
00198
00199
00201
00202 #define SBC_PAGE_CODE_READ_WRITE_ERROR_RECOVERY 0x01
00203 #define SBC_PAGE_CODE_INFORMATIONAL_EXCEPTIONS 0x1C
00204 #define SBC_PAGE_CODE_ALL 0x3F
00206
00207
00209
00210 #define SBC_MODE_DATA_LENGTH_READ_WRITE_ERROR_RECOVERY (SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY + 2 + 3)
00211 #define SBC_MODE_DATA_LENGTH_INFORMATIONAL_EXCEPTIONS (SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS + 2 + 3)
00212 #define SBC_MODE_DATA_LENGTH_CODE_ALL (SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY + 2 +\
00213 SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS + 2 +\
00214 SBC_BLOCK_DESCRIPTOR_LENGTH + 3)
00216
00218 #define SBC_MEDIUM_TYPE 0x00
00219
00222
00223 #define SBC_DEV_SPEC_PARAM_WR_ENABLE 0x00
00224 #define SBC_DEV_SPEC_PARAM_WR_PROTECT 0x80
00226
00228 #define SBC_BLOCK_DESCRIPTOR_LENGTH 0x00
00229
00232
00233 #define SBC_PAGE_LENGTH_READ_WRITE_ERROR_RECOVERY 0x0A
00234 #define SBC_PAGE_LENGTH_INFORMATIONAL_EXCEPTIONS 0x0A
00236
00237
00239
00240 #define SBC_READ_RETRY_COUNT 0x03
00241 #define SBC_WRITE_RETRY_COUNT 0x80
00242 #define SBC_RECOVERY_TIME_LIMIT 0x0000
00244
00246 #define SBC_MRIE_GENERATE_NO_SENSE 0x05
00247
00249 #define SBC_READ_CAPACITY_LENGTH 0x08
00250
00251
00254
00255
00256 #if LITTLE_ENDIAN_MCU
00257
00269 #define Sbc_format_mcu_to_scsi_data(width, data) (TPASTE2(Swap, width)(data))
00270
00282 #define Sbc_format_scsi_to_mcu_data(width, data) (TPASTE2(Swap, width)(data))
00283
00295 #define sbc_format_mcu_to_scsi_data(width, data) (TPASTE2(swap, width)(data))
00296
00308 #define sbc_format_scsi_to_mcu_data(width, data) (TPASTE2(swap, width)(data))
00309
00310 #else // BIG_ENDIAN_MCU
00311
00323 #define Sbc_format_mcu_to_scsi_data(width, data) ((TPASTE2(U, width))(data))
00324
00336 #define Sbc_format_scsi_to_mcu_data(width, data) ((TPASTE2(U, width))(data))
00337
00349 #define sbc_format_mcu_to_scsi_data(width, data) ((TPASTE2(U, width))(data))
00350
00362 #define sbc_format_scsi_to_mcu_data(width, data) ((TPASTE2(U, width))(data))
00363
00364 #endif
00365
00367
00373 #define Sbc_valid_write_usb(length) (Usb_ack_in_ready_send(g_scsi_ep_ms_in),\
00374 g_scsi_data_remaining -= (length))
00375
00378
00379
00382 #define Sbc_send_failed() (g_scsi_status = COMMAND_FAILED )
00383
00386 #define Sbc_send_check_condition() (g_scsi_status = CHECK_CONDITION)
00387
00390 #define Sbc_send_good() (g_scsi_status = COMMAND_PASSED )
00391
00393
00400 #define Sbc_build_sense(skey, sasc, sascq) (g_scsi_sense.key = (skey),\
00401 g_scsi_sense.asc = (sasc),\
00402 g_scsi_sense.ascq = (sascq))
00403
00404
00406 typedef struct
00407 {
00408 U8 key;
00409 U8 asc;
00410 U8 ascq;
00411 } s_scsi_sense;
00412
00414 typedef
00415 #if (defined __ICCAVR32__)
00416 #pragma pack(1)
00417 #endif
00418 struct
00419 #if (defined __GNUC__)
00420 __attribute__((__packed__))
00421 #endif
00422 {
00423 unsigned int PeripheralQualifier : 3;
00424 unsigned int DeviceType : 5;
00425
00426 unsigned int RemovableMedia : 1;
00427 unsigned int Reserved1 : 7;
00428
00429 U8 Version ;
00430
00431 unsigned int AERC : 1;
00432 unsigned int Obsolete0 : 1;
00433 unsigned int NormACA : 1;
00434 unsigned int Reserved3 : 5;
00435
00436 U8 Reserved4 [3];
00437
00438 unsigned int RelativeAddressing : 1;
00439 unsigned int Wide32Bit : 1;
00440 unsigned int Wide16Bit : 1;
00441 unsigned int Synchronous : 1;
00442 unsigned int LinkedCommands : 1;
00443 unsigned int Reserved5 : 1;
00444 unsigned int CommandQueue : 1;
00445 unsigned int SoftReset : 1;
00446
00447 char g_sbc_vendor_id [8];
00448
00449 char g_sbc_product_id [16];
00450
00451 char g_sbc_revision_id [4];
00452 }
00453 #if __ICCAVR32__
00454 #pragma pack()
00455 #endif
00456 sbc_st_std_inquiry_data;
00457
00458
00459
00460
00461 #if USB_DEVICE_FEATURE == ENABLED
00462
00464 extern U8 g_scsi_command[16];
00465
00467 extern U8 g_scsi_status;
00468
00470 extern U32 g_scsi_data_remaining;
00471
00473 extern s_scsi_sense g_scsi_sense;
00474
00476 extern U8 g_scsi_ep_ms_in;
00477
00479 extern U8 g_scsi_ep_ms_out;
00480
00485 extern Bool scsi_decode_command(void);
00486
00500 extern Bool sbc_test_unit_ready(void);
00501
00511 extern Bool sbc_request_sense(void);
00512
00522 extern Bool sbc_inquiry(void);
00523
00538 extern Bool sbc_mode_sense(Bool b_sense_10);
00539
00548 extern Bool sbc_prevent_allow_medium_removal(void);
00549
00561 extern Bool sbc_read_capacity(void);
00562
00575 extern Bool sbc_read_10(void);
00576
00588 extern Bool sbc_write_10(void);
00589
00592 extern void sbc_lun_status_is_good(void);
00593
00596 extern void sbc_lun_status_is_not_present(void);
00597
00600 extern void sbc_lun_status_is_busy_or_change(void);
00601
00604 extern void sbc_lun_status_is_fail(void);
00605
00608 extern void sbc_lun_status_is_protected(void);
00609
00612 extern void sbc_lun_status_is_cdb_field(void);
00613
00614 #endif // USB_DEVICE_FEATURE == ENABLED
00615
00616
00617 #endif // _SCSI_DECODER_H_