25#if !defined(__MASSTORAGE_H__)
26#define __MASSTORAGE_H__
30#define MS_WANT_PARSER 0
35#define bmREQ_MASSOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
36#define bmREQ_MASSIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
39#define MASS_SUBCLASS_SCSI_NOT_REPORTED 0x00
40#define MASS_SUBCLASS_RBC 0x01
41#define MASS_SUBCLASS_ATAPI 0x02
42#define MASS_SUBCLASS_OBSOLETE1 0x03
43#define MASS_SUBCLASS_UFI 0x04
44#define MASS_SUBCLASS_OBSOLETE2 0x05
45#define MASS_SUBCLASS_SCSI 0x06
46#define MASS_SUBCLASS_LSDFS 0x07
47#define MASS_SUBCLASS_IEEE1667 0x08
50#define MASS_PROTO_CBI 0x00
51#define MASS_PROTO_CBI_NO_INT 0x01
52#define MASS_PROTO_OBSOLETE 0x02
53#define MASS_PROTO_BBB 0x50
54#define MASS_PROTO_UAS 0x62
57#define MASS_REQ_ADSC 0x00
58#define MASS_REQ_GET 0xFC
59#define MASS_REQ_PUT 0xFD
60#define MASS_REQ_GET_MAX_LUN 0xFE
61#define MASS_REQ_BOMSR 0xFF
63#define MASS_CBW_SIGNATURE 0x43425355
64#define MASS_CSW_SIGNATURE 0x53425355
66#define MASS_CMD_DIR_OUT 0
67#define MASS_CMD_DIR_IN 0x80
77#define SCSI_CMD_TEST_UNIT_READY 0x00
78#define SCSI_CMD_REQUEST_SENSE 0x03
79#define SCSI_CMD_FORMAT_UNIT 0x04
80#define SCSI_CMD_READ_6 0x08
81#define SCSI_CMD_WRITE_6 0x0A
82#define SCSI_CMD_INQUIRY 0x12
83#define SCSI_CMD_MODE_SELECT_6 0x15
84#define SCSI_CMD_MODE_SENSE_6 0x1A
85#define SCSI_CMD_START_STOP_UNIT 0x1B
86#define SCSI_CMD_PREVENT_REMOVAL 0x1E
88#define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23
89#define SCSI_CMD_READ_CAPACITY_10 0x25
90#define SCSI_CMD_READ_10 0x28
91#define SCSI_CMD_WRITE_10 0x2A
92#define SCSI_CMD_SEEK_10 0x2B
93#define SCSI_CMD_ERASE_10 0x2C
94#define SCSI_CMD_WRITE_AND_VERIFY_10 0x2E
95#define SCSI_CMD_VERIFY_10 0x2F
96#define SCSI_CMD_SYNCHRONIZE_CACHE 0x35
97#define SCSI_CMD_WRITE_BUFFER 0x3B
98#define SCSI_CMD_READ_BUFFER 0x3C
99#define SCSI_CMD_READ_SUBCHANNEL 0x42
100#define SCSI_CMD_READ_TOC 0x43
101#define SCSI_CMD_READ_HEADER 0x44
102#define SCSI_CMD_PLAY_AUDIO_10 0x45
103#define SCSI_CMD_GET_CONFIGURATION 0x46
104#define SCSI_CMD_PLAY_AUDIO_MSF 0x47
105#define SCSI_CMD_PLAY_AUDIO_TI 0x48
106#define SCSI_CMD_PLAY_TRACK_REL_10 0x49
107#define SCSI_CMD_GET_EVENT_STATUS 0x4A
108#define SCSI_CMD_PAUSE_RESUME 0x4B
109#define SCSI_CMD_READ_DISC_INFORMATION 0x51
110#define SCSI_CMD_READ_TRACK_INFORMATION 0x52
111#define SCSI_CMD_RESERVE_TRACK 0x53
112#define SCSI_CMD_SEND_OPC_INFORMATION 0x54
113#define SCSI_CMD_MODE_SELECT_10 0x55
114#define SCSI_CMD_REPAIR_TRACK 0x58
115#define SCSI_CMD_MODE_SENSE_10 0x5A
116#define SCSI_CMD_CLOSE_TRACK_SESSION 0x5B
117#define SCSI_CMD_READ_BUFFER_CAPACITY 0x5C
118#define SCSI_CMD_SEND_CUE_SHEET 0x5D
120#define SCSI_CMD_REPORT_LUNS 0xA0
121#define SCSI_CMD_BLANK 0xA1
122#define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2
123#define SCSI_CMD_SEND_KEY 0xA3
124#define SCSI_CMD_REPORT_KEY 0xA4
125#define SCSI_CMD_PLAY_AUDIO_12 0xA5
126#define SCSI_CMD_LOAD_UNLOAD 0xA6
127#define SCSI_CMD_SET_READ_AHEAD 0xA7
128#define SCSI_CMD_READ_12 0xA8
129#define SCSI_CMD_PLAY_TRACK_REL_12 0xA9
130#define SCSI_CMD_WRITE_12 0xAA
131#define SCSI_CMD_READ_MEDIA_SERIAL_12 0xAB
132#define SCSI_CMD_GET_PERFORMANCE 0xAC
133#define SCSI_CMD_READ_DVD_STRUCTURE 0xAD
134#define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5
135#define SCSI_CMD_SET_STREAMING 0xB6
136#define SCSI_CMD_READ_MSF 0xB9
137#define SCSI_CMD_SET_SPEED 0xBB
138#define SCSI_CMD_MECHANISM_STATUS 0xBD
139#define SCSI_CMD_READ_CD 0xBE
140#define SCSI_CMD_SEND_DISC_STRUCTURE 0xBF
142#define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4
143#define SCSI_CMD_PLAYBACK_CONTROL 0xC9
144#define SCSI_CMD_READ_CDDA 0xD8
145#define SCSI_CMD_READ_CDXA 0xDB
146#define SCSI_CMD_READ_ALL_SUBCODES 0xDF
149#define SCSI_S_NOT_READY 0x02
150#define SCSI_S_MEDIUM_ERROR 0x03
151#define SCSI_S_ILLEGAL_REQUEST 0x05
152#define SCSI_S_UNIT_ATTENTION 0x06
153#define SCSI_ASC_LBA_OUT_OF_RANGE 0x21
154#define SCSI_ASC_MEDIA_CHANGED 0x28
155#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A
158#define MASS_ERR_SUCCESS 0x00
159#define MASS_ERR_PHASE_ERROR 0x02
160#define MASS_ERR_UNIT_NOT_READY 0x03
161#define MASS_ERR_UNIT_BUSY 0x04
162#define MASS_ERR_STALL 0x05
163#define MASS_ERR_CMD_NOT_SUPPORTED 0x06
164#define MASS_ERR_INVALID_CSW 0x07
165#define MASS_ERR_NO_MEDIA 0x08
166#define MASS_ERR_BAD_LBA 0x09
167#define MASS_ERR_MEDIA_CHANGED 0x0A
168#define MASS_ERR_DEVICE_DISCONNECTED 0x11
169#define MASS_ERR_UNABLE_TO_RECOVER 0x12
170#define MASS_ERR_INVALID_LUN 0x13
171#define MASS_ERR_WRITE_STALL 0x14
172#define MASS_ERR_READ_NAKS 0x15
173#define MASS_ERR_WRITE_NAKS 0x16
174#define MASS_ERR_WRITE_PROTECTED 0x17
175#define MASS_ERR_NOT_IMPLEMENTED 0xFD
176#define MASS_ERR_GENERAL_SCSI_ERROR 0xFE
177#define MASS_ERR_GENERAL_USB_ERROR 0xFF
178#define MASS_ERR_USER 0xA0
180#define MASS_TRANS_FLG_CALLBACK 0x01
181#define MASS_TRANS_FLG_NO_STALL_CHECK 0x02
182#define MASS_TRANS_FLG_NO_PHASE_CHECK 0x04
184#define MASS_MAX_ENDPOINTS 3
411 for(
int i = 0;
i < 16;
i++)
CBWCB[
i] = 0;
419 for(
int i = 0;
i < 16;
i++)
CBWCB[
i] = 0;
#define USB_CLASS_MASS_STORAGE
static const uint8_t epInterruptInIndex
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
uint8_t MediaCTL(uint8_t lun, uint8_t ctl)
virtual uint8_t GetAddress()
uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf)
uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
uint32_t GetCapacity(uint8_t lun)
uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]
bool WriteProtected(uint8_t lun)
virtual bool DEVCLASSOK(uint8_t klass)
static const uint8_t epDataOutIndex
static const uint8_t epDataInIndex
bool LUNOk[MASS_MAX_SUPPORTED_LUN]
uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]
bool LUNIsGood(uint8_t lun)
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
uint8_t GetLastUsbError()
uint8_t SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
uint16_t GetSectorSize(uint8_t lun)
uint8_t LockMedia(uint8_t lun, uint8_t lock)
EpInfo epInfo[MASS_MAX_ENDPOINTS]
uint8_t SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)
bool WriteOk[MASS_MAX_SUPPORTED_LUN]
#define MASS_CBW_SIGNATURE
#define MASS_MAX_ENDPOINTS
#define MASS_MAX_SUPPORTED_LUN
CDB10(uint8_t _Opcode, uint8_t _LUN)
CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA)
CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control)
CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control)
CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs)
CommandBlockWrapperBase()
uint32_t dCBWDataTransferLength
CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB6_t *cdb, uint8_t dir)
CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB10_t *cdb, uint8_t dir)
CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd)
unsigned ResponseDataFormat
uint8_t PeripheralQualifier
uint8_t bAdditionalSenseCode
uint8_t SenseKeySpecific[3]
uint8_t bAdditionalSenseQualifier
uint8_t CmdSpecificInformation[4]
uint8_t bFieldReplaceableUnitCode
uint8_t bAdditionalLength